memory
Apr 23 2012, 17:13
Iar объявление динамического массива
Привет всем участникам форума, проблема в следующем - есть глобальный массив unsigned char DATA[32][16], при компиляции выскакивает ошибка линковщика
Error[e16]: Segment CSTACK (size: 0x100 align: 0) is too long for segment definition.
At least 0xb more bytes needed.
The problem occurred while processing the segment placement command
"-Z(DATA)CSTACK+_..X_CSTACK_SIZE=_..X_SRAM_BASE-_..X_SRAM_END", where at the moment of placement the available memory ranges were "DATA:40b-4ff" Reserved ranges relevant to this placement: DATA:100-304 NEAR_I
DATA:305-3ca NEAR_Z
DATA:3cb-40a RSTACK
DATA:40b-4ff CSTACK
Насколько я понял этот массив передается через стек и не вмещается в нем, как объявить его динамически, то-есть привязать конкретной области памяти флеша.
const unsigned char __flash DATA[32][16];
... или вопрос был о другом?
Dog Pawlowa
Apr 23 2012, 20:38
Цитата(memory @ Apr 23 2012, 20:13)

Насколько я понял этот массив передается через стек и не вмещается в нем, как объявить его динамически, то-есть привязать конкретной области памяти флеша.
Поняли Вы неправильно. У Вас объем используемой памяти в ОЗУ не оставляет места для стека.
Передача через стек ни при чем.
memory
Apr 24 2012, 04:21
Спасибо всем откликнувшимся, директива __flash решила проблему на 99% , уже и массив в ОЗУ не располагается, и место на стек хватает. Как сделать так, чтобы массив располагался в конце кода программы, например его первый элемент должен находится в ячейке 500hex. Этот массив будут редактировать люди, не имеющие отношение к программированию, надо сделать так чтобы дамп программы а именно массив хорошо читался в блокноте.
Цитата(memory @ Apr 24 2012, 08:21)

Как сделать так, чтобы массив располагался в конце кода программы, например его первый элемент должен находится в ячейке 500hex.
См.: IAR C/C++ Compiler Reference Guide -> Part 1. Using the compiler -> Efficient coding for embedded applications -> Controlling data and function placement in memory
memory
Apr 24 2012, 08:17
В принципе все работает , только без __flash компилятор не инициализирует значения массива а так всё нормально
#pragma location=0x1000
__flash const unsigned char DATA[32][16]={//0x00 Ford_Fokus_2
0x00,0x00,0x04,0x20,0x08,0x59,0xEF,0x00,0x5E,0x42,0x10,0x03,0x32,0x00,0x96,0xFF,
//0x01 Ford_Fokus_3
0x00,0x00,0x02,0x18,0x08,0x99,0x22,0x8F,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0xFF,
//0x02 Ford_Mondeo