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

 
 
> Комипилятор IAR 4.02A... Нехватает Стека....., Подскажите пожалуйста кто знает...
Potter
сообщение Nov 3 2006, 08:07
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 151
Регистрация: 27-05-06
Из: Харьков
Пользователь №: 17 508



Конроллер мега 64... Надо сохранить (в памяти) большое количество данных.... Сохраняю во флеше в виде массивов..... И выскакивает следующая ошибка:


Error[e16]: Segment CSTACK (size: 0x200 align: 0) is too long for segment definition. At least 0x71 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:f71-10ff"
Reserved ranges relevant to this placement:
DATA:100-d18 NEAR_I
DATA:d19-f30 NEAR_Z
DATA:f31-f70 RSTACK
DATA:f71-10ff CSTACK

Я так понимаю что это не хватает стека.... Поправте если это не так.... Знаю что б устранить эту ошибку надо где-то в настройках проэкта что-то изменить.... Подскажите что и где надо изменить.... Работаю в компиляторе IAR 4.02A....

Зарание спасибо за ответы....
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
IgorKossak
сообщение Nov 3 2006, 08:28
Сообщение #2


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Это вовсе не значит, что именно стека не хватает.
Просто сегменты стека находятся в конце адресного пространства ОЗУ и предыдущие сегменты их выталкивают.
Уменьшить размеры стеков можно, но делать это надо осторожно либо в настройках проекта (General options - System) либо правив константы (CSTACK_SIZE RSTACK_SIZE если используете *.xcl файл).
Go to the top of the page
 
+Quote Post
slog
сообщение Nov 3 2006, 16:31
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 961
Регистрация: 28-11-05
Пользователь №: 11 489



По моему это значит что не хватает памяти для стека, который ты хочешь. Уменьши 0х200 на 0х71 и ошибка исчезнет.


--------------------
В действительности всё не так, как на самом деле.
Go to the top of the page
 
+Quote Post
Potter
сообщение Nov 4 2006, 13:52
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 151
Регистрация: 27-05-06
Из: Харьков
Пользователь №: 17 508



Цитата(slog @ Nov 3 2006, 19:31) *
По моему это значит что не хватает памяти для стека, который ты хочешь. Уменьши 0х200 на 0х71 и ошибка исчезнет.


Интересно.... Вот я сохраняю все во флеше.... Но сохраняю в виде массивов.... Тоесть в таком виде к примеру:

unsigned char I[2] = {1,74};

То есть этот масив как набор переменных.... Получается что при начале работы конроллера он полность все массивы загружает в ОЗУ.... А мне надо впринципе сохранять не переменные а константы... То есть эти данные которые мне надро сохранить не меняются.... Просто я сохраняю в виде массивов что б удобней было с данными работать.... Интересно.. Надо будет посмотреть в книге по Си... Можно ли сохранят Не просто константы... А массивы констант....
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 4 2006, 15:53
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Potter @ Nov 4 2006, 15:52) *
Интересно.... Вот я сохраняю все во флеше.... Но сохраняю в виде массивов.... Тоесть в таком виде к примеру:

unsigned char I[2] = {1,74};

Если хотите сохранять во флеш, надо писать
Код
__flash unsigned char I[2] = {1,74};
Go to the top of the page
 
+Quote Post
AVR
сообщение Nov 4 2006, 15:53
Сообщение #6


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(Potter @ Nov 4 2006, 16:52) *
unsigned char I[2] = {1,74};

При такой записи, кажется, и будет дублирование содержимого массива в ОЗУ, ведь это инициализация массива переменных.
Попробуйте так...:
const unsigned char __flash I[2] = {1,74};


--------------------
Go to the top of the page
 
+Quote Post
Stefan
сообщение Nov 4 2006, 18:59
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 43
Регистрация: 17-06-06
Пользователь №: 18 139



Цитата(Potter @ Nov 4 2006, 17:52) *
Цитата(slog @ Nov 3 2006, 19:31) *

По моему это значит что не хватает памяти для стека, который ты хочешь. Уменьши 0х200 на 0х71 и ошибка исчезнет.


Интересно.... Вот я сохраняю все во флеше.... Но сохраняю в виде массивов.... Тоесть в таком виде к примеру:

unsigned char I[2] = {1,74};

То есть этот масив как набор переменных.... Получается что при начале работы конроллера он полность все массивы загружает в ОЗУ.... А мне надо впринципе сохранять не переменные а константы... То есть эти данные которые мне надро сохранить не меняются.... Просто я сохраняю в виде массивов что б удобней было с данными работать.... Интересно.. Надо будет посмотреть в книге по Си... Можно ли сохранят Не просто константы... А массивы констант....




Вот, из работающего проекта:
...
flash unsigned char MFont[Fontsnumber][TableSize] =//Symbols tables
#include "Font.inc" //Fonts for Tablo {FontType][Symbol][Image]
...

файл Font.inc:

// Fonts for monochrome
{
#include "timesnr.fon"
,
#include "arial.fon"
,
#include "ms_sans.fon"
,
#include "tahoma.fon"
,
#include "verdana.fon"
,
#include "couriern.fon"
,
#include "arialslm.fon"
,
#include "timesslm.fon"
}; //font/inc

файл timesnr.fon (фрагмент):

//Times New Roman 16
//
{
//0 Space
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
// 20 !
231,193,39,192,
....
}

Это те самые массивы констант во флэше, что Вам нужны. У меня они занимают около 48К байт (mega128) и ни в какое ОЗУ, ессно, не копируются smile.gif
Go to the top of the page
 
+Quote Post

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

 


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


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