Sida 2 av 2
Re: STM32 HardFault_Handler
Postat: 10 augusti 2014, 21:32:15
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...
Re: STM32 HardFault_Handler
Postat: 11 augusti 2014, 07:20:53
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)
Re: STM32 HardFault_Handler
Postat: 11 augusti 2014, 09:28:58
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

Re: STM32 HardFault_Handler
Postat: 11 augusti 2014, 12:18:52
av Rick81
Nu ser det ju så självklart ut.....
Bra tips alltid parenteser runt markouttryck. Hade sparat mig många timmars felsökning....
Re: STM32 HardFault_Handler
Postat: 11 augusti 2014, 12:42:38
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.