📄 os_cpu_c.lst
字号:
C51 COMPILER V6.23a OS_CPU_C 01/01/2001 02:30:57 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE OS_CPU_C
OBJECT MODULE PLACED IN .\OS_CPU_C.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\KEILC51\OS_CPU_C.C BROWSE DEBUG OBJECTEXTEND PRINT(.\OS_CPU_C.lst) OBJEC
-T(.\OS_CPU_C.obj)
stmt level source
1 /*********************************************************************************************************
2 ** Small RTOS 51
3 ** The Real-Time Kernel For Keil c51
4 **
5 ** (c) Copyright 2002-2003, chenmingji
6 ** All Rights Reserved
7 **
8 ** V1.12.0
9 **
10 **
11 **--------------文件信息--------------------------------------------------------------------------------
12 **文 件 名: OS_CPU_C.C
13 **创 建 人: 陈明计
14 **最后修改日期: 2003年8月17日
15 **描 述: Small RTOS 51与CPU(既8051系列)相关的C语言代码
16 **
17 **--------------历史版本信息----------------------------------------------------------------------------
18 ** 创建人: 陈明计
19 ** 版 本: V0.50~v1.00
20 ** 日 期: 2002年2月22日~2002年6月20日
21 ** 描 述: 基本完成
22 **
23 **------------------------------------------------------------------------------------------------------
24 ** 修改人: 陈明计
25 ** 版 本: V1.10~V1.12.0
26 ** 日 期: 2002年9月1日~002年12月30日
27 ** 描 述: 完善代码
28 **
29 **------------------------------------------------------------------------------------------------------
30 ** 修改人: 陈明计
31 ** 版 本: V1.20.0
32 ** 日 期: 2003年8月17日
33 ** 描 述: 根据新版本需要增减了函数
34 **
35 **--------------当前版本修订------------------------------------------------------------------------------
36 ** 修改人:
37 ** 日 期:
38 ** 描 述:
39 **
40 **------------------------------------------------------------------------------------------------------
41 ********************************************************************************************************/
42
43 #define IN_OS_CPU_C
44 #include "CONFIG.h"
45
46 extern idata uint8 STACK[1]; /* 堆栈起始位置,在OS_CPU_A定义 */
47 uint8 idata * data OSTsakStackBotton[OS_MAX_TASKS + 2];/* 任务堆栈底部位置 */
48
49 #if EN_SP2 > 0
uint8 idata Sp2[Sp2Space]; /* 高级中断堆栈 */
#endif
52
53 #if OS_MAX_TASKS < 9
54 uint8 data OSFastSwap[1]; /* 任务是否可以快速切换 */
C51 COMPILER V6.23a OS_CPU_C 01/01/2001 02:30:57 PAGE 2
55 #else
uint8 data OSFastSwap[2];
#endif
58
59 extern data uint16 C_XBP;
60
61 void TaskIdle(void) small;
62 /*********************************************************************************************************
63 ** 函数名称: OSCPUInit
64 ** 功能描述: Small RTOS 与系统相关的初始化
65 ** 输 入: 无
66 ** 输 出 : 无
67 ** 全局变量: OSTaskID,OSTsakStackBotton,SP
68 ** 调用模块: LoadCtx
69 **
70 ** 作 者: 陈明计
71 ** 日 期: 2002年2月22日
72 **-------------------------------------------------------------------------------------------------------
73 ** 修改人:
74 ** 日 期:
75 **-------------------------------------------------------------------------------------------------------
76 ********************************************************************************************************/
77 void OSCPUInit(void) small
78 {
79 1 uint8 i;
80 1
81 1 for (i = 0; i < OS_MAX_TASKS + 1; i++)
82 1 {
83 2 OSTsakStackBotton[i] = STACK;
84 2 }
85 1 OSTsakStackBotton[OS_MAX_TASKS + 1] = (uint8 idata *)(IDATA_RAM_SIZE % 256);
86 1
87 1 }
88
89 /*********************************************************************************************************
90 ** 函数名称: OSTaskStkInit
91 ** 功能描述: 任务堆栈初始化
92 ** 输 入: 无
93 ** 输 出 : 无
94 ** 全局变量: OSTaskID,OSTsakStackBotton,SP
95 ** 调用模块: LoadCtx
96 **
97 ** 作 者: 陈明计
98 ** 日 期: 2002年2月22日
99 **-------------------------------------------------------------------------------------------------------
100 ** 修改人:
101 ** 日 期:
102 **-------------------------------------------------------------------------------------------------------
103 ********************************************************************************************************/
104 /*
105 #if EN_REENTRANT > 0
106 #define SP_ADD_BYTE 5
107 #else
108 #define SP_ADD_BYTE 3
109 #endif
110
111
112 void OSTaskStkInit(void (code * task)(void), void xdata *ptos, uint8 TaskID) small
113 {
114 uint8 i;
115 uint8 idata * cp;
116 uint8 idata * cp1;
C51 COMPILER V6.23a OS_CPU_C 01/01/2001 02:30:57 PAGE 3
117
118 #if OS_MAX_TASKS < 9
119 OSFastSwap[1] |= OSMapTbl[TaskID];
120 #else
121 if (TaskID < 8)
122 {
123 OSFastSwap[1] |= OSMapTbl[TaskID];
124 }
125 else
126 {
127 OSFastSwap[0] |= OSMapTbl[TaskID & 0x07];
128 }
129 #endif
130
131 if (TaskID < OSRunningTaskID())
132 {
133 i = OSRunningTaskID() - TaskID;
134 cp = (uint8 idata *)(&(OSTsakStackBotton[TaskID + 1]));
135
136 do
137 {
138 *cp += SP_ADD_BYTE;
139 cp++;
140 } while (--i != 0);
141
142 cp1 = (uint8 idata *)SP;
143 SP = SP + SP_ADD_BYTE;
144 i = SP - (uint8)(OSTsakStackBotton[TaskID + 1]);
145 cp = (uint8 idata *)SP;
146 do
147 {
148 *cp-- = *cp1--;
149 } while (--i != 0);
150 }
151 else
152 {
153 cp1 = (uint8 idata *)(&(OSTsakStackBotton[OSRunningTaskID() + 1]));
154
155 i = TaskID - OSRunningTaskID();
156
157 do
158 {
159 *cp1 -= SP_ADD_BYTE;
160 cp1++;
161 } while (--i != 0);
162
163 cp = OSTsakStackBotton[OSRunningTaskID() + 1];
164 i = OSTsakStackBotton[TaskID] - cp - SP_ADD_BYTE;
165 cp1 = cp - SP_ADD_BYTE;
166 do
167 {
168 *cp1++ = *cp++;
169 } while (--i != 0);
170 }
171 cp = OSTsakStackBotton[TaskID];
172 *cp++ = (uint16)task % 256;
173 *cp++ = (uint16)task / 256;
174 #if EN_REENTRANT > 0
175 *cp++ = (uint16)ptos / 256;
176 *cp++ = (uint16)ptos % 256;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -