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

📄 os_core.lst

📁 ARM仿真案例
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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

   \                                 In segment CODE, align 4, keep-with-next
    403          void  OSSchedUnlock (void)
    404          {
   \                     OSSchedUnlock:
   \   00000000   00B5               PUSH     {LR}
    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    */
   \   00000002   ....               LDR      R0,??DataTable34  ;; OSRunning
   \   00000004   0078               LDRB     R0,[R0, #+0]
   \   00000006   0128               CMP      R0,#+1
   \   00000008   1FD1               BNE      ??OSSchedUnlock_0
    411                  OS_ENTER_CRITICAL();
   \   0000000A   ........           _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
    412                  if (OSLockNesting > 0) {                               /* Do not decrement if already 0        */
   \   0000000E   ....               LDR      R1,??DataTable32  ;; OSLockNesting
   \   00000010   0978               LDRB     R1,[R1, #+0]
   \   00000012   0129               CMP      R1,#+1
   \   00000014   17D3               BCC      ??OSSchedUnlock_1
    413                      OSLockNesting--;                                   /* Decrement lock nesting level         */
   \   00000016   ....               LDR      R1,??DataTable32  ;; OSLockNesting
   \   00000018   ....               LDR      R2,??DataTable32  ;; OSLockNesting
   \   0000001A   1278               LDRB     R2,[R2, #+0]
   \   0000001C   521E               SUBS     R2,R2,#+1
   \   0000001E   0A70               STRB     R2,[R1, #+0]
    414                      if (OSLockNesting == 0) {                          /* See if scheduler is enabled and ...  */
   \   00000020   ....               LDR      R1,??DataTable32  ;; OSLockNesting
   \   00000022   0978               LDRB     R1,[R1, #+0]
   \   00000024   0029               CMP      R1,#+0
   \   00000026   0BD1               BNE      ??OSSchedUnlock_2
    415                          if (OSIntNesting == 0) {                       /* ... not in an ISR                    */
   \   00000028   ....               LDR      R1,??DataTable33  ;; OSIntNesting
   \   0000002A   0978               LDRB     R1,[R1, #+0]
   \   0000002C   0029               CMP      R1,#+0
   \   0000002E   04D1               BNE      ??OSSchedUnlock_3
    416                              OS_EXIT_CRITICAL();
   \   00000030   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    417                              OS_Sched();                                /* See if a HPT is ready                */
   \   00000034   ........           BL       OS_Sched
   \   00000038   07E0               B        ??OSSchedUnlock_0
    418                          } else {
    419                              OS_EXIT_CRITICAL();
   \                     ??OSSchedUnlock_3:
   \   0000003A   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
   \   0000003E   04E0               B        ??OSSchedUnlock_0
    420                          }
    421                      } else {
    422                          OS_EXIT_CRITICAL();
   \                     ??OSSchedUnlock_2:
   \   00000040   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
   \   00000044   01E0               B        ??OSSchedUnlock_0
    423                      }
    424                  } else {
    425                      OS_EXIT_CRITICAL();
   \                     ??OSSchedUnlock_1:
   \   00000046   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    426                  }
    427              }
    428          }
   \                     ??OSSchedUnlock_0:
   \   0000004A   01BC               POP      {R0}
   \   0000004C   0047               BX       R0               ;; return
    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          

   \                                 In segment CODE, align 4, keep-with-next
    452          void  OSStart (void)
    453          {
   \                     OSStart:
   \   00000000   00B5               PUSH     {LR}
    454              INT8U y;
    455              INT8U x;
    456          
    457          
    458              if (OSRunning == FALSE) {
   \   00000002   ....               LDR      R0,??DataTable34  ;; OSRunning
   \   00000004   0078               LDRB     R0,[R0, #+0]
   \   00000006   0028               CMP      R0,#+0
   \   00000008   1FD1               BNE      ??OSStart_0
    459                  y             = OSUnMapTbl[OSRdyGrp];        /* Find highest priority's task priority number   */
   \   0000000A   ....               LDR      R0,??DataTable56  ;; OSRdyGrp
   \   0000000C   0078               LDRB     R0,[R0, #+0]
   \   0000000E   ....               LDR      R1,??DataTable38  ;; OSUnMapTbl
   \   00000010   085C               LDRB     R0,[R1, R0]
    460                  x             = OSUnMapTbl[OSRdyTbl[y]];
   \   00000012   0006               LSLS     R0,R0,#+24       ;; ZeroExtS R0,R0,#+24,#+24
   \   00000014   000E               LSRS     R0,R0,#+24
   \   00000016   ....               LDR      R1,??DataTable58  ;; OSRdyTbl
   \   00000018   095C               LDRB     R1,[R1, R0]
   \   0000001A   ....               LDR      R2,??DataTable38  ;; OSUnMapTbl
   \   0000001C   515C               LDRB     R1,[R2, R1]
    461                  OSPrioHighRdy = (INT8U)((y << 3) + x);
   \   0000001E   ....               LDR      R2,??DataTable43  ;; OSPrioHighRdy
   \   00000020   C000               LSLS     R0,R0,#+3
   \   00000022   4018               ADDS     R0,R0,R1
   \   00000024   1070               STRB     R0,[R2, #+0]
    462                  OSPrioCur     = OSPrioHighRdy;
   \   00000026   ....               LDR      R0,??DataTable40  ;; OSPrioCur
   \   00000028   ....               LDR      R1,??DataTable43  ;; OSPrioHighRdy
   \   0000002A   0978               LDRB     R1,[R1, #+0]
   \   0000002C   0170               STRB     R1,[R0, #+0]
    463                  OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
   \   0000002E   ....               LDR      R0,??DataTable46  ;; OSTCBHighRdy
   \   00000030   ....               LDR      R1,??DataTable43  ;; OSPrioHighRdy
   \   00000032   0978               LDRB     R1,[R1, #+0]
   \   00000034   0422               MOVS     R2,#+4
   \   00000036   5143               MULS     R1,R2,R1
   \   00000038   ....               LDR      R2,??DataTable44  ;; OSTCBPrioTbl
   \   0000003A   5158               LDR      R1,[R2, R1]
   \   0000003C   0160               STR      R1,[R0, #+0]
    464                  OSTCBCur      = OSTCBHighRdy;
   \   0000003E   ....               LDR      R0,??DataTable85  ;; OSTCBCur
   \   00000040   ....               LDR      R1,??DataTable46  ;; OSTCBHighRdy
   \   00000042   0968               LDR      R1,[R1, #+0]
   \   00000044   0160               STR      R1,[R0, #+0]
    465                  OSStartHighRdy();                            /* Execute target specific code to start task     */
   \   00000046   ........           _BLF     OSStartHighRdy,??OSStartHighRdy??rT
    466              }
    467          }
   \                     ??OSStart_0:
   \   0000004A   01BC               POP      {R0}
   \   0000004C   0047               BX       R0               ;; return
    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

   \                                 In segment CODE, align 4, keep-with-next
    490          void  OSStatInit (void)
    491          {
   \                     OSStatInit:
   \   00000000   00B5               PUSH     {LR}
    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                        */
   \   00000002   0220               MOVS     R0,#+2
   \   00000004   ........           _BLF     OSTimeDly,??OSTimeDly??rT
    498              OS_ENTER_CRITICAL();
   \   00000008   ........           _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
    499              OSIdleCtr    = 0L;                           /* Clear idle counter                                 */
   \   0000000C   ....               LDR      R1,??DataTable49  ;; OSIdleCtr
   \   0000000E   0022               MOVS     R2,#+0
   \   00000010   0A60               STR      R2,[R1, #+0]
    500              OS_EXIT_CRITICAL();
   \   00000012   ........           _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  */
   \   00000016   0A20               MOVS     R0,#+10
   \   00000018   ........           _BLF     OSTimeDly,??OSTimeDly??rT
    502              OS_ENTER_CRITICAL();
   \   0000001C   ........           _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
    503              OSIdleCtrMax = OSIdleCtr;                    /* Store maximum idle counter count in 1/10 second    */
   \   00000020   ....               LDR      R1,??DataTable48  ;; OSIdleCtrMax
   \   00000022   ....               LDR      R2,??DataTable49  ;; OSIdleCtr
   \   00000024   1268               LDR      R2,[R2, #+0]
   \   00000026   0A60               STR      R2,[R1, #+0]
    504              OSStatRdy    = TRUE;
   \   00000028   ....               LDR      R1,??DataTable50  ;; OSStatRdy
   \   0000002A   0122               MOVS     R2,#+1
   \   0000002C   0A70               STRB     R2,[R1, #+0]
    505              OS_EXIT_CRITICAL();
   \   0000002E   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
    506          }
   \   00000032   01BC               POP      {R0}
   \   00000034   0047               BX       R0               ;; return
    507          #endif
    508          /*$PAGE*/
    

⌨️ 快捷键说明

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