freeRTOS操作系统,任务中串口打印卡死

项目场景:

项目场景:串口打印数据,有0.1.2串口,分别在1. 2. 3 任务  发现一号串口是打印就卡死


问题描述

项目场景:串口打印数据,有0.1.2串口,分别在1. 2. 3 任务  发现一号串口是打印就卡死

原因分析:

 打印错误,发现是ault

一号串口打印时候,打印数据太多,一号任务堆栈超了,导致一号任务挂


解决方案:

关闭一号任务的串口打印 或者 加大一号任务堆栈

### 实现 FreeRTOS 中的串口打印 为了实现在 FreeRTOS 下的串口打印功能,通常会利用 HAL 库或者标准外设库来初始化 USART 或 UART 接口,并创建一个专门的任务负责处理打印操作。下面是一个基于 STM32 和 HAL 库的例子。 #### 初始化USART模块 首先,在 `main.c` 文件中完成基本的硬件配置: ```c UART_HandleTypeDef huart1; void MX_USART1_UART_Init(void){ huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK){ Error_Handler(); } } ``` 这段代码完成了对 USART1 的初始化工作[^1]。 #### 创建专用任务用于串口打印 接着定义一个新的任务来进行消息队列管理和实际的数据传输: ```c #define PRINT_BUFFER_SIZE 128 char printBuffer[PRINT_BUFFER_SIZE]; osMessageQueueId_t uartTxQueueHandle; static void UartPrintTask(void *argument){ char message[PRINT_BUFFER_SIZE]; while(1){ if(osMessageQueueGet(uartTxQueueHandle, &message, NULL, osWaitForever) == osOK){ HAL_UART_Transmit(&huart1, (uint8_t*)message,strlen(message), HAL_MAX_DELAY); } } } // 在 main 函数里启动此任务 osThreadAttr_t attr; attr.name = "UartPrint"; attr.priority = osPriorityNormal; attr.stack_size = 128 * 4; if (osThreadNew(UartPrintTask, NULL, &attr) != NULL){ // Task creation failed. } ``` 上述代码片段展示了如何建立一个名为 `UartPrintTask` 的新线程,它将持续监听来自其他部分的消息并将这些信息通过串口发出[^2]。 #### 提供全局可用的打印函数接口 最后提供给应用程序调用的一个简单 API 来向上面提到的消息队列提交待发送的信息字符串: ```c int fputc(int ch, FILE *f){ char c = ch; osStatus_t status = osMessageQueuePut(uartTxQueueHandle,&c,0,0); return ((status == osOK || status == osErrorResource)?ch:-1); } void printf(const char* format,...){ va_list args; int n; char buffer[PRINTF_BUFFER_SIZE]; va_start(args,format); n=vsnprintf(buffer,sizeof(buffer)-1,format,args); va_end(args); for(uint8_t i=0;i<n;i++){ osMessageQueuePut(uartTxQueueHandle,(void*)&buffer[i],0,0); } buffer[n]='\n'; osMessageQueuePut(uartTxQueueHandle,(void*)&buffer[n],0,0); } ``` 这里重写了 C 标准库中的 `fputc()` 函数以便能够兼容更高层次的语言特性如 `printf()`. 同时也提供了自定义版本的 `printf()` 方法可以直接被应用层使用[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值