📄 os_cpu_c.c
字号:
/*********************************************************************************************************
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_OS_CPU_C
#include "CONFIG.h"
volatile uint8 Alarm=0;
void* OSTaskStackBottom[OS_MAX_TASKS + 2]; /* 任务栈底位置 */
/*********************************************************************************************************
** 函数名称: OSIdle
** 功能描述: 优先级最低的任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 徐宝田
** 日 期: 2002年12月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSIdle(void)
{
while(1)
{
#if EN_OS_IDLE > 0 /* CPU进入休眠状态 */
#endif
}
}
/*********************************************************************************************************
** 函数名称: OSInitHook
** 功能描述: 在开始多任务调度之前系统初始钩挂函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 徐宝田
** 日 期: 2002年12月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSInitHook(void)
{
//OSCCAL = 0xff ; //内部RC震荡校正字
}
/*********************************************************************************************************
** 函数名称: OSStart
** 功能描述: Small RTOS 初始化函数,调用此函数后多任务开始运行,首先执ID为0的任务
** 输 入: 无
** 输 出 : 无
** 全局变量: OSTsakStackBotton,SP
** 调用模块: 无
**
** 作 者: 徐宝田
** 日 期: 2005年5月22日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐宝田
** 日 期: 2002年6月2日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐宝田
** 日 期: 2002年6月9日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
extern uint8 __heap_start; /* 连接器定义的堆起始 */
uint8 * pdata_end = &__heap_start;
void OSStart(void)
{
uint8 * cp = (uint8*)RAMEND;
uint8 i,j;
OSTaskStackBottom[0] = (void*)RAMEND;
/* 初始化优先级最高的任务堆栈,使返回地址为任务开始地址 */
*cp-- = ((uint8*)(&TaskFuction[0]))[HIGH_BYTE];
*cp-- = ((uint8*)(&TaskFuction[0]))[LOW_BYTE];
cp = pdata_end ;
cp += 2 ;
/* 初始化优先级最低的任务堆栈 */
OSTaskStackBottom[OS_MAX_TASKS+1] = cp-1 ;
for(j=0;j<1;j++)
{
*cp++ = 0;
}
*cp++ = (uint8)((uint16)OSIdle/256) ;
OSTaskStackBottom[OS_MAX_TASKS] = cp;
*cp++ = (uint8)(uint16)OSIdle ;
/* 初始化其它优先级的任务堆栈 */
for(i = OS_MAX_TASKS - 1; i > 0; i--)
{
OSTaskStackBottom[i] = cp;
for(j=0;j<34;j++)
{
*cp++ = 0;
}
*cp++ = ((uint8*)(&TaskFuction[i]))[LOW_BYTE];
OSTaskStackBottom[i] = cp;
*cp++ = ((uint8*)(&TaskFuction[i]))[HIGH_BYTE];
}
/* 允许中断 */
Os_Enter_Sum = 1;
OS_EXIT_CRITICAL();
/* 函数返回优先级最高的任务 */
}
/*********************************************************************************************************
** 函数名称: OSTickInit()
** 功能描述: 系统节拍定时器初始化
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
**
** 作 者: 徐宝田
** 日 期: 2002年2月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSTickInit(void)
{
TCCR0 = 0;
TCCR0 |= (1<<CS02)|(1<<CS00); /* 256预分频 */
TIMSK |= (1<<TOIE0); /* T0溢出中断允许 */
TCNT0 =69; /* 置计数起始值 (256-CPU_OSC/1024/OS_TICKS_PER_SEC) */
}
/*********************************************************************************************************
** 函数名称: OSTickISR
** 功能描述: 系统时钟中断服务函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: OS_INT_ENTER,(UserTickTimer),OSTimeTick,OSIntExit
**
** 作 者: 徐宝田
** 日 期: 2005年5月30日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
SIGNAL(SIG_OVERFLOW0)
{
if(1==Alarm)
{
PORTD &=~(PIND&0x01);
}
#if TICK_TIMER_SHARING >1
static uint8 TickSum = 0;
#endif
TCNT0+= 69; //(256-CPU_OSC/1024/OS_TICKS_PER_SEC)
#if EN_USER_TICK_TIMER > 0
#endif
#if TICK_TIMER_SHARING >1
TickSum = (TickSum + 1) % TICK_TIMER_SHARING;
if (TickSum != 0)
{
return;
}
#endif
#if EN_OS_INT_ENTER > 0
OS_INT_ENTER(); /* 中断开始处理 */
#endif
#if EN_TIMER_SHARING > 0
OSTimeTick(); /* 调用系统时钟处理函数 */
#else
OSIntSendSignal(TIME_ISR_TASK_ID); /* 唤醒ID为TIME_ISR_TASK_ID的任务 */
#endif
OSIntExit(); /* 中断结束处理 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -