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

📄 os-task-switch.lis

📁 ucos-ii-at90S-icc-avr
💻 LIS
📖 第 1 页 / 共 4 页
字号:
                        .module os-task-switch.c
                        .area text(rom, con, rel)
 0000                   .dbfile G:\编程2002-10-15-HOME\做过的项目\2002-10-22\home-c\software\ucos-ii-at90S-icc-avr\os-task-switch\os-task-switch.c
 0000                   .dbfunc e OSInit _OSInit fV
 0000           ;              i -> R16
                        .even
 0000           _OSInit::
 0000                   .dbline -1
 0000                   .dbline 8
 0000           ; //os主要代码
 0000           ; #define  OS_GLOBALS                           /* Declare GLOBAL variables                              */
 0000           ; #include "includes.h"
 0000           ; 
 0000           ; #define  OS_MASTER_FILE                       /* Prevent the following files from including includes.h */
 0000           ; 
 0000           ; void        OSInit(void)
 0000           ; {
 0000                   .dbline 11
 0000           ;   INT8U i;
 0000           ; 
 0000           ;   OSIntNesting=0;             /* Interrupt nesting level                              */
 0000 2224              clr R2
 0002 20929901          sts _OSIntNesting,R2
 0006                   .dbline 12
 0006           ;   OSLockNesting=0;            /* Multitasking lock nesting level                      */
 0006 20929801          sts _OSLockNesting,R2
 000A                   .dbline 13
 000A           ;   OSPrioCur=0xff;                /* Priority of current task                             */
 000A 8FEF              ldi R24,255
 000C 80939701          sts _OSPrioCur,R24
 0010                   .dbline 14
 0010           ;   OSPrioHighRdy=0xff;            /* Priority of highest priority task                    */
 0010 80939601          sts _OSPrioHighRdy,R24
 0014                   .dbline 15
 0014           ;   OSRunning = FALSE;
 0014 2092A001          sts _OSRunning,R2
 0018                   .dbline 17
 0018           ; 
 0018           ;   OSTCBCur=0;                        /* Pointer to currently running TCB              */
 0018 3324              clr R3
 001A 30929501          sts _OSTCBCur+1,R3
 001E 20929401          sts _OSTCBCur,R2
 0022                   .dbline 18
 0022           ;   OSTCBHighRdy=0;                    /* Pointer to highest priority TCB ready to run  */
 0022 30929301          sts _OSTCBHighRdy+1,R3
 0026 20929201          sts _OSTCBHighRdy,R2
 002A                   .dbline 20
 002A           ; /*init task tcb pointers list*/
 002A           ;   for(i=0;i<OS_TASK_COUNT;i++)
 002A 0027              clr R16
 002C 0DC0              rjmp L5
 002E           L2:
 002E                   .dbline 21
 002E 80E0              ldi R24,<_OSpTCBList
 0030 90E0              ldi R25,>_OSpTCBList
 0032 E02F              mov R30,R16
 0034 FF27              clr R31
 0036 EE0F              lsl R30
 0038 FF1F              rol R31
 003A E80F              add R30,R24
 003C F91F              adc R31,R25
 003E 2224              clr R2
 0040 3324              clr R3
 0042 2082              std z+0,R2
 0044 3182              std z+1,R3
 0046           L3:
 0046                   .dbline 20
 0046 0395              inc R16
 0048           L5:
 0048                   .dbline 20
 0048 0330              cpi R16,3
 004A 88F3              brlo L2
 004C                   .dbline -2
 004C                   .dbline 22
 004C           ;     OSpTCBList[i]=(OS_TCB*)0;
 004C           ; }
 004C           L1:
 004C                   .dbline 0 ; func end
 004C 0895              ret
 004E                   .dbsym r i 16 c
 004E                   .dbend
 004E                   .dbfunc e OSTaskCreate _OSTaskCreate fc
 004E           ;            psp -> R10,R11
 004E           ;            err -> R20
 004E           ;           prio -> R22
 004E           ;       stk_size -> y+14
 004E           ;           ptos -> y+12
 004E           ;          pdata -> y+10
 004E           ;           task -> R10,R11
 004E           ;           ptcb -> R20,R21
                        .even
 004E           _OSTaskCreate::
 004E 00D0              rcall push_gset3
 0050 A22E              mov R10,R18
 0052 B32E              mov R11,R19
 0054 402F              mov R20,R16
 0056 512F              mov R21,R17
 0058 2497              sbiw R28,4
 005A 6889              ldd R22,y+16
 005C                   .dbline -1
 005C                   .dbline 29
 005C           ; /*
 005C           ; OS_STK *      OSTaskStkInit (void (*task)(void *pd),void *pdata, OS_STK *ptos);
 005C           ; INT8U       OSTCBInit(OS_TCB *ptcb,INT8U prio, OS_STK *ptos,INT16U stk_size);
 005C           ; */
 005C           ; 
 005C           ; INT8U       OSTaskCreate(OS_TCB *ptcb,void (*task)(void *pd), void *pdata, OS_STK *ptos,INT16U stk_size, INT8U prio)
 005C           ; {
 005C                   .dbline 33
 005C           ;     void   *psp;
 005C           ;     INT8U   err;
 005C           ; 
 005C           ;     if (prio > OS_LOWEST_PRIO) {             /* Make sure priority is within allowable range           */
 005C 82E0              ldi R24,2
 005E 8617              cp R24,R22
 0060 10F4              brsh L7
 0062                   .dbline 33
 0062                   .dbline 34
 0062           ;         return (OSERR_PRIO_INVALID);
 0062 01E0              ldi R16,1
 0064 49C0              rjmp L6
 0066           L7:
 0066                   .dbline 36
 0066           ;     }
 0066           ;     OS_ENTER_CRITICAL();
 0066 0A93              st -y,r16
 0068 0FB7               in r16,0x3f
 006A F894               cli
 006C 0F93               push r16
 006E 0991              ld r16,y+
 0070                   .dbline 36
 0070                   .dbline 37
 0070           ;     if (OSpTCBList[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority  */
 0070 80E0              ldi R24,<_OSpTCBList
 0072 90E0              ldi R25,>_OSpTCBList
 0074 E62F              mov R30,R22
 0076 FF27              clr R31
 0078 EE0F              lsl R30
 007A FF1F              rol R31
 007C E80F              add R30,R24
 007E F91F              adc R31,R25
 0080 2080              ldd R2,z+0
 0082 3180              ldd R3,z+1
 0084 2220              tst R2
 0086 99F5              brne L9
 0088 3320              tst R3
 008A 89F5              brne L9
 008C           X0:
 008C                   .dbline 37
 008C                   .dbline 38
 008C           ;         OSpTCBList[prio] = ptcb;    /* Reserve the priority to prevent others from doing ...  */
 008C 80E0              ldi R24,<_OSpTCBList
 008E 90E0              ldi R25,>_OSpTCBList
 0090 E62F              mov R30,R22
 0092 FF27              clr R31
 0094 EE0F              lsl R30
 0096 FF1F              rol R31
 0098 E80F              add R30,R24
 009A F91F              adc R31,R25
 009C 4083              std z+0,R20
 009E 5183              std z+1,R21
 00A0                   .dbline 39
 00A0           ;         OS_EXIT_CRITICAL();
 00A0 0A93              st -y,r16
 00A2 0F91              pop r16
 00A4 0FBF              out 0x3F,r16
 00A6 0991              ld r16,y+
 00A8                   .dbline 39
 00A8                   .dbline 40
 00A8           ;         psp = (void *)OSTaskStkInit(task, pdata, ptos, stk_size); /* Initialize the task's stack              */
 00A8 0E84              ldd R0,y+14
 00AA 1F84              ldd R1,y+15
 00AC 0A82              std y+2,R0
 00AE 1B82              std y+3,R1
 00B0 0C84              ldd R0,y+12
 00B2 1D84              ldd R1,y+13
 00B4 0882              std y+0,R0
 00B6 1982              std y+1,R1
 00B8 2A85              ldd R18,y+10
 00BA 3B85              ldd R19,y+11
 00BC 0A2D              mov R16,R10
 00BE 1B2D              mov R17,R11
 00C0 00D0              rcall _OSTaskStkInit
 00C2 A02E              mov R10,R16
 00C4 B12E              mov R11,R17
 00C6                   .dbline 41
 00C6           ;         err = OSTCBInit(ptcb,prio, psp,stk_size);         
 00C6 0E84              ldd R0,y+14
 00C8 1F84              ldd R1,y+15
 00CA 0A82              std y+2,R0
 00CC 1B82              std y+3,R1
 00CE A882              std y+0,R10
 00D0 B982              std y+1,R11
 00D2 262F              mov R18,R22
 00D4 042F              mov R16,R20
 00D6 152F              mov R17,R21
 00D8 12D0              rcall _OSTCBInit
 00DA 402F              mov R20,R16
 00DC                   .dbline 42
 00DC           ;         if (err == OS_NO_ERR) {
 00DC 0023              tst R16
 00DE 29F4              brne L11
 00E0                   .dbline 42
 00E0                   .dbline 43
 00E0           ;             if (OSRunning) {                 /* Find highest priority task if multitasking has started */
 00E0 2090A001          lds R2,_OSRunning
 00E4 2220              tst R2
 00E6 09F0              breq L12
 00E8                   .dbline 43
 00E8                   .dbline 44
 00E8           ;                 OSSched();
 00E8 44D0              rcall _OSSched
 00EA                   .dbline 45
 00EA           ;             }
 00EA                   .dbline 46
 00EA           L11:
 00EA                   .dbline 46
 00EA           ;         } else {
 00EA                   .dbline 47
 00EA           ;         }
 00EA           L12:
 00EA                   .dbline 48
 00EA           ;         return (err);
 00EA 042F              mov R16,R20
 00EC 05C0              rjmp L6
 00EE           L9:
 00EE                   .dbline 49
 00EE           ;     } else {
 00EE                   .dbline 50
 00EE           ;         OS_EXIT_CRITICAL();
 00EE 0A93              st -y,r16
 00F0 0F91              pop r16
 00F2 0FBF              out 0x3F,r16
 00F4 0991              ld r16,y+
 00F6                   .dbline 50
 00F6                   .dbline 51
 00F6           ;         return (OSERR_PRIO_EXIST);
 00F6 03E0              ldi R16,3
 00F8                   .dbline -2
 00F8           L6:
 00F8 2496              adiw R28,4
 00FA 00D0              rcall pop_gset3
 00FC                   .dbline 0 ; func end
 00FC 0895              ret
 00FE                   .dbsym r psp 10 pV
 00FE                   .dbsym r err 20 c
 00FE                   .dbsym r prio 22 c
 00FE                   .dbsym l stk_size 14 i
 00FE                   .dbsym l ptos 12 pc
 00FE                   .dbsym l pdata 10 pV
 00FE                   .dbsym r task 10 pfV
 00FE                   .dbsym r ptcb 20 pX
 00FE                   .dbend
 00FE                   .dbfunc e OSTCBInit _OSTCBInit fc
 00FE           ;       stk_size -> y+6
 00FE           ;           ptos -> y+4
 00FE           ;           prio -> R22
 00FE           ;           ptcb -> R20,R21
                        .even
 00FE           _OSTCBInit::
 00FE 00D0              rcall push_gset2
 0100 622F              mov R22,R18
 0102 402F              mov R20,R16
 0104 512F              mov R21,R17
 0106                   .dbline -1
 0106                   .dbline 99
 0106           ;     }
 0106           ; }
 0106           ; 
 0106           ; /*
 0106           ; *********************************************************************************************************
 0106           ; *                                            INITIALIZE TCB
 0106           ; *
 0106           ; * Description: This function is internal to uC/OS-II and is used to initialize a Task Control Block when
 0106           ; *              a task is created (see OSTaskCreate() and OSTaskCreateExt()).
 0106           ; *
 0106           ; * Arguments  : prio          is the priority of the task being created
 0106           ; *
 0106           ; *              ptos          is a pointer to the task's top-of-stack assuming that the CPU registers
 0106           ; *                            have been placed on the stack.  Note that the top-of-stack corresponds to a 
 0106           ; *                            'high' memory location is OS_STK_GROWTH is set to 1 and a 'low' memory
 0106           ; *                            location if OS_STK_GROWTH is set to 0.  Note that stack growth is CPU
 0106           ; *                            specific.
 0106           ; *
 0106           ; *              pbos          is a pointer to the bottom of stack.  A NULL pointer is passed if called by
 0106           ; *                            'OSTaskCreate()'.
 0106           ; *
 0106           ; *              id            is the task's ID (0..65535)
 0106           ; *
 0106           ; *              stk_size      is the size of the stack (in 'stack units').  If the stack units are INT8Us
 0106           ; *                            then, 'stk_size' contains the number of bytes for the stack.  If the stack
 0106           ; *                            units are INT32Us then, the stack contains '4 * stk_size' bytes.  The stack
 0106           ; *                            units are established by the #define constant OS_STK which is CPU
 0106           ; *                            specific.  'stk_size' is 0 if called by 'OSTaskCreate()'.
 0106           ; *

⌨️ 快捷键说明

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