ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
3 июля
87723 Топик полностью
rezident (27.04.2007 01:06, просмотров: 1) ответил rezident на ИАР 3.42А непонятная ошибка линкера.
И еще один нюанс, из области игнорирования квалификаторов типа volatile при использовании структуры. Имею глобальную структуру глобальных данных (сорри за тавтологию) в ОЗУ. Ну мне так удобнее, что глобальная структура гладко в памяти ложится :) Глобальная структура включает в себя как глобальные переменные, так и другие структуры. Есть там переменная (типа unsigned int) системных тиков, которая тупо инкрементируется в прерывании. Я ее использую для проверки небольших временных интервалов. Естественно у этой переменной имеется квалификатор volatile. Так вот в одном из модулей никак не мог с помощью нее организовать задержку по времени. Компилятор упорно брал ее значение один раз, складывал в регистр и в цикле проверки обращался только к регистру. Естественно в этом месте программа висла, хотя прерывания вызывались и значение переменной исправно инкрементировалось. Бился я и так и этак, а вышел из положения всего лишь перестановкой в глобальной структуре, сместив эту переменную ниже (ближе к концу) структуры. После такой перестановки слагаемых компилятор наконец-то обратил внимание на volatile и все скомпилировал правильно. Ошибка эта была как в ИАР 3.30А, так и в 3.42A. Имя переменной time, см. пример ниже Вот так не работает <c> #pragma pack(2) typedef struct st_globalData //структура глобальных переменных { volatile xWord time; //счетчик системных тиков xVT_KBD_Data KBD_Data; //структура вирт.клавиатуры st_net net0; //структура UART0 st_MasterNet mNet0; //структура обрабочика мастера связи xByte NetVar[(1+(NET_MAX_NUM_NET_SLAVE*4))]; //область переменных для сбора данных xByte uartBuf0[UART0_MAXBUFSIZE]; //буфер UART0 xByte txFlag; //флаг состояния автомата запросов мастера связи volatile xByte mainFlag; //флаг состояния автомата обработчика запросов по связи xByte FaultReqCntr[NET_MAX_NUM_NET_SLAVE];//счетчики ошибок запросов по связи } st_globalData; #pragma pack() </c> а вот так работает <c> #pragma pack(2) typedef struct st_globalData //структура глобальных переменных { xVT_KBD_Data KBD_Data; //структура вирт.клавиатуры st_net net0; //структура UART0 st_MasterNet mNet0; //структура обрабочика мастера связи volatile xWord time; //счетчик системных тиков xByte NetVar[(1+(NET_MAX_NUM_NET_SLAVE*4))]; //область переменных для сбора данных xByte uartBuf0[UART0_MAXBUFSIZE]; //буфер UART0 xByte txFlag; //флаг состояния автомата запросов мастера связи volatile xByte mainFlag; //флаг состояния автомата обработчика запросов по связи xByte FaultReqCntr[NET_MAX_NUM_NET_SLAVE];//счетчики ошибок запросов по связи } st_globalData; #pragma pack() </c>