张金权-11级电子 发表于 2016-4-8 18:24:18

最近打算研究pixhawk飞控,但是这个飞控对windows环境下的编译支持不怎么好,搭建个开发环境花了好大功夫,这才感觉到keilMDK有多么好用:'(

程浥 发表于 2016-5-7 15:53:44

张金权-11级电子 发表于 2016-3-28 12:08
期待其他理解和阐释,,,

吹逼...
假如给我们一个很小的任务,写一颗LED灯的驱动程序,你会怎么做呢?

按照常规思想就开始Delay了,嗯!先闪:

LED_Display(N)
{
    LED1=~LED1;
    Delay(N秒);
}

这么闪还没意思,要想怎么闪就怎么闪,频率自己定,总时间自己定,还要有闪的时间和灭的时间不一样,于是有了:
LED_Display(ontime,offtime,alltime)
{
    int n;
   n=alltime/(ontime+offtime);
   for(i=0;i<n;i++)
    {
      LED_ON;
      Delay(ontime);
      LED_OFF;
      Delay(offtime);
    }
}

程浥 发表于 2016-5-7 16:15:16

程浥 发表于 2016-5-7 15:53
吹逼...
假如给我们一个很小的任务,写一颗LED灯的驱动程序,你会怎么做呢?



但是Delay相当占系统时间,白白浪费资源你得被骂死,于是我们要采用定时器和中断:

暂时就定个10ms中断好了:

中断不能带参数,看来得用全局变量了。

ontime ,offtime,alltime.来来来,我们给它初始化一下.
void LEDInit(u32 ontime ,u32 offtime,u32 alltime)
{
        static u32 m_ontime,m_offtime,m_alltime;
        //统统滴 读进来
}


下面就是写中断处理了:
void __Timer0Int(void)
{
        //10ms重载
        LEDProcess();
}
void LEDProcess(void)
{
        static u32 allcount,ncount;
        m_count+=10;
        if(allcount>alltime)
        {
                //任务结束
                //看起来这里还要设个标志
        }
        else
        {
                //燥起来
                ncount+=10;
                if(ncount>m_ontime)
                {
                        LED_ON;
                        ncount=0;
                        //看起来还要设个交替的标志
                }
                else
                {
                        LED_OFF;
                        ncount=0;
                }
        }
}
void LEDInit(u32 ontime ,u32 offtime,u32 alltime)
{
        static u32 m_ontime,m_offtime,m_alltime;
        //统统滴 读进来
}

程浥 发表于 2016-5-7 16:51:45

程浥 发表于 2016-5-7 16:15
但是Delay相当占系统时间,白白浪费资源你得被骂死,于是我们要采用定时器和中断:

暂时就定个10ms中 ...

东西是这样摸索过来的,要是我们一开始就想好了就好了。

我也想啊。

那么问题就来了。

我们一开始的任务是写一个led驱动的代码。
就LED灯这个对象,我们要分析下它的属性。

面向对象

张金权-11级电子 发表于 2016-5-10 09:09:40

程浥 发表于 2016-5-7 16:51
东西是这样摸索过来的,要是我们一开始就想好了就好了。

我也想啊。


继续啊                                                
页: 1 [2]
查看完整版本: 开个贴,不定时更新对单片机编程的理解