|
IAR и объединения, Где-то хомут, по-моему .... |
|
|
|
May 19 2006, 00:01
|
Гуру
     
Группа: Свой
Сообщений: 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.
|
|
|
|
|
 |
Ответов
(1 - 4)
|
May 19 2006, 12:13
|
Гуру
     
Группа: Свой
Сообщений: 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 стеком??? Как устранить помогите!!!!
|
|
|
|
|
May 19 2006, 15:33
|

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

|
Цитата(SasaVitebsk @ May 19 2006, 16:48)  1) Можно ли ориентироваться на цифры в MAP файле, или следует "накидывать"? Короче кто и как делает? Прогнозирование стека - задача крайне непростая. О том кто и как это делает на этом форуме уже много писАлось. Цитата(SasaVitebsk @ May 19 2006, 16:48)  2) Как поместить кучу (HEAP) в конец свободной памяти? Или это не обязательно? В *.xcl файле, в строке, где размещается сегмент HEAP, вместо = поставить # (см. как размещаются стеки). Хотя это и не обязательно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|