从零实现基于事件轮询的操作系统

本文我们从零实现一个基于事件轮询的操作系统。

事件轮询机制,很简单就是系统不断去判断当前是否有事件发生,如果有事件发生,就转去执行对应的事件处理函数。这是典型的基于前后台的设计模式,当外部事件发生时,我们在对应中断函数中,接收数据拷贝到缓存中,并置位对用事件标志位,在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的系统,可以使用该种方式进行程序开发。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值