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

📄 ggt_cpu_c.lst

📁 ARM下的多任务操作系统源码:GogotoOS
💻 LST
📖 第 1 页 / 共 3 页
字号:
  273   1          *--pStack = 0;                             /*  r2   */
  274   1          *--pStack = 0;                              /*  r1   */
  275   1          *--pStack = TaskParam;                      /*  r0   */
  276   1          *--pStack = Mode;
  277   1          return(pStack);
  278   1      }
  279          
  280          /****************************************************************************************************
  281          **  函数名: main
  282          **  描  述: C语言函数入口,
  283          **  输 入: 无
  284          **  输 出: 无
  285          **  创建人: 卢益贵
  286          **  日 期: 2007年12月8日
  287          
  288          **------------------修改记录------------------------------------------------------------------------
  289          **  修改人: 卢益贵
  290          **  日 期: 2008年1月10日
  291          **  说  明:
  292          **  原代码:
  293          void main(void)  __arm __task
  294          {
  295              // 初始化任务系统
  296              OSTaskInit();
  297          
  298              // 设置main函数为当前任务,移植时应注意修改这个部分
  299              pOSTskMain->pTskStack -= 10;       // 指向空栈
  300              __asm
  301              {
  302                  LDR     R4,=pOSTskMain      // mian任务变量地址
  303                  LDR     R4,[R4, #0]         // main任务数据区地址
  304                  LDR     R4,[R4, #4]         // R4=堆栈指针
  305                  MOV     SP, R4              // 把SP指向main任务堆栈区,
  306              }
  307              
  308          
  309              // 打开系统节拍时钟
  310              OSClockInit();  
  311          
  312              // 调用用户主函数,初始化用户系统
  313              umain();
  314          
  315              // 把main任务权限设置为无穷大,将进行永久等待
  316              pOSTskMain->PrioTick = 1000 * 90000;
  317              while(1)
  318              {
  319                  // 把main任务设置为永远延时任务
  320                  pOSTskMain->StateValue = 1000 * 90000;
  321                  // CPU休眠
  322                  (PCON = PCON | 0x01);
ARM COMPILER V2.32a,  GGT_CPU_c                                                            28/02/08  23:05:54  PAGE 6   

  323              }
  324          }
  325          **--------------------------------------------------------------------------------------------------
  326          ****************************************************************************************************/
  327          
  328          //用户主任务
  329          extern void TaskUasrMain(void) __task;
  330          
  331          #define PCON           (*((volatile unsigned char *) 0xE01FC0C0))
  332          #define IOPIN          (*((volatile unsigned long *) 0xE0028000))
  333          
  334          void main(void)  __arm __task
  335          {
  336   1          // 初始化任务系统
  337   1          OSInit();
  338   1      
  339   1          // 设置main函数为当前任务,移植时应注意修改这个部分
  340   1          pOSTskMain->pTskStack -= 10;       // 指向空栈
  341   1          __asm
  342   1          {
  343   1              LDR     R4,=pOSTskMain      // mian任务变量地址
  344   1              LDR     R4,[R4, #0]         // main任务数据区地址
  345   1              LDR     R4,[R4, #4]         // R4=堆栈指针
  346   1              STR     SP, [R4]            // 把SP指向main任务堆栈区,
  347   1          }
  348   1      
  349   1          // 如果不想
  350   1      
  351   1          // 打开系统节拍时钟
  352   1          OSClockInit();
  353   1      
  354   1          // 创建用户主任务(必须等系统初始化完了以后才能创建)
  355   1          OSTaskCreate(TaskUasrMain, 0, 255);
  356   1      
  357   1          // 把main任务权限设置为无穷大,将进行永久等待
  358   1          pOSTskMain->PrioTick = 1000 * 90000;
  359   1          while(1)
  360   1          {
  361   2              // 把main任务设置为永远延时任务
  362   2              pOSTskMain->StateValue = 1000 * 90000;
  363   2              // CPU休眠
  364   2              (PCON = PCON | 0x01);
  365   2          }
  366   1      }
  367          
  368          /****************************************************************************************************
  369          **  函数名: OSTaskCreate
  370          **  描  述: 创建默认模式的用户任务
  371          **  输 入: 无
  372          **  输 出: 无
  373          **  创建人: 卢益贵
  374          **  日 期: 2007年12月8日
  375          
  376          **------------------修改记录------------------------------------------------------------------------
  377          **  修改人: 
  378          **  日 期:
  379          **  说  明:
  380          **  原代码:
  381          **--------------------------------------------------------------------------------------------------
  382          ****************************************************************************************************/
  383          UINT32 OSTaskCreate(void *pTaskBody, const UINT32 Prio, const UINT32 TaskParam)
  384          {
  385   1          return(OSTaskUserCreate(pTaskBody, Prio, USR32MODE, TaskParam));
  386   1      }
  387          
  388          /****************************************************************************************************
ARM COMPILER V2.32a,  GGT_CPU_c                                                            28/02/08  23:05:54  PAGE 7   

  389          **  函数名: OSIsrBegin
  390          **  描  述: 中断服务开始,对中断嵌套计数,中断函数第一条语句为调用该函数。
  391          **  输 入: 无
  392          **  输 出: 无
  393          **  创建人: 卢益贵
  394          **  日 期: 2008年1月5日
  395          
  396          **------------------修改记录------------------------------------------------------------------------
  397          **  修改人: 
  398          **  日 期:
  399          **  说  明:
  400          **  原代码:
  401          **--------------------------------------------------------------------------------------------------
  402          ****************************************************************************************************/
  403          void OSIsrBegin(void)
  404          {
  405   1          #if(OS_INT_COUNT)
  406   1          OSIrqCount++;
  407   1          #endif
  408   1      }
  409          
  410          /****************************************************************************************************
  411          **  函数名: OSIsrEnd
  412          **  描  述: 中断服务结束,对中断嵌套计数,如果有任务要处理中断数据,中断函数的最后语句为调用本函数,
  413                      系统立即切换任务,本函数在CPU未允许中断嵌套的情况,OS_INT_COUNT定义为0时,
  414                      只执行任务切换功能。
  415          **  输 入: IsSW:1为立即切换任务,其他未定义
  416          **  输 出: 无
  417          **  创建人: 卢益贵
  418          **  日 期: 2008年1月5日
  419          
  420          **------------------修改记录------------------------------------------------------------------------
  421          **  修改人: 
  422          **  日 期:
  423          **  说  明:
  424          **  原代码:
  425          **--------------------------------------------------------------------------------------------------
  426          ****************************************************************************************************/
  427          void OSIsrEnd(BOOL DoSW)
  428          {
  429   1          #if(OS_INT_COUNT)
  430   1          if(OSIrqCount)
  431   1              OSIrqCount++;
  432   1          #endif
  433   1      
  434   1          //立即切换任务
  435   1          if(DoSW)
  436   1          {
  437   2              OSTaskIsNULLLoadDef();
  438   2              OSTaskSW();
  439   2          }
  440   1      }
  441          
ARM COMPILER V2.32a,  GGT_CPU_c                                                            28/02/08  23:05:54  PAGE 8   

ASSEMBLY LISTING OF GENERATED OBJECT CODE



*** EXTERNALS:
 EXTERN CODE32 (OSTaskUserCreate?A)
 EXTERN CODE32 (SWI_Handler?A)
 EXTERN CODE32 (BoxAlloc?A)
 EXTERN DATA (pOSTskNow)
 EXTERN DATA (pOSTskMain)
 EXTERN DATA (pOSTskReady)
 EXTERN CODE32 (OSTaskDispatch?A)
 EXTERN CODE32 (OSInit?A)
 EXTERN CODE32 (OSTaskIsNULLLoadDef?A)
 EXTERN CODE32 (OSTimerCheck?A)
 EXTERN CODE32 (OSGetBoxStack?A)
 EXTERN CODE32 (OSGetSizeStack?A)
 EXTERN CODE32 (OSGetFPCLK?A)
 EXTERN CODE32 (OSGetTick?A)
 EXTERN CODE32 (TaskUasrMain?A)
 EXTERN CODE32 (?C?SDIV?A)
 EXTERN NUMBER (__startup)



*** PUBLICS:
 PUBLIC         OSTaskCreate?A
 PUBLIC         OSIsrBegin?A
 PUBLIC         OSIsrEnd?A
 PUBLIC         OSClockInit?A
 PUBLIC         OSStackAlloc?A
 PUBLIC         OSStackInit?A
 PUBLIC         DelayNS?A
 PUBLIC         OSClockInt?A
 PUBLIC         main
 PUBLIC         OSIrqCount



*** DATA SEGMENT '?DT0?GGT_CPU_c':
 00000000          OSIrqCount:
 00000000           BEGIN_INIT
 00000000  00000000  DD          0x0
 00000004           END_INIT



*** CODE SEGMENT '?PR?DelayNS?A?GGT_CPU_c':
   69: void DelayNS(int Time) __arm
 00000000  E92D4000  STMDB       R13!,{LR}
 00000004  E1A02000  MOV         R2,R0 ; Time
 00000008  ---- Variable 'Time' assigned to Register 'R2' ----
   75:     Time = (Time - 18 * 5) / (18 * 3); // 估计消耗三个指令:
 00000008  E1A00002  MOV         R0,R2 ; Time
 0000000C  E240005A  SUB         R0,R0,#0x005A ; Time
 00000010  E3A01036  MOV         R1,#0x36
 00000014  EBFFFFF9  BL          ?C?SDIV?A  ; Targ=0x0 ; ?C?SDIV?A
 00000018  E1A00001  MOV         R0,R1
 0000001C  E1A02000  MOV         R2,R0 ; Time
   80:         LOOP:
 00000020          LOOP:
   81:         SUB     R0, R0, #1
 00000020  E2400001  SUB         R0,R0,#0x0001
   82:         CMP     R0, #0
 00000024  E3500000  CMP         R0,#0x0000
   83:         BLE     LOOP
 00000028  DAFFFFF3  BLE         LOOP  ; Targ=0xFFFFFFFC
   85: }
 0000002C  E8BD0008  LDMIA       R13!,{R3}
 00000030  E12FFF13  BX          R3
 00000034          ENDP ; 'DelayNS?A'


*** CODE SEGMENT '?PR?OSClockInt?A?GGT_CPU_c':
   93:         LDR     R8, =OSIrqCount
ARM COMPILER V2.32a,  GGT_CPU_c                                                            28/02/08  23:05:54  PAGE 9   

 00000000  E51F8000  LDR         R0,=OSIrqCount
   94:         LDR     R8,[R8]
 00000004  E5988000  LDR         R8,[R8]
   95:         CMP     R8,#0
 00000008  E3580000  CMP         R8,#0x0000
   96:         BEQ     SaverTaskData
 0000000C  0AFFFFFA  BEQ         SaverTaskData  ; Targ=0xFFFFFFFC
   98:     T0IR = 0x01;
 00000010  E3A01001  MOV         R1,#0x1
 00000014  E5100000  LDR         R0,=0xE0004000
 00000018  E5801000  STR         R1,[R0,#0x0]
   99:     VICVectAddr = 0;
 0000001C  E3A01000  MOV         R1,#0x0
 00000020  E5100000  LDR         R0,=0xFFFFF030
 00000024  E5801000  STR         R1,[R0,#0x0]
  193: }
 00000028          ENDP ; 'OSClockInt?A'


*** CODE SEGMENT '?PR?OSClockInit?A?GGT_CPU_c':
  210: void OSClockInit(void)
 00000000  E92D4010  STMDB       R13!,{R4,LR}
  212:     T0IR = 1;
 00000004  E3A01001  MOV         R1,#0x1
 00000008  E5100000  LDR         R0,=0xE0004000
 0000000C  E5801000  STR         R1,[R0,#0x0]
  213:     T0TC = 0;
 00000010  E3A01000  MOV         R1,#0x0
 00000014  E5100000  LDR         R0,=0xE0004008
 00000018  E5801000  STR         R1,[R0,#0x0]
  214:     T0TCR = 0x01;
 0000001C  E3A01001  MOV         R1,#0x1
 00000020  E5100000  LDR         R0,=0xE0004004
 00000024  E5801000  STR         R1,[R0,#0x0]
  215:     T0MCR = 0x03;
 00000028  E3A01003  MOV         R1,#0x3
 0000002C  E5100000  LDR         R0,=0xE0004014
 00000030  E5801000  STR         R1,[R0,#0x0]

⌨️ 快捷键说明

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