freertos,串口接收数据后如何发送给任务

这篇博客分享了作者在使用STM32单片机和FreeRTOS系统中遇到的问题,即如何在串口接收到数据后安全地发送给任务。文章介绍了在中断处理中对全局变量run_flag的正确操作,强调了临界区的概念,并提供了关于全局变量使用的几点建议,包括避免直接操作全局变量,使用局部变量和静态变量等,以提高代码的可维护性和降低模块间耦合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.stmcu.org.cn/module/forum/thread-610230-1-1.html

http://www.stmcu.org.cn/module/forum/thread-616546-1-1.html

这两篇文章挺不错,可以学到rtos与裸机系统的区别。

下面的转载子:https://blog.youkuaiyun.com/leo_liu006/article/details/79334905

本人菜鸟小白一枚,第一次记录自己在学习中遇到的问题,也当是与各位交流交流。

首先是问题的描述:硬件单片机型号,STM32F103VET6,IDE:keil 5。想通过它实现的一个功能是,通过两个按键控制一个RGB灯的闪烁开始和停止。两个按键通过外部中断上升沿检测,贴一下最开始的代码。

  void KEY1_IRQHandler(void)
{
  //确保是否产生了EXTI Line中断
    if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) 
    {        
        run_flag=0x01;
   &

FreeRTOS是一个轻量级实时操作系统,常用于嵌入式系统开发,包括物联网设备等。其中,串口通信是非常常见的功能,它允许设备间通过RS-232、USB或其他串行接口进行数据传输。 在FreeRTOS中,如果你想利用队列来处理串口的数据收发,可以这样做: 1. **创建任务**:首先,你需要为串口接收和发送操作创建两个独立的任务。每个任务负责各自的操作,比如一个任务读取串口输入,另一个任务将数据放入发送队列。 ```c xTaskCreate(ReceiveSerialDataTask, "RxTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); xTaskCreate(SendSerialDataTask, "TxTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); ``` 2. **定义数据结构和队列**:创建一个队列来存储发送的数据。例如,你可以定义一个`struct`来封装待发送的数据: ```c typedef struct { uint8_t data[DATA_BUFFER_LEN]; size_t len; } SerialData; ``` 并使用FreeRTOS提供的`xQueueCreate()`函数初始化队列: ```c xQueueHandle xSendQueue = xQueueCreate(SEND_QUEUE_LENGTH, sizeof(SerialData)); ``` 3. **串口接收**:在`ReceiveSerialDataTask`中,每当有新的串口数据可用时,将其解析后存入内存,并通过`xQueueSend()`将数据放入发送队列。 4. **串口发送**:`SendSerialDataTask`从发送队列中取出数据,然后通过串口发送出去。如果队列为空,则等待数据。 5. **互斥访问**:为了避免并发修改队列导致的数据混乱,需要在读写队列时加上适当的锁。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值