你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
查看完整内容
举报
查看全部评分
斜阳__ 发表于 2017-1-17 16:03 邮箱,队列,共享存储区都可以;甚至自己搞个全局变量存储也行,但是要保证多线程安全 ...
中山无雪 发表于 2017-1-17 16:42 创建两个任务,一个接收一个发送 创建一个全局变量或消息队列
zhangxu56726 发表于 2017-1-17 16:45 用malloc申请一片内存,保存数据,然后将地址传递给消息队列,在线程里拿到数据后,释放就OK了 ...
any012 发表于 2017-1-17 17:00 接收用的中断方式,没法放在任务里吧? 使用信号量的话,我担心任务还没处理完数据,又有新的串口中断来 ...
Dylan疾风闪电 发表于 2017-1-18 12:35 如果只是学习的话,使用邮箱就足够了。它占用的资源也很少。
any012 发表于 2017-1-19 12:37 刚看了邮箱,有些疑问。 串口接收完一帧数据后保存在一个数组里,邮箱将数组的指针发送给任务。任务通过 ...
评分
查看全部评分
评分
查看全部评分
现在只看到了消息队列和信号量。
邮箱和共享存储区,还没看到呢。
全局变量存储的话,是否就是用信号量来通知任务?
如果用队列来实现的话,队列应该创建为什么类型的?
创建一个全局变量或消息队列
使用队列在接收方采用阻塞接收,使用全局变量可以选用信号量同步
评分
查看全部评分
评分
查看全部评分
接收用的中断方式,没法放在任务里吧?
使用信号量的话,我担心任务还没处理完数据,又有新的串口中断来改变数据了。
队列的话,不知道队列应该是什么类型的?
不懂malloc申请内存,搜索了下,貌似是动态内存分配。
以后有空再学习下。
我当时玩FreeRTOS时就有这个想法,但是FreeRTOS的malloc不可以在中断中使用,如果在中断中使用malloc要保证malloc的线程安全性。
全局变量确实存在可能覆盖的问题,解决的方法是接收端口选的速率低一点,发送端口选的速率高一些,这样就基本可以避免覆盖的问题了。
再就是可以自己定义一个循环数组(其实也就是一个队列了),使用信号量进行控制,还需要加上Mutex。
第三种就是选用队列了,队列的类型可以是uint8_t,也可以是char,其实这两种类型在内部的定义中是一样的,再有RTOS的环境下肯定是优选队列方式,省心!别人做好的系统中已经对数据的存取安全做好了,不需要自己在做控制(其实RTOS对对存取安全的控制也是使用信号量及Mutex控制的,和自己做循环队列的道理一样)。
假若可能存储的数据量很大且变化很大时才选用动态分配内存,假若不是这样寻则静态分配即可,在Freertos中选用heap2.c即可,定义一个静态数组,然后将静态数组和队列绑定就可以了
评分
查看全部评分
刚看了邮箱,有些疑问。
串口接收完一帧数据后保存在一个数组里,邮箱将数组的指针发送给任务。任务通过邮箱获取到这个指针,然后怎么处理这个指针呢?
在任务里再建个数据,通过指针将数据一个一个的复制到这个数组里?这样的话,复制过程中,串口中断更新原数组怎么办?
OSMboxPost()如果邮箱满的话会返回 错误状态的, 所以在你更新数组时可以通过 该状态来作判断的。
都会存在互斥的,不用担心。