skb_tantal 0 May 17, 2012 Posted May 17, 2012 · Report post В довольно сложной программе (полностью на С) столкнулся с тем, что контроллер перезагружался. Нашел команду, которая несколько некорректно скомпилировалась, упростил проект до одной команды на ассемблере. (MOVX.W...) На картинке видно, что команда MOVX... начинается с 0xFFF, а должна с 0x4XXX: Кто нибудь может подсказать. Контроллер MSP430F2416 Embedded Workbench 5.4 Версия IAR C/C++ Compiler for MSP430 4.21.2 Quote Share this post Link to post Share on other sites More sharing options...
KykyryzzZ 0 May 17, 2012 Posted May 17, 2012 · Report post Какие варнинги вылетают при компиляции? Quote Share this post Link to post Share on other sites More sharing options...
skb_tantal 0 May 18, 2012 Posted May 18, 2012 · Report post Какие варнинги вылетают при компиляции? Совсем никаких, оптимизация отключена. Причем если смещение уменьшить, то все нормально: Quote Share this post Link to post Share on other sites More sharing options...
KykyryzzZ 0 May 18, 2012 Posted May 18, 2012 · Report post Совсем никаких, оптимизация отключена. Причем если смещение уменьшить, то все нормально: Для начала я бы посоветовал выяснить, в какой момент программа начинает сваливаться (т.е. точное значение этого пресловутого смещения при котором еще работает и при котором уже нет) Quote Share this post Link to post Share on other sites More sharing options...
skb_tantal 0 May 18, 2012 Posted May 18, 2012 · Report post Так происходит когда смещение меньше 0. Вот где это получается: #include "io430.h" float float_1; float float_2; typedef struct { short data[1000]; float coefficient[40]; } My_struct; My_struct sA; unsigned char channel; float float_tmp[4]; int main( void ) { channel = 0; sA.coefficient[channel + 10] = float_tmp[0]; // <<<<<<<< while(1); } где sA.coefficient[channel + 10] = float_tmp[0]; в ассемблере выглядит так: \ 000006 ....5E42.... MOVX.B &channel, R14 \ 00000C 4E4E MOV.B R14, R14 \ 00000E 3E500A00 ADD.W #0xa, R14 \ 000012 3EE00080 XOR.W #0x8000, R14 \ 000016 4E06 RLAM.A #0x2, R14 \ 000018 ....9E42.... MOVX.W &float_tmp, sA - 129072(R14) \ .... \ 000020 ....9E42.... MOVX.W &float_tmp + 2, sA - 129070(R14) \ .... Явно "sA - 129072(R14)" выглядит странновато. И это только при настройке в IAR Data model=Large, при котором можно использовать более 64k ram. Quote Share this post Link to post Share on other sites More sharing options...
KykyryzzZ 0 May 19, 2012 Posted May 19, 2012 · Report post Так происходит когда смещение меньше 0. .... И это только при настройке в IAR Data model=Large, при котором можно использовать более 64k ram. У MSP430F2416 объем RAM 4Кбайта... От куда взялись 64К? Советую посмотреть при отладке, не возникает ли переполнения стека? Ради интереса посмотрел код. Результат в аттаче. Quote Share this post Link to post Share on other sites More sharing options...
skb_tantal 0 May 21, 2012 Posted May 21, 2012 · Report post У MSP430F2416 объем RAM 4Кбайта... От куда взялись 64К? Да, я ошибся, я имел ввиду flash (я использую MSP430F2418 с 116k flash). А не подскажите какой версии у Вас компилятор. Я написал в техподдержку iar'a, ответили попробуйте более новую версию (4.21.9), как бы в ней исправлены какие то баги с генерацией кода. Пока еще не попробовал. Quote Share this post Link to post Share on other sites More sharing options...
KykyryzzZ 0 May 21, 2012 Posted May 21, 2012 · Report post Относительно старенький. IAR Embedded Workbench IDE 5.3. IAR C/C++ Compiler for MSP430 V4.10. Непонятно только, почему один и тот же код по разному компилируется... Quote Share this post Link to post Share on other sites More sharing options...
skb_tantal 0 May 23, 2012 Posted May 23, 2012 · Report post Попробовал на IAR C/C++ Compiler for MSP430 V4.11 и 5.40.1, на обоих нормально, перешел на более новый. Quote Share this post Link to post Share on other sites More sharing options...