Взято на заметку.Рекомендую такой макрос:
Взято на заметку.Рекомендую такой макрос:
#define everyMillis(interval, action) \
{ \
static unsigned long t = 0UL; \
if( millis() - t > (interval) ) \
{ \
{ action; } \
t = millis(); \
} \
}
...
everyMillis(1000, {
if( someCondition ){ doSomething(p1,p2..); }
else{ doOther(p3, p4..) }
})
static uint32_t btnTimer = 0; //не нужна глобальная переменная, достаточно статической в текущей функции
if (temp >= 24) {
if (!btnTimer ) btnTimer = millis(); // при первом вызове, запоминаем текущее время
if (millis() - btnTimer > 2000) { //проверка не вышло ли время задержки
digitalWrite(13, HIGH);
}
} else { //температура упала ниже 24гр, выкл. светодиод, сброс btnTimer
digitalWrite(13, LOW);
btnTimer = 0; //обнуляем, чтобы при следующем запуске (когда temp>=24), запомнить новое время и начать новый отсчет
}
Можно булевые типы упаковывать в битовые структуры. Так в 1 байт их поместится 8 штук. Поглядите как у нас сделано.Зачем такой изврат? А за тем, что bool все равно byte занимает, хоть тресни. То хоть с пользой тогда. Когда в системе 2кБ озу, еще и не такое в голову придет.
С точки зрения хранения - да, но не с точки зрения использования. В программном коде, чтобы "дешифровать" код, Вам придётся использовать битовую маску, которая занимает дополнительный байт. Да, этот байт можно разместить в программной памяти (если, допустим, использовать непосредственные операнды-константы), но вхождений таких сравнений в код может быть значительным, зависит от сложности кода, конечно.Можно булевые типы упаковывать в битовые структуры. Так в 1 байт их поместится 8 штук. Поглядите как у нас сделано.
Все верно. Приведенный макрос у меня очень часто урезается до нужного размера, вплоть до 5 бит, в одном из применений со сдвигом влево, для увеличения длительности "базового интервала" с 1миллисекунды до 64.if ((byte)millis() - timer > 200 { что-то делаем
} else timer = (byte)millis();
uint8_t startTime // время храним в байте .. где-то в коде..
const uint8_t period = 100
if( (uint8_t)((uint8_t)millis() - startTime) > period ){
// что-то делаем
}
Это не всегда так. Битовые маски применяемые для вычленения отдельного бита как булева значения могут компилироваться в специальные битовые команды ветвления у AVR, но .. требует проверки в каких конкретно случаях компилятор это применяет .. уже не помню, где сталкивался.С точки зрения хранения - да, но не с точки зрения использования. В программном коде, чтобы "дешифровать" код, Вам придётся использовать битовую маску, которая занимает дополнительный байт. Да, этот байт можно разместить в программной памяти (если, допустим, использовать непосредственные операнды-константы), но вхождений таких сравнений в код может быть значительным, зависит от сложности кода, конечно.
Но глобальная переменная при этом несет подвох, если функции с ее использованием выполняются друг за другом. статичная переменная более безопасна в этом смыслето static, что глобал контроллеру все едино. Поэтому в системах, где памяти мало, лучше таки глобал. Ее хотя бы переиспользовать можно для других целей, в других функциях. С атмегой 328 я к такому выводу пришёл. Это так, замечание просто.
Так для начала нужно определиться какую именно память экономим - память программы или RAM. Обычно вторая гораздо ценнее, т.к. меньше по объему. Битовые операцию как раз дают экономию RAM за счет FLASH.Проведите пример. Сложности нет, но для проведения битовой операции нужно два операнда (битовый массив в виде байта или слова и маска), а для проверки на ноль - только один. В результате, каждая "битовая" операция занимает на один байт больше, чем простая проверка.
Но вообще я изначально имел ввиду нечто вида:@poty, если вопрос ко мне, то в том проекте я особо голову себе не сушил. А использовал функции bitRead() и bitSet() из ардуино. Как оно работает - даже не интересовался тогда. Уверен, что это не оптимально, но удобно.
typedef union {
uint8_t raw;
struct {
uint8_t b0:1;
uint8_t b1:1;
uint8_t b2:1;
uint8_t b3:1;
uint8_t b4:1;
uint8_t b5:1;
uint8_t b6:1;
uint8_t b7:1;
};
} thisis8bits;
thisis8bits val;
val.b5 =true;
Мне казалось, что программист микроконтроллеров все же должен хотя бы заглядывать в Ассемблер своей железки ..Проведите пример. Сложности нет, но для проведения битовой операции нужно два операнда (битовый массив в виде байта или слова и маска), а для проверки на ноль - только один. В результате, каждая "битовая" операция занимает на один байт больше, чем простая проверка.