今天我用到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. Java中的集合Queue

    2019独角兽企业重金招聘Python工程师标准>>> package com.zhaogang.test; import org.junit.Test; import java.u ...

  2. ISA Introduction

    介绍一下X86.MIPS.ARM三种指令集: 1. X86指令集 X86指令集是典型的CISC(Complex Instruction Set Computer)指令集. X86指令集外部看起来是CI ...

  3. 数学--数论--欧拉降幂--P5091 欧拉定理

    题目背景 出题人也想写有趣的题面,可惜并没有能力. 题目描述 给你三个正整数,a,m,ba,m,ba,m,b,你需要求:ab mod ma^b \bmod mabmodm 输入格式 一行三个整数,a, ...

  4. codeforce 272E Dima and Horses (假DFS)

    E. Dima and Horses Dima came to the horse land. There are n horses living in the land. Each horse in ...

  5. 解决虚拟机中linux系统无法使用本机无线wifi联网的问题

    VMware Workstation 在嵌入式开发中经常会遇到,但是显示大多数人使用开发环境是Win10 + 无线网卡,针对这种情况,需要配置虚拟机的上网环境使用的是NAT模式,将配置过程进行描述: ...

  6. rabbitmq启动时出错epmd error for host

    centos7环境下新装rabbitmq,第一次启动时发现出错:ERROR: epmd error for host "****":XXXXXXX 检查发现当前机器的名称为 1  ...

  7. 金钱货币用什么类型--(Java)

    0.前言 项目中,基本上都会涉及到金钱:那么金钱用什么数据类型存储呢? 不少新人都会认为用double,因为它是双精度类型啊,或者float, 其实,float和double都是不能用来表示精确的类型 ...

  8. NLP(二十九)一步一步,理解Self-Attention

      本文大部分内容翻译自Illustrated Self-Attention, Step-by-step guide to self-attention with illustrations and ...

  9. OpenWrt(LEDE)2020.4.29更新 UPnP+NAS+多拨+网盘+DNS优化+帕斯沃 无缝集成+软件包

    交流群:QQ 1030484865 电报:  t_homelede   固件说明 基于Lede OpenWrt R2020.4.8版本(源码截止2020.4.29)Lienol Feed及若干自行维护 ...

  10. 就没有我遇不到的报错!java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/filter/Filter

    本来准备用HBase的Bulkload将HDFS的HFile文件导入到HBase的myuser2表中,用的是yarn jar的命令 yarn jar /export/servers/hbase-1.2 ...