今天我用到RTX里面使用printf ,发现程序死掉了

我发现很多人遇到了这样的问题

找了网上很多的文章,说是这个是RTX的一个先天不足的问题

我发现了正点原子的 原子哥的解决方案,如下所示:

-------------------------------------------------------------------------------

产生原因:

使用库里的printf函数在输出结束后会调用__used void _mutex_acquire (OS_ID *mutex)这个方法,

但是传入的参数mutex并未进行初始化,所有内存访问地址出错。造成hardfault

解决方案:
1.修改RTX_Lib.c文件中的__used void _mutex_acquire (OS_ID *mutex)函数,在函数开始部分手动初始化互斥量。
__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);
  }
}

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

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

----------------------------------------------------------------------------------------------------

以上的两种情况 我都使用了,但是发现 :

方法1还是有问题,在任务调度之后还是软件死掉了;

方法2 目前使用软件正常;

以下的代码可以放在 uUARTx_printf.c 中,然后把这个文件放在你的开发工程文件列表中加入编译

代码包含了 fputc重新定向

 /* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stdio.h" //加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{ /*
while((USART1->SR&0X40)==0);
USART1->DR = (u8) ch;
*/
//while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //等待上次发送结束
//USART_SendData(USART1, (unsigned char)ch); //发送数据到串口 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}
USART_SendData(USART1, (unsigned char)ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET){} return ch;
} int ferror(FILE *f)
{
return EOF;
} #endif

感谢原子哥的方法

也希望更多的人,有更好的办法解决这个问题

大家讨论解决方案

[原创]RTX使用printf输出后进入hardfault中断的处理方法 - 讨论的更多相关文章

  1. 使用System.out.printf()输出日志重定向到文件后显示混乱问题

    写了一个小工具,使用System.out.printf()输出日志,以方便使用者查看,在终端显示没有问题,但重定向到文件就有问题了,会出现一些很奇怪的乱序现象. 上网查询资料,判断应该是跟重定向和Li ...

  2. POJ 2255 Tree Recovery(根据前序遍历和中序遍历,输出后序遍历)

    题意:给出一颗二叉树的前序遍历和中序遍历的序列,让你输出后序遍历的序列. 思路:见代码,采用递归. #include <iostream> #include <stdio.h> ...

  3. 在进行多次scanf时,printf输出错误

    随便一处代码,经过改正后,输出正确的 ''' #include <stdio.h> int main(){    int T;    scanf("%d",&T ...

  4. printf 输出浮点数

    在测试printf函数输出结果时,写了如下代码: /** * printf:格式化输出函数 * printf函数不会按照格式控制而对数据类型进行转换,不管三七二十一, * 抓到二进制数据就按照格式控制 ...

  5. 贪吃蛇游戏(printf输出C语言版本)

    这一次我们应用printf输出实现一个经典的小游戏—贪吃蛇,主要难点是小蛇数据如何存储.如何实现转弯的效果.吃到食物后如何增加长度. 1 构造小蛇 首先,在画面中显示一条静止的小蛇.二维数组canva ...

  6. printf()输出

    printf()函数是式样化输出函数, 一般用于向准则输出设备按规定式样输出消息.正在编写步骤时经常会用到此函数.printf()函数的挪用式样为: printf("<式样化字符串&g ...

  7. Win7超级终端查看单片机printf输出

    问题描述:     编写单片机C程序时,经常会用到printf输出信息进行查看,如何查看printf输出? 问题解决:     (1)编写单片机C程序     ucos是一个实时多任务操作系统,以上是 ...

  8. printf 输出% 和 \

    在小白第一章后面1.5.3中有仨题: 1 试着把%d中的两个字符(百分号和小写字母d)输出到屏幕. 2 试着把\n中的两个字符(反斜线和小写字母n)输出到屏幕. 3 像 1.2这样需要“特殊方法”才能 ...

  9. PAT 甲级 1063 Set Similarity (25 分) (新学,set的使用,printf 输出%,要%%)

    1063 Set Similarity (25 分)   Given two sets of integers, the similarity of the sets is defined to be ...

随机推荐

  1. select函数的使用

    select函数是 I/O 复用中非常重要的一个函数,属于并发编程的.它能够监视我们需要监视的文件描述符的变化情况–读.写或者异常 1. 函数原型 #include <sys/select.h& ...

  2. postman(参数化)

    一.参数化 1.新建csv文件 2.csv文件中输入变量名和参数 3.postman中新增接口,并设置变量 4.选择进入runner页面 方法一 方法二 5.导入参数化csv格式文件,点击run It ...

  3. vue 之 slot插槽

    插槽,也就是slot,是组件的一块HTML模板,这块模板显示不显示.以及怎样显示由父组件来决定. 实际上,一个slot最核心的两个问题这里就点出来了,父组件决定插槽显示或不显示以及怎样显示,子组件决定 ...

  4. E. Count The Blocks(找数学规律)

    \(\color{Red}{先说一下自己的歪解(找规律)}\) \(n=1是答案是10\) \(n=2时答案是180\) \(n=3时模拟一下,很容易发现答案是2610\ \ 180\ \ 10\) ...

  5. K - Leapin' Lizards HDU - 2732 网络流

    题目链接:https://vjudge.net/contest/299467#problem/K 这个题目从数据范围来看可以发现是网络流,怎么建图呢?这个其实不是特别难,主要是读题难. 这个建图就是把 ...

  6. Spring 学习 之 再探publish-event机制

    之前的文章链接:https://blog.csdn.net/qq_41907991/article/details/88544777 我们要知道的是,Spring的publish-event使用的是监 ...

  7. JS实现显示来访者的停留时间

    显示来访者的停留时间 <script language="javascript"> var ap_name = navigator.appName; var ap_vi ...

  8. Linux dts 设备树详解(二) 动手编写设备树dts

    Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 前言 硬件结构 设备树dts文件 前言 在简单了解概念之后,我们可以开始尝试写一个 ...

  9. Android 电池管理系统架构总结 Android power and battery management architecture summaries

    文章目录 1 整体架构 2 设计构架 2.1 driver 2.1.1 Charger.ko 2.1.2 Battery.ko 2.2 power supply 2.2.1 基础架构 2.2.2 代码 ...

  10. springBoot整合Spring-Data-JPA, Redis Redis-Desktop-Manager2020 windows

    源码地址:https://gitee.com/ytfs-dtx/SpringBoot Redis-Desktop-Manager2020地址: https://ytsf.lanzous.com/b01 ...