📄 本人改写的在c8051f124上运行的ucos源码,大家交流一下--电子门.htm
字号:
Copyright 1992-1998, Jean J. Labrosse,
Plantation,
FL<BR>* 版权所有<BR>*<BR>* MCU-51
专用代码<BR>* KEIL
C51大模式编译<BR>*<BR>* 文件名 : OS_CPU_C.C<BR>*
作者 : Jean J. Labrosse<BR>*
改编 : 杨屹 gdtyy@ri.gdt.com.cn
巨龙公司系统集成开发部 2002.09.27<BR>*
改编 : 朱明 joe_zm@163.com
中科佳电子高新科技有限公司开发部
2005.11.10<BR>* (杨工改编了运行于标准8051核的内核,但无法运行在像C8051F124这样<BR>* 的有code
bank的CPU,我做了一点改动)<BR>*********************************************************************************************************<BR>*/<BR>//#pragma SRC<BR>#define OS_CPU_GLOBALS<BR>#i
nclude
"..\Config\includes.h"<BR><BR>/*<BR>*********************************************************************************************************<BR>* 初始化任务堆栈<BR>*<BR>*
描述 :
这个函数被OSTaskCreate()或OSTaskCreateExt()调用,以便初始化新创建任务的堆栈结构。本函数<BR>* 与处理器高度相关。<BR>*<BR>*
参数 :
task 指向任务代码的指针<BR>*<BR>* pdata 当任务第一次执行时将要传入任务的用户数据结构指针<BR>*<BR>* ptos 栈顶指针。ptos指针被默认为用户堆栈入口指针。如果OS_STK_GROWTH被置1,那么,<BR>* ptos指向用户堆栈的最高有效地址。同样地,如果OS_STK_GROWTH清0,ptos将指向<BR>* 用户堆栈的最低有效地址。<BR>*<BR>* opt 指定可以改变OSTaskStkInit()行为的选项。(见uCOS_II.H for
OS_TASK_OPT_???)。<BR>*<BR>*
返回值 :
我修改了原来的程序,使函数总是返回用户堆栈空间的最低有效地址。这样修改提高了TCB换入换出<BR>* 的效率。<BR>*<BR>*
注意 :
任务堆栈结构:<BR>*<BR>* ----------
-<BR>* 用户栈最高地址---->| |
|<BR>* ----------
|<BR>* | ... |
仿真堆栈空间<BR>*---------- ----------
|
每任务一个<BR>*|OSTCBCur| ?C_XBP---->| |
|
KEIL自动处理<BR>*---------- ----------
-<BR>* | |空闲间隔|<BR>* | ----------------------- ---------- ----------<BR>* \---->|OSTCBCur->OSTCBStkPtr| |?C_XBP低| SP---->| |<BR>* ----------------------- ---------- ----------<BR>* | |?C_XBP高| | |<BR>* | ----------
- ----------<BR>* | | |
| | . |<BR>* | ----------
| | . |<BR>* | | |
| | . |<BR>* | ----------
| ----------<BR>* | | . |长度 | |
+1<BR>* | | . |
| ----------<BR>* | | . |
| OSStack---->| |
0<BR>* | ----------
| ----------<BR>* | | |
| OSStkStart---->|
不关心 |
-1 低地址<BR>* | ----------
- ----------<BR>* \------------->| 长度 |
低地址 系统硬件堆栈<BR>* ----------<BR>* 用户堆栈 长度=SP-OSStkStart<BR>*********************************************************************************************************<BR>*/<BR><BR>void
*OSTaskStkInit (void (*task)(void *pd), void
*ppdata, void *ptos, INT16U opt)
reentrant<BR>{ <BR> OS_STK
*stk;<BR><BR> ppdata =
ppdata;<BR> opt =
opt; //opt没被用到,保留此语句防止告警产生 <BR> stk =
(OS_STK
*)ptos; //用户堆栈最低有效地址<BR> *stk++
=
17; //用户堆栈长度<BR> *stk++
= (INT16U)task &
0xFF; //任务地址低8位<BR> *stk++
= (INT16U)task >>
8; //任务地址高8位 <BR><BR> *stk++
=
0x00; //
保存code bank指针<BR> *stk++
=
0x0F; //
保存SFRPAGE<BR><BR> *stk++
=
0x00; //PSW<BR> *stk++
=
0x0A; //ACC<BR> *stk++
=
0x0B; //B<BR> *stk++
=
0x00; //DPL<BR> *stk++
=
0x00; //DPH<BR> *stk++
=
0x00; //R0<BR> *stk++
=
0x01; //R1<BR> *stk++
=
0x02; //R2<BR> *stk++
=
0x03; //R3<BR> *stk++
=
0x04; //R4<BR> *stk++
=
0x05; //R5<BR> *stk++
=
0x06; //R6<BR> *stk++
=
0x07; //R7<BR><BR> //不用保存SP,任务切换时根据用户堆栈长度计算得出。 <BR> *stk++
= (INT16U) (ptos+MaxStkSize) >>
8; //?C_XBP
仿真堆栈指针高8位<BR> *stk++ =
(INT16U) (ptos+MaxStkSize) & 0xFF; //?C_XBP
仿真堆栈指针低8位<BR> <BR> return
((void *)ptos);<BR>}<BR><BR>#if
OS_CPU_HOOKS_EN<BR>/*<BR>*********************************************************************************************************<BR>* 任务创建钩挂函数<BR>*<BR>*
描述 :
任务创建时调用<BR>*<BR>*
参数 :
ptcb是指向将被创建任务的任务控制块的指针。<BR>*<BR>*
注意 : 1)
调用期间中断被禁止<BR>*********************************************************************************************************<BR>*/<BR>void
OSTaskCreateHook (OS_TCB *ptcb)
reentrant<BR>{<BR> ptcb =
ptcb; /*
Prevent compiler
warning */<BR>}<BR><BR><BR>/*<BR>*********************************************************************************************************<BR>* 任务删除钩挂函数<BR>*<BR>*
描述 :
任务删除时调用<BR>*<BR>*
参数  
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -