| |
Непонятный эффект компилятора (линкера?) |
|
|
|
|
Jul 30 2015, 05:24
|
Участник

Группа: Участник
Сообщений: 71
Регистрация: 17-01-12
Пользователь №: 69 604

|
Имеется 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
|
|
|
|
|
|
|
 |
Ответов
|
|
Jul 31 2015, 02:23
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Вячик13 @ Jul 30 2015, 11:24)  В файле *.map упоминание об этой структуре отсутствует. Значит нигде в коде она у Вас не используется. Цитата(Вячик13 @ Jul 30 2015, 11:24)  Но это только часть таблицы. Добавляю остальное. Опять компилирую. Появляется в файле *.map, но ложится а область ОЗУ (длина таблицы 0x5890 байт). Открывайте icf-файл компоновщика и смотрите куда у Вас компонуются какие секции. Пример моего icf-файла для какого-то STM32F100: CODE define memory mem with size = 4G; define region FLASH_regionA = mem:[from 0x08000000 to 0x080000FF]; define region FLASH_regionB = mem:[from 0x08000100 to 0x0800FFFF]; define region RAM_regionA = mem:[from 0x20000000 size 0x5000];
define block CSTACK with alignment = 8, size = 0x000 {}; define block HEAP with alignment = 8, size = 0x000 {};
//.dma: для DMA-транзакций //.BITBAND_RAM: для bitband-переменных
initialize by copy {rw}; do not initialize {section .noinit}; do not initialize {section .dma}; do not initialize {section .bssStk}; do not initialize {section .bssStkMain}; do not initialize {section .bssMemNoFill}; do not initialize {section .imonSave};
define block IMAGE_HEAD with fixed order {section .intvec, section .checksum, section .codehead, section .intvecTail}; place in FLASH_regionA {block IMAGE_HEAD}; place in FLASH_regionB {ro, first section .codebegin, last section .codetail}; place in RAM_regionA {rw, first block CSTACK, section .BITBAND_RAM, section .dma, section .bssMemNoFill, block HEAP};
include "io.icf"; Строка place in FLASH_regionB задаёт компоновщику линковать все readonly-секции, для которых целевые регионы не указанные явно, во FLASH_regionB. Цитата(Вячик13 @ Jul 30 2015, 11:24)  Пытаюсь поставить перед объявлением и инициализацией прагму: #pragma location=0x08000800 Теперь ложится в память согласно прагме, но после загрузки при попытке выполнения "улетает". Ну да, а по этим адресам у Вас случайно не код находится? И получается каша. Понятно что "улетает"... Цитата(Вячик13 @ Jul 30 2015, 11:24)  Что делать и кто виноват? Виноваты понятно - Вы. А что делать - написано выше. Цитата(AHTOXA @ Jul 30 2015, 14:40)  Я бы в первую очередь заменил char *Name; //Отображаемое имя пункта меню на char const* Name; И почему? Почему Вы думаете, что это у автора указатель на константные данные? Ничто не запрещает указателю на данные в ОЗУ быть константным. Он просто становится char * const Name;Цитата(Вячик13 @ Jul 30 2015, 17:19)  Понял, спасибо. Вполне возможно. Сейчас начну перелопачивать таблицу построчно, постепенно добавляя данные. Нет в Вашем объявлении ничего, что мешает экземпляру структуры быть константным. Разве что убедитесь что в этом экземпляре (и подобных ему остальных): {"АЦП",mt_WithoutValue,NULL,0,0,al_Operator,0.0,0.0,0.0,NULL,2,428,66,&MenuTestVariable[0],NULL,NULL,0,1}что: mt_WithoutValue и al_Operator - константы (enum или #define), а не переменные. PS: И возможно ещё что Вы что-то намутили с ключами проекта IAR.
|
|
|
|
|
|
Сообщений в этой теме
Вячик13 Непонятный эффект компилятора (линкера?) Jul 30 2015, 05:24 zltigo QUOTE (Вячик13 @ Jul 30 2015, 08:24) Опти... Jul 30 2015, 06:17 Вячик13 Ну хорошо, "структура не может быть проинициа... Jul 30 2015, 06:38  zltigo QUOTE (Вячик13 @ Jul 30 2015, 09:38) Каки... Jul 30 2015, 06:45 Сергей Борщ Цитата(Вячик13 @ Jul 30 2015, 08:24) Появ... Jul 30 2015, 08:05 zltigo QUOTE (Сергей Борщ @ Jul 30 2015, 11:05) ... Jul 30 2015, 08:30 Вячик13 Цитата(Сергей Борщ @ Jul 30 2015, 11:05) ... Jul 30 2015, 09:37  shreck Цитата(Вячик13 @ Jul 30 2015, 15:37) Так ... Jul 30 2015, 09:44   Вячик13 Цитата(shreck @ Jul 30 2015, 12:44) А ADC... Jul 30 2015, 10:23    shreck Цитата(Вячик13 @ Jul 30 2015, 16:23) ... ... Jul 30 2015, 10:32     Вячик13 Цитата(shreck @ Jul 30 2015, 13:32) Ну во... Jul 30 2015, 10:52   zltigo QUOTE (shreck @ Jul 30 2015, 12:44) А ADC... Jul 30 2015, 11:44    shreck Цитата(zltigo @ Jul 30 2015, 17:44) По ба... Jul 31 2015, 02:44 AHTOXA Я бы в первую очередь заменил
char *Name; ... Jul 30 2015, 08:40 shreck Цитата(AHTOXA @ Jul 30 2015, 14:40) Я бы ... Jul 30 2015, 09:21 shreck Значит есть что-то еще, о чем не знает компилятор ... Jul 30 2015, 10:58 Вячик13 Цитата(shreck @ Jul 30 2015, 13:58) Значи... Jul 30 2015, 11:19  megajohn Цитата(Вячик13 @ Jul 30 2015, 14:19) Поня... Jul 30 2015, 11:27 Вячик13 Ура! Нашёл причину.
В структуре должны быть т... Jul 31 2015, 05:12
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|