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

 
 
> IAR и объединения, Где-то хомут, по-моему ....
SasaVitebsk
сообщение May 19 2006, 00:01
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Что-то я по видимому не понял в данной теме.
Привожу выдержку из программы:

int16_t ix,iy;
union {
uint16_t w; // Ñìåùåíèå îòíîñèòåëüíî ñëîâà
uint8_t b; // Ñìåùåíèå îòíîñèòåëüíî áàéòà
} id,maska;

Данное объявление находится в п/п. Конструкцию union я применил с целью сэкономить память/время исполнения. Т.к. у меня работают две ветки. В одной работа со словом, а во второй - с байтом. Одновременно - никогда. При отладке обнаружил что переменной id присвоен адрес 0x1e9. Работа происходит с atmega2560 в которой ОЗУ начинается с 0х200. Сохранение выполняется операцией std y+5,r16. Т.е. компилятор предполагает что переменная id.b находится в RAM. Где я допустил ошибку?

Привожу выдержку из обращения

338: id.b = *(((uint8_t __flash *)symbol[tekfonts])+(Znak*Fonts[tekfonts][2])+iy);
+0000224E: D07D RCALL PC+0x007E Relative call subroutine
+0000224F: 0D20 ADD R18,R0 Add without carry
+00002250: 1D31 ADC R19,R1 Add with carry
+00002251: 0D2C ADD R18,R12 Add without carry
+00002252: 1D3D ADC R19,R13 Add with carry
+00002253: 01F9 MOVW R30,R18 Copy register pair
+00002254: 9104 LPM R16,Z Load program memory
+00002255: 830D STD Y+5,R16 Store indirect with displacement
339: maska.b=0x80;
+00002256: E800 LDI R16,0x80 Load immediate
+00002257: 8308 STD Y+0,R16 Store indirect with displacement

Кстати в результате maska тоже равна 0.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
SasaVitebsk
сообщение May 19 2006, 08:40
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Похоже проблема глобальнее чем приведенный фрагмент проги. При передаче параметров в функцию также генерируются адреса за пределами ОЗУ. Сгенерировал MAP, но там пока ничего криминального не нашёл.
На сайте Точки Опоры люди приводят ошибки компиляции с данным кристалом для компилятора ICC. Может и IAR хомутнула?
Кто-нибудь работал с ATMEGA2560? Помогите.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 19 2006, 12:13
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Симулятор работает т.к. свободно размещает переменные в Ext. I/O mem. А в JTAG идёт сбой вплоть до потери синхронизации. Что я не правильно делаю. П.п. я вызываю из прерывания таким образом

#pragma vector=TIMER1_COMPA_vect
__interrupt void ShowActive(void)
{
uint8_t i, c, *adrnpict;
int16_t x,y;
uint16_t l;
...
...
OutZnak(x,y,tekcolor,c);

а объявлена она у меня выше по тексту так

void OutZnak(int16_t xiz,int16_t yiz,uint8_t Color,uint8_t Znak) // Âûâåñòè ñèìâîë
{
int16_t ix,iy;

При вызове симулятор пишет следующее размещение переменных
x - r7,r6, y - r11,r10, tekcolor - 0x298[sram], c - r16

При переходе к п.п. (в начале) она начинает сохранения вида
323: void OutZnak(int16_t xiz,int16_t yiz,uint8_t Color,uint8_t Znak) // Âûâåñòè ñèìâîë
324: {
+00002209: 92FA ST -Y,R15 Store indirect and predecrement
+0000220A: 92EA ST -Y,R14 Store indirect and predecrement
+0000220B: D0B6 RCALL PC+0x00B7 Relative call subroutine
+0000220C: 9726 SBIW R28,0x06 Subtract immediate from word
+0000220D: 8309 STD Y+1,R16 Store indirect with displacement
+0000220E: 831A STD Y+2,R17 Store indirect with displacement
+0000220F: 834B STD Y+3,R20 Store indirect with displacement
+00002210: 8358 STD Y+0,R21 Store indirect with displacement
333: if(Znak!=' '){

при этом значение Y - 1fa, что уже ошибка
В строчке 333 (выше) симулятор пишет следующие размещения переменных
x - 1e5, y - r19,r18, tekcolor - 0x1e7[sram], c - 1e4

Похоже что-то неверно с data стеком??? Как устранить помогите!!!!
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 19 2006, 13:48
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Ошибку нашёл. Необходимо самому высчитать и задать размеры стеков и свободной кучи. Но вот здесь и вопрос:
1) Можно ли ориентироваться на цифры в MAP файле, или следует "накидывать"? Короче кто и как делает?
2) Как поместить кучу (HEAP) в конец свободной памяти? Или это не обязательно?
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 19 2006, 15:33
Сообщение #5


Шаман
******

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



Цитата(SasaVitebsk @ May 19 2006, 16:48) *
1) Можно ли ориентироваться на цифры в MAP файле, или следует "накидывать"? Короче кто и как делает?

Прогнозирование стека - задача крайне непростая.
О том кто и как это делает на этом форуме уже много писАлось.
Цитата(SasaVitebsk @ May 19 2006, 16:48) *
2) Как поместить кучу (HEAP) в конец свободной памяти? Или это не обязательно?

В *.xcl файле, в строке, где размещается сегмент HEAP, вместо = поставить # (см. как размещаются стеки).
Хотя это и не обязательно.
Go to the top of the page
 
+Quote Post

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

 


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


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