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

📄 os_cpu_c.c

📁 一个简单易用的可裁减的小型实时操作系统 移植非常简单
💻 C
字号:
/*
 *******************************************************************************
 *
 * MicroROS
 *
 * Copyright (C) 2007 <amwox@163.com>			
 *
 * Description	: 与移植相关的必要的函数
 *
 * File			: os_cpu_c.c
 * Author		: amwox
 * Edition		: V0.01
 * History		: 2007-10-29  created 
 *******************************************************************************
 */
#include "..\include\MicroROS.h"
#include "..\include\os_cpu.h" 

/* 
 * Description	: 保存堆栈指针到进程,或内核.IDLE是一个特殊的进程
 *				  在汇编中调用本函数
 * Arguments	: Y	堆栈指针
 * Returns		:
 */
void _SaveSP(STACK * Y)
{
    if ((os_kernel.SysLevel == 0) && (os_kernel.pRunning != NULL)) {
		pPID pProcess = os_kernel.pRunning;
		pProcess->pCP = Y; 
		pProcess->State &= ~BV(PID_RUNNING);
    }
    else
        os_kernel.pIdleStack = Y;
    os_kernel.SysLevel ++;
}

/* 
 * Description	: 取出最高优先级的进程,恢复堆栈指针
 *				  在汇编中调用本函数
 * Arguments	:
 * Returns		: 堆栈指针
 */
STACK * _RestoreSP(void)
{
    STACK * Y;
    os_kernel.pRunning = os_kernel.pRunList;
    os_kernel.SysLevel --;
    if ((os_kernel.SysLevel == 0) && (os_kernel.pRunning != NULL)) {
		pPID pProcess = os_kernel.pRunning;
		Y = pProcess->pCP;            
		pProcess->State &= ~BV(PID_READY);
		pProcess->State |= BV(PID_RUNNING);
    }
    else
        Y = os_kernel.pIdleStack;
    return Y;
} 


/* 
 * Description	: IDLE是一个特殊的进程
 * Arguments	:
 * Returns		:
 */
void OS_IdleTask(void)
{
	OS_ENABLE_INTERRUPT();
	while (1) {
		SLEEP();
	}
}


/* 
 * Description	: 初始化堆栈,IAR FOR AVR 分为两个堆栈存参数的CStack,和存函数返回
 *				  地址的RStack,为简化处理将决定函数调用深度的RStack设定为同相大小
 * Arguments	: pTaskName	任务函数指针
 *				  pStack	任务堆栈
 * Returns		: 任务堆栈的堆栈指针
 */
STACK * OS_TaskInit(void  (* pTaskName) (void),STACK * pStack)
{
	STACK * pstk;
    
	pstk = pStack - RCSTACKSIZE;
	/*先将任务函数入栈RSTACK*/
	*pStack-- = (WORD)pTaskName;
	*pStack-- = ((WORD)pTaskName >> 8);
	
	*pstk-- = 0;						/*R16*/
	*pstk--	= 0x80;						/*SREG*/
	for (BYTE i = 0; i < 29; i ++) 		/*ALL REGISTER*/
		*pstk-- = 0;
	*pstk-- = (WORD)pStack;				/*SPL*/
	*pstk   = (WORD)pStack >> 8;		/*SPH*/
	return pstk;
}


/* 
 * Description	: 初始化OS Tick 中断,采用定时器0,最好可以是自动是自动重载
 * Arguments	:
 * Returns		:
 */
void OS_KernelInit(void)
{	
	TCNT0 = 0;
	OCR0 = OS_CPU_COLOK_FREQUENCY / (OS_TICK_PER_SECOND * 1024L) - 1; /*计数器比较值,预分频为 1024*/    
	TCCR0 = 0x0F;                               /* CTC模式 1024分频*/
	TIMSK = (TIMSK & ~0x03) | 0x02;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -