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

📄 os_q.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 5 页
字号:
000396  4604              MOV      r4,r0
000398  460d              MOV      r5,r1
;;;570        OS_Q      *pq;
;;;571    #if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
;;;572        OS_CPU_SR  cpu_sr = 0;
;;;573    #endif
;;;574    
;;;575    
;;;576    
;;;577    #if OS_ARG_CHK_EN > 0
;;;578        if (pevent == (OS_EVENT *)0) {                     /* Validate 'pevent'                            */
00039a  b90c              CBNZ     r4,|L1.928|
;;;579            return (OS_ERR_PEVENT_NULL);
00039c  2004              MOVS     r0,#4
;;;580        }
;;;581    #endif
;;;582        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {      /* Validate event block type                    */
;;;583            return (OS_ERR_EVENT_TYPE);
;;;584        }
;;;585        OS_ENTER_CRITICAL();
;;;586        if (pevent->OSEventGrp != 0) {                     /* See if any task pending on queue             */
;;;587                                                           /* Ready highest priority task waiting on event */
;;;588            (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
;;;589            OS_EXIT_CRITICAL();
;;;590            OS_Sched();                                    /* Find highest priority task ready to run      */
;;;591            return (OS_ERR_NONE);
;;;592        }
;;;593        pq = (OS_Q *)pevent->OSEventPtr;                   /* Point to queue control block                 */
;;;594        if (pq->OSQEntries >= pq->OSQSize) {               /* Make sure queue is not full                  */
;;;595            OS_EXIT_CRITICAL();
;;;596            return (OS_ERR_Q_FULL);
;;;597        }
;;;598        *pq->OSQIn++ = pmsg;                               /* Insert message into queue                    */
;;;599        pq->OSQEntries++;                                  /* Update the nbr of entries in the queue       */
;;;600        if (pq->OSQIn == pq->OSQEnd) {                     /* Wrap IN ptr if we are at end of queue        */
;;;601            pq->OSQIn = pq->OSQStart;
;;;602        }
;;;603        OS_EXIT_CRITICAL();
;;;604        return (OS_ERR_NONE);
;;;605    }
00039e  bd70              POP      {r4-r6,pc}
                  |L1.928|
0003a0  7820              LDRB     r0,[r4,#0]
0003a2  2802              CMP      r0,#2
0003a4  d001              BEQ      |L1.938|
0003a6  2001              MOVS     r0,#1
0003a8  bd70              POP      {r4-r6,pc}
                  |L1.938|
0003aa  f7fff7ff          BL       OS_CPU_SR_Save
0003ae  4606              MOV      r6,r0
0003b0  7aa0              LDRB     r0,[r4,#0xa]
0003b2  b160              CBZ      r0,|L1.974|
0003b4  2300              MOVS     r3,#0
0003b6  2204              MOVS     r2,#4
0003b8  4629              MOV      r1,r5
0003ba  4620              MOV      r0,r4
0003bc  f7fff7ff          BL       OS_EventTaskRdy
0003c0  4630              MOV      r0,r6
0003c2  f7fff7ff          BL       OS_CPU_SR_Restore
0003c6  f7fff7ff          BL       OS_Sched
0003ca  2000              MOVS     r0,#0
0003cc  bd70              POP      {r4-r6,pc}
                  |L1.974|
0003ce  6860              LDR      r0,[r4,#4]
0003d0  8ac1              LDRH     r1,[r0,#0x16]
0003d2  8a82              LDRH     r2,[r0,#0x14]
0003d4  4291              CMP      r1,r2
0003d6  d304              BCC      |L1.994|
0003d8  4630              MOV      r0,r6
0003da  f7fff7ff          BL       OS_CPU_SR_Restore
0003de  201e              MOVS     r0,#0x1e
0003e0  bd70              POP      {r4-r6,pc}
                  |L1.994|
0003e2  68c1              LDR      r1,[r0,#0xc]
0003e4  1d0a              ADDS     r2,r1,#4
0003e6  60c2              STR      r2,[r0,#0xc]
0003e8  600d              STR      r5,[r1,#0]
0003ea  8ac1              LDRH     r1,[r0,#0x16]
0003ec  1c49              ADDS     r1,r1,#1
0003ee  82c1              STRH     r1,[r0,#0x16]
0003f0  6882              LDR      r2,[r0,#8]
0003f2  68c1              LDR      r1,[r0,#0xc]
0003f4  4291              CMP      r1,r2
0003f6  d101              BNE      |L1.1020|
0003f8  6841              LDR      r1,[r0,#4]
0003fa  60c1              STR      r1,[r0,#0xc]
                  |L1.1020|
0003fc  4630              MOV      r0,r6
0003fe  f7fff7ff          BL       OS_CPU_SR_Restore
000402  2000              MOVS     r0,#0
000404  bd70              POP      {r4-r6,pc}
;;;606    #endif
                          ENDP

                  OSQPostFront PROC
;;;630    INT8U  OSQPostFront (OS_EVENT *pevent, void *pmsg)
;;;631    {
000406  b570              PUSH     {r4-r6,lr}
000408  4604              MOV      r4,r0
00040a  460d              MOV      r5,r1
;;;632        OS_Q      *pq;
;;;633    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;634        OS_CPU_SR  cpu_sr = 0;
;;;635    #endif
;;;636    
;;;637    
;;;638    
;;;639    #if OS_ARG_CHK_EN > 0
;;;640        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
00040c  b90c              CBNZ     r4,|L1.1042|
;;;641            return (OS_ERR_PEVENT_NULL);
00040e  2004              MOVS     r0,#4
;;;642        }
;;;643    #endif
;;;644        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type                     */
;;;645            return (OS_ERR_EVENT_TYPE);
;;;646        }
;;;647        OS_ENTER_CRITICAL();
;;;648        if (pevent->OSEventGrp != 0) {                    /* See if any task pending on queue              */
;;;649                                                          /* Ready highest priority task waiting on event  */
;;;650            (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_Q, OS_STAT_PEND_OK);
;;;651            OS_EXIT_CRITICAL();
;;;652            OS_Sched();                                   /* Find highest priority task ready to run       */
;;;653            return (OS_ERR_NONE);
;;;654        }
;;;655        pq = (OS_Q *)pevent->OSEventPtr;                  /* Point to queue control block                  */
;;;656        if (pq->OSQEntries >= pq->OSQSize) {              /* Make sure queue is not full                   */
;;;657            OS_EXIT_CRITICAL();
;;;658            return (OS_ERR_Q_FULL);
;;;659        }
;;;660        if (pq->OSQOut == pq->OSQStart) {                 /* Wrap OUT ptr if we are at the 1st queue entry */
;;;661            pq->OSQOut = pq->OSQEnd;
;;;662        }
;;;663        pq->OSQOut--;
;;;664        *pq->OSQOut = pmsg;                               /* Insert message into queue                     */
;;;665        pq->OSQEntries++;                                 /* Update the nbr of entries in the queue        */
;;;666        OS_EXIT_CRITICAL();
;;;667        return (OS_ERR_NONE);
;;;668    }
000410  bd70              POP      {r4-r6,pc}
                  |L1.1042|
000412  7820              LDRB     r0,[r4,#0]
000414  2802              CMP      r0,#2
000416  d001              BEQ      |L1.1052|
000418  2001              MOVS     r0,#1
00041a  bd70              POP      {r4-r6,pc}
                  |L1.1052|
00041c  f7fff7ff          BL       OS_CPU_SR_Save
000420  4606              MOV      r6,r0
000422  7aa0              LDRB     r0,[r4,#0xa]
000424  b160              CBZ      r0,|L1.1088|
000426  2300              MOVS     r3,#0
000428  2204              MOVS     r2,#4
00042a  4629              MOV      r1,r5
00042c  4620              MOV      r0,r4
00042e  f7fff7ff          BL       OS_EventTaskRdy
000432  4630              MOV      r0,r6
000434  f7fff7ff          BL       OS_CPU_SR_Restore
000438  f7fff7ff          BL       OS_Sched
00043c  2000              MOVS     r0,#0
00043e  bd70              POP      {r4-r6,pc}
                  |L1.1088|
000440  6860              LDR      r0,[r4,#4]
000442  8ac1              LDRH     r1,[r0,#0x16]
000444  8a82              LDRH     r2,[r0,#0x14]
000446  4291              CMP      r1,r2
000448  d30e              BCC      |L1.1128|
00044a  4630              MOV      r0,r6
00044c  f7fff7ff          BL       OS_CPU_SR_Restore
000450  201e              MOVS     r0,#0x1e
                  |L1.1106|
000452  bd70              POP      {r4-r6,pc}
                  |L1.1108|
000454  00000000          DCD      OSIntNesting
                  |L1.1112|
000458  00000000          DCD      OSEventFreeList
                  |L1.1116|
00045c  00000000          DCD      OSQFreeList
                  |L1.1120|
000460  00000000          DCD      OSLockNesting
                  |L1.1124|
000464  00000000          DCD      OSTCBCur
                  |L1.1128|
000468  6842              LDR      r2,[r0,#4]
00046a  6901              LDR      r1,[r0,#0x10]
00046c  4291              CMP      r1,r2
00046e  d101              BNE      |L1.1140|
000470  6881              LDR      r1,[r0,#8]
000472  6101              STR      r1,[r0,#0x10]
                  |L1.1140|
000474  6901              LDR      r1,[r0,#0x10]
000476  1f09              SUBS     r1,r1,#4
000478  6101              STR      r1,[r0,#0x10]
00047a  600d              STR      r5,[r1,#0]
00047c  8ac1              LDRH     r1,[r0,#0x16]
00047e  1c49              ADDS     r1,r1,#1
000480  82c1              STRH     r1,[r0,#0x16]
000482  4630              MOV      r0,r6
000484  f7fff7ff          BL       OS_CPU_SR_Restore
000488  2000              MOVS     r0,#0
00048a  e7e2              B        |L1.1106|
;;;669    #endif
                          ENDP

                  OSQPostOpt PROC
;;;701    INT8U  OSQPostOpt (OS_EVENT *pevent, void *pmsg, INT8U opt)
;;;702    {
00048c  e92de92d          PUSH     {r4-r8,lr}
000490  4604              MOV      r4,r0
000492  460e              MOV      r6,r1
000494  4615              MOV      r5,r2
;;;703        OS_Q      *pq;
;;;704    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;705        OS_CPU_SR  cpu_sr = 0;
;;;706    #endif
;;;707    
;;;708    
;;;709    
;;;710    #if OS_ARG_CHK_EN > 0
;;;711        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
000496  b914              CBNZ     r4,|L1.1182|
;;;712            return (OS_ERR_PEVENT_NULL);
000498  2004              MOVS     r0,#4
00049a  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1182|
;;;713        }
;;;714    #endif
;;;715        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type                     */
00049e  7820              LDRB     r0,[r4,#0]
0004a0  2802              CMP      r0,#2
0004a2  d002              BEQ      |L1.1194|
;;;716            return (OS_ERR_EVENT_TYPE);
0004a4  2001              MOVS     r0,#1
0004a6  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1194|
;;;717        }
;;;718        OS_ENTER_CRITICAL();
0004aa  f7fff7ff          BL       OS_CPU_SR_Save
0004ae  4607              MOV      r7,r0
;;;719        if (pevent->OSEventGrp != 0x00) {                 /* See if any task pending on queue              */
0004b0  7aa0              LDRB     r0,[r4,#0xa]
0004b2  b1e8              CBZ      r0,|L1.1264|
;;;720            if ((opt & OS_POST_OPT_BROADCAST) != 0x00) {  /* Do we need to post msg to ALL waiting tasks ? */
0004b4  f015f015          TST      r5,#1
0004b8  d009              BEQ      |L1.1230|
                  |L1.1210|
0004ba  2300              MOVS     r3,#0
0004bc  2204              MOVS     r2,#4
0004be  4631              MOV      r1,r6
0004c0  4620              MOV      r0,r4
0004c2  f7fff7ff          BL       OS_EventTaskRdy
;;;721                while (pevent->OSEventGrp != 0) {         /* Yes, Post to ALL tasks waiting on queue       */
0004c6  7aa1              LDRB     r1,[r4,#0xa]
0004c8  2900              CMP      r1,#0

⌨️ 快捷键说明

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