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

📄 os_q.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 5 页
字号:
;;;237            *perr = OS_ERR_DEL_ISR;                            /* ... can't DELETE from an ISR             */
00010e  200f              MOVS     r0,#0xf
000110  7028              STRB     r0,[r5,#0]
;;;238            return (pevent);
000112  4620              MOV      r0,r4
000114  e8bde8bd          POP      {r4-r12,pc}
                  |L1.280|
;;;239        }
;;;240        OS_ENTER_CRITICAL();
000118  f7fff7ff          BL       OS_CPU_SR_Save
00011c  4683              MOV      r11,r0
;;;241        if (pevent->OSEventGrp != 0) {                         /* See if any tasks waiting on queue        */
00011e  7aa1              LDRB     r1,[r4,#0xa]
000120  b109              CBZ      r1,|L1.294|
;;;242            tasks_waiting = OS_TRUE;                           /* Yes                                      */
000122  2601              MOVS     r6,#1
000124  e000              B        |L1.296|
                  |L1.294|
;;;243        } else {
;;;244            tasks_waiting = OS_FALSE;                          /* No                                       */
000126  2600              MOVS     r6,#0
                  |L1.296|
;;;245        }
;;;246        switch (opt) {
000128  0038              MOVS     r0,r7
00012a  f8dff8df          LDR      r8,|L1.1116|
00012e  f8dff8df          LDR      r9,|L1.1112|
000132  f04ff04f          MOV      r7,#0x3f
000136  f04ff04f          MOV      r10,#0
00013a  d004              BEQ      |L1.326|
00013c  2801              CMP      r0,#1
00013e  d14c              BNE      |L1.474|
000140  2900              CMP      r1,#0
000142  d02c              BEQ      |L1.414|
;;;247            case OS_DEL_NO_PEND:                               /* Delete queue only if no task waiting     */
;;;248                 if (tasks_waiting == OS_FALSE) {
;;;249    #if OS_EVENT_NAME_SIZE > 1
;;;250                     pevent->OSEventName[0] = '?';             /* Unknown name                             */
;;;251                     pevent->OSEventName[1] = OS_ASCII_NUL;
;;;252    #endif
;;;253                     pq                     = (OS_Q *)pevent->OSEventPtr;  /* Return OS_Q to free list     */
;;;254                     pq->OSQPtr             = OSQFreeList;
;;;255                     OSQFreeList            = pq;
;;;256                     pevent->OSEventType    = OS_EVENT_TYPE_UNUSED;
;;;257                     pevent->OSEventPtr     = OSEventFreeList; /* Return Event Control Block to free list  */
;;;258                     pevent->OSEventCnt     = 0;
;;;259                     OSEventFreeList        = pevent;          /* Get next free event control block        */
;;;260                     OS_EXIT_CRITICAL();
;;;261                     *perr                  = OS_ERR_NONE;
;;;262                     pevent_return          = (OS_EVENT *)0;   /* Queue has been deleted                   */
;;;263                 } else {
;;;264                     OS_EXIT_CRITICAL();
;;;265                     *perr                  = OS_ERR_TASK_WAITING;
;;;266                     pevent_return          = pevent;
;;;267                 }
;;;268                 break;
;;;269    
;;;270            case OS_DEL_ALWAYS:                                /* Always delete the queue                  */
;;;271                 while (pevent->OSEventGrp != 0) {             /* Ready ALL tasks waiting for queue        */
000144  e022              B        |L1.396|
                  |L1.326|
000146  b9ce              CBNZ     r6,|L1.380|
000148  73e7              STRB     r7,[r4,#0xf]
00014a  f884f884          STRB     r10,[r4,#0x10]
00014e  6860              LDR      r0,[r4,#4]
000150  f8d8f8d8          LDR      r1,[r8,#0]  ; OSQFreeList
000154  6001              STR      r1,[r0,#0]
000156  f8c8f8c8          STR      r0,[r8,#0]  ; OSQFreeList
00015a  f884f884          STRB     r10,[r4,#0]
00015e  f8d9f8d9          LDR      r0,[r9,#0]  ; OSEventFreeList
000162  6060              STR      r0,[r4,#4]
000164  f8a4f8a4          STRH     r10,[r4,#8]
000168  f8c9f8c9          STR      r4,[r9,#0]  ; OSEventFreeList
00016c  4658              MOV      r0,r11
00016e  f7fff7ff          BL       OS_CPU_SR_Restore
000172  f885f885          STRB     r10,[r5,#0]
000176  2000              MOVS     r0,#0
000178  e8bde8bd          POP      {r4-r12,pc}
                  |L1.380|
00017c  4658              MOV      r0,r11
00017e  f7fff7ff          BL       OS_CPU_SR_Restore
000182  2049              MOVS     r0,#0x49
000184  7028              STRB     r0,[r5,#0]
000186  4620              MOV      r0,r4
000188  e8bde8bd          POP      {r4-r12,pc}
                  |L1.396|
00018c  2300              MOVS     r3,#0
00018e  2204              MOVS     r2,#4
000190  4619              MOV      r1,r3
000192  4620              MOV      r0,r4
000194  f7fff7ff          BL       OS_EventTaskRdy
000198  7aa0              LDRB     r0,[r4,#0xa]
00019a  2800              CMP      r0,#0
00019c  d1f6              BNE      |L1.396|
                  |L1.414|
;;;272                     (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q, OS_STAT_PEND_OK);
;;;273                 }
;;;274    #if OS_EVENT_NAME_SIZE > 1
;;;275                 pevent->OSEventName[0] = '?';                 /* Unknown name                             */
00019e  73e7              STRB     r7,[r4,#0xf]
;;;276                 pevent->OSEventName[1] = OS_ASCII_NUL;
0001a0  f884f884          STRB     r10,[r4,#0x10]
;;;277    #endif
;;;278                 pq                     = (OS_Q *)pevent->OSEventPtr;   /* Return OS_Q to free list        */
0001a4  6860              LDR      r0,[r4,#4]
;;;279                 pq->OSQPtr             = OSQFreeList;
0001a6  f8d8f8d8          LDR      r1,[r8,#0]  ; OSQFreeList
0001aa  6001              STR      r1,[r0,#0]
;;;280                 OSQFreeList            = pq;
0001ac  f8c8f8c8          STR      r0,[r8,#0]  ; OSQFreeList
;;;281                 pevent->OSEventType    = OS_EVENT_TYPE_UNUSED;
0001b0  f884f884          STRB     r10,[r4,#0]
;;;282                 pevent->OSEventPtr     = OSEventFreeList;     /* Return Event Control Block to free list  */
0001b4  f8d9f8d9          LDR      r0,[r9,#0]  ; OSEventFreeList
0001b8  6060              STR      r0,[r4,#4]
;;;283                 pevent->OSEventCnt     = 0;
0001ba  f8a4f8a4          STRH     r10,[r4,#8]
;;;284                 OSEventFreeList        = pevent;              /* Get next free event control block        */
0001be  f8c9f8c9          STR      r4,[r9,#0]  ; OSEventFreeList
;;;285                 OS_EXIT_CRITICAL();
0001c2  4658              MOV      r0,r11
0001c4  f7fff7ff          BL       OS_CPU_SR_Restore
;;;286                 if (tasks_waiting == OS_TRUE) {               /* Reschedule only if task(s) were waiting  */
0001c8  2e01              CMP      r6,#1
0001ca  d101              BNE      |L1.464|
;;;287                     OS_Sched();                               /* Find highest priority task ready to run  */
0001cc  f7fff7ff          BL       OS_Sched
                  |L1.464|
;;;288                 }
;;;289                 *perr                  = OS_ERR_NONE;
0001d0  f885f885          STRB     r10,[r5,#0]
;;;290                 pevent_return          = (OS_EVENT *)0;       /* Queue has been deleted                   */
0001d4  2000              MOVS     r0,#0
0001d6  e8bde8bd          POP      {r4-r12,pc}
                  |L1.474|
;;;291                 break;
;;;292    
;;;293            default:
;;;294                 OS_EXIT_CRITICAL();
0001da  4658              MOV      r0,r11
0001dc  f7fff7ff          BL       OS_CPU_SR_Restore
;;;295                 *perr                  = OS_ERR_INVALID_OPT;
0001e0  2007              MOVS     r0,#7
0001e2  7028              STRB     r0,[r5,#0]
;;;296                 pevent_return          = pevent;
0001e4  4620              MOV      r0,r4
;;;297                 break;
;;;298        }
;;;299        return (pevent_return);
;;;300    }
0001e6  e8bde8bd          POP      {r4-r12,pc}
;;;301    #endif
                          ENDP

                  OSQFlush PROC
;;;324    INT8U  OSQFlush (OS_EVENT *pevent)
;;;325    {
0001ea  b510              PUSH     {r4,lr}
0001ec  4604              MOV      r4,r0
;;;326        OS_Q      *pq;
;;;327    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;328        OS_CPU_SR  cpu_sr = 0;
;;;329    #endif
;;;330    
;;;331    
;;;332    
;;;333    #if OS_ARG_CHK_EN > 0
;;;334        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
0001ee  b90c              CBNZ     r4,|L1.500|
;;;335            return (OS_ERR_PEVENT_NULL);
0001f0  2004              MOVS     r0,#4
;;;336        }
;;;337        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type                     */
;;;338            return (OS_ERR_EVENT_TYPE);
;;;339        }
;;;340    #endif
;;;341        OS_ENTER_CRITICAL();
;;;342        pq             = (OS_Q *)pevent->OSEventPtr;      /* Point to queue storage structure              */
;;;343        pq->OSQIn      = pq->OSQStart;
;;;344        pq->OSQOut     = pq->OSQStart;
;;;345        pq->OSQEntries = 0;
;;;346        OS_EXIT_CRITICAL();
;;;347        return (OS_ERR_NONE);
;;;348    }
0001f2  bd10              POP      {r4,pc}
                  |L1.500|
0001f4  7820              LDRB     r0,[r4,#0]
0001f6  2802              CMP      r0,#2
0001f8  d001              BEQ      |L1.510|
0001fa  2001              MOVS     r0,#1
0001fc  bd10              POP      {r4,pc}
                  |L1.510|
0001fe  f7fff7ff          BL       OS_CPU_SR_Save
000202  6861              LDR      r1,[r4,#4]
000204  684a              LDR      r2,[r1,#4]
000206  60ca              STR      r2,[r1,#0xc]
000208  684a              LDR      r2,[r1,#4]
00020a  610a              STR      r2,[r1,#0x10]
00020c  2200              MOVS     r2,#0
00020e  82ca              STRH     r2,[r1,#0x16]
000210  f7fff7ff          BL       OS_CPU_SR_Restore
000214  2000              MOVS     r0,#0
000216  bd10              POP      {r4,pc}
;;;349    #endif
                          ENDP

                  OSQPend PROC
;;;388    void  *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;389    {
000218  e92de92d          PUSH     {r4-r10,lr}
00021c  4605              MOV      r5,r0
00021e  460f              MOV      r7,r1
000220  4614              MOV      r4,r2
;;;390        void      *pmsg;
;;;391        OS_Q      *pq;
;;;392        INT8U      pend_stat;
;;;393    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;394        OS_CPU_SR  cpu_sr = 0;
;;;395    #endif
;;;396    
;;;397    
;;;398    
;;;399    #if OS_ARG_CHK_EN > 0
;;;400        if (perr == (INT8U *)0) {                    /* Validate 'perr'                                    */
000222  b914              CBNZ     r4,|L1.554|
;;;401            return ((void *)0);
000224  2000              MOVS     r0,#0
000226  e8bde8bd          POP      {r4-r10,pc}
                  |L1.554|
;;;402        }
;;;403        if (pevent == (OS_EVENT *)0) {               /* Validate 'pevent'                                  */
00022a  b925              CBNZ     r5,|L1.566|
;;;404            *perr = OS_ERR_PEVENT_NULL;
00022c  2004              MOVS     r0,#4
00022e  7020              STRB     r0,[r4,#0]
;;;405            return ((void *)0);
000230  2000              MOVS     r0,#0
000232  e8bde8bd          POP      {r4-r10,pc}
                  |L1.566|
;;;406        }
;;;407        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type                          */
000236  7828              LDRB     r0,[r5,#0]
000238  2802              CMP      r0,#2
00023a  d004              BEQ      |L1.582|
;;;408            *perr = OS_ERR_EVENT_TYPE;
00023c  2001              MOVS     r0,#1
00023e  7020              STRB     r0,[r4,#0]
;;;409            return ((void *)0);
000240  2000              MOVS     r0,#0
000242  e8bde8bd          POP      {r4-r10,pc}
                  |L1.582|
;;;410        }
;;;411    #endif
;;;412        if (OSIntNesting > 0) {                      /* See if called from ISR ...                         */

⌨️ 快捷键说明

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