查看: 1504|回复: 0
打印 上一主题 下一主题

向操作系统迈进

[复制链接]
跳转到指定楼层
沙发
发表于 2015-9-23 16:09:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
向操作系统迈进


源代码打包 ourdev_385493.rar(文件大小:39K) (原文件名:aos.rar)
先下载示例代码.用KEIL打开它,但先别急着看,回这里来.


前面所说的例子中,除了多任务并行执行能力外,没有其它功能,这对于一个极简单的系统来说是够用的,但如果系统稍复杂一点,例如:


1.某任务中需要延时
2.某任务中需要等待,直至某事务处理完.
3.任务并非一开始就全部装入,随着处理流程的展开,在不同的时刻装入不同的任务.任务具有生命周期,事务处理完毕后,希望将任务结束并清除.


这里就是操作系统的几个典型功能:
1.休眠机制
2.消息机制
3.进程机制


事实上这些功能非常容易实现,如果对前面几篇的内容全部了解的话,很容易想象这些机制是如何实现的.
这一回我们就来讲讲这些机制是怎样实现的.


1.休眠及延时(延时又叫睡眠,这里刻意改称"延时",以防止与休眠混淆)机制:


为每个任务定义一字节计数器:
unsigned char idata task_sleep[MAX_TASKS];//任务睡眠定时器


该计数器会在每次定时器中断时减1(除非它的值为0,或为0xff)
void clock_timer(void) interrupt 1 using 1
{


...
        //任务延迟处理
        i = MAX_TASKS;
        p = task_sleep;
        do{
                if(*p != 0 && *p != -1)//不为0,也不为0xff,则将任务延时值减1.为0xff表示任务已挂起,不由定时器唤醒
                        (*p)--;
                p++;
        }while(--i);
}


在任务切换时,检查task_sleep的值是否为0.不为零则跳过该任务不执行,检查下一个任务是否符合执行条件.
void task_switch(){
...
        while(1){
...
                task_id++;//task_id切到下一个.实际上不只是增1这么简单,还要取模.这里只是示范,所以就不写全了.


                if( task_sleep[task_id] == 0)//不为0表示该任务在休眠/延时中,所以跳过.
                        break;
        }


...
}
相关宏:
task_sleep(timer) 延时timer个定时器中断周期.取值0~254
task_suspend() 休眠.如果无其它进程唤醒,则永远不会再执行
task_wakeup(tid) 唤醒任务号为tid的进程转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表