📄 os_flag.s79
字号:
// 209 OSFlagFreeList = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
LDR R2,[R6, #+4]
STR R2,[R1, #+0]
// 210 pgrp->OSFlagType = OS_EVENT_TYPE_FLAG; /* Set to event flag group type */
MOVS R1,#+5
STRB R1,[R6, #+0]
// 211 pgrp->OSFlagFlags = flags; /* Set to desired initial value */
STRH R5,[R6, #+8]
// 212 pgrp->OSFlagWaitList = (void *)0; /* Clear list of tasks waiting on flags */
MOVS R1,#+0
STR R1,[R6, #+4]
// 213 #if OS_FLAG_NAME_SIZE > 1
// 214 pgrp->OSFlagName[0] = '?';
MOVS R1,#+63
STRB R1,[R6, #+10]
// 215 pgrp->OSFlagName[1] = OS_ASCII_NUL;
MOVS R1,#+0
STRB R1,[R6, #+11]
// 216 #endif
// 217 OS_EXIT_CRITICAL();
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 218 *err = OS_NO_ERR;
MOVS R0,#+0
B ??OSFlagCreate_3
// 219 } else {
// 220 OS_EXIT_CRITICAL();
??OSFlagCreate_2:
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 221 *err = OS_FLAG_GRP_DEPLETED;
MOVS R0,#+154
??OSFlagCreate_3:
STRB R0,[R4, #+0]
// 222 }
// 223 return (pgrp); /* Return pointer to event flag group */
MOVS R0,R6
??OSFlagCreate_1:
POP {R4-R6}
POP {R1}
BX R1 ;; return
CFI EndBlock cfiBlock3
// 224 }
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock4 Using cfiCommon0
CFI NoFunction
ARM
??OSFlagDel??rA:
ADD R12,PC,#+1
BX R12
CFI EndBlock cfiBlock4
REQUIRE OSFlagDel
// 225
// 226 /*$PAGE*/
// 227 /*
// 228 *********************************************************************************************************
// 229 * DELETE AN EVENT FLAG GROUP
// 230 *
// 231 * Description: This function deletes an event flag group and readies all tasks pending on the event flag
// 232 * group.
// 233 *
// 234 * Arguments : pgrp is a pointer to the desired event flag group.
// 235 *
// 236 * opt determines delete options as follows:
// 237 * opt == OS_DEL_NO_PEND Deletes the event flag group ONLY if no task pending
// 238 * opt == OS_DEL_ALWAYS Deletes the event flag group even if tasks are
// 239 * waiting. In this case, all the tasks pending will be
// 240 * readied.
// 241 *
// 242 * err is a pointer to an error code that can contain one of the following values:
// 243 * OS_NO_ERR The call was successful and the event flag group was
// 244 * deleted
// 245 * OS_ERR_DEL_ISR If you attempted to delete the event flag group from
// 246 * an ISR
// 247 * OS_FLAG_INVALID_PGRP If 'pgrp' is a NULL pointer.
// 248 * OS_ERR_EVENT_TYPE If you didn't pass a pointer to an event flag group
// 249 * OS_ERR_INVALID_OPT An invalid option was specified
// 250 * OS_ERR_TASK_WAITING One or more tasks were waiting on the event flag
// 251 * group.
// 252 *
// 253 * Returns : pevent upon error
// 254 * (OS_EVENT *)0 if the semaphore was successfully deleted.
// 255 *
// 256 * Note(s) : 1) This function must be used with care. Tasks that would normally expect the presence of
// 257 * the event flag group MUST check the return code of OSFlagAccept() and OSFlagPend().
// 258 * 2) This call can potentially disable interrupts for a long time. The interrupt disable
// 259 * time is directly proportional to the number of tasks waiting on the event flag group.
// 260 *********************************************************************************************************
// 261 */
// 262
// 263 #if OS_FLAG_DEL_EN > 0
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock5 Using cfiCommon1
CFI Function OSFlagDel
THUMB
// 264 OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
// 265 {
OSFlagDel:
PUSH {R4-R7,LR}
CFI ?RET Frame(CFA, -4)
CFI R7 Frame(CFA, -8)
CFI R6 Frame(CFA, -12)
CFI R5 Frame(CFA, -16)
CFI R4 Frame(CFA, -20)
CFI CFA R13+20
SUB SP,SP,#+4
CFI CFA R13+24
MOVS R4,R0
MOVS R7,R1
MOVS R5,R2
// 266 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
// 267 OS_CPU_SR cpu_sr;
// 268 #endif
// 269 BOOLEAN tasks_waiting;
// 270 OS_FLAG_NODE *pnode;
// 271
// 272
// 273 if (OSIntNesting > 0) { /* See if called from ISR ... */
LDR R0,??DataTable2 ;; OSIntNesting
LDRB R0,[R0, #+0]
CMP R0,#+0
BEQ ??OSFlagDel_0
// 274 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
MOVS R0,#+140
B.N ??OSFlagDel_1
// 275 return (pgrp);
// 276 }
// 277 #if OS_ARG_CHK_EN > 0
// 278 if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
??OSFlagDel_0:
CMP R4,#+0
BNE ??OSFlagDel_2
// 279 *err = OS_FLAG_INVALID_PGRP;
MOVS R0,#+150
STRB R0,[R5, #+0]
// 280 return (pgrp);
MOVS R0,#+0
B ??OSFlagDel_3
// 281 }
// 282 #endif
// 283 if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
??OSFlagDel_2:
LDRB R0,[R4, #+0]
CMP R0,#+5
BEQ ??OSFlagDel_4
// 284 *err = OS_ERR_EVENT_TYPE;
MOVS R0,#+1
B.N ??OSFlagDel_1
// 285 return (pgrp);
// 286 }
// 287 OS_ENTER_CRITICAL();
??OSFlagDel_4:
_BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
STR R0,[SP, #+0]
// 288 if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
LDR R0,[R4, #+4]
CMP R0,#+0
BEQ ??OSFlagDel_5
// 289 tasks_waiting = TRUE; /* Yes */
MOVS R6,#+1
B ??OSFlagDel_6
// 290 } else {
// 291 tasks_waiting = FALSE; /* No */
??OSFlagDel_5:
MOVS R6,#+0
// 292 }
// 293 switch (opt) {
??OSFlagDel_6:
CMP R7,#+0
BEQ ??OSFlagDel_7
CMP R7,#+1
BEQ ??OSFlagDel_8
B ??OSFlagDel_9
// 294 case OS_DEL_NO_PEND: /* Delete group if no task waiting */
// 295 if (tasks_waiting == FALSE) {
??OSFlagDel_7:
CMP R6,#+0
BNE ??OSFlagDel_10
// 296 #if OS_FLAG_NAME_SIZE > 1
// 297 pgrp->OSFlagName[0] = '?'; /* Unknown name */
MOVS R0,#+63
STRB R0,[R4, #+10]
// 298 pgrp->OSFlagName[1] = OS_ASCII_NUL;
MOVS R0,#+0
STRB R0,[R4, #+11]
// 299 #endif
// 300 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
STRB R0,[R4, #+0]
// 301 pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list */
LDR R0,??DataTable6 ;; OSFlagFreeList
LDR R0,[R0, #+0]
STR R0,[R4, #+4]
// 302 pgrp->OSFlagFlags = (OS_FLAGS)0;
MOVS R0,#+0
STRH R0,[R4, #+8]
// 303 OSFlagFreeList = pgrp;
LDR R0,??DataTable6 ;; OSFlagFreeList
STR R4,[R0, #+0]
// 304 OS_EXIT_CRITICAL();
LDR R0,[SP, #+0]
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 305 *err = OS_NO_ERR;
??OSFlagDel_11:
MOVS R0,#+0
STRB R0,[R5, #+0]
// 306 return ((OS_FLAG_GRP *)0); /* Event Flag Group has been deleted */
B ??OSFlagDel_3
// 307 } else {
// 308 OS_EXIT_CRITICAL();
??OSFlagDel_10:
LDR R0,[SP, #+0]
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 309 *err = OS_ERR_TASK_WAITING;
MOVS R0,#+8
B.N ??OSFlagDel_1
// 310 return (pgrp);
// 311 }
// 312
// 313 case OS_DEL_ALWAYS: /* Always delete the event flag group */
// 314 pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
??OSFlagDel_8:
MOVS R7,R0
BEQ ??OSFlagDel_12
// 315 while (pnode != (OS_FLAG_NODE *)0) { /* Ready ALL tasks waiting for flags */
// 316 OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
??OSFlagDel_13:
MOVS R1,#+0
MOVS R0,R7
BL OS_FlagTaskRdy
// 317 pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
LDR R7,[R7, #+0]
// 318 }
CMP R7,#+0
BNE ??OSFlagDel_13
// 319 #if OS_EVENT_NAME_SIZE > 1
// 320 pgrp->OSFlagName[0] = '?'; /* Unknown name */
??OSFlagDel_12:
MOVS R0,#+63
STRB R0,[R4, #+10]
// 321 pgrp->OSFlagName[1] = OS_ASCII_NUL;
MOVS R0,#+0
STRB R0,[R4, #+11]
// 322 #endif
// 323 pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
STRB R0,[R4, #+0]
// 324 pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list */
LDR R0,??DataTable6 ;; OSFlagFreeList
LDR R0,[R0, #+0]
STR R0,[R4, #+4]
// 325 pgrp->OSFlagFlags = (OS_FLAGS)0;
MOVS R0,#+0
STRH R0,[R4, #+8]
// 326 OSFlagFreeList = pgrp;
LDR R0,??DataTable6 ;; OSFlagFreeList
STR R4,[R0, #+0]
// 327 OS_EXIT_CRITICAL();
LDR R0,[SP, #+0]
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 328 if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiting */
CMP R6,#+1
BNE ??OSFlagDel_11
// 329 OS_Sched(); /* Find highest priority task ready to run */
_BLF OS_Sched,??OS_Sched??rT
// 330 }
// 331 *err = OS_NO_ERR;
??OSFlagDel_14:
B.N ??OSFlagDel_11
// 332 return ((OS_FLAG_GRP *)0); /* Event Flag Group has been deleted */
// 333
// 334 default:
// 335 OS_EXIT_CRITICAL();
??OSFlagDel_9:
LDR R0,[SP, #+0]
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 336 *err = OS_ERR_INVALID_OPT;
MOVS R0,#+7
??OSFlagDel_1:
STRB R0,[R5, #+0]
// 337 return (pgrp);
MOVS R0,R4
??OSFlagDel_3:
ADD SP,SP,#+4
CFI CFA R13+20
POP {R4-R7}
POP {R1}
BX R1 ;; return
CFI EndBlock cfiBlock5
// 338 }
// 339 }
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable2:
DC32 OSIntNesting
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable6:
DC32 OSFlagFreeList
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock6 Using cfiCommon0
CFI NoFunction
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -