Я использую STM32F205 и Keil, мне родной, ARM-овский компилятор больше по душе. В разных задачах и прерываниях обращаюсь к флагам. А вот по IAR-у ничем помочь не могу.
Описываю так:
#pragma pack( 4 ) // выравнивание по 4 байт (32-х битному слову)
struct flags
{ unsigned bit_flg_00: 1;
...
unsigned bit_flg_xx: 1;
};
typedef volatile struct flags FLAG __attribute__(( bitband ));
#pragma pack()
// "__attribute__(( bitband ))" - так быстрее работает с битовыми полями, чем стандартным способом и гарантирован атомарный доступ.
// "volatile FLAG" необходимо, иначе оптимизатором исключаются циклы проверки флага, изменяемого в другой задаче...
Для отсылки данных из прибора в комп есть структура
#pragma pack( 4 ) // выравнивание по 4 байт (32-х битному слову)
typedef struct
{ unsigned long local_tick_ms; // Счётчик системных миллисекундных тиков RTOS, == os_time_get()
.........
struct flags flag_copy; // Копия глобальных флагов. Здесь уже не volatile и не bitband.
} all_measuring;
#pragma pack()
// Где-то объявлены
FLAG flag;
all_measuring all_measure;
// all_measure.flag_copy = flag; - сцука, из-за FLAG __attribute__(( bitband )) каждый флаг по отдельности копирует, сделаем преобразование типов: all_measure.flag_copy = *(struct flags *)&flag; - так копирует одним махом.
Использую флаги так:
if ( flag.need_service == ON )
{
....
}
....
flag.cls_term = OFF;
// ну и т.д.