os_sem.lst

来自「atmega单片机用的ucos系统 占用内存适中 是atmega单片机合适的操作」· LST 代码 · 共 1,188 行 · 第 1/4 页

LST
1,188
字号
 258 0090 1F93      		push r17
 259 0092 CF93      		push r28
 260 0094 DF93      		push r29
 261               	/* prologue end (size=5) */
 262 0096 EC01      		movw r28,r24
 263 0098 8A01      		movw r16,r20
 159:OSsrc/os_sem.c ****     BOOLEAN    tasks_waiting;
 160:OSsrc/os_sem.c **** #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status regis
 161:OSsrc/os_sem.c ****     OS_CPU_SR  cpu_sr;
 162:OSsrc/os_sem.c **** 
 163:OSsrc/os_sem.c **** 
 164:OSsrc/os_sem.c **** 
 165:OSsrc/os_sem.c ****     cpu_sr = 0;                                            /* Prevent compiler warning             
 166:OSsrc/os_sem.c **** #endif    
 167:OSsrc/os_sem.c ****     if (OSIntNesting > 0) {                                /* See if called from ISR ...           
 265               	.LM29:
 266 009a 8091 0000 		lds r24,OSIntNesting
 267 009e 8823      		tst r24
 268 00a0 11F0      		breq .L10
 168:OSsrc/os_sem.c ****         *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR         
 270               	.LM30:
 271 00a2 8CE8      		ldi r24,lo8(-116)
 272 00a4 5DC0      		rjmp .L27
 273               	.L10:
 169:OSsrc/os_sem.c ****         return (pevent);
 170:OSsrc/os_sem.c ****     }
 171:OSsrc/os_sem.c **** #if OS_ARG_CHK_EN > 0
 172:OSsrc/os_sem.c ****     if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                    
 275               	.LM31:
 276 00a6 2097      		sbiw r28,0
 277 00a8 11F4      		brne .L11
 173:OSsrc/os_sem.c ****         *err = OS_ERR_PEVENT_NULL;
 279               	.LM32:
 280 00aa 84E0      		ldi r24,lo8(4)
 281 00ac 59C0      		rjmp .L27
 282               	.L11:
 174:OSsrc/os_sem.c ****         return (pevent);
 175:OSsrc/os_sem.c ****     }
 176:OSsrc/os_sem.c **** #endif
 177:OSsrc/os_sem.c ****     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type            
 284               	.LM33:
 285 00ae 8881      		ld r24,Y
 286 00b0 8330      		cpi r24,lo8(3)
 287 00b2 11F0      		breq .L12
 178:OSsrc/os_sem.c ****         *err = OS_ERR_EVENT_TYPE;
 289               	.LM34:
 290 00b4 81E0      		ldi r24,lo8(1)
 291 00b6 54C0      		rjmp .L27
 292               	.L12:
 179:OSsrc/os_sem.c ****         return (pevent);
 180:OSsrc/os_sem.c ****     }
 181:OSsrc/os_sem.c ****     OS_ENTER_CRITICAL();
 294               	.LM35:
 295               	/* #APP */
 296 00b8 0FB6      		in __tmp_reg__,__SREG__
 297 00ba F894      		cli
 298 00bc 0F92      		push __tmp_reg__
 182:OSsrc/os_sem.c ****     if (pevent->OSEventGrp != 0x00) {                      /* See if any tasks waiting on semaphore
 300               	.LM36:
 301               	/* #NOAPP */
 302 00be 8981      		ldd r24,Y+1
 303 00c0 8823      		tst r24
 304 00c2 19F0      		breq .L13
 183:OSsrc/os_sem.c ****         tasks_waiting = TRUE;                              /* Yes                                  
 306               	.LM37:
 307 00c4 91E0      		ldi r25,lo8(1)
 308 00c6 F92E      		mov r15,r25
 309 00c8 01C0      		rjmp .L14
 310               	.L13:
 184:OSsrc/os_sem.c ****     } else {
 185:OSsrc/os_sem.c ****         tasks_waiting = FALSE;                             /* No                                   
 312               	.LM38:
 313 00ca F82E      		mov r15,r24
 314               	.L14:
 186:OSsrc/os_sem.c ****     }
 187:OSsrc/os_sem.c ****     switch (opt) {
 316               	.LM39:
 317 00cc 7727      		clr r23
 318 00ce 6115      		cp r22,__zero_reg__
 319 00d0 7105      		cpc r23,__zero_reg__
 320 00d2 21F0      		breq .L16
 321 00d4 6130      		cpi r22,1
 322 00d6 7105      		cpc r23,__zero_reg__
 323 00d8 D1F0      		breq .L19
 324 00da 3FC0      		rjmp .L24
 325               	.L16:
 188:OSsrc/os_sem.c ****         case OS_DEL_NO_PEND:                               /* Delete semaphore only if no task wait
 189:OSsrc/os_sem.c ****              if (tasks_waiting == FALSE) {
 327               	.LM40:
 328 00dc FF20      		tst r15
 329 00de 99F4      		brne .L17
 190:OSsrc/os_sem.c **** #if OS_EVENT_NAME_SIZE > 1
 191:OSsrc/os_sem.c ****                  pevent->OSEventName[0] = '?';             /* Unknown name                         
 331               	.LM41:
 332 00e0 8FE3      		ldi r24,lo8(63)
 333 00e2 8E87      		std Y+14,r24
 192:OSsrc/os_sem.c ****                  pevent->OSEventName[1] = OS_ASCII_NUL;
 335               	.LM42:
 336 00e4 FF86      		std Y+15,r15
 193:OSsrc/os_sem.c **** #endif
 194:OSsrc/os_sem.c ****                  pevent->OSEventType    = OS_EVENT_TYPE_UNUSED;
 338               	.LM43:
 339 00e6 F882      		st Y,r15
 195:OSsrc/os_sem.c ****                  pevent->OSEventPtr     = OSEventFreeList; /* Return Event Control Block to free li
 341               	.LM44:
 342 00e8 8091 0000 		lds r24,OSEventFreeList
 343 00ec 9091 0000 		lds r25,(OSEventFreeList)+1
 344 00f0 8C83      		std Y+4,r24
 345 00f2 9D83      		std Y+5,r25
 196:OSsrc/os_sem.c ****                  pevent->OSEventCnt     = 0;
 347               	.LM45:
 348 00f4 6A83      		std Y+2,r22
 349 00f6 7B83      		std Y+3,r23
 197:OSsrc/os_sem.c ****                  OSEventFreeList        = pevent;          /* Get next free event control block    
 351               	.LM46:
 352 00f8 D093 0000 		sts (OSEventFreeList)+1,r29
 353 00fc C093 0000 		sts OSEventFreeList,r28
 198:OSsrc/os_sem.c ****                  OS_EXIT_CRITICAL();
 355               	.LM47:
 356               	/* #APP */
 357 0100 0F90      		pop __tmp_reg__
 358 0102 0FBE      		out __SREG__,__tmp_reg__
 359               	/* #NOAPP */
 360 0104 25C0      		rjmp .L23
 361               	.L17:
 199:OSsrc/os_sem.c ****                  *err                   = OS_NO_ERR;
 200:OSsrc/os_sem.c ****                  return ((OS_EVENT *)0);                   /* Semaphore has been deleted           
 201:OSsrc/os_sem.c ****              } else {
 202:OSsrc/os_sem.c ****                  OS_EXIT_CRITICAL();
 363               	.LM48:
 364               	/* #APP */
 365 0106 0F90      		pop __tmp_reg__
 366 0108 0FBE      		out __SREG__,__tmp_reg__
 203:OSsrc/os_sem.c ****                  *err                   = OS_ERR_TASK_WAITING;
 368               	.LM49:
 369               	/* #NOAPP */
 370 010a 88E0      		ldi r24,lo8(8)
 371 010c 29C0      		rjmp .L27
 372               	.L19:
 204:OSsrc/os_sem.c ****                  return (pevent);
 205:OSsrc/os_sem.c ****              }
 206:OSsrc/os_sem.c **** 
 207:OSsrc/os_sem.c ****         case OS_DEL_ALWAYS:                                /* Always delete the semaphore          
 208:OSsrc/os_sem.c ****              while (pevent->OSEventGrp != 0x00) {          /* Ready ALL tasks waiting for semaphore
 209:OSsrc/os_sem.c ****                  (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM);
 374               	.LM50:
 375 010e 8823      		tst r24
 376 0110 41F0      		breq .L26
 377 0112 41E0      		ldi r20,lo8(1)
 378 0114 60E0      		ldi r22,lo8(0)
 379 0116 70E0      		ldi r23,hi8(0)
 380 0118 CE01      		movw r24,r28
 381 011a 0E94 0000 		call OS_EventTaskRdy
 382 011e 8981      		ldd r24,Y+1
 383 0120 F6CF      		rjmp .L19
 384               	.L26:
 210:OSsrc/os_sem.c ****              }
 211:OSsrc/os_sem.c **** #if OS_EVENT_NAME_SIZE > 1
 212:OSsrc/os_sem.c ****              pevent->OSEventName[0] = '?';                 /* Unknown name                         
 386               	.LM51:
 387 0122 8FE3      		ldi r24,lo8(63)
 388 0124 8E87      		std Y+14,r24
 213:OSsrc/os_sem.c ****              pevent->OSEventName[1] = OS_ASCII_NUL;
 390               	.LM52:
 391 0126 1F86      		std Y+15,__zero_reg__
 214:OSsrc/os_sem.c **** #endif
 215:OSsrc/os_sem.c ****              pevent->OSEventType    = OS_EVENT_TYPE_UNUSED;
 393               	.LM53:
 394 0128 1882      		st Y,__zero_reg__
 216:OSsrc/os_sem.c ****              pevent->OSEventPtr     = OSEventFreeList;     /* Return Event Control Block to free li
 396               	.LM54:
 397 012a 8091 0000 		lds r24,OSEventFreeList
 398 012e 9091 0000 		lds r25,(OSEventFreeList)+1
 399 0132 8C83      		std Y+4,r24
 400 0134 9D83      		std Y+5,r25
 217:OSsrc/os_sem.c ****              pevent->OSEventCnt     = 0;
 402               	.LM55:
 403 0136 1A82      		std Y+2,__zero_reg__
 404 0138 1B82      		std Y+3,__zero_reg__
 218:OSsrc/os_sem.c ****              OSEventFreeList        = pevent;              /* Get next free event control block    
 406               	.LM56:
 407 013a D093 0000 		sts (OSEventFreeList)+1,r29
 408 013e C093 0000 		sts OSEventFreeList,r28
 219:OSsrc/os_sem.c ****              OS_EXIT_CRITICAL();
 410               	.LM57:
 411               	/* #APP */
 412 0142 0F90      		pop __tmp_reg__
 413 0144 0FBE      		out __SREG__,__tmp_reg__
 220:OSsrc/os_sem.c ****              if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiti
 415               	.LM58:
 416               	/* #NOAPP */
 417 0146 F1E0      		ldi r31,lo8(1)
 418 0148 FF16      		cp r15,r31
 419 014a 11F4      		brne .L23
 221:OSsrc/os_sem.c ****                  OS_Sched();                               /* Find highest priority task ready to r
 421               	.LM59:
 422 014c 0E94 0000 		call OS_Sched
 423               	.L23:
 222:OSsrc/os_sem.c ****              }
 223:OSsrc/os_sem.c ****              *err = OS_NO_ERR;
 425               	.LM60:
 426 0150 F801      		movw r30,r16
 427 0152 1082      		st Z,__zero_reg__
 224:OSsrc/os_sem.c ****              return ((OS_EVENT *)0);                       /* Semaphore has been deleted           
 429               	.LM61:
 430 0154 80E0      		ldi r24,lo8(0)
 431 0156 90E0      		ldi r25,hi8(0)
 432 0158 06C0      		rjmp .L9
 433               	.L24:
 225:OSsrc/os_sem.c **** 
 226:OSsrc/os_sem.c ****         default:
 227:OSsrc/os_sem.c ****              OS_EXIT_CRITICAL();
 435               	.LM62:
 436               	/* #APP */
 437 015a 0F90      		pop __tmp_reg__
 438 015c 0FBE      		out __SREG__,__tmp_reg__
 228:OSsrc/os_sem.c ****              *err = OS_ERR_INVALID_OPT;
 440               	.LM63:
 441               	/* #NOAPP */
 442 015e 87E0      		ldi r24,lo8(7)
 443               	.L27:
 444 0160 F801      		movw r30,r16
 445 0162 8083      		st Z,r24
 229:OSsrc/os_sem.c ****              return (pevent);
 447               	.LM64:
 448 0164 CE01      		movw r24,r28
 449               	.L9:
 450               	/* epilogue: frame size=0 */
 451 0166 DF91      		pop r29
 452 0168 CF91      		pop r28
 453 016a 1F91      		pop r17
 454 016c 0F91      		pop r16
 455 016e FF90      		pop r15
 456 0170 0895      		ret
 457               	/* epilogue end (size=6) */
 458               	/* function OSSemDel size 126 (115) */
 463               	.Lscope2:
 468               	.global	OSSemPend
 470               	OSSemPend:
 230:OSsrc/os_sem.c ****     }
 231:OSsrc/os_sem.c **** }
 232:OSsrc/os_sem.c **** #endif
 233:OSsrc/os_sem.c **** 
 234:OSsrc/os_sem.c **** /*$PAGE*/
 235:OSsrc/os_sem.c **** /*
 236:OSsrc/os_sem.c **** ***************************************************************************************************
 237:OSsrc/os_sem.c **** *                                           PEND ON SEMAPHORE
 238:OSsrc/os_sem.c **** *
 239:OSsrc/os_sem.c **** * Description: This function waits for a semaphore.
 240:OSsrc/os_sem.c **** *
 241:OSsrc/os_sem.c **** * Arguments  : pevent        is a pointer to the event control block associated with the desired
 242:OSsrc/os_sem.c **** *                            semaphore.
 243:OSsrc/os_sem.c **** *
 244:OSsrc/os_sem.c **** *              timeout       is an optional timeout period (in clock ticks).  If non-zero, your tas
 245:OSsrc/os_sem.c **** *                            wait for the resource up to the amount of time specified by this argum
 246:OSsrc/os_sem.c **** *                            If you specify 0, however, your task will wait forever at the specifie
 247:OSsrc/os_sem.c **** *                            semaphore or, until the resource becomes available (or the event occur
 248:OSsrc/os_sem.c **** *
 249:OSsrc/os_sem.c **** *              err           is a pointer to where an error message will be deposited.  Possible er
 250:OSsrc/os_sem.c **** *                            messages are:
 251:OSsrc/os_sem.c **** *
 252:OSsrc/os_sem.c **** *                            OS_NO_ERR           The call was successful and your task owns the res
 253:OSsrc/os_sem.c **** *                                                or, the event you are waiting for occurred.
 254:OSsrc/os_sem.c **** *                            OS_TIMEOUT          The semaphore was not received within the specifie
 255:OSsrc/os_sem.c **** *                                                timeout.
 256:OSsrc/os_sem.c **** *                            OS_ERR_EVENT_TYPE   If you didn't pass a pointer to a semaphore.
 257:OSsrc/os_sem.c **** *                            OS_ERR_PEND_ISR     If you called this function from an ISR and the re
 258:OSsrc/os_sem.c **** *                                                would lead to a suspension.
 259:OSsrc/os_sem.c **** *                            OS_ERR_PEVENT_NULL  If 'pevent' is a NULL pointer.
 260:OSsrc/os_sem.c **** *
 261:OSsrc/os_sem.c **** * Returns    : none
 262:OSsrc/os_sem.c **** ***************************************************************************************************
 263:OSsrc/os_sem.c **** */
 264:OSsrc/os_sem.c **** 
 265:OSsrc/os_sem.c **** void  OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
 266:OSsrc/os_sem.c **** {
 472               	.LM65:
 473               	/* prologue: frame size=0 */
 474 0172 0F93      		push r16
 475 0174 1F93      		push r17
 476 0176 CF93      		push r28
 477 0178 DF93      		push r29
 478               	/* prologue end (size=4) */
 479 017a EC01      		movw r28,r24
 480 017c 8A01      		movw r16,r20
 267:OSsrc/os_sem.c **** #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register  
 268:OSsrc/os_sem.c ****     OS_CPU_SR  cpu_sr;
 269:OSsrc/os_sem.c **** 
 270:OSsrc/os_sem.c **** 
 271:OSsrc/os_sem.c **** 
 272:OSsrc/os_sem.c ****     cpu_sr = 0;                                       /* Prevent compiler warning                  
 273:OSsrc/os_sem.c **** #endif    
 274:OSsrc/os_sem.c ****     if (OSIntNesting > 0) {                           /* See if called from ISR ...                
 482               	.LM66:
 483 017e 8091 0000 		lds r24,OSIntNesting
 484 0182 8823      		tst r24
 485 0184 11F0      		breq .L29

⌨️ 快捷键说明

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