📄 minix.lst
字号:
154 1 //恢复线程堆栈指针
155 1 SP_POINTER=OS_TASK_ARRY[os_this_task_id].task_sp_now;
156 1 OS_GOTO_TASK(); //进入线程
157 1 }
158
159
160 //线程选择器
161 //如果主要线程都处于等待状态,会返回空闲线程ID
162 unsigned char OS_TASK_SELECT(void)
163 {
164 1 unsigned char loop;
165 1 unsigned char min_pri=0xff; //线程优先级临时变量
166 1 unsigned char min_pri_number; //被选择出线程临时变量
167 1 for (loop=0x00;loop<TASK_NUMBER;loop++)
168 1 {
169 2 if (OS_TASK_ARRY[loop].task_pri<=min_pri)
170 2 {
171 3 if (OS_TASK_ARRY[loop].task_ready>0)
172 3 {
173 4 if (OS_TASK_ARRY[loop].task_wait_clock==0)
174 4 {
175 5 min_pri=OS_TASK_ARRY[loop].task_pri;
176 5 min_pri_number=loop;
177 5 }
178 4 }
179 3 }
C51 COMPILER V7.07 MINIX 11/06/2003 20:00:10 PAGE 4
180 2 }
181 1 return min_pri_number; //返回线程编号
182 1 }
183
184 //线程延时程序
185 //用于设置线程进入等待状态
186 void OS_TASK_DLY(unsigned char times)
187 {
188 1 NOT_CLOCK_ISR=1; //设置非中断操作标志位
189 1 OS_TASK_ARRY[os_this_task_id].task_wait_clock=times; //送入等待时间
190 1
191 1 //保存线程堆栈
192 1 OS_TASK_ARRY[os_this_task_id].task_sp_now=SP_POINTER+CPU_SAVE_DUP;
193 1 OS_SAVE_THIS_TASK(); //保存当前线程
194 1 }
195
196 //*********************************************
197 //
198 // 与CPU有关的函数 移植时可能需要修改
199 //
200 //*********************************************
201
202
203 //线程构造器
204 void OS_CREATE_TASK(
205 void *task, //线程入口地址
206 unsigned char task_ready, //线程状态
207 unsigned char task_pri, //线程优先级
208 unsigned char task_sp_bot //线程堆栈底部
209 )
210 {
211 1 unsigned char *sp_temp; //临时线程指针
212 1
213 1 OS_TASK_ARRY[OS_TASK_INT_USED].task_pri=task_pri; //线程优先级
214 1 OS_TASK_ARRY[OS_TASK_INT_USED].task_ready=task_ready; //线程状态
215 1 OS_TASK_ARRY[OS_TASK_INT_USED].task_sp_bot=task_sp_bot; //线程堆栈底部
216 1 OS_TASK_ARRY[OS_TASK_INT_USED].task_address=task; //线程入口地址
217 1
218 1 OS_TASK_INT_USED=OS_TASK_INT_USED+1; //修改线程数目
219 1
220 1 //初始化线程堆栈
221 1 sp_temp=(char *)OS_TASK_ARRY[OS_TASK_INT_USED-1].task_sp_bot;
222 1 *sp_temp=(char )task&0x00ff; //PCL
223 1 sp_temp=sp_temp+1;
224 1 *sp_temp=(char)((int)task>>8); //PCH
225 1 sp_temp=sp_temp+1;
226 1
227 1 *sp_temp=0x00; //PSW
228 1 sp_temp=sp_temp+1;
229 1 *sp_temp=0x00; //ACC
230 1 sp_temp=sp_temp+1;
231 1 *sp_temp=0x00; //B
232 1 sp_temp=sp_temp+1;
233 1 *sp_temp=0x00; //DPH
234 1 sp_temp=sp_temp+1;
235 1 *sp_temp=0x00; //DPL
236 1 sp_temp=sp_temp+1;
237 1 *sp_temp=0x00; //R0
238 1 sp_temp=sp_temp+1;
239 1 *sp_temp=0x00; //R1
240 1 sp_temp=sp_temp+1;
241 1 *sp_temp=0x00; //R2
C51 COMPILER V7.07 MINIX 11/06/2003 20:00:10 PAGE 5
242 1 sp_temp=sp_temp+1;
243 1 *sp_temp=0x00; //R3
244 1 sp_temp=sp_temp+1;
245 1 *sp_temp=0x00; //R4
246 1 sp_temp=sp_temp+1;
247 1 *sp_temp=0x00; //R5
248 1 sp_temp=sp_temp+1;
249 1 *sp_temp=0x00; //R6
250 1 sp_temp=sp_temp+1;
251 1 *sp_temp=0x00; //R7
252 1
253 1 //设置线程入口SP地址
254 1 OS_TASK_ARRY[OS_TASK_INT_USED-1].task_sp_now=(char)sp_temp;
255 1 }
256
257 /*
258 //开时钟
259 void OS_START_TICK(void)
260 {
261 IE=IE|0X82;
262 TH0=0Xf0;
263 TL0=0X00;
264 TMOD=TMOD|0X01;
265 TCON=TCON|0X10;
266 }
267
268 //恢复时钟
269 void OS_RESTORE_TICK(void)
270 {
271 TH0=0Xf0;
272 TL0=0X00;
273 }
274 */
275
276 //保存调度系统的寄存器
277 void OS_SAVE_SYSTEM(void)
278 {
279 1 OS_SYSTEM.PSW=PSW;
280 1 OS_SYSTEM.ACC=ACC;
281 1 OS_SYSTEM.B =B;
282 1 OS_SYSTEM.DPH=DPH;
283 1 OS_SYSTEM.DPL=DPL;
284 1 OS_SAVE_SYSTEM_R();//保存R寄存器
285 1 }
286
287 //恢复调度系统寄存器
288 void OS_RESTORE_SYSTEM(void)
289 {
290 1 PSW=OS_SYSTEM.PSW;
291 1 OS_RESTORE_SYSTEM_R();//恢复R寄存器
292 1 ACC=OS_SYSTEM.ACC;
293 1 B =OS_SYSTEM.B;
294 1 DPH=OS_SYSTEM.DPH;
295 1 DPL=OS_SYSTEM.DPL;
296 1 }
297
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 675 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
C51 COMPILER V7.07 MINIX 11/06/2003 20:00:10 PAGE 6
PDATA SIZE = ---- ----
DATA SIZE = 49 12
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -