📄 os_cpu.c
字号:
/*
*********************************************************************************************************
* minOS 0.01v
* The Real-Time OS Kernel
* All Rights Reserved
* File : OS_CPU.C
* 作者 : 21icbbs网友 LM7556 ,2004年7月 by : LM7556 , China , 2004-2004
*
*********************************************************************************************************
*/
#define OS_CPU_GLOBALS
#include "OS_Includes.h"
#pragma interrupt_handler OSTickISR:8 //uses Timer0 for time ticks.
//;CPU specific definitions
#define C51_CRYSTAL_FREQ 4000000ul
//;Determine the reload values for timer 0 this is automated by the next macro
#define T0_RELOAD C51_CRYSTAL_FREQ / OS_TICKS_PER_SEC / 1024
#define T0_TCNT0 (256 - (T0_RELOAD & 0xff))
//Initial OS Timer for time ticks --- 初始化时间节拍定时器。
void InitOSTimer(void)
{
TIMSK |= (1<<1); // set T0IE0
TCCR0 = 0x05; // CTC0=CK/1024
TCNT0 = T0_TCNT0; // (256 - (T0_RELOAD & 0xff))
SREG |= (1<<7); // SEI
}
//建立一个任务(Create a Task)。
//Inport : tFunc --- function address , tStk --- stack bottom , prio --- Priority .
void OSTaskCreate (void (*tFunc)(void) , OS_STK *tStk, INT8U prio)
{
OSTCB[prio].OSTaskStatus = OS_TASK_Rdy;
OSTCB[prio].OSStkTop = (INT16U)tStk-1 /* Initial value when main was called */
-12 /* reserve for to save R0-R5 , R26-R31 registers */
-sizeof(INT16U) /* The PC value to be loaded */
;
*--tStk = *(INT16U const *)tFunc & 0xff; /* Save low byte of task function address */
*--tStk = *(INT16U const *)tFunc / 0x100; /* Save high byte of task function address */
}
static unsigned int SaveSP; //用于保存需恢复的SP,在OSTickISR或用户中断结束做任务切换时,恢复SP.
//context switch interrupt --- 软中断任务切换
void OSCtxSw(void)
{
asm("PUSH R31\n"
"PUSH R30\n"
"PUSH R29\n"
"PUSH R28\n"
"PUSH R27\n"
"PUSH R26\n"
"PUSH R0\n"
"PUSH R1\n"
"PUSH R2\n"
"PUSH R3\n"
"PUSH R4\n"
"PUSH R5\n"
"IN R31,0x3d\n" //Save SPL
"STS %SaveSP,R31\n"
"IN R31,0x3e\n" //Save SPH
"STS %SaveSP+1,R31\n"
);
OSTCB[OS_TASK_CrtPrio].OSStkTop = SaveSP; //Save the current task top.
OS_TASK_CrtPrio=OS_TASK_HighPri;
// Load context from the stack
SaveSP = OSTCB[OS_TASK_CrtPrio].OSStkTop; //load the high priority task task top.
asm("CLI\n"
"LDS R31,%SaveSP\n"
"OUT 0x3d,R31\n"
"LDS R31,%SaveSP+1\n"
"OUT 0x3e,R31\n"
"SEI\n"
"POP R5\n"
"POP R4\n"
"POP R3\n"
"POP R2\n"
"POP R1\n"
"POP R0\n"
"POP R26\n"
"POP R27\n"
"POP R28\n"
"POP R29\n"
"POP R30\n"
"POP R31\n"
);
}
//Initial CPU SP for main() function stack.
void OSInitSP(void)
{
SaveSP = (INT16U)&TASK_main_PrioStk[MAX_STK_SIZE-1]; //load the high priority task task top.
asm("POP R0\n"
"POP R1\n"
"LDS R31,%SaveSP\n"
"OUT 0x3d,R31\n"
"LDS R31,%SaveSP+1\n"
"OUT 0x3e,R31\n"
"PUSH R1\n"
"PUSH R0\n"
);
}
//OS Time Tick Interrupt,OS 时钟节拍中断.
void OSTickISR(void)
{
TCNT0 = T0_TCNT0; // (256 - (T0_RELOAD & 0xff))
AppTickHook(); //Hook file for a time tick --- 用户每个时间节拍的钩子函数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -