?? os_mbox.lst
字號:
\ 00000036 002D CMP R5,#+0
\ 00000038 09D0 BEQ.N ??OSMboxCreate_3
114 pevent->OSEventType = OS_EVENT_TYPE_MBOX;
\ 0000003A 0120 MOVS R0,#+1
\ 0000003C 2870 STRB R0,[R5, #+0]
115 pevent->OSEventCnt = 0u;
\ 0000003E 0020 MOVS R0,#+0
\ 00000040 2881 STRH R0,[R5, #+8]
116 pevent->OSEventPtr = pmsg; /* Deposit message in event control block */
\ 00000042 6C60 STR R4,[R5, #+4]
117 #if OS_EVENT_NAME_EN > 0u
118 pevent->OSEventName = (INT8U *)(void *)"?";
\ 00000044 .... ADR.N R0,??DataTable3 ;; "\?"
\ 00000046 6861 STR R0,[R5, #+20]
119 #endif
120 OS_EventWaitListInit(pevent);
\ 00000048 2800 MOVS R0,R5
\ 0000004A ........ BL OS_EventWaitListInit
121 }
122 return (pevent); /* Return pointer to event control block */
\ ??OSMboxCreate_3:
\ 0000004E 2800 MOVS R0,R5
\ ??OSMboxCreate_1:
\ 00000050 70BD POP {R4-R6,PC} ;; return
123 }
124 /*$PAGE*/
125 /*
126 *********************************************************************************************************
127 * DELETE A MAIBOX
128 *
129 * Description: This function deletes a mailbox and readies all tasks pending on the mailbox.
130 *
131 * Arguments : pevent is a pointer to the event control block associated with the desired
132 * mailbox.
133 *
134 * opt determines delete options as follows:
135 * opt == OS_DEL_NO_PEND Delete the mailbox ONLY if no task pending
136 * opt == OS_DEL_ALWAYS Deletes the mailbox even if tasks are waiting.
137 * In this case, all the tasks pending will be readied.
138 *
139 * perr is a pointer to an error code that can contain one of the following values:
140 * OS_ERR_NONE The call was successful and the mailbox was deleted
141 * OS_ERR_DEL_ISR If you attempted to delete the mailbox from an ISR
142 * OS_ERR_INVALID_OPT An invalid option was specified
143 * OS_ERR_TASK_WAITING One or more tasks were waiting on the mailbox
144 * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a mailbox
145 * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
146 *
147 * Returns : pevent upon error
148 * (OS_EVENT *)0 if the mailbox was successfully deleted.
149 *
150 * Note(s) : 1) This function must be used with care. Tasks that would normally expect the presence of
151 * the mailbox MUST check the return code of OSMboxPend().
152 * 2) OSMboxAccept() callers will not know that the intended mailbox has been deleted!
153 * 3) This call can potentially disable interrupts for a long time. The interrupt disable
154 * time is directly proportional to the number of tasks waiting on the mailbox.
155 * 4) Because ALL tasks pending on the mailbox will be readied, you MUST be careful in
156 * applications where the mailbox is used for mutual exclusion because the resource(s)
157 * will no longer be guarded by the mailbox.
158 *********************************************************************************************************
159 */
160
161 #if OS_MBOX_DEL_EN > 0u
\ In section .text, align 2, keep-with-next
162 OS_EVENT *OSMboxDel (OS_EVENT *pevent,
163 INT8U opt,
164 INT8U *perr)
165 {
\ OSMboxDel:
\ 00000000 2DE9F843 PUSH {R3-R9,LR}
\ 00000004 8146 MOV R9,R0
\ 00000006 0C00 MOVS R4,R1
\ 00000008 1500 MOVS R5,R2
166 BOOLEAN tasks_waiting;
167 OS_EVENT *pevent_return;
168 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
169 OS_CPU_SR cpu_sr = 0u;
\ 0000000A 5FF00008 MOVS R8,#+0
170 #endif
171
172
173
174 #ifdef OS_SAFETY_CRITICAL
175 if (perr == (INT8U *)0) {
176 OS_SAFETY_CRITICAL_EXCEPTION();
177 return ((OS_EVENT *)0);
178 }
179 #endif
180
181 #if OS_ARG_CHK_EN > 0u
182 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
183 *perr = OS_ERR_PEVENT_NULL;
184 return (pevent);
185 }
186 #endif
187 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
\ 0000000E 99F80000 LDRB R0,[R9, #+0]
\ 00000012 0128 CMP R0,#+1
\ 00000014 03D0 BEQ.N ??OSMboxDel_0
188 *perr = OS_ERR_EVENT_TYPE;
\ 00000016 0120 MOVS R0,#+1
\ 00000018 2870 STRB R0,[R5, #+0]
189 return (pevent);
\ 0000001A 4846 MOV R0,R9
\ 0000001C 6AE0 B.N ??OSMboxDel_1
190 }
191 if (OSIntNesting > 0u) { /* See if called from ISR ... */
\ ??OSMboxDel_0:
\ 0000001E .... LDR.N R0,??DataTable3_1
\ 00000020 0078 LDRB R0,[R0, #+0]
\ 00000022 0028 CMP R0,#+0
\ 00000024 03D0 BEQ.N ??OSMboxDel_2
192 *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
\ 00000026 0F20 MOVS R0,#+15
\ 00000028 2870 STRB R0,[R5, #+0]
193 return (pevent);
\ 0000002A 4846 MOV R0,R9
\ 0000002C 62E0 B.N ??OSMboxDel_1
194 }
195 OS_ENTER_CRITICAL();
\ ??OSMboxDel_2:
\ 0000002E ........ BL OS_CPU_SR_Save
\ 00000032 8046 MOV R8,R0
196 if (pevent->OSEventGrp != 0u) { /* See if any tasks waiting on mailbox */
\ 00000034 99F80A00 LDRB R0,[R9, #+10]
\ 00000038 0028 CMP R0,#+0
\ 0000003A 02D0 BEQ.N ??OSMboxDel_3
197 tasks_waiting = OS_TRUE; /* Yes */
\ 0000003C 0120 MOVS R0,#+1
\ 0000003E 0600 MOVS R6,R0
\ 00000040 01E0 B.N ??OSMboxDel_4
198 } else {
199 tasks_waiting = OS_FALSE; /* No */
\ ??OSMboxDel_3:
\ 00000042 0020 MOVS R0,#+0
\ 00000044 0600 MOVS R6,R0
200 }
201 switch (opt) {
\ ??OSMboxDel_4:
\ 00000046 E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 00000048 002C CMP R4,#+0
\ 0000004A 02D0 BEQ.N ??OSMboxDel_5
\ 0000004C 012C CMP R4,#+1
\ 0000004E 22D0 BEQ.N ??OSMboxDel_6
\ 00000050 49E0 B.N ??OSMboxDel_7
202 case OS_DEL_NO_PEND: /* Delete mailbox only if no task waiting */
203 if (tasks_waiting == OS_FALSE) {
\ ??OSMboxDel_5:
\ 00000052 F6B2 UXTB R6,R6 ;; ZeroExt R6,R6,#+24,#+24
\ 00000054 002E CMP R6,#+0
\ 00000056 17D1 BNE.N ??OSMboxDel_8
204 #if OS_EVENT_NAME_EN > 0u
205 pevent->OSEventName = (INT8U *)(void *)"?";
\ 00000058 .... ADR.N R0,??DataTable3 ;; "\?"
\ 0000005A C9F81400 STR R0,[R9, #+20]
206 #endif
207 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
\ 0000005E 0020 MOVS R0,#+0
\ 00000060 89F80000 STRB R0,[R9, #+0]
208 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
\ 00000064 .... LDR.N R0,??DataTable3_2
\ 00000066 0068 LDR R0,[R0, #+0]
\ 00000068 C9F80400 STR R0,[R9, #+4]
209 pevent->OSEventCnt = 0u;
\ 0000006C 0020 MOVS R0,#+0
\ 0000006E A9F80800 STRH R0,[R9, #+8]
210 OSEventFreeList = pevent; /* Get next free event control block */
\ 00000072 .... LDR.N R0,??DataTable3_2
\ 00000074 C0F80090 STR R9,[R0, #+0]
211 OS_EXIT_CRITICAL();
\ 00000078 4046 MOV R0,R8
\ 0000007A ........ BL OS_CPU_SR_Restore
212 *perr = OS_ERR_NONE;
\ 0000007E 0020 MOVS R0,#+0
\ 00000080 2870 STRB R0,[R5, #+0]
213 pevent_return = (OS_EVENT *)0; /* Mailbox has been deleted */
\ 00000082 0020 MOVS R0,#+0
\ 00000084 0700 MOVS R7,R0
\ 00000086 05E0 B.N ??OSMboxDel_9
214 } else {
215 OS_EXIT_CRITICAL();
\ ??OSMboxDel_8:
\ 00000088 4046 MOV R0,R8
\ 0000008A ........ BL OS_CPU_SR_Restore
216 *perr = OS_ERR_TASK_WAITING;
\ 0000008E 4920 MOVS R0,#+73
\ 00000090 2870 STRB R0,[R5, #+0]
217 pevent_return = pevent;
\ 00000092 4F46 MOV R7,R9
218 }
219 break;
\ ??OSMboxDel_9:
\ 00000094 2DE0 B.N ??OSMboxDel_10
220
221 case OS_DEL_ALWAYS: /* Always delete the mailbox */
222 while (pevent->OSEventGrp != 0u) { /* Ready ALL tasks waiting for mailbox */
\ ??OSMboxDel_6:
\ 00000096 99F80A00 LDRB R0,[R9, #+10]
\ 0000009A 0028 CMP R0,#+0
\ 0000009C 06D0 BEQ.N ??OSMboxDel_11
223 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_MBOX, OS_STAT_PEND_OK);
\ 0000009E 0023 MOVS R3,#+0
\ 000000A0 0222 MOVS R2,#+2
\ 000000A2 0021 MOVS R1,#+0
\ 000000A4 4846 MOV R0,R9
\ 000000A6 ........ BL OS_EventTaskRdy
\ 000000AA F4E7 B.N ??OSMboxDel_6
224 }
225 #if OS_EVENT_NAME_EN > 0u
226 pevent->OSEventName = (INT8U *)(void *)"?";
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -