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

 
 
> IAR icf, Как сказать линкеру, что block относится к read-only?
Alechek
сообщение May 15 2016, 08:46
Сообщение #1


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

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Сделал эмуляцию EEPROM, хочу разместить в конце FLASH памяти. Соответственно, расположение должно передаваться в код с линковщика.

Определил в icf
Цитата
define exported symbol __NVRAM_page_size__ = 1024;
define exported symbol __ICFEDIT_region_NVRAM_pages__ = 2;

define block NVR with alignment = __NVRAM_page_size__,
size = __NVRAM_page_size__ * __ICFEDIT_region_NVRAM_pages__ { };

"NVRAM" : place at end of ROM_region { block NVR };


Все работает хорошо, за исключением одного: линковщик не знает, что это read-only регион памяти. В статистике своей относит его к readwrite data.
Код
"NVRAM":                                    0x800
  NVR                          0x08003800   0x800  <Block>
    NVR               uninit   0x08003800   0x800  <Block tail>
                             - 0x08004000   0x800
.......
    Module                 ro code  ro data  rw data
    ------                 -------  -------  -------
...................
    Gaps                                  2
    Linker created                       43    2 560


Как бы на программу не влияет, но для оценки ресурсов нужно производить лишние математические действия...
Есть варианты сказать линкеру, что этот блок - "readonly data"?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение May 15 2016, 18:25
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Alechek @ May 15 2016, 14:46) *
Есть варианты сказать линкеру, что этот блок - "readonly data"?

В исходниках:
u8 const eeprom[EEPROM_SIZE] @ ".eeprom";
В icf-файле скомпоновать секцию ".eeprom" в нужный регион памяти.
Go to the top of the page
 
+Quote Post
Alechek
сообщение May 16 2016, 05:21
Сообщение #3


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

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(jcxz @ May 15 2016, 23:25) *
В исходниках:
u8 const eeprom[EEPROM_SIZE] @ ".eeprom";
В icf-файле скомпоновать секцию ".eeprom" в нужный регион памяти.


Неудобно, что EEPROM_SIZE из icf файла взять не получится. Надо будет конфигурировать память в 2-х местах.

Но так в любом случае вылезает как минимум 2 проблемы:
1. eeprom будет линковаться в файл. а это
а) размер бинарной прошики полностью равен размеру флеша (при расположении eeprom в конце памяти)
б) при перепрошивке eeprom затирается
2. и даже затирается eeprom не в 0xFF, а, согласно стандарту C, в 0x00!

Головняк покруче, чем нарушение статистики, как в первом посте.

Go to the top of the page
 
+Quote Post
SSerge
сообщение May 16 2016, 07:39
Сообщение #4


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(Alechek @ May 16 2016, 12:21) *
Неудобно, что EEPROM_SIZE из icf файла взять не получится. Надо будет конфигурировать память в 2-х местах.

Если прочитать в EWARM_DevelopmentGuide.ENU.pdf раздел "Using symbols, expressions, and numbers":
define [ exported ] symbol name = expr;
и
export symbol name;
то получится.

Символ, объявленный в .icf как экспортируемый в тексте программы объявляется как extern и его можно таким образом использовать.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Alechek
сообщение May 16 2016, 12:00
Сообщение #5


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

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(SSerge @ May 16 2016, 12:39) *
Если прочитать в EWARM_DevelopmentGuide.ENU.pdf раздел "Using symbols, expressions, and numbers":
define [ exported ] symbol name = expr;
и
export symbol name;
то получится.

Вышлю ящик пива тому, кто скомпилит
Код
extern char A;
const char EEPROM[A];


Цитата(jcxz @ May 16 2016, 13:57) *
Ложь. Мой проект .icf:
place in FLASH_regionA {block IMAGE_HEAD};
place in FLASH_regionC {section .iapMem};
place in FLASH_regionB {ro};

Прежде чем так утверждать, покажите, что у вас
section .iapMem
участвует в статистике, да еще и как readonly memory

Цитата(jcxz @ May 16 2016, 13:57) *
Не знаю кем она у Вас там затирается, но у меня в разных проектах почему-то не затирается.

Хотел бы я так.... Но вот незадача - все переменные, в т.ч. и константы, объявленные вне тела функции, по-умолчанию идут инициализированные в 0x00

define symbol __ICFEDIT_region_ROM_start__ = 0x080000EC;
define symbol __ICFEDIT_region_ROM_end__ = 0x08003FFF;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define block NVR with alignment = __NVRAM_page_size__,
size = __NVRAM_page_size__ * __ICFEDIT_region_NVRAM_pages__ { section NVRAM };
"NVRAM" : place at end of ROM_region { block NVR };

---
#pragma location = "NVRAM"
const char NVRAM_PLACE[2048];

*.map:
"NVRAM": 0x800
NVR 0x08003800 0x800 <Block>
NVRAM const 0x08003800 0x800 drv_NVRAM.o [1]
- 0x08004000 0x800

размер бинарника 16384, в конце нули
---
#pragma location = "NVRAM"
__no_init const char NVRAM_PLACE[2048];

*.map:
"NVRAM": 0x800
NVR 0x08003800 0x800 <Block>
NVRAM uninit 0x08003800 0x800 drv_NVRAM.o [1]
- 0x08004000 0x800

размер бинарника 16384, в конце нули
---
#pragma location = "NVRAM"
__no_init const char NVRAM_PLACE[2048];
+
*.icf
do not initialize { section NVRAM };

"NVRAM": 0x800
NVR 0x08003800 0x800 <Block>
NVRAM uninit 0x08003800 0x800 drv_NVRAM.o [1]
- 0x08004000 0x800

размер бинарника равен размеру кода.

но, к слову, во всех 3-х случаях NVRAM_PLACE оказался в статистике в readonly data.
осталось заставить компилятор! выдирать переменные из icf....
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 17 2016, 02:18
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Alechek @ May 16 2016, 18:00) *
Прежде чем так утверждать, покажите, что у вас
section .iapMem
участвует в статистике, да еще и как readonly memory

Какая такая "статистика"? Если имеете в виду "MODULE SUMMARY" из map-файла, то можете вынести объявление этого массива в отдельный файл и в "MODULE SUMMARY" будет отдельная строчка для него - не перепутаете.

Цитата(Alechek @ May 16 2016, 18:00) *
Хотел бы я так.... Но вот незадача - все переменные, в т.ч. и константы, объявленные вне тела функции, по-умолчанию идут инициализированные в 0x00

Учите матчасть:
do not initialize {section .iapMem};
в icf-файле. И получите:
Код
"P2":                                      0x8000              
  .iapMem             uninit   0x00078000  0x8000  iap.o [1]  
                             - 0x00080000  0x8000


Цитата(Alechek @ May 16 2016, 11:21) *
Неудобно, что EEPROM_SIZE из icf файла взять не получится. Надо будет конфигурировать память в 2-х местах.

EEPROM_SIZE нужно объявить в обычном хидере. Зачем оно в icf?
Go to the top of the page
 
+Quote Post
Alechek
сообщение May 17 2016, 04:43
Сообщение #7


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

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(jcxz @ May 17 2016, 07:18) *
Какая такая "статистика"? Если имеете в виду "MODULE SUMMARY" из map-файла, то можете вынести объявление этого массива в отдельный файл и в "MODULE SUMMARY" будет отдельная строчка для него - не перепутаете.

Такая. В самом конце *.map файла. Я по ней ориентируюсь, сколько еще ресурсов осталось.
Код
  13 172 bytes of readonly  code memory
   2 322 bytes of readonly  data memory
   2 961 bytes of readwrite data memory



Цитата(jcxz @ May 17 2016, 07:18) *
Учите матчасть:
do not initialize {section .iapMem};

См выше. Уже изучено.


Цитата(jcxz @ May 17 2016, 07:18) *
EEPROM_SIZE нужно объявить в обычном хидере. Зачем оно в icf?

Затем что
Цитата(Alechek @ May 16 2016, 10:21) *
Неудобно, что EEPROM_SIZE из icf файла взять не получится. Надо будет конфигурировать память в 2-х местах.

То есть положение и размер задаем в *.icf. И дополнительно размер в *.h. Что, на мой взгляд, является избыточным действием.
Чего я и пытаюсь избежать. Сохранив при этом статистическую информацию по использованию памяти.
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 17 2016, 08:59
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Alechek @ May 17 2016, 10:43) *
То есть положение и размер задаем в *.icf. И дополнительно размер в *.h. Что, на мой взгляд, является избыточным действием.
Чего я и пытаюсь избежать. Сохранив при этом статистическую информацию по использованию памяти.

В icf задаётся не размер. Задаётся регион куда линковать. Достаточный для данной секции/секций. Если не хватит места - линкер ругнётся.
EEPROM_SIZE не нужен в icf.
Собственно также как и при размещении других секций (кода, данных и т.п). Вы же задавая секцию кода не говорите, что задаёте размер кода и не удивляетесь что для неё надо дополнительно задавать размер, хотя можно и по коду посчитать?
А регион в icf задаётся главным образом исходя из границ регионов стирания.
Go to the top of the page
 
+Quote Post



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

 


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


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