本文我们从零实现一个基于事件轮询的操作系统。
事件轮询机制,很简单就是系统不断去判断当前是否有事件发生,如果有事件发生,就转去执行对应的事件处理函数。这是典型的基于前后台的设计模式,当外部事件发生时,我们在对应中断函数中,接收数据拷贝到缓存中,并置位对用事件标志位,在main函数中,根据对应的事件去做出相应的处理。
要实现上述功能,
1. 首先我们要实现一个事件表,事件表里面保存每个任务对用事件。
2 .其次实现一个函数表,函数表里面保存各个任务事件对用的处理函数。
3. 建立事件表与函数表之间的关联。
4. 在main 函数while循环中不断去查询当前事件表中是否有事件发生,如果有则转到对应的事件处理函数,没有则继续查询。
以下是系统框架的具体实现:
#define MaxTaskNum 20 //定义支持20个任务
typedef u16 TaskEvent; //定义任务事件
typedef u16 (*TaskEventHandler)(u8 taskId, u16 taskEvent ); //定义任务函数指针
TaskEvent EventArray[MaxTaskNum] ; //建立事件表
TaskEventHandler TaskArray[MaxTaskNum] = { 任务函数1、任务函数2 ......}; //建立函数表
//建立任务调度函数
void osal_start_system(void)
{
for (;;)
{
u8 id = 0;
do
{
if (EventArray[id])
{
break;
}
}while(++id < MaxTaskNum); //查询置位事件
if (id < MaxTaskNum)
{
u16 events;
events = EventArray[id];
EventArray[id] = 0;
events = (TaskArray[id])(id,events); //处理置位事件
EventArray[id] |= events;
}
}
}
void main(void)
{
hal_Init(); //外设初始化
osal_start_system(); //启用任务调度
}
至此完成,对于内存空间受限,无法移植RTOS的系统,可以使用该种方式进行程序开发。