硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3760|回复: 6
收起左侧

[FreeRTOS] while等待问题

[复制链接]

20

主题

72

回帖

132

积分

初级会员

积分
132
发表于 2018-8-17 15:05:25 | 显示全部楼层 |阅读模式
看见例程里有这样的写法
        /* 发送一个字节 */
        SPI_I2S_SendData(SPI1, _ucByte);

        /* 等待数据接收完毕 */
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);


我在freertos任务中调用这个函数

1.如果硬件有问题,是否会在这里死等,导致比这个任务优先级低的任务不能再执行?
2.如果会出现死等的情况,应该如何处理这块函数比较好?

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107220
QQ
发表于 2018-8-17 15:29:05 | 显示全部楼层
加个超时计数就行。比如计数1000次停止等待。

如果想等待时间准确些,可以在滴答定时器中断做个32变量计数:

  1. if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF)
  2.       {
  3.         /* Get Start Tick*/
  4.         tickstart = HAL_GetTick();

  5.         /* Wait till HSE is ready */
  6.         while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET)
  7.         {
  8.           if((int32_t) (HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE)
  9.           {
  10.             return HAL_TIMEOUT;
  11.           }
  12.         }
  13.       }
复制代码


回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2018-8-17 17:50:06 | 显示全部楼层
eric2013 发表于 2018-8-17 15:29
加个超时计数就行。比如计数1000次停止等待。

如果想等待时间准确些,可以在滴答定时器中断做个32变量计 ...

这种方法在发送大量数据时,可能会比while死等的方法速度慢一些,但是应该更稳健,可以防止硬件问题引起的死机,多谢
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
发表于 2018-8-17 20:35:07 | 显示全部楼层
我从不加超时判断,相信MCU没有BUG,如果死在while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);这块儿了,说明硬件或者软件系统出了问题,即使超时退出了,产品运行也是出了问题
回复

使用道具 举报

0

主题

3

回帖

22

积分

新手上路

积分
22
发表于 2018-8-18 23:13:09 | 显示全部楼层
SPI一般用于板子内部通信,一般认为没问题,很多时候就算跳过也无法解决问题的。跳不过去看门狗会进行复位,复位后就可以在初始化函数里进行相关诊断了,多次诊断失败就停止运行把。
回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2018-8-21 11:07:44 | 显示全部楼层
taobaofarmer 发表于 2018-8-17 20:35
我从不加超时判断,相信MCU没有BUG,如果死在while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RE ...

有可能是硬件出了问题,但是不希望因为一个spi的硬件问题就影响其他功能,所以不能死等在这里
回复

使用道具 举报

20

主题

72

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2018-8-21 11:09:39 | 显示全部楼层
笑看人生 发表于 2018-8-18 23:13
SPI一般用于板子内部通信,一般认为没问题,很多时候就算跳过也无法解决问题的。跳不过去看门狗会进行复位 ...

就是不想让整个系统因为一个spi有问题就瘫痪掉了,因为他不是核心,只是用spi和eeprom通信记录一些内容,即使这块有问题了,系统也要正常运行才好
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-22 06:49 , Processed in 0.251983 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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