📄 os_cpu_a.c
字号:
#include "includes.h"
extern OS_TCB *OSTCBHighRdy;
extern OS_TCB *OSTCBCur;
extern BOOLEAN OSRunning;
OS_STK* SP_TMP = 0;//最好用os_cpu_a.s (优化过了)
/*
OSStartHighRdy 完成的任务:
1) 调用用户的OSTaskSwHook
2) 将OSRunning置有效
3) 将优先级最高的任务的SP切换为当前堆栈
4) 执行新的任务
*/
void OSStartHighRdy(void)
{
#if OS_CPU_HOOKS_EN > 0
OSTaskSwHook();
#endif
OSRunning = 1;
//get new task's stack pointer
SP_TMP = OSTCBHighRdy->OSTCBStkPtr;
asm (" xld.w %r4,SP_TMP");
asm (" xld.w %r4,[%r4]");
asm (" ld.w %sp,%r4");
//Restore all the registers
asm (" popn %r1 ");
asm (" ld.w %ahr, %r0 ");
asm (" ld.w %alr, %r1 ");
asm (" popn %r14 ");
asm (" reti ");
}
/*
任务切换(任务级)
完成以下操作:
1) 保存当前任务上下文
2) 设置优先级最高的任务为当前任务
3) 设置SP为优先级最高的任务的堆栈地址
4) 中断返回,执行新任务
*/
__attribute__ ((interrupt_handler))
void OSCtxSw(void)
{
//store sp in preempted tasks's TCB
asm (" xld.w %r4,SP_TMP");
asm (" ld.w %r5,%sp ");
asm (" xld.w [%r4],%r5 ");
OSTCBCur -> OSTCBStkPtr = SP_TMP;
#if OS_CPU_HOOKS_EN > 0
OSTaskSwHook();
#endif
OSTCBCur = OSTCBHighRdy;
OSPrioCur = OSPrioHighRdy;
//get new task's stack pointer
SP_TMP = OSTCBHighRdy->OSTCBStkPtr;
asm (" xld.w %r4,SP_TMP");
asm (" xld.w %r4,[%r4]");
asm (" ld.w %sp,%r4");
}
void OSIntCtxSw(void)
{
#if OS_CPU_HOOKS_EN > 0
OSTaskSwHook();
#endif
OSTCBCur = OSTCBHighRdy;
OSPrioCur = OSPrioHighRdy;
//get new task's stack pointer
SP_TMP = OSTCBHighRdy->OSTCBStkPtr;
asm (" xld.w %r4,SP_TMP");
asm (" xld.w %r4,[%r4]");
asm (" ld.w %sp,%r4");
//Restore all the registers
asm (" popn %r1 ");
asm (" ld.w %ahr, %r0 ");
asm (" ld.w %alr, %r1 ");
asm (" popn %r14 ");
asm (" reti ");
}
/*
系统时钟中断服务程序
*/
__attribute__ ((interrupt_handler))
void OnTickISR(void)
{
OSIntEnter();
if( OSIntNesting == 1 )
{
//store sp in preempted tasks's TCB
asm (" xld.w %r0,SP_TMP");
asm (" ld.w %r1,%sp ");
asm (" xld.w [%r0],%r1 ");
OSTCBCur -> OSTCBStkPtr = SP_TMP;
}
//clear 8bit timer4 factor flag
*(volatile unsigned char*)0x40288 |=0x01;
//reset 8bit timer4
*(volatile unsigned char*)0x40174 |=0x02;
OSTimeTick();
OSIntExit();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -