|
|
  |
MSP-GCC 4. Кто-нибудь пробовал?, Случайно наткнулся:) |
|
|
|
May 25 2012, 03:25
|

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

|
Цитата(MrYuran @ May 24 2012, 14:01)  Сегодня обнаружил эпический глюк в этой версии. А почему Вы решили, что глюк именно в компиляторе? Я неоднократно сталкивался с тем, что проекты перестают работать при смене версии gcc (2-3-4), и каждый раз причиной оказывались глюки моих программ, а не компилятора... Если уж обвиняете компилятор - приведите исходный код, результат его компиляции и покажите, что конкретно не так... Цитата(MrYuran @ May 24 2012, 14:01)  Похоже, ошибки в h-файлах периферии, хотя вроде ти-шные там теперь, без самопала. Если ошибки в сторонних файлах, то при чем тут компилятор?
Сообщение отредактировал alx2 - May 25 2012, 03:29
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
May 25 2012, 05:04
|

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

|
Цитата(alx2 @ May 25 2012, 07:25)  Если ошибки в сторонних файлах, то при чем тут компилятор?  При том, что это комплект. И он должен быть полностью рабочий. Будет время, посмотрю, что там не так. Код #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 =)
|
|
|
|
|
May 25 2012, 08:05
|

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

|
Вот листинг старой версии (трэш и угар  но работает) 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 Сразу раскрутился цикл  Лично я никакого криминала не нашел. Есть ещё последний вариант с тактированием флеш-контроллера. Код 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 =)
|
|
|
|
|
May 28 2012, 05:07
|

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

|
Цитата(MrYuran @ May 25 2012, 10:04)  При том, что это комплект. И он должен быть полностью рабочий. ..... Учитывая, что изъян в единичном экземпляре, склоняюсь к косяку в <msp430f149.h> Вы совершенно правы насчет того, что комплект должен быть рабочим. Но в официальном релизе gcc-4.6.2 нет файла msp430f149.h Поэтому, если ваше предположение верно, то претензии следует адресовать отнюдь не к gcc и его авторам, а к тому, кто составил комплект и положил в него нерабочий файл. Извините за мою въедливость. Я пишу это потому, что у начинающих после чтения этой темы может возникнуть неверное мнение (и даже предубеждение) о gcc. К сожалению, я с таким сталкивался...
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|