Да, так. Только можно чуть понятнее написать: for( p_tmrs_queue = Timers_Queue; p_tmrs_queue < Timers_Queue + TMRS_QUANTITY; p_tmrs_queue++)
{
if( p_tmrs_queue->st_flags & (1<<ST_UNLOCK_FLG)) p_tmrs_queue->st_flags |= (1<<ST_TIME_OUT_FLG);
}
Причем, складывать Timers_Queue+TMRS_QUANTITY компилятор МК не заставит, т.к. константы обязан сложить сам.
Обратите внимание на выражение "Timers_Queue + TMRS_QUANTITY", здесь каждая единица из TMRS_QUANTITY ценой в 3 байта. Это к нашему разговору о том, как к указателю прибавляется число.
Кстати, вы можете пользоваться здесь и своими макросами
#define clrb(reg, bit) reg &= ~(1<<(bit))
#define setb(reg, bit) reg |= (1<<(bit))
тогда цикл приобрет вид
for( p_tmrs_queue = Timers_Queue; p_tmrs_queue < Timers_Queue + TMRS_QUANTITY; p_tmrs_queue++)
{
if( p_tmrs_queue->st_flags & (1<<ST_UNLOCK_FLG)) setb( p_tmrs_queue->st_flags, ST_TIME_OUT_FLG);
}
А еще лучше добавить макросы для тестирования бита. Что-то вроде:
#define isset(reg, bit) (reg & (1<<(bit)))
#define isclr(reg, bit) ((reg & (1<<(bit)))==0)
Только не пишите в первом случае "==1", т.к. вырезанный бит может оказаться в любом месте, а не только в самом младшем разряде. А в отсутствии сравнения на языке C анализируется сам результат, принимая за true любое ненулевое значение. Но можно написать и так:
#define isset(reg, bit) ((reg & (1<<(bit)))!=0)
В любом случае с макросами будет выглядеть так:
for( p_tmrs_queue = Timers_Queue; p_tmrs_queue < Timers_Queue + TMRS_QUANTITY; p_tmrs_queue++)
{
if( isset(p_tmrs_queue->st_flags, ST_UNLOCK_FLG) setb( p_tmrs_queue->st_flags, ST_TIME_OUT_FLG);
}
P.S. Фигурные скобки после if я опустила, т.к. единственный оператор не обязательно оформлять в виде блока. С тем же основанием можно было убрать фигурные скобки и у for, записав весь цикл в одну строку, но я не стала вас пугать :).