📄 os_cpu_c.c
字号:
{
ptcb = ptcb; /* Prevent Compiler warning */
}
#endif
/*
*********************************************************************************************************
* TICK HOOK
*
* Description: This function is called every tick.
*
* Arguments : none
*
* Note(s) : 1) Interrupts may or may not be ENABLED during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0
void OSTimeTickHook (void)
{
}
#endif
/********************************************************************************************************
; SAVE THE CCR AND DISABLE INTERRUPTS
; &
; RESTORE CCR
;
; Description : These function implements OS_CRITICAL_METHOD #3
;
; Arguments : The function prototypes for the two functions are:
; 1) OS_CPU_SR OSCPUSaveSR(void)
; where OS_CPU_SR is the contents of the CCR register prior to disabling
; interrupts.
; 2) void OSCPURestoreSR(OS_CPU_SR os_cpu_sr);
; 'os_cpu_sr' the the value of the CCR to restore.
;
; Note(s) : 1) It's assumed that the compiler uses the B register to pass a single 8-bit argument
; to and from an assembly language function.
;********************************************************************************************************/
void OSCPUSaveSR(OS_CPU_SR os_cpu_sr)
{
__asm
{
tpa // copy the value of CCR to the register A
staa os_cpu_sr
sei // Disable interrupts
}
}
void OSCPURestoreSR(OS_CPU_SR os_cpu_sr)
{
__asm
{
ldaa os_cpu_sr
tap // A contains the CCR value to restore, move to CCR
}
}
/*********************************************************************************************************
;********************************************************************************************************
; START HIGHEST PRIORITY TASK READY-TO-RUN
;
; Description : This function is called by OSStart() to start the highest priority task that was created
; by your application before calling OSStart().
;
; Arguments : none
;
; Note(s) : 1) The stack frame is assumed to look as follows:
;
; OSTCBHighRdy->OSTCBStkPtr + 0 --> PPAGE
; + 1 CCR
; + 2 B
; + 3 A
; + 4 X (H)
; + 5 X (L)
; + 6 Y (H)
; + 7 Y (L)
; + 8 PC(H)
; + 9 PC(L)
;
; 2) OSStartHighRdy() MUST:
; a) Call OSTaskSwHook() then,
; b) Set OSRunning to TRUE,
; c) Switch to the highest priority task by loading the stack pointer of the
; highest priority task into the SP register and execute an RTI instruction.
;********************************************************************************************************
;********************************************************************************************************/
#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC
void OSStartHighRdy(void)
{
#if OS_CPU_HOOKS_EN > 0
OSTaskSwHook(); /* 4~, Invoke user defined context switch hook */
#endif
__asm{
inc OSRunning ;2~, Indicate that we are multitasking
ldx OSTCBHighRdy ;3~, Point to TCB of highest priority task ready to run
lds 0,x ;3~, Load SP into 68HC12
}
}
/********************************************************************************************************
;********************************************************************************************************
; TASK LEVEL CONTEXT SWITCH
;
; Description : This function is called when a task makes a higher priority task ready-to-run.
;
; Arguments : none
;
; Note(s) : 1) Upon entry,
; OSTCBCur points to the OS_TCB of the task to suspend
; OSTCBHighRdy points to the OS_TCB of the task to resume
;
; 2) The stack frame of the task to suspend looks as follows:
;
; SP + 0 --> PPAGE
; + 1 CCR
; + 2 B
; + 3 A
; + 4 X (H)
; + 5 X (L)
; + 6 Y (H)
; + 7 Y (L)
; + 8 PC(H)
; + 9 PC(L)
;
; 3) The stack frame of the task to resume looks as follows:
;
; OSTCBHighRdy->OSTCBStkPtr + 0 --> PPAGE
; + 1 CCR
; + 2 B
; + 3 A
; + 4 X (H)
; + 5 X (L)
; + 6 Y (H)
; + 7 Y (L)
; + 8 PC(H)
; + 9 PC(L)
;********************************************************************************************************
;*********************************************************************************************************/
#pragma TRAP_PROC
void OSCtxSw(void)
{
__asm{
ldx OSTCBCur ; 3~, OSTCBCur->OSTCBStkPtr = Stack Pointer
sts 0,x ; 3~
}
#if OS_CPU_HOOKS_EN > 0
OSTaskSwHook(); /* 4~, Invoke user defined context switch hook */
#endif
__asm{
ldx OSTCBHighRdy ; 3~, OSTCBCur = OSTCBHighRdy
stx OSTCBCur ; 3~
ldab OSPrioHighRdy ; 3~, OSPrioCur = OSPrioHighRdy
stab OSPrioCur ; 3~
lds 0,x ; 3~, Load SP into 68HC12
}
}
/********************************************************************************************************
;********************************************************************************************************
; INTERRUPT LEVEL CONTEXT SWITCH
;
; Description : This function is called by OSIntExit() to perform a context switch to a task that has
; been made ready-to-run by an ISR.
;
; Arguments : none
;********************************************************************************************************
;********************************************************************************************************/
#pragma TRAP_PROC
void OSIntCtxSw(void)
{
#if OS_CPU_HOOKS_EN > 0
OSTaskSwHook(); /* 4~, Invoke user defined context switch hook */
#endif
__asm{
ldx OSTCBHighRdy ; 3~, OSTCBCur = OSTCBHighRdy
stx OSTCBCur ; 3~
ldab OSPrioHighRdy ; 3~, OSPrioCur = OSPrioHighRdy
stab OSPrioCur ; 3~
lds 0,x ; 3~, Load SP into 68HC12
}
}
/*********************************************************************************************************
;********************************************************************************************************
; SYSTEM TICK ISR
;
; Description : This function is the ISR used to notify uC/OS-II that a system tick has occurred. You
; must setup the 68HC12's interrupt vector table so that an OUTPUT COMPARE interrupt
; vectors to this function.
;
; Arguments : none
;
; Notes : 1) The 'tick ISR' assumes the we are using the Output Compare specified by OS_TICK_OC
; (see OS_CFG.H and this file) to generate a tick that occurs every OS_TICK_OC_CNTS
; (see OS_CFG.H and this file) which corresponds to the number of FRT (Free Running
; Timer) counts to the next interrupt.
;
; 2) You must specify which output compare will be used by the tick ISR as follows:
; Set OS_TICK_OC in OS_CFG.H (AND in this file) to 0 to use OUTPUT COMPARE #0
; Set OS_TICK_OC in OS_CFG.H (AND in this file) to 1 to use OUTPUT COMPARE #1
; Set OS_TICK_OC in OS_CFG.H (AND in this file) to 2 to use OUTPUT COMPARE #2
; Set OS_TICK_OC in OS_CFG.H (AND in this file) to 3 to use OUTPUT COMPARE #3
; Set OS_TICK_OC in OS_CFG.H (AND in this file) to 4 to use OUTPUT COMPARE #4
; Set OS_TICK_OC in OS_CFG.H (AND in this file) to 5 to use OUTPUT COMPARE #5
; Set OS_TICK_OC in OS_CFG.H (AND in this file) to 6 to use OUTPUT COMPARE #6
; Set OS_TICK_OC in OS_CFG.H (AND in this file) to 7 to use OUTPUT COMPARE #7
;
; 3) TFLG1, TC0 ... TC7 are defined in 6812dp256.h.
;********************************************************************************************************
;********************************************************************************************************/
#pragma TRAP_PROC
void OSTickISR(void)
{
OSIntEnter();
OS_SAVE_SP();
CRGFLG &= 0xEF; /*clear the interrupt flag*/
OSTimeTick(); /* 6~+, Call uC/OS-II's tick updating function */
OSIntExit(); /* 6~+, Notify uC/OS-II about end of ISR */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -