ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
488958 Топик полностью
VAI (18.02.2014 11:20, просмотров: 197) ответил atlant на stm32F205
Я использую 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; // ну и т.д.