📄 os_flag.s79
字号:
CFI Function OSFlagCreate
THUMB
// 193 OS_FLAG_GRP *OSFlagCreate (OS_FLAGS flags, INT8U *err)
// 194 {
OSFlagCreate:
PUSH {R4-R6,LR}
CFI ?RET Frame(CFA, -4)
CFI R6 Frame(CFA, -8)
CFI R5 Frame(CFA, -12)
CFI R4 Frame(CFA, -16)
CFI CFA R13+16
MOVS R4,R0
MOVS R5,R1
// 195 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
// 196 OS_CPU_SR cpu_sr;
// 197 #endif
// 198 OS_FLAG_GRP *pgrp;
// 199
// 200
// 201 if (OSIntNesting > 0) { /* See if called from ISR ... */
LDR R0,??DataTable4 ;; OSIntNesting
LDRB R0,[R0, #+0]
CMP R0,#+1
BCC ??OSFlagCreate_0
// 202 *err = OS_ERR_CREATE_ISR; /* ... can't CREATE from an ISR */
MOVS R0,#+141
STRB R0,[R5, #+0]
// 203 return ((OS_FLAG_GRP *)0);
MOVS R0,#+0
B ??OSFlagCreate_1
// 204 }
// 205 OS_ENTER_CRITICAL();
??OSFlagCreate_0:
_BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
// 206 pgrp = OSFlagFreeList; /* Get next free event flag */
LDR R1,??DataTable8 ;; OSFlagFreeList
LDR R6,[R1, #+0]
// 207 if (pgrp != (OS_FLAG_GRP *)0) { /* See if we have event flag groups available */
CMP R6,#+0
BEQ ??OSFlagCreate_2
// 208 /* Adjust free list */
// 209 OSFlagFreeList = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
LDR R1,??DataTable8 ;; OSFlagFreeList
LDR R2,??DataTable8 ;; OSFlagFreeList
LDR R2,[R2, #+0]
LDR R2,[R2, #+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 R4,[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
STRB R0,[R5, #+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
STRB R0,[R5, #+0]
// 222 }
// 223 return (pgrp); /* Return pointer to event flag group */
??OSFlagCreate_3:
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 {R1,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+24
SUB SP,SP,#+4
CFI CFA R13+28
MOVS R4,R0
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,??DataTable4 ;; OSIntNesting
LDRB R0,[R0, #+0]
CMP R0,#+1
BCC ??OSFlagDel_0
// 274 *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
MOVS R0,#+140
STRB R0,[R5, #+0]
// 275 return (pgrp);
MOVS R0,R4
B ??OSFlagDel_1
// 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,R4
B ??OSFlagDel_1
// 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_3
// 284 *err = OS_ERR_EVENT_TYPE;
MOVS R0,#+1
STRB R0,[R5, #+0]
// 285 return (pgrp);
MOVS R0,R4
B ??OSFlagDel_1
// 286 }
// 287 OS_ENTER_CRITICAL();
??OSFlagDel_3:
_BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
MOVS R6,R0
// 288 if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
LDR R0,[R4, #+4]
CMP R0,#+0
BEQ ??OSFlagDel_4
// 289 tasks_waiting = TRUE; /* Yes */
MOVS R7,#+1
B ??OSFlagDel_5
// 290 } else {
// 291 tasks_waiting = FALSE; /* No */
??OSFlagDel_4:
MOVS R7,#+0
// 292 }
// 293 switch (opt) {
??OSFlagDel_5:
MOV R0,SP
LDRB R0,[R0, #+4]
CMP R0,#+0
BEQ ??OSFlagDel_6
CMP R0,#+1
BEQ ??OSFlagDel_7
B ??OSFlagDel_8
// 294 case OS_DEL_NO_PEND: /* Delete group if no task waiting */
// 295 if (tasks_waiting == FALSE) {
??OSFlagDel_6:
CMP R7,#+0
BNE ??OSFlagDel_9
// 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;
MOVS R0,#+0
STRB R0,[R4, #+0]
// 301 pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list */
LDR R0,??DataTable8 ;; 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,??DataTable8 ;; OSFlagFreeList
STR R4,[R0, #+0]
// 304 OS_EXIT_CRITICAL();
MOVS R0,R6
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 305 *err = OS_NO_ERR;
MOVS R0,#+0
STRB R0,[R5, #+0]
// 306 return ((OS_FLAG_GRP *)0); /* Event Flag Group has been deleted */
MOVS R0,#+0
B ??OSFlagDel_1
// 307 } else {
// 308 OS_EXIT_CRITICAL();
??OSFlagDel_9:
MOVS R0,R6
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 309 *err = OS_ERR_TASK_WAITING;
MOVS R0,#+8
STRB R0,[R5, #+0]
// 310 return (pgrp);
MOVS R0,R4
B ??OSFlagDel_1
// 311 }
// 312
// 313 case OS_DEL_ALWAYS: /* Always delete the event flag group */
// 314 pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
??OSFlagDel_7:
LDR R0,[R4, #+4]
STR R0,[SP, #+0]
B ??OSFlagDel_10
// 315 while (pnode != (OS_FLAG_NODE *)0) { /* Ready ALL tasks waiting for flags */
// 316 OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
??OSFlagDel_11:
MOVS R1,#+0
LDR R0,[SP, #+0]
BL OS_FlagTaskRdy
// 317 pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
LDR R0,[SP, #+0]
LDR R0,[R0, #+0]
STR R0,[SP, #+0]
// 318 }
??OSFlagDel_10:
LDR R0,[SP, #+0]
CMP R0,#+0
BNE ??OSFlagDel_11
// 319 #if OS_EVENT_NAME_SIZE > 1
// 320 pgrp->OSFlagName[0] = '?'; /* Unknown name */
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;
MOVS R0,#+0
STRB R0,[R4, #+0]
// 324 pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list */
LDR R0,??DataTable8 ;; OSFlagFreeList
LDR R0,[R0, #+0]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -