os.c

来自「描述嵌入式系统中最最基本的操作系统框架,由此可以写自己的嵌入式操作系统」· C语言 代码 · 共 58 行

C
58
字号
/// 1、任务控制
#define MAX_TASK	3				//一共几个任务
#define __task
#define OSWaitSignal(N) TCB[N].CurDelay = 65535
#define OSSendSignal(N)	TCB[N].CurDelay = 1

typedef const void (*Task)(void);	//任务变量
uchar CurTaskId;					//当前执行的任务

struct _TCB{
	ushort Delay;					//需要延时的长度
	ushort CurDelay;				//倒计时,到0了就执行任务
	Task* pTask;					//任务过程
} TCB[MAX_TASK];

/// 2、操作系统时钟中断服务程序

void TimeTickISR() __irq {
	uchar i;
	for (i=0; i<MAX_TASK; i++){
		_TCB* pTCB = TCB[i];
		CurTaskId = i;
		/// if(pTCB->CurDelay == 65535) continue; //如需等待信号,就用这个
		pTCB->CurDelay--;
		if(pTCB->CurDelay == 0){
			pTCB->CurDelay = pTCB->Delay;
			pTask();
		}
	}
}

//定义任务
//参数:任务号,延时时间间隔,任务服务程序
void OSDefineTask(char TaskNum, ushort Delay, Task* pTask){
	_TCB* pTCB = TCB[TaskNum];
	pTCB->Delay = pTCB->CurDelay = Delay;
	pTCB->pTask = pTask;
}

/// 3、初始化任务
void Task1() __task{
	PIO ^= 1;
}

void Task2() __task{
	PIO ^= 2;
}

void Task3() __task{
	PIO ^= 4; 
}

void main(){
	OSDefineTask(0, 100, Task1);		//任务1每100Tick触发一次
	OSDefineTask(0, 200, Task2);		//任务2每200Tick触发一次
	OSDefineTask(0, 300, Task3);		//任务3每300Tick触发一次
	while(1);
}

⌨️ 快捷键说明

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