os_cpu_c.txt

来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 322 行 · 第 1/2 页

TXT
322
字号
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 934] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_cpu_c.o --depend=.\rvmdk\os_cpu_c.d --device=DARMP --apcs=interwork -O1 -I. -I..\BSP -I..\..\..\..\uCOS-II\Ports\ARM\Generic\RealView -I..\..\..\..\uCOS-II\Source -I..\..\..\..\uC-CPU -I..\..\..\..\uC-CPU\ARM\RealView -I..\..\..\..\uC-LIB -I..\..\..\..\uC-TCPIP\IF -I..\..\..\..\uC-TCPIP\IF\Ether -I..\..\..\..\uC-TCPIP\NIC\ETHER\LPC2378 -I..\..\..\..\uC-TCPIP\NIC\ETHER\PHY -I..\..\..\..\uC-TCPIP\NIC\ETHER\PHY\DP83848 -I..\..\..\..\uC-TCPIP\OS\uCOS-II -I..\..\..\..\uC-TCPIP\Source -I..\..\..\..\uC-LCD\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\RS-232\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\TCPIP\Source -I..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -Ie:\Keil_ARM\ARM\INC\Philips -D__IN_CHIP --omf_browse=.\rvmdk\os_cpu_c.crf ..\arm\Os_cpu_c.c]
                          ARM

                          AREA ||.text||, CODE, READONLY, ALIGN=2

                  OSTaskStkInit PROC
;;;76                                                 /* 建立任务环境,ADS1.2使用满递减堆栈       */
;;;77         *stk = (OS_STK) task;                   /*  pc  */
000000  e5820000          STR      r0,[r2,#0]
;;;78         *--stk = (OS_STK) task;                 /*  lr  */
000004  e2423004          SUB      r3,r2,#4
000008  e5020004          STR      r0,[r2,#-4]
;;;79     
;;;80         *--stk = 0;                             /*  r12  */
00000c  e3a02000          MOV      r2,#0
000010  e2430004          SUB      r0,r3,#4
000014  e5032004          STR      r2,[r3,#-4]
;;;81         *--stk = 0;                             /*  r11  */
000018  e5002004          STR      r2,[r0,#-4]
;;;82         *--stk = 0;                             /*  r10  */
00001c  e5002008          STR      r2,[r0,#-8]
;;;83         *--stk = 0;                             /*  r9   */
000020  e500200c          STR      r2,[r0,#-0xc]
;;;84         *--stk = 0;                             /*  r8   */
000024  e5002010          STR      r2,[r0,#-0x10]
;;;85         *--stk = 0;                             /*  r7   */
000028  e5002014          STR      r2,[r0,#-0x14]
;;;86         *--stk = 0;                             /*  r6   */
00002c  e5002018          STR      r2,[r0,#-0x18]
;;;87         *--stk = 0;                             /*  r5   */
000030  e500201c          STR      r2,[r0,#-0x1c]
;;;88         *--stk = 0;                             /*  r4   */
000034  e5002020          STR      r2,[r0,#-0x20]
;;;89         *--stk = 0;                             /*  r3   */
000038  e5002024          STR      r2,[r0,#-0x24]
;;;90         *--stk = 0;                             /*  r2   */
00003c  e5002028          STR      r2,[r0,#-0x28]
;;;91         *--stk = 0;                             /*  r1   */
000040  e500202c          STR      r2,[r0,#-0x2c]
;;;92         *--stk = (unsigned int) pdata;          /*  r0,第一个参数使用R0传递   */
000044  e5001030          STR      r1,[r0,#-0x30]
;;;93         *--stk = (USER_USING_MODE|0x00);	    /*  spsr,允许 IRQ, FIQ 中断   */
000048  e3a01010          MOV      r1,#0x10
00004c  e5001034          STR      r1,[r0,#-0x34]
;;;94         *--stk = 0;                             /*  关中断计数器OsEnterSum;    */
000050  e5202038          STR      r2,[r0,#-0x38]!
;;;95     
;;;96         return (stk);
;;;97     }
000054  e12fff1e          BX       lr
;;;98     
                          ENDP

                  SWI_Exception PROC
;;;131        
;;;132        switch(SWI_Num)
000058  e3500081          CMP      r0,#0x81
00005c  0a00002e          BEQ      |L1.284|
000060  ca00000c          BGT      |L1.152|
000064  e59f2124          LDR      r2,|L1.400|
000068  e3500002          CMP      r0,#2
00006c  e5921000          LDR      r1,[r2,#0]
000070  0a000018          BEQ      |L1.216|
000074  e3500003          CMP      r0,#3
000078  0a00001c          BEQ      |L1.240|
00007c  e3500080          CMP      r0,#0x80
000080  1a000003          BNE      |L1.148|
;;;133        {
;;;134            //case 0x00:                    /* 任务切换函数OS_TASK_SW,参考os_cpu_s.s文件     */
;;;135            //    break;
;;;136            //case 0x01:                    /* 启动任务函数OSStartHighRdy,参考os_cpu_s.s文件 */
;;;137            //    break;
;;;138            case 0x02:                      /* 关中断函数OS_ENTER_CRITICAL(),参考os_cpu.h文件 */
;;;139                __asm
;;;140                {
;;;141                    MRS     R0, SPSR
;;;142                    ORR     R0, R0, #NoInt
;;;143                    MSR     SPSR_c, R0
;;;144                }
;;;145                OsEnterSum++;
;;;146                break;
;;;147            case 0x03:                      /* 开中断函数OS_EXIT_CRITICAL(),参考os_cpu.h文件 */
;;;148    	     if(OsEnterSum>0)OsEnterSum--;	//这样处理是为了可以直接调用OS_EXIT_CRITICAL()进行允许中断,也为了防止未成对使用出错
;;;149                if (OsEnterSum == 0)
;;;150                {
;;;151                    __asm
;;;152                    {
;;;153                        MRS     R0, SPSR
;;;154                        BIC     R0, R0, #NoInt
;;;155                        MSR     SPSR_c, R0
;;;156                    }
;;;157                }
;;;158                break;
;;;159    #if OS_SELF_EN > 0 
;;;160            case 0x40:
;;;161                                            /* 返回指定系统服务函数的地址       */
;;;162                                            /* 函数地址存于数组_OSFunctionAddr中*/
;;;163                                            /* 数组_OSFunctionAddr需要另外定义  */
;;;164                                            /* Regs[0] 为第一个参数,也是返回值 */
;;;165                                            /* Regs[1] 为第二个参数             */
;;;166                                            /* Regs[2] 为第三个参数             */
;;;167                                            /* Regs[3] 为第四个参数             */
;;;168                                            /* 仅有一个参数为系统服务函数的索引 */
;;;169                Regs[0] =  _OSFunctionAddr[Regs[0]];
;;;170                break;
;;;171            case 0x41:
;;;172                                            /* 返回指定用户的服务函数的地址     */
;;;173                                            /* 函数地址存于数组_UsrFunctionAddr中*/
;;;174                                            /* 数组_UsrFunctionAddr需要另外定义 */
;;;175                                            /* Regs[0] 为第一个参数,也是返回值 */
;;;176                                            /* Regs[1] 为第二个参数             */
;;;177                                            /* Regs[2] 为第三个参数             */
;;;178                                            /* Regs[3] 为第四个参数             */
;;;179                                            /* 仅有一个参数为用户服务函数的索引 */
;;;180                Regs[0] =  _UsrFunctionAddr[Regs[0]];
;;;181                break;
;;;182            case 0x42:                      /* 中断开始处理 */
;;;183                OSIntNesting++;
;;;184                break;
;;;185            case 0x43:                      /*  判断中断是否需要切换             */
;;;186                if (OSTCBHighRdy == OSTCBCur)
;;;187                {
;;;188                    Regs[0] = 0;
;;;189                }
;;;190                else
;;;191                {
;;;192                    Regs[0] = 1;
;;;193                }
;;;194                break;
;;;195    #endif
;;;196            case 0x80:                      /* 任务切换到系统模式 */
;;;197                __asm
;;;198                {
;;;199                    MRS     R0, SPSR
000084  e14f0000          MRS      r0,SPSR
;;;200                    BIC     R0, R0, #0x1f
000088  e3c0001f          BIC      r0,r0,#0x1f
;;;201                    ORR     R0, R0, #SYS32Mode    
00008c  e380001f          ORR      r0,r0,#0x1f
;;;202                    MSR     SPSR_c, R0
000090  e161f000          MSR      SPSR_c,r0
                  |L1.148|
;;;203                }
;;;204                break;
;;;205            case 0x81:                      /* 任务切换到用户模式 */
;;;206                __asm
;;;207                {
;;;208                    MRS     R0, SPSR
;;;209                    BIC     R0, R0, #0x1f
;;;210                    ORR     R0, R0, #USR32Mode    
;;;211                    MSR     SPSR_c, R0
;;;212                }
;;;213                break;
;;;214            case 0x82:                      /* 任务是ARM代码 */
;;;215                if (Regs[0] <= OS_LOWEST_PRIO)
;;;216                {
;;;217                    ptcb = OSTCBPrioTbl[Regs[0]];
;;;218                    if (ptcb != NULL)
;;;219                    {
;;;220                        ptcb -> OSTCBStkPtr[1] &= ~(1 << 5);

⌨️ 快捷键说明

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