我已经读过很多次了,通常最好的做法是尽量减少在计时器中断中花费的时间,并且建议只升起国旗的建议出现了好几次。
我使用计时器运行一些代码(将传感器数据转换为可用数据)。在我的应用程序中,以相当高的速度(8 8KHz)读取和操作这些数据是很重要的。
下面是我如何处理这个问题的方法:
中启动。
中启动。
{ 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 */ }
然后,这两个线程中的每一个都对标志进行了简单的测试,下面是第二个线程的外观:
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个美国时期要短得多。
这对我来说是有意义的,但我有一种感觉,它会严重崩溃。
我该怎么办?
干杯
发布于 2020-07-24 20:09:30
当您使用RTOS时,标志并不是非常好的线程同步方式。
在本例中,使用信号量、互斥或直接任务通知。
略高于辅助线程的优先级
您所显示的不同优先级的RTOS任务不会被调度程序抢占,并且只有当您自己传递控件时才会发生上下文切换。唯一真正将一直运行的任务是最后一个已启动的任务,因为您的任务没有将控制传递给RTOS,ISR也没有。您的代码实际上不是正确的RTOS代码。
你可以把它放在一个任务里。
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 );
}https://stackoverflow.com/questions/63080344
复制相似问题