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

HAL库的超时机制

[复制链接]
小虾丁 提问时间:2017-5-12 09:04 /

HAL库的超时机制,好像都是采用循环判断的方式(如下面代码中的红色部分),这对于低功耗控制和程序的时序控制太不利了,如果超时比较长,
且该段代码在高优先级的任务中执行,则低优先级的任务在这段超时时间内也无法得到执行。此外,超时单位是1ms一个tick(默认用SYSTICK定时器产生),这个可以修改吗?

static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
{
  /* Wait until flag is set */
while((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status)
  {
    /* Check for the Timeout */
    if(Timeout != HAL_MAX_DELAY)
    {
      if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
      {
        /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
        CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
        CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

        huart->gState  = HAL_UART_STATE_READY;
        huart->RxState = HAL_UART_STATE_READY;

        /* Process Unlocked */
        __HAL_UNLOCK(huart);

        return HAL_TIMEOUT;
      }
    }
  }

  return HAL_OK;
}

收藏 1 评论8 发布时间:2017-5-12 09:04

举报

8个回答
回答时间:2017-5-12 09:08:12
楼主想改到什么级别?理论是可以改掉的,ms级别我感觉已经满足需求了吧。
MrJiu 回答时间:2017-5-12 09:21:13
本帖最后由 MrJiu 于 2017-5-12 09:22 编辑

超时的时间自己可以控制的啊,不是在调用函数的时候,有一个超时参数的调入么???还有,这个超时指的是你允许这段代码执行最大时间。。。。如果有高优先级的打断了,你就把这个超时参数设置大一点呗!!!!这就是一个估计值!!!这个和低功耗啥的没啥关系吧???
zoomdy 回答时间:2017-5-12 15:53:23
要做低功耗,最好用LL库,而不是HAL库。
zoomdy 回答时间:2017-5-12 15:54:19
再说了,你可以优化它的,HAL只是最通用的代码,绝对不是最优化的代码。
小虾丁 回答时间:2017-5-12 15:55:20
MrJiu 发表于 2017-5-12 09:21
超时的时间自己可以控制的啊,不是在调用函数的时候,有一个超时参数的调入么???还有,这个超时指的是你 ...

怎么和功耗没关系呢?这段时间内,CPU就在空转呀,本来可以进入低功耗模式的,但现在要等超时时间到。超时时间是自己可以控制,但有些地方本来就要求有足够长的超时时间,不能随随便便改短啊。
MrJiu 回答时间:2017-5-12 16:14:35
小虾丁 发表于 2017-5-12 15:55
怎么和功耗没关系呢?这段时间内,CPU就在空转呀,本来可以进入低功耗模式的,但现在要等超时时间到。超 ...

超时哪有等待??你把超时搞错了吧???超时指的的是:比如你设定10ms,但是由于一些原因,超过了10ms,就会打断,直接跳出来,但是如果设定完了,那就直接退出,又不会说非要等待到10ms,这个过程CPU哪里空转了!!!!
小虾丁 回答时间:2017-5-15 16:13:39
MrJiu 发表于 2017-5-12 16:14
超时哪有等待??你把超时搞错了吧???超时指的的是:比如你设定10ms,但是由于一些原因,超过了10ms, ...

我贴出的代码的那个while(1)循环就是CPU在空转啊,如果它是在高优先级的任务中执行,这段时间内低优先级任务是无法得到执行的。
MrJiu 回答时间:2017-5-15 17:43:34
小虾丁 发表于 2017-5-15 16:13
我贴出的代码的那个while(1)循环就是CPU在空转啊,如果它是在高优先级的任务中执行,这段时间内低优先级 ...

你这里的while(1)判断的是状态,和超时一点关系都没有,if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))这个才是判断超时的!!!!状态采用的查询方式,肯定要等寄存器的状态执行完了才能结束!!!

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版