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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版