This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

HardFault on sd_flash_write

Hello,

I have a problem with the sd_flash_write function. It HardFaults on me and I can't seem to find out why. The Addresses are 4 byte aligned...

The function is called with: err = sd_flash_write(0x34800, 0x20002a50, 1);

If anyone know assembler, maybe this helps?:

133       	else if(
0002105a:   subs r3, #1
0002105c:   cmp r3, #1
0002105e:   bls.n 0x21062 <Testing::TerminalCommandHandler(std::string, std::vector<std::string, std::allocator<std::string> >)+230>
00021060:   b.n 0x21256 <Testing::TerminalCommandHandler(std::string, std::vector<std::string, std::allocator<std::string> >)+730>
139       		err = sd_flash_write(params->dataDestination, params->dataSource, params->dataLength / 4);
>>> 00021062:   ldrh r2, [r4, #16]
00021064:   ldr r1, [r4, #8]
00021066:   lsrs r2, r2, #2
00021068:   ldr r0, [r4, #12]

This happens with the "optimize size" (-Os) option in GCC, if I use -o1, everything works, but that could be due to different alignment and some luck, though the destination and source address remain the same.

Here's the version with -O1: 133

      	else if(
0002490c:   subs r3, #1
0002490e:   cmp r3, #1
00024910:   bhi.n 0x2496c <Testing::TerminalCommandHandler(std::string, std::vector<std::string, std::allocator<std::string> >)+384>
139       		err = sd_flash_write(params->dataDestination, params->dataSource, params->dataLength / 4);
>>> 00024912:   ldrh r2, [r4, #16]
00024914:   lsrs r2, r2, #2
00024916:   ldr r0, [r4, #12]
00024918:   ldr r1, [r4, #8]

Thanks, Marius

Parents
  • where in that listing does the actual hardfault occur? Nowhere in there is it actually calling sd_flash_write() although it's preparing the registers ready for it. If the hardfault is at the place you have '>>>' then it's nothing really to do with the sd_flash_write() at all, the most likely causes of a hardfault on that line would be if the address in r4 isn't halfword aligned, ie it's odd, the last bit is set or it points to random memory which isn't in a readable region of the chip.

Reply
  • where in that listing does the actual hardfault occur? Nowhere in there is it actually calling sd_flash_write() although it's preparing the registers ready for it. If the hardfault is at the place you have '>>>' then it's nothing really to do with the sd_flash_write() at all, the most likely causes of a hardfault on that line would be if the address in r4 isn't halfword aligned, ie it's odd, the last bit is set or it points to random memory which isn't in a readable region of the chip.

Children
No Data
Related