3m-soft (04.09.2006 13:00, просмотров: 1) ответил iit на Ответ: Вроде все верно...
Ответ: Так пробовал Пробовал и так: receive1.write_ptr=&(receive1.buffer);
и так: receive1.write_ptr=&receive1.buffer[0];
и так: receive1.write_ptr=receive1.buffer;
Пробовал и так: *receive1.write_ptr++=ch;
и так: *receive1.write_ptr=ch; receive1.write_ptr++;
Я смотрел ассемблерные листинги и вроде адрес буфера передается правильно.
Я пробовал искать различия между CARM и ARM-ADS.
Первый генерирует:
LDR R3,=receive1 + 0x4 ; receive1+4
LDR R0,[R3,#0x0] ; receive1+4
STRB R2,[R0,#0x0]
Второй делает так:
LDR r3,|L1.1580|
...
LDR r1,[r3,#4] ; receive1
STRB r2,[r1],#1
где |L1.1580| это указатель на начало структуры receive1
Глянул по всем листингам и понял что CARM вообще не генерирует инструкций вида STRB r2,[r1],#1, он использует вид STRB R2,[R0,#0x0].
Поставил при помощи inline-assembler'а
STRB R2,[R0,#0x0] вместо STRB r2,[r1],#1
Сначала ARM-ADS ругался не давая мне использовать напрямую регистры потом я пошаманил и в итоге получил подмену в коде STRB r2,[r1],#1 на STRB R2,[R0,#0x0]. Но не помогло.