Chinaunix首页 | 论坛 | 博客
  • 博客访问: 450032
  • 博文数量: 62
  • 博客积分: 1312
  • 博客等级: 中尉
  • 技术积分: 1555
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 18:10
文章分类

全部博文(62)

文章存档

2014年(1)

2013年(5)

2012年(56)

分类: LINUX

2012-02-24 18:43:40

内核中主要包含以下的文件:
  1.uCOS-II Source->source:(与处理器类型无关的代码)

OS_CORE.C

系统初始化,开启多任务环境等的代码

OS_CPU_C.C

多任务栈初始化等与处理器有关的代码

OS_FLAG .C

事件标志组管理代码

OS_MBOX .C

消息邮箱管理代码

OS_mem.c

内存管理代码

OS_mutex.c

互斥型信号量管理代码

OS_q.c

消息队列管理

OS_sem.c

信号量管理代码

OS_task.c

任务管理代码

OS_time.c

事件管理代码

uCOS_II.C

包含内核的其它C语言源文件

2.uCOS II配置文件(与应用程序有关)

INCLUDES .H

系统的全局头文件,在所有的源码中包含

OS_CFG .H

UCOS系统的全局配置

3.移植uCOS II (与处理器有关的代码)

OS_CPU .h

包含与处理器相关的常量、宏及结构体定义

OS_CPU_C.C

多任务栈初始化等与处理器有关的代码

OS_CPU_A.asm

汇编语言编写的启动任务、任务切换等四个重要函数

一.临界段
处理器处理临界代码都必须先关中断,再处理临界代码,然后再开中断。关中断时间对实时系统的实时响应很重要。所以是实时系统的一个很重要的指标。uCOS使用两个宏(在OS_CPU.h中定义。注:没个CPU都有自己的OS_CPU.h)。这两个宏分别为OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()关闭中断和打开中断。

例:

  1. void function(void)

  2. {

  3.     OS_ENTER_CRITICAL(); //关闭中断

  4.     /*uCOS II 临界代码段*/

  5.     OS_EXIT_CRITICAL(); //打开中断

  6. }

注意:在ODTimeDel()之类的函数调用的时候不能关闭中断,不然应用程序会死机。实现OS_ENTER_CRITICAL()以及OS_EXIT_CROTICAL()的方式有多种。可以参见《嵌入式实时操作系统》(邵贝贝译 第二版)74页内容。方法常见的有三种。
二:任务:

1.任务概述
    通常任务是一个无限循环。函数没有返回值。任务完成以后可以自我删除。(注意:删除不是任务代码删除了,只是这个任务不会再执行了;即使调用了OSTaskDel()这个任务也不会有返回值)。
    uCOS II 可以管理的任务可以达到64个,但是建议不要使用前四个优先级的任务和后四个优先级的任务。
    任务的创建可以使用OSTaskCreat()和OSTaskCreatExt()创建。这两个函数的说明请  点击这里  查看。

2.任务状态
    对于每一个任务来说,任务状态只有一下5个。(处于5个中的某一个)
    a.睡眠态:驻留在ROM或者RAM中,系统还没有管理,只有通过OSTaskCreat()或OSCreatExt()创建之后才能使得系统管理任务。
    b.就绪态:任务一旦建立就进入了就绪态,等待运行。
    c.运行态:当前任务正在执行。
    d.等待态:可以调用OSTimeDel()或者OSTimeDlyHMSM()使得任务进入等待状态。一直等待函数中定义的延时时间到了,这两个函数会强制执行任务转换,让下一个优先级更高的任务进入就绪态的任务运行。
    e.中断服务态:当前正在执行的任务被中断,进入中断服务态,响应中断是改任务被挂起。中断服务子程序占有了CPU的使用权。

当所有的任务都在等待时间的发生。或者等待延时的结束。uCOS II执行被称为空闲的内部任务(即OSTaskIde了())。

三:任务控制块
一旦任务建立了,任务控制块OS­­_TCB将被赋值,任务控制块是一个数据结构,当任务的CPU使用权被剥夺时,μC/OS-Ⅱ用它来保存该任务的状态。当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差地继续执行。OS­­_TCBs全部驻留在RAM中。读者将会注意到笔者在组织这个数据结构时,考虑到了各成员的逻辑分组。任务建立的时候,OS­­_TCBs就被初始化了。

OSTCBStkPtr是指向当前任务栈顶的指针。OSTCBStkPtr是OS_TCB数据结构中唯一的一个能用汇编语言来处置的变量(在任务切换段的代码Context-switching code之中,)把OSTCBStkPtr放在数据结构的最前面,使得从汇编语言中处理这个变量时较为容易。
OSTCBExtPtr 
指向用户定义的任务控制块扩展。用户可以扩展任务控制块而不必修改μC/OS-Ⅱ的源代码
OSTCBStkBottom 
是指向任务栈底的指针。函数OSTaskStkChk() (用于堆栈检验) 要用到变量OSTCBStkBottom,在运行中检验栈空间的使用情况。用户可以用它来确定任务实际需要的栈空间。这个功能只有当用户在任务建立时允许使用OSTaskCreateExt()函数时才能实现。这就要求用户将OS_TASK_CREATE_EXT_EN设为1,以便允许该功能。
OSTCBStkSize 存有栈中可容纳的指针元数目,而不是用字节表示的栈容量总数。
更多参数说明,请参见《嵌入式实时操作系统 2》(邵贝贝译)第82页内容。


四:任务就绪表

    没个就绪的任务都放在任务就绪表中。就绪表中有两个变量,OSRdyGrp和OSRdyTbl[],在OSRdyGrp中任务按照优先级分组,8个任务为一组。OSRdyGrp中的每位表示8组任务中每一组是否有进入就绪态的任务。任务就绪,OSRdyTbl[]中相应元素中的相应位也被置1.OSRdyTbl[]数组有多大取决于OS_LOWSET_PRIO。当应用程序的数目比较少的时候可以降低OS_LOWSET_PRIO,可以降低系统对RAM(数据空间)的需求。

五:任务调度
    uCOS II 总是进入就绪态任务中优先级最高的任务,确定任务的优先级以及哪个任务应该运行,这些工作由任务调度器完成。任务的调度由函数:OSSched()完成。中断级的调用由另一个函数:OSIntExt()完成。


六:任务级的任务切换
    任务调度器决定哪个任务该运行了,然后由IS_TASK_SW()函数做任务切换。被挂起的任务的context(CPU中的寄存器的值被保存再堆栈中)。OS_TASK_SW()是一个宏调用。含有处理器的软中断指令。


七:给调度器上锁和解锁
    给调度器上锁,用OSSchedlock()函数实现,用于禁止任务调度,直到任务完成后调用OSSchedUnlock()函数为止。这两个函数的使用要非常谨慎。因为它会影响系统对任务的正常管理。


八:空闲任务
    在没有其它任务进入就绪态时。这个任务将运行。这个任务的优先级永远都是最低的。空闲任务不能被应用软件删除。 


九:统计任务
    uCOS II中统计运行时间分任务,可以用作CPU使用率的计算。将OS_CFG.h中的OS_TASK_STAT_EN宏定义为1即可使能该任务。用这个函数可以得到应用程序中CPU占了多少时间。在调用OSStart()前的第一个任务中调用系统统计初始化函数OSSTatInit()。


十:uCOS II的中断
    中断服务函数要用汇编语言实现,但是如果使用的编译器支持在线汇编的话,可以把汇编语言直接放在C语言文件中。中断服务函数应该尽可能的短一点。


十一:时钟节拍
    时钟节拍可以是专门的定时器产生的,也可以是一个交流信号源。时钟节拍应该由应用程序的精度决定,时钟节拍越高,系统的额外负荷就越重。必须在OSStart()之后调用时钟节拍器。


十二:系统初始化和系统启动


十三:获得当前系统的版本号

    可以使用OS_Version()函数获得当前使用的系统的版本号。该函数的返回值除100即是系统的版本号。

阅读(5184) | 评论(0) | 转发(1) |
0

上一篇:a new begin

下一篇:多任务系统——中断

给主人留下些什么吧!~~