📄 os_cpu_c.c
字号:
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* 6808 Specific code
*
* File : OS_CPU_C.C
* By : Kerby Suhre
*********************************************************************************************************
*/
#define OS_CPU_GLOBALS
#include "includes.h"
unsigned int *OSTaskStkInit (void (*task)(void *pd), void *pdata, unsigned int *ptos, INT16U opt)
{
INT16U *stk;
opt = opt;
pdata = pdata;
stk = (INT16U *)ptos;
*--stk = (INT16U)(task);
*--stk = (INT16U)(0x00);
*--stk = (INT16U)(0x00);
return ((void *)stk);
}
#if OS_CPU_HOOKS_EN
#if OS_VERSION > 203
void OSInitHookBegin (void)
{
}
#endif
#if OS_VERSION > 203
void OSInitHookEnd (void)
{
}
#endif
void OSTaskCreateHook (OS_TCB *ptcb)
{
ptcb = ptcb;
}
void OSTaskDelHook (OS_TCB *ptcb)
{
ptcb = ptcb;
}
void OSTaskSwHook (void)
{
}
void OSTaskStatHook (void)
{
}
#if OS_VERSION > 203
void OSTCBInitHook (OS_TCB *ptcb)
{
ptcb = ptcb;
}
#endif
void OSTimeTickHook (void)
{
}
#if OS_VERSION >= 205
void OSTaskIdleHook (void)
{
}
#endif
#endif
/****************************************************选择已经就绪的最高优先级任务运行******************************************
*******************************************************************************************************************************/
void OSStartHighRdy(void)
{
#if OS_CPU_HOOKS_EN > 0
OSTaskSwHook();//调用HOOK函数
#endif
asm
{
lda OSRunning //设置OSRunning变量,标志进入多任务模式
inca
sta OSRunning
ldx OSTCBHighRdy //取得最高优先级就绪任务TCB地址
stx OSTCBCur //保存到OSTCBCur中
pshx
ldx OSTCBHighRdy:1//保存地址的第二个字节
stx OSTCBCur:1
pulh
lda 0,X //载放就绪任务堆栈指针
psha
ldx 1,X //载入就绪任务堆栈指针第二个字节
pulh
txs
pulh //恢复索引寄存器内容
rti //中断返回,运行新任务
}
}
/******************************************中断级任务调度函数**********************************************************************
该函数为一个中断服务函数,由SWI中断产生
***********************************************************************************************************************************/
interrupt void OSCtxSw(void)
{
asm
{
tsx
pshx
pshh
ldx OSTCBCur
pshx
ldx OSTCBCur:1
pulh
pula
sta 0,x
pula
sta 1,x
};
#if OS_CPU_HOOKS_EN > 0
OSTaskSwHook(); //调用HOOK
#endif
asm
{
lda OSPrioHighRdy
sta OSPrioCur
ldx OSTCBHighRdy
stx OSTCBCur
pshx
ldx OSTCBHighRdy:1
stx OSTCBCur:1
pulh
lda 0,x
psha
ldx 1,x
pulh
txs
}
}
/*****************************************************时钟节拍中断服务程序*********************************************************
*********************************************************************************************************************************/
interrupt void OSTickISR(void)
{
TBCR_TACK=1;//清适时中断标志
OSIntEnter(); /*标志进入中断*/
if(OSIntNesting==1) //保存堆栈指针
{
asm
{
tsx
pshx
pshh
ldx OSTCBCur
pshx
ldx OSTCBCur:1
pulh
pula
sta 0,x
pula
sta 1,x
};
};
OSTimeTick(); /*调用时钟节拍函数*/
OSIntExit();/*标志退出中断*/
}
/************************************************************中断级任务切换函数*******************************************************
*************************************************************************************************************************************/
void OSIntCtxSw(void)
{
#if OS_CPU_HOOKS_EN > 0
OSTaskSwHook();
#endif
asm
{
lda OSPrioHighRdy
sta OSPrioCur
ldx OSTCBHighRdy
stx OSTCBCur
pshx
ldx OSTCBHighRdy:1
stx OSTCBCur:1
pulh
lda 0,x
psha
ldx 1,x
pulh
txs
pulh
rti
}
}
/*********************************************************************************************************************************
用户自定义的中断服务程序的结构形式如下,在其中插入用户自定义的代码后,将函数添入中断向量表的相应位置即可
**********************************************************************************************************************************/
interrupt void USER_ISR(void)
{
OSIntEnter(); /*标志进入中断*/
if(OSIntNesting==1) //保存堆栈指针
{
asm
{
tsx
pshx
pshh
ldx OSTCBCur
pshx
ldx OSTCBCur:1
pulh
pula
sta 0,x
pula
sta 1,x
};
};
//=====================插入用户自定义代码===================================
//===========================================================================
OSIntExit();/*标志退出中断*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -