📄 os_core.lst
字号:
C51 COMPILER V8.08 OS_CORE 05/09/2008 17:57:19 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE OS_CORE
OBJECT MODULE PLACED IN OS_core.OBJ
COMPILER INVOKED BY: C:\Keil808\C51\BIN\C51.EXE OS_core.c ROM(COMPACT) DEBUG OBJECTEXTEND
line level source
1 #include <AT89X52.H>
2
3 #include "os_core.h"
4 #include "main.h"
5 #include "task_switch.h"
6 #include "sem.h"
7 #include "q.h"
8 #include "uart.h"
9
10 //程序控制块
11 TCB OS_TCB[TASK_NUM];
12 //当前运行任务的优先级
13 uint8 OS_Current_ID;
14 //进入临界段计数器
15 uint8 OS_En_Cr_Count;
16 //任务就绪表
17 uint8 OS_TaskRdy_List;
18 //中断嵌套计数器
19 uint8 Int_count;
20
21 uint8 Task_Int_List;
22 //置位表
23 uint8 code OSMapTbl[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
24
25
26 ////////////////////////////系统初始化//////////////////////////////////////////////////////
27 void OS_Init(void)
28 {
29 1 uint8 i ;
30 1
31 1 EA=0; //关中断
32 1
33 1 ET2=1; //接受定时器2中断
34 1 T2CON=0x00;
35 1 T2MOD=0x00;
36 1 RCAP2H=0xB1;
37 1 RCAP2L=0xE0; //定时时间为10ms
38 1
39 1 Int_count=0; //中断嵌套为0
40 1 OS_TaskRdy_List=0; //任务就绪表为0
41 1 OS_Task_Q_List=0;
42 1 OS_En_Cr_Count=0; //进入临界段为0次
43 1
44 1 Task_Int_List=0x00;
45 1
46 1 OS_TCB[0].Task_SP=SP+2; //初始化各任务的堆栈起始地址
47 1
48 1 for(i=1;i<TASK_NUM;i++)
49 1 OS_TCB[i].Task_SP=OS_TCB[i-1].Task_SP+(255-OS_TCB[0].Task_SP)/TASK_NUM;
50 1
51 1 }
52
53 ///////////////////////////创建一个任务////////////////////////////////////////////////////////
54 void OS_Task_Create(uint8 Task_Prio,uint8 Task_ID, uint16 Task_PC,uint8 Stack_Bottom) reentrant
55 {
C51 COMPILER V8.08 OS_CORE 05/09/2008 17:57:19 PAGE 2
56 1 OS_ENTER_CRITICAL();
57 1 if(OS_TCB[Task_ID].Status== No_Exist)
58 1 {
59 2 OS_TCB[Task_ID].Status=Exist; /*任务存在*/
60 2 OS_EXIT_CRITICAL();
61 2 ((uint8 idata *)Stack_Bottom)[0]=Task_PC; /*将任务入口地址保存在堆栈,压入低8位*/
62 2 ((uint8 idata *)Stack_Bottom)[1]=Task_PC>>8; /*压入高8位*/
63 2
64 2 OS_TCB[Task_ID].Task_SP=Stack_Bottom+1; /*将该任务的堆栈栈顶地址保存*/
65 2
66 2 OS_TCB[Task_ID].Prio=Task_Prio; /*任务优先级*/
67 2
68 2 OS_TCB[Task_ID].Delay=0; /*任务初始不延时*/
69 2
70 2 OS_TaskRdy_List|=OSMapTbl[Task_ID]; /*任务就绪*/
71 2
72 2 return ;
73 2 }
74 1 OS_EXIT_CRITICAL();
75 1 }
76
77 ////////////////////////////系统启动///////////////////////////////////////////////////////////
78 void OS_Start(void)
79 {
80 1
81 1 OS_Current_ID=TASK_NUM-1;
82 1
83 1 SP=OS_TCB[OS_Current_ID].Task_SP; /*修改堆栈指针;使其指向当前任务的堆栈段*/
84 1
85 1 TR2=1; /*启动定时器2*/
86 1 EA=1; /*开中断*/
87 1 }
88
89 ////////////////////////////系统时钟处理函数//////////////////////////////////////////////////
90 void OS_TimeTick(void)
91 {
92 1 uint8 i;
93 1 for(i=0;i<TASK_NUM;i++) /*处理所有延时*/
94 1 {
95 2 if(OS_TCB[i].Delay) /*如果任务需要延时*/
96 2 {
97 3 OS_TCB[i].Delay--; /*延时时间减1*/
98 3 if(OS_TCB[i].Delay==0) /*如果延时时间到*/
99 3 {
100 4 OSSendSignal(i); /*中断中发信号,任务就绪*/
101 4 }
102 3 }
103 2 }
104 1 }
105 ////////////////////////////////查找下一任务//////////////////////////////////////////////////
106 void OS_Find_Next_Task(void)
107 {
108 1
109 1 uint8 tempPrio,i;
110 1
111 1 tempPrio=OS_TCB[OS_Current_ID].Prio;
112 1
113 1 for(i=0;i<TASK_NUM-1;i++)
114 1 {
115 2 if((OS_TaskRdy_List&OSMapTbl[i])&&(OS_TCB[i].Prio<tempPrio))
116 2 {
117 3 goto bb;
C51 COMPILER V8.08 OS_CORE 05/09/2008 17:57:19 PAGE 3
118 3 }
119 2 }
120 1
121 1 for(i=OS_Current_ID;i<TASK_NUM-1;i++)
122 1 {
123 2 if((OS_TaskRdy_List&OSMapTbl[i])&&(OS_TCB[i].Prio==tempPrio)&&i!=OS_Current_ID)
124 2 {
125 3 goto bb;
126 3 }
127 2 }
128 1
129 1 if(i==TASK_NUM-1)
130 1 {
131 2 for(i=0;i<TASK_NUM-1;i++)
132 2 {
133 3 if(OS_TaskRdy_List&OSMapTbl[i])
134 3 {
135 4 break;
136 4 }
137 3 }
138 2 }
139 1
140 1 bb: OS_Current_ID=i;
141 1
142 1 }
143
144 ///////////////////////////定时器2中断服务函数/////////////////////////////////////////////////
145 #pragma disable /* 除非最高优先级中断,否则,必须加上这一句 */
146 void Timer2ISR(void) interrupt 5
147 {
148 1 TF2=0; /*清中断标志TF2*/
149 1 Enter_Int();
150 1 #if EN_TIMER_SHARING > 0
151 1 OS_TimeTick(); /* 调用系统时钟处理函数 */
152 1 #else
OSSendSignal(TIME_ISR_TASK_ID); /* 唤醒ID为TIME_ISR_TASK_ID的任务*/
#endif
155 1 Exit_Int();
156 1 }
157
158
159 ///////////////////////////任务中给指定任务发送信号///////////////////////////////////////////
160 void OSSendSignal(uint8 TaskId)
161 {
162 1 if (TaskId < TASK_NUM)
163 1 {
164 2 OS_ENTER_CRITICAL();
165 2 OS_TaskRdy_List|=OSMapTbl[TaskId ];/*任务就绪*/
166 2 OS_EXIT_CRITICAL();
167 2 if (Int_count==0) /*不在中断中*/
168 2 {
169 3 OSSched(); /*开始任务切换*/
170 3 }
171 2 }
172 1 }
173 //////////////////////////清除指定任务信号////////////////////////////////////////////////////
174 void OSClearSignal(uint8 TaskId)
175 {
176 1 if(TaskId <TASK_NUM)
177 1 {
178 2 OS_ENTER_CRITICAL();
179 2 OS_TaskRdy_List &= ~OSMapTbl[TaskId]; /*任务不就绪*/
C51 COMPILER V8.08 OS_CORE 05/09/2008 17:57:19 PAGE 4
180 2 OS_EXIT_CRITICAL();
181 2 if(TaskId==OS_Current_ID && Int_count==0) /*挂起自身并不在中断中*/
182 2 {
183 3 OSSched(); /*开始任务切换*/
184 3 }
185 2 }
186 1 }
187 //////////////////////////挂起指定任务////////////////////////////////////////////////////////
188 void OSTaskSuspend(uint8 TaskId)
189 {
190 1 if (TaskId <TASK_NUM)
191 1 {
192 2 OS_TCB[TaskId].Delay = 0; /*没有超时处理*/
193 2 OSClearSignal(TaskId); /*清除指定任务信号*/
194 2 }
195 1 }
196 /////////////////////////系统等待函数//////////////////////////////////////////////////////////
-
197 uint8 OSWait(uint8 typ, uint8 ticks)
198 {
199 1 OS_TCB[OS_Current_ID].Delay = ticks; /*设置超时时间*/
200 1 switch(typ)
201 1 {
202 2 case K_SIG: /*等待信号,即挂起自身*/
203 2 OSTaskSuspend(OS_Current_ID);
204 2 return SIG_EVENT;
205 2 case K_TMO:
206 2 SP++;
207 2 *((uint8 data * data *)SP) = ticks;
*** WARNING C289 IN LINE 207 OF OS_CORE.C: '=': converting non-pointer to pointer
208 2 OSClearSignal(OS_Current_ID); /*等待超时,即延时一段时间*/
209 2 SP--;
210 2 ticks = (uint8 data *)(*((uint8 data *)SP));
211 2 if(ticks&&OS_TCB[OS_Current_ID].Delay==0) /*超时*/
212 2 {
213 3 return TMO_EVENT;
214 3 }
215 2 return SIG_EVENT;
216 2 default:
217 2 OS_TCB[OS_Current_ID].Delay = 0;
218 2 return NOT_OK;
219 2 }
220 1 }
221
222
223
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 640 ----
CONSTANT SIZE = 8 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 40 2
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -