海迹天涯 发表于 2017-1-18 08:37:52

学习了:lol

中山无雪 发表于 2017-1-18 11:30:06

any012 发表于 2017-1-17 17:00
接收用的中断方式,没法放在任务里吧?
使用信号量的话,我担心任务还没处理完数据,又有新的串口中断来 ...

全局变量确实存在可能覆盖的问题,解决的方法是接收端口选的速率低一点,发送端口选的速率高一些,这样就基本可以避免覆盖的问题了。

再就是可以自己定义一个循环数组(其实也就是一个队列了),使用信号量进行控制,还需要加上Mutex。

第三种就是选用队列了,队列的类型可以是uint8_t,也可以是char,其实这两种类型在内部的定义中是一样的,再有RTOS的环境下肯定是优选队列方式,省心!别人做好的系统中已经对数据的存取安全做好了,不需要自己在做控制(其实RTOS对对存取安全的控制也是使用信号量及Mutex控制的,和自己做循环队列的道理一样)。
假若可能存储的数据量很大且变化很大时才选用动态分配内存,假若不是这样寻则静态分配即可,在Freertos中选用heap2.c即可,定义一个静态数组,然后将静态数组和队列绑定就可以了

Dylan疾风闪电 发表于 2017-1-18 12:35:51

如果只是学习的话,使用邮箱就足够了。它占用的资源也很少。

any012 发表于 2017-1-19 12:37:23

Dylan疾风闪电 发表于 2017-1-18 12:35
如果只是学习的话,使用邮箱就足够了。它占用的资源也很少。

刚看了邮箱,有些疑问。
串口接收完一帧数据后保存在一个数组里,邮箱将数组的指针发送给任务。任务通过邮箱获取到这个指针,然后怎么处理这个指针呢?
在任务里再建个数据,通过指针将数据一个一个的复制到这个数组里?这样的话,复制过程中,串口中断更新原数组怎么办?

Dylan疾风闪电 发表于 2017-1-19 19:19:23

any012 发表于 2017-1-19 12:37
刚看了邮箱,有些疑问。
串口接收完一帧数据后保存在一个数组里,邮箱将数组的指针发送给任务。任务通过 ...

OSMboxPost()如果邮箱满的话会返回 错误状态的, 所以在你更新数组时可以通过 该状态来作判断的。
都会存在互斥的,不用担心。

any012 发表于 2017-1-20 08:52:57

Dylan疾风闪电 发表于 2017-1-19 19:19
OSMboxPost()如果邮箱满的话会返回 错误状态的, 所以在你更新数组时可以通过 该状态来作判断的。
都会存 ...

用的freertos,邮箱只能有一个数据吧。
我通过邮箱发送的是指针而不是数组本身。即使邮箱被任务获取了,也不能说明任务已经复制完这个数组吧?

zbber 发表于 2017-1-20 09:18:54

用malloc申请一片内存,保存数据,然后将地址传递给消息队列,在线程里拿到数据后,释放就OK了

木十化 发表于 2018-3-6 17:54:29

zhangxu56726 发表于 2017-1-17 16:45
用malloc申请一片内存,保存数据,然后将地址传递给消息队列,在线程里拿到数据后,释放就OK了 ...

我也是这么干的,但是担心任务中出队的时候会被串口中断打断,在任务出队的时候需要将串口中断关闭吗?
然后任务出队的时候需要中断出队api吗?

zhangxu56726 发表于 2018-3-6 17:56:24

木十化 发表于 2018-3-6 17:54
我也是这么干的,但是担心任务中出队的时候会被串口中断打断,在任务出队的时候需要将串口中断关闭吗?
...

不用,出队列,是先进先出,难道你的队列,就只能存放一个成员?

wdliming-222461 发表于 2019-8-14 14:23:13

中山无雪 发表于 2017-1-18 11:30
全局变量确实存在可能覆盖的问题,解决的方法是接收端口选的速率低一点,发送端口选的速率高一些,这样就 ...

你好,请问一下,用队列的话,我认为在任务中接收数据,那这个任务只能用于接收了,如果添加无限等待的阻塞时间的话,这样一来,这个任务就功能很单一了。
页: 1 [2] 3
查看完整版本: freertos,串口接收数据后如何发送给任务?