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

📄 os_task.lst

📁 ARM仿真案例
💻 LST
📖 第 1 页 / 共 5 页
字号:
##############################################################################
#                                                                            #
# IAR ARM ANSI C/C++ Compiler V4.40A/W32 EVALUATION    21/Jul/2006  16:27:56 #
# Copyright 1999-2005 IAR Systems. All rights reserved.                      #
# Time limited license: 22 days left                                         #
#                                                                            #
#    Cpu mode        =  interwork                                            #
#    Endian          =  little                                               #
#    Stack alignment =  4                                                    #
#    Source file     =  E:\Project\ucos-ii\spi\uCOS-II\os_task.c             #
#    Command line    =  E:\Project\ucos-ii\spi\uCOS-II\os_task.c -lCN        #
#                       E:\Project\ucos-ii\spi\Debug\List\ -lA               #
#                       E:\Project\ucos-ii\spi\Debug\List\ -o                #
#                       E:\Project\ucos-ii\spi\Debug\Obj\ -s9 --no_cse       #
#                       --no_unroll --no_inline --no_code_motion --no_tbaa   #
#                       --no_clustering --no_scheduling --debug --cpu_mode   #
#                       thumb --endian little --cpu ARM7TDMI-S               #
#                       --stack_align 4 --interwork -e --fpu None            #
#                       --dlib_config "e:\Program Files\IAR                  #
#                       Systems\Embedded Workbench 4.0                       #
#                       Evaluation\ARM\LIB\dl4tptinl8n.h" -I                 #
#                       E:\Project\ucos-ii\spi\ -I                           #
#                       E:\Project\ucos-ii\spi\App\ -I                       #
#                       E:\Project\ucos-ii\spi\ARM\ -I                       #
#                       E:\Project\ucos-ii\spi\BSP\ -I                       #
#                       E:\Project\ucos-ii\spi\uCOS-II\ -I "e:\Program       #
#                       Files\IAR Systems\Embedded Workbench 4.0             #
#                       Evaluation\ARM\INC\"                                 #
#    List file       =  E:\Project\ucos-ii\spi\Debug\List\os_task.lst        #
#    Object file     =  E:\Project\ucos-ii\spi\Debug\Obj\os_task.r79         #
#                                                                            #
#                                                                            #
##############################################################################

E:\Project\ucos-ii\spi\uCOS-II\os_task.c
      1          /*
      2          *********************************************************************************************************
      3          *                                                uC/OS-II
      4          *                                          The Real-Time Kernel
      5          *                                            TASK MANAGEMENT
      6          *
      7          *                          (c) Copyright 1992-2003, Jean J. Labrosse, Weston, FL
      8          *                                           All Rights Reserved
      9          *
     10          * File : OS_TASK.C
     11          * By   : Jean J. Labrosse
     12          *********************************************************************************************************
     13          */
     14          
     15          #ifndef  OS_MASTER_FILE
     16          #include <ucos_ii.h>
     17          #endif
     18          
     19          /*
     20          *********************************************************************************************************
     21          *                                        CHANGE PRIORITY OF A TASK
     22          *
     23          * Description: This function allows you to change the priority of a task dynamically.  Note that the new
     24          *              priority MUST be available.
     25          *
     26          * Arguments  : oldp     is the old priority
     27          *
     28          *              newp     is the new priority
     29          *
     30          * Returns    : OS_NO_ERR        is the call was successful
     31          *              OS_PRIO_INVALID  if the priority you specify is higher that the maximum allowed
     32          *                               (i.e. >= OS_LOWEST_PRIO)
     33          *              OS_PRIO_EXIST    if the new priority already exist.
     34          *              OS_PRIO_ERR      there is no task with the specified OLD priority (i.e. the OLD task does
     35          *                               not exist.
     36          *********************************************************************************************************
     37          */
     38          
     39          #if OS_TASK_CHANGE_PRIO_EN > 0

   \                                 In segment CODE, align 4, keep-with-next
     40          INT8U  OSTaskChangePrio (INT8U oldprio, INT8U newprio)
     41          {
   \                     OSTaskChangePrio:
   \   00000000   F0B5               PUSH     {R4-R7,LR}
   \   00000002   83B0               SUB      SP,SP,#+12
   \   00000004   0400               MOVS     R4,R0
   \   00000006   0D00               MOVS     R5,R1
     42          #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
     43              OS_CPU_SR    cpu_sr;
     44          #endif
     45          
     46          #if OS_EVENT_EN > 0
     47              OS_EVENT    *pevent;
     48          #endif
     49          
     50              OS_TCB      *ptcb;
     51              INT8U        x;
     52              INT8U        y;
     53              INT8U        bitx;
     54              INT8U        bity;
     55              INT8U        y_old;
     56          
     57          
     58          #if OS_ARG_CHK_EN > 0
     59              if (oldprio >= OS_LOWEST_PRIO) {
   \   00000008   3F2C               CMP      R4,#+63
   \   0000000A   03D3               BCC      ??OSTaskChangePrio_0
     60          	    if (oldprio != OS_PRIO_SELF) {
   \   0000000C   FF2C               CMP      R4,#+255
   \   0000000E   01D0               BEQ      ??OSTaskChangePrio_0
     61                      return (OS_PRIO_INVALID);
   \                     ??OSTaskChangePrio_1:
   \   00000010   2A20               MOVS     R0,#+42
   \   00000012   81E0               B        ??OSTaskChangePrio_2
     62          		}
     63          	}
     64              if (newprio >= OS_LOWEST_PRIO) {
   \                     ??OSTaskChangePrio_0:
   \   00000014   3F2D               CMP      R5,#+63
   \   00000016   FBD2               BCS      ??OSTaskChangePrio_1
     65                  return (OS_PRIO_INVALID);
     66              }
     67          #endif
     68              OS_ENTER_CRITICAL();
   \   00000018   ........           _BLF     OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
     69              if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) {                 /* New priority must not already exist */
   \   0000001C   A900               LSLS     R1,R5,#+2
   \   0000001E   ....               LDR      R2,??DataTable23  ;; OSTCBPrioTbl
   \   00000020   5158               LDR      R1,[R2, R1]
   \   00000022   0029               CMP      R1,#+0
   \   00000024   03D0               BEQ      ??OSTaskChangePrio_3
     70                  OS_EXIT_CRITICAL();
   \   00000026   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
     71                  return (OS_PRIO_EXIST);
   \   0000002A   2820               MOVS     R0,#+40
   \   0000002C   74E0               B        ??OSTaskChangePrio_2
     72              } 
     73              if (oldprio == OS_PRIO_SELF) {                              /* See if changing self                */
   \                     ??OSTaskChangePrio_3:
   \   0000002E   FF2C               CMP      R4,#+255
   \   00000030   03D1               BNE      ??OSTaskChangePrio_4
     74                  oldprio = OSTCBCur->OSTCBPrio;                          /* Yes, get priority                   */
   \   00000032   ....               LDR      R1,??DataTable1  ;; OSTCBCur
   \   00000034   0968               LDR      R1,[R1, #+0]
   \   00000036   2D31               ADDS     R1,R1,#+45
   \   00000038   0C78               LDRB     R4,[R1, #+0]
     75              }
     76              ptcb = OSTCBPrioTbl[oldprio];
   \                     ??OSTaskChangePrio_4:
   \   0000003A   A100               LSLS     R1,R4,#+2
   \   0000003C   5158               LDR      R1,[R2, R1]
     77              if (ptcb == (OS_TCB *)0) {                                  /* Does task to change exist?          */
   \   0000003E   0029               CMP      R1,#+0
   \   00000040   03D1               BNE      ??OSTaskChangePrio_5
     78                  OS_EXIT_CRITICAL();                                     /* No, can't change its priority!      */
   \   00000042   ........           _BLF     OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
     79                  return (OS_PRIO_ERR);
   \   00000046   2920               MOVS     R0,#+41
   \   00000048   66E0               B        ??OSTaskChangePrio_2
     80              }                                       
     81              y                     = newprio >> 3;                       /* Yes, compute new TCB fields         */
   \                     ??OSTaskChangePrio_5:
   \   0000004A   EA08               LSRS     R2,R5,#+3
     82              bity                  = OSMapTbl[y];
   \   0000004C   344E               LDR      R6,??OSTaskChangePrio_6  ;; OSMapTbl
   \   0000004E   B35C               LDRB     R3,[R6, R2]
   \   00000050   0093               STR      R3,[SP, #+0]
     83              x                     = newprio & 0x07;
   \   00000052   6B07               LSLS     R3,R5,#+29
   \   00000054   5B0F               LSRS     R3,R3,#+29
   \   00000056   0293               STR      R3,[SP, #+8]
     84              bitx                  = OSMapTbl[x];
   \   00000058   F35C               LDRB     R3,[R6, R3]
   \   0000005A   0193               STR      R3,[SP, #+4]
     85              OSTCBPrioTbl[oldprio] = (OS_TCB *)0;                        /* Remove TCB from old priority        */
   \   0000005C   A300               LSLS     R3,R4,#+2
   \   0000005E   ....               LDR      R4,??DataTable23  ;; OSTCBPrioTbl
   \   00000060   0026               MOVS     R6,#+0
   \   00000062   E650               STR      R6,[R4, R3]
     86              OSTCBPrioTbl[newprio] = ptcb;                               /* Place pointer to TCB @ new priority */
   \   00000064   AB00               LSLS     R3,R5,#+2
   \   00000066   E150               STR      R1,[R4, R3]
     87              y_old                 = ptcb->OSTCBY;
   \   00000068   2F23               MOVS     R3,#+47
   \   0000006A   CB5C               LDRB     R3,[R1, R3]
     88              if ((OSRdyTbl[y_old] & ptcb->OSTCBBitX) != 0x00) {          /* If task is ready make it not        */
   \   0000006C   ....               LDR      R6,??DataTable11  ;; OSRdyTbl
   \   0000006E   F45C               LDRB     R4,[R6, R3]
   \   00000070   3026               MOVS     R6,#+48
   \   00000072   8E5D               LDRB     R6,[R1, R6]
   \   00000074   3442               TST      R4,R6
   \   00000076   1FD0               BEQ      ??OSTaskChangePrio_7
     89                  OSRdyTbl[y_old] &= ~ptcb->OSTCBBitX;
   \   00000078   ....               LDR      R7,??DataTable11  ;; OSRdyTbl
   \   0000007A   9C46               MOV      R12,R3
   \   0000007C   ....               LDR      R4,??DataTable11  ;; OSRdyTbl
   \   0000007E   E45C               LDRB     R4,[R4, R3]
   \   00000080   3026               MOVS     R6,#+48
   \   00000082   8E5D               LDRB     R6,[R1, R6]
   \   00000084   B443               BICS     R4,R4,R6
   \   00000086   6646               MOV      R6,R12
   \   00000088   BC55               STRB     R4,[R7, R6]
     90                  if (OSRdyTbl[y_old] == 0x00) {
   \   0000008A   ....               LDR      R4,??DataTable11  ;; OSRdyTbl
   \   0000008C   E35C               LDRB     R3,[R4, R3]
   \   0000008E   002B               CMP      R3,#+0
   \   00000090   06D1               BNE      ??OSTaskChangePrio_8
     91                      OSRdyGrp &= ~ptcb->OSTCBBitY;

⌨️ 快捷键说明

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