📄 os_cpu_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 + -