|
准备学习RTOS,发现有个可以在51运行的small RTOS51。于是就买了陈明计写的书,看了几遍,里面有些问题不懂,请大侠帮忙解答,谢谢了!
Q1:第37页:“如果允许smallRTOS管理(EN_OS_IN_ENTER>0),则OSSched()先判定本身是否由中断调用。若中断嵌套层数OSIntNesting大于0,则OSSched()由中断调用,将不进行任务调度,函数直接返回”,OSSched()不是在任务中实现任务切换的吗,它又怎么会被中断调用呢?
Q2: 第39页:“为了做任务切换OS_TASK_SW(),人为的模仿了一次中断。” 在代码中是如何实现的?
;/*********************************************************************************************************
;** 函数名称: OSIntCtxSw
;** 功能描述: 中断使任务放弃CPU环境保存函数
;** 输 入: OSTaskID
;** 输 出 : 无
;** 全局变量: OSFastSwap
;** 调用模块: 无
;**
;** 作 者: 陈明计
;** 日 期: 2002年2月22日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陈明计
;** 日 期: 2002年12月2日
;**-------------------------------------------------------------------------------------------------------
;** 修 改:
;** 日 期:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
RSEG ?PR?OSIntCtxSw?OS_CPU_A
OSIntCtxSw:
USING 0
;是否是优先级最低任务
MOV A,#OS_MAX_TASKS
XRL A,OSTaskID
JNZ OSIntCtxSw_0
;是则不需要保存所有寄存器
;SP=SP-13-4 ;4:两层函数调用堆栈,13:寄存器数目
MOV A,#(-17)
ADD A,SP
MOV SP,A
;跳转到OSCtxSw,同时通知CPU中断处理完成
MOV A, #LOW OSCtxSw
PUSH ACC
MOV A, #HIGH OSCtxSw
PUSH ACC
RETI
;需要保存所有寄存器
OSIntCtxSw_0:
;SP=SP-4 ;4:两层函数调用堆栈
MOV A,#0FCH
ADD A,SP
MOV SP,A
;设置标志:任务再次恢复运行时需要恢复所有寄存器
MOV DPTR,#OSMapTbl
MOV A,OSTaskID
#if OS_MAX_TASKS < 9
MOVC A,@A+DPTR
CPL A
ANL A,OSFastSwap
MOV OSFastSwap,A
#else
CLR C
SUBB A,#8
JC OSIntCtxSw_1
MOVC A,@A+DPTR
CPL A
ANL A,OSFastSwap
MOV OSFastSwap,A
SJMP OSIntCtxSw_2
OSIntCtxSw_1:
MOV A,OSTaskID
MOVC A,@A+DPTR
CPL A
ANL A,OSFastSwap+1
MOV OSFastSwap+1,A
OSIntCtxSw_2:
#endif
;跳转到堆栈处理,同时通知CPU中断处理完成
MOV A, #LOW C_OSCtxSw
PUSH ACC
MOV A, #HIGH C_OSCtxSw
PUSH ACC
RETI
这里面最后的子程序返回为什么要使用中断返回指令RETI?
Q4:第42页:“在中断服务程序中调用OSIntExit()时将返回地址压入栈,OSIntExit()调用OSIntCtxSw()时候又将返回地址压入栈,这两个地址完全无用”,这两个地址为什么无用?
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|