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

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

[复制链接]
any012 提问时间:2017-1-19 16:25 /
悬赏10ST金币已解决
初学freertos。用的cube生成的freertos工程,单片机型号位stm32f103vbt6。

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

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

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

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

QQ图片20170119162440.png


最佳答案

查看完整内容

个人认为,数据接收任务不需要延时函数,有个消息邮箱就行,有消息就接收,没消息就等待
收藏 1 评论14 发布时间:2017-1-19 16:25

举报

14个回答
黑皮男 回答时间:2017-1-19 16:25:10
个人认为,数据接收任务不需要延时函数,有个消息邮箱就行,有消息就接收,没消息就等待

点评

正解。  发表于 2017-1-20 12:58
这种看法是对的  发表于 2017-1-19 21:27

评分

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

查看全部评分

奏奏奏 回答时间:2017-1-19 16:39:01
建议改用消息队列,只要将队列数改为1实质上就是邮箱了

评分

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

查看全部评分

any012 回答时间:2017-1-19 16:40:55
我的问题找到了。
任务延时设的时间太长了。
QQ图片20170119164006.png
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后,需要在回调函数中 置完成标志的。

评分

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

查看全部评分

watershade 回答时间:2017-1-19 21:32:47
我的做法类似楼上你的osDelay具体是为什么。你既然用idle中断,那么你是如何将数据传送到邮箱的。

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

评分

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

查看全部评分

队长shiwo 回答时间:2017-1-20 12:45:45
来学习学习
路鸣雨 回答时间:2017-1-20 13:18:41
背景挺赞啊~
帅的像头牛 回答时间:2017-1-20 14:35:50
楼主用的什么开发环境
any012 回答时间:2017-1-20 14:53:17
用的MDK5,就是用的你楼上的朋友分享的配色方案。

CUBE支持生成ECLISPE+AC6的工程了,那个配色可以修改的更好看,但对ECLIPSE不熟悉,不知道该如何用STLINK调试,现在暂时放弃了。
any012 回答时间:2017-1-20 16:29:43
本帖最后由 any012 于 2017-1-20 16:35 编辑
watershade 发表于 2017-1-19 21:32
我的做法类似楼上你的osDelay具体是为什么。你既然用idle中断,那么你是如何将数据传送到邮箱的。

我的做 ...

我现在是中断接收数据后放到数组里,数组的第一位放数据的长度。
然后通过消息邮箱发送给任务。
任务通过消息邮箱后,先读出长度,然后依此复制过来存放到任务的数组里。再调用发送函数。

现在担心复制的过程中,中断又收到新的数据将原数组更新。

我还不懂内存池,现在中断接收存放在了个全局变量里。

  1. /* usart1Task function */
  2. void usart1Task(void const * argument)
  3. {

  4.         /* USER CODE BEGIN usart1Task */
  5.         uint8_t uart1TxBuff[TXBUFFLEN];
  6.         uint8_t *pMail;
  7.         osEvent event;
  8.         uint8_t i;
  9.         uint8_t txLength;

  10.         /* Infinite loop */
  11.         for(;;)
  12.         {
  13.                 event = osMailGet(mailQ01Handle, 0x00);
  14.                 if(event.status == osEventMail)
  15.                 {
  16.                         pMail =  event.value.p;
  17.                         txLength = *(pMail++);
  18.                         for(i = 0; i < txLength; i++)
  19.                                 uart1TxBuff[i] = *(pMail++);
  20.                         HAL_UART_Transmit_DMA(&huart1,uart1TxBuff,txLength);
  21.                         HAL_UART_Receive_DMA(&huart1, uart1RxBuff+1, RXBUFFLEN-1);
  22.                 }
  23.                
  24. //                osDelay(100);
  25.         }
  26.         /* USER CODE END usart1Task */
  27. }
复制代码
zbber 回答时间:2017-1-20 23:30:38
我的问题找到了

所属标签

相似问题

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