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

📄 ggt_cpu_c.lst

📁 ARM下的多任务操作系统源码:GogotoOS
💻 LST
📖 第 1 页 / 共 3 页
字号:
ARM COMPILER V2.32a,  GGT_CPU_c                                                            28/02/08  23:05:54  PAGE 1   


ARM COMPILER V2.32a, COMPILATION OF MODULE GGT_CPU_c
OBJECT MODULE PLACED IN .\Output\GGT_CPU_c.obj
COMPILER INVOKED BY: D:\Program Files\Keil\ARM\BIN\CA.exe Source\Kernel\GGT_CPU_c.c ARM BROWSE DEBUG PRINT(.\LIST\GGT_CP
                    -U_C.LST) TABS(4) OBJECT(.\Output\GGT_CPU_c.obj) 

stmt  level    source

    1          /****************************************************************************************************
    2          **                                        Gogoto OS
    3          **                           (c) Copyright 2007-2008, luyigui(卢益贵)
    4          **                                     All Rights Reserved
    5          **                                         V1.00.0
    6          **
    7          **                             狗狗兔嵌入式多任务系统(基于消息机制)    
    8          **                       绿城代码、GGT-OS、Gogoto OS、狗狗兔嵌入式、狗狗兔系统
    9          **                                      QQ:48092788
   10          **
   11          **------------------文件信息------------------------------------------------------------------------
   12          **  文件名: GGT_CPU_c.c
   13          **  创建人: 卢益贵
   14          **  日 期: 2007年12月8日
   15          **  版  本: V1.00.0
   16          **  描  述: Gogoto OS 与CPU相关的C核心代码部分,将所有移植可能与CPU和编译器相关的部分放置与此,
   17                      方便移植。
   18          **
   19          
   20          **------------------修改记录------------------------------------------------------------------------
   21          **  修改人: 卢益贵
   22          **  版  本: V1.00.1
   23          **  日 期: 2008年1月5日
   24          **  描 述: 增加OSIsrBegin和OSIsrEnd函数,考虑到CPU允许中断嵌套的可能,特为此增加这个两个函数,如果
   25                      CPU允许中断嵌套,将GGT_CPU.h头文件的OS_INT_COUNT 定义为1即可
   26          **
   27          ****************************************************************************************************/
   28                                                                                       
   29          #include        "GGT_OS.h"
   30          #include        "GGT_CPU.h"
   31          #include        "GGT_Func.h"
   32          #include        "GGT_SysType.h"
   33          #include        "GGT_Kernel.h"
   34          
   35          #define T0IR           (*((volatile unsigned long *) 0xE0004000))
   36          #define T0TCR          (*((volatile unsigned long *) 0xE0004004))
   37          #define T0TC           (*((volatile unsigned long *) 0xE0004008))
   38          #define T0MCR          (*((volatile unsigned long *) 0xE0004014))
   39          #define T0MR0          (*((volatile unsigned long *) 0xE0004018))
   40          
   41          #define VICVectAddr0   (*((volatile unsigned long *) 0xFFFFF100))
   42          #define VICVectCntl0   (*((volatile unsigned long *) 0xFFFFF200))
   43          #define VICIntEnable   (*((volatile unsigned long *) 0xFFFFF010))
   44          
   45          #define VICVectAddr    (*((volatile unsigned long *) 0xFFFFF030))
   46          
   47          #if(OS_INT_COUNT)
   48          INT32 OSIrqCount = 0;
   49          #endif
   50          
   51          /****************************************************************************************************
   52          **  函数名: OSClockIRQ
   53          **  描  述: 系统时钟中断函数。系统时钟启动后,第一次节拍发生时,pOSTskNow等于pOSTskMain,
   54                      从而达到把main函数设置为main任务的目的。
   55          
   56          **  输 入: 无
   57          **  输 出: 无
   58          **  创建人: 卢益贵
ARM COMPILER V2.32a,  GGT_CPU_c                                                            28/02/08  23:05:54  PAGE 2   

   59          **  日 期: 2007年12月12日
   60          
   61          **------------------修改记录------------------------------------------------------------------------
   62          **  修改人: 
   63          **  版  本: 
   64          **  日 期: 
   65          **  描 述: 
   66          **
   67          **--------------------------------------------------------------------------------------------------
   68          ****************************************************************************************************/
   69          void DelayNS(int Time) __arm
   70          {
   71   1          // (1000000000 / (11059200 * 5)) = 18 每个
   72   1          // 在调用时消耗两个指令:
   73   1          // Mov R0,#Time 
   74   1          // B DelayNS
   75   1          Time = (Time - 18 * 5) / (18 * 3); // 估计消耗三个指令:
   76   1          // SUB R0, R0, #90 
   77   1          // DVF R0, R0, #54
   78   1          __asm
   79   1          {
   80   1              LOOP:
   81   1              SUB     R0, R0, #1
   82   1              CMP     R0, #0
   83   1              BLE     LOOP
   84   1          }
   85   1      }
   86          
   87          void OSClockInt(void) __arm __task
   88          {
   89   1          // 如果CPU或OS允许中断嵌套,应该在此判断是否是嵌套,是就退出
   90   1          #if(OS_INT_COUNT)
   91   1          __asm
   92   1          {
   93   1              LDR     R8, =OSIrqCount
   94   1              LDR     R8,[R8]
   95   1              CMP     R8,#0
   96   1              BEQ     SaverTaskData
   97   1          }
   98   1          T0IR = 0x01;
   99   1          VICVectAddr = 0;
  100   1          return;
  101   1          #endif
  102   1          // 保存当前任务环境
  103   1          __asm
  104   1          {
  105   1          SaverTaskData:
  106   1              STMDB   SP!,{R0-R1}
  107   1              STMDB   SP,{SP}^ 
  108   1              LDMDB   SP,{R0}
  109   1              SUB     LR,LR,#4
  110   1              STMDB   R0!,{LR}
  111   1              STMDB   R0!,{R2-R12,LR}^
  112   1              MRS     R1,SPSR
  113   1              LDMIA   SP!,{R2-R3}
  114   1              STMDB   R0!,{R1-R3}
  115   1              
  116   1              LDR     R1,=pOSTskNow
  117   1              LDR     R1,[R1]
  118   1              STR     R0,[R1,#4]
  119   1          }
  120   1      
  121   1          /*
  122   1          __asm
  123   1          {
  124   1          //SaverTaskData:
ARM COMPILER V2.32a,  GGT_CPU_c                                                            28/02/08  23:05:54  PAGE 3   

  125   1              STMDB   SP,{SP}^
  126   1              LDMDB   SP,{R8}
  127   1              MOV     R9,R8
  128   1              SUB     LR,LR,#4
  129   1              STMDB   R8!,{LR}
  130   1              STMDB   R8!,{LR}^
  131   1              STMDB   R8!,{R9}
  132   1              STMDB   R8!,{R0-R12}^
  133   1              MRS     R9,SPSR
  134   1              STMDB   R8!,{R9}
  135   1              
  136   1              LDR     R1,=pOSTskNow
  137   1              LDR     R1,[R1]
  138   1              STR     R0,[R1,#4]
  139   1          }
  140   1          */
  141   1      
  142   1          //进行任务调度
  143   1          OSTaskDispatch();
  144   1      
  145   1          //定时器计数
  146   1          OSTimerCheck();
  147   1      
  148   1          //中断结束
  149   1          T0IR = 0x01;
  150   1          VICVectAddr = 0;
  151   1      
  152   1          //就绪任务出列,并加载执行
  153   1          __asm
  154   1          {
  155   1              LDR     R4,=pOSTskNow       ;当前任务变量地址
  156   1              LDR     R3,=pOSTskReady     ;就绪任务变量地址
  157   1              MOV     R5, R3              ;保存就绪任务变量地址
  158   1              LDR     R3,[R3]             ;R3=就绪任务数据区地址
  159   1              STR     R3,[R4]             ;pOSTskNow = pOSTskReady
  160   1              LDR     R3,[R3]             ;R3=pOSTskReady-pNext
  161   1              STR     R3,[R5]             ;pOSTskReady = pOSTskReady-pNext
  162   1      
  163   1              LDR     R4,[R4]
  164   1              LDR     LR,[R4,#4]
  165   1              LDMIA   LR!,{R2}
  166   1              MSR     SPSR_cxsf,R2
  167   1              ADD     R0,LR,#60
  168   1              STMDB   SP,{R0}
  169   1              LDMDB   SP,{SP}^
  170   1              LDMIA   LR!,{R0-R12,LR}^
  171   1              LDMIA   LR!,{LR}
  172   1              MOVS    PC, LR
  173   1          }
  174   1      
  175   1          /*
  176   1          __asm
  177   1          {
  178   1              LDR     R8,=pOSTskNow       ;当前任务变量地址
  179   1              LDR     R9,=pOSTskReady     ;就绪任务变量地址
  180   1              MOV     R10, R9             ;保存就绪任务变量地址
  181   1              LDR     R9,[R9]             ;R3=就绪任务数据区地址
  182   1              STR     R9,[R8]             ;pOSTskNow = pOSTskReady
  183   1              LDR     R9,[R9]             ;R3=pOSTskReady-pNext
  184   1              STR     R9,[R10]            ;pOSTskReady = pOSTskReady-pNext
  185   1      
  186   1              LDR     R8,[R8]
  187   1              LDR     R8,[R8,#4]
  188   1              LDMIA   R8!,{R9}
  189   1              MSR     SPSR_cxsf,R9
  190   1              LDMIA   R8!,{R0-R12,SP,LR,PC}^
ARM COMPILER V2.32a,  GGT_CPU_c                                                            28/02/08  23:05:54  PAGE 4   

  191   1          }
  192   1          */
  193   1      }
  194          
  195          /****************************************************************************************************
  196          **  函数名: OSClockInit
  197          **  描  述: 打开系统节拍时钟
  198          **  输 入: 无
  199          **  输 出: 无
  200          **  创建人: 卢益贵
  201          **  日 期: 2007年12月8日
  202          
  203          **------------------修改记录------------------------------------------------------------------------
  204          **  修改人: 
  205          **  日 期:
  206          **  说  明:
  207          **  原代码:
  208          **--------------------------------------------------------------------------------------------------
  209          ****************************************************************************************************/
  210          void OSClockInit(void)
  211          {
  212   1          T0IR = 1;
  213   1          T0TC = 0;
  214   1          T0TCR = 0x01;
  215   1          T0MCR = 0x03;
  216   1          T0MR0 = OSGetFPCLK() / OSGetTick();
  217   1          VICVectAddr0  = (UINT32)OSClockInt;
  218   1          VICVectCntl0  = 0x20 | 4;
  219   1          VICIntEnable  |= (1 << 4);
  220   1      }
  221          
  222          /****************************************************************************************************
  223          **  函数名: OSStackAlloc
  224          **  描  述: 分配任务堆栈的函数
  225          **  输 入: 无
  226          **  输 出: 返回堆栈地址
  227          **  创建人: 卢益贵
  228          **  日 期: 2007年12月8日
  229          
  230          **------------------修改记录------------------------------------------------------------------------
  231          **  修改人: 
  232          **  日 期:
  233          **  说  明:
  234          **  原代码:
  235          **--------------------------------------------------------------------------------------------------
  236          ****************************************************************************************************/
  237          UINT32* OSStackAlloc(void)
  238          {
  239   1          // 满降序堆栈
  240   1          return((UINT32*)(((UINT32)BoxAlloc(OSGetBoxStack())) + OSGetSizeStack()));
  241   1      }
  242          
  243          /****************************************************************************************************
  244          **  函数名: OSStackInit
  245          **  描  述: 初始化任务堆栈
  246          **  输 入: 无
  247          **  输 出: 返回堆栈地址
  248          **  创建人: 卢益贵
  249          **  日 期: 2007年12月8日
  250          
  251          **------------------修改记录------------------------------------------------------------------------
  252          **  修改人: 
  253          **  日 期:
  254          **  说  明:
  255          **  原代码:
  256          **--------------------------------------------------------------------------------------------------
ARM COMPILER V2.32a,  GGT_CPU_c                                                            28/02/08  23:05:54  PAGE 5   

  257          ****************************************************************************************************/
  258          UINT32* OSStackInit(void *pTaskBody, UINT32 *pStack, UINT32 Mode, UINT32 TaskParam)
  259          {
  260   1          // 满降序堆栈
  261   1          *--pStack = (UINT32 *)pTaskBody;           /*  pc  */
  262   1          *--pStack = (UINT32 *)pTaskBody;           /*  lr  */
  263   1          *--pStack = 0;                             /*  r12  */
  264   1          *--pStack = 0;                             /*  r11  */
  265   1          *--pStack = 0;                             /*  r10  */
  266   1          *--pStack = 0;                             /*  r9   */
  267   1          *--pStack = 0;                             /*  r8   */
  268   1          *--pStack = 0;                             /*  r7   */
  269   1          *--pStack = 0;                             /*  r6   */
  270   1          *--pStack = 0;                             /*  r5   */
  271   1          *--pStack = 0;                             /*  r4   */
  272   1          *--pStack = 0;                             /*  r3   */

⌨️ 快捷键说明

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