一、RTOS:Real time operating system,中文意思为 实时操作系统,它是一类操作系统,比如uc/OS、FreeRTOS、RTX、RT-Thread 这些都是实时操作系统。
二、移植FreeRTOS到STM32F103C8T6上
interface选择CMSIS_V1,RCC选择Crystal Ceramic Resonator 。


FreeRTOS相关创建部分


三、任务的创建与删除相关函数,FreeRTOS任务的状态

五、任务小实验


LED1和LED2引脚设置成Ooutput,KEY1和KEY2引脚设置成Input

LED1和LED2功能实现代码:
cpp
void StartTaskLED1(void const * argument)
{
for(;;)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);//HAL_GPIO_TogglePin实现电平反转,PB8控制LED1
osDelay(500);
}
}
void StartTaskLED2(void const * argument)
{
for(;;)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
osDelay(1000);
}
}
KEY1和KEY2功能实现:
cpp
void StartTaskKEY1(void const * argument)
{
for(;;)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)//KEY1为PA0
{
osDelay(20);
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)
{
printf("key1被按下!!!\r\n");// \r为回车符,\n为换行符
if( taskLED1Handle == NULL){
printf("任务1不存在,准备创建任务1\r\n");
osThreadDef(taskLED1, StartTaskLED1, osPriorityNormal, 0, 128);
taskLED1Handle = osThreadCreate(osThread(taskLED1), NULL);
if(taskLED1Handle != NULL)
printf("任务1创建成功\r\n");
}else{
printf("删除任务1\r\n");
osThreadTerminate(taskLED1Handle);
taskLED1Handle = NULL;
}
}
while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET);//设置死循环,防止按键按下后一直执行下去
}
osDelay(1);
}
}
void StartTaskKEY2(void const * argument)
{
static int flag = 0;//设置标志位
for(;;)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET)
{
osDelay(20);
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET)
{
printf("key2被按下!!!\r\n");
if( flag == 0){
osThreadSuspend(taskLED2Handle);
printf("任务2已暂停\r\n");
flag = 1;
}else{
osThreadResume(taskLED2Handle);
printf("任务2已恢复!!!\r\n");
flag = 0;
}
}
while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET);
}
osDelay(1);
}
}