zoukankan      html  css  js  c++  java
  • 多定时器处理2(30天自制操作系统 -- 读书笔记)

         今天的内容依然来自《30天自制操作系统》这本书。

         1、中断处理程序存在的问题,中断处理程序Timer_Interrupt如下:

    //定时器中断函数
    void Timer_Interrupt(void)
    {
        int i=0;
        timerctl.count ++;
        for(i=0;i<MAX_TIMER;i++)        //扫描所有的定时器
        {
            if(timerctl.timer[i].flag == TIMER_FLAG_USING)
            {
                timerctl.count--;
                if(timerctl.count == 0) //减得时间到了
                {
                    fifo8_put(timerctl.timer[i].fifo,timerctl.timer[i].data);  //向关联fifo中写入数据
                    timerctl.timer[i].flag = TIMER_FLAG_ALLOC;      //改变标志位
                }
            }
        }
        
        return ;
    }

         每次中断程序中,都要将正在使用中的定时器(TIMER_FLAG_USING)的定时时间count读出来,然后再减一,为了避免这一点。可以做如下修改:
    将count的含义由设定的倒计时时间,变为设定的准定时间。具体如下:

         修改timer_settime函数:

    //设定timer定时器的定时时间为timeout
    void timer_settime(struct TIMER* timer,unsigned int timeout)
    {
        timer.timeout = timeout+timectl.count;   //这里!!     
        timer.flag = TIMER_FLAG_USING;  //这条语句相当于启动了定时器
        
        return ;
    }

         定时器结构体中的count含义就是从现在开始,还有多久定时时间到。
         修改定时器中断程序Timer_Interrupt如下:

    //定时器中断函数
    void Timer_Interrupt(void)
    {
        int i=0;
        timerctl.count ++;
        for(i=0;i<MAX_TIMER;i++)        //扫描所有的定时器
        {
            if(timerctl.timer[i].flag == TIMER_FLAG_USING)
            {
                if(timerctl.count >= timer[i].timeout) //count由设定时的值变到了设定的值
                {
                    fifo8_put(timerctl.timer[i].fifo,timerctl.timer[i].data);  //向关联fifo中写入数据
                    timerctl.timer[i].flag = TIMER_FLAG_ALLOC;      //改变标志位
                }
            }
        }
        
        return ;
    }

         暂时OK。

  • 相关阅读:
    zz解读NoSQL技术代表之作Dynamo
    愚蠢且能干
    Schema 验证和 DTD 验证
    Office Addin (VSTO) Performance Tips & Tricks
    提高 .NET 应用 XML 处理性能的几点开发经验(转载)
    C# 实现对XML文件的基本操作(创建xml文件,增、删、改、查 xml节点信息)zz
    XML/XSLT/XPATH
    Linux下基于DNS的多机均衡负载的实现
    Linux 上的高可用中间件,第 3 部分: IBM LoadLeveler
    Creating Web Services using Apache
  • 原文地址:https://www.cnblogs.com/kanite/p/4485861.html
Copyright © 2011-2022 走看看