一、创建单任务

任务使用的栈和任务控制块都是静态内存,存储在SRAM中。

static void LED_task(void *parameter)
{
       while(1);
       vTaskDelay(20);
}

任务必须是一个死循环

任务必须是死循环while(1);否则任务将通过LR返回,如果LR指向了非法的内存就会产生HardFault_Handler,而FreeRTOS指向一个死循环,那么任务返回之后就在死循环中执行,这样子的任务是不安全的,所以避免这种情况,任务一般都是死循环并且无返回值的

VTaskDelay()函数

任务里面的延时函数必须使用FreeRTOS里面提供的延时函数,并不能使用我们裸机编程中的那种延时。这两种的延时的区别是FreeRTOS里面的延时是阻塞延时,即调用vTaskDelay()函数的时候,当前任务会被挂起,调度器会切换到其他就绪的任务,从而实现多任务 。如果还是使用裸机编程中的那种延时,那么整个任务就成为了一个死循环,如果恰好该任务的优先级是最高的,那么系统永远都是在这个任务中运行,比它优先级更低的任务无法运行,根本无法实现多任务。

二、定义任务栈

任务函数、名称、栈深度、参数、优先级初始化

vTaskStartScheduler(); / 启动任务,开启调度 /

三、定义任务控制块指针

任务句柄是一个指针,用于指向一个任务,当任务创建好之后,它就具有了一个任务句柄
以后我们要想操作这个任务都需要通过这个任务句柄,如果是自身的任务操作自己,那么
这个句柄可以为NULL。*


YingLi
6 声望4 粉丝

From zero to hero.