что -то cтранности какието наблюдаю в работе:
вот фрагмент кода на С:
Код
int main(void) {
volatile short *pA = 0x0206;
volatile short B;
*pA = 0xABCD;
pA = 0;
B = *(volatile short *)(0x206);
*(volatile short *)(0x80) = B;
*(volatile short *)(0x84) = B;
*(volatile short *)(0x86) = B;
*(volatile short *)(0x88) = B;
for(;;);
вот то что компильнул mspgcc:
Код
int main(void) {
f036: 31 40 fe 02 mov #766, r1;#0x02fe
volatile short *pA = 0x0206;
volatile short B;
*pA = 0xABCD;
f03a: b2 40 cd ab mov #-21555,&0x0206;#0xabcd
f03e: 06 02
pA = 0;
B = *(volatile short *)(0x206);
f040: 91 42 06 02 mov &0x0206,0(r1);0x0000(r1)
f044: 00 00
*(volatile short *)(0x80) = B;
f046: a2 41 80 00 mov @r1, &0x0080
*(volatile short *)(0x84) = B;
f04a: a2 41 84 00 mov @r1, &0x0084
*(volatile short *)(0x86) = B;
f04e: a2 41 86 00 mov @r1, &0x0086
*(volatile short *)(0x88) = B;
f052: a2 41 88 00 mov @r1, &0x0088
for(;;);
f056: ff 3f jmp $+0;abs 0xf056
}
В область периферии копируется по адресу 0x0080 чиселка 0xABCD - это всё нормально.
В область периферии копируется по адресу 0x0084 чиселка 0x0300 - это НЕ ПРАВИЛЬНО !!!.
В область периферии копируется по адресу 0x0086 чиселка 0xABCD - это всё нормально.
В область периферии копируется по адресу 0x0088 чиселка 0x0300 - это НЕ ПРАВИЛЬНО !!!.
Ничего не понятно (: баг в ядре чтоль? Симулятор M*o*d S*E*6*1
Для чистоты эксперимента периферию заменил регистром
Код
always @(posedge CLK)
if(per_en && per_wen)
PER_REG <= #1 per_din;
Огорчает в ядре то, что хотя оно и 16-тиразрядное - Програм Коунтер (PC) ТОЖЕ ШЕСТНАДЦАТИРАЗРЯДНЫЙ. т.е. без изврата со страницами памяти можно адресовать 64 КСлов. Архитектура ФонНеймана - тоесть из 64К надо вычесть размер памяти данных и размер страницы периферии (. В общем получается памяти меньше чем у AVR