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

📄 os_core.ls1

📁 本RTOS参考 usOS-II, ARM-RTX
💻 LS1
📖 第 1 页 / 共 5 页
字号:
                     638                             ; SOURCE LINE # 108
000B AF81            639             MOV     R7,SP
000D 1581            640             DEC     SP
000F A807            641             MOV     R0,AR7
0011 E6              642             MOV     A,@R0
                     643     ;---- Variable 'addr?143' assigned to Register 'R6/R7' ----
                     644     ;     addr <<= 8;
                     645                             ; SOURCE LINE # 109
0012 7F00            646             MOV     R7,#00H
0014 FE              647             MOV     R6,A
                     648     ;     addr += Read_data(SP) ;//Read_data(SP-1);  //读出刚才压入堆栈的函数地址.低地址.有错
                     649                             ; SOURCE LINE # 110
0015 AD81            650             MOV     R5,SP
0017 A805            651             MOV     R0,AR5
0019 E6              652             MOV     A,@R0
001A 2F              653             ADD     A,R7
001B FF              654             MOV     R7,A
001C E4              655             CLR     A
001D 3E              656             ADDC    A,R6
                     657     ;     SP++;
                     658                             ; SOURCE LINE # 111
001E 0581            659             INC     SP
                     660     ; 
                     661     ;     
                     662     ;     //保存系统任务
                     663     ;     Tasks_TCB[OS_MAX_TASKS-1].pTask          = (void code *)addr;  // Load Stack pointer 
                             in TCB
                     664                             ; SOURCE LINE # 115
0020 A907            665             MOV     R1,AR7
0022 7500FF   F      666             MOV     Tasks_TCB+034H,#0FFH
0025 F500     F      667             MOV     Tasks_TCB+035H,A
0027 8900     F      668             MOV     Tasks_TCB+036H,R1
                     669     ;     //Tasks_TCB[OS_MAX_TASKS-1].OSTCBPrio      = (INT8U)priority;  // Load task priority 
                             into TCB
                     670     ;     Tasks_TCB[OS_MAX_TASKS-1].OSTCBStat      = OS_STAT_RDY;    // Task is ready to run
                     671                             ; SOURCE LINE # 117
0029 E4              672             CLR     A
002A F500     F      673             MOV     Tasks_TCB+039H,A
                     674     ;     Tasks_TCB[OS_MAX_TASKS-1].OSTCBDly       = 0;              //Task is not delayed
                     675                             ; SOURCE LINE # 118
002C F500     F      676             MOV     Tasks_TCB+037H,A
002E F500     F      677             MOV     Tasks_TCB+038H,A
                     678     ;     Tasks_TCB[OS_MAX_TASKS-1].stk            = taskMAX_stack;
                     679                             ; SOURCE LINE # 119
0030 750001   F      680             MOV     Tasks_TCB+03AH,#01H
0033 750000   F      681             MOV     Tasks_TCB+03BH,#HIGH (taskMAX_stack)
0036 750000   F      682             MOV     Tasks_TCB+03CH,#LOW (taskMAX_stack)
                     683     ;     Tasks_TCB[OS_MAX_TASKS-1].size           = sizeof(taskMAX_stack);
                     684                             ; SOURCE LINE # 120
0039 F500     F      685             MOV     Tasks_TCB+03DH,A
003B 750018   F      686             MOV     Tasks_TCB+03EH,#018H
                     687     ;     Tasks_TCB[OS_MAX_TASKS-1].stk_used       = (2+13);
                     688                             ; SOURCE LINE # 121
003E F500     F      689             MOV     Tasks_TCB+03FH,A
0040 75000F   F      690             MOV     Tasks_TCB+040H,#0FH
                     691     ;         
                     692     ;     pstack=Tasks_TCB[OS_MAX_TASKS-1].stk;
                     693                             ; SOURCE LINE # 123
0043 850000   F      694             MOV     pstack?142,Tasks_TCB+03BH
0046 850000   F      695             MOV     pstack?142+01H,Tasks_TCB+03CH
                     696     ;     
                     697     ;     //系统任务就绪
                     698     ;     //OSTaskResume(OS_MAX_TASKS-1);
A51 MACRO ASSEMBLER  OS_CORE                                                              06/06/2008 11:39:27 PAGE    12

                     699     ;     OSRdyGrp               |= OSMapTbl[(OS_MAX_TASKS-1)>>3];     //prio>>3-->prio/8
                     700                             ; SOURCE LINE # 127
0049 900000   F      701             MOV     DPTR,#OSMapTbl
004C 93              702             MOVC    A,@A+DPTR
004D 4200     F      703             ORL     OSRdyGrp,A
                     704     ;     OSRdyTbl[(OS_MAX_TASKS-1)>>3]      |= OSMapTbl[(OS_MAX_TASKS-1)&0x07];   //prio&0x07-
                             ->prio%8
                     705                             ; SOURCE LINE # 128
004F 900000   F      706             MOV     DPTR,#OSMapTbl+04H
0052 E4              707             CLR     A
0053 93              708             MOVC    A,@A+DPTR
0054 4200     F      709             ORL     OSRdyTbl,A
                     710     ;     
                     711     ;     
                     712     ;     //将task函数地址替换为进入该函数后地址,该函数退出后将执行task函数
                     713     ;     task();//该函数里面会打开中断
                     714                             ; SOURCE LINE # 132
0056 AA00     F      715             MOV     R2,task?141+01H
0058 A900     F      716             MOV     R1,task?141+02H
005A 020000   F      717             LJMP    ?C?ICALL
                     718     ; END OF _os_sys_init
                     719     
                     720     ;     //addr = (uint16)task;
                     721     ;     //Write_data( ++SP, addr );
                     722     ;     //Write_data( ++SP, addr>>8 );
                     723     ;     //Write_data( ++SP, IEtemp );
                     724     ;     
                     725     ; }
                     726     ; 
                     727     ; /*------------------------------------------------------------------*-
                     728     ; 创建任务
                     729     ; 
                     730     ; * pFunction--任务地址
                     731     ; * prio--优先级
                     732     ; 
                     733     ; task,   Task to create 
                     734     ; prio,   Task priority (1-254)
                     735     ; stk,    Pointer to the task's stack
                     736     ; size,   Number of bytes in the stack
                     737     ; 
                     738     ; 任务创建后进入就绪状态
                     739     ; -*------------------------------------------------------------------*/
                     740     ; #pragma disable  //禁止所有中断
                     741     ; 
                     742     ; OS_TID  os_tsk_create_user( pFUN task, U8 prio, void* stk, U16 size ) SMALL 
                     743     
----                 744             RSEG  ?PR?_os_tsk_create_user?OS_CORE
0000                 745     _os_tsk_create_user:
0000 D3              746             SETB    C
0001 10AF01          747             JBC     EA,?C0029
0004 C3              748             CLR     C
0005                 749     ?C0029:
0005 C0D0            750             PUSH    PSW
                     751             USING   0
                     752                             ; SOURCE LINE # 155
0007 8B00     F      753             MOV     task?244,R3
0009 8A00     F      754             MOV     task?244+01H,R2
000B 8900     F      755             MOV     task?244+02H,R1
000D 8D00     F      756             MOV     prio?245,R5
                     757     ; {//OS_TCB    *ptcb;
                     758     ;  char xdata *pstack;
                     759     ;  uint16 i;
                     760     ;     
                     761     ;     //OS_ENTER_CRITICAL();
                     762     ; //    IrqAll_Unable();    //总中断禁止  IrqT0_Unable();   //定时器0中断禁止
                     763     ;     
A51 MACRO ASSEMBLER  OS_CORE                                                              06/06/2008 11:39:27 PAGE    13

                     764     ;     //ptcb=&Tasks_TCB[prio];
                     765     ;     if (Tasks_TCB[prio].pTask == NULL)
                     766                             ; SOURCE LINE # 164
000F E500     F      767             MOV     A,prio?245
0011 75F00D          768             MOV     B,#0DH
0014 A4              769             MUL     AB
0015 2400     F      770             ADD     A,#LOW (Tasks_TCB)
0017 F8              771             MOV     R0,A
0018 8603            772             MOV     AR3,@R0
001A 08              773             INC     R0
001B E6              774             MOV     A,@R0
001C FA              775             MOV     R2,A
001D 08              776             INC     R0
001E E6              777             MOV     A,@R0
001F 4A              778             ORL     A,R2
0020 4B              779             ORL     A,R3
0021 6003            780             JZ      $ + 5H
0023 020000   F      781             LJMP    ?C0006
                     782     ;     {
                     783                             ; SOURCE LINE # 165
                     784     ;         Tasks_TCB[prio].pTask          = task;      // Load Stack pointer in TCB
                     785                             ; SOURCE LINE # 166
0026 AA00     F      786             MOV     R2,task?244+01H
0028 E500     F      787             MOV     A,prio?245
002A 75F00D          788             MOV     B,#0DH
002D A4              789             MUL     AB
002E 2400     F      790             ADD     A,#LOW (Tasks_TCB)
0030 F8              791             MOV     R0,A
0031 A600     F      792             MOV     @R0,task?244
0033 08              793             INC     R0
0034 A602            794             MOV     @R0,AR2
0036 08              795             INC     R0
0037 A601            796             MOV     @R0,AR1
                     797     ;         //Tasks_TCB[prio].OSTCBPrio      = (INT8U)priority;  // Load task priority into T
                             CB
                     798     ;         Tasks_TCB[prio].OSTCBStat      = OS_STAT_RDY;    // Task is ready to run
                     799                             ; SOURCE LINE # 168
0039 E500     F      800             MOV     A,prio?245
003B 75F00D          801             MOV     B,#0DH
003E A4              802             MUL     AB
003F 2400     F      803             ADD     A,#LOW (Tasks_TCB+05H)
0041 F8              804             MOV     R0,A
0042 E4              805             CLR     A
0043 F6              806             MOV     @R0,A
                     807     ;         Tasks_TCB[prio].OSTCBDly       = 0;              //Task is not delayed
                     808                             ; SOURCE LINE # 169
0044 E500     F      809             MOV     A,prio?245
0046 75F00D          810             MOV     B,#0DH
0049 A4              811             MUL     AB
004A 2400     F      812             ADD     A,#LOW (Tasks_TCB+03H)
004C F8              813             MOV     R0,A
004D E4              814             CLR     A
004E F6              815             MOV     @R0,A
004F 08              816             INC     R0
0050 F6              817             MOV     @R0,A
                     818     ;         Tasks_TCB[prio].stk            = stk;
                     819                             ; SOURCE LINE # 170
0051 AA00     F      820             MOV     R2,stk?246+01H
0053 A900     F      821             MOV     R1,stk?246+02H
0055 E500     F      822             MOV     A,prio?245
0057 75F00D          823             MOV     B,#0DH
005A A4              824             MUL     AB
005B 2400     F      825             ADD     A,#LOW (Tasks_TCB+06H)
005D F8              826             MOV     R0,A
005E A600     F      827             MOV     @R0,stk?246
0060 08              828             INC     R0
A51 MACRO ASSEMBLER  OS_CORE                                                              06/06/2008 11:39:27 PAGE    14

0061 A602            829             MOV     @R0,AR2
0063 08              830             INC     R0
0064 A601            831             MOV     @R0,AR1
                     832     ;         Tasks_TCB[prio].size           = size;//size必须比2+13大
                     833                             ; SOURCE LINE # 171
0066 E500     F      834             MOV     A,prio?245
0068 75F00D          835             MOV     B,#0DH
006B A4              836             MUL     AB
006C 2400     F      837             ADD     A,#LOW (Tasks_TCB+09H)
006E F8              838             MOV     R0,A
006F A600     F      839             MOV     @R0,size?247
0071 08              840             INC     R0
0072 A600     F      841             MOV     @R0,size?247+01H
                     842     ;         Tasks_TCB[prio].stk_used       = 2+13;//2个任务地址+13个特殊功能寄存器
                     843                             ; SOURCE LINE # 172
0074 E500     F      844             MOV     A,prio?245
0076 75F00D          845             MOV     B,#0DH
0079 A4              846             MUL     AB
007A 2400     F      847             ADD     A,#LOW (Tasks_TCB+0BH)
007C F8              848             MOV     R0,A
007D 7600            849             MOV     @R0,#00H
007F 08              850             INC     R0
0080 760F            851             MOV     @R0,#0FH
                     852     ;         
                     853     ;         //设置任务就绪表,让任务就绪
                     854     ;         OSRdyGrp               |= OSMapTbl[prio>>3];     //prio>>3-->prio/8
                     855                             ; SOURCE LINE # 175

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -