Начал читать "C programming for microcontrollers", автор Joe Pardue.
Книга состоит из 11 глав, 7 приложений и предметного указателя.В книге рассматривается программирование на языке C для платформы Atmel AVR. Уровень - с нуля.
Прочел первые две главы.
Глава 1 - Введение.
Глава 2 - Краткий обзор программного обеспечения, первая программа.
Впечатления пока не составил. Однако на странице 30 можно наблюдать пример отъявленного быдлокодерства:
// Blinky.c
#include <avr io.h>
#include <avr delay.h>
int main(void)
{
//set PORTD for output
DDRD = 0xFF;
while(1) {
for(int i = 1; i <= 128; i = i*2)
{
PORTD = i;
_delay_loop2(30000);
}
for(int i = 128; i > 1; i -= i/2)
{
PORTD = i;
_delay_loop2(30000);
}
}
return 1;
}
В чем же быдлокодерство? С виду этот код представляет собой обычный код, демонстрирующий мигание светодиодов, своеобразный "hello, world" микроконтроллерного мира. Однако как забавно реализованы циклы! Посмотрите на это чудо:
for(int i = 1; i <= 128; i = i*2)
Ну, я бы еще понял так:
for(int i = 1; i <= 128; i *= 2)
или так:
for(int i = 1; i <= 128; i <<= 1)
Вообще, я бы написал так:
for(int i = 0; i <= 7; i++)
{
PORTD = (1 << i);
...
}
Конечно, во многом это дело вкуса, однако мой вариант кажется мне более понятным.
Далее мы видим вообще нечто странное:
for(int i = 128; i > 1; i -= i/2)
Мой внутренний парсер сказал "э...". Берем бумагу и пишем следующее:
Итерация | Значение i (до)| Значение i/2 | Значение i (после) |
---------+----------------+--------------+--------------------+
1 | 128 | 64 | 64 |
---------+----------------+----------- --+--------------------+
2 | 64 | 32 | 32 |
...
---------+----------------+------------ -+--------------------+
8 | 2 | 1 | 1 |
---------+----------------+--------------+--------------------+
На этом цикл завершается.
Т.е. мы видим, что:
1. i -= i/2 в данном случае эквивалентно i /= 2
2. можно и так i >>= 1;
3. и, не самый лаконичный, но самый понятный, на мой вкус, вариант:
for(int i = 0; i <= 7; i++)
{
PORTD = (128 >> i);
...
}
for(int i = 1; i <= 128; i = i*2)
Ну, я бы еще понял так:
for(int i = 1; i <= 128; i *= 2)
или так:
for(int i = 1; i <= 128; i <<= 1)
Вообще, я бы написал так:
for(int i = 0; i <= 7; i++)
{
PORTD = (1 << i);
...
}
Конечно, во многом это дело вкуса, однако мой вариант кажется мне более понятным.
Далее мы видим вообще нечто странное:
for(int i = 128; i > 1; i -= i/2)
Мой внутренний парсер сказал "э...". Берем бумагу и пишем следующее:
Итерация | Значение i (до)| Значение i/2 | Значение i (после) |
---------+----------------+--------------+--------------------+
1 | 128 | 64 | 64 |
---------+----------------+----------- --+--------------------+
2 | 64 | 32 | 32 |
...
---------+----------------+------------ -+--------------------+
8 | 2 | 1 | 1 |
---------+----------------+--------------+--------------------+
На этом цикл завершается.
Т.е. мы видим, что:
1. i -= i/2 в данном случае эквивалентно i /= 2
2. можно и так i >>= 1;
3. и, не самый лаконичный, но самый понятный, на мой вкус, вариант:
for(int i = 0; i <= 7; i++)
{
PORTD = (128 >> i);
...
}
Комментариев нет:
Отправить комментарий