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

📄 os_cpu_c.txt

📁 在KEIL下成功使用UCOS-II嵌入式操作系统
💻 TXT
📖 第 1 页 / 共 2 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 947] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\os_cpu_c.o --device=DARMP -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     	*--stk = 0;								/*  主要是为出栈时凑够偶数个字*/
0000e0  e2404004          SUB      r4,r0,#4
0000e4  e1a00004          MOV      r0,r4
0000e8  e584e000          STR      lr,[r4,#0]
;;;96     	 
;;;97         return (stk);
;;;98     }
0000ec  e8bd8010          POP      {r4,pc}
                          ENDP

                  SWI_Exception PROC
;;;129            void SWI_Exception(int SWI_Num, int *Regs)
;;;130    {
0000f0  e52de004          PUSH     {lr}
;;;131        OS_TCB   *ptcb;
;;;132        OS_STK tmp;
;;;133        switch(SWI_Num)
0000f4  e3500081          CMP      r0,#0x81
0000f8  0a000027          BEQ      |L1.412|
0000fc  ca000006          BGT      |L1.284|
000100  e3500002          CMP      r0,#2
000104  0a000009          BEQ      |L1.304|
000108  e3500003          CMP      r0,#3
00010c  0a000011          BEQ      |L1.344|
000110  e3500080          CMP      r0,#0x80
000114  1a000044          BNE      |L1.556|
000118  ea000019          B        |L1.388|
                  |L1.284|
00011c  e3500082          CMP      r0,#0x82
000120  0a000023          BEQ      |L1.436|
000124  e3500083          CMP      r0,#0x83
000128  1a00003f          BNE      |L1.556|
00012c  ea00002f          B        |L1.496|
;;;134        {
;;;135            //case 0x00:                    /* 任务切换函数OS_TASK_SW,参考os_cpu_s.s文件     */
;;;136            //    break;
;;;137            //case 0x01:                    /* 启动任务函数OSStartHighRdy,参考os_cpu_s.s文件 */
;;;138            //    break;
;;;139            case 0x02:                      /* 关中断函数OS_ENTER_CRITICAL(),参考os_cpu.h文件 */
                  |L1.304|
000130  e1a00000          MOV      r0,r0
;;;140                __asm
;;;141                {
;;;142                    MRS     tmp, SPSR
000134  e14f3000          MRS      r3,SPSR
;;;143                    ORR     tmp, tmp, #NoInt
000138  e3833080          ORR      r3,r3,#0x80
;;;144                    MSR     SPSR_c, tmp
00013c  e161f003          MSR      SPSR_c,r3
;;;145                }
;;;146                OsEnterSum++;
000140  e59fc130          LDR      r12,|L1.632|
000144  e59cc000          LDR      r12,[r12,#0]  ; OsEnterSum
000148  e28cc001          ADD      r12,r12,#1
00014c  e59fe124          LDR      lr,|L1.632|
000150  e58ec000          STR      r12,[lr,#0]  ; OsEnterSum
;;;147                break;
000154  ea000036          B        |L1.564|
;;;148            case 0x03:                      /* 开中断函数OS_EXIT_CRITICAL(),参考os_cpu.h文件 */
                  |L1.344|
000158  e1a00000          MOV      r0,r0
;;;149                if (--OsEnterSum == 0)
00015c  e59fc114          LDR      r12,|L1.632|
000160  e59cc000          LDR      r12,[r12,#0]  ; OsEnterSum
000164  e25cc001          SUBS     r12,r12,#1
000168  e59fe108          LDR      lr,|L1.632|
00016c  e58ec000          STR      r12,[lr,#0]  ; OsEnterSum
000170  1a000002          BNE      |L1.384|
;;;150                {
;;;151                    __asm
;;;152                    {
;;;153                        MRS     tmp, SPSR
000174  e14f3000          MRS      r3,SPSR
;;;154                        BIC     tmp, tmp, #NoInt
000178  e3c33080          BIC      r3,r3,#0x80
;;;155                        MSR     SPSR_c, tmp
00017c  e161f003          MSR      SPSR_c,r3
;;;156                    }
;;;157                }
;;;158                break;
                  |L1.384|
000180  ea00002b          B        |L1.564|
;;;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;

⌨️ 快捷键说明

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