ВНИМАНИЕ! 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]
-
- А ему пофиг указатели - DL36(27.03.2009 12:17, ссылка)