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

📄 os_core.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 5 页
字号:
000210  e1a00008          MOV      r0,r8
000214  ebfffffe          BL       OS_CPU_SR_Restore
000218  e3a00000          MOV      r0,#0
00021c  e5c60000          STRB     r0,[r6,#0]
000220  eaffffcb          B        |L1.340|
                          ENDP

                  OS_TaskStatStkChk PROC
;;;1462   void  OS_TaskStatStkChk (void)
;;;1463   {
000224  e92d407c          PUSH     {r2-r6,lr}
;;;1464       OS_TCB      *ptcb;
;;;1465       OS_STK_DATA  stk_data;
;;;1466       INT8U        err;
;;;1467       INT8U        prio;
;;;1468   
;;;1469   
;;;1470       for (prio = 0; prio <= OS_TASK_IDLE_PRIO; prio++) {
000228  e3a06000          MOV      r6,#0
00022c  ea000013          B        |L1.640|
                  |L1.560|
;;;1471           err = OSTaskStkChk(prio, &stk_data);
000230  e28d1000          ADD      r1,sp,#0
000234  e1a00006          MOV      r0,r6
000238  ebfffffe          BL       OSTaskStkChk
00023c  e1a05000          MOV      r5,r0
;;;1472           if (err == OS_ERR_NONE) {
000240  e3550000          CMP      r5,#0
000244  1a00000b          BNE      |L1.632|
;;;1473               ptcb = OSTCBPrioTbl[prio];
000248  e59f0340          LDR      r0,|L1.1424|
00024c  e7904106          LDR      r4,[r0,r6,LSL #2]
;;;1474               if (ptcb != (OS_TCB *)0) {                               /* Make sure task 'ptcb' is ...   */
000250  e3540000          CMP      r4,#0
000254  0a000007          BEQ      |L1.632|
;;;1475                   if (ptcb != (OS_TCB *)1) {                           /* ... still valid.               */
000258  e3540001          CMP      r4,#1
00025c  0a000005          BEQ      |L1.632|
;;;1476   #if OS_TASK_PROFILE_EN > 0
;;;1477                       #if OS_STK_GROWTH == 1
;;;1478                       ptcb->OSTCBStkBase = ptcb->OSTCBStkBottom + ptcb->OSTCBStkSize;
000260  e2841008          ADD      r1,r4,#8
000264  e8910003          LDM      r1,{r0,r1}
000268  e0800101          ADD      r0,r0,r1,LSL #2
00026c  e5840040          STR      r0,[r4,#0x40]
;;;1479                       #else
;;;1480                       ptcb->OSTCBStkBase = ptcb->OSTCBStkBottom - ptcb->OSTCBStkSize;
;;;1481                       #endif
;;;1482                       ptcb->OSTCBStkUsed = stk_data.OSUsed;            /* Store the number of bytes used */
000270  e59d0004          LDR      r0,[sp,#4]
000274  e5840044          STR      r0,[r4,#0x44]
                  |L1.632|
000278  e2860001          ADD      r0,r6,#1
00027c  e20060ff          AND      r6,r0,#0xff
                  |L1.640|
000280  e356001f          CMP      r6,#0x1f
000284  daffffe9          BLE      |L1.560|
;;;1483   #endif
;;;1484                   }
;;;1485               }
;;;1486           }
;;;1487       }
;;;1488   }
000288  e8bd407c          POP      {r2-r6,lr}
00028c  e12fff1e          BX       lr
                          ENDP

                  OS_TaskStat PROC
;;;1407   void  OS_TaskStat (void *p_arg)
;;;1408   {
000290  e92d41f0          PUSH     {r4-r8,lr}
;;;1409       INT32U     run;
;;;1410       INT32U     max;
;;;1411       INT8S      usage;
;;;1412   #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;1413       OS_CPU_SR  cpu_sr = 0;
000294  e3a07000          MOV      r7,#0
;;;1414   #endif
;;;1415   
;;;1416   
;;;1417   
;;;1418       p_arg = p_arg;                               /* Prevent compiler warning for not using 'parg'      */
000298  e1a00000          MOV      r0,r0
;;;1419       while (OSStatRdy == OS_FALSE) {
00029c  ea000001          B        |L1.680|
                  |L1.672|
;;;1420           OSTimeDly(2 * OS_TICKS_PER_SEC / 10);    /* Wait until statistic task is ready                 */
0002a0  e3a000c8          MOV      r0,#0xc8
0002a4  ebfffffe          BL       OSTimeDly
                  |L1.680|
0002a8  e59f02e4          LDR      r0,|L1.1428|
0002ac  e5d00000          LDRB     r0,[r0,#0]  ; OSStatRdy
0002b0  e3500000          CMP      r0,#0
0002b4  0afffff9          BEQ      |L1.672|
;;;1421       }
;;;1422       max = OSIdleCtrMax / 100L;
0002b8  e3a01064          MOV      r1,#0x64
0002bc  e59f02d4          LDR      r0,|L1.1432|
0002c0  e5900000          LDR      r0,[r0,#0]  ; OSIdleCtrMax
0002c4  ebfffffe          BL       __aeabi_uidivmod
0002c8  e1a05000          MOV      r5,r0
;;;1423       for (;;) {
0002cc  e1a00000          MOV      r0,r0
                  |L1.720|
;;;1424           OS_ENTER_CRITICAL();
0002d0  ebfffffe          BL       OS_CPU_SR_Save
0002d4  e1a07000          MOV      r7,r0
;;;1425           OSIdleCtrRun = OSIdleCtr;                /* Obtain the of the idle counter for the past second */
0002d8  e59f02bc          LDR      r0,|L1.1436|
0002dc  e5900000          LDR      r0,[r0,#0]  ; OSIdleCtr
0002e0  e59f12b8          LDR      r1,|L1.1440|
0002e4  e5810000          STR      r0,[r1,#0]  ; OSIdleCtrRun
;;;1426           run          = OSIdleCtr;
0002e8  e59f02ac          LDR      r0,|L1.1436|
0002ec  e5904000          LDR      r4,[r0,#0]  ; OSIdleCtr
;;;1427           OSIdleCtr    = 0L;                       /* Reset the idle counter for the next second         */
0002f0  e3a00000          MOV      r0,#0
0002f4  e59f12a0          LDR      r1,|L1.1436|
0002f8  e5810000          STR      r0,[r1,#0]  ; OSIdleCtr
;;;1428           OS_EXIT_CRITICAL();
0002fc  e1a00007          MOV      r0,r7
000300  ebfffffe          BL       OS_CPU_SR_Restore
;;;1429           if (max > 0L) {
000304  e3550000          CMP      r5,#0
000308  0a00000e          BEQ      |L1.840|
;;;1430               usage = (INT8S)(100L - run / max);
00030c  e1a01005          MOV      r1,r5
000310  e1a00004          MOV      r0,r4
000314  ebfffffe          BL       __aeabi_uidivmod
000318  e2600064          RSB      r0,r0,#0x64
00031c  e1a06c00          LSL      r6,r0,#24
000320  e1a06c46          ASR      r6,r6,#24
;;;1431               if (usage >= 0) {                    /* Make sure we don't have a negative percentage      */
000324  e3560000          CMP      r6,#0
000328  ba000002          BLT      |L1.824|
;;;1432                   OSCPUUsage = usage;
00032c  e59f0270          LDR      r0,|L1.1444|
000330  e5c06000          STRB     r6,[r0,#0]  ; OSCPUUsage
000334  ea00000b          B        |L1.872|
                  |L1.824|
;;;1433               } else {
;;;1434                   OSCPUUsage = 0;
000338  e3a00000          MOV      r0,#0
00033c  e59f1260          LDR      r1,|L1.1444|
000340  e5c10000          STRB     r0,[r1,#0]  ; OSCPUUsage
000344  ea000007          B        |L1.872|
                  |L1.840|
;;;1435               }
;;;1436           } else {
;;;1437               OSCPUUsage = 0;
000348  e3a00000          MOV      r0,#0
00034c  e59f1250          LDR      r1,|L1.1444|
000350  e5c10000          STRB     r0,[r1,#0]  ; OSCPUUsage
;;;1438               max        = OSIdleCtrMax / 100L;
000354  e3a01064          MOV      r1,#0x64
000358  e59f0238          LDR      r0,|L1.1432|
00035c  e5900000          LDR      r0,[r0,#0]  ; OSIdleCtrMax
000360  ebfffffe          BL       __aeabi_uidivmod
000364  e1a05000          MOV      r5,r0
                  |L1.872|
;;;1439           }
;;;1440           OSTaskStatHook();                        /* Invoke user definable hook                         */
000368  ebfffffe          BL       OSTaskStatHook
;;;1441   #if (OS_TASK_STAT_STK_CHK_EN > 0) && (OS_TASK_CREATE_EXT_EN > 0)
;;;1442           OS_TaskStatStkChk();                     /* Check the stacks for each task                     */
00036c  ebfffffe          BL       OS_TaskStatStkChk
;;;1443   #endif
;;;1444           OSTimeDly(OS_TICKS_PER_SEC / 10);        /* Accumulate OSIdleCtr for the next 1/10 second      */
000370  e3a00064          MOV      r0,#0x64
000374  ebfffffe          BL       OSTimeDly
000378  eaffffd4          B        |L1.720|
;;;1445       }
;;;1446   }
                          ENDP

                  OS_InitTaskStat PROC
;;;1036   static  void  OS_InitTaskStat (void)
;;;1037   {
00037c  e52de004          PUSH     {lr}
000380  e24dd01c          SUB      sp,sp,#0x1c
;;;1038   #if OS_TASK_NAME_SIZE > 7
;;;1039       INT8U  err;
;;;1040   #endif
;;;1041   
;;;1042   
;;;1043   #if OS_TASK_CREATE_EXT_EN > 0
;;;1044       #if OS_STK_GROWTH == 1
;;;1045       (void)OSTaskCreateExt(OS_TaskStat,
000384  e3a03003          MOV      r3,#3
000388  e3a02000          MOV      r2,#0
00038c  e3a01080          MOV      r1,#0x80
000390  e59f0210          LDR      r0,|L1.1448|
000394  e98d000f          STMIB    sp,{r0-r3}
000398  e59f320c          LDR      r3,|L1.1452|
00039c  e58d3000          STR      r3,[sp,#0]
0003a0  e3a0301e          MOV      r3,#0x1e
0003a4  e2802f7f          ADD      r2,r0,#0x1fc
0003a8  e3a01000          MOV      r1,#0
0003ac  e24f0f49          ADR      r0,OS_TaskStat
0003b0  ebfffffe          BL       OSTaskCreateExt
;;;1046                             (void *)0,                                   /* No args passed to OS_TaskStat()*/
;;;1047                             &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],   /* Set Top-Of-Stack               */
;;;1048                             OS_TASK_STAT_PRIO,                           /* One higher than the idle task  */
;;;1049                             OS_TASK_STAT_ID,
;;;1050                             &OSTaskStatStk[0],                           /* Set Bottom-Of-Stack            */
;;;1051                             OS_TASK_STAT_STK_SIZE,
;;;1052                             (void *)0,                                   /* No TCB extension               */
;;;1053                             OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  /* Enable stack checking + clear  */
;;;1054       #else
;;;1055       (void)OSTaskCreateExt(OS_TaskStat,
;;;1056                             (void *)0,                                   /* No args passed to OS_TaskStat()*/
;;;1057                             &OSTaskStatStk[0],                           /* Set Top-Of-Stack               */
;;;1058                             OS_TASK_STAT_PRIO,                           /* One higher than the idle task  */
;;;1059                             OS_TASK_STAT_ID,
;;;1060                             &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],   /* Set Bottom-Of-Stack            */
;;;1061                             OS_TASK_STAT_STK_SIZE,
;;;1062                             (void *)0,                                   /* No TCB extension               */
;;;1063                             OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  /* Enable stack checking + clear  */
;;;1064       #endif
;;;1065   #else
;;;1066       #if OS_STK_GROWTH == 1
;;;1067       (void)OSTaskCreate(OS_TaskStat,
;;;1068                          (void *)0,                                      /* No args passed to OS_TaskStat()*/
;;;1069                          &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],      /* Set Top-Of-Stack               */
;;;1070                          OS_TASK_STAT_PRIO);                             /* One higher than the idle task  */
;;;1071       #else
;;;1072       (void)OSTaskCreate(OS_TaskStat,
;;;1073                          (void *)0,                                      /* No args passed to OS_TaskStat()*/
;;;1074                          &OSTaskStatStk[0],                              /* Set Top-Of-Stack               */
;;;1075                          OS_TASK_STAT_PRIO);                             /* One higher than the idle task  */
;;;1076       #endif
;;;1077   #endif
;;;1078   
;;;1079   #if OS_TASK_NAME_SIZE > 14
;;;1080       OSTaskNameSet(OS_TASK_STAT_PRIO, (INT8U *)"uC/OS-II Stat", &err);
0003b4  e28d2018          ADD      r2,sp,#0x18
0003b8  e28f1e1f          ADR      r1,|L1.1456|
0003bc  e3a0001e          MOV      r0,#0x1e
0003c0  ebfffffe          BL       OSTaskNameSet
;;;1081   #else
;;;1082   #if OS_TASK_NAME_SIZE > 7
;;;1083       OSTaskNameSet(OS_TASK_STAT_PRIO, (INT8U *)"OS-Stat", &err);
;;;1084   #endif
;;;1085   #endif
;;;1086   }
0003c4  e28dd01c          ADD      sp,sp,#0x1c
0003c8  e49de004          POP      {lr}
0003cc  e12fff1e          BX       lr
                          ENDP

                  OS_TaskIdle PROC
;;;1365   void  OS_TaskIdle (void *p_arg)
;;;1366   {
0003d0  e92d4010          PUSH     {r4,lr}
;;;1367   #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;1368       OS_CPU_SR  cpu_sr = 0;
0003d4  e3a04000          MOV      r4,#0
;;;1369   #endif
;;;1370   
;;;1371   
;;;1372   
;;;1373       (void)p_arg;                                 /* Prevent compiler warning for not using 'parg'      */
;;;1374       for (;;) {
0003d8  e1a00000          MOV      r0,r0
                  |L1.988|
;;;1375           OS_ENTER_CRITICAL();
0003dc  ebfffffe          BL       OS_CPU_SR_Save
0003e0  e1a04000          MOV      r4,r0
;;;1376           OSIdleCtr++;
0003e4  e59f01b0          LDR      r0,|L1.1436|
0003e8  e5900000          LDR      r0,[r0,#0]  ; OSIdleCtr
0003ec  e2800001          ADD      r0,r0,#1
0003f0  e59f11a4          LDR      r1,|L1.1436|
0003f4  e5810000          STR      r0,[r1,#0]  ; OSIdleCtr
;;;1377           OS_EXIT_CRITICAL();
0003f8  e1a00004          MOV      r0,r4
0003fc  ebfffffe          BL       OS_CPU_SR_Restore
;;;1378           OSTaskIdleHook();                        /* Call user definable HOOK                           */
000400  ebfffffe          BL       OSTaskIdleHook
000404  eafffff4          B        |L1.988|
;;;1379       }

⌨️ 快捷键说明

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