本教程是关于任务的相关的一些操作。这些包括创建任务,在任务之间切换,挂起和恢复任务,终止任务。
其余操作和上一篇都差不多,其设置的界面如下:
- 这是我添加完任务后,生成的代码:
接下来我们重写函数,使用STM32CUBEIDE的ITM作为调试工具来使用,函数部分如下:
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
int _write(int file, char *ptr,int len)
{
int i=0;
for(i=0;i<len;i++)
ITM_SendChar((*ptr++));
return len;
}
/* USER CODE END 0 */
下载程序后的界面如下图所示:
关于任务的优先级如下设定以及其会出现的结果:
代码如下:
void StartDefaultTask(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
printf("StartDefaultTask!!\n\r");
osDelay(1000);
}
/* USER CODE END StartDefaultTask */
}
/* USER CODE BEGIN Header_MyTask01_Init */
/**
* @brief Function implementing the MyTask01 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_MyTask01_Init */
void MyTask01_Init(void const * argument)
{
/* USER CODE BEGIN MyTask01_Init */
/* Infinite loop */
for(;;)
{
printf("MyTask01 a=%d \n\r",a++);
osDelay(2000);
}
/* USER CODE END MyTask01_Init */
}
-
当内核控制时,它将创建2个任务,一个是Default Task,另一个是Task2。
-
现在内核有2个任务要运行,因此它将选择优先级较高的任务,即Task2。将执行printf语句,并且任务将进入阻止模式 2秒钟。此后,内核将立即运行默认任务。再次运行printf语句后,默认任务将进入阻止状态1秒钟。一秒钟没有任何运行。
-
1秒后,默认任务将准备就绪并运行。它将打印,并进入阻塞状态1秒钟。 一秒钟后,默认任务将再次唤醒,任务2也将退出阻止模式,因为距离Task2进入阻止模式已有2秒钟了。内核再次运行2个任务,因此它将运行优先级更高的任务,即Task2首先。
-
此循环将以相同顺序继续。
一下介绍任务暂停和开启的函数:
其函数名为:
void MyTask01_Init(void const * argument)
{
/* USER CODE BEGIN MyTask01_Init */
/* Infinite loop */
for(;;)
{
printf("MyTask01 a=%d \n\r",a++);
osDelay(2000);
if(a == 5)
{
printf("defaultTaskHandle will stop!");
osThreadSuspend(defaultTaskHandle); //任务暂停
}
if(a == 8)
{
printf("defaultTaskHandle will start");
osThreadResume(defaultTaskHandle); //开启任务
}
if(a == 10)
{
printf("Terminating defaultTaskHandle");
osThreadTerminate(defaultTaskHandle); //任务终止
}
if(a == 12)
{
uint32_t PreviousWakeTime = osKernelSysTick();
osDelayUntil(&PreviousWakeTime, 3000); // 将任务延长至指定时间
}
}