Записная книжка разработчика

Мои проекты

C Programming for Microcontrollers

| Comments

Начал читать "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);
      ...
    }