STM32 HardFault_Handler

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: STM32 HardFault_Handler

Inlägg av sodjan »

Skillnaden är alltså mellan:

Kod: Markera allt

__set_MSP(*(uint32_t*) 0x08000000 + 0x3400);
__set_MSP(*(uint32_t*) (0x08000000 + 0x3400));
Det påverkar väl evalueringsordningen...

Första fallet kanske tolkas som:

Kod: Markera allt

__set_MSP((*(uint32_t*) 0x08000000) + 0x3400);
eller liknande (osäker på var start parentesen ska sitta), och
det kanske inte är det som du vill ha...
thebolt
Inlägg: 248
Blev medlem: 10 februari 2008, 17:41:40
Ort: Taipei Taiwan

Re: STM32 HardFault_Handler

Inlägg av thebolt »

Det är precis som Sodjan säger, det ändrar evalueringsordningen. I C är evalueringsordningen (på de inblandade operatorerna)
- Parenteser
- Unära operatorer, *[dereference] (typecast)
- Binära operatorer, +

Ett tips för att undvika det är att säkerställa att din FLASH_START alltid evalueras först där den används, så använd prenteser i FLASH_START-definitionen

Kod: Markera allt

#define BL_FLASH_START	0x08000000
#define BL_FLASH_SIZE	 0x3400	// 13 kB
#define FLASH_START	(BL_FLASH_START + BL_FLASH_SIZE)
SvenW
Inlägg: 1156
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: STM32 HardFault_Handler

Inlägg av SvenW »

Ett vanligt misstag som alla gör!
Sätt _alltid_ parenteser runt ett uttryck i en makrodefinition. Hver gang!
Nu i efterhand ser jag det tydligt i det nionde? inlägget.
Skäms lite för att jag inte läste inlägget ordentligt med en gång :-(
Rick81
Inlägg: 755
Blev medlem: 30 december 2005, 13:07:09

Re: STM32 HardFault_Handler

Inlägg av Rick81 »

Nu ser det ju så självklart ut.....

Bra tips alltid parenteser runt markouttryck. Hade sparat mig många timmars felsökning....
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: STM32 HardFault_Handler

Inlägg av sodjan »

Första frågan man ställer när man ser "__set_MSP(*(uint32_t*) FLASH_START);" är ju "vad innehåller FLASH_START ?" Och när man kollade definitionen av FLASH_START (vilket ju även fanns i tråden) så var resten ganska klart.

Och eftersom en parentes gjorde skillnad så kunde det inte vara ett vanligt numeriskt värde utan något slags uttryck där parentesen ändrade på uträkningen av hela uttrycket.
Skriv svar