Об адресах и указателях в Си
Сегодня на хабре появилась статья о работе с регистрами внешних устройств на языке Си. Такая статья наверняка полезна начинающим Си-программистам, а особенно хороша для людей, переползающих с ассемблера.
Хотелось бы добавить пять копеек. Возьмем последний пример кода из статьи:
Не придираясь к стилистике (ну раз уж uint32_t, то почему не IO_DEVICE_t? И для чего верхний регистр, если это не константа?) обратим внимание на адрес и его применение:
Автор намеренно поместил адрес в скобки при приведении — это хороший тон и помогает избежать ошибок при работе с адресами и адресной арифметикой. Но так почему бы не поместить все дефайны сразу в скобки, чтобы избежать лишних проблем? Мне думается, что хорошо иметь привычку писать так:
Пара «лишних» скобок поможет избежать трудноуловимых проблем.
Однако в этой части кода присутствует и самая основная ошибка программистов встраиваемых систем. Компилятор взглянет на строчку:
И произведет оптимизацию либо в while(1), либо в while(0). Так что обязательно указать volatile ко всей структуре регистров переферии:
Хотелось бы добавить пять копеек. Возьмем последний пример кода из статьи:
#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;
Ссылка на Хабр: Сверхвысокочастотные блоки питания для ноутбуков: в 4 раза меньше и в 6 раз легче обычных
Случайно наткнулся и решил поделиться здесь, т. к. там я не зарегистрирован, а обсудить хочется =)
Суть: заявляют частоту преобразования в десятки мегагерц...
По мне так любопытно... В основном на чем оно сделано, но и как естественно, ибо ЭМС на таких частотах обеспечить думаю тоже не так просто...
- 0
- 25 декабря 2013, 13:39
- N1X
- habrahabr.ru/post/207242/
- 11
Инвайт на Хабр
Давно хочу попасть на хабр, но писать статью не знаю о чем :)
А бывает, что прокомментировать надо бы…
Кто может поделиться?
А бывает, что прокомментировать надо бы…
Кто может поделиться?
хабр(умный дом)
наверняка многие видели, но все же поделюсь
habrahabr.ru/company/masterkit/blog/122984/
чел обещает запилить еще 1 более подробную статью. но уже общий принцип понятен.
Может быть даст кому-то идеи. Идея ведь это самое ценное, ибо без неё никуда, увы.
Вот сейчас бы тоже что-нибудь сваял, а что — не знаю. Идей нет :)
habrahabr.ru/company/masterkit/blog/122984/
чел обещает запилить еще 1 более подробную статью. но уже общий принцип понятен.
Может быть даст кому-то идеи. Идея ведь это самое ценное, ибо без неё никуда, увы.
Вот сейчас бы тоже что-нибудь сваял, а что — не знаю. Идей нет :)