📄 os_core.ls1
字号:
435 ; #define OS_TASK_SWITCH
436 ;
437 ; extern uint8 idata STACK[1];
438 ; //堆栈首地址
439 ; uint8 data gStack;
440 ;
441 ; //当前任务号
442 ; uint8 data OSCurrentTaskID;
443 ;
444 ; //下一个任务号
445 ; //uint8 data OSNextTaskID;
446 ;
447 ;
448 ; uint8 const OSMapTbl[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00};
449 ; uint8 data OSTsakStackBotton[OS_MAX_TASKS + 2]; // 任务堆栈底部位置
450 ; uint8 data OS_IRQ_Sum;//中断计数器
451 ;
452 ; uint8 xdata taskMAX_stack[24];
453 ;
A51 MACRO ASSEMBLER OS_CORE 06/06/2008 11:39:27 PAGE 8
454 ; uint8 code OSUnMapTbl[] = {
455 ; 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x00 to 0x0F
*/
456 ; 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x10 to 0x1F
*/
457 ; 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x20 to 0x2F
*/
458 ; 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x30 to 0x3F
*/
459 ; 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x40 to 0x4F
*/
460 ; 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x50 to 0x5F
*/
461 ; 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x60 to 0x6F
*/
462 ; 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x70 to 0x7F
*/
463 ; 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x80 to 0x8F
*/
464 ; 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x90 to 0x9F
*/
465 ; 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xA0 to 0xAF
*/
466 ; 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xB0 to 0xBF
*/
467 ; 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xC0 to 0xCF
*/
468 ; 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xD0 to 0xDF
*/
469 ; 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xE0 to 0xEF
*/
470 ; 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /* 0xF0 to 0xFF
*/
471 ; };
472 ; // 上面256的表可以简化为16*2的表,查表麻烦点,不过说不定最后占用代码空间更大
473 ; // 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, //0Xx0 0Xx1 0Xx2 0Xx3....0XxE 0XxF
474 ; // 0, 4, 5, 4, 6, 4, 5, 4, 7, 4, 5, 4, 6, 4, 5, 4, //0X00 0X10 0X20 0X30....0XE0 0XF0
475 ;
476 ; uint8 data OSRdyGrp; // Ready list group
477 ; uint8 data OSRdyTbl[OS_RDY_TBL_SIZE]; // Table of tasks which are ready t
o run
478 ;
479 ; OS_TCB data Tasks_TCB[OS_MAX_TASKS];
480 ;
481 ; extern void Push_Reg (void);
482 ; extern void Pop_Reg (void);
483 ;
484 ;
485 ;
486 ; //系统开始运行时任务表初始化
487 ; //void OSCPUInit(void) SMALL
488 ; //{uint8 i;
489 ; //
490 ; //}
491 ;
492 ; //功能描述: 系统开始运行时初始化
493 ; void OSInit(void) SMALL
494
---- 495 RSEG ?PR?OSInit?OS_CORE
0000 496 OSInit:
497 USING 0
498 ; SOURCE LINE # 62
499 ; {uint8 i;
500 ;
501 ; gStack=STACK-2; //堆栈的首地址
502 ; SOURCE LINE # 65
A51 MACRO ASSEMBLER OS_CORE 06/06/2008 11:39:27 PAGE 9
0000 750000 F 503 MOV gStack,#LOW (STACK+0FFFEH)
504 ; OS_IRQ_Sum = 0;
505 ; SOURCE LINE # 66
0003 E4 506 CLR A
0004 F500 F 507 MOV OS_IRQ_Sum,A
508 ;
509 ; OSRdyGrp=0;//就绪组标志
510 ; SOURCE LINE # 68
0006 F500 F 511 MOV OSRdyGrp,A
512 ; memset(OSRdyTbl, 0, OS_RDY_TBL_SIZE);///就绪组内标志
513 ; SOURCE LINE # 69
0008 FE 514 MOV R6,A
0009 7F01 515 MOV R7,#01H
000B FD 516 MOV R5,A
000C FB 517 MOV R3,A
000D 7A00 F 518 MOV R2,#HIGH (OSRdyTbl)
000F 7900 F 519 MOV R1,#LOW (OSRdyTbl)
0011 120000 F 520 LCALL ?C?MEMSET
521 ;
522 ; OSCurrentTaskID = OS_MAX_TASKS-1;//当前任务为系统任务
523 ; SOURCE LINE # 71
0014 750004 F 524 MOV OSCurrentTaskID,#04H
525 ;
526 ; //OSCPUInit();//初始化任务表
527 ; for (i = 0; i < OS_MAX_TASKS; i++)
528 ; SOURCE LINE # 74
529 ;---- Variable 'i?040' assigned to Register 'R7' ----
0017 E4 530 CLR A
0018 FF 531 MOV R7,A
0019 532 ?C0001:
533 ; {
534 ; SOURCE LINE # 75
535 ; Tasks_TCB[i].pTask = 0; // Load Stack pointer in TCB
536 ; SOURCE LINE # 76
0019 EF 537 MOV A,R7
001A 75F00D 538 MOV B,#0DH
001D A4 539 MUL AB
001E 2400 F 540 ADD A,#LOW (Tasks_TCB)
0020 F8 541 MOV R0,A
0021 7600 542 MOV @R0,#00H
0023 08 543 INC R0
0024 7600 544 MOV @R0,#00H
0026 08 545 INC R0
0027 7600 546 MOV @R0,#00H
547 ; //Tasks_TCB[i].OSTCBPrio = i; // Load task priority into TCB
548 ; Tasks_TCB[i].OSTCBStat = OS_STAT_RDY; // Task is ready to run
549 ; SOURCE LINE # 78
0029 EF 550 MOV A,R7
002A 75F00D 551 MOV B,#0DH
002D A4 552 MUL AB
002E 2400 F 553 ADD A,#LOW (Tasks_TCB+05H)
0030 F8 554 MOV R0,A
0031 E4 555 CLR A
0032 F6 556 MOV @R0,A
557 ; Tasks_TCB[i].OSTCBDly = 0; //Task is not delayed
558 ; SOURCE LINE # 79
0033 EF 559 MOV A,R7
0034 75F00D 560 MOV B,#0DH
0037 A4 561 MUL AB
0038 2400 F 562 ADD A,#LOW (Tasks_TCB+03H)
003A F8 563 MOV R0,A
003B E4 564 CLR A
003C F6 565 MOV @R0,A
003D 08 566 INC R0
003E F6 567 MOV @R0,A
568 ; //Tasks_TCB[i].stk = stk;
A51 MACRO ASSEMBLER OS_CORE 06/06/2008 11:39:27 PAGE 10
569 ; Tasks_TCB[i].size = 0;
570 ; SOURCE LINE # 81
003F EF 571 MOV A,R7
0040 75F00D 572 MOV B,#0DH
0043 A4 573 MUL AB
0044 2400 F 574 ADD A,#LOW (Tasks_TCB+09H)
0046 F8 575 MOV R0,A
0047 E4 576 CLR A
0048 F6 577 MOV @R0,A
0049 08 578 INC R0
004A F6 579 MOV @R0,A
580 ; Tasks_TCB[i].stk_used = 0;
581 ; SOURCE LINE # 82
004B EF 582 MOV A,R7
004C 75F00D 583 MOV B,#0DH
004F A4 584 MUL AB
0050 2400 F 585 ADD A,#LOW (Tasks_TCB+0BH)
0052 F8 586 MOV R0,A
0053 E4 587 CLR A
0054 F6 588 MOV @R0,A
0055 08 589 INC R0
0056 F6 590 MOV @R0,A
591 ; }
592 ; SOURCE LINE # 83
0057 0F 593 INC R7
0058 BF05BE 594 CJNE R7,#05H,?C0001
595 ;
596 ; }
597 ; SOURCE LINE # 85
005B 598 ?C0004:
005B 22 599 RET
600 ; END OF OSInit
601
602 ;
603 ; /*
604 ; 该函数将创建一个系统任务
605 ;
606 ; */
607 ; //#pragma disable //禁止所有中断
608 ; void os_sys_init(pFUN task)//( void (*task)(void) )
609
---- 610 RSEG ?PR?_os_sys_init?OS_CORE
0000 611 _os_sys_init:
612 USING 0
613 ; SOURCE LINE # 92
0000 8B00 F 614 MOV task?141,R3
0002 8A00 F 615 MOV task?141+01H,R2
0004 8900 F 616 MOV task?141+02H,R1
617 ; {char xdata *pstack;
618 ; SOURCE LINE # 93
619 ; //char idata *stack_bottom;
620 ; //uint8 IEtemp;
621 ; uint16 addr;
622 ; //( ( (void (*)(void ) ) rst )
623 ; //pFUN pfun;
624 ; //void ( *pfun)(void);
625 ;
626 ; OS_AllIRQ_Unable(); //总中断禁止
627 ; SOURCE LINE # 101
0006 C2AF 628 CLR EA
629 ; //IEtemp=Read_data(SP--);//将堆栈中的中断标志读出来 #pragma disable //禁止所有中断
630 ;
631 ; OSInit();
632 ; SOURCE LINE # 104
0008 120000 F 633 LCALL OSInit
634 ;
A51 MACRO ASSEMBLER OS_CORE 06/06/2008 11:39:27 PAGE 11
635 ;
636 ; //系统任务地址
637 ; addr=Read_data(SP--); //读出刚才压入堆栈的函数地址.高地址
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -