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;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/75778.html