LoginSignup
2
1

More than 1 year has passed since last update.

STM32CubeIDE マルチタスク 小物

Last updated at Posted at 2021-10-01

Special thanks to

確認環境

STM32CubeIDE 1.7.0
NUCLEO-F303K8

やりたかったこと

各タスクで時間を知りたい。

解決方法

osKernelSysTick() を取得する。

サンプル

冒頭のURLの手順で,タスクを2個追加。

/* USER CODE BEGIN Header_StartDefaultTask */
/**
 * @brief  Function implementing the defaultTask thread.
 * @param  argument: Not used
 * @retval None
 */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN 5 */
    /* Infinite loop */
    for (;;) {
        printf("%d:Task 1--\r\n",(int)osKernelSysTick());
        osDelay(1000);
    }
  /* USER CODE END 5 */
}

/* USER CODE BEGIN Header_StartTask02 */
/**
 * @brief Function implementing the myTask02 thread.
 * @param argument: Not used
 * @retval None
 */
/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
    /* Infinite loop */
    for (;;) {
        printf("%d:Task -2- o\r\n",(int)osKernelSysTick());
        // printf("%d:Task -2- x\r\n",(int)xTaskGetTickCount());
        osDelay(2000);
    }
  /* USER CODE END StartTask02 */
}

/* USER CODE BEGIN Header_StartTask03 */
/**
* @brief Function implementing the myTask03 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask03 */
void StartTask03(void const * argument)
{
  /* USER CODE BEGIN StartTask03 */
  /* Infinite loop */
  for(;;)
  {
        printf("%d:Task --3\r\n",(int)osKernelSysTick());
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
        osDelay(800);
  }
  /* USER CODE END StartTask03 */
}

実行結果

2401:Task --3
3000:Task 1--
3201:Task --3
4000:Task 1--
4001:Task --3
4003:Task -2-
4801:Task --3
5000:Task 1--
5601:Task --3
6000:Task 1--
6003:Task -2-
6401:Task --3
7000:Task 1--
7201:Task --3
8000:Task 1--
8001:Task --3
8003:Task -2-
8801:Task --3
9000:Task 1--
9601:Task --3
10000:Task 1--
10003:Task -2-
10401:Task --3
11000:Task 1--
11201:Task --3

追記

最初は StartDefaultTask() がうまく動かなくて悩みました。
コメント欄でもある通り,UART送信を使った printf が重複してフリーズしていたのが原因のようでした。
動作確認では,UART送信にDMAを使って,前回の送信終了を確認してから printf するようにしました。

See also:
https://qiita.com/numeru55/items/fd61922eeec6be62a22a

補足

xTaskGetTickCountじゃないの?

cmsis_os.c 参照 私にもよくわかりません...

#if (defined (osFeature_SysTick)  &&  (osFeature_SysTick != 0))     // System Timer available
/**
* @brief  Get the value of the Kernel SysTick timer
* @param  None
* @retval None
* @note   MUST REMAIN UNCHANGED: \b osKernelSysTick shall be consistent in every CMSIS-RTOS.
*/
uint32_t osKernelSysTick(void)
{
  if (inHandlerMode()) {
    return xTaskGetTickCountFromISR();
  }
  else {
    return xTaskGetTickCount();
  }
}
#endif    // System Timer available
2
1
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1