文章目录
1、使用FreeRTOS进行多任务创建的时候一般有如下两种风格
(1)先创建好所有的任务,最后启动调度器开始多任务的调度
int main (void)
{
/* 硬件初始化 */
HardWare_Init();
/* RTOS 系统初始化 */
RTOS_Init();
taskENTER_CRITICAL(); //进入临界区
/* 创建任务 1,但任务 1 不会执行,因为调度器还没有开启 */
RTOS_TaskCreate(Task1);
/* 创建任务 2,但任务 2 不会执行,因为调度器还没有开启 */
RTOS_TaskCreate(Task2);
/* ......继续创建各种任务 */
taskEXIT_CRITICAL(); //退出临界区
/* 启动 RTOS,开始调度 */
RTOS_Start();
}
void Task1( void *arg )
{
while (1){
/* 任务实体,必须有阻塞的情况出现 */
}
}
void Task1( void *arg )
{
while (1){
/* 任务实体,必须有阻塞的情况出现 */
}
}
(2)先创建一个启动任务后立马开启调度器,然后在启动任务里面创建各种应用,最后启动任务把自己删除
int main (void)
{
/* 硬件初始化 */
HardWare_Init();
/* RTOS 系统初始化 */
RTOS_Init();
/* 创建一个任务 */
RTOS_TaskCreate(AppTaskCreate);
/* 启动 RTOS,开始调度 */
RTOS_Start();
}
/* 起始任务,在里面创建任务 */
void AppTaskCreate( void *arg )
{
/* 创建任务 1,然后执行 */
RTOS_TaskCreate(Task1);
taskENTER_CRITICAL(); //进入临界区
/* 当任务 1 阻塞时,继续创建任务 2,然后执行 */
RTOS_TaskCreate(Task2);
/* ......继续创建各种任务 */
/* 当任务创建完成,删除起始任务 */
RTOS_TaskDelete(AppTaskCreate);
taskEXIT_CRITICAL(); //退出临界区
}
void Task1( void *arg )
{
while (1){
/* 任务实体,必须有阻塞的情况出现 */
}
}
void Task2( void *arg )
{
while (1){
/* 任务实体,必须有阻塞的情况出现 */
}
}
2、FreeRTOS的启动流程
(1)使用 xTaskCreate() 函数创建任务
为初始化内存的时候一旦调用创建任务 xTaskCreate()函数,FreeRTOS会自动进行内存的初始化。
(2)使用vTaskStartScheduler()函数开启调度
创建完任务后,我们需要开启调度器。
创建仅仅是把任务添加到系统中,还没真正调度,并且空闲任务也没实现,定时器任务也没实现,这些都是在开启调度函数vTaskStartScheduler()中实现的。
空闲任务不可以被挂起与删除,且其优先级必须是最低的。
空闲任务的优先级与堆栈大小都在 FreeRTOSConfig.h 中由用户定义。