首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >STM32提姆回调以升旗

STM32提姆回调以升旗
EN

Stack Overflow用户
提问于 2020-07-24 19:31:10
回答 1查看 1.3K关注 0票数 0

我已经读过很多次了,通常最好的做法是尽量减少在计时器中断中花费的时间,并且建议只升起国旗的建议出现了好几次。

我使用计时器运行一些代码(将传感器数据转换为可用数据)。在我的应用程序中,以相当高的速度(8 8KHz)读取和操作这些数据是很重要的。

下面是我如何处理这个问题的方法:

  • I使用STM32 H743

  • I使用带有两个线程的实时操作系统,优先级级别略有不同的

  • 我正在使用两个定时器(TIM2和TIM3),在我的例子中是

  • TIM2被设置为以1 1KHz触发回调,并在主线程(略高于辅助线程的优先级)

中启动。

  • TIM3设置为以8 8KHz触发回调,并在辅助线程

中启动。

  • HAL_TIM_PeriodElapsedCallback用于两个计时器,如下所示:

{ HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { /*用户代码开始回调0 */ /*用户代码结束回调0 */ if (htim->实例== TIM6) { HAL_IncTick();} /*用户代码开始回调1 */如果(htim->实例== TIM2) { TIM3_flag = 1;} if (htim->实例== TIM3) { TIM3_flag = 1;} /*用户代码结束回调1 */ }

然后,这两个线程中的每一个都对标志进行了简单的测试,下面是第二个线程的外观:

代码语言:javascript
复制
void StartSecondaryThread(void *argument)
{
  /* USER CODE BEGIN StartSecondaryThread */
    HAL_TIM_Base_Start_IT(&htim3);
  /* Infinite loop */
  for(;;)
  {
      if (TIM3_flag == 1) {
          runCALC();
          //MORE USER CODE HERE
          TIM3_flag = 0;
      }
  }
  /* USER CODE END StartSecondaryThread */
}

根据CubeMX自动生成的代码,mainThread和secondaryThread无限(;;)循环都有一个osDelay(1)。

这几天我该留着吗?在举旗的if语句之外?

我有一些担心,如果我不这样做,它会崩溃的MCU,因为外面没有做什么,当国旗没有升起。我担心保持osDelay(1)将是“太长”(1ms vs 125 us)。有没有一种方法可以应用较短的延迟,而不会减慢我的8 8KHz轮询?

当然,runCAL()所需的时间要比125个美国时期要短得多。

这对我来说是有意义的,但我有一种感觉,它会严重崩溃。

我该怎么办?

干杯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-24 20:09:30

当您使用RTOS时,标志并不是非常好的线程同步方式。

在本例中,使用信号量、互斥或直接任务通知。

略高于辅助线程的优先级

您所显示的不同优先级的RTOS任务不会被调度程序抢占,并且只有当您自己传递控件时才会发生上下文切换。唯一真正将一直运行的任务是最后一个已启动的任务,因为您的任务没有将控制传递给RTOS,ISR也没有。您的代码实际上不是正确的RTOS代码。

你可以把它放在一个任务里。

代码语言:javascript
复制
void StartSecondaryThread(void *argument)
{
    /* USER CODE BEGIN StartSecondaryThread */
    HAL_TIM_Base_Start_IT(&htim3);
    HAL_TIM_Base_Start_IT(&htim2);
    /* Infinite loop */
    for(;;)
    {
        switch(ulTaskNotifyTake(pdTRUE, portMAX_DELAY))
        {
            case 3:
                runCALC();
                //MORE USER CODE HERE for timer 3
                break;
            case 2:
                //MORE USER CODE HERE for timer 2
                break;
            default:
                //MORE USER CODE HERE for other timers
                break;
        }
    }
    /* USER CODE END StartSecondaryThread */
}


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    BaseType_t xHigherPriorityTaskWoken = pdFalse;
    switch((uint32_t)htim->Instance)
    {
        case (uint32_t)TIM6:
            HAL_IncTick();
            break;
        case (uint32_t)TIM2:
            xTaskNotifyFromISR( xThreadHndl, 2, eSetValueWithOverwrite, &xHigherPriorityTaskWoken );
            break;
        case (uint32_t)TIM3:
            xTaskNotifyFromISR( xThreadHndl, 3, eSetValueWithOverwrite, &xHigherPriorityTaskWoken );
            break;
    }
    portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63080344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档