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

📄 os_q.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 5 页
字号:

                  OSQPostOpt PROC
;;;701    INT8U  OSQPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)
;;;702    {
000930  e92d41f0          PUSH     {r4-r8,lr}
000934  e1a04000          MOV      r4,r0
000938  e1a05001          MOV      r5,r1
00093c  e1a06002          MOV      r6,r2
;;;703        OS_Q      *pq;
;;;704    #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;;;705        OS_CPU_SR  cpu_sr = 0;
000940  e3a08000          MOV      r8,#0
;;;706    #endif
;;;707    
;;;708    
;;;709    
;;;710    #if OS_ARG_CHK_EN > 0
;;;711        if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
000944  e3540000          CMP      r4,#0
000948  1a000002          BNE      |L1.2392|
;;;712            return (OS_ERR_PEVENT_NULL);
00094c  e3a00004          MOV      r0,#4
                  |L1.2384|
000950  e8bd41f0          POP      {r4-r8,lr}
;;;713        }
;;;714    #endif
;;;715        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {     /* Validate event block type                     */
;;;716            return (OS_ERR_EVENT_TYPE);
;;;717        }
;;;718        OS_ENTER_CRITICAL();
;;;719        if (pevent->OSEventGrp != 0x00) {                 /* See if any task pending on queue              */
;;;720            if ((opt & OS_POST_OPT_BROADCAST) != 0x00) {  /* Do we need to post msg to ALL waiting tasks ? */
;;;721                while (pevent->OSEventGrp != 0) {         /* Yes, Post to ALL tasks waiting on queue       */
;;;722                    (void)OS_EventTaskRdy(pevent, msg, OS_STAT_Q, OS_STAT_PEND_OK);
;;;723                }
;;;724            } else {                                      /* No,  Post to HPT waiting on queue             */
;;;725                (void)OS_EventTaskRdy(pevent, msg, OS_STAT_Q, OS_STAT_PEND_OK);
;;;726            }
;;;727            OS_EXIT_CRITICAL();
;;;728            if ((opt & OS_POST_OPT_NO_SCHED) == 0) {	  /* See if scheduler needs to be invoked          */
;;;729                OS_Sched();                               /* Find highest priority task ready to run       */
;;;730            }
;;;731            return (OS_ERR_NONE);
;;;732        }
;;;733        pq = (OS_Q *)pevent->OSEventPtr;                  /* Point to queue control block                  */
;;;734        if (pq->OSQEntries >= pq->OSQSize) {              /* Make sure queue is not full                   */
;;;735            OS_EXIT_CRITICAL();
;;;736            return (OS_ERR_Q_FULL);
;;;737        }
;;;738        if ((opt & OS_POST_OPT_FRONT) != 0x00) {          /* Do we post to the FRONT of the queue?         */
;;;739            if (pq->OSQOut == pq->OSQStart) {             /* Yes, Post as LIFO, Wrap OUT pointer if we ... */
;;;740                pq->OSQOut = pq->OSQEnd;                  /*      ... are at the 1st queue entry           */
;;;741            }
;;;742            pq->OSQOut--;
;;;743            *pq->OSQOut = msg;                            /*      Insert message into queue                */
;;;744        } else {                                          /* No,  Post as FIFO                             */
;;;745            *pq->OSQIn++ = msg;                           /*      Insert message into queue                */
;;;746            if (pq->OSQIn == pq->OSQEnd) {                /*      Wrap IN ptr if we are at end of queue    */
;;;747                pq->OSQIn = pq->OSQStart;
;;;748            }
;;;749        }
;;;750        pq->OSQEntries++;                                 /* Update the nbr of entries in the queue        */
;;;751        OS_EXIT_CRITICAL();
;;;752        return (OS_ERR_NONE);
;;;753    }
000954  e12fff1e          BX       lr
                  |L1.2392|
000958  e5d40000          LDRB     r0,[r4,#0]
00095c  e3500002          CMP      r0,#2
000960  0a000001          BEQ      |L1.2412|
000964  e3a00001          MOV      r0,#1
000968  eafffff8          B        |L1.2384|
                  |L1.2412|
00096c  ebfffffe          BL       OS_CPU_SR_Save
000970  e1a08000          MOV      r8,r0
000974  e5d4000a          LDRB     r0,[r4,#0xa]
000978  e3500000          CMP      r0,#0
00097c  0a000017          BEQ      |L1.2528|
000980  e3160001          TST      r6,#1
000984  0a000009          BEQ      |L1.2480|
000988  ea000004          B        |L1.2464|
                  |L1.2444|
00098c  e3a03000          MOV      r3,#0
000990  e3a02004          MOV      r2,#4
000994  e1a01005          MOV      r1,r5
000998  e1a00004          MOV      r0,r4
00099c  ebfffffe          BL       OS_EventTaskRdy
                  |L1.2464|
0009a0  e5d4000a          LDRB     r0,[r4,#0xa]
0009a4  e3500000          CMP      r0,#0
0009a8  1afffff7          BNE      |L1.2444|
0009ac  ea000004          B        |L1.2500|
                  |L1.2480|
0009b0  e3a03000          MOV      r3,#0
0009b4  e3a02004          MOV      r2,#4
0009b8  e1a01005          MOV      r1,r5
0009bc  e1a00004          MOV      r0,r4
0009c0  ebfffffe          BL       OS_EventTaskRdy
                  |L1.2500|
0009c4  e1a00008          MOV      r0,r8
0009c8  ebfffffe          BL       OS_CPU_SR_Restore
0009cc  e3160004          TST      r6,#4
0009d0  1a000000          BNE      |L1.2520|
0009d4  ebfffffe          BL       OS_Sched
                  |L1.2520|
0009d8  e3a00000          MOV      r0,#0
0009dc  eaffffdb          B        |L1.2384|
                  |L1.2528|
0009e0  e5947004          LDR      r7,[r4,#4]
0009e4  e1d701b6          LDRH     r0,[r7,#0x16]
0009e8  e1d711b4          LDRH     r1,[r7,#0x14]
0009ec  e1500001          CMP      r0,r1
0009f0  ba000003          BLT      |L1.2564|
0009f4  e1a00008          MOV      r0,r8
0009f8  ebfffffe          BL       OS_CPU_SR_Restore
0009fc  e3a0001e          MOV      r0,#0x1e
000a00  eaffffd2          B        |L1.2384|
                  |L1.2564|
000a04  e3160002          TST      r6,#2
000a08  0a00000b          BEQ      |L1.2620|
000a0c  e5970010          LDR      r0,[r7,#0x10]
000a10  e5971004          LDR      r1,[r7,#4]
000a14  e1500001          CMP      r0,r1
000a18  1a000001          BNE      |L1.2596|
000a1c  e5970008          LDR      r0,[r7,#8]
000a20  e5870010          STR      r0,[r7,#0x10]
                  |L1.2596|
000a24  e5970010          LDR      r0,[r7,#0x10]
000a28  e2400004          SUB      r0,r0,#4
000a2c  e5870010          STR      r0,[r7,#0x10]
000a30  e5970010          LDR      r0,[r7,#0x10]
000a34  e5805000          STR      r5,[r0,#0]
000a38  ea000009          B        |L1.2660|
                  |L1.2620|
000a3c  e597000c          LDR      r0,[r7,#0xc]
000a40  e2801004          ADD      r1,r0,#4
000a44  e587100c          STR      r1,[r7,#0xc]
000a48  e5805000          STR      r5,[r0,#0]
000a4c  e597000c          LDR      r0,[r7,#0xc]
000a50  e5971008          LDR      r1,[r7,#8]
000a54  e1500001          CMP      r0,r1
000a58  1a000001          BNE      |L1.2660|
000a5c  e5970004          LDR      r0,[r7,#4]
000a60  e587000c          STR      r0,[r7,#0xc]
                  |L1.2660|
000a64  e1d701b6          LDRH     r0,[r7,#0x16]
000a68  e2800001          ADD      r0,r0,#1
000a6c  e3c00801          BIC      r0,r0,#0x10000
000a70  e1c701b6          STRH     r0,[r7,#0x16]
000a74  e1a00008          MOV      r0,r8
000a78  ebfffffe          BL       OS_CPU_SR_Restore
000a7c  e3a00000          MOV      r0,#0
000a80  eaffffb2          B        |L1.2384|
                          ENDP

                  OSQQuery PROC
;;;775    INT8U  OSQQuery (OS_EVENT *pevent, OS_Q_DATA *p_q_data)
;;;776    {
000a84  e92d47f0          PUSH     {r4-r10,lr}
000a88  e1a04000          MOV      r4,r0
000a8c  e1a05001          MOV      r5,r1
;;;777        OS_Q      *pq;
;;;778        INT8U      i;
;;;779    #if OS_LOWEST_PRIO <= 63
;;;780        INT8U     *psrc;
;;;781        INT8U     *pdest;
;;;782    #else
;;;783        INT16U    *psrc;
;;;784        INT16U    *pdest;
;;;785    #endif
;;;786    #if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
;;;787        OS_CPU_SR  cpu_sr = 0;
000a90  e3a0a000          MOV      r10,#0
;;;788    #endif
;;;789    
;;;790    
;;;791    
;;;792    #if OS_ARG_CHK_EN > 0
;;;793        if (pevent == (OS_EVENT *)0) {                     /* Validate 'pevent'                            */
000a94  e3540000          CMP      r4,#0
000a98  1a000002          BNE      |L1.2728|
;;;794            return (OS_ERR_PEVENT_NULL);
000a9c  e3a00004          MOV      r0,#4
                  |L1.2720|
000aa0  e8bd47f0          POP      {r4-r10,lr}
;;;795        }
;;;796        if (p_q_data == (OS_Q_DATA *)0) {                  /* Validate 'p_q_data'                          */
;;;797            return (OS_ERR_PDATA_NULL);
;;;798        }
;;;799    #endif
;;;800        if (pevent->OSEventType != OS_EVENT_TYPE_Q) {      /* Validate event block type                    */
;;;801            return (OS_ERR_EVENT_TYPE);
;;;802        }
;;;803        OS_ENTER_CRITICAL();
;;;804        p_q_data->OSEventGrp = pevent->OSEventGrp;         /* Copy message queue wait list                 */
;;;805        psrc                 = &pevent->OSEventTbl[0];
;;;806        pdest                = &p_q_data->OSEventTbl[0];
;;;807        for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
;;;808            *pdest++ = *psrc++;
;;;809        }
;;;810        pq = (OS_Q *)pevent->OSEventPtr;
;;;811        if (pq->OSQEntries > 0) {
;;;812            p_q_data->OSMsg = *pq->OSQOut;                 /* Get next message to return if available      */
;;;813        } else {
;;;814            p_q_data->OSMsg = (void *)0;
;;;815        }
;;;816        p_q_data->OSNMsgs = pq->OSQEntries;
;;;817        p_q_data->OSQSize = pq->OSQSize;
;;;818        OS_EXIT_CRITICAL();
;;;819        return (OS_ERR_NONE);
;;;820    }
000aa4  e12fff1e          BX       lr
                  |L1.2728|
000aa8  e3550000          CMP      r5,#0
000aac  1a000001          BNE      |L1.2744|
000ab0  e3a00009          MOV      r0,#9
000ab4  eafffff9          B        |L1.2720|
                  |L1.2744|
000ab8  e5d40000          LDRB     r0,[r4,#0]
000abc  e3500002          CMP      r0,#2
000ac0  0a000001          BEQ      |L1.2764|
000ac4  e3a00001          MOV      r0,#1
000ac8  eafffff4          B        |L1.2720|
                  |L1.2764|
000acc  ebfffffe          BL       OS_CPU_SR_Save
000ad0  e1a0a000          MOV      r10,r0
000ad4  e5d4000a          LDRB     r0,[r4,#0xa]
000ad8  e5c5000c          STRB     r0,[r5,#0xc]
000adc  e284800b          ADD      r8,r4,#0xb
000ae0  e2859008          ADD      r9,r5,#8
000ae4  e3a07000          MOV      r7,#0
000ae8  ea000003          B        |L1.2812|
                  |L1.2796|
000aec  e4d80001          LDRB     r0,[r8],#1
000af0  e4c90001          STRB     r0,[r9],#1
000af4  e2870001          ADD      r0,r7,#1
000af8  e20070ff          AND      r7,r0,#0xff
                  |L1.2812|
000afc  e3570004          CMP      r7,#4
000b00  bafffff9          BLT      |L1.2796|
000b04  e5946004          LDR      r6,[r4,#4]
000b08  e1d601b6          LDRH     r0,[r6,#0x16]
000b0c  e3500000          CMP      r0,#0
000b10  da000003          BLE      |L1.2852|
000b14  e5960010          LDR      r0,[r6,#0x10]
000b18  e5900000          LDR      r0,[r0,#0]
000b1c  e5850000          STR      r0,[r5,#0]
000b20  ea000001          B        |L1.2860|
                  |L1.2852|
000b24  e3a00000          MOV      r0,#0
000b28  e5850000          STR      r0,[r5,#0]
                  |L1.2860|
000b2c  e1d601b6          LDRH     r0,[r6,#0x16]
000b30  e1c500b4          STRH     r0,[r5,#4]
000b34  e1d601b4          LDRH     r0,[r6,#0x14]
000b38  e1c500b6          STRH     r0,[r5,#6]
000b3c  e1a0000a          MOV      r0,r10
000b40  ebfffffe          BL       OS_CPU_SR_Restore
000b44  e3a00000          MOV      r0,#0
000b48  eaffffd4          B        |L1.2720|
                          ENDP

                  OS_QInit PROC
;;;839    void  OS_QInit (void)
;;;840    {
000b4c  e92d4070          PUSH     {r4-r6,lr}
;;;841    #if OS_MAX_QS == 1
;;;842        OSQFreeList         = &OSQTbl[0];                /* Only ONE queue!                                */
;;;843        OSQF

⌨️ 快捷键说明

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