ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
131010
dxwak (11.09.2008 10:03, просмотров: 26048) MBedder
Интересное поведение IAR MSP 4.11B Ранее, я использовал IAR MSP 4.10A, а сегодня я установил IAR MSP 4.11B. В итоге, очень простой проект перестал работать, а именно перестал загораться индикатор. Проблема оказалась в функции, которая пересылала данные в индикатор. Была строка: P4OUT = (P4OUT & 0xf0)|(data&0x0f); Старым компилятором она дзасемблировалась следующим образом: 001266 4C4E mov.b R12,R14 001268 F07E 000F and.b #0xF,R14 00126C 425F 001D mov.b &P4OUT,R15 001270 F07F 00F0 and.b #0xF0,R15 001274 DE4F bis.b R14,R15 001276 4FC2 001D mov.b R15,&P4OUT А новым компилятором она дизасемблируется вот так: 0012FA B35C bit.b #0x1,R12 0012FC 2C03 jc 0x1304 0012FE C3D2 001D bic.b #0x1,&P4OUT 001302 3C02 jmp 0x1308 001304 D3D2 001D bis.b #0x1,&P4OUT И когда я ставлю breakpoint после неё в старом компиляторе необходимые данные появляются на порту, а в новом не появляются. Тогда я вместо той строки в новом компиляторе написал: unsigned char temp=P4OUT; P4OUT = (temp & 0xf0)|(data&0x0f); Такой код дизасемблировался следующим образом: 0012A6 425F 001D mov.b &P4OUT,R15 P4OUT = (temp & 0xf0)|(data&0x0f); 0012AA 4C4E mov.b R12,R14 0012AC F07E 000F and.b #0xF,R14 0012B0 4F4D mov.b R15,R13 0012B2 F07D 00F0 and.b #0xF0,R13 0012B6 DE4D bis.b R14,R13 0012B8 4DC2 001D mov.b R13,&P4OUT Так всё работает. Уровень оптимизации в обоих проектах - None. Откуда у меня возник вопрос почему такое могло произойти? Может быть я не учёл что-то в настройках IAR? Как можно изменить что-то чтобы такой проблемы не возникало. Ведь может не заработать что-то что не сразу заметно.