你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
any012 提问时间:2017-1-17 15:49 /
10ST金币
本帖最后由 any012 于 2017-1-17 15:52 编辑

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

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

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


其他还有什么办法呢?


最佳答案

查看完整内容

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

举报

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

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

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

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

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

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

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

如果用队列来实现的话,队列应该创建为什么类型的?
中山无雪 回答时间:2017-1-17 16:42:36
创建两个任务,一个接收一个发送

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

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

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

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

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

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的线程安全性。
小小超 回答时间:2017-1-18 08:30:46
进来学习一下。。。
海迹天涯 回答时间:2017-1-18 08:37:52
学习了
中山无雪 回答时间: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
如果只是学习的话,使用邮箱就足够了。它占用的资源也很少。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

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()如果邮箱满的话会返回 错误状态的, 所以在你更新数组时可以通过 该状态来作判断的。
都会存在互斥的,不用担心。
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版