详解AVR微处理器如何令程序调试更简便

发布者:温暖微风最新更新时间:2014-08-28 来源: cecb2b关键字: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.html" target="_blank">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单片机上的移植特性。[page]

  (2)重新编译AVRX内核

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

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

  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高档单片机的医用妇科臭氧治疗仪
下一篇:AVR单片机简介

推荐阅读最新更新时间:2024-03-16 13:40

AVR单片机教程——LCD1602
显示屏 开发板套件里有两块屏幕,大的是LCD(液晶显示),小的是OLED(有机发光二极管)。正与你所想的相反,短小精悍的比较贵,而本讲的主题——LCD1602——功能较少,使用起来也简单很多。 这块屏幕的显示是以字符为单位的。每个字符都是8像素高,5像素宽。1602这个名字,来源于显示字符的数量,共2行,每行16个字符。出售1602的商家提供了一份文档:提取码8c1u。 硬件 一个典型的1602显示屏有16个引脚(还有些模块是用串行总线驱动的): 名称 功能 连接 VSS 电源地 GND VDD 正电源 VCC(5V) VO 对比度调整 左侧的电位器,其左端接GND,右端接VCC RS 数据/指令选择 PB0
[单片机]
<font color='red'>AVR</font>单片机教程——LCD1602
Atmel 推出基于AVR 微控制器的射频发射器
日前,Atmel宣布推出用于遥控车门开关 (RKE)应用的新系列基于 AVR(R) 微控制器的射频发射器 ATA577x。新系列设备作为系统级封装 (System-In-Package,SiP) 或多芯片组件 (Multi Chip Module,MCM) 解决方案,同时采用了 Atmel 知名的 AVR 微控制器 ATtiny44V 和射频发射器 T5750/53/54。这一新的产品系列覆盖所有全球频段(ATA5773: 315 MHz,ATA5774: 433 MHz,ATA5771: 868 至 928 MHz)。小巧型 QFN24 封装(尺寸仅为 5mm x 5mm)可支持以极具竞争力的成本设计制作极小的钥匙扣。 AT
[单片机]
IAR For AVR 关于 comp_a90.h 头文件的使用
使用comp_a90.h头文件时最好包括intrinsics.h头文件,intrinsics.h内在函数提供最简单的操作处理器底层特征。休眠,看门狗,FLASH函数。 /************************************************************** ** - INAVR.H - ** ** Backwards compatibility macros for iccAVR ** ** Used with iccAVR. ** ** Copyright IAR Systems 1999. All rights reserved. ** ** File versi
[单片机]
AVR C语句运行时间测试程序源代码
整个工程下载: http://www.rayfile.com/zh-cn/files/b8f67659-d773-11df-b350-0015c55db73d/f0ec1fdf/ 核心代码: /********** AVR 运行时间测试程序 ********** * 版本.........: 1.0 * 作者.........: 陈利栋 * 目标.........: ATmega128 * 文件名.......: main.c * 编译器.......: IAR for AVR V5.5 * 创建时间.....: 2010.10.14 * 最后修改.....: 2010.10.14 ******************
[单片机]
<font color='red'>AVR</font> C语句运行时间测试<font color='red'>程序</font>源代码
在ARM微处理器上实现Rijndael加密算法
引 言 2000年10月2日,美国国家标准局NIST宣布,比利时密码学家Joat Daemen和Vincent Rijmen设计的“RijndaeI算法”以安全性好、运算速度快、存储要求低、灵活性强最终当选AES。该算法对目前的各种威胁是免疫的。这标志着信息技术有了新的安全工具,为计算机网络和电子商务的发展提供了强有力的保障。 在当前数字信息技术和网络技术高速发展的后PC时代,嵌入式系统技术已经广泛地渗透到科学研究、工程设计、军事技术、各类产业和商业文化艺术以及人们的日常生活等方方面面中,成为目前最热门的技术之一。 本文使用北京博创兴业科技有限公司研制的UP-NETARM300嵌入式开发板,在ARM SDT 2.51集成
[嵌入式]
微处理器与VRM接口的仿真模型
  为了研究元件、线路的寄生参数对VRM瞬态特性的影响,首先要建立-个仿真模型。图1所示为Intel公司Pentium Pro微处理器与VRM接口的仿真模型与瞬态电流的仿真波形。   VRM的输出端有滤波(Bulk)电容CB,解耦电容CD,还有封装(Pakaging)电容CP,各电 容都有相应的ESR和ESL,另外,还要考虑各个电容之间的连接线寄生电阻(如0.5 mΩ)和寄生电感(如0.6 nH)。Cdie为芯片电容iB、iD、iP分别为滤波电容、解耦电容和封装电容输出各支路(即连接线)中的电流。   图1 Pentium Pro 微处理器与VRM接口的仿真模型与瞬态电流的仿真波形   微处理器作为VRM的负载,可
[嵌入式]
英特尔放弃晶圆代工业务,微处理器才是核心重点
昨日,有业内分析师发文称, 英特尔 将关闭其 晶圆代工 业务。 该分析师指出,英特尔在近日的一个产业论坛讨论中宣布正式关闭晶圆代工业务后,他收到了很多电子邮件的询问,但他认为这个消息对他来说并不感到意外,因为他认为英特尔的晶圆代工业务从一开始就是一个错误的想法。 他解释称,英特尔向无晶圆厂开放其领先的制造服务会分散英特尔在制造微处理器方面的核心竞争力。 生态系统是代工业务的一切,与时间、金钱和技术紧密相连,英特尔似乎大大低估了这三件事。 该分析师还拿英特尔为Altera代工来举例,他认为Altera是英特尔定制代工业务的最大受益者,Altera在此之前都是交由 台积电 代工,而失去Altera也给当时的台积
[半导体设计/制造]
英特尔放弃晶圆代工业务,<font color='red'>微处理器</font>才是核心重点
AVR芯片封装图例
[单片机]
<font color='red'>AVR</font>芯片封装图例
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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