本帖最后由 liansh2002 于 2018-4-9 16:11 编辑
- void A(uint32_t flag) //此函数被定位到0x20003000地址处
- {
- ......
- }
- main()
- {
- p = (void(*)(uint32_t))(0x20003000 - 0);
- (*p)(0x1234);
- while(1)
- {
- ........
- }
- }
复制代码某函数通过分散加载的方式放在0x20003000地址(通过调试也确认函数地址正确)。调用函数时,通过函数指针方式调用。
比较奇葩的现象是,如果仿真单步执行,函数正常调用,且运行正常。如果直接连续运行,则在调用(*p)(0x1234)时进入HardFault中断。
但是,如果将跳转地址不按照4字节对齐(如0x20002FFF),则不管是连续运行还是单步运行,均正常。
另外使用p=&a;方式赋值时,也能正常运行。对比汇编,这种方式使用的汇编指令时BL.W,而直接给定地址时使用的汇编是BLX。如果原因是汇编指令的问题,仿真单步运行为什么又没问题!
0x20002FFF这个地址歪打正着是因为那里的flash是空白的,是0xFF,被当做NOP指令处理,因此没造成任何影响。如果那个位置有其他数据,跳过去会出事
一周热门 更多>