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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Непонятный эффект компилятора (линкера?)
megajohn
сообщение Jul 30 2015, 11:27
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(Вячик13 @ Jul 30 2015, 14:19) *
Понял, спасибо. Вполне возможно. Сейчас начну перелопачивать таблицу построчно, постепенно добавляя данные.


а можно добавить __root


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 30 2015, 11:44
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (shreck @ Jul 30 2015, 12:44) *
А ADCChannels, MenuTestVariable определены в этом же файле?

По барабану в каком файле они находятся - компилятор по любому НЕ знает абсолютные адреса обьектов, где-бы они не описывались. Абсолютными адресами будет по любому потом линкер заниматься.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 31 2015, 02:23
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 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
shreck
сообщение Jul 31 2015, 02:44
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328



Цитата(zltigo @ Jul 30 2015, 17:44) *
По барабану в каком файле они находятся - компилятор по любому НЕ знает абсолютные адреса обьектов, где-бы они не описывались. Абсолютными адресами будет по любому потом линкер заниматься.

Проверил на IAR 7.40.1 и на GCC 4.9
IAR не справился с задачей. Он действительно кладет подобную структуру в ОЗУ.
А вот GCC справился.
А поскольку у ТС IAR, то вопрос исчерпан. Хотя у меня в голове сидят смутные воспоминания, что когда-то давно у меня получилось проделать этот трюк с IAR'ом. Только не помню каким и для какого проца.
Go to the top of the page
 
+Quote Post
Вячик13
сообщение Jul 31 2015, 05:12
Сообщение #20


Участник
*

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



Ура! Нашёл причину.

В структуре должны быть только ссылки на переменные в ОЗУ. Тогда она ложится во флэш. А у меня в середине массива структур были не ссылки , а сами переменные.

{"После фильтра",mt_FloatValue,&WeightShowFilter.OutputValue,0,0,al_Operator,0.0,0.0,0.0,260,NULL,261,263,&MenuTestVariable[261],NULL,NULL,6,262}, //Вес на выходе после фильтра индикации весового канала 1
{"Смещение нуля",mt_FloatValue,WeightChannel[0].Offset,0,0,al_Operator,0.0,0.0,0.0,260,NULL
,262,261,&MenuTestVariable[262],NULL,NULL,6,263}, //Смещение нуля в Вольтах весового канала 1

Вот здесь. Первая строка всё нормально. А появление второй сразу закидывает таблицу в ОЗУ, поскольку объект "WeightChannel[0]" находится в ОЗУ.

Всем спасибо за помощь. Тема закрыта.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 22:33
Рейтинг@Mail.ru


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