OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4810|回复: 2

FreeRTOS多任务串行通讯问题

[复制链接]

7

主题

59

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1159
金钱
1159
注册时间
2018-5-30
在线时间
151 小时
发表于 2020-3-3 17:56:10 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 大个之 于 2020-3-3 17:56 编辑

本人已用库函数完成一个项目,最近有点时间,想把这个项目移植到FreeRTOS上来。
学习了FreeRTOS基础理论,观看视频教学,关于串口通讯的问题还没能解决。
项目中有多个任务要用到串口通讯,我首先移植了一个通讯发送任务,先把要发送的数据组建成数组,再由串口发出,串口发送采用中断方式,写入线路板,发送数据正常。
移植两个通讯任务时,程序就不能正常工作。
从FreeRTOS原理来说,一个任务可以被另一个任务打断,这样就出现了一个问题:由于串口采用中断方式发送,多个任务中发送数据用同一个数组,这样会出现在组合一组发送数据的时候被另一个任务中断,而组合另一组数据,另一组数据发送完了后又接着组合前一组数据,使得发送数据错误。我将两个任务优先级设成同级也不行。
FreeRTOS多任务串行通讯问题如何解决?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

113

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2538
金钱
2538
注册时间
2019-10-18
在线时间
403 小时
发表于 2020-3-3 18:39:28 | 显示全部楼层
本帖最后由 decai 于 2020-3-3 18:45 编辑

发送任务单位为一个任务.由它管理串口的统一发送.其他所有的要使用串口的任务需要发送信息的时候就通过队列把要发送的信息交给发送任务.消息队列先进先出.重要的发送任务可以插队放队首,
你一定要用你的方法那就建立一个互斥信号量来保护这个发送数组,这个数组和串口一样,就是一个资源,任务相互间要争夺,那就要有裁判.
其实就是你还没用操作系统的思想来处理问题
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2020-3-4 08:59:26 | 显示全部楼层
本帖最后由 霸王猫 于 2020-3-4 12:15 编辑

不知道你的2个任务是把同一组数据发送给不同的串口(例如:USART1和USART2)还是发送给同一个串口?

    如果是发送给相同的串口,就应该把这2个任务合并成一个任务。
    如果是发送给不同的串口,就要使用2个任务,使用互斥信号量保护这个公共数组。


   
例如1:发送给同一个串口

   如果需要发送不同类型的报文,创建一个队列,将不同类型的报文装在队列中,需要发送时,出队发送即可。



    例如2:发送给不同的串口
        int8u Buffer[20];//公共数组

        int8u usart1_send_buffer[255];//串口1发送数据
          int8u usart2_send_buffer[255];//串口2发送数据


    void task1()
    {
          while (1)
         {
                获取互斥信号量;
               memcopy(usart1_send_buffer,Buffer,20);//将公共数组中的数据拷贝到usart1_send_buffer
               释放互斥信号量;
               开启发送完成中断;
               发送usart1_send_buffer的第1个字节;//其余字节在中断服务程序中发送
           }
   }

  void task2()
    {
          while (1)
         {
                获取互斥信号量;
               memcopy(usart2_send_buffer,Buffer,20);//将公共数组中的数据拷贝到usart2_send_buffer
               释放互斥信号量;
               开启发送完成中断;
               发送usart2_send_buffer第1个字节;//其余字节在中断服务程序中发送

           }

   }



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 21:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表