Вот именно, только если это число - константа. А в этом случае и макрос не нужен, по большому счёту. По крайней мере, я не могу особо придумать, для чего такое действительно может понадобится - именно инверсия константы.
Я похожим образом на STM32 порты конфигурирую. Передаю маску для пинов, но там все несколько сложнее, чем на avr, в разных регистрах поле инициализации может быть длиной 1, 2 или 4 бита, потому исходную маску нужно превратить в двойную и четверную, причем именно из одной константы получить две других. Правда чистый С для этого не подходит, но на С++ можно хоть из массива данные брать и они будут константами.
А для Вас есть принципиальная разница, заменит на число препроцессор или компилятор? Ведь компилятор, обнаружив константное выражение, все равно не будет генерить код для его вычисления, а просто подставит Вам вычисленную по этому выражению константу. Можете проверить.
_________________ Не ошибается только то, кто ничего не делает. Тот, кто признает свои ошибки, на них учится. Глупец же, упорствуя в своих заблуждениях, остается глупцом.
А для Вас есть принципиальная разница, заменит на число препроцессор или компилятор? Ведь компилятор, обнаружив константное выражение, все равно не будет генерить код для его вычисления, а просто подставит Вам вычисленную по этому выражению константу. Можете проверить.
После препроцессора компилятор все равно будет выполнять тот же код, что и в случае с inline функцией, только кажется не все это понимают
все алармы объединить в одну структуру (судя по хвостику _0 и т.п. в имени аларма, то логичнее объединить их в массив) и использовать сразу обновление ее при помощи eeprom_update_block
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
#include <avr/io.h> #define F_CPU 4000000 unsigned char Danue; int main(void)
{ /*Настраиваем соответствующий порт передачи на выход*/ PORTD|=(1<<PD1); /*Устанавливаем бит разрешение передачи*/ UCSRB|=(1<<TXEN); //Переходим в регистр UCSRC UCSRC|=(1<<URSEL); //Размер передоваемого слова выставляем на 8 бит.*/ UCSRC|=(1<<UCSZ1)|(1<<UCSZ0); //Выбираем режим работы ассинхронный UCSRC&=~(1<<UMSEL); //Проверка на четность выставляем в ноль UCSRC&=~(1<<UPM1)&(1<<UPM0); //Количество стоп битов также ставим 1 UCSRC&=~(1<<USBS); //Устанавливают скорость передачи в бодах UCSRC&=~(1<<URSEL);//Переходим в регистр UBRR; UBRRL=0x34;//Младший бит UBRRH=0x00;//Старший бит Danue=0;
while(1) {
//Проверяем флаг UDRE — флаг опустошения регистра передатчика, //устанавливается в 1 при пустом буфере передатчика — UDR =1 значит можно передавать буфер пуст; if ((Danue==0)&&(UCSRA|(1<<UDRE))) { //Отправляем только один раз UDR=0x20; Danue++; asm("nop"); } asm("nop"); } }
_________________ Не ошибается только то, кто ничего не делает. Тот, кто признает свои ошибки, на них учится. Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Тоже верно. Совсем вылетело из головы его существование.
_________________ Не ошибается только то, кто ничего не делает. Тот, кто признает свои ошибки, на них учится. Глупец же, упорствуя в своих заблуждениях, остается глупцом.
но..., меня смущает одна деталь насколько является быстрым доступ к переменной которая дислоцируется в eeprom ? суть вопроса вот в чем 7 будильников проверка которых происходит в каждую минуту раньше я дублировал два блока
при загрузке мк данные будильников из eeprom копируются в такойже блок в оперативке тот который находится в оперативке я использовал в ф-ции check_alarms(); которая вызывается каждую минуту не является ли это излишеством ?
вам никто не запретит хранить рабочую копию массива алармов в ОЗУ, обновляя EEPROM только в случае внесения изменений. чтение EEPROM раза в 2-3 (на глазок) медленнее, чем чтение ячеек ОЗУ, так что проблем не вижу. я вообще делал попытку сделать нечто вроде PLC, интерпретируемая программа которого хранилась во внешней i2c микросхеме - и ничего, работало...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 31
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения