OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5319|回复: 3

cortex m0 进入ARM模式产生的hardfault的疑问

[复制链接]

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2018-4-22
在线时间
26 小时
发表于 2022-11-1 16:03:45 | 显示全部楼层 |阅读模式
5金钱
最近在思考如下问题,产生一点疑问:
    1.已知CM0只能运行在Thumb模式;
    2.已知BLX或BX指令在跳转前会检查跳转地址。地址最低位为0,则跳转后要切换(或保持在)ARM模式;地址最低位为1,则跳转后要切换(或保持在)Thumb模式;
    3.有如下代码(主要是Fun函数指定链接地址为0x00003230):
  1. __attribute((section(".ARM.__at_0x00003230")))
  2. void Fun( void )
  3. {
  4.     xxxx(省略无关代码)
  5. }

  6. void main( void )
  7. {
  8.     xxxx(省略无关代码)
复制代码
   则 “   (*(void(*)())0x00003230)();    ”这句必然导致产生hardfault,因为跳转地址最低位为0,导致跳转后要切换到ARM模式。

    在实际仿真中,全速运行确实会产生hardfault,可是单步调试则不产生hardfault,运行正常。

    请问全速运行单步调试为什么效果不同呢?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2018-4-22
在线时间
26 小时
 楼主| 发表于 2022-11-1 16:07:18 | 显示全部楼层
完整代码是这样的:

__attribute((section(".ARM.__at_0x00003230")))

void Fun( void )

{
   
   xxxx(省略无关代码)

}



void main( void )

{
   
    xxxx(省略无关代码)

    (*(void(*)())0x00003230)();    // 函数指针访问函数Fun

    xxxx(省略无关代码)
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2022-11-2 00:09:07 | 显示全部楼层
楼主是打算要做什么特殊应用么?
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2018-4-22
在线时间
26 小时
 楼主| 发表于 2022-11-2 09:08:47 | 显示全部楼层
正点原子 发表于 2022-11-2 00:09
楼主是打算要做什么特殊应用么?

并不是,只是很好奇这个问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 22:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表