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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版