...
This function is called by OSTaskCreate
and OSTaskCreateExt
and is identical to the OSTaskStkInit
presented in section 14.01.01. You may recall that OSTaskStkInit
is called to initialize the stack frame of a task so that it looks as if an interrupt has just occurred and all of the processor integer registers were pushed onto it. Figure 15.2 (identical to Figure 14.3) shows what OSTaskStkInit
puts on the stack of the task being created. Note that the diagram doesnít show the stack frame of the code calling OSTaskStkInit
but rather, the stack frame of the task being created. Also, the stack frame only contains the contents of the integer registers, nothing about the floating point registers. Iíll discuss how we handle the FPU registers shortly.
Figure 15.2 Stack frame initialization with pdata passed on the stack.
For reference, Listing 15.3 shows the code for OSTaskStkInit
which is identical to the one shown in Chapter 14 (Listing 14.3).
OSFPInit()
OSFPInit
is called by OSInitHookEnd
when OSInit
is done initializing µC/OS-IIís internal structures (I will discuss OSInitHookEnd
later). OSFPInit
is basically used to initialize the floating-point context switching mechanism presented in this chapter. OSFPInit
assumes that you enabled µC/OS-IIís memory management functions (i.e., you must set OS_MEM_EN
to 1 in OS_CFG.H
). The code for OSFPInit
is shown in Listing 15.4.
...
Figure 15.3 shows the relationship between some of the data structures after OSTaskCreateHook
has executed.Figure 15.3 Initialized stack and FPU register storage.
OSTaskDelHook()
You may recall that OSTaskDelHook
is called by OSTaskDel
to extend the functionality of OSTaskDel
. Because we allocated a memory block to hold the contents of the floating-point registers when the task was created, we need to deallocate the block when the task is deleted. Listing 15.6 shows how this is accomplished by OSTaskDelHook
.
...
OSStartHighRdy() OSCtxSw() OSIntCtxSw() OSTickISR()
...
This port adds two functions called OSFPSave
and OSFPRestore
and are found in OS_CPU_A.ASM
. These functions are responsible for saving and restoring the contents of floating-point registers during a context switch, respectively.
...
Note that interrupts are disabled during OSIntCtxSw
and also during execution of OSTaskSwHook
.Figure 15.5 80x86 stack frames and FPU storage during an interrupt-level context switch.
OSTickISR()
As mentioned in section 15.03.05, Tick Rate, the tick rate of an RTOS should be set between 10 and 100Hz. On the PC, however, the ticker occurs every 54.93ms (18.20648Hz) and is obtained by a hardware timer that interrupts the CPU. Recall that I reprogrammed the tick rate to 200Hz because it was a multiple of 18.20648Hz. The ticker on the PC is assigned to vector 0x08 but µC/OS-II redefined it so that it vectors to OSTickISR
instead. Because of this, the PCís tick handler is saved [see PC.C, PC_DOSSaveReturn
] in vector 129 (0x81). To satisfy DOS, however, the PCís handler is called every 54.93ms. OSTickISR
for this port is identical to the OSTickISR
presented in section 14.05.04 and thus, there is no need to repeat the description here. I did, however, include the code in Listing 15.17 for your convenience.
...