Что-то я по видимому не понял в данной теме. Привожу выдержку из программы:
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.
|