UCOS学习笔记(一)操作系统基础知识

1、全局变量只在头文件中定义一次的方法

在ucos_ii.h中有如下代码

#ifdef   OS_GLOBALS
#define  OS_EXT
#else
#define  OS_EXT  extern
#endif



OS_EXT  INT32U            OSCtxSwCtr;
OS_EXT  INT8U             OSCPUUsage;
OS_EXT  INT32U            OSIdleCtrMax;
OS_EXT  INT32U            OSIdleCtrRun;
OS_EXT  BOOLEAN           OSStatRdy;

这里的宏定义意思是:如果在.c文件中有定义“OS_GLOBALS”,那么OS_EXT就编译成空;反之则编译成extern

则如果在.c文件中有出现#define OS_GLOBALS,那么上述的OSCtxSwCtr等变量则被编译成 INT32U  OSCtxSwCtr等,如果.c文件中没有定义“OS_GLOBALS”那么上述的OSCtxSwCtr等变量则被编译成 extern INT32U  OSCtxSwCtr,在这种情况下不产生内存分配,但任何.c文件都可以使用这些全局变量。

2、不可剥夺型内核和可剥夺型内核

不可剥夺(响应时间未知)

   ——每个任务都要运行到完成时才释放CPU的控制权,几乎不需要使用信号量保护共享数据

   ——中断服务可以使一个高优先级的任务由挂起变为就绪,但中断服务后控制权还是回到原来被中断的那个任务

可剥夺(任务系统响应时间是可知的)

   ——最高优先级的任务一旦就绪,总能得到CPU的控制权

   ——中断服务使一个高优先级的任务进入就绪态,当中断完成后,优先级高的那个任务开始运行

3、优先级反转

    优先级低的任务占有资源导致优先级高的任务等待优先级低任务执行的现象

   解决:使用动态优先级表或采用优先级继承

4、处理共享数据,建立互斥条件的方法

   A、关中断(注意时间要尽量短)

   B、测试并置位

      先测试某一全局变量,例如如果是0则允许访问资源,是1则不允许访问,任务在访问资源时将该全局变量置1

   C、禁止,再允许任务切换

      给任务上锁,执行完任务再解锁

      二值信号量

      计数信号量

5、任务间的通讯

全局变量或者中断

6、UCOSII关中断和开中断操作

  两个宏:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()

7、TCB任务控制块分析

typedef struct os_tcb {
    OS_STK        *OSTCBStkPtr;   //指向当前任务栈顶的指针

#if OS_TASK_CREATE_EXT_EN
    void          *OSTCBExtPtr;   //用户定义的任务控制块扩展
    OS_STK        *OSTCBStkBottom; //指向任务栈底的指针
    INT32U         OSTCBStkSize; //栈中可容纳的指针元数目
    INT16U         OSTCBOpt;
    INT16U         OSTCBId;   //任务的识别码
#endif

    struct os_tcb *OSTCBNext;
    struct os_tcb *OSTCBPrev;

#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
    OS_EVENT      *OSTCBEventPtr;  //指向事件控制块的指针
#endif

#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN
    void          *OSTCBMsg;  //指向传给任务的消息的指针
#endif

    INT16U         OSTCBDly; //任务延时
    INT8U          OSTCBStat; //任务的状态字
    INT8U          OSTCBPrio;  //任务优先级
    INT8U          OSTCBX;
    INT8U          OSTCBY;
    INT8U          OSTCBBitX;
    INT8U          OSTCBBitY;  //在建立任务时计算好

#if OS_TASK_DEL_EN
    BOOLEAN        OSTCBDelReq; //用于表示任务是否需要删除
#endif
} OS_TCB;

猜你喜欢

转载自blog.csdn.net/yhl_sophia/article/details/84560804