UCOS-II移植ARM的读书笔记(12.20)

来源:互联网 发布:c语言统计字符串个数 编辑:程序博客网 时间:2024/05/17 08:10
 
郁闷,昨天写的东西又忘记存起来了。。。今天又要返工
简单回顾一下昨天看的
8 给调度器上锁和开锁
   上锁函数OSSchedlock,调用该函数可以禁止任务调度,保持该任务对CPU的使用权,不过中断还是可以识别,中断服务也能得到,因为中断是开着的,中断和调度是两个意思。其中变量OSLockNesting跟踪OSSchedLock函数被调用的次数所以允许嵌套函数。如果OSLockNesting=0调度重新得到允许。
 
9空闲任务
    UCOS-II中总要建立一个空闲任务,主要是计数,然后有一个用户定义的函数OSTaskIdleHook。
 
10统计任务
   除了空闲任务还有一个统计运行时间的任务OSTaskStat,它告诉用户应用程序使用了多少CPU时间,用百分比表示。
 
11UCOS-II中的中断
   中断服务子程序的编写:保存全部CPU寄存器;调用OSIntEnter或者OSIntNesting直接加1;如果是中断的第一层,立即将堆栈指针保存到这个任务;如果需要重新允许中断,必须清中断源,重新开中断;用户设定;调用脱离中断函数OSIntExit,标志着中断服务子程序的结束。
   OSIntExit是使中断离开的函数,当中断嵌套层数计数器和锁定嵌套计数器都为0才重新开始调度,然后选择一个优先级最高的任务。最后应该调用中断切换函数OSIntCtxSw而不应该调用任务切换函数OS_TASK_SW。因为在中断之前已经把CPU寄存器存入到中断了的任务堆栈中不需要再用。这部分也牵涉到后面的移植部分。
 
12时钟节拍
   在调用OSStart之后应做的第一件事情就是初始化定时器中断。时钟节拍服务是通过在中断服务子程序中调用OSTimeTick实现的。
   时钟节拍中断服务子程序:
OSTickISR(void)
{
   保存CPU寄存器的值
   调用OSIntEnter或是将OSIntNesting加1
   如果OSIntNesting等于1则将当前堆栈指针存入当前任务控制块的堆栈中
   调用OSTimeTick
   清发出中断设备的中断
   重新允许中断
   调用OSIntExit
   恢复处理器寄存器的值
   执行中断返回指令
}
其中OSTimeTick通过OSTimeTickHook函数进行扩展。除此之外最大的任务就是给每个用户任务控制块OS_TCB中的时间延时项OSTCBDly减1
 
13UCOS-II初始化
    OSInit函数
void  OSInit (void)
{
#if OS_VERSION >= 204
    OSInitHookBegin();                                           /* Call port specific initialization code   */
#endif
    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    */
#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
    OS_FlagInit();                                               /* Initialize the event flag structures     */
#endif
#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
    OS_MemInit();                                                /* Initialize the memory manager            */
#endif
#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
    OS_QInit();                                                  /* Initialize the message queue structures  */
#endif
    OS_InitTaskIdle();                                           /* Create the Idle Task                     */
#if OS_TASK_STAT_EN > 0
    OS_InitTaskStat();                                           /* Create the Statistic Task                */
#endif
#if OS_VERSION >= 204
    OSInitHookEnd();                                             /* Call port specific init. code            */
#endif
}
初始化中会建立两个任务,并且初始化5个空的数据结构缓冲区:任务控制缓冲池、事件控制块缓冲池、消息队列缓冲池、标志控制块缓冲池、存储控制块缓冲池,缓冲池的容量在OS_CFG.H中定义
 
14UCOS-II的启动
    OSInit初始化UCOS-II;
    通过调用OSTaskCreate或者OSTaskCreateExt创建至少一个任务;
   OSStart开始多任务调度,永远不会返回;
 
OSStart的主要任务:
   从任务就绪表中找到用户建立的优先级最高任务的任务控制块;
   调用高优先级就绪任务启动函数OSStartHighRdy。OSStartHighRdy函数与选择的微处理器相关,也就是与移植相关,实际上,函数OSStartHighRdy是将任务栈中保存的值弹回到CPU寄存器中,然后执行一条中断返回指令,中断返回指令强制执行该任务代码,该函数永远不会返回到OSStart
 
内核终于裹完了一遍,也明朗了很多,感觉可以开始继续上个星期的移植工作了,恩。。。加油加油