⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_cpu_c.c

📁 small rtos for avr small rtos 使用了动态堆栈 想无需任何改动就可以编译这个程序
💻 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 + -