ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
12
返回列表 发新帖
打印

[STM32L4] 咨询关于freertos任务间通信问题

[复制链接]
2389|21
跳转到指定楼层
使用HAL库自带的freertos例程里面修改的程序,建立两个任务一个是使用osSignalSet设置信号,另外一个使用osSignalWait等待信号,等任务运行后,发现发送了4000个信号,但是接受却是接收到了3998个信号,丢了2个,大神知道可能是什么导致的吗?
21
 楼主 | 2018-8-17 16:04 | 只看该作者
yediezeus 发表于 2018-8-13 15:19
按扇区写入,如果写不满的地方,不知道用不用填充无效字符。

我使用的是FatFs使用fwrite写都是随意写的也没问题,但是好像具体深究写入函数的实现都是按照扇区写入。比如你要写入1000个字节,前512按照扇区写入,后面的应该是单个写的,好像这样写入的效率相当低,我现在是把数据凑成512的整数倍再写入,这样效率确实会高但是没有具体统计时间。如果不能凑整的建议按照512整个扇区写,等到最后的数据凑齐了一个扇区写入。读取的时候去掉就行了。或者不凑齐反正也能正常写就是效率低。

使用道具

评论回复
20
| 2018-8-13 15:19 | 只看该作者
按扇区写入,如果写不满的地方,不知道用不用填充无效字符。

使用道具

评论回复
19
 楼主 | 2018-8-13 14:32 | 只看该作者
搞定了,谢谢大家的支持,还是人多力量大,从大家的思路中想到了可能是接收通知的任务是写SD卡的任务,考虑到可能写卡没有及时完成导致错过了通知或者导致的数据覆盖。但是查看了下数据,仔细分析了下如果是SD卡写入没有完成,应该有很多数据覆盖啊,就猜测可能是某个时段导致写卡容易出问题,所以修改了下代码,是采集的数据如果不能被一个扇区512字节整除的话,就调整缓存大小是的缓存大小是512的整数倍+尽量小的多余字节。经过修改代码后测试了几次发现没有继续出现数据覆盖的问题。因此怀疑有可能是这个地方的问题,不知道各位对于FatFs是否有很熟悉的,SD卡按照512字节的扇区写入和不按照扇区写入效率差很多吗?

使用道具

评论回复
18
| 2018-8-13 12:57 | 只看该作者
加大发送间隔呢

使用道具

评论回复
17
| 2018-8-13 08:36 | 只看该作者
xinxinyuan 发表于 2018-8-10 22:16
能具体说说返回值调试时怎么个意思吗?我在任务A发送通知的地方加了个计数变量,发送一次就计数加一次, ...

判断返回值是否成功,失败是什么原因
有时你是发了,但是可能会失败的

使用道具

评论回复
16
| 2018-8-12 10:41 | 只看该作者
不清楚,一次我用串口发送,也总是丢失前两个,不知道啥情况,后来莫名其妙好了

使用道具

评论回复
15
| 2018-8-12 09:07 | 只看该作者
信号间通讯是操作系统内部机制,如果连自己的通讯都保证不了,还用什么操作系统,不和裸奔一样么?????

使用道具

评论回复
14
| 2018-8-11 20:20 | 只看该作者
使用计数信号量,把que加大点

使用道具

评论回复
13
| 2018-8-11 19:02 | 只看该作者
说丢了其实也不太合适,就是说任务B执行的不够快,所以导致在某个时间段,任务A调用了osSignalSet多次(后续的set客观上没有效果,因为signal已经设置了),但是任务B只获取到一次signal,最终的结果是任务B得到了signal并执行对应操作。如果任务B能够在这次调度中把任务A多次的signal产生的数据全部都获取,那最终程序也不会有问题。但是如果任务B的延迟导致任务A的数据被覆盖,那就出问题了。

使用道具

评论回复
12
| 2018-8-11 16:22 | 只看该作者
你用哪个版本的HAL,我觉得函数不一样啊

使用道具

评论回复
11
| 2018-8-10 23:54 | 只看该作者
每次都发送成功?没法送成功就重发啊

使用道具

评论回复
10
 楼主 | 2018-8-10 22:20 | 只看该作者
df_flying 发表于 2018-8-10 15:46
两个任务的优先级如何?SD卡读写应该会比较长但次数少,优先级可以高一些。如果数据需要都记录,建议使用qu ...

任务A是读取数据,是要求硬实时的,就是来了数据必须读取否则就会漏数据,数据要求都记录。所以任务A设置的是osPriorityRealtime,实时优先级,优先级最高。任务B是读取的数据写入到SD卡上,这个任务是高优先级osPriorityHigh,仅次于实时优先级(我使用的是HAL自带的Freertos,就是CMSIS-RTOS对freertos的封装。)

使用道具

评论回复
9
 楼主 | 2018-8-10 22:16 | 只看该作者
ayb_ice 发表于 2018-8-10 16:12
通过返回值来调试

能具体说说返回值调试时怎么个意思吗?我在任务A发送通知的地方加了个计数变量,发送一次就计数加一次,在任务B接收通知的地方加了个计数变量,接收到通知计数加一,任务接收后统计两个计数值发现发送计数是4000,接收计数是3998.

使用道具

评论回复
8
| 2018-8-10 16:12 | 只看该作者
通过返回值来调试

使用道具

评论回复
7
| 2018-8-10 15:46 | 只看该作者
两个任务的优先级如何?SD卡读写应该会比较长但次数少,优先级可以高一些。如果数据需要都记录,建议使用queue,这样应该不会出现丢记录了

使用道具

评论回复
6
 楼主 | 2018-8-10 13:10 | 只看该作者
事情是这样的,是同一个芯片上运行的两个任务,任务A是从SPI读取数据,放到数组中,每隔18ms读取一次,累计读取完成12次后发送信号给任务B,任务B收到信号后负责吧数据写入SD卡,完后就完了,依次执行4000次,发现接收到的信号只有3998次。没有信号重发机制,请问信号重发机制怎么实现?有介绍吗?

使用道具

评论回复
5
| 2018-8-10 12:57 | 只看该作者
是否堵塞了

使用道具

评论回复
地板
| 2018-8-10 12:55 | 只看该作者
中间有没有延时啥的等待机制或者重发机制

使用道具

评论回复
板凳
| 2018-8-10 12:51 | 只看该作者
同一片芯片同时做接收和发送?

使用道具

评论回复
沙发
| 2018-8-10 12:50 | 只看该作者
处理的线程过长?

使用道具

评论回复
扫描二维码,随时随地手机跟帖
12
返回列表 发新帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

快速回复 返回顶部 返回列表