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

📄 os_mbox.txt

📁 stm32 ucos 精简移殖版本 不需作任何修改直接便可运行。包含串口 定时器
💻 TXT
📖 第 1 页 / 共 3 页
字号:
000112  4638              MOV      r0,r7                 ;222
000114  f7fff7ff          BL       OS_CPU_SR_Restore
000118  2e01              CMP      r6,#1                 ;223
00011a  d101              BNE      |L1.288|
00011c  f7fff7ff          BL       OS_Sched
                  |L1.288|
000120  f885f885          STRB     r10,[r5,#0]           ;226
000124  2000              MOVS     r0,#0                 ;227
000126  e7a4              B        |L1.114|
                  |L1.296|
000128  4638              MOV      r0,r7                 ;231
00012a  f7fff7ff          BL       OS_CPU_SR_Restore
00012e  2007              MOVS     r0,#7                 ;232
000130  7028              STRB     r0,[r5,#0]            ;232
000132  4620              MOV      r0,r4                 ;233
000134  e79d              B        |L1.114|
;;;238    #endif
                          ENDP

                  OSMboxPend PROC
;;;274    void  *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;275    {
000136  e92de92d          PUSH     {r4-r10,lr}
00013a  4607              MOV      r7,r0
00013c  468a              MOV      r10,r1
00013e  4614              MOV      r4,r2
;;;276        void      *pmsg;
;;;277    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;278        OS_CPU_SR  cpu_sr = 0;
;;;279    #endif
;;;280    
;;;281    
;;;282    
;;;283    #if OS_ARG_CHK_EN > 0
;;;284        if (perr == (INT8U *)0) {                         /* Validate 'perr'                               */
;;;285            return ((void *)0);
;;;286        }
;;;287        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;;;288            *perr = OS_ERR_PEVENT_NULL;
;;;289            return ((void *)0);
;;;290        }
;;;291    #endif
;;;292        if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {  /* Validate event block type                     */
000140  7838              LDRB     r0,[r7,#0]
000142  2801              CMP      r0,#1
000144  d004              BEQ      |L1.336|
;;;293            *perr = OS_ERR_EVENT_TYPE;
000146  2001              MOVS     r0,#1
000148  7020              STRB     r0,[r4,#0]
;;;294            return ((void *)0);
00014a  2000              MOVS     r0,#0
                  |L1.332|
;;;295        }
;;;296        if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
;;;297            *perr = OS_ERR_PEND_ISR;                      /* ... can't PEND from an ISR                    */
;;;298            return ((void *)0);
;;;299        }
;;;300        if (OSLockNesting > 0) {                          /* See if called with scheduler locked ...       */
;;;301            *perr = OS_ERR_PEND_LOCKED;                   /* ... can't PEND when locked                    */
;;;302            return ((void *)0);
;;;303        }
;;;304        OS_ENTER_CRITICAL();
;;;305        pmsg = pevent->OSEventPtr;
;;;306        if (pmsg != (void *)0) {                          /* See if there is already a message             */
;;;307            pevent->OSEventPtr = (void *)0;               /* Clear the mailbox                             */
;;;308            OS_EXIT_CRITICAL();
;;;309            *perr = OS_ERR_NONE;
;;;310            return (pmsg);                                /* Return the message received (or NULL)         */
;;;311        }
;;;312        OSTCBCur->OSTCBStat     |= OS_STAT_MBOX;          /* Message not available, task will pend         */
;;;313        OSTCBCur->OSTCBStatPend  = OS_STAT_PEND_OK;
;;;314        OSTCBCur->OSTCBDly       = timeout;               /* Load timeout in TCB                           */
;;;315        OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
;;;316        OS_EXIT_CRITICAL();
;;;317        OS_Sched();                                       /* Find next highest priority task ready to run  */
;;;318        OS_ENTER_CRITICAL();
;;;319        switch (OSTCBCur->OSTCBStatPend) {                /* See if we timed-out or aborted                */
;;;320            case OS_STAT_PEND_OK:
;;;321                 pmsg =  OSTCBCur->OSTCBMsg;
;;;322                *perr =  OS_ERR_NONE;
;;;323                 break;
;;;324    
;;;325            case OS_STAT_PEND_ABORT:
;;;326                 pmsg = (void *)0;
;;;327                *perr =  OS_ERR_PEND_ABORT;               /* Indicate that we aborted                      */
;;;328                 break;
;;;329    
;;;330            case OS_STAT_PEND_TO:
;;;331            default:
;;;332                 OS_EventTaskRemove(OSTCBCur, pevent);
;;;333                 pmsg = (void *)0;
;;;334                *perr =  OS_ERR_TIMEOUT;                  /* Indicate that we didn't get event within TO   */
;;;335                 break;
;;;336        }
;;;337        OSTCBCur->OSTCBStat          =  OS_STAT_RDY;      /* Set   task  status to ready                   */
;;;338        OSTCBCur->OSTCBStatPend      =  OS_STAT_PEND_OK;  /* Clear pend  status                            */
;;;339        OSTCBCur->OSTCBEventPtr      = (OS_EVENT  *)0;    /* Clear event pointers                          */
;;;340    #if (OS_EVENT_MULTI_EN > 0)
;;;341        OSTCBCur->OSTCBEventMultiPtr = (OS_EVENT **)0;
;;;342    #endif
;;;343        OSTCBCur->OSTCBMsg           = (void      *)0;    /* Clear  received message                       */
;;;344        OS_EXIT_CRITICAL();
;;;345        return (pmsg);                                    /* Return received message                       */
;;;346    }
00014c  e8bde8bd          POP      {r4-r10,pc}
                  |L1.336|
000150  4887              LDR      r0,|L1.880|
000152  7800              LDRB     r0,[r0,#0]            ;296  ; OSIntNesting
000154  b118              CBZ      r0,|L1.350|
000156  2002              MOVS     r0,#2                 ;297
000158  7020              STRB     r0,[r4,#0]            ;297
00015a  2000              MOVS     r0,#0                 ;298
00015c  e7f6              B        |L1.332|
                  |L1.350|
00015e  4886              LDR      r0,|L1.888|
000160  7800              LDRB     r0,[r0,#0]            ;300  ; OSLockNesting
000162  b118              CBZ      r0,|L1.364|
000164  200d              MOVS     r0,#0xd               ;301
000166  7020              STRB     r0,[r4,#0]            ;301
000168  2000              MOVS     r0,#0                 ;302
00016a  e7ef              B        |L1.332|
                  |L1.364|
00016c  f7fff7ff          BL       OS_CPU_SR_Save
000170  4606              MOV      r6,r0                 ;304
000172  687d              LDR      r5,[r7,#4]            ;305
000174  f04ff04f          MOV      r8,#0                 ;306
000178  b145              CBZ      r5,|L1.396|
00017a  f8c7f8c7          STR      r8,[r7,#4]            ;307
00017e  4630              MOV      r0,r6                 ;308
000180  f7fff7ff          BL       OS_CPU_SR_Restore
000184  f884f884          STRB     r8,[r4,#0]            ;309
000188  4628              MOV      r0,r5                 ;310
00018a  e7df              B        |L1.332|
                  |L1.396|
00018c  f8dff8df          LDR      r9,|L1.892|
000190  f8d9f8d9          LDR      r0,[r9,#0]            ;312  ; OSTCBCur
000194  f810f810          LDRB     r1,[r0,#0x30]!        ;312
000198  f041f041          ORR      r1,r1,#2              ;312
00019c  7001              STRB     r1,[r0,#0]            ;312
00019e  f880f880          STRB     r8,[r0,#1]            ;313
0001a2  f820f820          STRH     r10,[r0,#-2]          ;314
0001a6  4638              MOV      r0,r7                 ;315
0001a8  f7fff7ff          BL       OS_EventTaskWait
0001ac  4630              MOV      r0,r6                 ;316
0001ae  f7fff7ff          BL       OS_CPU_SR_Restore
0001b2  f7fff7ff          BL       OS_Sched
0001b6  f7fff7ff          BL       OS_CPU_SR_Save
0001ba  4606              MOV      r6,r0                 ;318
0001bc  f8d9f8d9          LDR      r0,[r9,#0]            ;319  ; OSTCBCur
0001c0  f890f890          LDRB     r1,[r0,#0x31]         ;319
0001c4  b121              CBZ      r1,|L1.464|
0001c6  2902              CMP      r1,#2                 ;319
0001c8  d106              BNE      |L1.472|
0001ca  200e              MOVS     r0,#0xe               ;327
0001cc  7020              STRB     r0,[r4,#0]            ;327
0001ce  e008              B        |L1.482|
                  |L1.464|
0001d0  6a45              LDR      r5,[r0,#0x24]         ;321
0001d2  f884f884          STRB     r8,[r4,#0]            ;322
0001d6  e004              B        |L1.482|
                  |L1.472|
0001d8  4639              MOV      r1,r7                 ;332
0001da  f7fff7ff          BL       OS_EventTaskRemove
0001de  200a              MOVS     r0,#0xa               ;334
0001e0  7020              STRB     r0,[r4,#0]            ;334
                  |L1.482|
0001e2  f8d9f8d9          LDR      r1,[r9,#0]            ;337  ; OSTCBCur
0001e6  f881f881          STRB     r8,[r1,#0x30]         ;337
0001ea  f881f881          STRB     r8,[r1,#0x31]         ;338
0001ee  f8c1f8c1          STR      r8,[r1,#0x1c]         ;339
0001f2  f8c1f8c1          STR      r8,[r1,#0x20]         ;341
0001f6  f8c1f8c1          STR      r8,[r1,#0x24]         ;343
0001fa  4630              MOV      r0,r6                 ;344
0001fc  f7fff7ff          BL       OS_CPU_SR_Restore
000200  4628              MOV      r0,r5                 ;345
000202  e7a3              B        |L1.332|
;;;347    /*$PAGE*/
                          ENDP

                  OSMboxPendAbort PROC
;;;381    INT8U  OSMboxPendAbort (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;382    {
000204  e92de92d          PUSH     {r4-r8,lr}
000208  4605              MOV      r5,r0
00020a  4688              MOV      r8,r1
00020c  4616              MOV      r6,r2
;;;383        INT8U      nbr_tasks;
;;;384    #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;;;385        OS_CPU_SR  cpu_sr = 0;
;;;386    #endif
;;;387    
;;;388    
;;;389    
;;;390    #if OS_ARG_CHK_EN > 0
;;;391        if (perr == (INT8U *)0) {                              /* Validate 'perr'                          */
;;;392            return (0);
;;;393        }
;;;394        if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;;;395            *perr = OS_ERR_PEVENT_NULL;
;;;396            return (0);
;;;397        }
;;;398    #endif
;;;399        if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {       /* Validate event block type                */
00020e  7829              LDRB     r1,[r5,#0]
000210  2001              MOVS     r0,#1
000212  2901              CMP      r1,#1
000214  d003              BEQ      |L1.542|
;;;400            *perr = OS_ERR_EVENT_TYPE;
000216  7030              STRB     r0,[r6,#0]
;;;401            return (0);
000218  2000              MOVS     r0,#0
                  |L1.538|
;;;402        }
;;;403        OS_ENTER_CRITICAL();
;;;404        if (pevent->OSEventGrp != 0) {                         /* See if any task waiting on mailbox?      */
;;;405            nbr_tasks = 0;
;;;406            switch (opt) {
;;;407                case OS_PEND_OPT_BROADCAST:                    /* Do we need to abort ALL waiting tasks?   */
;;;408                     while (pevent->OSEventGrp != 0) {         /* Yes, ready ALL tasks waiting on mailbox  */
;;;409                         (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_ABORT);
;;;410                         nbr_tasks++;
;;;411                     }
;;;412                     break;
;;;413                 
;;;414                case OS_PEND_OPT_NONE:
;;;415                default:                                       /* No,  ready HPT       waiting on mailbox  */
;;;416                     (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_ABORT);
;;;417                     nbr_tasks++;
;;;418                     break;
;;;419            }
;;;420            OS_EXIT_CRITICAL();
;;;421            OS_Sched();                                        /* Find HPT ready to run                    */
;;;422            *perr = OS_ERR_PEND_ABORT;
;;;423            return (nbr_tasks);
;;;424        }
;;;425        OS_EXIT_CRITICAL();
;;;426        *perr = OS_ERR_NONE;
;;;427        return (0);                                            /* No tasks waiting on mailbox              */
;;;428    }
00021a  e8bde8bd          POP      {r4-r8,pc}
                  |L1.542|
00021e  f7fff7ff          BL       OS_CPU_SR_Save
000222  4607              MOV      r7,r0                 ;403
000224  7aa8              LDRB     r0,[r5,#0xa]          ;404
000226  b300              CBZ      r0,|L1.618|
000228  2400              MOVS     r4,#0                 ;405
00022a  f1b8f1b8          CMP      r8,#1                 ;406
00022e  d10c              BNE      |L1.586|
000230  e007              B        |L1.578|
                  |L1.562|
000232  2302              MOVS     r3,#2                 ;409
000234  461a              MOV      r2,r3                 ;409
000236  2100              MOVS     r1,#0                 ;409
000238  4628              MOV      r0,r5                 ;409
00023a  f7fff7ff          BL       OS_EventTaskRdy
00023e  1c64              ADDS     r4,r4,#1              ;410
000240  b2e4              UXTB     r4,r4                 ;410
                  |L1.578|
000242  7aa8              LDRB     r0,[r5,#0xa]          ;408
000244  2800              CMP      r0,#0                 ;408
000246  d1f4              BNE      |L1.562|
000248  e006              B        |L1.600|
                  |L1.586|
00024a  2302              MOVS     r3,#2                 ;416
00024c  461a              MOV      r2,r3                 ;416
00024e  2100              MOVS     r1,#0                 ;416
000250  4628              MOV      r0,r5                 ;416
000252  f7fff7ff          BL       OS_EventTaskRdy
000256  2401              MOVS     r4,#1                 ;417
                  |L1.600|
000258  4638              MOV      r0,r7                 ;420

⌨️ 快捷键说明

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