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