из соображений экономии сишному компилятору как-то больше нравятся целые переменные в качестве флагов, но иногда и битовые поля
Смотря на что оптимизировать - на скорость или на память. Впрочем, по скорости выигрыша тоже нет:
Код: Выделить всё
lds r16, FLAGS_REG
sbrs r16, FLAG_TIM
rjmp TIM_CLEARED
cbr r16, FLAG_TIM
sts FLAGS_REG, r16
;флаг был поднят, обрабатываем
TIM_CLEARED: ;возвращаемся к выполнению
Код: Выделить всё
lds r16, TIM_FLAG
tst r16
brne TIM_CLEARED
clr r16
sts TIM_FLAG, r16
;флаг был поднят, обрабатываем
TIM_CLEARED: ;возвращаемся к выполнению
ни чуть не усложняет.
Вот есть значение таймера на 32 бита, есть АЦП на 16 бит, есть даже какой-то коэффициент, пришедший снаружи в формате IEE754 (float). Каждый байт в отдельности не значит ничего, значение имеют группы по 4, 2 и снова 4 байта. Еще хуже когда все это упаковано в массив структур.
а на флаги я выделяю регистры
Можно и так, но тогда за ними надо следить чтобы разная периферия не пыталась занять одни и те же адреса. Тем более что флаги подразумевают, что быстрой реакции не нужно, и обойтись ячейкой вполне можно. Ну там одну под события UART, вторую под SPI, третью под I2C (там одной может и не хватить).
для любой RTOS, где помимо этого хватает всяких мьютексов
Ну, мбютексы ведь тоже как-то реализованы, и их реализация тоже попадает под наше обсуждение.
или если размер сохраняется в отдельной переменной
Хранить размер буфера в переменной? А какой смысл? Я очень надеюсь, что он у вас хотя бы не в динамической памяти находится...
Или вы про количество данных в буфере? Так оно вычисляется из разности между головой и хвостом за два действия.