📄 os-task-switch.lis
字号:
.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 + -