一、实验目的
编写简单的RTOS代码,测试RTOS移植是否成功,同时学习RTOS中任务的创建与删除。
二、实验设计
本次实验创建三个任务,start_task,led0_task,led1_task,分别作为启动任务,LED0以1s间隔闪烁、LED1以2s间隔闪烁。
三、实验代码
#include "FreeRTOS.h"
#include "task.h"
#define START_TASK_PRIO 1 //定义开始任务优先级
#define START_TASK_STACK_SIZE 128 //定义开始任务堆栈大小
TaskHandle_t StartTask_Handler; //定义开始任务句柄
void start_task(void *pvParameters); //声明开始任务函数
#define LED0_TASK_PRIO 2
#define LED0_TASK_STACK_SIZE 50
TaskHandle_t Led0Task_Handler;
void led0_task (void *pvParameters);
#define LED1_TASK_PRIO 3
#define LED1_TASK_STACK_SIZE 50
TaskHandle_t Led1Task_Handler;
void led1_task (void *pvParameters);
int main(void)
{
xTaskCreate(
(TaskFunction_t)start_task,
(const char * )"start_task",
(uint16_t )START_TASK_STACK_SIZE,
(void * )NULL,
(UBaseType_t )START_TASK_PRIO,
(TaskHandle_t *)&StartTask_Handler
); //创建开始任务
vTaskStartScheduler(); //开启任务调度
}
void start_task (void *pvParameters)
{
taskENTER_CRITICAL();//进入临界区(在临界区内中断会被屏蔽,防止打断临界区任务)
xTaskCreate(
(TaskFunction_t)led0_task,
(const char * )"led0_task",
(uint16_t )LED0_TASK_STACK_SIZE,
(void * )NULL,
(UBaseType_t )LED0_TASK_PRIO,
(TaskHandle_t *)&Led0Task_Handler
);
xTaskCreate(
(TaskFunction_t)led1_task,
(const char * )"led1_task",
(uint16_t )LED1_TASK_STACK_SIZE,
(void * )NULL,
(UBaseType_t )LED1_TASK_PRIO,
(TaskHandle_t *)&Led1Task_Handler
);
vTaskDelete(StartTask_Handler);//删除开始任务
taskEXIT_CRITICAL();
}
void led0_task(void *pvParameters)
{
while(1)
{
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
vTaskDelay(2000);
}
}
void led1_task(void *pvParameters)
{
while(1)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
vTaskDelay(1000);
}
}
四、实验现象
若RTOS移植没有问题,则可观察LED0以1s间隔闪烁,LED1以2s间隔闪烁。