ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
5 июля
151994
fk0, легенда (27.03.2009 10:57, просмотров: 25476)
ВНИМАНИЕ! picc18 9.51pl2 -- баг! Некорректная работа с const struct указателями при использовании битовых полей! Количество его багов в мозг не укладывается уже (вспоминается неправильное сравнение знаковых целых при значении аргумента -32768..-32768+255, неправильная работа с const char указателями на структуры при --cp=24...) На конструкцию вида const struct s_xxx *conf; ... unsigned char p; p=conf->pol; где conf->pol -- битовое поле... генерит следующее (явно бредовый код, или покажите мне где я не прав!) 252 017A04 C032 F000 movff ?_uchan_proc,btemp 253 017A08 C033 F001 movff ?_uchan_proc+1,btemp+1 254 017A0C 2A00 incf btemp,f,c 255 017A0E 0E00 movlw 0 256 017A10 2201 addwfc btemp+1,f,c 257 017A12 C000 FFF6 movff btemp,tblptrl 258 017A16 C001 FFF7 movff btemp+1,tblptrh 259 017A1A 0008 tblrd * 260 017A1C CFF5 F000 movff tablat,btemp 261 017A20 5000 movf btemp,w,c 262 017A22 0B01 andlw 1 263 017A24 6F37 movwf (?a_uchan_proc+1)^(__Lparam& (0+65280)),b Поясню. Он почему-то считает, что const struct в данном случае -- непременно ROM, хотя в других случаях, без обращения к битовым полям, в рантайме проверяет адрес и вместо TBLRD обращается к RAM 1080 0180D8 l20: 1081 0180D8 C032 FFF6 movff ?_uchan_proc,tblptrl 1082 0180DC C033 FFF7 movff ?_uchan_proc+1,tblptrh 1083 0180E0 0E0E movlw (high __ramtop+-1) 1084 0180E2 64F7 cpfsgt tblptrh,c 1085 0180E4 D003 bra u437 1086 0180E6 0008 tblrd * 1087 0180E8 50F5 movf tablat,w,c 1088 0180EA D005 bra u430 1089 0180EC u437: 1090 0180EC CFF6 FFE9 movff tblptrl,fsr0l 1091 0180F0 CFF7 FFEA movff tblptrh,fsr0h 1092 0180F4 50EF movf indf0,w,c 1093 0180F6 u430:
[ZX]