打印
[AVR单片机]

AVR单片机C语言程序框架

[复制链接]
2797|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lvhoujun|  楼主 | 2014-2-13 13:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是本人以ATMEGA128为例编写的C语言程序框架,做简单的修改即适合AVR所有单片机。可以说是一个单片机最简操作系统,希望各位同仁补充改进。
AVR单片机程序框架.rar (68.86 KB)
程序框架采用事件触发机制,主程序可以编程为按事件优先级运行,也可以编程为顺序运行。主程序在App.c文件中,框架的核心程序在OSAL_App.h中,程序事件和运行标志定义在App.h文件中。

相关帖子

沙发
livekoko| | 2014-2-13 16:10 | 只看该作者
学习一下,刚来的

使用特权

评论回复
板凳
luvemcu| | 2014-2-14 10:04 | 只看该作者
哦?

看看,学学,谢谢

使用特权

评论回复
地板
alan__lgh| | 2014-2-17 14:44 | 只看该作者
很好!

使用特权

评论回复
5
Bluesky_1921| | 2014-2-20 11:17 | 只看该作者
我点击下载怎么是一个.php的文件呢?

使用特权

评论回复
6
lvhoujun|  楼主 | 2014-2-21 11:10 | 只看该作者
Bluesky_1921 发表于 2014-2-20 11:17
我点击下载怎么是一个.php的文件呢?

我试了,下载是正常的。

使用特权

评论回复
7
huangxz| | 2014-2-24 22:22 | 只看该作者
赞一个,不过如果能够写的详细一点就好了。

使用特权

评论回复
8
fanxixi| | 2014-2-25 21:34 | 只看该作者
先下载看看

使用特权

评论回复
9
lvhoujun|  楼主 | 2014-2-25 23:18 | 只看该作者
huangxz 发表于 2014-2-24 22:22
赞一个,不过如果能够写的详细一点就好了。

我将在今后的回复中,根据同学们的询问,逐一回答有关该程序框架问题。

使用特权

评论回复
10
52414133| | 2014-2-26 08:46 | 只看该作者
顶一下

使用特权

评论回复
11
powerxia| | 2014-3-6 22:06 | 只看该作者
MS不错的东东,顶你下先

使用特权

评论回复
12
c8112499| | 2014-3-8 23:06 | 只看该作者
不错学习一下                 

使用特权

评论回复
13
lvhoujun|  楼主 | 2014-3-15 10:02 | 只看该作者
有同学询问怎样使主程序按事件优先级处理?怎样按顺序处理?在这里给大家介绍一下:
在程序框架的App.c文件中,主程序:
int main(void)
{
     ......//各种资源初始化
     wdt_enable(WDTO_2S);//使能看门狗   
     while(1)
    {
           wdt_reset();//复位看门狗
           if( events )
          {
                //处理事件函数
               events = process_evts();
          }
     }
}  
可以看出,主程序就是循环查询有无事件发生,如果有事件发生,就运行事件处理函数process_evts();

现在我们看事件处理函数:
int process_evts(void)
{
      if( events & OCCURRED_1_EVT )
     {
            ;//添加事件OCCURRED_1_EVT的处理函数   
           return (events ^= OCCURRED_1_EVT);
      }

       if( events & OCCURRED_2_EVT )
      {
              ;//添加事件OCCURRED_2_EVT的处理函数
              return (events ^= OCCURRED_2_EVT);
       }
       return 0;
}
该函数查询发生了什么事件,假设是OCCURRED_1_EVT 。关键是事件处理完后,有一句: return (events ^= OCCURRED_1_EVT);这句话的意思是,清零该事件,退出process_evts()。如果 OCCURRED_1_EVT事件一直发生,下次进入事件处理时,仍然只处理OCCURRED_1_EVT, OCCURRED_2_EVT永远得不到处理。除非不发生OCCURRED_1_EVT事件,才可能处理 OCCURRED_2_EVT事件。也就是说, OCCURRED_1_EVT比 OCCURRED_2_EVT优先级高。这就是按事件的优先级运行。
这种编程方法的优点是,保证优先级高的事件在最短的时间内得到处理。
那么,程序怎样按顺序运行?
我们把return (events ^= OCCURRED_1_EVT);改成:
events ^= OCCURRED_1_EVT          不用return
则处理完OCCURRED_1_EVT事件处理程序后,则继续执行下一个if语句,从而使 OCCURRED_2_EVT 事件得以处理。这就是按事件顺序执行程序。
如果程序中有两个以上的事件都必须尽快处理,就把顺序运行和优先运行结合起来使用。比如前两个事件处理不加return返回语句,第三个以后再加返回语句等等。     
还有一些状况,虽说事件发生了,但由于某些条件不具备,还不能处理该事件怎么办?比如GSM通信编程时,发生了一个发送短信事件SMS_SEND_EVT,如果此时正在传送TCP报文,必须等到关闭TCP连接后,才能发送短信。那么我们在process_evts()中可以这样处理:
if( events &SMS_SEND_EVT)
{
        if(  TCP连接还没有关闭 )
        {
                continue;
        }
        ......     //发送短信     
        return (events ^= SMS_SEND_EVT);
}
即在这次执行process_evts()的时候,用 continue退出该事件处理程序,保留SMS_SEND_EVT事件,继续执行后边的事件处理程序。等到下次运行process_evts()时再处理SMS_SEND_EVT事件,直到 TCP连接关闭后,发出短信,才能清零SMS_SEND_EVT。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝