skb_tantal 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба В довольно сложной программе (полностью на С) столкнулся с тем, что контроллер перезагружался. Нашел команду, которая несколько некорректно скомпилировалась, упростил проект до одной команды на ассемблере. (MOVX.W...) На картинке видно, что команда MOVX... начинается с 0xFFF, а должна с 0x4XXX: Кто нибудь может подсказать. Контроллер MSP430F2416 Embedded Workbench 5.4 Версия IAR C/C++ Compiler for MSP430 4.21.2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KykyryzzZ 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба Какие варнинги вылетают при компиляции? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skb_tantal 0 18 мая, 2012 Опубликовано 18 мая, 2012 · Жалоба Какие варнинги вылетают при компиляции? Совсем никаких, оптимизация отключена. Причем если смещение уменьшить, то все нормально: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KykyryzzZ 0 18 мая, 2012 Опубликовано 18 мая, 2012 · Жалоба Совсем никаких, оптимизация отключена. Причем если смещение уменьшить, то все нормально: Для начала я бы посоветовал выяснить, в какой момент программа начинает сваливаться (т.е. точное значение этого пресловутого смещения при котором еще работает и при котором уже нет) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skb_tantal 0 18 мая, 2012 Опубликовано 18 мая, 2012 · Жалоба Так происходит когда смещение меньше 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KykyryzzZ 0 19 мая, 2012 Опубликовано 19 мая, 2012 · Жалоба Так происходит когда смещение меньше 0. .... И это только при настройке в IAR Data model=Large, при котором можно использовать более 64k ram. У MSP430F2416 объем RAM 4Кбайта... От куда взялись 64К? Советую посмотреть при отладке, не возникает ли переполнения стека? Ради интереса посмотрел код. Результат в аттаче. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skb_tantal 0 21 мая, 2012 Опубликовано 21 мая, 2012 · Жалоба У MSP430F2416 объем RAM 4Кбайта... От куда взялись 64К? Да, я ошибся, я имел ввиду flash (я использую MSP430F2418 с 116k flash). А не подскажите какой версии у Вас компилятор. Я написал в техподдержку iar'a, ответили попробуйте более новую версию (4.21.9), как бы в ней исправлены какие то баги с генерацией кода. Пока еще не попробовал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KykyryzzZ 0 21 мая, 2012 Опубликовано 21 мая, 2012 · Жалоба Относительно старенький. IAR Embedded Workbench IDE 5.3. IAR C/C++ Compiler for MSP430 V4.10. Непонятно только, почему один и тот же код по разному компилируется... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skb_tantal 0 23 мая, 2012 Опубликовано 23 мая, 2012 · Жалоба Попробовал на IAR C/C++ Compiler for MSP430 V4.11 и 5.40.1, на обоих нормально, перешел на более новый. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться