os_task.txt
来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 1,089 行 · 第 1/4 页
TXT
1,089 行
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 934] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_task.o --depend=.\rvmdk\os_task.d --device=DARMP --apcs=interwork -O1 -I. -I..\BSP -I..\..\..\..\uCOS-II\Ports\ARM\Generic\RealView -I..\..\..\..\uCOS-II\Source -I..\..\..\..\uC-CPU -I..\..\..\..\uC-CPU\ARM\RealView -I..\..\..\..\uC-LIB -I..\..\..\..\uC-TCPIP\IF -I..\..\..\..\uC-TCPIP\IF\Ether -I..\..\..\..\uC-TCPIP\NIC\ETHER\LPC2378 -I..\..\..\..\uC-TCPIP\NIC\ETHER\PHY -I..\..\..\..\uC-TCPIP\NIC\ETHER\PHY\DP83848 -I..\..\..\..\uC-TCPIP\OS\uCOS-II -I..\..\..\..\uC-TCPIP\Source -I..\..\..\..\uC-LCD\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\RS-232\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\TCPIP\Source -I..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -Ie:\Keil_ARM\ARM\INC\Philips -D__IN_CHIP --omf_browse=.\rvmdk\os_task.crf ..\Source\OS_TASK.C]
ARM
AREA ||.text||, CODE, READONLY, ALIGN=2
OSTaskChangePrio PROC
;;;40 INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)
;;;41 {
000000 e92d47f0 PUSH {r4-r10,lr}
000004 e1a0a000 MOV r10,r0
000008 e1a04001 MOV r4,r1
;;;42 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;43 OS_CPU_SR cpu_sr;
;;;44 #endif
;;;45
;;;46 #if OS_EVENT_EN > 0
;;;47 OS_EVENT *pevent;
;;;48 #endif
;;;49
;;;50 OS_TCB *ptcb;
;;;51 INT8U x;
;;;52 INT8U y;
;;;53 INT8U bitx;
;;;54 INT8U bity;
;;;55
;;;56
;;;57
;;;58 #if OS_ARG_CHK_EN > 0
;;;59 if ((oldprio >= OS_LOWEST_PRIO && oldprio != OS_PRIO_SELF) ||
00000c e35a000c CMP r10,#0xc
000010 3a000001 BCC |L1.28|
000014 e35a00ff CMP r10,#0xff
000018 1a000001 BNE |L1.36|
|L1.28|
;;;60 newprio >= OS_LOWEST_PRIO) {
00001c e354000c CMP r4,#0xc
000020 3a000002 BCC |L1.48|
|L1.36|
;;;61 return (OS_PRIO_INVALID);
000024 e3a0002a MOV r0,#0x2a
|L1.40|
000028 e8bd47f0 POP {r4-r10,lr}
;;;62 }
;;;63 #endif
;;;64 OS_ENTER_CRITICAL();
;;;65 if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) { /* New priority must not already exist */
;;;66 OS_EXIT_CRITICAL();
;;;67 return (OS_PRIO_EXIST);
;;;68 } else {
;;;69 OSTCBPrioTbl[newprio] = (OS_TCB *)1; /* Reserve the entry to prevent others */
;;;70 OS_EXIT_CRITICAL();
;;;71 y = newprio >> 3; /* Precompute to reduce INT. latency */
;;;72 bity = OSMapTbl[y];
;;;73 x = newprio & 0x07;
;;;74 bitx = OSMapTbl[x];
;;;75 OS_ENTER_CRITICAL();
;;;76 if (oldprio == OS_PRIO_SELF) { /* See if changing self */
;;;77 oldprio = OSTCBCur->OSTCBPrio; /* Yes, get priority */
;;;78 }
;;;79 ptcb = OSTCBPrioTbl[oldprio];
;;;80 if (ptcb != (OS_TCB *)0) { /* Task to change must exist */
;;;81 OSTCBPrioTbl[oldprio] = (OS_TCB *)0; /* Remove TCB from old priority */
;;;82 if ((OSRdyTbl[ptcb->OSTCBY] & ptcb->OSTCBBitX) != 0x00) { /* If task is ready make it not */
;;;83 if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) {
;;;84 OSRdyGrp &= ~ptcb->OSTCBBitY;
;;;85 }
;;;86 OSRdyGrp |= bity; /* Make new priority ready to run */
;;;87 OSRdyTbl[y] |= bitx;
;;;88 #if OS_EVENT_EN > 0
;;;89 } else {
;;;90 pevent = ptcb->OSTCBEventPtr;
;;;91 if (pevent != (OS_EVENT *)0) { /* Remove from event wait list */
;;;92 if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
;;;93 pevent->OSEventGrp &= ~ptcb->OSTCBBitY;
;;;94 }
;;;95 pevent->OSEventGrp |= bity; /* Add new priority to wait list */
;;;96 pevent->OSEventTbl[y] |= bitx;
;;;97 }
;;;98 #endif
;;;99 }
;;;100 OSTCBPrioTbl[newprio] = ptcb; /* Place pointer to TCB @ new priority */
;;;101 ptcb->OSTCBPrio = newprio; /* Set new task priority */
;;;102 ptcb->OSTCBY = y;
;;;103 ptcb->OSTCBX = x;
;;;104 ptcb->OSTCBBitY = bity;
;;;105 ptcb->OSTCBBitX = bitx;
;;;106 OS_EXIT_CRITICAL();
;;;107 OS_Sched(); /* Run highest priority task ready */
;;;108 return (OS_NO_ERR);
;;;109 } else {
;;;110 OSTCBPrioTbl[newprio] = (OS_TCB *)0; /* Release the reserved prio. */
;;;111 OS_EXIT_CRITICAL();
;;;112 return (OS_PRIO_ERR); /* Task to change didn't exist */
;;;113 }
;;;114 }
;;;115 }
00002c e12fff1e BX lr
|L1.48|
000030 ef000002 SVC #0x2 ;64
000034 e59f980c LDR r9,|L1.2120|
000038 e7990104 LDR r0,[r9,r4,LSL #2] ;65
00003c e3500000 CMP r0,#0 ;65
000040 0a000002 BEQ |L1.80|
000044 ef000003 SVC #0x3 ;66
000048 e3a00028 MOV r0,#0x28 ;67
00004c eafffff5 B |L1.40|
|L1.80|
000050 e3a00001 MOV r0,#1 ;69
000054 e7890104 STR r0,[r9,r4,LSL #2] ;69
000058 ef000003 SVC #0x3 ;70
00005c e1a051a4 LSR r5,r4,#3 ;71
000060 e59f07e4 LDR r0,|L1.2124|
000064 e7d07005 LDRB r7,[r0,r5] ;72
000068 e2048007 AND r8,r4,#7 ;73
00006c e7d06008 LDRB r6,[r0,r8] ;74
000070 ef000002 SVC #0x2 ;75
000074 e35a00ff CMP r10,#0xff ;76
000078 1a000002 BNE |L1.136|
00007c e59f07cc LDR r0,|L1.2128|
000080 e5900000 LDR r0,[r0,#0] ;77 ; OSTCBCur
000084 e5d0a02d LDRB r10,[r0,#0x2d] ;77
|L1.136|
000088 e799010a LDR r0,[r9,r10,LSL #2] ;79
00008c e3a01000 MOV r1,#0 ;79
000090 e3500000 CMP r0,#0 ;80
000094 0a000032 BEQ |L1.356|
000098 e789110a STR r1,[r9,r10,LSL #2] ;81
00009c e5d0202f LDRB r2,[r0,#0x2f] ;82
0000a0 e59fc7ac LDR r12,|L1.2132|
0000a4 e5d03030 LDRB r3,[r0,#0x30] ;82
0000a8 e7dc1002 LDRB r1,[r12,r2] ;82
0000ac e1110003 TST r1,r3 ;82
0000b0 0a00000e BEQ |L1.240|
0000b4 e1d11003 BICS r1,r1,r3 ;83
0000b8 e7cc1002 STRB r1,[r12,r2] ;83
0000bc e59f2794 LDR r2,|L1.2136|
0000c0 1a000003 BNE |L1.212|
0000c4 e5d01031 LDRB r1,[r0,#0x31] ;84
0000c8 e5d23000 LDRB r3,[r2,#0] ;84 ; OSRdyGrp
0000cc e1c31001 BIC r1,r3,r1 ;84
0000d0 e5c21000 STRB r1,[r2,#0] ;84 ; OSRdyGrp
|L1.212|
0000d4 e5d21000 LDRB r1,[r2,#0] ;86 ; OSRdyGrp
0000d8 e1811007 ORR r1,r1,r7 ;86
0000dc e5c21000 STRB r1,[r2,#0] ;86 ; OSRdyGrp
0000e0 e7dc1005 LDRB r1,[r12,r5] ;87
0000e4 e1811006 ORR r1,r1,r6 ;87
0000e8 e7cc1005 STRB r1,[r12,r5] ;87
0000ec ea000012 B |L1.316|
|L1.240|
0000f0 e590101c LDR r1,[r0,#0x1c] ;90
0000f4 e3510000 CMP r1,#0 ;91
0000f8 0a00000f BEQ |L1.316|
0000fc e0822001 ADD r2,r2,r1 ;92
000100 e5d2c008 LDRB r12,[r2,#8] ;92
000104 e1dc3003 BICS r3,r12,r3 ;92
000108 e5c23008 STRB r3,[r2,#8] ;92
00010c 1a000003 BNE |L1.288|
000110 e5d12001 LDRB r2,[r1,#1] ;93
000114 e5d03031 LDRB r3,[r0,#0x31] ;93
000118 e1c22003 BIC r2,r2,r3 ;93
00011c e5c12001 STRB r2,[r1,#1] ;93
|L1.288|
000120 e5d12001 LDRB r2,[r1,#1] ;95
000124 e1822007 ORR r2,r2,r7 ;95
000128 e5c12001 STRB r2,[r1,#1] ;95
00012c e0811005 ADD r1,r1,r5 ;96
000130 e5d12008 LDRB r2,[r1,#8] ;96
000134 e1822006 ORR r2,r2,r6 ;96
000138 e5c12008 STRB r2,[r1,#8] ;96
|L1.316|
00013c e7890104 STR r0,[r9,r4,LSL #2] ;100
000140 e5c0402d STRB r4,[r0,#0x2d] ;101
000144 e5c0502f STRB r5,[r0,#0x2f] ;102
000148 e5c0802e STRB r8,[r0,#0x2e] ;103
00014c e5c07031 STRB r7,[r0,#0x31] ;104
000150 e5c06030 STRB r6,[r0,#0x30] ;105
000154 ef000003 SVC #0x3 ;106
000158 ebfffffe BL OS_Sched
00015c e3a00000 MOV r0,#0 ;108
000160 eaffffb0 B |L1.40|
|L1.356|
000164 e7891104 STR r1,[r9,r4,LSL #2] ;110
000168 ef000003 SVC #0x3 ;111
00016c e3a00029 MOV r0,#0x29 ;112
000170 eaffffac B |L1.40|
;;;116 #endif
ENDP
OSTaskCreate PROC
;;;158 INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
;;;159 {
000174 e92d43fe PUSH {r1-r9,lr}
000178 e1a05000 MOV r5,r0
00017c e1a07001 MOV r7,r1
000180 e1a08002 MOV r8,r2
000184 e1a04003 MOV r4,r3
;;;160 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;161 OS_CPU_SR cpu_sr;
;;;162 #endif
;;;163 OS_STK *psp;
;;;164 INT8U err;
;;;165
;;;166
;;;167 #if OS_ARG_CHK_EN > 0
;;;168 if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */
000188 e354000c CMP r4,#0xc
00018c 9a000002 BLS |L1.412|
;;;169 return (OS_PRIO_INVALID);
000190 e3a0002a MOV r0,#0x2a
|L1.404|
000194 e8bd43fe POP {r1-r9,lr}
;;;170 }
;;;171 #endif
;;;172 OS_ENTER_CRITICAL();
;;;173 if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */
;;;174 OSTCBPrioTbl[prio] = (OS_TCB *)1; /* Reserve the priority to prevent others from doing ... */
;;;175 /* ... the same thing until task is created. */
;;;176 OS_EXIT_CRITICAL();
;;;177 psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0); /* Initialize the task's stack */
;;;178 err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);
;;;179 if (err == OS_NO_ERR) {
;;;180 OS_ENTER_CRITICAL();
;;;181 OSTaskCtr++; /* Increment the #tasks counter */
;;;182 OS_EXIT_CRITICAL();
;;;183 if (OSRunning == TRUE) { /* Find highest priority task if multitasking has started */
;;;184 OS_Sched();
;;;185 }
;;;186 } else {
;;;187 OS_ENTER_CRITICAL();
;;;188 OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others */
;;;189 OS_EXIT_CRITICAL();
;;;190 }
;;;191 return (err);
;;;192 }
;;;193 OS_EXIT_CRITICAL();
;;;194 return (OS_PRIO_EXIST);
;;;195 }
000198 e12fff1e BX lr
|L1.412|
00019c ef000002 SVC #0x2 ;172
0001a0 e59f66a0 LDR r6,|L1.2120|
0001a4 e7960104 LDR r0,[r6,r4,LSL #2] ;173
0001a8 e3500000 CMP r0,#0 ;173
0001ac 1a000024 BNE |L1.580|
0001b0 e3a00001 MOV r0,#1 ;174
0001b4 e7860104 STR r0,[r6,r4,LSL #2] ;174
0001b8 ef000003 SVC #0x3 ;176
0001bc e3a03000 MOV r3,#0 ;177
0001c0 e1a02008 MOV r2,r8 ;177
0001c4 e1a01007 MOV r1,r7 ;177
0001c8 e1a00005 MOV r0,r5 ;177
0001cc ebfffffe BL OSTaskStkInit
0001d0 e3a03000 MOV r3,#0 ;178
0001d4 e1a01000 MOV r1,r0 ;178
0001d8 e1a02003 MOV r2,r3 ;178
0001dc e1a00004 MOV r0,r4 ;178
0001e0 e58d3000 STR r3,[sp,#0] ;178
0001e4 e58d3004 STR r3,[sp,#4] ;178
0001e8 e58d3008 STR r3,[sp,#8] ;178
0001ec ebfffffe BL OS_TCBInit
0001f0 e1a05000 MOV r5,r0 ;178
0001f4 e3550000 CMP r5,#0 ;179
0001f8 1a00000b BNE |L1.556|
0001fc ef000002 SVC #0x2 ;180
000200 e59f0654 LDR r0,|L1.2140|
000204 e5d01000 LDRB r1,[r0,#0] ;181 ; OSTaskCtr
000208 e2811001 ADD r1,r1,#1 ;181
00020c e5c01000 STRB r1,[r0,#0] ;181 ; OSTaskCtr
000210 ef000003 SVC #0x3 ;182
000214 e59f0644 LDR r0,|L1.2144|
000218 e5d00000 LDRB r0,[r0,#0] ;183 ; OSRunning
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?