Перейти к содержанию
    

IAR MSP430 Внутренняя ошибка компилятора?

В довольно сложной программе (полностью на С) столкнулся с тем, что контроллер перезагружался.

Нашел команду, которая несколько некорректно скомпилировалась, упростил проект до одной команды на ассемблере. (MOVX.W...)

На картинке видно, что команда MOVX... начинается с 0xFFF, а должна с 0x4XXX:

 

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

 

Контроллер MSP430F2416

Embedded Workbench 5.4

Версия IAR C/C++ Compiler for MSP430 4.21.2

post-16848-1337241919_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какие варнинги вылетают при компиляции?

Совсем никаких, оптимизация отключена.

Причем если смещение уменьшить, то все нормально:

post-16848-1337318760_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Совсем никаких, оптимизация отключена.

Причем если смещение уменьшить, то все нормально:

Для начала я бы посоветовал выяснить, в какой момент программа начинает сваливаться (т.е. точное значение этого пресловутого смещения при котором еще работает и при котором уже нет)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так происходит когда смещение меньше 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.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так происходит когда смещение меньше 0.

....

И это только при настройке в IAR Data model=Large, при котором можно использовать более 64k ram.

 

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

Советую посмотреть при отладке, не возникает ли переполнения стека?

 

Ради интереса посмотрел код. Результат в аттаче.

post-9885-1337416627_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Да, я ошибся, я имел ввиду flash (я использую MSP430F2418 с 116k flash).

А не подскажите какой версии у Вас компилятор.

Я написал в техподдержку iar'a, ответили попробуйте более новую версию (4.21.9), как бы в ней исправлены какие то баги с генерацией кода. Пока еще не попробовал.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Относительно старенький. 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,

на обоих нормально, перешел на более новый.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...