Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MSP-GCC 4. Кто-нибудь пробовал?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Страницы: 1, 2
MrYuran
Перекомпилил старый ИАРовский прожект, который раньше был меньше 20к.
Результат - больше 30...
cranky.gif
манипуляции с ключами пока особого эффекта не дают (наверно, не знаю нужную комбинацию)
В конце концов, полфлэша свободно, так что пока не жмёт.
А вот если бы пришлось утаптывать в Fx47, то критично..
MrYuran
В последнее время проект реанимирован, произошло (насколько я понял) слияние старой ветки GCC 3 с новаторской 4-й, обновили страничку на sf.net, прибрались порядочно.
К сожалению, выкинули python-овские тулзы, и даже файл ihex2txt.exe, преобразующий ihex понятно во что.
io.h теперь deprecated, равно как signal.h
Цитата
c:\mspgcc_new\bin\..\lib\gcc\msp430\4.5.3\..\..\..\..\msp430\include\signal.h|43|warning: #warning msp430-libc <signal.h> deprecated, using <legacymsp430.h>|
c:\mspgcc_new\bin\..\lib\gcc\msp430\4.5.3\..\..\..\..\msp430\include\io.h|1|warning: #warning <io.h> is deprecated, please include <msp430.h>|


Автоматом редирект на новые с предупреждением.
Прогнал старый проект, выловил кучу фатальных ошибок, которые раньше пролетали даже без предупреждений.
Результат:
Код
text       data        bss        dec        hex    filename
  27832         24       1040      28896       70e0    xxx.elf
msp430-gcc (GCC) 4.5.3


Было:
Код
text       data        bss        dec        hex    filename
  29076         40       1016      30132       75b4    xxx.elf
msp430-gcc (GCC) 3.2.3

Оптимизация -Os

Минус кило двести даже при прочих равных. А ведь можно и потоньше настроить.

В целом очень рад, что проект получил новое развитие. Хотя в перспективе можем от msp430 отказаться в пользу новых Cortex M0/M3
MrYuran
Попробовал дополнительные ключики
Цитата
CFLAGS += -combine
CFLAGS += -fwhole-program


:

Код
text       data        bss        dec        hex    filename
  26870         24       1031      27925       6d15    xxx.elf


Ещё минус кило.
Итого, минус 2200 с 29000.
-7,59%

А ведь один проект недавно совсем чуть-чуть в 60к не влез, пришлось ИАР эксплуатировать, в порядке исключения.
А теперь бы не пришлось.
AHTOXA
Это про какой mspgcc? Про просто mspgcc или про mspgcc4? Второй вроде уже не суппортед давно.
MrYuran
Цитата(AHTOXA @ Apr 5 2012, 11:59) *
Это про какой mspgcc? Про просто mspgcc или про mspgcc4?

Это про просто mspgcc, который теперь 4.5.3 и к тому же
mspgcc 2012-03-31
Напомню, крайний официальный релиз 3-го на sf.net был где-то в районе 301208

Цитата
Uniarch continued the work of mspgcc4, returning those contributions to the mspgcc project and generalizing the infrastructure to support all 300+ variants of the MSP430 microcontroller. The name "uniarch" is no longer used: the project is again simply "mspgcc".


PS:
а я путем коммента
#CFLAGS += -fno-reorder-blocks
#CFLAGS += -fno-reorder-blocks-and-partition
ещё 128 байт отжал sm.gif
Итого, -8% ровно.

Я бы на месте TI премию выписал всем новым (и старым) энтузиастам, или хотя бы радиочасики подарил, на память sm.gif
AHTOXA
А, ну с этим мы уже немножко познакомились sm.gif
MrYuran
Цитата(AHTOXA @ Apr 5 2012, 12:32) *
А, ну с этим мы уже немножко познакомились sm.gif

Там что-то все про баги, а я вот старый проект просто тупо собрал, и все работает как надо.
Более того, исчез один мелкий, но необъяснимый глюк. Просто сам по себе.
MrYuran
Попробовали крайнюю версию 4.6.2 - опять -combine отломали...
maniac.gif
AHTOXA
Цитата(MrYuran @ Apr 5 2012, 14:36) *
Там что-то все про баги, а я вот старый проект просто тупо собрал, и все работает как надо.

Глюки там были при -ffunction-sections -fdata-sections + -gc-sections. Остальное нормуль вроде. Но я пока на старой версии, не хочу экспериментировать.
Цитата
Попробовали крайнюю версию 4.6.2 - опять -combine отломали...
Да это ещё нигде толком не работает, имхо. По крайней мере, закладываться на работоспособность этой фичи я бы не стал ещё год как минимум.
MrYuran
Цитата(AHTOXA @ Apr 5 2012, 17:02) *
Глюки там были при -ffunction-sections -fdata-sections + -gc-sections. Остальное нормуль вроде. Но я пока на старой версии, не хочу экспериментировать.
Да это ещё нигде толком не работает, имхо. По крайней мере, закладываться на работоспособность этой фичи я бы не стал ещё год как минимум.

Глюков с секциями не обнаружено.
Комбайновая фича конечно необязательная, но иногда очень полезная, когда упихиваешь в прошивку последнюю сотню-другую байт.
И тут вдруг пару кБ нахаляву...
MrYuran
Сегодня обнаружил эпический глюк в этой версии.
Все работает, кроме записи во флеш-память.
Скомпилировал старым добрым 3х, все работает.
Слов нет, одни эмоции.
Буду копать, конечно. Но такие вещи малость напрягают, мягко говоря.
Похоже, ошибки в h-файлах периферии, хотя вроде ти-шные там теперь, без самопала.
alx2
Цитата(MrYuran @ May 24 2012, 14:01) *
Сегодня обнаружил эпический глюк в этой версии.

А почему Вы решили, что глюк именно в компиляторе?
Я неоднократно сталкивался с тем, что проекты перестают работать при смене версии gcc (2-3-4), и каждый раз причиной оказывались глюки моих программ, а не компилятора...
Если уж обвиняете компилятор - приведите исходный код, результат его компиляции и покажите, что конкретно не так...

Цитата(MrYuran @ May 24 2012, 14:01) *
Похоже, ошибки в h-файлах периферии, хотя вроде ти-шные там теперь, без самопала.

Если ошибки в сторонних файлах, то при чем тут компилятор? sm.gif
MrYuran
Цитата(alx2 @ May 25 2012, 07:25) *
Если ошибки в сторонних файлах, то при чем тут компилятор? sm.gif

При том, что это комплект. И он должен быть полностью рабочий.
Будет время, посмотрю, что там не так.

Код
#define __special_area__    __attribute__((section(".infomem"),used))
//#define __special_area__    __attribute__((section(".seg_a"),used))

/**
*   Хранилище данных и настроек
*/
const __special_area__ stFlashData FlashData = FACTORY_SETTINGS;

//###############################################################

static inline
void memcopy(unsigned int DstPtr[], unsigned int SrcPtr[], unsigned int NumOfWords)
{    
    while(NumOfWords--)
    {
        DstPtr[NumOfWords] = SrcPtr[NumOfWords];
    }    
}

static inline
void EraseFlash(unsigned int* segment)
{
    _DINT();
    FCTL1 = FWKEY + ERASE;                // Set Erase bit
    FCTL3 = FWKEY;                        // Clear Lock bit
    *(segment) = 0;                       // Dummy write to erase Flash segment
    FCTL1 = FWKEY;                          // Clear WRT bit
    FCTL3 = FWKEY + LOCK;                   // Reset LOCK bit
    _EINT();
}

void SaveToFlash(unsigned int *DstPtr, unsigned int *SrcPtr, unsigned int NumOfWords)
{
    _DINT();
        FCTL3 = FWKEY;                        // Clear Lock bit
        FCTL1 = FWKEY + WRT;                  // Set WRT bit for write operation
        memcopy(DstPtr, SrcPtr, NumOfWords);
        FCTL1 = FWKEY;                          // Clear WRT bit
        FCTL3 = FWKEY + LOCK;                   // Reset LOCK bit
    _EINT();
}


Код
void SaveParamsToFlash(void)
{
//    LightsOn(low_a);
    static stFlashData tempFlashData;
    tempFlashData = FlashData;

    tempFlashData.Mode = Mode & 0x07;
    tempFlashData.Mode |= Work;             // костыль
    tempFlashData.Reagent = Doser.Reagent;
    tempFlashData.Xust[tempFlashData.Reagent] = Doser.Xust;

    EraseFlash((unsigned int*)&FlashData);
    SaveToFlash((unsigned int*)&FlashData, (unsigned int*)&tempFlashData, (sizeof(FlashData)+1)/2);

}


Функция гарантированно запускается в нужные моменты (подсвечивал светодиодиком), в листинге все присутствует и на первый взгляд вполне корректно, с точностью до конкретных адресов и констант. Но запись в флеш не производится. То есть, гарантированно не запускается контроллер записи в флеш, поскольку отсутствует задержка исполнения (обычно заметно "на глаз").

Учитывая, что изъян в единичном экземпляре, склоняюсь к косяку в <msp430f149.h>
Сергей Борщ
Давно не работаю с MSP, но при беглом просмотре бросилось в глаза: В EraseFlash вы сначала выставляете ERASE а потом снимаете LOCK, а в SaveToFlash наоборот - сначала снимаете LOCK а потом выставляете WRT. Это не может быть причиной? Хотя, если раньше работало... По документации порядок явно не оговаривается. Короче - кажите листинг.
MrYuran
Вот листинг старой версии (трэш и угар sm.gif но работает)
CODE
void SaveToFlash(unsigned int *DstPtr, unsigned int *SrcPtr, unsigned int NumOfWords)
{
3ef0: 0b 12 push r11
3ef2: 0b 4f mov r15, r11
3ef4: 0c 4e mov r14, r12
D:\work\PROJECTS\..\1002DT_430_01_00/flash/flash.c:42
_DINT();
3ef6: 32 c2 dint
D:\work\PROJECTS\..\1002DT_430_01_00/flash/flash.c:43
FCTL3 = FWKEY; // Clear Lock bit
3ef8: b2 40 00 a5 mov #-23296,&0x012c ;#0xa500
3efc: 2c 01
D:\work\PROJECTS\..\1002DT_430_01_00/flash/flash.c:44
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
3efe: b2 40 40 a5 mov #-23232,&0x0128 ;#0xa540
3f02: 28 01
memcopy():
D:\work\PROJECTS\..\1002DT_430_01_00/flash/flash.c:22
//###############################################################

static inline
void memcopy(unsigned int DstPtr[], unsigned int SrcPtr[], unsigned int NumOfWords)
{
while(NumOfWords--)
3f04: 3d 53 add #-1, r13 ;r3 As==11
3f06: 3d 93 cmp #-1, r13 ;r3 As==11
3f08: 0a 24 jz $+22 ;abs 0x3f1e
D:\work\PROJECTS\..\1002DT_430_01_00/flash/flash.c:24
{
DstPtr[NumOfWords] = SrcPtr[NumOfWords];
3f0a: 0f 4d mov r13, r15
3f0c: 0f 5f rla r15
3f0e: 0e 4f mov r15, r14
3f10: 0e 5b add r11, r14
3f12: 0f 5c add r12, r15
3f14: ae 4f 00 00 mov @r15, 0(r14) ;0x0000(r14)
3f18: 3d 53 add #-1, r13 ;r3 As==11
3f1a: 3d 93 cmp #-1, r13 ;r3 As==11
3f1c: f6 23 jnz $-18 ;abs 0x3f0a
SaveToFlash():
D:\work\PROJECTS\..\1002DT_430_01_00/flash/flash.c:46
{
_DINT();
FCTL3 = FWKEY; // Clear Lock bit
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
memcopy(DstPtr, SrcPtr, NumOfWords);
FCTL1 = FWKEY; // Clear WRT bit
3f1e: b2 40 00 a5 mov #-23296,&0x0128 ;#0xa500
3f22: 28 01
D:\work\PROJECTS\..\1002DT_430_01_00/flash/flash.c:47
FCTL3 = FWKEY + LOCK; // Reset LOCK bit
3f24: b2 40 10 a5 mov #-23280,&0x012c ;#0xa510
3f28: 2c 01
D:\work\PROJECTS\..\1002DT_430_01_00/flash/flash.c:48
_EINT();
3f2a: 32 d2 eint
D:\work\PROJECTS\..\1002DT_430_01_00/flash/flash.c:49
}
3f2c: 3b 41 pop r11
3f2e: 30 41 ret


А вот новая.
Код
000042d6 <SaveToFlash>:
SaveToFlash():
    42d6:    0b 12           push    r11        
    42d8:    0a 12           push    r10        
    42da:    32 c2           dint            
    42dc:    03 43           nop            
    42de:    b2 40 00 a5     mov    #-23296,&0x012c;#0xa500
    42e2:    2c 01
    42e4:    b2 40 40 a5     mov    #-23232,&0x0128;#0xa540
    42e8:    28 01
    42ea:    0c 43           clr    r12        
    42ec:    0b 4d           mov    r13,    r11    
    42ee:    0b 5b           rla    r11        
    42f0:    0f 5b           add    r11,    r15    
    42f2:    0e 5b           add    r11,    r14    
    42f4:    07 3c           jmp    $+16     ;abs 0x4304
    42f6:    3d 53           add    #-1,    r13;r3 As==11
    42f8:    0b 4f           mov    r15,    r11    
    42fa:    0b 5c           add    r12,    r11    
    42fc:    0a 4e           mov    r14,    r10    
    42fe:    0a 5c           add    r12,    r10    
    4300:    ab 4a 00 00     mov    @r10,    0(r11);0x0000(r11)
    4304:    2c 83           decd    r12        
    4306:    0d 93           tst    r13        
    4308:    f6 23           jnz    $-18     ;abs 0x42f6
    430a:    b2 40 00 a5     mov    #-23296,&0x0128;#0xa500
    430e:    28 01
    4310:    b2 40 10 a5     mov    #-23280,&0x012c;#0xa510
    4314:    2c 01
    4316:    32 d2           eint            
    4318:    3a 41           pop    r10        
    431a:    3b 41           pop    r11        
    431c:    30 41           ret



Немного переделал (заинлайнил erase и save внутри вызывающей функции). Чтобы все на виду. Такой вариант тоже не работал.
Код
    4330:    32 c2           dint            
    4332:    03 43           nop            
    4334:    b2 40 02 a5     mov    #-23294,&0x0128;#0xa502
    4338:    28 01
    433a:    b2 40 00 a5     mov    #-23296,&0x012c;#0xa500
    433e:    2c 01
    4340:    3f 40 00 10     mov    #4096,    r15;#0x1000
    4344:    b2 40 00 a5     mov    #-23296,&0x0128;#0xa500
    4348:    28 01
    434a:    b2 40 10 a5     mov    #-23280,&0x012c;#0xa510
    434e:    2c 01
    4350:    32 d2           eint            
    4352:    32 c2           dint            
    4354:    03 43           nop            
    4356:    b2 40 00 a5     mov    #-23296,&0x012c;#0xa500
    435a:    2c 01
    435c:    b2 40 40 a5     mov    #-23232,&0x0128;#0xa540
    4360:    28 01
    4362:    af 4b 00 00     mov    @r11,    0(r15);0x0000(r15)
    4366:    af 4a 02 00     mov    @r10,    2(r15);0x0002(r15)
    436a:    af 4c 04 00     mov    @r12,    4(r15);0x0004(r15)
    436e:    af 4d 06 00     mov    @r13,    6(r15);0x0006(r15)
    4372:    af 4e 08 00     mov    @r14,    8(r15);0x0008(r15)
    4376:    b2 40 00 a5     mov    #-23296,&0x0128;#0xa500
    437a:    28 01
    437c:    b2 40 10 a5     mov    #-23280,&0x012c;#0xa510
    4380:    2c 01
    4382:    32 d2           eint


Сразу раскрутился цикл sm.gif

Лично я никакого криминала не нашел.
Есть ещё последний вариант с тактированием флеш-контроллера.

Код
BCSCTL2 = (DIVS)|(DIVM_0)|(SELM_0)|(SELS);    // SMCLK=XT2CLK, DIVS=1, DIVM=1, MCLK=DCOCLC

    117c:    f2 40 0a 00     mov.b    #10,    &0x0058;#0x000a
    1180:    58 00

FCTL2 = FWKEY | FSSEL_1 | FN3 | FN2 | FN1;  // MCLK/14 for Flash Timing Generator
    1182:    b2 40 4e a5     mov    #-23218,&0x012a;#0xa54e
    1186:    2a 01


Нет, все совпадает... Чудеса, однако.

Попутно ещё один небольшой глючок:
Цитата
msp430-objdump -dStl .\exe\1002TD_430_01_00.elf > .\exe\1002TD_430_01_00.lst
BFD: Dwarf Error: mangled line number section.
BFD: Dwarf Error: mangled line number section.
BFD: Dwarf Error: mangled line number section.
BFD: Dwarf Error: mangled line number section.
...

Отсюда и отсутствие исходного текста в новых листингах
Сергей Борщ
QUOTE (MrYuran @ May 25 2012, 11:05) *
Попутно ещё один небольшой глючок:
Пишите заявку в багтрекер. Питер довольно часто выпускает исправления.
alx2
Цитата(MrYuran @ May 25 2012, 10:04) *
При том, что это комплект. И он должен быть полностью рабочий.
.....
Учитывая, что изъян в единичном экземпляре, склоняюсь к косяку в <msp430f149.h>

Вы совершенно правы насчет того, что комплект должен быть рабочим.
Но в официальном релизе gcc-4.6.2 нет файла msp430f149.h
Поэтому, если ваше предположение верно, то претензии следует адресовать отнюдь не к gcc и его авторам, а к тому, кто составил комплект и положил в него нерабочий файл.

Извините за мою въедливость. Я пишу это потому, что у начинающих после чтения этой темы может возникнуть неверное мнение (и даже предубеждение) о gcc. К сожалению, я с таким сталкивался...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.