AVR单片机的RTOS-AVRX应用

发布者:a407895356最新更新时间:2006-09-26 来源: 单片机及嵌入式系统应用关键字:堆栈  单片机  寄存器 手机看文章 扫描二维码
随时随地手机看文章

引 言

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

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

  AVRX是由lbarello编写的源码公开的嵌入式操作系统,它专门针对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、AvrXIntsetSema-pore、AvrXWaitSemaplaore、AvrXTestSemapIlorc、AvrX-
IntTestSemaphore和AvrxResetSemaphore。


1.3定时器

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

1.4消息队列

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

1.5单步运行支持

  通过重新汇编内核AVRX,可以允许和禁止单步运行的支持。单步运行可以通过编译内核库时定义下面的变量:#define SIGNALSTEPSUPPORT。在能够单步运行以前,进程必须先暂停。有两种方法实现:一是仅仅初始化进程但不使能;二是用目标进程的ID调用AvrXSuspend,一旦目标进程挂起,调试SPI就能使用了。提供的API函数有:AvrxStepNext和AvrXSin-gleStepNext。

1.6系统对象

  AVRX是围绕系统对象的概念而构建的。系统对象包括一个链接和其后面的0个或者若干个字节的数据信号量。进程对象可以根据运行队列和信号量排队。计数器控制块只能根据计数器队列排队。消息控制块只能在消息队列排队。进程根据嵌入对象的信号量等待这些对象。进程堆栈中可用的SRAM是限制系统规模的主要因素,每个进程都需要至少10~35字节的空间来存储进程上下文。提供的API函数如下:AvrXSetObjectSama-phore、AvrXIntObjectSamaphore、AvrXResetObiectSama-phore、AvrXWaitObjectSamaphore、AvrXTestObjectSama-phore和AvrXInfTestObjectSamaphore。

1.7系统堆栈

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


2 AVRX系统的应用
2.1 AVRX在不同型号AVR单片机上的移植
  下面以ATmegM6为例,介绍移植工作。

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

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

  ①重新修改AVRX源码的Makefile文件,需要修改的几处如下:
  ABSPATH=…/avrx/*更改AVRX原路径刊实际路径下*/
  修改 MCU=8535
  AAVRMCU=1
  GCCMCU=at90s$(MICU)
  AVRXMCU=_AT90S$(MCU)_为? ICCMCU=m16
  AAVRMCU=3
  GCCMCU=atmega16
  AVRXMCU=_AT90Megal6_

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

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

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

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

2.2在AVRX上编写应用程序

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

MCU=atmegal6    /*微处理器的名字*/
TARGET=test    /*应用程序文件名*/
GCCLIB=$(AVRX)/avrx/avrx.a
GCCINC=-I.-I$(AVRX)/avrx-I$(AVR)/avr/inc/*加上相关的库*/
SCANF_LIB_MIN=-Wl,-u,vfscanf-lscanf_min
SCANF_LlB_FLOAT= -Wl,一u,vfscannf-lscanl_flt
SCANF_LIB= /*设置sacnf函数库的类型,在不使用时可以
注释掉,这样可以减小编译后的文件太小*/
LDFLAGS+=$(PRIBITF_LlB)$(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单片机的RTOS-AVRX应用

上一篇:AVR单片机的RTOS-AVRX应用
下一篇:轻触式开关电路在AVR单片机中的应用

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

利用16C554实现主从式单片机远距离通信扩展
引言 在交通路口的红绿灯控制系统中,需要将各器口车流量、车速等状态信息时传到主控室,另外,上位主机随时可能下发各种道路控制信息。这种远距离通信常通过 MODEM以点对点的方式进行。常用MODEM通信链路的连接方式有两种。第一种是通过电话以拨号方式完成通信链接。采用这种方式,上位主机与各路口机的距离可无限远,但缺点是每个路口占用1个电话号。由于主机与路口机的通信是频繁的,若不采用专线电话,则难以保证信息收发的实时性;而采用专线连接,势必增加系统成本和设备开销。另一种连接是直接通过调制电缆连接两台MODEM,即背靠背连接。背靠背的连接在数据传输波特率为9600 baud时,通信距离可以达到10 km,完全能够满足中小城市
[单片机]
利用16C554实现主从式<font color='red'>单片机</font>远距离通信扩展
基于单片机的嵌入式SNMP代理器设计与实现
引言   SNMP(简单网络管理协议)应用广泛,功能强大,只要管理软件驻留有MIB(管理信息库),并且拥有适当的权限,管理器就可以访问SNMP代理器。SNMP一般用于计算机网络和电信网络,本文提出了用SNMP进行控制。由于其传输媒介是Internet,所以传输距离不受限制,这相对于其他工业控制总线有不可比拟的优势,SNMP最大的优点是协议简洁,适合嵌入式应用。SNMP体系可扩展性强,只要将新的MIB装载在管理软件上就可以实现对新的终端的控制与访问,本文介绍了一种基于廉价的微控制器的实现嵌入式代理器的方案,以微处理器核心实现相关硬件及软件。 1 SNMP体系结构   SNMP的体系结构(见图1)以简单的查询/回答模型为基础,发
[单片机]
英飞凌AURIX™ TC3xx、TC4x、TRAVEO™ T2G 和 PSoC 系列微控制器支持 Rust 语言
汽车安全与网络安全:英飞凌AURIX™ TC3xx、TC4x、TRAVEO™ T2G 和 PSoC 系列微控制器支持 Rust 语言 【2023 年 4 月 21日,德国慕尼黑讯】 安全系统的开发对汽车市场至关重要。Rust 编程语言可用于内存安全软件的嵌入式开发,这是任务关键型汽车软件设计的一个重要推动因素。 英飞凌科技股份公司迈出了在嵌入式领域构建 Rust 生态系统的第一步,成为第一家正式支持在微控制器上运行Rust语言的头部半导体制造商。英飞凌市场领先的 AURIX™ TC3xx 和TRAVEO™ T2G 车用 MCU将率先支持Rust语言。虽然TRAVEO™ 使用的是 Rust 官方工具链和Arm Cortex
[汽车电子]
英飞凌AURIX™ TC3xx、TC4x、TRAVEO™ T2G 和 PSoC 系列<font color='red'>微控制器</font>支持 Rust 语言
51单片机的中断响应原理
1.中断概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。 2.中断系统结构 引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统。 89C51/52的中断系统有5个中断源 ,2个优先级,可实现二级中断嵌套 。 (P3.2)可由IT0(TCON.0)选择其为
[单片机]
51<font color='red'>单片机</font>的中断响应原理
基于51hei单片机开发板时钟编程(24制)
在51hei-5型单片机开发板上测试成功 http://www.51hei.com/150a.htm ,源代码如下: #include reg52.h #define uint unsigned int #define uchar unsigned char sbit wei=P2^6; sbit duan=P2^7; uchar code table ={0x03,0x9f,0x25,0x0d, 0x99,0x49,0x41,0x1f, 0x01,0x09,0x11,0xc1, 0x63,0x85,0x61,0x71}; void
[单片机]
PIC单片机中断服务程序
中断服务程序有一个特殊的定义方法: void interrupt ISR(void);其中的函数名“ISR”可以改成任意合法的字母或数字组合,但其入口参数和返回参数类型必须是“void”型,亦即没有入口参数和返回参数,且中间必须有一个关键词“interrupt”。 中断函数可以被放置在原程序的任意位置。因为已有关键词“interrupt”声明,PICC 在最后进行代码连接时会自动将其定位到0x0004 中断入口处,实现中断服务响应。编译器也会实现中断函数的返回指令“retfie”。 一个简单的中断服务示范函数如下: void interrupt ISR(void) //中断服务程序 { if (T0IE && T0IF)
[单片机]
51单片机实现数码管通过切换窗口来设置参数
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: LED-74HC595 ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200607 ---- @ModifiedTime: 20200607
[单片机]
51<font color='red'>单片机</font>实现数码管通过切换窗口来设置参数
具有单片机串行接口的汽车电子驱动器
    摘要: MC33298是Motorola公司推出的新型汽车电子驱动器,它具有8路输出,可由8位串行控制。MC33298所具有的独特的串行外设接口(SPI)可以使其和各种单片机直接相连以控制不同的负载。文中介绍了MC33298的特点、功能和工作原理,并给出了它的几种典型的接口应用电路。     关键词: 驱动器 串行接口 单片机 MC22298 1 概述 MC33298是一种较为新颖的汽车驱动器,它具有8路输出的低边功率开关,由8位串行控制。MC33298采用新型集成工艺,内含集成CMOS逻辑、双极性MOS模拟电路和DMOS功率场效应管等多种电路。由于该芯片具有串行外设接口(SPI),所以能和多种单
[半导体设计/制造]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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