any012 发表于 2017-1-19 16:25:09

freertos,串口和任务通过邮箱通讯,结果任务反应很慢。

初学freertos。用的cube生成的freertos工程,单片机型号位stm32f103vbt6。

建了三个人物,一个是串口任务,一个是LED每秒翻转一次,一个是空任务。

串口接收用的是DMA+空闲中断,将接收数组的指针,通过邮箱发送给任务。
任务通过邮箱得到接收数组的指针,然后逐个复制到任务里建立的数组,再通过串口发送出去。

现在结果是上位机发送数据大概七八秒后才收到返回来的数据。太慢了。

用stlink调试,断点设在发送邮箱处,很快就能停到断点处。
然后将断点改在接收邮箱处和串口发送处,结果没有在接收邮箱的断点停,而是过了七八秒后停在了串口发送处。




黑皮男 发表于 2017-1-19 16:25:10

个人认为,数据接收任务不需要延时函数,有个消息邮箱就行,有消息就接收,没消息就等待

奏奏奏 发表于 2017-1-19 16:39:01

建议改用消息队列,只要将队列数改为1实质上就是邮箱了:lol

any012 发表于 2017-1-19 16:40:55

我的问题找到了。
任务延时设的时间太长了。

any012 发表于 2017-1-19 17:01:12

奏奏奏 发表于 2017-1-19 16:39
建议改用消息队列,只要将队列数改为1实质上就是邮箱了

额,那么我这里如果改成消息队列的话,需要将队列数改为1吗?如果需要改为1,那和现在的情况有什么区别?

Dylan疾风闪电 发表于 2017-1-19 19:36:05

使用HAL_XXX_DMA后,需要在回调函数中 置完成标志的。:)

watershade 发表于 2017-1-19 21:32:47

我的做法类似楼上你的osDelay具体是为什么。你既然用idle中断,那么你是如何将数据传送到邮箱的。

我的做法是这样的:我用邮箱和内存池结合的方法。邮箱传送的是地址和长度,消息池是储存的数据。然后有消息就等待的线程就工作。

队长shiwo 发表于 2017-1-20 12:45:45

来学习学习

路鸣雨 发表于 2017-1-20 13:18:41

背景挺赞啊~:lol

帅的像头牛 发表于 2017-1-20 14:35:50

楼主用的什么开发环境
页: [1] 2
查看完整版本: freertos,串口和任务通过邮箱通讯,结果任务反应很慢。