Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR MSP430 Внутренняя ошибка компилятора?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Дмитрий К.
В довольно сложной программе (полностью на С) столкнулся с тем, что контроллер перезагружался.
Нашел команду, которая несколько некорректно скомпилировалась, упростил проект до одной команды на ассемблере. (MOVX.W...)
На картинке видно, что команда MOVX... начинается с 0xFFF, а должна с 0x4XXX:

Кто нибудь может подсказать.

Контроллер MSP430F2416
Embedded Workbench 5.4
Версия IAR C/C++ Compiler for MSP430 4.21.2
KykyryzzZ
Какие варнинги вылетают при компиляции?
Дмитрий К.
QUOTE (KykyryzzZ @ May 17 2012, 13:22) *
Какие варнинги вылетают при компиляции?

Совсем никаких, оптимизация отключена.
Причем если смещение уменьшить, то все нормально:
Нажмите для просмотра прикрепленного файла
KykyryzzZ
Цитата(Дмитрий К. @ May 18 2012, 09:27) *
Совсем никаких, оптимизация отключена.
Причем если смещение уменьшить, то все нормально:

Для начала я бы посоветовал выяснить, в какой момент программа начинает сваливаться (т.е. точное значение этого пресловутого смещения при котором еще работает и при котором уже нет)
Дмитрий К.
Так происходит когда смещение меньше 0.
Вот где это получается:

CODE
#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
Цитата(Дмитрий К. @ May 18 2012, 13:55) *
Так происходит когда смещение меньше 0.
....
И это только при настройке в IAR Data model=Large, при котором можно использовать более 64k ram.


У MSP430F2416 объем RAM 4Кбайта... От куда взялись 64К?
Советую посмотреть при отладке, не возникает ли переполнения стека?

Ради интереса посмотрел код. Результат в аттаче.
Дмитрий К.
QUOTE (KykyryzzZ @ May 19 2012, 12:38) *
У MSP430F2416 объем RAM 4Кбайта... От куда взялись 64К?

Да, я ошибся, я имел ввиду flash (я использую MSP430F2418 с 116k flash).
А не подскажите какой версии у Вас компилятор.
Я написал в техподдержку iar'a, ответили попробуйте более новую версию (4.21.9), как бы в ней исправлены какие то баги с генерацией кода. Пока еще не попробовал.
KykyryzzZ
Относительно старенький. IAR Embedded Workbench IDE 5.3. IAR C/C++ Compiler for MSP430 V4.10.

Непонятно только, почему один и тот же код по разному компилируется...
Дмитрий К.
Попробовал на IAR C/C++ Compiler for MSP430 V4.11 и 5.40.1,
на обоих нормально, перешел на более новый.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.