10917|22

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

指定地址跳转后B指令导致hardfault [复制链接]

由于特殊用途,我程序分成了两片区域
区域1:0x8000000~
区域2:0x8050000~

区域1,写了一个函数指针,直接指定地址0x8050000跳转后
0x8050000是一条B指令跳到一个函数
但是该B指令一执行就导致hard fault
个人感觉原理上没有问题
请高手们帮忙分析下
此帖出自stm32/stm8论坛

最新回复

关中断就可以了吗?  详情 回复 发表于 2015-7-15 09:23
点赞 关注
 

回复
举报

84

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
请确认那条B指令确实烧写到指定的地址,而且跳转到的函数也确实烧写到指定的地址。

用单步调试看看。
此帖出自stm32/stm8论坛
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 跳转到0x8050000之前要先把堆栈设好。
此帖出自stm32/stm8论坛
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

4
 


这个我是可以确定的,就是用的汇编单步调试
我如果直接把PC置为0x8050000,他就能够正常跳转
但是如果从区域1里头程序运行过来,就会fault
PC到0x8050000时还是正常的,再单步一下就fault了
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 


麻烦说的仔细点,需要怎么设置堆栈
因为我觉得堆栈空间没有变化的,不需要设置吧?
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

6
 
感觉其实只是程序空间跨度大了点
和正常的函数调用应该是一样的吧
不知道差在哪里了
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 
0x8050000:
00 f0 1c b8 df f8 2c f0 df f8 2c f0 df f8 28 f0 df f8 24 f0 df f8 20 f0 df f8 1c f0 df f8 18 f0 df f8 14 f0 df f8 10 f0 df f8 0c f0 df f8 08 f0……
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

8
 
                                 执行B之前,看看core寄存器,有异常吗?
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

9
 
core寄存器?
LR是正常的
其他也没有发现什么异常
我这些代码原来在ARM7下都是正常跳转的
但是移到ST cortex-M3的核就不行了
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

10
 
跳转之前的代码有没有开什么中断?

把memory fault, bus fault和usage fault都打开,看看是什么造成的hard fault
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

11
 
没有开中断
memory fault, bus fault和usage fault这些应该都没关
我没有配置过这些中断
反正就是会产生hard fault中断
此帖出自stm32/stm8论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

12
 
一般这样的跳转,我这样写:

typedef void (*pFunction)(void);
long EntryAddress;
pFunction vEntry;
EntryAddress = *(vu32*) (0x08050004); /* 这里这么写是因为后面放的是一个完整的应用程序,包括中断向量表,所以在04的位置是应用程序的复位地址 */
vEntry = (pFunction) EntryAddress;
__MSR_MSP(*(vu32*) (0x08050000);  /* 在00的位置就是堆栈地址了 */ 
asm("CPSID I");  /* 关中断 */
vEntry ();  
/*******************************/

在后面的函数中再
asm("CPSIE I"); /* 开中断 */
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

13
 
int (*func)(void *);


        func = (int (*)(void *))0x8005000;
       
        asm("CPSID I");  /* 关中断 */

        return func(p);
我加了一句关中断,可是跳到0x8005000之后,B指令的执行结果还是hard fault
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

14
 
我又试了下
把0x8050000的B指令改成了几个NOP
结果执行第一个NOP时发生了hard fault
现象是一样的
也就是说和0x8050000放的指令没有关系

也许是其他的什么东西不对
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

15
 
我在0x8050000地址放的是以下代码:

    MODULE  C_API

    ASEG
    ORG (0x8000000+0x40000+0x10000);定义该段绝对地址,也是模块调用API的跳转表起始地址
   
    EXPORT API_FUNC_TABLE
API_FUNC_TABLE        ;
        ;start (API_FUNC_TABLE)
        IMPORT        ClearScreen       
        NOP
        NOP
        NOP
        B  ClearScreen
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

16
 
没有开中断
memory fault, bus fault和usage fault这些应该都没关
我没有配置过这些中断
反正就是会产生hard fault中断
memory, bus和usage这些fault如果你没有配置,那么一旦产生了这些fault,都会掉到hard fault里面去。所以我让你把这些fault都开启了,然后就可以看到,到底是什么fault。

如果没有其他中断,仅仅执行NOP都会导致fault,应该还是内核寄存器里有什么异常了。
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

17
 
声明一下 void API_FUNC_TABLE(void *);
然后  func = API_FUNC_TABLE;
        func(p);
就行了。这样编译器会自己处理+1的问题,直接跳转是会有你所说的现象,有时容易让人摸不着头脑。
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

18
 


如果是函数标号对PC赋值没有这个问题

但是现在我是要用绝对地址对PC赋值
此帖出自stm32/stm8论坛
 
 
 

回复

126

帖子

0

TA的资源

一粒金砂(初级)

19
 
为什么一定要用绝对地址对PC赋值呢?
其实函数名就是一个地址,你在汇编里已经写了API_FUNC_TABLE,在C里完全可以当函数名用的,而且这个函数的地址就是0x8005000.
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

20
 
因为我文件是用汇编写的,是从ARM7移植过来的
所以没有转为C的形式
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表