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

📄 os_cpu_c.c

📁 一个基于MEGA16的GUI
💻 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 + -