📄 os_core.lst
字号:
831 1 INT8U i;
832 1 OS_TCB *ptcb1;
833 1 OS_TCB *ptcb2;
834 1
835 1
836 1 OSTCBList = (OS_TCB *)0; /* TCB Initialization
- */
837 1 for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) { /* Clear the priority table
- */
838 2 OSTCBPrioTbl[i] = (OS_TCB *)0;
839 2 }
840 1 ptcb1 = &OSTCBTbl[0];
841 1 ptcb2 = &OSTCBTbl[1];
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 */
C51 COMPILER V8.05a OS_CORE 04/18/2007 18:18:23 PAGE 16
867
868 void OS_Sched (void) LG_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 *os_pdata) LG_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 os_pdata = os_pdata; /* Prevent compiler warning for not using 'os_pdata
-' */
917 1 for (;;) {
918 2 OS_ENTER_CRITICAL();
919 2 OSIdleCtr++;
920 2 OS_EXIT_CRITICAL();
921 2 OSTaskIdleHook(); /* Call user definable HOOK */
922 2 }
923 1 }
924 /*$PAGE*/
925 /*
926 *********************************************************************************************************
927 * STATISTICS TASK
C51 COMPILER V8.05a OS_CORE 04/18/2007 18:18:23 PAGE 17
928 *
929 * Description: This task is internal to uC/OS-II and is used to compute some statistics about the
930 * multitasking environment. Specifically, OS_TaskStat() computes the CPU usage.
931 * CPU usage is determined by:
932 *
933 * OSIdleCtr
934 * OSCPUUsage = 100 * (1 - ------------) (units are in %)
935 * OSIdleCtrMax
936 *
937 * Arguments : os_pdata this pointer is not used at this time.
938 *
939 * Returns : none
940 *
941 * Notes : 1) This task runs at a priority level higher than the idle task. In fact, it runs at the
942 * next higher priority, OS_IDLE_PRIO-1.
943 * 2) You can disable this task by setting the configuration #define OS_TASK_STAT_EN to 0.
944 * 3) We delay for 5 seconds in the beginning to allow the system to reach steady state and
945 * have all other tasks created before we do statistics. You MUST have at least a delay
946 * of 2 seconds to allow for the system to establish the maximum value for the idle
947 * counter.
948 *********************************************************************************************************
949 */
950
951 #if OS_TASK_STAT_EN > 0
void OS_TaskStat (void *os_pdata) LG_REENTRANT
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT32U run;
INT32U max;
INT8S usage;
os_pdata = os_pdata; /* Prevent compiler warning for not using 'os_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;
}
OSTaskStatHook(); /* Invoke user definable hook */
OSTimeDly(OS_TICKS_PER_SEC); /* Accumulate OSIdleCtr for the next second */
}
}
#endif
C51 COMPILER V8.05a OS_CORE 04/18/2007 18:18:23 PAGE 18
989 /*$PAGE*/
990 /*
991 *********************************************************************************************************
992 * INITIALIZE TCB
993 *
994 * Description: This function is internal to uC/OS-II and is used to initialize a Task Control Block when
995 * a task is created (see OSTaskCreate() and OSTaskCreateExt()).
996 *
997 * Arguments : prio is the priority of the task being created
998 *
999 * ptos is a pointer to the task's top-of-stack assuming that the CPU registers
1000 * have been placed on the stack. Note that the top-of-stack corresponds to a
1001 * 'high' memory location is OS_STK_GROWTH is set to 1 and a 'low' memory
1002 * location if OS_STK_GROWTH is set to 0. Note that stack growth is CPU
1003 * specific.
1004 *
1005 * pbos is a pointer to the bottom of stack. A NULL pointer is passed if called by
1006 * 'OSTaskCreate()'.
1007 *
1008 * id is the task's ID (0..65535)
1009 *
1010 * stk_size is the size of the stack (in 'stack units'). If the stack units are INT8Us
1011 * then, 'stk_size' contains the number of bytes for the stack. If the stack
1012 * units are INT32Us then, the stack contains '4 * stk_size' bytes. The stack
1013 * units are established by the #define constant OS_STK which is CPU
1014 * specific. 'stk_size' is 0 if called by 'OSTaskCreate()'.
1015 *
1016 * pext is a pointer to a user supplied memory area that is used to extend the task
1017 * control block. This allows you to store the contents of floating-point
1018 * registers, MMU registers or anything else you could find useful during a
1019 * context switch. You can even assign a name to each task and store this name
1020 * in this TCB extension. A NULL pointer is passed if called by OSTaskCreate().
1021 *
1022 * opt options as passed to 'OSTaskCreateExt()' or,
1023 * 0 if called from 'OSTaskCreate()'.
1024 *
1025 * Returns : OS_NO_ERR if the call was successful
1026 * OS_NO_MORE_TCB if there are no more free TCBs to be allocated and thus, the task cannot
1027 * be created.
1028 *
1029 * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
1030 *********************************************************************************************************
1031 */
1032
1033 INT8U OS_TCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U
-opt) LG_REENTRANT
1034 {
1035 1 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
1038 1 OS_TCB *ptcb;
1039 1
1040 1
1041 1 OS_ENTER_CRITICAL();
1042 1 ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
1043 1 if (ptcb != (OS_TCB *)0) {
1044 2 OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
1045 2 OS_EXIT_CRITICAL();
1046 2 ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
1047 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -