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

📄 os_cpu_c.txt

📁 一个电力系统谐波检测的程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 951] for uVision
; commandline ArmCC [--debug -c --asm --interleave -oos_cpu_c.o --device=DARMP --apcs=interwork -O0 -IC:\Keil\ARM\INC\Philips ARM\Os_cpu_c.c]

                          ARM

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

                  OSTaskStkInit PROC
;;;69             OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
;;;70     {
000000  e92d4010          PUSH     {r4,lr}
000004  e1a0c000          MOV      r12,r0
;;;71         OS_STK *stk;
;;;72     
;;;73         opt    = opt;                           /* 'opt'  没有使用。作用是避免编译器警告    */
000008  e1a00000          MOV      r0,r0
;;;74         stk    = ptos;                          /* 获取堆栈指针                                       */
00000c  e1a00002          MOV      r0,r2
;;;75     
;;;76                                                 /* 建立任务环境,ADS1.2使用满递减堆栈       */
;;;77         *stk = (OS_STK) task;                   /*  pc  */
000010  e580c000          STR      r12,[r0,#0]
;;;78         *--stk = (OS_STK) task;                 /*  lr  */
000014  e240e004          SUB      lr,r0,#4
000018  e1a0000e          MOV      r0,lr
00001c  e58ec000          STR      r12,[lr,#0]
;;;79     
;;;80         *--stk = 0;                             /*  r12  */
000020  e3a0e000          MOV      lr,#0
000024  e2404004          SUB      r4,r0,#4
000028  e1a00004          MOV      r0,r4
00002c  e584e000          STR      lr,[r4,#0]
;;;81         *--stk = 0;                             /*  r11  */
000030  e2404004          SUB      r4,r0,#4
000034  e1a00004          MOV      r0,r4
000038  e584e000          STR      lr,[r4,#0]
;;;82         *--stk = 0;                             /*  r10  */
00003c  e2404004          SUB      r4,r0,#4
000040  e1a00004          MOV      r0,r4
000044  e584e000          STR      lr,[r4,#0]
;;;83         *--stk = 0;                             /*  r9   */
000048  e2404004          SUB      r4,r0,#4
00004c  e1a00004          MOV      r0,r4
000050  e584e000          STR      lr,[r4,#0]
;;;84         *--stk = 0;                             /*  r8   */
000054  e2404004          SUB      r4,r0,#4
000058  e1a00004          MOV      r0,r4
00005c  e584e000          STR      lr,[r4,#0]
;;;85         *--stk = 0;                             /*  r7   */
000060  e2404004          SUB      r4,r0,#4
000064  e1a00004          MOV      r0,r4
000068  e584e000          STR      lr,[r4,#0]
;;;86         *--stk = 0;                             /*  r6   */
00006c  e2404004          SUB      r4,r0,#4
000070  e1a00004          MOV      r0,r4
000074  e584e000          STR      lr,[r4,#0]
;;;87         *--stk = 0;                             /*  r5   */
000078  e2404004          SUB      r4,r0,#4
00007c  e1a00004          MOV      r0,r4
000080  e584e000          STR      lr,[r4,#0]
;;;88         *--stk = 0;                             /*  r4   */
000084  e2404004          SUB      r4,r0,#4
000088  e1a00004          MOV      r0,r4
00008c  e584e000          STR      lr,[r4,#0]
;;;89         *--stk = 0;                             /*  r3   */
000090  e2404004          SUB      r4,r0,#4
000094  e1a00004          MOV      r0,r4
000098  e584e000          STR      lr,[r4,#0]
;;;90         *--stk = 0;                             /*  r2   */
00009c  e2404004          SUB      r4,r0,#4
0000a0  e1a00004          MOV      r0,r4
0000a4  e584e000          STR      lr,[r4,#0]
;;;91         *--stk = 0;                             /*  r1   */
0000a8  e2404004          SUB      r4,r0,#4
0000ac  e1a00004          MOV      r0,r4
0000b0  e584e000          STR      lr,[r4,#0]
;;;92         *--stk = (unsigned int) pdata;          /*  r0,第一个参数使用R0传递   */
0000b4  e240e004          SUB      lr,r0,#4
0000b8  e1a0000e          MOV      r0,lr
0000bc  e58e1000          STR      r1,[lr,#0]
;;;93         *--stk = (USER_USING_MODE|0x00);        /*  spsr,允许 IRQ, FIQ 中断   */
0000c0  e3a0e010          MOV      lr,#0x10
0000c4  e2404004          SUB      r4,r0,#4
0000c8  e1a00004          MOV      r0,r4
0000cc  e584e000          STR      lr,[r4,#0]
;;;94         *--stk = 0;                             /*  关中断计数器OsEnterSum;    */
0000d0  e3a0e000          MOV      lr,#0
0000d4  e2404004          SUB      r4,r0,#4
0000d8  e1a00004          MOV      r0,r4
0000dc  e584e000          STR      lr,[r4,#0]
;;;95     
;;;96         return (stk);
0000e0  e8bd4010          POP      {r4,lr}
;;;97     }
0000e4  e12fff1e          BX       lr
                          ENDP

                  SWI_Exception PROC
;;;128            void SWI_Exception(int SWI_Num, int *Regs)
;;;129    {
0000e8  e52de004          PUSH     {lr}
;;;130        OS_TCB   *ptcb;
;;;131        unsigned int temp;	   //以前的keil for 2.5 或 ADS1.2下,这个是不用这样子定义的
;;;132    							//直接用R0即可,,
;;;133        
;;;134        switch(SWI_Num)
0000ec  e3500081          CMP      r0,#0x81
0000f0  0a000027          BEQ      |L1.404|
0000f4  ca000006          BGT      |L1.276|
0000f8  e3500002          CMP      r0,#2
0000fc  0a000009          BEQ      |L1.296|
000100  e3500003          CMP      r0,#3
000104  0a000011          BEQ      |L1.336|
000108  e3500080          CMP      r0,#0x80
00010c  1a000044          BNE      |L1.548|
000110  ea000019          B        |L1.380|
                  |L1.276|
000114  e3500082          CMP      r0,#0x82
000118  0a000023          BEQ      |L1.428|
00011c  e3500083          CMP      r0,#0x83
000120  1a00003f          BNE      |L1.548|
000124  ea00002f          B        |L1.488|
;;;135        {
;;;136            //case 0x00:                    /* 任务切换函数OS_TASK_SW,参考os_cpu_s.s文件     */
;;;137            //    break;
;;;138            //case 0x01:                    /* 启动任务函数OSStartHighRdy,参考os_cpu_s.s文件 */
;;;139            //    break;
;;;140            case 0x02:                      /* 关中断函数OS_ENTER_CRITICAL(),参考os_cpu.h文件 */
                  |L1.296|
000128  e1a00000          MOV      r0,r0
;;;141                __asm
;;;142                {
;;;143                    MRS     temp, SPSR
00012c  e14f3000          MRS      r3,SPSR
;;;144                    ORR     temp, temp, #NoInt
000130  e3833080          ORR      r3,r3,#0x80
;;;145                    MSR     SPSR_c, temp
000134  e161f003          MSR      SPSR_c,r3
;;;146                }
;;;147                OsEnterSum++;
000138  e59fc138          LDR      r12,|L1.632|
00013c  e59cc000          LDR      r12,[r12,#0]  ; OsEnterSum
000140  e28cc001          ADD      r12,r12,#1
000144  e59fe12c          LDR      lr,|L1.632|
000148  e58ec000          STR      r12,[lr,#0]  ; OsEnterSum
;;;148                break;
00014c  ea000036          B        |L1.556|
;;;149            case 0x03:                      /* 开中断函数OS_EXIT_CRITICAL(),参考os_cpu.h文件 */
                  |L1.336|
000150  e1a00000          MOV      r0,r0
;;;150                if (--OsEnterSum == 0)
000154  e59fc11c          LDR      r12,|L1.632|
000158  e59cc000          LDR      r12,[r12,#0]  ; OsEnterSum
00015c  e25cc001          SUBS     r12,r12,#1
000160  e59fe110          LDR      lr,|L1.632|
000164  e58ec000          STR      r12,[lr,#0]  ; OsEnterSum
000168  1a000002          BNE      |L1.376|
;;;151                {
;;;152                    __asm
;;;153                    {
;;;154                        MRS     temp, SPSR
00016c  e14f3000          MRS      r3,SPSR
;;;155                        BIC     temp, temp, #NoInt
000170  e3c33080          BIC      r3,r3,#0x80
;;;156                        MSR     SPSR_c, temp
000174  e161f003          MSR      SPSR_c,r3
;;;157                    }
;;;158                }
;;;159                break;
                  |L1.376|
000178  ea00002b          B        |L1.556|
;;;160    #if OS_SELF_EN > 0 
;;;161            case 0x40:
;;;162                                            /* 返回指定系统服务函数的地址       */
;;;163                                            /* 函数地址存于数组_OSFunctionAddr中*/
;;;164                                            /* 数组_OSFunctionAddr需要另外定义  */
;;;165                                            /* Regs[0] 为第一个参数,也是返回值 */
;;;166                                            /* Regs[1] 为第二个参数             */
;;;167                                            /* Regs[2] 为第三个参数             */
;;;168                                            /* Regs[3] 为第四个参数             */
;;;169                                            /* 仅有一个参数为系统服务函数的索引 */
;;;170                Regs[0] =  _OSFunctionAddr[Regs[0]];
;;;171                break;
;;;172            case 0x41:
;;;173                                            /* 返回指定用户的服务函数的地址     */
;;;174                                            /* 函数地址存于数组_UsrFunctionAddr中*/
;;;175                                            /* 数组_UsrFunctionAddr需要另外定义 */
;;;176                                            /* Regs[0] 为第一个参数,也是返回值 */
;;;177                                            /* Regs[1] 为第二个参数             */
;;;178                                            /* Regs[2] 为第三个参数             */
;;;179                                            /* Regs[3] 为第四个参数             */
;;;180                                            /* 仅有一个参数为用户服务函数的索引 */
;;;181                Regs[0] =  _UsrFunctionAddr[Regs[0]];
;;;182                break;
;;;183            case 0x42:                      /* 中断开始处理 */

⌨️ 快捷键说明

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