在RTOS中,常用的启动方式有两种:
1、在 main 函数中将硬件初始化,RTOS 系统初始化,所有任务的创建这些都弄好,这个我称之为万事都已经准备好。最后 启动 RTOS 的调度器,开始多任务的调度。伪代码如下:
int main (void)
{
/* 硬件初始化 */
HardWare_Init();
/* RTOS 系统初始化 */
RTOS_Init();
/* 创建任务 1,但任务 1 不会执行,因为调度器还没有开启 */
RTOS_TaskCreate(Task1);
/* 创建任务 2,但任务 2 不会执行,因为调度器还没有开启 */
RTOS_TaskCreate(Task2);
/* ......继续创建各种任务 */
/* 启动 RTOS,开始调度 */
RTOS_Start();
}
void Task1( void *arg )
{
while (1)
{
/* 任务实体,必须有阻塞的情况出现 */
}
}
void Task2( void *arg )
{
while (1)
{
/* 任务实体,必须有阻塞的情况出现 */
}
}
2、在 main 函数中将硬件和 RTOS 系统先初始化好,然后创建一个启动任务后就启动调度器,然后在启动任务里面创建各种应用任务,当所有任务都创建成功后,启动任务把自己删除。
int main (void)
{
/* 硬件初始化 */
HardWare_Init();
/* RTOS 系统初始化 */
RTOS_Init();
/* 创建一个任务 */
RTOS_TaskCreate(AppTaskCreate);
/* 启动 RTOS,开始调度 */
RTOS_Start();
}
/* 起始任务,在里面创建任务 */
void AppTaskCreate( void *arg )
{
/* 创建任务 1,然后执行 */
RTOS_TaskCreate(Task1);
/* 当任务 1 阻塞时,继续创建任务 2,然后执行 */
RTOS_TaskCreate(Task2);
/* ......继续创建各种任务 */
/* 当任务创建完成,删除起始任务 */
RTOS_TaskDelete(AppTaskCreate);
}
void Task1( void *arg )
{
while (1)
{
/* 任务实体,必须有阻塞的情况出现 */
}
}
void Task2( void *arg )
{
while (1)
{
/* 任务实体,必须有阻塞的情况出现 */
}
}
启动流程:我们知道,在系统上电的时候第一个执行的是启动文件里面由汇编编写的复位函数
Reset_Handler。复位函数的最后会调用 C 库函数__main。__main 函数的主要工作是初始化系统的堆和栈,最后调用 C 中的 main 函数,从而去到 C 的世界。(具体详细解释可以参考《FreeRTOS 内核实现与应用开发实战指南》)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)