os_q.txt

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

TXT
1,204
字号
;;;243        } else {
;;;244            tasks_waiting = OS_FALSE;                          /* No                                       */
;;;245        }
;;;246        switch (opt) {
;;;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        */
;;;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                             */
;;;276                 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;277    #endif
;;;278                 pq                     = (OS_Q *)pevent->OSEventPtr;   /* Return OS_Q to free list        */
;;;279                 pq->OSQPtr             = OSQFreeList;
;;;280                 OSQFreeList            = pq;
;;;281                 pevent->OSEventType    = OS_EVENT_TYPE_UNUSED;
;;;282                 pevent->OSEventPtr     = OSEventFreeList;     /* Return Event Control Block to free list  */
;;;283                 pevent->OSEventCnt     = 0;
;;;284                 OSEventFreeList        = pevent;              /* Get next free event control block        */
;;;285                 OS_EXIT_CRITICAL();
;;;286                 if (tasks_waiting == OS_TRUE) {               /* Reschedule only if task(s) were waiting  */
;;;287                     OS_Sched();                               /* Find highest priority task ready to run  */
;;;288                 }
;;;289                 *perr                  = OS_ERR_NONE;
;;;290                 pevent_return          = (OS_EVENT *)0;       /* Queue has been deleted                   */
;;;291                 break;
;;;292    
;;;293            default:
;;;294                 OS_EXIT_CRITICAL();
;;;295                 *perr                  = OS_ERR_INVALID_OPT;
;;;296                 pevent_return          = pevent;
;;;297                 break;
;;;298        }
;;;299        return (pevent_return);
;;;300    }
0000e8  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.236|
0000ec  b924              CBNZ     r4,|L1.248|
0000ee  2004              MOVS     r0,#4                 ;228
0000f0  7028              STRB     r0,[r5,#0]            ;228
0000f2  4620              MOV      r0,r4                 ;229
0000f4  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.248|
0000f8  7820              LDRB     r0,[r4,#0]            ;232
0000fa  2802              CMP      r0,#2                 ;232
0000fc  d004              BEQ      |L1.264|
0000fe  2001              MOVS     r0,#1                 ;233
000100  7028              STRB     r0,[r5,#0]            ;233
000102  4620              MOV      r0,r4                 ;234
000104  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.264|
000108  48d2              LDR      r0,|L1.1108|
00010a  7800              LDRB     r0,[r0,#0]            ;236  ; OSIntNesting
00010c  b120              CBZ      r0,|L1.280|
00010e  200f              MOVS     r0,#0xf               ;237
000110  7028              STRB     r0,[r5,#0]            ;237
000112  4620              MOV      r0,r4                 ;238
000114  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.280|
000118  f7fffffe          BL       OS_CPU_SR_Save
00011c  4683              MOV      r11,r0                ;240
00011e  7aa1              LDRB     r1,[r4,#0xa]          ;241
000120  b109              CBZ      r1,|L1.294|
000122  2601              MOVS     r6,#1                 ;242
000124  e000              B        |L1.296|
                  |L1.294|
000126  2600              MOVS     r6,#0                 ;244
                  |L1.296|
000128  0038              MOVS     r0,r7                 ;246
00012a  f8df8330          LDR      r8,|L1.1116|
00012e  f8df9328          LDR      r9,|L1.1112|
000132  f04f073f          MOV      r7,#0x3f              ;246
000136  f04f0a00          MOV      r10,#0                ;246
00013a  d004              BEQ      |L1.326|
00013c  2801              CMP      r0,#1                 ;246
00013e  d14c              BNE      |L1.474|
000140  2900              CMP      r1,#0                 ;271
000142  d02c              BEQ      |L1.414|
000144  e022              B        |L1.396|
                  |L1.326|
000146  b9ce              CBNZ     r6,|L1.380|
000148  73e7              STRB     r7,[r4,#0xf]          ;250
00014a  f884a010          STRB     r10,[r4,#0x10]        ;251
00014e  6860              LDR      r0,[r4,#4]            ;253
000150  f8d81000          LDR      r1,[r8,#0]            ;254  ; OSQFreeList
000154  6001              STR      r1,[r0,#0]            ;254
000156  f8c80000          STR      r0,[r8,#0]            ;255  ; OSQFreeList
00015a  f884a000          STRB     r10,[r4,#0]           ;256
00015e  f8d90000          LDR      r0,[r9,#0]            ;257  ; OSEventFreeList
000162  6060              STR      r0,[r4,#4]            ;257
000164  f8a4a008          STRH     r10,[r4,#8]           ;258
000168  f8c94000          STR      r4,[r9,#0]            ;259  ; OSEventFreeList
00016c  4658              MOV      r0,r11                ;260
00016e  f7fffffe          BL       OS_CPU_SR_Restore
000172  f885a000          STRB     r10,[r5,#0]           ;261
000176  2000              MOVS     r0,#0                 ;262
000178  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.380|
00017c  4658              MOV      r0,r11                ;264
00017e  f7fffffe          BL       OS_CPU_SR_Restore
000182  2049              MOVS     r0,#0x49              ;265
000184  7028              STRB     r0,[r5,#0]            ;265
000186  4620              MOV      r0,r4                 ;266
000188  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.396|
00018c  2300              MOVS     r3,#0                 ;272
00018e  2204              MOVS     r2,#4                 ;272
000190  4619              MOV      r1,r3                 ;272
000192  4620              MOV      r0,r4                 ;272
000194  f7fffffe          BL       OS_EventTaskRdy
000198  7aa0              LDRB     r0,[r4,#0xa]          ;271
00019a  2800              CMP      r0,#0                 ;271
00019c  d1f6              BNE      |L1.396|
                  |L1.414|
00019e  73e7              STRB     r7,[r4,#0xf]          ;275
0001a0  f884a010          STRB     r10,[r4,#0x10]        ;276
0001a4  6860              LDR      r0,[r4,#4]            ;278
0001a6  f8d81000          LDR      r1,[r8,#0]            ;279  ; OSQFreeList
0001aa  6001              STR      r1,[r0,#0]            ;279
0001ac  f8c80000          STR      r0,[r8,#0]            ;280  ; OSQFreeList
0001b0  f884a000          STRB     r10,[r4,#0]           ;281
0001b4  f8d90000          LDR      r0,[r9,#0]            ;282  ; OSEventFreeList
0001b8  6060              STR      r0,[r4,#4]            ;282
0001ba  f8a4a008          STRH     r10,[r4,#8]           ;283
0001be  f8c94000          STR      r4,[r9,#0]            ;284  ; OSEventFreeList
0001c2  4658              MOV      r0,r11                ;285
0001c4  f7fffffe          BL       OS_CPU_SR_Restore
0001c8  2e01              CMP      r6,#1                 ;286
0001ca  d101              BNE      |L1.464|
0001cc  f7fffffe          BL       OS_Sched
                  |L1.464|
0001d0  f885a000          STRB     r10,[r5,#0]           ;289
0001d4  2000              MOVS     r0,#0                 ;290
0001d6  e8bd9ff0          POP      {r4-r12,pc}
                  |L1.474|
0001da  4658              MOV      r0,r11                ;294
0001dc  f7fffffe          BL       OS_CPU_SR_Restore
0001e0  2007              MOVS     r0,#7                 ;295
0001e2  7028              STRB     r0,[r5,#0]            ;295
0001e4  4620              MOV      r0,r4                 ;296
0001e6  e8bd9ff0          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]            ;337
0001f6  2802              CMP      r0,#2                 ;337
0001f8  d001              BEQ      |L1.510|
0001fa  2001              MOVS     r0,#1                 ;338
0001fc  bd10              POP      {r4,pc}
                  |L1.510|
0001fe  f7fffffe          BL       OS_CPU_SR_Save
000202  6861              LDR      r1,[r4,#4]            ;342
000204  684a              LDR      r2,[r1,#4]            ;343
000206  60ca              STR      r2,[r1,#0xc]          ;343
000208  684a              LDR      r2,[r1,#4]            ;344
00020a  610a              STR      r2,[r1,#0x10]         ;344
00020c  2200              MOVS     r2,#0                 ;345
00020e  82ca              STRH     r2,[r1,#0x16]         ;345
000210  f7fffffe          BL       OS_CPU_SR_Restore
000214  2000              MOVS     r0,#0                 ;347
000216  bd10              POP      {r4,pc}
;;;349    #endif
                          ENDP

                  OSQPend PROC
;;;388    void  *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
;;;389    {
000218  e92d47f0          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
;;;402        }

⌨️ 快捷键说明

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