реклама на сайте
подробности

 
 
> Непонятный эффект компилятора (линкера?)
Вячик13
сообщение Jul 30 2015, 05:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение Jul 31 2015, 02:23
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Вячик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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2025 - 02:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01407 секунд с 7
ELECTRONIX ©2004-2016