Arriba. Ещё одна IDE.

PIC


На сайте микрочипа появилась IDE Arriba, основанная на Eclipse. Для любителей оригинального Eclipse есть возможность установить Arriba-plugin + Arriba Connect отдельно (некий софт, связывающий GDB и микрочиповские программаторы-отладчики).



Всё бы хорошо, но…
Бесплатная версия поддерживает только PicKit 3 + Simulator. Для обладателей шайб (ICD2, 3) требуется Enterprise Edition по прекрасной цене 495$.

Что можно сказать? Сначала микрочип взяли опен-сурсный gcc и перепилили его в свою серию компиляторов XC и теперь продают за денежку, но и этого оказалось недостаточно. Теперь можно к опен-сурс IDE продавать ПО для работы с их контроллерами. Браво чтоль…

Из плюсов: возможно в скором это ограничится не только прикручиванием к Eclipse, но и к другим IDE, например QtCreator, C::B и т.д.
  • +2
  • 02 сентября 2014, 10:59
  • becopt

Автоматическая проверка стиля кодирования

Когда над одним проектом работает несколько человек, то использование каждым программистом своего стиля кодирования затрудняет чтение, поддержку и слияние кода. Хороший вариант — принудительное использование единого стиля кодирования, например: JSF Air Vehicle — C++ Coding Standards, Google C++ Style Guide, Стандарты программирования на C++" от Александреску.
Однако каждый программист ленив и старые привычки написания кода искоренить совсем непросто.

Читать дальше

Об адресах и указателях в Си

Сегодня на хабре появилась статья о работе с регистрами внешних устройств на языке Си. Такая статья наверняка полезна начинающим Си-программистам, а особенно хороша для людей, переползающих с ассемблера.

Хотелось бы добавить пять копеек. Возьмем последний пример кода из статьи:


#define IO_DATA_ADRESS  0x40000004
typedef struct  {
   uint32_t data;
   uint32_t status;
} IO_DEVICE;
IO_DEVICE * const pio_device = (IO_DEVICE *) (IO_DATA_ADRESS);
while (pio_device->status==0) {};
pio_device->data=3;


Не придираясь к стилистике (ну раз уж uint32_t, то почему не IO_DEVICE_t? И для чего верхний регистр, если это не константа?) обратим внимание на адрес и его применение:

#define IO_DATA_ADRESS  0x40000004
IO_DEVICE * const pio_device = (IO_DEVICE *) (IO_DATA_ADRESS);

Автор намеренно поместил адрес в скобки при приведении — это хороший тон и помогает избежать ошибок при работе с адресами и адресной арифметикой. Но так почему бы не поместить все дефайны сразу в скобки, чтобы избежать лишних проблем? Мне думается, что хорошо иметь привычку писать так:

#define IO_DATA_ADRESS  (0x40000004)
IO_DEVICE * const pio_device = (IO_DEVICE *) (IO_DATA_ADRESS);

Пара «лишних» скобок поможет избежать трудноуловимых проблем.

Однако в этой части кода присутствует и самая основная ошибка программистов встраиваемых систем. Компилятор взглянет на строчку:
while (pio_device->status==0) {};

И произведет оптимизацию либо в while(1), либо в while(0). Так что обязательно указать volatile ко всей структуре регистров переферии:

typedef volatile struct  {
   uint32_t data;
   uint32_t status;
} IO_DEVICE;