os_sem.txt

来自「针对STM32F103的UCOS移植」· 文本 代码 · 共 811 行 · 第 1/3 页

TXT
811
字号
000102  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.262|
000106  2300              MOVS     r3,#0                 ;220
000108  2201              MOVS     r2,#1                 ;220
00010a  4619              MOV      r1,r3                 ;220
00010c  4620              MOV      r0,r4                 ;220
00010e  f7fffffe          BL       OS_EventTaskRdy
000112  7aa0              LDRB     r0,[r4,#0xa]          ;219
000114  2800              CMP      r0,#0                 ;219
000116  d1f6              BNE      |L1.262|
                  |L1.280|
000118  73e7              STRB     r7,[r4,#0xf]          ;223
00011a  f8849010          STRB     r9,[r4,#0x10]         ;224
00011e  f8849000          STRB     r9,[r4,#0]            ;226
000122  f8d80000          LDR      r0,[r8,#0]            ;227  ; OSEventFreeList
000126  6060              STR      r0,[r4,#4]            ;227
000128  f8a49008          STRH     r9,[r4,#8]            ;228
00012c  f8c84000          STR      r4,[r8,#0]            ;229  ; OSEventFreeList
000130  4650              MOV      r0,r10                ;230
000132  f7fffffe          BL       OS_CPU_SR_Restore
000136  2e01              CMP      r6,#1                 ;231
000138  d101              BNE      |L1.318|
00013a  f7fffffe          BL       OS_Sched
                  |L1.318|
00013e  f8859000          STRB     r9,[r5,#0]            ;234
000142  2000              MOVS     r0,#0                 ;235
000144  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.328|
000148  4650              MOV      r0,r10                ;239
00014a  f7fffffe          BL       OS_CPU_SR_Restore
00014e  2007              MOVS     r0,#7                 ;240
000150  7028              STRB     r0,[r5,#0]            ;240
000152  4620              MOV      r0,r4                 ;241
000154  e8bd9ff0          POP      {r4-r12,pc}
;;;246    #endif
                          ENDP

                  OSSemPend PROC
;;;281    void  OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;282    {
000158  e92d47f0          PUSH     {r4-r10,lr}
00015c  4605              MOV      r5,r0
00015e  4688              MOV      r8,r1
000160  4614              MOV      r4,r2
;;;283        INT8U      pend_stat;
;;;284    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;285        OS_CPU_SR  cpu_sr = 0;
;;;286    #endif
;;;287    
;;;288    
;;;289    
;;;290    #if OS_ARG_CHK_EN > 0
;;;291        if (perr == (INT8U *)0) {                         /* Validate 'perr'                               */
000162  2c00              CMP      r4,#0
000164  d002              BEQ      |L1.364|
;;;292            return;
;;;293        }
;;;294        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
000166  b91d              CBNZ     r5,|L1.368|
;;;295            *perr = OS_ERR_PEVENT_NULL;
000168  2004              MOVS     r0,#4
00016a  7020              STRB     r0,[r4,#0]
                  |L1.364|
;;;296            return;
;;;297        }
;;;298    #endif
;;;299        if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
;;;300            *perr = OS_ERR_EVENT_TYPE;
;;;301            return;
;;;302        }
;;;303        if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
;;;304            *perr = OS_ERR_PEND_ISR;                      /* ... can't PEND from an ISR                    */
;;;305            return;
;;;306        }
;;;307        if (OSLockNesting > 0) {                          /* See if called with scheduler locked ...       */
;;;308            *perr = OS_ERR_PEND_LOCKED;                   /* ... can't PEND when locked                    */
;;;309            return;
;;;310        }
;;;311        OS_ENTER_CRITICAL();
;;;312        if (pevent->OSEventCnt > 0) {                     /* If sem. is positive, resource available ...   */
;;;313            pevent->OSEventCnt--;                         /* ... decrement semaphore only if positive.     */
;;;314            OS_EXIT_CRITICAL();
;;;315            *perr = OS_ERR_NONE;
;;;316            return;
;;;317        }
;;;318                                                          /* Otherwise, must wait until event occurs       */
;;;319        OSTCBCur->OSTCBStat     |= OS_STAT_SEM;           /* Resource not available, pend on semaphore     */
;;;320        OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
;;;321        OSTCBCur->OSTCBDly       = timeout;               /* Store pend timeout in TCB                     */
;;;322        OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
;;;323        OS_EXIT_CRITICAL();
;;;324        OS_Sched();                                       /* Find next highest priority task ready         */
;;;325        OS_ENTER_CRITICAL();
;;;326        if (OSTCBCur->OSTCBStatPend != OS_STAT_PEND_OK) { /* See if we timed-out or aborted                */
;;;327            pend_stat = OSTCBCur->OSTCBStatPend;
;;;328            OS_EventTOAbort(pevent);
;;;329            OS_EXIT_CRITICAL();
;;;330            switch (pend_stat) {
;;;331                case OS_STAT_PEND_TO:
;;;332                default:
;;;333                     *perr = OS_ERR_TIMEOUT;              /* Indicate that didn't get event within TO      */
;;;334                     break;
;;;335    
;;;336                case OS_STAT_PEND_ABORT:
;;;337                     *perr = OS_ERR_PEND_ABORT;           /* Indicate that we aborted                      */
;;;338                     break;
;;;339            }
;;;340            return;
;;;341        }
;;;342        OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
;;;343        OS_EXIT_CRITICAL();
;;;344        *perr = OS_ERR_NONE;
;;;345    }
00016c  e8bd87f0          POP      {r4-r10,pc}
                  |L1.368|
000170  7828              LDRB     r0,[r5,#0]            ;299
000172  2803              CMP      r0,#3                 ;299
000174  d003              BEQ      |L1.382|
000176  2001              MOVS     r0,#1                 ;300
000178  7020              STRB     r0,[r4,#0]            ;300
00017a  e8bd87f0          POP      {r4-r10,pc}
                  |L1.382|
00017e  4882              LDR      r0,|L1.904|
000180  7800              LDRB     r0,[r0,#0]            ;303  ; OSIntNesting
000182  b118              CBZ      r0,|L1.396|
000184  2002              MOVS     r0,#2                 ;304
000186  7020              STRB     r0,[r4,#0]            ;304
000188  e8bd87f0          POP      {r4-r10,pc}
                  |L1.396|
00018c  4880              LDR      r0,|L1.912|
00018e  7800              LDRB     r0,[r0,#0]            ;307  ; OSLockNesting
000190  b118              CBZ      r0,|L1.410|
000192  200d              MOVS     r0,#0xd               ;308
000194  7020              STRB     r0,[r4,#0]            ;308
000196  e8bd87f0          POP      {r4-r10,pc}
                  |L1.410|
00019a  f7fffffe          BL       OS_CPU_SR_Save
00019e  4681              MOV      r9,r0                 ;311
0001a0  8928              LDRH     r0,[r5,#8]            ;312
0001a2  2700              MOVS     r7,#0                 ;312
0001a4  b138              CBZ      r0,|L1.438|
0001a6  1e40              SUBS     r0,r0,#1              ;313
0001a8  8128              STRH     r0,[r5,#8]            ;313
0001aa  4648              MOV      r0,r9                 ;314
0001ac  f7fffffe          BL       OS_CPU_SR_Restore
0001b0  7027              STRB     r7,[r4,#0]            ;315
0001b2  e8bd87f0          POP      {r4-r10,pc}
                  |L1.438|
0001b6  4e77              LDR      r6,|L1.916|
0001b8  6831              LDR      r1,[r6,#0]            ;319  ; OSTCBCur
0001ba  f891002c          LDRB     r0,[r1,#0x2c]         ;319
0001be  f0400001          ORR      r0,r0,#1              ;319
0001c2  f881002c          STRB     r0,[r1,#0x2c]         ;319
0001c6  f881702d          STRB     r7,[r1,#0x2d]         ;320
0001ca  f8a1802a          STRH     r8,[r1,#0x2a]         ;321
0001ce  4628              MOV      r0,r5                 ;322
0001d0  f7fffffe          BL       OS_EventTaskWait
0001d4  4648              MOV      r0,r9                 ;323
0001d6  f7fffffe          BL       OS_CPU_SR_Restore
0001da  f7fffffe          BL       OS_Sched
0001de  f7fffffe          BL       OS_CPU_SR_Save
0001e2  4680              MOV      r8,r0                 ;325
0001e4  6831              LDR      r1,[r6,#0]            ;326  ; OSTCBCur
0001e6  f891602d          LDRB     r6,[r1,#0x2d]         ;326
0001ea  b17e              CBZ      r6,|L1.524|
0001ec  4628              MOV      r0,r5                 ;328
0001ee  f7fffffe          BL       OS_EventTOAbort
0001f2  4640              MOV      r0,r8                 ;329
0001f4  f7fffffe          BL       OS_CPU_SR_Restore
0001f8  2e02              CMP      r6,#2                 ;330
0001fa  d003              BEQ      |L1.516|
0001fc  200a              MOVS     r0,#0xa               ;333
0001fe  7020              STRB     r0,[r4,#0]            ;333
000200  e8bd87f0          POP      {r4-r10,pc}
                  |L1.516|
000204  200e              MOVS     r0,#0xe               ;337
000206  7020              STRB     r0,[r4,#0]            ;337
000208  e8bd87f0          POP      {r4-r10,pc}
                  |L1.524|
00020c  61cf              STR      r7,[r1,#0x1c]         ;342
00020e  4640              MOV      r0,r8                 ;343
000210  f7fffffe          BL       OS_CPU_SR_Restore
000214  7027              STRB     r7,[r4,#0]            ;344
000216  e8bd87f0          POP      {r4-r10,pc}
;;;346    
                          ENDP

                  OSSemPendAbort PROC
;;;382    INT8U  OSSemPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;383    {
00021a  e92d41f0          PUSH     {r4-r8,lr}
00021e  4605              MOV      r5,r0
000220  4688              MOV      r8,r1
000222  4616              MOV      r6,r2
;;;384        INT8U      nbr_tasks;
;;;385    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;386        OS_CPU_SR  cpu_sr = 0;
;;;387    #endif
;;;388    
;;;389    
;;;390    
;;;391    #if OS_ARG_CHK_EN > 0
;;;392        if (perr == (INT8U *)0) {                         /* Validate 'perr'                               */
000224  b916              CBNZ     r6,|L1.556|
;;;393            return (0);
000226  2000              MOVS     r0,#0
;;;394        }
;;;395        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;;;396            *perr = OS_ERR_PEVENT_NULL;
;;;397            return (0);
;;;398        }
;;;399    #endif
;;;400        if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
;;;401            *perr = OS_ERR_EVENT_TYPE;
;;;402            return (0);
;;;403        }
;;;404        OS_ENTER_CRITICAL();
;;;405        if (pevent->OSEventGrp != 0) {                    /* See if any task waiting on semaphore?         */
;;;406            nbr_tasks = 0;
;;;407            switch (opt) {
;;;408                case OS_PEND_OPT_BROADCAST:               /* Do we need to abort ALL waiting tasks?        */
;;;409                     while (pevent->OSEventGrp != 0) {    /* Yes, ready ALL tasks waiting on semaphore     */
;;;410                         (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_ABORT);
;;;411                         nbr_tasks++;
;;;412                     }
;;;413                     break;
;;;414                     
;;;415                case OS_PEND_OPT_NONE:                    /* No,  ready HPT       waiting on semaphore     */
;;;416                default:
;;;417                     (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_ABORT);
;;;418                     nbr_tasks++;
;;;419                     break;
;;;420            }
;;;421            OS_EXIT_CRITICAL();
;;;422            OS_Sched();                                   /* Find HPT ready to run                         */
;;;423            *perr = OS_ERR_PEND_ABORT;
;;;424            return (nbr_tasks);
;;;425        }
;;;426        OS_EXIT_CRITICAL();
;;;427        *perr = OS_ERR_NONE;
;;;428        return (0);                                       /* No tasks waiting on semaphore                 */
;;;429    }
000228  e8bd81f0          POP      {r4-r8,pc}
                  |L1.556|
00022c  b925              CBNZ     r5,|L1.568|
00022e  2004              MOVS     r0,#4                 ;396
000230  7030              STRB     r0,[r6,#0]            ;396
000232  2000              MOVS     r0,#0                 ;397
000234  e8bd81f0          POP      {r4-r8,pc}
                  |L1.568|
000238  7829              LDRB     r1,[r5,#0]            ;400
00023a  2001              MOVS     r0,#1                 ;400
00023c  2903              CMP      r1,#3                 ;400
00023e  d003              BEQ      |L1.584|
000240  7030              STRB     r0,[r6,#0]            ;401
000242  2000              MOVS     r0,#0                 ;402
000244  e8bd81f0          POP      {r4-r8,pc}
                  |L1.584|
000248  f7fffffe          BL       OS_CPU_SR_Save
00024c  4607              MOV      r7,r0                 ;404
00024e  7aa8              LDRB     r0,[r5,#0xa]          ;405
000250  b300              CBZ      r0,|L1.660|
000252  2400              MOVS     r4,#0                 ;406
000254  f1b80f01          CMP      r8,#1                 ;407
000258  d10b              BNE      |L1.626|
                  |L1.602|
00025a  2302              MOVS     r3,#2                 ;410
00025c  2201              MOVS     r2,#1                 ;410
00025e  2100              MOVS     r1,#0                 ;410
000260  4628              MOV      r0,r5                 ;410
000262  f7fffffe          BL       OS_EventTaskRdy

⌨️ 快捷键说明

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