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

📄 os_sem.txt

📁 stm32 ucos 精简移殖版本 不需作任何修改直接便可运行。包含串口 定时器
💻 TXT
📖 第 1 页 / 共 3 页
字号:
0000e6  e7c5              B        |L1.116|
                  |L1.232|
0000e8  2300              MOVS     r3,#0                 ;220
0000ea  2201              MOVS     r2,#1                 ;220
0000ec  4619              MOV      r1,r3                 ;220
0000ee  4620              MOV      r0,r4                 ;220
0000f0  f7fff7ff          BL       OS_EventTaskRdy
                  |L1.244|
0000f4  7aa0              LDRB     r0,[r4,#0xa]          ;219
0000f6  2800              CMP      r0,#0                 ;219
0000f8  d1f6              BNE      |L1.232|
0000fa  f884f884          STRB     r8,[r4,#0xf]          ;223
0000fe  f884f884          STRB     r10,[r4,#0x10]        ;224
000102  f884f884          STRB     r10,[r4,#0]           ;226
000106  f8d9f8d9          LDR      r0,[r9,#0]            ;227  ; OSEventFreeList
00010a  6060              STR      r0,[r4,#4]            ;227
00010c  f8a4f8a4          STRH     r10,[r4,#8]           ;228
000110  f8c9f8c9          STR      r4,[r9,#0]            ;229  ; OSEventFreeList
000114  4638              MOV      r0,r7                 ;230
000116  f7fff7ff          BL       OS_CPU_SR_Restore
00011a  2e01              CMP      r6,#1                 ;231
00011c  d101              BNE      |L1.290|
00011e  f7fff7ff          BL       OS_Sched
                  |L1.290|
000122  f885f885          STRB     r10,[r5,#0]           ;234
000126  2000              MOVS     r0,#0                 ;235
000128  e7a4              B        |L1.116|
                  |L1.298|
00012a  4638              MOV      r0,r7                 ;239
00012c  f7fff7ff          BL       OS_CPU_SR_Restore
000130  2007              MOVS     r0,#7                 ;240
000132  7028              STRB     r0,[r5,#0]            ;240
000134  4620              MOV      r0,r4                 ;241
000136  e79d              B        |L1.116|
;;;246    #endif
                          ENDP

                  OSSemPend PROC
;;;281    void  OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;282    {
000138  e92de92d          PUSH     {r4-r10,lr}
00013c  4606              MOV      r6,r0
00013e  4689              MOV      r9,r1
000140  4614              MOV      r4,r2
;;;283    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;284        OS_CPU_SR  cpu_sr = 0;
;;;285    #endif
;;;286    
;;;287    
;;;288    
;;;289    #if OS_ARG_CHK_EN > 0
;;;290        if (perr == (INT8U *)0) {                         /* Validate 'perr'                               */
;;;291            return;
;;;292        }
;;;293        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;;;294            *perr = OS_ERR_PEVENT_NULL;
;;;295            return;
;;;296        }
;;;297    #endif
;;;298        if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
000142  7830              LDRB     r0,[r6,#0]
000144  2803              CMP      r0,#3
000146  d003              BEQ      |L1.336|
;;;299            *perr = OS_ERR_EVENT_TYPE;
000148  2001              MOVS     r0,#1
00014a  7020              STRB     r0,[r4,#0]
                  |L1.332|
;;;300            return;
;;;301        }
;;;302        if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
;;;303            *perr = OS_ERR_PEND_ISR;                      /* ... can't PEND from an ISR                    */
;;;304            return;
;;;305        }
;;;306        if (OSLockNesting > 0) {                          /* See if called with scheduler locked ...       */
;;;307            *perr = OS_ERR_PEND_LOCKED;                   /* ... can't PEND when locked                    */
;;;308            return;
;;;309        }
;;;310        OS_ENTER_CRITICAL();
;;;311        if (pevent->OSEventCnt > 0) {                     /* If sem. is positive, resource available ...   */
;;;312            pevent->OSEventCnt--;                         /* ... decrement semaphore only if positive.     */
;;;313            OS_EXIT_CRITICAL();
;;;314            *perr = OS_ERR_NONE;
;;;315            return;
;;;316        }
;;;317                                                          /* Otherwise, must wait until event occurs       */
;;;318        OSTCBCur->OSTCBStat     |= OS_STAT_SEM;           /* Resource not available, pend on semaphore     */
;;;319        OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
;;;320        OSTCBCur->OSTCBDly       = timeout;               /* Store pend timeout in TCB                     */
;;;321        OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
;;;322        OS_EXIT_CRITICAL();
;;;323        OS_Sched();                                       /* Find next highest priority task ready         */
;;;324        OS_ENTER_CRITICAL();
;;;325        switch (OSTCBCur->OSTCBStatPend) {                /* See if we timed-out or aborted                */
;;;326            case OS_STAT_PEND_OK:
;;;327                 *perr = OS_ERR_NONE;
;;;328                 break;
;;;329    
;;;330            case OS_STAT_PEND_ABORT:
;;;331                 *perr = OS_ERR_PEND_ABORT;               /* Indicate that we aborted                      */
;;;332                 break;
;;;333    
;;;334            case OS_STAT_PEND_TO:
;;;335            default:        
;;;336                 OS_EventTaskRemove(OSTCBCur, pevent);
;;;337                 *perr = OS_ERR_TIMEOUT;                  /* Indicate that we didn't get event within TO   */
;;;338                 break;
;;;339        }
;;;340        OSTCBCur->OSTCBStat          =  OS_STAT_RDY;      /* Set   task  status to ready                   */
;;;341        OSTCBCur->OSTCBStatPend      =  OS_STAT_PEND_OK;  /* Clear pend  status                            */
;;;342        OSTCBCur->OSTCBEventPtr      = (OS_EVENT  *)0;    /* Clear event pointers                          */
;;;343    #if (OS_EVENT_MULTI_EN > 0)
;;;344        OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)0;
;;;345    #endif
;;;346        OS_EXIT_CRITICAL();
;;;347    }
00014c  e8bde8bd          POP      {r4-r10,pc}
                  |L1.336|
000150  4874              LDR      r0,|L1.804|
000152  7800              LDRB     r0,[r0,#0]            ;302  ; OSIntNesting
000154  b110              CBZ      r0,|L1.348|
000156  2002              MOVS     r0,#2                 ;303
000158  7020              STRB     r0,[r4,#0]            ;303
00015a  e7f7              B        |L1.332|
                  |L1.348|
00015c  4873              LDR      r0,|L1.812|
00015e  7800              LDRB     r0,[r0,#0]            ;306  ; OSLockNesting
000160  b110              CBZ      r0,|L1.360|
000162  200d              MOVS     r0,#0xd               ;307
000164  7020              STRB     r0,[r4,#0]            ;307
000166  e7f1              B        |L1.332|
                  |L1.360|
000168  f7fff7ff          BL       OS_CPU_SR_Save
00016c  4605              MOV      r5,r0                 ;310
00016e  8930              LDRH     r0,[r6,#8]            ;311
000170  2700              MOVS     r7,#0                 ;311
000172  b130              CBZ      r0,|L1.386|
000174  1e40              SUBS     r0,r0,#1              ;312
000176  8130              STRH     r0,[r6,#8]            ;312
000178  4628              MOV      r0,r5                 ;313
00017a  f7fff7ff          BL       OS_CPU_SR_Restore
00017e  7027              STRB     r7,[r4,#0]            ;314
000180  e7e4              B        |L1.332|
                  |L1.386|
000182  f8dff8df          LDR      r8,|L1.816|
000186  f8d8f8d8          LDR      r1,[r8,#0]            ;318  ; OSTCBCur
00018a  f811f811          LDRB     r0,[r1,#0x30]!        ;318
00018e  f040f040          ORR      r0,r0,#1              ;318
000192  7008              STRB     r0,[r1,#0]            ;318
000194  704f              STRB     r7,[r1,#1]            ;319
000196  f821f821          STRH     r9,[r1,#-2]           ;320
00019a  4630              MOV      r0,r6                 ;321
00019c  f7fff7ff          BL       OS_EventTaskWait
0001a0  4628              MOV      r0,r5                 ;322
0001a2  f7fff7ff          BL       OS_CPU_SR_Restore
0001a6  f7fff7ff          BL       OS_Sched
0001aa  f7fff7ff          BL       OS_CPU_SR_Save
0001ae  4605              MOV      r5,r0                 ;324
0001b0  f8d8f8d8          LDR      r0,[r8,#0]            ;325  ; OSTCBCur
0001b4  f890f890          LDRB     r1,[r0,#0x31]         ;325
0001b8  b121              CBZ      r1,|L1.452|
0001ba  2902              CMP      r1,#2                 ;325
0001bc  d104              BNE      |L1.456|
0001be  200e              MOVS     r0,#0xe               ;331
0001c0  7020              STRB     r0,[r4,#0]            ;331
0001c2  e006              B        |L1.466|
                  |L1.452|
0001c4  7027              STRB     r7,[r4,#0]            ;327
0001c6  e004              B        |L1.466|
                  |L1.456|
0001c8  4631              MOV      r1,r6                 ;336
0001ca  f7fff7ff          BL       OS_EventTaskRemove
0001ce  200a              MOVS     r0,#0xa               ;337
0001d0  7020              STRB     r0,[r4,#0]            ;337
                  |L1.466|
0001d2  f8d8f8d8          LDR      r1,[r8,#0]            ;340  ; OSTCBCur
0001d6  311c              ADDS     r1,r1,#0x1c           ;340
0001d8  750f              STRB     r7,[r1,#0x14]         ;340
0001da  754f              STRB     r7,[r1,#0x15]         ;341
0001dc  600f              STR      r7,[r1,#0]            ;342
0001de  604f              STR      r7,[r1,#4]            ;344
0001e0  4628              MOV      r0,r5                 ;346
0001e2  e8bde8bd          POP      {r4-r10,lr}           ;346
0001e6  f7fff7ff          B.W      OS_CPU_SR_Restore
;;;348    
                          ENDP

                  OSSemPendAbort PROC
;;;384    INT8U  OSSemPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;385    {
0001ea  e92de92d          PUSH     {r4-r8,lr}
0001ee  4605              MOV      r5,r0
0001f0  4688              MOV      r8,r1
0001f2  4616              MOV      r6,r2
;;;386        INT8U      nbr_tasks;
;;;387    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;388        OS_CPU_SR  cpu_sr = 0;
;;;389    #endif
;;;390    
;;;391    
;;;392    
;;;393    #if OS_ARG_CHK_EN > 0
;;;394        if (perr == (INT8U *)0) {                         /* Validate 'perr'                               */
;;;395            return (0);
;;;396        }
;;;397        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;;;398            *perr = OS_ERR_PEVENT_NULL;
;;;399            return (0);
;;;400        }
;;;401    #endif
;;;402        if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
0001f4  7829              LDRB     r1,[r5,#0]
0001f6  2001              MOVS     r0,#1
0001f8  2903              CMP      r1,#3
0001fa  d003              BEQ      |L1.516|
;;;403            *perr = OS_ERR_EVENT_TYPE;
0001fc  7030              STRB     r0,[r6,#0]
;;;404            return (0);
0001fe  2000              MOVS     r0,#0
                  |L1.512|
;;;405        }
;;;406        OS_ENTER_CRITICAL();
;;;407        if (pevent->OSEventGrp != 0) {                    /* See if any task waiting on semaphore?         */
;;;408            nbr_tasks = 0;
;;;409            switch (opt) {
;;;410                case OS_PEND_OPT_BROADCAST:               /* Do we need to abort ALL waiting tasks?        */
;;;411                     while (pevent->OSEventGrp != 0) {    /* Yes, ready ALL tasks waiting on semaphore     */
;;;412                         (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_ABORT);
;;;413                         nbr_tasks++;
;;;414                     }
;;;415                     break;
;;;416                     
;;;417                case OS_PEND_OPT_NONE:
;;;418                default:                                  /* No,  ready HPT       waiting on semaphore     */
;;;419                     (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_ABORT);
;;;420                     nbr_tasks++;
;;;421                     break;
;;;422            }
;;;423            OS_EXIT_CRITICAL();
;;;424            OS_Sched();                                   /* Find HPT ready to run                         */
;;;425            *perr = OS_ERR_PEND_ABORT;
;;;426            return (nbr_tasks);
;;;427        }
;;;428        OS_EXIT_CRITICAL();
;;;429        *perr = OS_ERR_NONE;
;;;430        return (0);                                       /* No tasks waiting on semaphore                 */
;;;431    }
000200  e8bde8bd          POP      {r4-r8,pc}
                  |L1.516|
000204  f7fff7ff          BL       OS_CPU_SR_Save
000208  4607              MOV      r7,r0                 ;406
00020a  7aa8              LDRB     r0,[r5,#0xa]          ;407
00020c  b300              CBZ      r0,|L1.592|
00020e  2400              MOVS     r4,#0                 ;408
000210  f1b8f1b8          CMP      r8,#1                 ;409
000214  d10c              BNE      |L1.560|
000216  e007              B        |L1.552|
                  |L1.536|

⌨️ 快捷键说明

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