首先执行CPU_IntDis()函数关闭总中断。此函数在cpu_a.asm文件中声明。
接下来执行OSInit(&err)函数,此函数会初始化uCOSIII的内部变量和数据结构,并会创建2~5个系统任务。至少会创建2个任务,空闲任务和时钟节拍任务,空闲任务优先级最低,时钟节拍任务设置一个相对较高的优先级,比用户系统中最重要的优先级略低一点。可选的任务有中断服务管理任务,优先级永远为最高的0,定时任务,默认优先级11,统计任务默认优先级11。
下面分析OSTaskCreat()函数
1、第一个参数p_tcb传入的为要创建的任务的任务控制块(OS_TCB结构体变量)的地址,首先判断地址不能为0,如果使能了中断管理任务,则优先级不能为0,另外优先级不能为最低(空闲任务最低),通过OS_TaskInitTCB(p_tcb)对此结构体进行初始化,大部分都初始化为0。然后将此函数传入的一些参数赋值到任务控制块的对应变量,在就绪表中插入此任务的优先级。
2、第二个参数p_name为指向任务名字char型变量的指针,这个指针变量保存到了TCB。
3、第三个参数p_task为函数指针变量,OS_TASK_PTR的类型定义为
通过调用OSTaskStkInit()函数完成对此任务的堆栈区的初始化。
这里将任务的堆栈初始化为和被中断后的状态一样,上半部分模拟产生异常时自动压栈的过程,下半部分模拟R4~11是进入异常后压栈的,保存了现场。
4、第四个参数为任务函数的参数指针。
5、第五个参数为此任务的优先级。
6、第六个参数为此任务堆栈的基地址指针。
7、第7个参数为栈空间的剩余量限制值,一般为栈空间的10%。
8、第8个参数为栈空间的数据(CPU_STK)个数。
9、第9个参数为
10、第10个参数为
11、第11个参数为
12、第12个参数为可选项,当把这个参数设置为OS_OPT_TASK
在OS未运行时,创建任务的函数直接return返回。
至此,OSStart(&err);之前已经创建了几个任务。