У меня дикое недоумение - в чём "провинилась" структура перед компилятором HI-TECH PICC-18 v8.20PL3???
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено fantasy 14 января 2003 г. 12:08

У меня дикое недоумение - в чём "провинилась" структура перед компилятором HI-TECH PICC-18 v8.20PL3???
Процессор PIC18F452

Имею исходный текст:

...
typedef struct {
unsigned int nowPos;
unsigned int goPos;
unsigned int nowSpeed;
unsigned int goSpeed;
unsigned int minSpeed;
unsigned goDirection:1;
unsigned goRainbow:1;
unsigned lastDir:1;
} nxStepData;
...
static near nxStepData step; (объявлена как глобальная!)
...
if(step.nowSpeed > step.goSpeed)
{
if(step.nowSpeed > step.minSpeed)
{
if(step.goSpeed < step.minSpeed) step.nowSpeed = step.minSpeed;
else step.nowSpeed = step.goSpeed;
}
else
{
step.nowSpeed--;
};
}
else if(step.nowSpeed != step.goSpeed)
{
if(step.goSpeed < step.minSpeed) step.nowSpeed++;
else step.nowSpeed = step.goSpeed;
};

При полностью включенной оптимизации (-Zg10 -O -G -ASMLIST -NOERRATA) компилятор выдаёт:

1101 ;SpColour.c: 606: if(step.nowSpeed > step.goSpee
+ d)
1102 0CB6 0E37 movlw (_step+4)& (0+255)
1103 0CB8 6EE1 movwf fsr1l,c
1104 0CBA 6AE2 clrf fsr1h,c
1105 0CBC 0E39 movlw (_step+6)& (0+255)
1106 0CBE 6EE9 movwf fsr0l,c
1107 0CC0 6AEA clrf fsr0h,c
1108 0CC2 52EE movf postinc0,f,c
1109 0CC4 52E6 movf postinc1,f,c
1110 0CC6 50E5 movf postdec1,w,c
1111 0CC8 5CED subwf postdec0,w,c
1112 0CCA E102 bnz u1355
1113 0CCC 50E7 movf indf1,w,c
1114 0CCE 5CEF subwf indf0,w,c
1115 0CD0 u1355:
1116 0CD0 B0D8 btfsc status,0,c
1117 0CD2 D027 goto l153
1118 ;SpColour.c: 607: {
1119 0CD4 0E37 movlw (_step+4)& (0+255)
1120 0CD6 6EE1 movwf fsr1l,c
1121 0CD8 6AE2 clrf fsr1h,c
1122 0CDA 0E3B movlw (_step+8)& (0+255)
1123 0CDC 6EE9 movwf fsr0l,c
1124 0CDE 6AEA clrf fsr0h,c
1125 0CE0 52EE movf postinc0,f,c
1126 0CE2 52E6 movf postinc1,f,c
1127 0CE4 50E5 movf postdec1,w,c
1128 0CE6 5CED subwf postdec0,w,c
1129 0CE8 E102 bnz u1365
1130 0CEA 50E7 movf indf1,w,c
1131 0CEC 5CEF subwf indf0,w,c
1132 0CEE u1365:
1133 0CEE B0D8 btfsc status,0,c
1134 0CF0 D014 goto l154
1135 ;SpColour.c: 609: {
1136 0CF2 0E3B movlw (_step+8)& (0+255)
1137 0CF4 6EE1 movwf fsr1l,c
1138 0CF6 6AE2 clrf fsr1h,c
1139 0CF8 0E39 movlw (_step+6)& (0+255)
1140 0CFA 6EE9 movwf fsr0l,c
1141 0CFC 6AEA clrf fsr0h,c
1142 0CFE 52EE movf postinc0,f,c
1143 0D00 52E6 movf postinc1,f,c
1144 0D02 50E5 movf postdec1,w,c
1145 0D04 5CED subwf postdec0,w,c
1146 0D06 E102 bnz u1375
1147 0D08 50E7 movf indf1,w,c
1148 0D0A 5CEF subwf indf0,w,c
1149 0D0C u1375:
1150 0D0C B0D8 btfsc status,0,c
1151 0D0E D02C goto l160
1152 0D10 C03B F037 movff _step+8,_step+4
1153 0D14 C03C F038 movff _step+9,_step+5
1154 ;SpColour.c: 611: else step.nowSpeed = step.goSp
+ eed;
1155 0D18 D02B goto l158
1156 ;SpColour.c: 612: }
1157 0D1A l154:
1158 ;SpColour.c: 614: {
1159 0D1A 0637 decf _step+4,f,c
1160 0D1C A0D8 btfss status,0,c
1161 0D1E 0638 decf _step+5,f,c
1162 ;SpColour.c: 616: };
1163 ;SpColour.c: 617: }
1164 0D20 D027 goto l158
1165 0D22 l153:
1166 0D22 0E39 movlw (_step+6)& (0+255)
1167 0D24 6EE1 movwf fsr1l,c
1168 0D26 6AE2 clrf fsr1h,c
1169 0D28 0E37 movlw (_step+4)& (0+255)
1170 0D2A 6EE9 movwf fsr0l,c
1171 0D2C 6AEA clrf fsr0h,c
1172 0D2E 52EE movf postinc0,f,c
1173 0D30 52E6 movf postinc1,f,c
1174 0D32 50E5 movf postdec1,w,c
1175 0D34 18ED xorwf postdec0,w,c
1176 0D36 CFE7 FFE8 movff indf1,wreg
1177 0D3A B4D8 btfsc status,2,c
1178 0D3C 18EF xorwf indf0,w,c
1179 0D3E B4D8 btfsc status,2,c
1180 0D40 D017 goto l158
1181 ;SpColour.c: 619: {
1182 0D42 0E3B movlw (_step+8)& (0+255)
1183 0D44 6EE1 movwf fsr1l,c
1184 0D46 6AE2 clrf fsr1h,c
1185 0D48 0E39 movlw (_step+6)& (0+255)
1186 0D4A 6EE9 movwf fsr0l,c
1187 0D4C 6AEA clrf fsr0h,c
1188 0D4E 52EE movf postinc0,f,c
1189 0D50 52E6 movf postinc1,f,c
1190 0D52 50E5 movf postdec1,w,c
1191 0D54 5CED subwf postdec0,w,c
1192 0D56 E102 bnz u1395
1193 0D58 50E7 movf indf1,w,c
1194 0D5A 5CEF subwf indf0,w,c
1195 0D5C u1395:
1196 0D5C B0D8 btfsc status,0,c
1197 0D5E D004 goto l160
1198 0D60 2A37 incf _step+4,f,c
1199 0D62 0E00 movlw 0
1200 0D64 2238 addwfc _step+5,f,c
1201 ;SpColour.c: 621: else step.nowSpeed = step.goSp
+ eed;
1202 0D66 D004 goto l158
1203 0D68 l160:
1204 0D68 C039 F037 movff _step+6,_step+4
1205 0D6C C03A F038 movff _step+7,_step+5
1206 ;SpColour.c: 622: };
1207 0D70 l158:

В общем-то удивляют пересылки через регистры косвенной адресации postinc, postdec и т.п.
На кой чёрт они нужны??? При детальном рассмотрении пример логичен - загрузка указателей
в косвенные регистры, далее смещение указателей на старшие части слов, сравнение, переход,
но блин - ведь ПОЛНЫЙ БРЕД! Структура объявлена как статическая!
Самое интересное, что присвоения внутри этой-же структуры делаются по абсолютным адресам!

После исправления структуры на набор глобальных переменных (с редакцией текста):
static near unsigned int step_nowPos;
static near unsigned int step_nowPos;
static near unsigned int step_goPos;
static near unsigned int step_nowSpeed;
static near unsigned int step_goSpeed;
static near unsigned int step_minSpeed;

Компилятор выдаёт ожидаемый код:

1101 ;SpColour.c: 606: if(step_nowSpeed > step_goSpee
+ d)
1102 0CB6 5038 movf _step_nowSpeed+1,w,c
1103 0CB8 5C34 subwf _step_goSpeed+1,w,c
1104 0CBA E102 bnz u1355
1105 0CBC 5037 movf _step_nowSpeed,w,c
1106 0CBE 5C33 subwf _step_goSpeed,w,c
1107 0CC0 u1355:
1108 0CC0 B0D8 btfsc status,0,c
1109 0CC2 D017 goto l153
1110 ;SpColour.c: 607: {
1111 0CC4 5038 movf _step_nowSpeed+1,w,c
1112 0CC6 5C36 subwf _step_minSpeed+1,w,c
1113 0CC8 E102 bnz u1365
1114 0CCA 5037 movf _step_nowSpeed,w,c
1115 0CCC 5C35 subwf _step_minSpeed,w,c
1116 0CCE u1365:
1117 0CCE B0D8 btfsc status,0,c
1118 0CD0 D00C goto l154
1119 ;SpColour.c: 609: {
1120 0CD2 5036 movf _step_minSpeed+1,w,c
1121 0CD4 5C34 subwf _step_goSpeed+1,w,c
1122 0CD6 E102 bnz u1375
1123 0CD8 5035 movf _step_minSpeed,w,c
1124 0CDA 5C33 subwf _step_goSpeed,w,c
1125 0CDC u1375:
1126 0CDC B0D8 btfsc status,0,c
1127 0CDE D01B goto l160
1128 0CE0 C035 F037 movff _step_minSpeed,_step_nowSpeed
1129 0CE4 C036 F038 movff _step_minSpeed+1,_step_nowSpeed+1
1130 ;SpColour.c: 611: else step_nowSpeed = step_goSp
+ eed;
1131 0CE8 D01A goto l158
1132 ;SpColour.c: 612: }
1133 0CEA l154:
1134 ;SpColour.c: 614: {
1135 0CEA 0637 decf _step_nowSpeed,f,c
1136 0CEC A0D8 btfss status,0,c
1137 0CEE 0638 decf _step_nowSpeed+1,f,c
1138 ;SpColour.c: 616: };
1139 ;SpColour.c: 617: }
1140 0CF0 D016 goto l158
1141 0CF2 l153:
1142 0CF2 5034 movf _step_goSpeed+1,w,c
1143 0CF4 1838 xorwf _step_nowSpeed+1,w,c
1144 0CF6 E102 bnz u1385
1145 0CF8 5033 movf _step_goSpeed,w,c
1146 0CFA 1837 xorwf _step_nowSpeed,w,c
1147 0CFC u1385:
1148 0CFC B4D8 btfsc status,2,c
1149 0CFE D00F goto l158
1150 ;SpColour.c: 619: {
1151 0D00 5036 movf _step_minSpeed+1,w,c
1152 0D02 5C34 subwf _step_goSpeed+1,w,c
1153 0D04 E102 bnz u1395
1154 0D06 5035 movf _step_minSpeed,w,c
1155 0D08 5C33 subwf _step_goSpeed,w,c
1156 0D0A u1395:
1157 0D0A B0D8 btfsc status,0,c
1158 0D0C D004 goto l160
1159 0D0E 2A37 incf _step_nowSpeed,f,c
1160 0D10 0E00 movlw 0
1161 0D12 2238 addwfc _step_nowSpeed+1,f,c
1162 ;SpColour.c: 621: else step_nowSpeed = step_goSp
+ eed;
1163 0D14 D004 goto l158
1164 0D16 l160:
1165 0D16 C033 F037 movff _step_goSpeed,_step_nowSpeed
1166 0D1A C034 F038 movff _step_goSpeed+1,_step_nowSpeed+1
1167 ;SpColour.c: 622: };
1168 0D1E l158:

В общем-то вопрос: кто прав - я или компилятор? Точнее в чём моя ошибка при использовании структур?
Вопрос не праздный, т.к. у меня в работе проект в котором без структур ну никак не обойтись...

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru