历史上的今天
返回首页

历史上的今天

今天是:2025年02月22日(星期六)

2020年02月22日 | AVR单片机的RTOS-AVRX应用

2020-02-22 来源:eefocus

简介:AVRX是一个不错的RTOS,最显著的特点就是内核小,速度快,编译后大概只需500~700字节,且基本的调度功能一个也不少。由于其代码公开,结合不同型号AVR单片机的特性,可以在此基础上进行系统的裁减和扩展,使之能达到更好的效果,本文为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文件,需要修改的几处如下:


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嵌入式系统的应用提供了借鉴。

推荐阅读

史海拾趣

Diotec Electronics Corp公司的发展小趣事

Diotec Electronics Corp公司成立于XXXX年,由一群富有激情的工程师和技术专家创立。在初创期,公司专注于研发高性能的电子元器件,以应对当时市场上对高效率和可靠性元件的迫切需求。通过不断的技术创新,Diotec成功开发出了一款具有革命性的整流二极管,该产品以其卓越的性能和稳定性迅速赢得了市场的认可,为公司的发展奠定了坚实的基础。

EXCELTA公司的发展小趣事

随着公司规模的扩大,产品质量的稳定性成为制约Excelta进一步发展的瓶颈。为了解决这一问题,公司决定引入先进的质量管理体系,并投入大量资源进行培训和改造。经过不懈的努力,Excelta的产品质量得到了显著提升,客户满意度也大幅提高。这一转变不仅为公司赢得了更多的订单,还奠定了公司在行业中的领先地位。

Ememory Technology Inc公司的发展小趣事

除了自主研发外,eMemory还积极寻求与外部合作伙伴的联合研发。在2016年,eMemory与马来西亚的半导体晶圆代工厂Silterra联合宣布,基于Silterra 0.18微米CMOS制程技术的一次性可编程(OTP)存储器已经通过了验证。这一合作不仅证明了eMemory技术的先进性和可靠性,还为双方带来了新的市场机遇。

Fairchild (ON Semiconductor)公司的发展小趣事

在发展过程中,Fairchild Semiconductor也经历了多次收购与整合。这些收购不仅为Fairchild带来了更多的技术和资源,也进一步巩固了其在半导体行业中的领导地位。然而,随着市场竞争的加剧和技术的不断更新换代,Fairchild也面临着越来越多的挑战和机遇。

CAMBION公司的发展小趣事

CAMBION公司自成立以来,始终将技术创新作为核心驱动力。在早期,公司研发团队成功开发了一款具有革命性的芯片技术,显著提升了电子设备的处理速度和能效。这一技术迅速在行业内引起关注,为CAMBION赢得了大量订单和合作伙伴。随着技术的不断完善和应用范围的扩大,CAMBION逐渐在电子行业中崭露头角。

ABI Electronics公司的发展小趣事

随着电子行业的快速发展,集成电路测试成为了ABI Electronics公司新的增长点。ABI团队针对集成电路的复杂性和多样性,开发出了先进的集成电路测试仪。该测试仪具备高精度、高可靠性、高自动化等特点,能够快速准确地检测集成电路的性能和故障,为集成电路的生产和研发提供了有力的支持。

问答坊 | AI 解惑

adroid 新成员smart Q5

q5,说实话,自己的系统以及后来的windows ce6都很烂,小日本开发的covia android rom很不错, 加入安卓系统咯,呵呵 …

查看全部问答>

比较两个FPGA方向区别?

高层设计/验证测试容易化 (验证) 和 ASIC自动设计 IP应用 这个两个方向具体研究领域,请大虾指教…

查看全部问答>

DMA模式什么意思啊?如何应DMA接收串口数据?

DMA模式什么意思啊?如何应DMA接收串口数据?…

查看全部问答>

vs2005 mfc工程移植入windows mobile

写的一个很简单的拼音输入程序,想植入windows mobile。我自己水平不行,希望哪个牛人帮忙做一下。愿意帮忙的留下邮箱,我发过来。…

查看全部问答>

关于Windows XP Embedded中所要功能的对应组件的问题

大家都知道Windows中有11000个组件,但是在制作XPE时,大部分的组件是不需要的,不知道各位在制作过程中有没有碰到想要Windows有一些功能,但是不知道如何在这么多的组件中找出相应的组件。比如需要XPE中支持windows 任务管理器(Ctrl + Alt + Delet ...…

查看全部问答>

请教做过270的camera驱动的大侠

最近一直在搞pxa270的camera的驱动,用的是ov2640,ov9653,现在遇到了一个奇怪的问题,就是YUV预览的时候,我设置dma直接从quick capture的3个数据寄存器到LCD的frame buffer。如果不去读pxa 270 quick capture那边的那3个数据寄存器的话,LCD上只 ...…

查看全部问答>

【问】哪里有repllog.exe下载?

想把PPC与PC通过串口连接同步(PPC上用的是CF转RS232 的连接卡) 但PPC上找不到repllog.exe ,不知哪里可以下载到? (目前可以通过USB同步传送文件) PPC型号是COMPAQ 3630 …

查看全部问答>

支持全系列STCortex-M3STM32Fxx的ARM开发工具

ARM公司和英蓓特公司今年5月底推出的RealView MDK中国版,共分3个版本:大众版2500元/套;企业版4600元/套;专业版8000元/套。可以支持全系列ST公司的ARM芯片,包括:最新的Cortex-M3  STM32系列芯片,还有ST公司以往发布的ARM ...…

查看全部问答>

【求助】求助,程序上的问题

/*目的是按下按键则蜂鸣器就发出声音,电路板是msp430F169的学习板*/ #include <msp430x16x.h> #define NO_KEY 0 //没有案按键 #define KEY_K1 1 //按键1 #define KEY_K2 2 //按键2 #define KEY_K3 3 //按键3 #define STEP_IDEL ...…

查看全部问答>

AVR学习入门

请问谁有好的视频学习资料??…

查看全部问答>