初级会员
- 积分
- 156
- 金钱
- 156
- 注册时间
- 2015-10-15
- 在线时间
- 31 小时
|
发表于 2017-12-13 00:13:35
|
显示全部楼层
[mw_shl_code=c,true]
//看到朋友问了一下这个打印调试信息的问题,我分享一下我现在用在freertos里面的打印输出调试信息的代码的实现吧
//**************************************************************************************************
//**************************************************************************************************
//**************************************************************************************************
//下面是debug.h文件的内容
#ifndef _DEBUG_H
#define _DEBUG_H
//1、头文件
/********************************************************************************************************************************************************************/
#include "stm32f1xx_hal.h"
#include "usart.h"
//2、宏定义
/********************************************************************************************************************************************************************/
#define DEBUG_ON 1 //DEBUG_SWITCH为ON的时候,表示开启仿真
#define DEBUG_OFF 0 //如果DEBUG_SWITCH为OFF的时候,表示关闭仿真
#define DEBUG_PIN_TOGGLE HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_11)
#define DEBUG_SWITCH DEBUG_ON
#if DEBUG_SWITCH==DEBUG_ON
#define TRACE(x...) PRINTF(x)
#else
#define TRACE(x...)
#endif
//3、类型定义
/********************************************************************************************************************************************************************/
//4、变量声明
/********************************************************************************************************************************************************************/
//5、函数声明
/********************************************************************************************************************************************************************/
void PRINTF(char *format, ...);
#endif
//**************************************************************************************************
//**************************************************************************************************
//**************************************************************************************************
//下面是debug.c文件的内容
#include "debug.h"
#include "cmsis_os.h"
#include "string.h"
#include "stdarg.h"
//获取当前中断情况--返回0表示不在中断中,
//非0表示cpu被中断占用,且返回数字为中断向量编号
static int inHandlerMode (void)
{
return __get_IPSR() != 0;
}
#define PRINTF_BUFFER_LENGTH 200
char printf_buff[PRINTF_BUFFER_LENGTH];
/**********************************************************************
** 函数名称 RINTF
** 创建人 :liupcngcheng
** 创建日期 :2017 2017/11/07 18:51
** 最新修改人 :liupcngcheng
** 最近修改日期 :2017 2017/11/07 18:51
** 功能描述 :通过串口1打印调试信息
** 入口参数 :
** 返回参数 :
** 备注/注意 :
** QQ : 1240612852
***********************************************************************/
void PRINTF(char *format, ...)
{
if(inHandlerMode() != 0) //如果在中断中
{
taskDISABLE_INTERRUPTS(); //关闭中断
}
else //如果不在中断中在任务中
{
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX) //如果发现调试串口被其他任务占用,则当前任务切出
{
osThreadYield();
}
}
va_list ap; //定义一个指针
va_start(ap, format); //将第一个变参的地址赋值给ap指针
memset(printf_buff,0x00,strlen(printf_buff));
if(vsprintf(printf_buff, format, ap) > 0)
{
//串口调用
HAL_UART_Transmit(&huart1,(uint8_t*)printf_buff ,strlen(printf_buff),0x05);
}
va_end(ap);
//if(inHandlerMode() != 0) //打印完调试信息之后还在中断中,则开启中断触发
//{
taskENABLE_INTERRUPTS();
//}
}[/mw_shl_code] |
|