现在开始仔细分析,整个点灯**是如何实现的。 一、硬件初始化。 在我这里是指对GPIO进行初始化
[csharp] view plain copy
print?
- LED_GPIO_Config(); //LED端口初始化
具体的配置就不多说了。 二、操作系统的初始化
[csharp] view plain copy
print?
接着我们看看这里面具体做了什么:
[csharp] view plain copy
print?
- void OSInit (void)
- {
- OSInitHookBegin(); /* Call port specific initialization code */
- OS_InitMisc(); /* Initialize miscellaneous variables */
- OS_InitRdyList(); /* Initialize the Ready List */
- OS_InitTCBList(); /* Initialize the free list of OS_TCBs */
- OS_InitEventList(); /* Initialize the free list of OS_EVENTs */
- OS_InitTaskIdle(); /* Create the Idle Task */
- OS_InitTaskStat(); /* Create the Statistic Task */
- OSInitHookEnd(); /* Call port specific init. code */
- }
上面是去掉一些宏开关的简化代码:
1、首先是hook函数,下面结合官方文档以及我自己的理解,谈谈这个hook函数 本人理解,对于我们初学者来说hook函数是不需要管的,直接把宏开关关掉,因为操作系统的功能扩充
我们暂时还用不到,而这个hook函数就是实现对操作系统功能的扩充,之所以加上了这个hook函数,就是为了
防止我们直接修改源代码。从而对源代码产生破坏! 也就是说我们可以直接把这两个hook函数注释掉,自己动手试试吧,我试过了! 2、接着是这个 OS_InitMisc(); 看注释就是初始化各种各样的变量。我们可以进去看看,代码如下:
[csharp] view plain copy
print?
- static void OS_InitMisc (void)
- {
- #if OS_TIME_GET_SET_EN > 0
- OSTime = 0L; /* Clear the 32-bit system clock */
- #endif
-
- OSIntNesting = 0; /* Clear the interrupt nesting counter */
- OSLockNesting = 0; /* Clear the scheduling lock counter */
-
- OSTaskCtr = 0; /* Clear the number of tasks */
-
- OSRunning = OS_FALSE; /* Indicate that multitasking not started */
-
- OSCtxSwCtr = 0; /* Clear the context switch counter */
- OSIdleCtr = 0L; /* Clear the 32-bit idle counter */
-
- #if OS_TASK_STAT_EN > 0
- OSIdleCtrRun = 0L;
- OSIdleCtrMax = 0L;
- OSStatRdy = OS_FALSE; /* Statistic task is not ready */
- #endif
- }
从上面的代码中我们可以获得这样的信息:
这几行代码完成的就是对系统定时器初值、中断计数器、当前任务数量等进行清零,没有别的意思了。 3、OS_InitRdyList这个函数看名字意思是初始化就绪态列表 那么就序列表指的就是任务处于三态中的就绪态的任务,关于三态的详细解释可以百度一下! 那么还是一样跟踪进去看看代码里面到底做了些什么、
[csharp] view plain copy
print?
- static void OS_InitRdyList (void)
- {
- INT8U i;
- #if OS_LOWEST_PRIO <= 63
- INT8U *prdytbl;
- #else
- INT16U *prdytbl;
- #endif
-
-
- OSRdyGrp = 0; /* Clear the ready list */
- prdytbl = &OSRdyTbl[0];
- for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
- *prdytbl++ = 0;
- }
-
- OSPrioCur = 0;
- OSPrioHighRdy = 0;
-
- OSTCBHighRdy = (OS_TCB *)0;
- OSTCBCur = (OS_TCB *)0;
- }
还是一样从代码来看我们能获取的信息如下
将当前任务的优先级、就绪态任务最高优先级,控制块等都清零。 4、接下来看一个比较重要的函数吧OS_InitTCBList
[csharp] view plain copy
print?
- static void OS_InitTCBList (void)
- {
- INT8U i;
- OS_TCB *ptcb1;
- OS_TCB *ptcb2;
-
-
- OS_MemClr((INT8U *)&OSTCBTbl[0], sizeof(OSTCBTbl)); /* Clear all the TCBs */
- OS_MemClr((INT8U *)&OSTCBPrioTbl[0], sizeof(OSTCBPrioTbl)); /* Clear the priority table */
- ptcb1 = &OSTCBTbl[0];
- ptcb2 = &OSTCBTbl[1];
- for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) { /* Init. list of free TCBs */
- ptcb1->OSTCBNext = ptcb2;
- #if OS_TASK_NAME_SIZE > 1
- ptcb1->OSTCBTaskName[0] = '?'; /* Unknown name */
- ptcb1->OSTCBTaskName[1] = OS_ASCII_NUL;
- #endif
- ptcb1++;
- ptcb2++;
- }
- ptcb1->OSTCBNext = (OS_TCB *)0; /* Last OS_TCB */
- #if OS_TASK_NAME_SIZE > 1
- ptcb1->OSTCBTaskName[0] = '?'; /* Unknown name */
- ptcb1->OSTCBTaskName[1] = OS_ASCII_NUL;
- #endif
- OSTCBList = (OS_TCB *)0; /* TCB lists initializations */
- OSTCBFreeList = &OSTCBTbl[0];
- }
这里面的代码涉及到一些比较复杂的数据结构,暂时不详述,找个时间专门研究一下,反正也就是完成了一些链表的初始化之类的工作。
5、OS_InitEventList这个函数也同第4步是类似的 到这里,大概的了解了初始化里面都做了些什么,接下来就是这个
|