📄 os_core.lst
字号:
288:os/source/os_core.c **** * Notes : 1) You MUST invoke OSIntEnter() and OSIntExit() in pair. In other words, for every
289:os/source/os_core.c **** * to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() a
290:os/source/os_core.c **** * end of the ISR.
291:os/source/os_core.c **** * 2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
292:os/source/os_core.c **** ***************************************************************************************************
293:os/source/os_core.c **** */
294:os/source/os_core.c ****
295:os/source/os_core.c **** void OSIntExit (void)
296:os/source/os_core.c **** {
649 .LM42:
650 /* prologue: frame size=0 */
651 /* prologue end (size=0) */
297:os/source/os_core.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register
298:os/source/os_core.c **** OS_CPU_SR cpu_sr;
299:os/source/os_core.c **** #endif
300:os/source/os_core.c ****
301:os/source/os_core.c ****
302:os/source/os_core.c **** OS_ENTER_CRITICAL();
653 .LM43:
654 /* #APP */
655 0152 F894 cli
303:os/source/os_core.c **** if (OSIntNesting > 0) { /* Prevent OSIntNesting from wrapping
657 .LM44:
658 /* #NOAPP */
659 0154 8091 0000 lds r24,OSIntNesting
660 0158 8823 tst r24
661 015a 19F0 breq .L37
304:os/source/os_core.c **** OSIntNesting--;
663 .LM45:
664 015c 8150 subi r24,lo8(-(-1))
665 015e 8093 0000 sts OSIntNesting,r24
666 .L37:
305:os/source/os_core.c **** }
306:os/source/os_core.c **** if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Reschedule only if all ISRs complete ...
668 .LM46:
669 0162 8091 0000 lds r24,OSIntNesting
670 0166 8823 tst r24
671 0168 09F0 breq .+2
672 016a 44C0 rjmp .L38
673 016c 8091 0000 lds r24,OSLockNesting
674 0170 8823 tst r24
675 0172 09F0 breq .+2
676 0174 3FC0 rjmp .L38
307:os/source/os_core.c **** OSIntExitY = OSUnMapTbl[OSRdyGrp]; /* ... and not locked.
678 .LM47:
679 0176 8091 0000 lds r24,OSRdyGrp
680 017a E82F mov r30,r24
681 017c FF27 clr r31
682 017e E050 subi r30,lo8(-(OSUnMapTbl))
683 0180 F040 sbci r31,hi8(-(OSUnMapTbl))
684 0182 8081 ld r24,Z
685 0184 8093 0000 sts OSIntExitY,r24
308:os/source/os_core.c **** OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
687 .LM48:
688 0188 9927 clr r25
689 018a FC01 movw r30,r24
690 018c E050 subi r30,lo8(-(OSRdyTbl))
691 018e F040 sbci r31,hi8(-(OSRdyTbl))
692 0190 2081 ld r18,Z
693 0192 E22F mov r30,r18
694 0194 FF27 clr r31
695 0196 E050 subi r30,lo8(-(OSUnMapTbl))
696 0198 F040 sbci r31,hi8(-(OSUnMapTbl))
697 019a E081 ld r30,Z
698 019c 23E0 ldi r18,3
699 019e 880F 1: lsl r24
700 01a0 991F rol r25
701 01a2 2A95 dec r18
702 01a4 E1F7 brne 1b
703 01a6 E80F add r30,r24
704 01a8 E093 0000 sts OSPrioHighRdy,r30
309:os/source/os_core.c **** if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy
706 .LM49:
707 01ac 8091 0000 lds r24,OSPrioCur
708 01b0 E817 cp r30,r24
709 01b2 01F1 breq .L38
310:os/source/os_core.c **** OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
711 .LM50:
712 01b4 FF27 clr r31
713 01b6 EE0F add r30,r30
714 01b8 FF1F adc r31,r31
715 01ba E050 subi r30,lo8(-(OSTCBPrioTbl))
716 01bc F040 sbci r31,hi8(-(OSTCBPrioTbl))
717 01be 8081 ld r24,Z
718 01c0 9181 ldd r25,Z+1
719 01c2 9093 0000 sts (OSTCBHighRdy)+1,r25
720 01c6 8093 0000 sts OSTCBHighRdy,r24
311:os/source/os_core.c **** OSCtxSwCtr++; /* Keep track of the number of context switc
722 .LM51:
723 01ca 8091 0000 lds r24,OSCtxSwCtr
724 01ce 9091 0000 lds r25,(OSCtxSwCtr)+1
725 01d2 A091 0000 lds r26,(OSCtxSwCtr)+2
726 01d6 B091 0000 lds r27,(OSCtxSwCtr)+3
727 01da 0196 adiw r24,1
728 01dc A11D adc r26,__zero_reg__
729 01de B11D adc r27,__zero_reg__
730 01e0 8093 0000 sts OSCtxSwCtr,r24
731 01e4 9093 0000 sts (OSCtxSwCtr)+1,r25
732 01e8 A093 0000 sts (OSCtxSwCtr)+2,r26
733 01ec B093 0000 sts (OSCtxSwCtr)+3,r27
312:os/source/os_core.c **** OSIntCtxSw(); /* Perform interrupt level context switch
735 .LM52:
736 01f0 0E94 0000 call OSIntCtxSw
737 .L38:
313:os/source/os_core.c **** }
314:os/source/os_core.c **** }
315:os/source/os_core.c **** OS_EXIT_CRITICAL();
739 .LM53:
740 /* #APP */
741 01f4 7894 sei
742 /* #NOAPP */
743 /* epilogue: frame size=0 */
744 01f6 0895 ret
745 /* epilogue end (size=1) */
746 /* function OSIntExit size 84 (83) */
748 .Lscope2:
750 .global OSStart
752 OSStart:
316:os/source/os_core.c **** }
317:os/source/os_core.c **** /*$PAGE*/
318:os/source/os_core.c **** /*
319:os/source/os_core.c **** ***************************************************************************************************
320:os/source/os_core.c **** * PREVENT SCHEDULING
321:os/source/os_core.c **** *
322:os/source/os_core.c **** * Description: This function is used to prevent rescheduling to take place. This allows your appli
323:os/source/os_core.c **** * to prevent context switches until you are ready to permit context switching.
324:os/source/os_core.c **** *
325:os/source/os_core.c **** * Arguments : none
326:os/source/os_core.c **** *
327:os/source/os_core.c **** * Returns : none
328:os/source/os_core.c **** *
329:os/source/os_core.c **** * Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other words, for e
330:os/source/os_core.c **** * call to OSSchedLock() you MUST have a call to OSSchedUnlock().
331:os/source/os_core.c **** ***************************************************************************************************
332:os/source/os_core.c **** */
333:os/source/os_core.c ****
334:os/source/os_core.c **** #if OS_SCHED_LOCK_EN > 0
335:os/source/os_core.c **** void OSSchedLock (void)
336:os/source/os_core.c **** {
337:os/source/os_core.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register
338:os/source/os_core.c **** OS_CPU_SR cpu_sr;
339:os/source/os_core.c **** #endif
340:os/source/os_core.c ****
341:os/source/os_core.c ****
342:os/source/os_core.c **** if (OSRunning == TRUE) { /* Make sure multitasking is running
343:os/source/os_core.c **** OS_ENTER_CRITICAL();
344:os/source/os_core.c **** if (OSLockNesting < 255) { /* Prevent OSLockNesting from wrapping back to 0
345:os/source/os_core.c **** OSLockNesting++; /* Increment lock nesting level
346:os/source/os_core.c **** }
347:os/source/os_core.c **** OS_EXIT_CRITICAL();
348:os/source/os_core.c **** }
349:os/source/os_core.c **** }
350:os/source/os_core.c **** #endif
351:os/source/os_core.c ****
352:os/source/os_core.c **** /*$PAGE*/
353:os/source/os_core.c **** /*
354:os/source/os_core.c **** ***************************************************************************************************
355:os/source/os_core.c **** * ENABLE SCHEDULING
356:os/source/os_core.c **** *
357:os/source/os_core.c **** * Description: This function is used to re-allow rescheduling.
358:os/source/os_core.c **** *
359:os/source/os_core.c **** * Arguments : none
360:os/source/os_core.c **** *
361:os/source/os_core.c **** * Returns : none
362:os/source/os_core.c **** *
363:os/source/os_core.c **** * Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other words, for e
364:os/source/os_core.c **** * call to OSSchedLock() you MUST have a call to OSSchedUnlock().
365:os/source/os_core.c **** ***************************************************************************************************
366:os/source/os_core.c **** */
367:os/source/os_core.c ****
368:os/source/os_core.c **** #if OS_SCHED_LOCK_EN > 0
369:os/source/os_core.c **** void OSSchedUnlock (void)
370:os/source/os_core.c **** {
371:os/source/os_core.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status regis
372:os/source/os_core.c **** OS_CPU_SR cpu_sr;
373:os/source/os_core.c **** #endif
374:os/source/os_core.c ****
375:os/source/os_core.c ****
376:os/source/os_core.c **** if (OSRunning == TRUE) { /* Make sure multitasking is running
377:os/source/os_core.c **** OS_ENTER_CRITICAL();
378:os/source/os_core.c **** if (OSLockNesting > 0) { /* Do not decrement if already 0
379:os/source/os_core.c **** OSLockNesting--; /* Decrement lock nesting level
380:os/source/os_core.c **** if ((OSLockNesting == 0) && (OSIntNesting == 0)) { /* See if sched. enabled and not an
381:os/source/os_core.c **** OS_EXIT_CRITICAL();
382:os/source/os_core.c **** OS_Sched(); /* See if a HPT is ready
383:os/source/os_core.c **** } else {
384:os/source/os_core.c **** OS_EXIT_CRITICAL();
385:os/source/os_core.c **** }
386:os/source/os_core.c **** } else {
387:os/source/os_core.c **** OS_EXIT_CRITICAL();
388:os/source/os_core.c **** }
389:os/source/os_core.c **** }
390:os/source/os_core.c **** }
391:os/source/os_core.c **** #endif
392:os/source/os_core.c ****
393:os/source/os_core.c **** /*$PAGE*/
394:os/source/os_core.c **** /*
395:os/source/os_core.c **** ***************************************************************************************************
396:os/source/os_core.c **** * START MULTITASKING
397:os/source/os_core.c **** *
398:os/source/os_core.c **** * Description: This function is used to start the multitasking process which lets uC/OS-II manages
399:os/source/os_core.c **** * task that you have created. Before you can call OSStart(), you MUST have called OSI
400:os/source/os_core.c **** * and you MUST have created at least one task.
401:os/source/os_core.c **** *
402:os/source/os_core.c **** * Arguments : none
403:os/source/os_core.c **** *
404:os/source/os_core.c **** * Returns : none
405:os/source/os_core.c **** *
406:os/source/os_core.c **** * Note : OSStartHighRdy() MUST:
407:os/source/os_core.c **** * a) Call OSTaskSwHook() then,
408:os/source/os_core.c **** * b) Set OSRunning to TRUE.
409:os/source/os_core.c **** ***************************************************************************************************
410:os/source/os_core.c **** */
411:os/source/os_core.c ****
412:os/source/os_core.c **** void OSStart (void)
413:os/source/os_core.c **** {
754 .LM54:
755 /* prologue: frame size=0 */
756 /* prologue end (size=0) */
414:os/source/os_core.c **** INT8U y;
415:os/source/os_core.c **** INT8U x;
416:os/source/os_core.c ****
417:os/source/os_core.c ****
418:os/source/os_core.c **** if (OSRunning == FALSE) {
758 .LM55:
759 01f8 8091 0000 lds r24,OSRunning
760 01fc 8823 tst r24
761 01fe 69F5 brne .L40
419:os/source/os_core.c **** y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority numbe
763 .LM56:
764 0200 8091 0000 lds r24,OSRdyGrp
765 0204 E82F mov r30,r24
766 0206 FF27 clr r31
767 0208 E050 subi r30,lo8(-(OSUnMapTbl))
768 020a F040 sbci r31,hi8(-(OSUnMapTbl))
769 020c 8081 ld r24,Z
420:os/source/os_core.c **** x = OSUnMapTbl[OSRdyTbl[y]];
771 .LM57:
772 020e 9927 clr r25
773 0210 FC01 movw r30,r24
774 0212 E050 subi r30,lo8(-(OSRdyTbl))
775 0214 F040 sbci r31,hi8(-(OSRdyTbl))
776 0216 2081 ld r18,Z
777 0218 E22F mov r30,r18
778 021a FF27 clr r31
779 021c E050 subi r30,lo8(-(OSUnMapTbl))
780 021e F040 sbci r31,hi8(-(OSUnMapTbl))
781 0220 2081 ld r18,Z
421:os/source/os_core.c **** OSPrioHighRdy = (INT8U)((y << 3) + x);
783 .LM58:
784 0222 33E0 ldi r19,3
785 0224 880F 1: lsl r24
786 0226 991F rol r25
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -