Имеется IAR 6.50 для ARM. Проект выполнен для STM32F103VCT6 с использованием scmRTOS V4.00.
В тексте программы имеется объявление константной структуры с инициализацией:
Код
typedef struct {
char *Name; //Отображаемое имя пункта меню
unsigned char Type; //Тип отображения величины пункта меню
float *Value; //Ссылка на величину пункта меню
unsigned char Precision; //Точность для чисел с плавающей запятой
unsigned char Flags; //Флаги пункта меню
unsigned char Access; //Уровень доступа к пункту меню
float MinValue; //Минимально допустимая величина
float MaxValue; //Максимально допустимая величина
float DefaultValue; //Величина по умолчанию
unsigned short UpMenuItem; //Индекс пункта меню вверх
unsigned short DownMenuItem; //Индекс пункта меню вниз
unsigned short LeftMenuItem; //Индекс пункта меню влево
unsigned short RightMenuItem; //Индекс пункта меню вправо
TMenuVariable *MenuVar; //Указатель на переменные величины меню
void (*ShowSubroutine)(void *ItemPtr); //Указатель на программу, которая выполняется при отображении величины (передаётся указатель на пункт меню)
void (*EditSubroutine)(void *ItemPtr,float NewValue); //Указатель на программу, которая выполняется при изменении величины (передаётся указатель на пункт меню)
unsigned char ValueLength; //Количество позиций, отведённое на величину пункта меню
unsigned short Index; //Индекс пункта внутри меню
} TMenuItem;
const TMenuItem TestMenuItems[] = {
/* Name - Type - Value - Precis - Flags - Access - MinValue - MaxValue - DefValuePtr - UpItem - DownItem - LeftItem - RightItem - Var - ShowSubrout - EditSubrout - ValueLength - GroupItem */
{"АЦП",mt_WithoutValue,NULL,0,0,al_Operator,0.0,0.0,0.0,NULL,2,428,66,&MenuTestVariable[0],NULL,NULL,0,1}, //Пункт меню "АЦП"
{"АЦП 1",mt_FloatValue,&ADCChannels[0].Value,3,0,al_Operator,0.0,0.0,0.0,1,NULL,65,3,&MenuTestVariable[1],NULL,NULL,6,2}, //Канал АЦП 1
{"АЦП 2",mt_FloatValue,&ADCChannels[1].Value,3,0,al_Operator,0.0,0.0,0.0,1,NULL,2,4,&MenuTestVariable[2],NULL,NULL,6,3}, //Канал АЦП 2
...
{"АЦП 64",mt_FloatValue,&ADCChannels[63].Value,3,0,al_Operator,0.0,0.0,0.0,1,NULL,64,2,&MenuTestVariable[64],NULL,NULL,6,65}, //Канал АЦП 64
};
Оптимизация отключена. Компилируется без ошибок.
В файле *.map упоминание об этой структуре отсутствует.
Но это только часть таблицы. Добавляю остальное. Опять компилирую.
Появляется в файле *.map, но ложится а область ОЗУ (длина таблицы 0x5890 байт).
Пытаюсь поставить перед объявлением и инициализацией прагму:
#pragma location=0x08000800
Теперь ложится в память согласно прагме, но после загрузки при попытке выполнения "улетает".
Что делать и кто виноват?
Сообщение отредактировал Herz - Jul 30 2015, 09:43