📄 os_cpu_c.c
字号:
/*********************************************************************************************************
** Small RTOS
** The Real-Time Kernel For AVR-GCC
**
** (c) Copyright 2004-2005, xubaotian
** All Rights Reserved
**
** V 0.1.0
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: OS_CPU_C.c
**创 建 人: 徐宝田
**最后修改日期: 2005年5月30日
**描 述: Small RTOS 与CPU(既ATmega系列)堆栈初始化,定时器,休眠相关的C语言代码
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 徐宝田
** 版 本: V0.10
** 日 期: 2005年5月30日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_OS_CPU_C
#include "CONFIG.h"
void OSInitHook(void) ;
void OSTickInit(void) ;
void OSStart(void) ;
void* OSTaskStackBottom[OS_MAX_TASKS + 2]; /* 任务栈底位置 */
/*********************************************************************************************************
** 函数名称: main
** 功能描述: C代码从这里开始执行
** 输 入:
** 输 出 :
** 全局变量:
** 调用模块: OSInit,OSStart
**
** 作 者: 徐宝田
** 日 期: 2005年5月30日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int main(void)
{
OSInitHook();
OSTickInit();
OSStart();
}
/*********************************************************************************************************
** 函数名称: 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日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 TaskAStk[100];
uint8 TaskBStk[100];
uint8 TaskCStk[100];
uint8 TaskIdle[50];
void OSTaskCreate(void (*task)(void),void* stk,uint8 prio)
{
uint8* cp;
uint8 j;
cp = stk;
*cp-- = ((uint8*)(&task))[HIGH_BYTE];
*cp-- = ((uint8*)(&task))[LOW_BYTE];
for(j=0;j<34;j++)
{
*cp-- = 0;
}
OSTaskStackBottom[prio] = cp;
}
void OSStart(void)
{
OSTaskCreate(task0,&TaskAStk[99],0);
OSTaskCreate(task1,&TaskBStk[99],1);
OSTaskCreate(task2,&TaskCStk[99],2);
OSTaskCreate(OSIdle,&TaskIdle[49],OS_MAX_TASKS);
SP = (uint16)OSTaskStackBottom[0] ;
LoadCtx(); /* 函数返回优先级最高的任务 */
}
/*********************************************************************************************************
** 函数名称: OSTickInit()
** 功能描述: 系统节拍定时器初始化
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
**
** 作 者: 徐宝田
** 日 期: 2002年2月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void OSTickInit(void)
{
TCCR0 = 0;
TCCR0 |= (1<<CS02); /* 256预分频 */
TIMSK |= (1<<TOIE0); /* T0溢出中断允许 */
TCNT0 = (256-CPU_OSC/256/OS_TICKS_PER_SEC); /* 置计数起始值 */
}
/*********************************************************************************************************
** 函数名称: OSTickISR
** 功能描述: 系统时钟中断服务函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: OS_INT_ENTER,(UserTickTimer),OSTimeTick,OSIntExit
**
** 作 者: 徐宝田
** 日 期: 2005年5月30日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
SIGNAL(SIG_OVERFLOW0)
{
#if TICK_TIMER_SHARING >1
static uint8 TickSum = 0;
#endif
TCNT0+= (256-CPU_OSC/256/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 + -