📄 os_core.lst
字号:
269 1 stack_bottom_bak=Tasks_TCB[OSCurrentTaskID].stk;//当前任务堆栈底备份地址
270 1 SP=gStack+Tasks_TCB[OSCurrentTaskID].stk_used;//新任务恢复堆栈后,堆栈指针的位置
271 1
272 1 memcpy(stack_bottom, stack_bottom_bak, Tasks_TCB[OSCurrentTaskID].stk_used);//将保存的堆栈数据拷贝到堆
-栈区
273 1
274 1 // //2.2 恢复任务特殊功能寄存器
275 1 // #ifdef DEBUG
276 1 // //方便在本文件中调试,查看代码方便,将多占2byte堆栈,和一点代码空间
277 1 // Pop_Reg();
278 1 // SP -= 13;
279 1 // #else
280 1 // #pragma ASM
281 1 // #pragma ENDASM
282 1 // #endif
283 1 //2.3 将新任务原来断点地址压入堆栈
284 1 //addr = (uint16)Tasks_TCB[OSCurrentTaskID].pTask;//将新任务原来断点地址压入堆栈,在该函数退出后将恢复
-运行
285 1 //Write_data( ++SP, addr );
286 1 //Write_data( ++SP, addr>>8 );
287 1 //Write_data( ++SP, SPtemp );//恢复中断标志
288 1
289 1 Write_data( ++SP, old_addr );
290 1 Write_data( ++SP, old_addr>>8 );
291 1 }
292
293 //功能描述: 系统时钟处理函数,处理各个任务的延时
294 //任务延时减为0,就进入就绪状态
295 //中断中调用, 各任务等待时间-1
296 void OSTimeTick(void) SMALL
297 {uint8 prio;
298 1 //OS_TCB *ptcb;
299 1
300 1 //ptcb=&Tasks_TCB[0];
301 1 for ( prio = 0; prio < OS_LOWEST_PRIO; prio++)//,ptcb++ )
C51 COMPILER V7.07 OS_CORE 06/09/2008 17:22:34 PAGE 6
302 1 {
303 2 if(Tasks_TCB[prio].OSTCBDly != 0 && Tasks_TCB[prio].OSTCBDly != 0xffff)
304 2 {
305 3 if ( --Tasks_TCB[prio].OSTCBDly == 0 )
306 3 {
307 4 //if ((Tasks_TCB[prio].OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) // Is task suspended?
308 4 if ( Tasks_TCB[prio].OSTCBStat != INACTIVE )//if ( Tasks_TCB[prio].OSTCBStat == WAIT_DLY )
309 4 {
310 5 OSRdyGrp |= OSMapTbl[prio>>3]; //prio>>3-->prio/8
311 5 OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07]; //prio&0x07-->prio%8
312 5
313 5 Tasks_TCB[prio].OSTCBStat = READY;
314 5 }
315 4 else
316 4 {
317 5 // Schedule periodic tasks to run again
318 5 Tasks_TCB[prio].OSTCBDly = 1;
319 5 }
320 4 }
321 3 }
322 2 //}
323 2 }
324 1 }
325
326
327 //功能描述: 查找下一个优先级最高的就绪任务
328 //找到优先级最高的任务立即退出,没找到就绪的任务那么系统就将执行优先级最低
329 //的系统默认的任务
330 //系统将要执行的任务号:OSNextTaskID
331 void OSFindNextRunningTask(void) SMALL
332 {//OS_TCB *ptcb;
333 1 //void ( code * fun )( void );
334 1 void ( * fun )( void );
335 1 uint8 y;
336 1 uint8 prio;
337 1
338 1
339 1 //while(OSRdyGrp!=0)
340 1 if(OSRdyGrp!=0)
341 1 {
342 2 y = OSUnMapTbl[OSRdyGrp]; //计算优先级,先计算组号
343 2 prio=(INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
344 2
345 2 fun=Tasks_TCB[prio].pTask;
346 2
347 2 //if((OSRdyTbl[y] &= ~OSMapTbl[prio&0x07])==0) //任务从就绪表中删除
348 2 // OSRdyGrp &= ~OSMapTbl[y];
349 2
350 2 if(fun!=0)
351 2 {
352 3 //fun();
353 3 OSCurrentTaskID=prio;
354 3 }
355 2 }
356 1
357 1 // The scheduler enters idle mode at this point
358 1 //Sys_Go_To_Sleep();
359 1 }
360
361 /*
362 //任务延时
363 1.1 计算当前任务使用堆栈情况
C51 COMPILER V7.07 OS_CORE 06/09/2008 17:22:34 PAGE 7
364 1.2 保存任务特殊功能寄存器
365 1.3 保存任务堆栈+任务特殊功能寄存器->堆栈备份空间
366 1.4 切换任务
367 2.1 从堆栈备份空间->恢复新的就绪的任务的堆栈
368 2.2 恢复任务特殊功能寄存器
369 2.3 将新任务原来断点地址压入堆栈
370 */
371
372 //#pragma disable //禁止所有中断
373 void os_dly_wait( U16 delay_time ) SMALL
374 //void OSTimeDly (uint16 ticks, uint8 prio) SMALL
375 {//uint8 SPtemp;
376 1 uint8 data IEtemp;
377 1
378 1 //SPtemp=Read_data(SP--);//将堆栈中的中断标志读出来 #pragma disable //禁止所有中断
379 1 IEtemp=IE;//保存中断
380 1 OS_AllIRQ_Unable(); //总中断禁止
381 1
382 1 if (delay_time > 0)
383 1 { /* 0 means no delay! */
384 2 //IrqAll_Unable(); //总中断禁止 IrqT0_Unable(); //定时器0中断禁止
385 2
386 2 Tasks_TCB[OSCurrentTaskID].OSTCBStat = WAIT_DLY; //进入延时等待
387 2 //1.任务从就绪表中删除,2.如果一组中无如何任务就绪,那么删除组标志
388 2 if((OSRdyTbl[OSCurrentTaskID>>3] &= ~OSMapTbl[OSCurrentTaskID&0x07])==0) //任务从就绪表中删除
389 2 OSRdyGrp &= ~OSMapTbl[OSCurrentTaskID>>3]; // prio>>3-->prio/8, //prio&0x07-->prio%8
390 2 Tasks_TCB[OSCurrentTaskID].OSTCBDly = delay_time; // Load delay_time in TCB
391 2 //IrqAll_Enable(); //总中断允许 IrqT0_Enable(); //打开T0中断允许
392 2 }
393 1
394 1 TF0=1;//设置T0中断,调用任务切换
395 1
396 1 /*
397 1 //1.2 保存任务特殊功能寄存器
398 1 #ifdef DEBUG
399 1 SP += 13;
400 1 //方便在本文件中调试,查看代码方便,将多占2byte堆栈,和一点代码空间
401 1 Push_Reg();
402 1 #else
403 1 #pragma asm
404 1 ;//压栈和出栈按中断压栈和出栈的顺序
405 1 PUSH ACC
406 1 PUSH B
407 1 PUSH DPH
408 1 PUSH DPL
409 1 PUSH PSW
410 1 PUSH 0
411 1 PUSH 1
412 1 PUSH 2
413 1 PUSH 3
414 1 PUSH 4
415 1 PUSH 5
416 1 PUSH 6
417 1 PUSH 7
418 1 #pragma ENDASM
419 1 #endif
420 1
421 1 //下次任务运行地址是从调用os_dly_wait()地址之后开始运行
422 1 OSIntExit();
423 1
424 1 //2.2 恢复任务特殊功能寄存器
425 1 #ifdef DEBUG
C51 COMPILER V7.07 OS_CORE 06/09/2008 17:22:34 PAGE 8
426 1 //方便在本文件中调试,查看代码方便,将多占2byte堆栈,和一点代码空间
427 1 Pop_Reg();
428 1 SP -= 13;
429 1 #else
430 1 #pragma ASM
431 1 #pragma ENDASM
432 1 #endif
433 1
434 1 */
435 1
436 1 //OS_AllIRQ_Enable(); //总中断允许
437 1 IE=IEtemp; //恢复所有中断状态
438 1 //DelayNop(10);
439 1 }
440
441 /*
442 wait_flags // Bit pattern of events to wait for
443 timeout // Length of time to wait for event
444 */
445
446 OS_RESULT os_evt_wait_or ( EVENT_BIT wait_flags, U16 timeout )
447 {uint8 data IEtemp;
448 1
449 1 IEtemp=IE;//保存中断
450 1 OS_AllIRQ_Unable(); //总中断禁止
451 1
452 1 if (timeout > 0)
453 1 { /* 0 means no delay! */
454 2 //IrqAll_Unable(); //总中断禁止 IrqT0_Unable(); //定时器0中断禁止
455 2
456 2 Tasks_TCB[OSCurrentTaskID].OSTCBStat = WAIT_OR; //进入延时等待
457 2 Tasks_TCB[OSCurrentTaskID].events = wait_flags; //等待事件
458 2 //1.任务从就绪表中删除,2.如果一组中无如何任务就绪,那么删除组标志
459 2 if((OSRdyTbl[OSCurrentTaskID>>3] &= ~OSMapTbl[OSCurrentTaskID&0x07])==0) //任务从就绪表中删除
460 2 OSRdyGrp &= ~OSMapTbl[OSCurrentTaskID>>3]; // prio>>3-->prio/8, //prio&0x07-->prio%8
461 2 Tasks_TCB[OSCurrentTaskID].OSTCBDly = timeout; // Load delay_time in TCB
462 2 //IrqAll_Enable(); //总中断允许 IrqT0_Enable(); //打开T0中断允许
463 2
464 2 TF0=1;//设置T0中断,调用任务切换
465 2 }
466 1 IE=IEtemp; //恢复所有中断状态
467 1
468 1 DelayNop(1);
469 1
470 1 IEtemp=IE;//保存中断
471 1 OS_AllIRQ_Unable(); //总中断禁止
472 1
473 1 if( Tasks_TCB[OSCurrentTaskID].OSTCBDly == 0)
474 1 {
475 2 Tasks_TCB[OSCurrentTaskID].events = 0; //等待事件清0
476 2 IE=IEtemp; //恢复所有中断状态
477 2 return(OS_R_TMO);
478 2 }
479 1 else
480 1 {
481 2 Tasks_TCB[OSCurrentTaskID].OSTCBDly = 0; //等待延时清0
482 2 IE=IEtemp; //恢复所有中断状态
483 2 return(OS_R_EVT);
484 2 }
485 1 }
486
487 OS_RESULT os_evt_wait_and ( EVENT_BIT wait_flags, U16 timeout )
C51 COMPILER V7.07 OS_CORE 06/09/2008 17:22:34 PAGE 9
488 {uint8 data IEtemp;
489 1
490 1 IEtemp=IE;//保存中断
491 1 OS_AllIRQ_Unable(); //总中断禁止
492 1
493 1 if (timeout > 0)
494 1 { /* 0 means no delay! */
495 2 //IrqAll_Unable(); //总中断禁止 IrqT0_Unable(); //定时器0中断禁止
496 2
497 2 Tasks_TCB[OSCurrentTaskID].OSTCBStat = WAIT_AND; //进入延时等待
498 2 Tasks_TCB[OSCurrentTaskID].events = wait_flags; //等待事件
499 2 //1.任务从就绪表中删除,2.如果一组中无如何任务就绪,那么删除组标志
500 2 if((OSRdyTbl[OSCurrentTaskID>>3] &= ~OSMapTbl[OSCurrentTaskID&0x07])==0) //任务从就绪表中删除
501 2 OSRdyGrp &= ~OSMapTbl[OSCurrentTaskID>>3]; // prio>>3-->prio/8, //prio&0x07-->prio%8
502 2 Tasks_TCB[OSCurrentTaskID].OSTCBDly = timeout; // Load delay_time in TCB
503 2 //IrqAll_Enable(); //总中断允许 IrqT0_Enable(); //打开T0中断允许
504 2
505 2 TF0=1;//设置T0中断,调用任务切换
506 2 }
507 1 IE=IEtemp; //恢复所有中断状态
508 1
509 1 DelayNop(1);
510 1
511 1 IEtemp=IE;//保存中断
512 1 OS_AllIRQ_Unable(); //总中断禁止
513 1
514 1 if( Tasks_TCB[OSCurrentTaskID].OSTCBDly == 0)
515 1 {
516 2 Tasks_TCB[OSCurrentTaskID].events = 0; //等待事件清0
517 2 IE=IEtemp; //恢复所有中断状态
518 2 return(OS_R_TMO);
519 2 }
520 1 else
521 1 {
522 2 Tasks_TCB[OSCurrentTaskID].OSTCBDly = 0; //等待延时清0
523 2 IE=IEtemp; //恢复所有中断状态
524 2 return(OS_R_EVT);
525 2 }
526 1 }
527
528 /*
529 event_flags // Bit pattern of event flags to set
530 task // The task that the events apply to
531 */
532 void os_evt_set ( EVENT_BIT event_flags, OS_TID TaskID )
533 {uint8 data IEtemp;
534 1
535 1 IEtemp=IE;//保存中断
536 1 OS_AllIRQ_Unable(); //总中断禁止
537 1
538 1 if( (Tasks_TCB[TaskID].events & event_flags) != 0 )//是等待的事件发生才处理,否则忽略发生的事件
539 1 {
540 2 Tasks_TCB[TaskID].events &= ~event_flags;
541 2 if( (Tasks_TCB[TaskID].OSTCBStat == WAIT_OR) || //只要有事件发生
542 2 (Tasks_TCB[TaskID].OSTCBStat == WAIT_AND && Tasks_TCB[TaskID].events==0) ) //有事件发生,并且所
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -