OpenEdv-开源电子网

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

RTX使用printf输出后进入hardfault中断的处理方法

[复制链接]

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2014-8-16
在线时间
193 小时
发表于 2017-9-1 13:53:27 | 显示全部楼层 |阅读模式
产生原因:使用库里的printf函数在输出结束后会调用__used void _mutex_acquire (OS_ID *mutex)这个方法,但是传入的参数mutex并未进行初始化,所有内存访问地址出错。造成hardfault

解决方案:
1.修改RTX_Lib.c文件中的__used void _mutex_acquire (OS_ID *mutex)函数,在函数开始部分手动初始化互斥量。
[mw_shl_code=c,true]__used void _mutex_acquire (OS_ID *mutex) {
  /* Acquire a system mutex, lock stdlib resources. */
    static int initialized = 0;
    if (initialized == 0)
    { /* initialize the mutex */
        _mutex_initialize(mutex);
        initialized = 1;
    }//printf使用进入硬件中断的解决方法
    if (runtask_id ()) {
    /* RTX running, acquire a mutex. */
    mutex_wait (*mutex);
  }
}[/mw_shl_code]

2.重定义ferror函数,因为此函数是被库中的ferro函数调用的。
[mw_shl_code=c,true]int ferror(FILE *f)
{
    return EOF;
}[/mw_shl_code]

两个方法都可以解决该问题。

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

使用道具 举报

2

主题

46

帖子

1

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2017-5-8
在线时间
136 小时
发表于 2017-9-7 20:19:08 | 显示全部楼层
谢谢分享,之前这个问题困扰了好久,    但是好像使用MicroLIB后也可以样。
回复 支持 反对

使用道具 举报

3

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
538
金钱
538
注册时间
2012-7-19
在线时间
63 小时
发表于 2017-9-8 08:08:22 | 显示全部楼层
fl7547454 发表于 2017-9-7 20:19
谢谢分享,之前这个问题困扰了好久,    但是好像使用MicroLIB后也可以样。

微库的标准库很多函数不支持多线程,具体可以看帮助文档

我在amo那里也有这个问题的论述,我记得楼主位的做法是英文网页里有人的给出的方案,不过其实是有bug的
回复 支持 反对

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2014-8-16
在线时间
193 小时
 楼主| 发表于 2017-9-8 10:13:32 | 显示全部楼层
myxiaoniao 发表于 2017-9-8 08:08
微库的标准库很多函数不支持多线程,具体可以看帮助文档

我在amo那里也有这个问题的论述,我记得楼主 ...

第一个是搭了个梯子,找到的这个方法。感觉上也是有bug的。当时就觉得不对劲。

第二个方法是我自己追汇编追出来的方法。也是我现在正在用的方法
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-19 14:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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