ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
24 ноября
30739
Andy Mozzhevilov (25.05.2005 07:25, просмотров: 987)
ARM IAR C, v4.20a - bug Потратил день времени на вылавливание следующего бага: short mamont[128]; char slon1; char slon2; void mamont_init(void) { mamont[0] = 1; slon1 = 0; slon2 = 0; } \ mamont: \ 00000000 DS8 256 2 char slon1; \ slon1: \ 00000100 DS8 1 3 char slon2; \ slon2: \ 00000101 DS8 1 4 ... 5 void mamont_init(void) 6 { 7 mamont[0] = 1; \ ??mamont_init: \ 00000000 10009FE5 LDR R0,??mamont_init_1 ;; mamont \ 00000004 0110A0E3 MOV R1,#+0x1 \ 00000008 B010C0E1 STRH R1,[R0, #+0] 8 slon1 = 0; \ 0000000C 0010A0E3 MOV R1,#+0x0 \ 00000010 B010C0E1 STRH R1,[R0, #+256] 9 slon2 = 0; slon1 и slon2 располагаются в памяти рядом. Компилятор, начиная с уровня оптимизации 6, считает, что раздельное обнуление этих переменных через STRB можно соптимизировать в одно обращение через STRH сразу для обеих переменных. При этом несколько забывая, что для STRH максимальный оффсет задается 8 битами и не может превышать 255. Баг проявляется, если нужно смещение 256, если оффсет нужен больше, то там все нормально. В 4.11a этого бага нет. regexp для поиска этого бага в lst файлах : STRH R.+,\[R.+, #\+256\]