реклама на сайте
подробности

 
 
5 страниц V  « < 3 4 5  
Reply to this topicStart new topic
> MSP-GCC 4. Кто-нибудь пробовал?, Случайно наткнулся:)
MrYuran
сообщение May 24 2012, 09:01
Сообщение #61


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Сегодня обнаружил эпический глюк в этой версии.
Все работает, кроме записи во флеш-память.
Скомпилировал старым добрым 3х, все работает.
Слов нет, одни эмоции.
Буду копать, конечно. Но такие вещи малость напрягают, мягко говоря.
Похоже, ошибки в h-файлах периферии, хотя вроде ти-шные там теперь, без самопала.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
alx2
сообщение May 25 2012, 03:25
Сообщение #62


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(MrYuran @ May 24 2012, 14:01) *
Сегодня обнаружил эпический глюк в этой версии.

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

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

Если ошибки в сторонних файлах, то при чем тут компилятор? sm.gif

Сообщение отредактировал alx2 - May 25 2012, 03:29


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 25 2012, 05:04
Сообщение #63


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(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>


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 25 2012, 06:27
Сообщение #64


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Давно не работаю с MSP, но при беглом просмотре бросилось в глаза: В EraseFlash вы сначала выставляете ERASE а потом снимаете LOCK, а в SaveToFlash наоборот - сначала снимаете LOCK а потом выставляете WRT. Это не может быть причиной? Хотя, если раньше работало... По документации порядок явно не оговаривается. Короче - кажите листинг.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 25 2012, 08:05
Сообщение #65


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Вот листинг старой версии (трэш и угар 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.
...

Отсюда и отсутствие исходного текста в новых листингах


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 25 2012, 08:59
Сообщение #66


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (MrYuran @ May 25 2012, 11:05) *
Попутно ещё один небольшой глючок:
Пишите заявку в багтрекер. Питер довольно часто выпускает исправления.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
alx2
сообщение May 28 2012, 05:07
Сообщение #67


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(MrYuran @ May 25 2012, 10:04) *
При том, что это комплект. И он должен быть полностью рабочий.
.....
Учитывая, что изъян в единичном экземпляре, склоняюсь к косяку в <msp430f149.h>

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

Извините за мою въедливость. Я пишу это потому, что у начинающих после чтения этой темы может возникнуть неверное мнение (и даже предубеждение) о gcc. К сожалению, я с таким сталкивался...


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post

5 страниц V  « < 3 4 5
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 08:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.0145 секунд с 7
ELECTRONIX ©2004-2016