ucos源码阅读1——任务1

ucos源码阅读1——任务

  • os_core.c
    • OsInit()
    • 设置中断向量
    • 创建唯一的任务及OSStart()
  • 结语

os_core.c

按照main函数的流程去阅读源码。

OsInit()

ucos源码阅读1——任务1_第1张图片
1、哦,怎么图片这么大,首先是定义了个钩子函数,在os_cpu_c.c由用户实现。
2、InitMisc杂七杂八的初始化,初始化变量是在uCOS_II.H定义或声明的,宏定义的是在os_cfg.h用户配置文件里定义的。
ucos源码阅读1——任务1_第2张图片
补充:全局变量定义前的OS_EXT

//OS_CORE.C
#ifndef  OS_MASTER_FILE
#define  OS_GLOBALS
#include "includes.h"
#endif
//uCOS_II.H
#ifdef   OS_GLOBALS
#define  OS_EXT
#else
#define  OS_EXT  extern
#endif

3、InitRdyList就绪值和就绪表,当前优先级和最高优先级,当前任务TCB指针和最高优先级任务(就绪的吗加上运行的)TCB指针统统清零。
ucos源码阅读1——任务1_第3张图片
4、InitTCBList使任务块链表,任务块指针数组和空闲任务块指针数组统统清零。
ucos源码阅读1——任务1_第4张图片
5、直接蹦到初始化空闲任务和初始化统计任务,就堆栈方向和是否使用扩展的创建任务函数分为四种情况,堆栈首先要声明成全局变量,OS_STK类型数组,OS_STK是堆栈入口宽度,和其他与处理器无关的类型都是在os_cpu.h里typeof的。
ucos源码阅读1——任务1_第5张图片
空闲任务:
ucos源码阅读1——任务1_第6张图片
统计任务以及外加后面的其初始化函数,还没看懂,涉及时钟,不知道怎么确保一秒钟运行一次,OS_TICKS_PER_SEC用户定义的。。。:
ucos源码阅读1——任务1_第7张图片
补充:
1、关中断函数,第三种方法,当前程序状态寄存器的值保存在局部变量里,最后再加载回来,防止本来是中断关闭状态反而最后打开了中断。是用汇编编写的,在os_cpu.h里宏定义的。在调用系统函数前不要关中断。任务至少要调用一个任务挂起函数,让出CPU使用权

//OS_CORE.C
#if OS_CRITICAL_METHOD == 3                     
    OS_CPU_SR  cpu_sr;
#endif
OS_ENTER_CRITICAL();
OS_EXIT_CRITICAL();

2、任务控制块类型定义,目前只能看懂部分
ucos源码阅读1——任务1_第8张图片

设置中断向量

设置中断模式和中断的开禁,不懂。

创建唯一的任务及OSStart()

Init创建了两个函数,在启动前还要创建一个类似于启动程序的一个任务(且唯一,跟统计任务有关,为了让他一秒钟运行一次?),因为OSRunning初始化为false,任务创建并不引起任务调度,类似启动程序的任务里:时钟初始化和启动,其次是初始化统计任务,再者调用创建其他任务系统函数。时钟启动不能早于多任务启动(不懂),也就是OSStart的OSStartHighRdy汇编函数,OSRunning也是在这儿要变成true以及跳到类似于启动程序的任务并且永远不会返回main。
ucos源码阅读1——任务1_第9张图片
ucos源码阅读1——任务1_第10张图片
就绪表中找到最高的优先级,然后把当前优先级和最高优先级(就绪的?),当前任务指针和最高优先级(就绪的?)都置为该任务的。
补充:
1、调度,不在中断嵌套子程序,以及调度器没有上锁才可以切换任务。如果当前任务就是就绪表里的(运行任务一直在就绪表。。。)。反正要准备出最高就绪任务优先级及对应tcb指针,然后调用汇编函数切换。
ucos源码阅读1——任务1_第11张图片
2、调度上锁 启动之后再上锁
ucos源码阅读1——任务1_第12张图片
3、调度解锁 如果不在中断嵌套子程序以及调度器没有上锁,就要进行任务切换。
ucos源码阅读1——任务1_第13张图片

结语

第一次用,乱七八糟的,写来给自己复习用的,争取五天之内把源代码看完。
1、目前任务切换时机,创建任务的时候以及解锁调度器的某一状态下要进行调度。
2、开关中断很晕。
3、还有一些坑要填。

你可能感兴趣的:(ucos源码阅读1——任务1)