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;