⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_core.s79

📁 ARM仿真案例
💻 S79
📖 第 1 页 / 共 5 页
字号:
        CMP      R1,#+255
        BEQ      ??OSSchedLock_1
//  379             OSLockNesting++;                     /* Increment lock nesting level                       */
        LDR      R1,??DataTable28  ;; OSLockNesting
        LDR      R2,??DataTable28  ;; OSLockNesting
        LDRB     R2,[R2, #+0]
        ADDS     R2,R2,#+1
        STRB     R2,[R1, #+0]
//  380         }
//  381         OS_EXIT_CRITICAL();
??OSSchedLock_1:
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  382     }
//  383 }
??OSSchedLock_0:
        POP      {R0}
        BX       R0               ;; return
        CFI EndBlock cfiBlock11

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock12 Using cfiCommon0
        CFI NoFunction
        ARM
??OSSchedUnlock??rA:
        ADD      R12,PC,#+1
        BX       R12
        CFI EndBlock cfiBlock12
        REQUIRE OSSchedUnlock
//  384 #endif    
//  385 
//  386 /*$PAGE*/
//  387 /*
//  388 *********************************************************************************************************
//  389 *                                          ENABLE SCHEDULING
//  390 *
//  391 * Description: This function is used to re-allow rescheduling.
//  392 *
//  393 * Arguments  : none
//  394 *
//  395 * Returns    : none
//  396 *
//  397 * Notes      : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair.  In other words, for every
//  398 *                 call to OSSchedLock() you MUST have a call to OSSchedUnlock().
//  399 *********************************************************************************************************
//  400 */
//  401 
//  402 #if OS_SCHED_LOCK_EN > 0

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock13 Using cfiCommon1
        CFI Function OSSchedUnlock
        THUMB
//  403 void  OSSchedUnlock (void)
//  404 {
OSSchedUnlock:
        PUSH     {LR}
        CFI ?RET Frame(CFA, -4)
        CFI CFA R13+4
//  405 #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
//  406     OS_CPU_SR  cpu_sr;
//  407 #endif    
//  408     
//  409     
//  410     if (OSRunning == TRUE) {                                   /* Make sure multitasking is running    */
        LDR      R0,??DataTable51  ;; OSRunning
        LDRB     R0,[R0, #+0]
        CMP      R0,#+1
        BNE      ??OSSchedUnlock_0
//  411         OS_ENTER_CRITICAL();
        _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
//  412         if (OSLockNesting > 0) {                               /* Do not decrement if already 0        */
        LDR      R1,??DataTable28  ;; OSLockNesting
        LDRB     R1,[R1, #+0]
        CMP      R1,#+0
        BEQ      ??OSSchedUnlock_1
//  413             OSLockNesting--;                                   /* Decrement lock nesting level         */
        LDR      R1,??DataTable28  ;; OSLockNesting
        LDR      R2,??DataTable28  ;; OSLockNesting
        LDRB     R2,[R2, #+0]
        SUBS     R2,R2,#+1
        STRB     R2,[R1, #+0]
//  414             if (OSLockNesting == 0) {                          /* See if scheduler is enabled and ...  */
        LDRB     R1,[R1, #+0]
        CMP      R1,#+0
        BNE      ??OSSchedUnlock_2
//  415                 if (OSIntNesting == 0) {                       /* ... not in an ISR                    */
        LDR      R1,??DataTable29  ;; OSIntNesting
        LDRB     R1,[R1, #+0]
        CMP      R1,#+0
        BNE      ??OSSchedUnlock_1
//  416                     OS_EXIT_CRITICAL();
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  417                     OS_Sched();                                /* See if a HPT is ready                */
        BL       OS_Sched
        B        ??OSSchedUnlock_0
//  418                 } else {
//  419                     OS_EXIT_CRITICAL();
//  420                 }
//  421             } else {
//  422                 OS_EXIT_CRITICAL();
//  423             }
//  424         } else {
//  425             OS_EXIT_CRITICAL();
??OSSchedUnlock_2:
??OSSchedUnlock_1:
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  426         }
//  427     }
//  428 }
??OSSchedUnlock_0:
        POP      {R0}
        BX       R0               ;; return
        CFI EndBlock cfiBlock13

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable28:
        DC32     OSLockNesting

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable29:
        DC32     OSIntNesting

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock14 Using cfiCommon0
        CFI NoFunction
        ARM
??OSStart??rA:
        ADD      R12,PC,#+1
        BX       R12
        CFI EndBlock cfiBlock14
        REQUIRE OSStart
//  429 #endif    
//  430 
//  431 /*$PAGE*/
//  432 /*
//  433 *********************************************************************************************************
//  434 *                                          START MULTITASKING
//  435 *
//  436 * Description: This function is used to start the multitasking process which lets uC/OS-II manages the
//  437 *              task that you have created.  Before you can call OSStart(), you MUST have called OSInit()
//  438 *              and you MUST have created at least one task.
//  439 *
//  440 * Arguments  : none
//  441 *
//  442 * Returns    : none
//  443 *
//  444 * Note       : OSStartHighRdy() MUST:
//  445 *                 a) Call OSTaskSwHook() then,
//  446 *                 b) Set OSRunning to TRUE.
//  447 *                 c) Load the context of the task pointed to by OSTCBHighRdy.
//  448 *                 d_ Execute the task.
//  449 *********************************************************************************************************
//  450 */
//  451 

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock15 Using cfiCommon1
        CFI Function OSStart
        THUMB
//  452 void  OSStart (void)
//  453 {
OSStart:
        PUSH     {LR}
        CFI ?RET Frame(CFA, -4)
        CFI CFA R13+4
//  454     INT8U y;
//  455     INT8U x;
//  456 
//  457 
//  458     if (OSRunning == FALSE) {
        LDR      R0,??DataTable51  ;; OSRunning
        LDRB     R0,[R0, #+0]
        CMP      R0,#+0
        BNE      ??OSStart_0
//  459         y             = OSUnMapTbl[OSRdyGrp];        /* Find highest priority's task priority number   */
//  460         x             = OSUnMapTbl[OSRdyTbl[y]];
//  461         OSPrioHighRdy = (INT8U)((y << 3) + x);
        LDR      R0,??DataTable41  ;; OSPrioHighRdy
        LDR      R1,??DataTable54  ;; OSRdyGrp
        LDRB     R1,[R1, #+0]
        LDR      R2,??DataTable59  ;; OSUnMapTbl
        LDRB     R1,[R2, R1]
        LSLS     R1,R1,#+3
        LDR      R2,??DataTable54  ;; OSRdyGrp
        LDRB     R2,[R2, #+0]
        LDR      R3,??DataTable59  ;; OSUnMapTbl
        LDRB     R2,[R3, R2]
        LDR      R3,??DataTable65  ;; OSRdyTbl
        LDRB     R2,[R3, R2]
        LDR      R3,??DataTable59  ;; OSUnMapTbl
        LDRB     R2,[R3, R2]
        ADDS     R1,R1,R2
        STRB     R1,[R0, #+0]
//  462         OSPrioCur     = OSPrioHighRdy;
        LDR      R0,??DataTable38  ;; OSPrioCur
        LDR      R1,??DataTable41  ;; OSPrioHighRdy
        LDRB     R1,[R1, #+0]
        STRB     R1,[R0, #+0]
//  463         OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
        LDR      R0,??DataTable44  ;; OSTCBHighRdy
        LDR      R1,??DataTable41  ;; OSPrioHighRdy
        LDRB     R1,[R1, #+0]
        LSLS     R1,R1,#+2
        LDR      R2,??DataTable61  ;; OSTCBPrioTbl
        LDR      R1,[R2, R1]
        STR      R1,[R0, #+0]
//  464         OSTCBCur      = OSTCBHighRdy;
        LDR      R0,??DataTable83  ;; OSTCBCur
        LDR      R1,??DataTable44  ;; OSTCBHighRdy
        LDR      R1,[R1, #+0]
        STR      R1,[R0, #+0]
//  465         OSStartHighRdy();                            /* Execute target specific code to start task     */
        _BLF     OSStartHighRdy,??OSStartHighRdy??rT
//  466     }
//  467 }
??OSStart_0:
        POP      {R0}
        BX       R0               ;; return
        CFI EndBlock cfiBlock15

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable38:
        DC32     OSPrioCur

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable41:
        DC32     OSPrioHighRdy

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable44:
        DC32     OSTCBHighRdy

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock16 Using cfiCommon0
        CFI NoFunction
        ARM
??OSStatInit??rA:
        ADD      R12,PC,#+1
        BX       R12
        CFI EndBlock cfiBlock16
        REQUIRE OSStatInit
//  468 /*$PAGE*/
//  469 /*
//  470 *********************************************************************************************************
//  471 *                                        STATISTICS INITIALIZATION
//  472 *
//  473 * Description: This function is called by your application to establish CPU usage by first determining
//  474 *              how high a 32-bit counter would count to in 1 second if no other tasks were to execute
//  475 *              during that time.  CPU usage is then determined by a low priority task which keeps track
//  476 *              of this 32-bit counter every second but this time, with other tasks running.  CPU usage is
//  477 *              determined by:
//  478 *
//  479 *                                             OSIdleCtr
//  480 *                 CPU Usage (%) = 100 * (1 - ------------)
//  481 *                                            OSIdleCtrMax
//  482 *
//  483 * Arguments  : none
//  484 *
//  485 * Returns    : none
//  486 *********************************************************************************************************
//  487 */
//  488 
//  489 #if OS_TASK_STAT_EN > 0

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock17 Using cfiCommon1
        CFI Function OSStatInit
        THUMB
//  490 void  OSStatInit (void)
//  491 {
OSStatInit:
        PUSH     {LR}
        CFI ?RET Frame(CFA, -4)
        CFI CFA R13+4
//  492 #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
//  493     OS_CPU_SR  cpu_sr;
//  494 #endif    
//  495     
//  496     
//  497     OSTimeDly(2);                                /* Synchronize with clock tick                        */
        MOVS     R0,#+2
        _BLF     OSTimeDly,??OSTimeDly??rT
//  498     OS_ENTER_CRITICAL();
        _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
//  499     OSIdleCtr    = 0L;                           /* Clear idle counter                                 */
        LDR      R1,??DataTable47  ;; OSIdleCtr
        MOVS     R2,#+0
        STR      R2,[R1, #+0]
//  500     OS_EXIT_CRITICAL();
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  501     OSTimeDly(OS_TICKS_PER_SEC / 10);            /* Determine MAX. idle counter value for 1/10 second  */
        MOVS     R0,#+10
        _BLF     OSTimeDly,??OSTimeDly??rT
//  502     OS_ENTER_CRITICAL();
        _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
//  503     OSIdleCtrMax = OSIdleCtr;                    /* Store maximum idle counter count in 1/10 second    */
        LDR      R1,??DataTable46  ;; OSIdleCtrMax
        LDR      R2,??DataTable47  ;; OSIdleCtr
        LDR      R2,[R2, #+0]
        STR      R2,[R1, #+0]
//  504     OSStatRdy    = TRUE;
        LDR      R1,??DataTable48  ;; OSStatRdy
        MOVS     R2,#+1
        STRB     R2,[R1, #+0]
//  505     OS_EXIT_CRITICAL();
        _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
//  506 }
        POP      {R0}
        BX       R0               ;; return
        CFI EndBlock cfiBlock17

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable46:
        DC32     OSIdleCtrMax

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable47:
        DC32     OSIdleCtr

        RSEG CODE:CODE:NOROOT(2)
        DATA
??DataTable48:
        DC32     OSStatRdy

        RSEG CODE:CODE:NOROOT(2)
        CFI Block cfiBlock18 Using cfiCommon0
        CFI NoFunction
        ARM
??OSTimeTick??rA:
        ADD      R12,PC,#+1
        BX       R12
        CFI EndBlock cfiBlock18
        REQUIRE OSTimeTick
//  507 #endif
//  508 /*$PAGE*/
//  509 /*
//  510 *********************************************************************************************************
//  511 *                                         PROCESS SYSTEM TICK
//  512 *
//  513 * Description: This function is used to signal to uC/OS-II the occurrence of a 'system t

⌨️ 快捷键说明

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