⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_core.ls1

📁 本RTOS参考 usOS-II, ARM-RTX
💻 LS1
📖 第 1 页 / 共 5 页
字号:
                     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 + -