any012 发表于 2017-1-17 15:49:37

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

本帖最后由 any012 于 2017-1-17 15:52 编辑

正在学freertos。串口中断接收一帧数据后,放到数组里,如何将数据发送给任务呢?

如果用消息队列,是否建立的消息队列需要是数组类型的?还是说消息列表建立成uint8类型的,列表长度设为接收数据最大长度?

如果用二值信号量,是不是就等于是中断程序接收完后发送信号量通知任务处理数组?这样的话,在任务处理过程中,串口又接收到新的数据怎么办?


其他还有什么办法呢?


黑皮男 发表于 2017-1-17 15:49:38

可以使用消息队列,发送的是内存的地址就行,其实楼主可以考虑这种情况,就是做一个fifo,中断只管接收数据放到fifo中,再建立一个任务用来读取fifo中的数据,再把读取的数据分配给其他任务,这样就可以保证线程的安全性,尽量保证这个读取fifo数据任务的优先级要高,才能在退出中断时立即处理数据

斜阳__ 发表于 2017-1-17 16:03:51

邮箱,队列,共享存储区都可以;甚至自己搞个全局变量存储也行,但是要保证多线程安全

any012 发表于 2017-1-17 16:07:04

斜阳__ 发表于 2017-1-17 16:03
邮箱,队列,共享存储区都可以;甚至自己搞个全局变量存储也行,但是要保证多线程安全 ...

现在只看到了消息队列和信号量。
邮箱和共享存储区,还没看到呢。

全局变量存储的话,是否就是用信号量来通知任务?

如果用队列来实现的话,队列应该创建为什么类型的?

中山无雪 发表于 2017-1-17 16:42:36

创建两个任务,一个接收一个发送

创建一个全局变量或消息队列

使用队列在接收方采用阻塞接收,使用全局变量可以选用信号量同步

zhangxu56726 发表于 2017-1-17 16:45:18

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

any012 发表于 2017-1-17 17:00:52

中山无雪 发表于 2017-1-17 16:42
创建两个任务,一个接收一个发送

创建一个全局变量或消息队列


接收用的中断方式,没法放在任务里吧?
使用信号量的话,我担心任务还没处理完数据,又有新的串口中断来改变数据了。
队列的话,不知道队列应该是什么类型的?

any012 发表于 2017-1-17 17:02:24

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

不懂malloc申请内存,搜索了下,貌似是动态内存分配。
以后有空再学习下。

黑皮男 发表于 2017-1-17 19:09:04

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

我当时玩FreeRTOS时就有这个想法,但是FreeRTOS的malloc不可以在中断中使用,如果在中断中使用malloc要保证malloc的线程安全性。

ts2000 发表于 2017-1-18 08:30:46

进来学习一下。。。
页: [1] 2 3
查看完整版本: freertos,串口接收数据后如何发送给任务?