Jump to content
    

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

Share this post


Link to post
Share on other sites

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

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

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

post-16848-1337318760_thumb.png

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

....

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

 

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

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

 

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

post-9885-1337416627_thumb.jpg

Share this post


Link to post
Share on other sites

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

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

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

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

 

Share this post


Link to post
Share on other sites

Относительно старенький. IAR Embedded Workbench IDE 5.3. IAR C/C++ Compiler for MSP430 V4.10.

 

Непонятно только, почему один и тот же код по разному компилируется...

Share this post


Link to post
Share on other sites

Попробовал на IAR C/C++ Compiler for MSP430 V4.11 и 5.40.1,

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...