基于AVR单片机的嵌入式系统的应用分析

发布者:JoyfulHarmony最新更新时间:2011-10-10 关键字:AVR单片机  嵌入式系统 手机看文章 扫描二维码
随时随地手机看文章

引言

  随着技术的发展,嵌入式系统的设计及应用对人们的生活产生了很大的影响,并将逐渐改变人们未来的生活方式,在特定的操作系统上开发应用程序,可以使开发人员忽略掉很多底层硬件细节,使得应用程序调试更方便、易于维护、开发周期缩短并且降低开发成本,因而嵌入式操作系统深得开发人员的青睐。

  AVR微处理器是Atmel公司开发的8位嵌入式RISC处理器,它具有高性能、高保密性、低功耗、非易失性等优点,而且程序存储器和数据存储器可独立编址,并具有独立访问的哈佛结构。AVR单片机内核有丰富的指令集,通过32个通用寄存器直接与逻辑运算单元相连接,允许在一个周期内一条单一指令访问两个独立的寄存器,这样的结构使代码的执行效率比传统的复杂指令集微处理器快了将近10倍。

  AVRX是由1barello编写的源码公开的嵌入式操作系统,它专门针对AVR系列单片机的RTOS,具有免费和可以修改的特点,它的缺点是由于做为一种专用的操作系统很难移植到其他平台上。

1 AVRX 系统的特点

  AVRX做为AVR专用RTOS有如下的特点:

◆ 完全支持占先式、优先级驱动的任务调度算法;

◆ 16个优先级,相同的优先级的任务采用Round robin调度算法轮流执行;

◆ 信号量可以用于信号传递、同步和互斥信号量,支持阻塞和非阻塞语法;

◆ 任务之间可以用消息队列相互传递信息,接收和确认消息可以用阻塞和非阻塞调用;

◆ 在中断子程序中,大部分非阻塞的中断服务程序可以使用;

◆ 支持单个定时器的时间队列管理,任何进程都可以设置一个定时器,并且任何一个任务都可以等待定时器时间到;

◆ 支持单步调式运行着的进程;

◆ 程序空间小,包含所有功能的版本占用1000字节;

◆ 与定时器/计算器有关的一些事务可以用AVRX写成任务级代码。

1.1 任务

  AVRX2.6为了支持C语言,保存了所有的32个寄存器,最小的上下文是32个寄存器、SREG和PC,总共35个字节。AvrXInitTask()函数给所有的寄存器初始化为0x00;只有进程上下文保存在任务堆栈中,所有其他的使用(包括内核和中断)保存在内核堆栈。这样降低了第一个中断的上下文切换和进入内核API的SRAM消耗。随后的中断(如果允许中断嵌套)嵌入内核堆栈,API不进行上下文切换。

1.2 信号量

  信号量是SRAM指针,它们有三中状态:PEND、WAITING和DONE。当一个进程被一个信号量阻塞时,它处于WAITING状态,多个任务可以排队等候一个信号量。在后一种情况下,信号量可以看作互斥信号量。提供的API函数如下:AvrXSetSemaphore、AvrXIntSetSemaphore、AvrXWaitSemaphore、AvrXtestSemaphore、AvrXIntTestSemaphore和AvrXResetSemaphore。

1.3 定时器

  定时器控制块(TCB)长度为4(或6)个字节。它们管理一个16位计数值。定时器队列管理器管理一个分类的定时器队列,每个都调整为所有计数器的和到其延时需要的值。提供的API函数如下:AvrXStartTimer、AvrXTimerHandler、AvrXCancelTimer、AvrXWaitTimer、AvrXTestTimer和AvrXDelay。

1.4 消息队列

  消息队列用消息控制块(MCB)做为队列首地址。任何进程、中断处理函数和多个进程都可以等待消息。MCB的长度是2或4个字节。消息可以认为是灵活性更大的信号量。提供的API函数如下:AvrXSendMessage、AvrXIntSendMessage、AvrXRecvMessage、AvrXWaitMessage、AvrXAckMessage、AvrXTestMessage和AvrXWaitMessageAck。

1.5 单步运行支持

  通过重新汇编内核AVRX,可以允许和禁止单步运行的支持。单步运行可以通过编译内核库时定义下面的变量:#define SIGNALSTEPSUPPORT。

  在能够单步运行以前,进程必须先暂停。有两种方法实现:一是仅仅初始化进程但不使能;二是用目标进程的ID调用AvrXSuspend,一旦目标进程挂起,调试SPI就能使用了,提供的API函数有:AvrXStepNext和AvrXSingleStepNext。

1.6 系统对象

  AVRX是围绕系统对象的概念而构建的,系统对象包括一个链接和其后面的0个或者若干个字节的数据信号量。进程对象可以根据运行队列和信号量排队。计数器控制块只能根据计数器队列排队。消息控制块只能在消息队列排队。进程根据嵌入对象的信号量等待这些对象。

  进程堆栈中可用的SRAM是限制系统规模的主要因素,每个进程都需要至少10~35字节的空间来存储进程上下文。提供的API函数如下:AvrXSetObjectSamaphore、AvrXIntObjectSamaphore、AvrXResetObjectSamaphore、AvrXWaitObjectSamaphore、AvrXTestObjectSamaphore和AvrXIntTestObjectSamaphore。

1.7 系统堆栈

  AVRX需要足够大的堆栈来处理所有可能的中断嵌套,每次进入内核将会把10~35字节压进堆栈(标准上下文和返回地址),中断处理可能压进去更多。AVRX的API会临时压入2个以上的字节。GCC或者汇编代码定义于SRAM的顶部,保证AVRX的堆栈在有效SRAM空间之内是设计者的工作。

2 AVRX系统的应用

2.1 AVRX在不同型号AVR单片机上的移植

  下面以ATmega16为例,介绍移植工作。

(1)编译器的选择

  由于AVRX的编者是在GNU推出的AVR-GCC编译器下编写的,所以选用AVR-GCC编译器可以大大提高AVRX在不同AVR单片机上的移植特性。

(2)重新编译AVRX内核

  为了将应用程序成功编译,需要重新编译AVRX内核,重新编译包括下述步骤。

  ①重新修改AVRX源码的Makefile文件,需要修改的几处如下:[page]

ABSPATH=…/avrx /*更改AVRX原路径到实际路径下*/

修改   MCU=8535
     AAVRMCU=1
     GCCMCU=at90s$(MCU)
     AVRXMCU=_AT90S$(MCU)_
为    ICCMCU=m16
     AAVRMCU=3
     GCCMCU=atmega16
     AVRXMCU=_AT90Mega16_

  ②重新修改AVRX源码的serialio.s文件,即根据不同的单片机修改串口部分的寄存器定义。需要增添如下代码:

     #if defined(UBRRL)
     #define UBRR UBRRL
     #endif
     #if defined(UBRRH)
     sts UBRRH,p1h
     #endif

  ③重新编译内核。具体做法是复制一个“令名提示符”到AVRX目录下,运行“命令提示符”,键入“makegcc”命令后运行就完成了AVRX内核的重新编译,会生成很多的.o文件和avrx.a文件。这些文件在以后的应用程序中会使用。

  至此就完成了AVRX在ATmega16单片机上的内核移植,接着就可以编写应用程序了。

2.2 在AVRX上编写应用程序

  这时候要用一个新的makefile文件,同时自己的程序可以不和AVRX的内核在一个目录,但是要指出依赖文件的明确路径。makefile的框架可以采用Winavr的sample文件夹下的makefile文件框架,这里的难点其实还是makefile文件的语法问题。下面介绍应用程序的makefile文件在实例中需要修改或增加的代码:

MCU=atmega16 /*微处理器的名字*/

TARGET=test /*应用程序文件名*/

GCCLIB=$(AVRX)/avrx/avrx.a

GCCINC=-L-I$(AVRX)/avrx-I$(AVR)/avr/inc /*加上相关的库*/

SCANF_LIB_MIN=-W1,-u,vfscanf-1scanf_min

SCANF_LIB_FLOAT=-W1,-u,vfscanf-1scanf_flt

SCANF_LIB /*设置sacnf函数库的类型,在不使用时可以注释掉,这样可以减小编译后的文件大小*/

LDFLAGS+=$(PRINTF_LIB)$(SCANF_LIB)$(MATH_LIB) /*新增的连接器参数设定*/

3 系统测试

3.1 系统实时性测试

  在实时系统中,实时系统的实时性表现在系统对外部事件的响应能力上,系统通过中断来响应外部事件的发生,并且在用户中断程序中做的事要尽量少,把大部分工作留给任务去做,只是通过信号量或者信息机制来通知任务运行。Mega16的定时器2设为比较匹配输出模式,在匹配时间到了之后产生一定周期脉冲输出,并产生中断。设置定时器1为计数模式来计数产生的脉冲输出。通过定时器2的比较匹配中断服务子程序来发信号量通知任务运行,并在中断子程序中不开中断,而在任务得到信号后开中断,以实现中断处理与任务运行的同步,任务中对一个全局变量计数,以记录任务执行的次数。运行一段时间后,在设置的匹配时间里,任务的运行次数和定时器1的计数一样,则系统在这段时间里是能完全响应外部事件的,当定时器2的比较匹配时间设为大于23μs时,2个计数是相等的;当小于23μs时,定时器1计数值大于任务计数值,说明任务没有完全得到响应。这说明中断的进入和返回即系统对外部时间的响应和处理时间为23μs,远远大于其他操作系统在AVR单片机上移植后的响应时间。

3.2 使用例程测试

  这里只对源文件中的几个例程先进行简单的编译,然后去掉不必要的代码,加入自己想测试的一些代码,进行了定时器控制模块,信号量和消息队列以其简单组合的测试,均在ATmega16上达到了预期的效果。

4 心得体会

  ①AVRX的源码都是用汇编语言编写的,相对来讲代码效率很高,但是由于没有详细的API介绍文档,所以最好的入门方法就是先读懂RTOS的源码和例程,然后进行修改,再加上自己的代码逐渐熟练应用。

  ②AVRX需要分配的堆栈为35个字节加上任务代码需要的额外堆栈,具体的大小取决于每个进程用的本地变量个数。比较好的确定分配给任务堆栈大小的方法是:分配很大的堆栈(如70字节)运行一段应用程序后看堆栈到多深(因为GCC启动时把所有内存都清0了,这样很容易看到)。不过,为了安全起见,用编译器或仿真器在估计堆栈的顶端写入几个字节的0xFFFFF去验证到底达到了多少字节,然后分配给比测试结果多两个以上的字节给这个任务。

  ③启动的最后一个指令必须跳转到Epilog()。

5 结论

  AVRX是一个不错的RTOS,最显著的特点就是内核小,速度快,编译后大概只需500~700字节,且基本的调度功能一个也不少。由于其代码公开,结合不同型号AVR单片机的特性,可以在此基础上进行系统的裁减和扩展,使之能达到更好的效果,本文为AVR嵌入式系统的应用提供了借鉴。

 

 

关键字:AVR单片机  嵌入式系统 引用地址:基于AVR单片机的嵌入式系统的应用分析

上一篇:基于AVR单片机的臭氧治疗仪设计方案
下一篇:基于单片机的LED数字大屏幕显示系统

推荐阅读最新更新时间:2024-03-16 12:43

基于ARM的嵌入式系统程序开发要点
因为嵌入式应用领域的多样性,每一个系统都具有各自的特点。在进行系统程序设计的时候,一定要进行具体分析,充分利用这些特点,扬长避短。 结合 ARM 架构本身的一些特点,在这里讨论几个常见的要点。 1.ARM 还是 Thumb? 在讨论 ARM 还是 Thumb 之前,先说明 ARM 内核型号和 ARM 结构体系之间的区别和联系。 如图-1所示,ARM 的结构体系主要从版本 4 开始,发展到了现在的版本 6,结构体系的变化,对程序员而言最直接的影响就是指令集的变化。结构体系的演变意味着指令集的不断扩展,值得庆幸的是 ARM 结构体系的发展一直保持了向上兼容,不会造成老版本程序在新结构体系上的不兼容。 图-1 ARM
[单片机]
基于ARM的<font color='red'>嵌入式系统</font>程序开发要点
嵌入式汽车纵向碰撞预警系统研究
0 引言   利用图像 传感器 感知前方道路交通环境与障碍物位置,实现安全车距测量,对处于碰撞危险的汽车及时报警有利于减少交通事故,提高道路交通安全。由于理论计算的安全车距首先要以保障安全为前提,经常与驾驶员在行驶过程中认可的安全车距有较大的出入,导致驾驶员对预警系统的不信任感,不利于系统的推广使用。同时,作为安全辅助驾驶系统的处理平台,PC机的体积、成本及功能的冗余性是应用在车载系统中难以克服的瓶颈。   本文以图像方式测量本车与前车的车距为基础,建立汽车 纵向碰撞预警 模型,解决理论计算的安全距离与驾驶员认可的习惯距离不相一致的矛盾;考虑嵌入式系统处理的实时性与体积小巧性等特点,采用嵌入式方法完成汽车纵向碰撞预警系统
[汽车电子]
嵌入式汽车纵向碰撞预警系统研究
AVR单片机控制继电器
#include macros.h #define uchar unsigned char #define uint unsigned int void delay_ms(uchar i) { uchar a,b; for(a=1;a i;a++) for(b=1;b 141;b++) {;} } void main(void) { DDRA=0X80; PORTA=0X80; DDRB=0XFF; PORTB=0XFF; DDRC=0X01; PORTC=0X01; DDRD=0X00; PORTD=0XFF; while(1) { PORTA ^= BIT(7); delay_ms(200); delay_m
[单片机]
<font color='red'>AVR单片机</font>控制继电器
嵌入式系统中LCD驱动的实现原理
结合三星公司ARM9系列嵌入式处理器S3C2410,讲解如何进行LCD驱动程序模块化编程及如何将驱动程序静态加载进系统内核。 LCD(液晶显示)模块满足了嵌入式系统日益提高的要求,它可以显示汉字、字符和图形,同时还具有低压、低功耗、体积小、重量轻和超薄等很多优点。随着嵌入式系统的应用越来越广泛,功能也越来越强大,对系统中的人机界面的要求也越来越高,在应用需求的驱使下,许多工作在Linux下的图形界面软件包的开发和移植工作中都涉及到底层LCD驱动的开发问题。因此在嵌入式系统中开发LCD驱动得以广泛运用。 本文以三星公司ARM9内核芯片S3C2410的LCD接口为基础,介绍了在Linux平台上开发嵌入式LCD驱动程序的一
[应用]
LCD1602子程序
/********************************************************************* 目 的: 建立LCD1602操作库 目标系统: 基于AVR单片机 应用软件: ICCAVR 版 本: Version 1.0 *********************************************************************/ /*0101010101010101010
[单片机]
基于ARM的嵌入式系统—DIS采集系统设计
   0 引言   数字化信息系统实验室(Digital Information System,DIS)是新一代的中小学实验教学系统,是先进的数字技术应用到实验教学的产物,也是探究、创新的实验教学新理念注入传统实验教学后的必然结果。2006年,教育部将DIS纳入了中小学实验仪器装备标准,建议有条件的学校配备。目前,国内已有多家企业有相应的产品,但大多不够成熟。而国外的类似产品虽然较为成熟,但价格偏高,难以普及。更重要的是,国外的产品不能够很好地与我国的实验教材配合,难以开展教学。在此提出一种廉价、功能强大、基于ARM技术的DIS采集系统设计。它是DIS的一个重要组成部分,并已与江苏教育家教学装备有限公司合作形成了产品。   
[单片机]
基于DSP的Bluetooth嵌入式系统应用
摘要:以TI的TMS302VC54x数字信号处理器(DSP)为嵌入式控制器、ERICSSON的蓝牙模块为例,在蓝牙电缆替代协议应用模块的基础上,提出一种将电缆替代协议进行扩展的嵌入式蓝牙应用模式及其硬、软件的实现。 关键词:Bluetooth 嵌入式系统 DSP 协议 蓝牙(Bluetooth)协议标准是由蓝牙特别兴趣小组(Bluetooth SIG)发布的,1999年发布了Bluetooth 1.0版,2001年2月发布了Bluetooth1.1版。目前SIG成员已经发展到3000家左右。蓝牙协议规定的无线通信标准,基于免申请的2.4GHz的ISM频段,采用GFSK跳频技术和时分双工(TDD)技术,通信距离为10米左右,Bl
[应用]
嵌入式系统设计中的低功耗技术
  0 引言   随着科学的发展和微电子技术的不断创新,嵌入式系统的应用越来越多, 并已广泛渗透到各个领域。嵌入式系统是以应用为中心, 以电子技术和计算机技术为基础, 软硬件可剪裁, 能适应应用系统对功能、可靠性、稳定性、成本、体积、功耗等多方面严格要求的专用计算机系统。   在嵌入式系统的设计中, 低功耗设计技术成为许多设计人员逐渐关注的问题, 其原因在于嵌入式系统已被越来越多的应用在便携式和移动性较强的产品中, 而这些产品往往要靠电池来供电。实际上, 这些年来, 有关电池的储能密度并没有得到大的进步。而对于便携设备, 尤其是手持消费品而言, 如果单靠提高电池容量来提高续航能力, 似乎并不完全切合实际。因此, 为提高设备性能
[单片机]
<font color='red'>嵌入式系统</font>设计中的低功耗技术
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved