?? os_core.lst
字號:
838 2 OSTCBPrioTbl[i] = (OS_TCB *)0;
839 2 }
840 1 ptcb1 = &OSTCBTbl[0];
842 1 for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) { /* Init. list of free TCBs
- */
843 2 ptcb1->OSTCBNext = ptcb2;
844 2 ptcb1++;
845 2 ptcb2++;
846 2 }
847 1 ptcb1->OSTCBNext = (OS_TCB *)0; /* Last OS_TCB
- */
848 1 OSTCBFreeList = &OSTCBTbl[0];
849 1 }
850 /*$PAGE*/
851 /*
852 *********************************************************************************************************
853 * SCHEDULER
854 *
855 * Description: This function is called by other uC/OS-II services to determine whether a new, high
856 * priority task has been made ready to run. This function is invoked by TASK level code
857 * and is not used to reschedule tasks from ISRs (see OSIntExit() for ISR rescheduling).
858 *
859 * Arguments : none
860 *
861 * Returns : none
862 *
863 * Notes : 1) This function is INTERNAL to uC/OS-II and your application should not call it.
864 * 2) Rescheduling is prevented when the scheduler is locked (see OS_SchedLock())
865 *********************************************************************************************************
866 */
867
C51 COMPILER V7.20 OS_CORE 09/25/2006 10:08:38 PAGE 16
868 void OS_Sched (void) reentrant
869 {
870 1 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
873 1 INT8U y;
874 1
875 1
876 1 OS_ENTER_CRITICAL();
877 1 if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Sched. only if all ISRs done & not locked */
878 2 y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to HPT ready to run */
879 2 OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
880 2 if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
881 3 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
882 3 OSCtxSwCtr++; /* Increment context switch counter */
883 3 OS_TASK_SW(); /* Perform a context switch */
884 3 }
885 2 }
886 1 OS_EXIT_CRITICAL();
887 1 }
888 /*$PAGE*/
889 /*
890 *********************************************************************************************************
891 * IDLE TASK
892 *
893 * Description: This task is internal to uC/OS-II and executes whenever no other higher priority tasks
894 * executes because they are ALL waiting for event(s) to occur.
895 *
896 * Arguments : none
897 *
898 * Returns : none
899 *
900 * Note(s) : 1) OSTaskIdleHook() is called after the critical section to ensure that interrupts will be
901 * enabled for at least a few instructions. On some processors (ex. Philips XA), enabling
902 * and then disabling interrupts didn't allow the processor enough time to have interrupts
903 * enabled before they were disabled again. uC/OS-II would thus never recognize
904 * interrupts.
905 * 2) This hook has been added to allow you to do such things as STOP the CPU to conserve
906 * power.
907 *********************************************************************************************************
908 */
909
910 void OS_TaskIdle (void *ppdata) reentrant
911 {
912 1 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
915 1
916 1
917 1 ppdata = ppdata; /* Prevent compiler warning for not using 'pdata' *
-/
918 1 for (;;) {
919 2 OS_ENTER_CRITICAL();
920 2 OSIdleCtr++;
921 2 OS_EXIT_CRITICAL();
922 2
923 2 #if OS_CPU_HOOKS_EN
OSTaskIdleHook(); /* Call user definable HOOK */
#endif
926 2 }
927 1 }
928 /*$PAGE*/
C51 COMPILER V7.20 OS_CORE 09/25/2006 10:08:38 PAGE 17
929 /*
930 *********************************************************************************************************
931 * STATISTICS TASK
932 *
933 * Description: This task is internal to uC/OS-II and is used to compute some statistics about the
934 * multitasking environment. Specifically, OS_TaskStat() computes the CPU usage.
935 * CPU usage is determined by:
936 *
937 * OSIdleCtr
938 * OSCPUUsage = 100 * (1 - ------------) (units are in %)
939 * OSIdleCtrMax
940 *
941 * Arguments : pdata this pointer is not used at this time.
942 *
943 * Returns : none
944 *
945 * Notes : 1) This task runs at a priority level higher than the idle task. In fact, it runs at the
946 * next higher priority, OS_IDLE_PRIO-1.
947 * 2) You can disable this task by setting the configuration #define OS_TASK_STAT_EN to 0.
948 * 3) We delay for 5 seconds in the beginning to allow the system to reach steady state and
949 * have all other tasks created before we do statistics. You MUST have at least a delay
950 * of 2 seconds to allow for the system to establish the maximum value for the idle
951 * counter.
952 *********************************************************************************************************
953 */
954
955 #if OS_TASK_STAT_EN > 0
void OS_TaskStat (void *ppdata) reentrant
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT32U run;
INT32U max;
INT8S usage;
ppdata = ppdata; /* Prevent compiler warning for not using 'pdata' *
-/
while (OSStatRdy == FALSE) {
OSTimeDly(2 * OS_TICKS_PER_SEC); /* Wait until statistic task is ready */
}
max = OSIdleCtrMax / 100L;
for (;;) {
OS_ENTER_CRITICAL();
OSIdleCtrRun = OSIdleCtr; /* Obtain the of the idle counter for the past second */
run = OSIdleCtr;
OSIdleCtr = 0L; /* Reset the idle counter for the next second */
OS_EXIT_CRITICAL();
if (max > 0L) {
usage = (INT8S)(100L - run / max);
if (usage >= 0) { /* Make sure we don't have a negative percentage */
OSCPUUsage = usage;
} else {
OSCPUUsage = 0;
}
} else {
OSCPUUsage = 0;
max = OSIdleCtrMax / 100L;
}
#if OS_CPU_HOOKS_EN
C51 COMPILER V7.20 OS_CORE 09/25/2006 10:08:38 PAGE 18
OSTaskStatHook(); /* Invoke user definable hook */
#endif
OSTimeDly(OS_TICKS_PER_SEC); /* Accumulate OSIdleCtr for the next second */
}
}
#endif
997 /*$PAGE*/
998 /*
999 *********************************************************************************************************
1000 * INITIALIZE TCB
1001 *
1002 * Description: This function is internal to uC/OS-II and is used to initialize a Task Control Block when
1003 * a task is created (see OSTaskCreate() and OSTaskCreateExt()).
1004 *
1005 * Arguments : prio is the priority of the task being created
1006 *
1007 * ptos is a pointer to the task's top-of-stack assuming that the CPU registers
1008 * have been placed on the stack. Note that the top-of-stack corresponds to a
1009 * 'high' memory location is OS_STK_GROWTH is set to 1 and a 'low' memory
1010 * location if OS_STK_GROWTH is set to 0. Note that stack growth is CPU
1011 * specific.
1012 *
1013 * pbos is a pointer to the bottom of stack. A NULL pointer is passed if called by
1014 * 'OSTaskCreate()'.
1015 *
1016 * id is the task's ID (0..65535)
1017 *
1018 * stk_size is the size of the stack (in 'stack units'). If the stack units are INT8Us
1019 * then, 'stk_size' contains the number of bytes for the stack. If the stack
1020 * units are INT32Us then, the stack contains '4 * stk_size' bytes. The stack
1021 * units are established by the #define constant OS_STK which is CPU
1022 * specific. 'stk_size' is 0 if called by 'OSTaskCreate()'.
1023 *
1024 * pext is a pointer to a user supplied memory area that is used to extend the task
1025 * control block. This allows you to store the contents of floating-point
1026 * registers, MMU registers or anything else you could find useful during a
1027 * context switch. You can even assign a name to each task and store this name
1028 * in this TCB extension. A NULL pointer is passed if called by OSTaskCreate().
1029 *
1030 * opt options as passed to 'OSTaskCreateExt()' or,
1031 * 0 if called from 'OSTaskCreate()'.
1032 *
1033 * Returns : OS_NO_ERR if the call was successful
1034 * OS_NO_MORE_TCB if there are no more free TCBs to be allocated and thus, the task cannot
1035 * be created.
1036 *
1037 * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
1038 *********************************************************************************************************
1039 */
1040
1041 INT8U OS_TCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U
-opt) reentrant
1042 {
1043 1 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
1046 1 OS_TCB *ptcb;
1047 1
1048 1
1049 1 OS_ENTER_CRITICAL();
1050 1 ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
C51 COMPILER V7.20 OS_CORE 09/25/2006 10:08:38 PAGE 19
1051 1 if (ptcb != (OS_TCB *)0) {
1052 2 OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
1053 2 OS_EXIT_CRITICAL();
1054 2
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -