Отдельный кусок с 3-мя циклами записи в external компилятор гонит полную чушь (но не с его, компилятора, точки зрения). В результате получаю 2 вместо трех шинных операций. Код для идентификациии чипа flash банален:
*((unsigned int*) (0x80000000 + (0x555<<2))) = 0xAA00;
*((unsigned int*) (0x80000000 + (0x2AA<<2))) = 0x5500;
*((unsigned int*) (0x80000000 + (0x555<<2))) = 0x9000;
Смещение на 2 разряда - т.к. шина 32 бита
в результате осциллом вижу только два обращения (записи) в память
Смещение на 8 бит - условие организации не от меня зависящей памяти
дополню:
Код
281: *((unsigned int*) (0x80000000 + (0x2AA<<2))) = 0x5500;
0x00002EA0 E3A01C55 MOV R1,#0x00005500
280: *((unsigned int*) (0x80000000 + (0x555<<2))) = 0xAA00;
281: *((unsigned int*) (0x80000000 + (0x2AA<<2))) = 0x5500;
0x00002EA4 E3A00102 MOV R0,#0x80000000
0x00002EA8 E58B1AA8 STR R1,[R11,#0x0AA8]
0x00002EAC E2800A01 ADD R0,R0,#0x00001000
282: *((unsigned int*) (0x80000000 + (0x555<<2))) = 0x9000;
283:
более из того куска компилятор не сделал
как компилятор заставить делать именно то (в данном случае) что я хочу? Есть ли описание C для Keil (ARM), чтобы не дергать лишний раз всех?
Сообщение отредактировал toweroff - Mar 26 2009, 00:52