📄 mycore.c
字号:
INT16U opt )reentrant;
/**********************************用户要编写的系统函数**************************************************/
//-----------------------------------------------------------------------
//汇编语言编写
void OSCtxSw(void);
void OSIntCtxSw(void);
void OSStartHighRdy(void);
//-----------------------------------------------------------------------
//C语言编写
void OSTickISRHook(void);
void OSTCBSWHook(void);
void OSTaskSwHook(void);
void TimeTickConfig(void); //* initial timetick USE TIMER0
//-----------------------------------------------------------------------
void OSTaskCreateHook(OS_TCB *ptcb)reentrant;
#if OS_TASK_DEL_EN
void OSTaskDelHook(OS_TCB *ptcb)reentrant;
#endif
#if OS_TASK_STAT_EN
void OSTaskStatHook(void)reentrant;
#endif
void OSTimeTickHook(void)reentrant;
//-----------------------------------------------------------------------
/*******************************用户编写的中断服务程序**************************************************/
#if USE_Pre_ExternInt0
void ExternInt0(void);
#endif
#if USE_Pre_ExternInt1
void ExternInt1(void);
#endif
#if USE_Pre_TimeInt1
void Time1Int(void);
#endif
#if USE_Pre_SeryInt
void SeryInt(void);
#endif
/********************************用户自己添加的函数****************************************************/
void InitTimer1(void);
void InitSerial(void);
void SendCh(INT8U *chp );
/******************************************************************************************************/
/**************************************UCOS_II.H END***************************************************/
/*************************************CPU.C************************************************************/
OS_STK *OSTaskStkInit (void (*task)(void *pd)reentrant,
void *dataptr,
OS_STK *ptos,
INT16U opt) reentrant
{
OS_STK *stk;
dataptr = dataptr;
opt = opt; //opt没被用到,保留此语句防止告警产生
stk = (OS_STK *)ptos; //用户堆栈最低有效地址
*stk++ = 15; //用户堆栈长度
*stk++ = (INT16U)task & 0xFF; //任务地址低8位
*stk++ = (INT16U)task >> 8; //任务地址高8位
*stk++ = 0x00; //PSW
*stk++ = 0x0A; //ACC
*stk++ = 0x0B; //B
*stk++ = 0x00; //DPL
*stk++ = 0x00; //DPH
*stk++ = 0x00; //R0
*stk++ = 0x01; //R1
*stk++ = 0x02; //R2
*stk++ = 0x03; //R3
*stk++ = 0x04; //R4
*stk++ = 0x05; //R5
*stk++ = 0x06; //R6
*stk++ = 0x07; //R7
//不用保存SP,任务切换时根据用户堆栈长度计算得出。
return (ptos);
}
//-------------------------------------------------------------------
void TimeTickConfig(void)
{
TMOD=TMOD&0xF0;
TMOD=TMOD|0x01; //模式1(16位定时器),仅受TR0控制
TH0=0x70; //定义Tick=50次/秒(即0.02秒/次)
TL0=0x00; //OS_CPU_A.ASM 和 OS_TICKS_PER_SEC
ET0=1; //允许T0中断
TR0=1;
}
//-----------------------------------------------------------------------
void OSTaskSwHook (void)
{
OSTCBCur = OSTCBHighRdy;
OSPrioCur = OSPrioHighRdy;
}
//-----------------------------------------------------------------------
void OSTimeTickHook (void) reentrant
{
}
//-----------------------------------------------------------------------
void OSTaskCreateHook (OS_TCB *ptcb)reentrant
{
ptcb = ptcb;
}
//-----------------------------------------------------------------------
#if OS_TASK_STAT_EN
void OSTaskStatHook(void)reentrant
{
}
#endif
//-----------------------------------------------------------------------
//中断处理程序
//-----------------------------------------------------------------------
//=======================================================================
#if USE_Pre_ExternInt0
void ExternInt0(void)
{
}
#endif
//-----------------------------------------------------------------------
#if USE_Pre_ExternInt1
void ExternInt1(void)
{
}
#endif
//-----------------------------------------------------------------------
#if USE_Pre_TimeInt1
void Time1Int(void)
{
}
#endif
//-----------------------------------------------------------------------
#if USE_Pre_SeryInt
void SeryInt(void)
{
}
#endif
//=======================================================================
#if OS_CPU_HOOKS_EN
//--------------------------------------------
void OSInitHookBegin (void)
{
}
//--------------------------------------------
void OSInitHookEnd (void)
{
}
//--------------------------------------------
void OSTaskDelHook (OS_TCB *ptcb)
{
ptcb = ptcb;
}
//--------------------------------------------
void OSTCBInitHook (OS_TCB *ptcb)
{
ptcb = ptcb;
}
//--------------------------------------------
void OSRunningTrue(void)
{
OSRunning=TRUE;
}
#endif
/**************************************CPU.C END*******************************************************/
/******************************************************************************************************/
/***************************************TASK.C*********************************************************/
/**************************************OSDummy*********************************************************/
#if OS_TASK_DEL_EN
static void OSDummy (void)reentrant
{
}
#endif
/*******************************建立系统空闲任务*********************************************************/
INT8U OSTaskIdleCreate(void *dataptr){
void *psp;
INT8U err;
OS_STK *ptos;
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[OS_LOWEST_PRIO ] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */
OSTCBPrioTbl[OS_LOWEST_PRIO ] = (OS_TCB *)1; /* Reserve the priority to prevent others from doing ... */
/* ... the same thing until task is created. */
#if OS_CRITICAL_METHOD == 1
ptos=&OSTaskIdleStk[0];
#else
ptos=&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE-1];
#endif
OS_EXIT_CRITICAL();
psp = (void *)OSTaskStkInit(OSTaskIdle, dataptr, ptos, 0); /* Initialize the task's stack */
err = OSTCBInit(OS_LOWEST_PRIO, psp, (void *)0, 0, 0, (void *)0, 0);
if (err == OS_NO_ERR) {
OS_ENTER_CRITICAL();
OSTaskCtr++; /* Increment the #tasks counter */
OSTaskCreateHook(OSTCBPrioTbl[OS_LOWEST_PRIO]); /* Call user defined hook */
OS_EXIT_CRITICAL();
if (OSRunning) { /* Find highest priority task if multitasking has started */
OSSched();
}
} else {
OS_ENTER_CRITICAL();
OSTCBPrioTbl[OS_LOWEST_PRIO] = (OS_TCB *)0;/* Make this priority available to others */
OS_EXIT_CRITICAL();
}
return (err);
} else {
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
}
/*******************************建立系统统计任务*********************************************************/
#if OS_TASK_STAT_EN
INT8U OSTaskStatCreate(void *dataptr)
{
void *psp;
INT8U err;
OS_STK *ptos;
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[OS_LOWEST_PRIO-1 ] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */
OSTCBPrioTbl[OS_LOWEST_PRIO-1 ] = (OS_TCB *)1; /* Reserve the priority to prevent others from doing ... */
/* ... the same thing until task is created. */
#if OS_CRITICAL_METHOD == 1
ptos=&OSTaskStatStk[0];
#else
ptos=&OSTaskStatStk[OS_TASK_IDLE_STK_SIZE-1];
#endif
OS_EXIT_CRITICAL();
psp = (void *)OSTaskStkInit(OSTaskStat, dataptr, ptos, 0); /* Initialize the task's stack */
err = OSTCBInit(OS_LOWEST_PRIO-1, psp, (void *)0, 0, 0, (void *)0, 0);
if (err == OS_NO_ERR) {
OS_ENTER_CRITICAL();
OSTaskCtr++; /* Increment the #tasks counter */
OSTaskCreateHook(OSTCBPrioTbl[OS_LOWEST_PRIO-1]); /* Call user defined hook */
OS_EXIT_CRITICAL();
if (OSRunning) { /* Find highest priority task if multitasking has started */
OSSched();
}
} else {
OS_ENTER_CRITICAL();
OSTCBPrioTbl[OS_LOWEST_PRIO-1] = (OS_TCB *)0;/* Make this priority available to others */
OS_EXIT_CRITICAL();
}
return (err);
} else {
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
}
#endif
/***********************************OSTaskChangePrio***************************************************/
#if OS_TASK_CHANGE_PRIO_EN
INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)reentrant
{
OS_TCB *ptcb;
OS_EVENT *pevent;
INT8U x;
INT8U y;
INT8U bitx;
INT8U bity;
if ((oldprio >= OS_LOWEST_PRIO && oldprio != OS_PRIO_SELF) ||
newprio >= OS_LOWEST_PRIO) {
return (OS_PRIO_INVALID);
}
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) { /* New priority must not already exist */
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
} else {
OSTCBPrioTbl[newprio] = (OS_TCB *)1; /* Reserve the entry to prevent others */
OS_EXIT_CRITICAL();
y = newprio >> 3; /* Precompute to reduce INT. latency */
bity = OSMapTbl[y];
x = newprio & 0x07;
bitx = OSMapTbl[x];
OS_ENTER_CRITICAL();
if (oldprio == OS_PRIO_SELF) { /* See if changing self */
oldprio = OSTCBCur->OSTCBPrio; /* Yes, get priority */
}
if ((ptcb = OSTCBPrioTbl[oldprio]) != (OS_TCB *)0) { /* Task to change must exist */
OSTCBPrioTbl[oldprio] = (OS_TCB *)0; /* Remove TCB from old priority */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -