⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avrx介绍.txt

📁 这个是我下载的关于AVR运行实时操作系统AVRX的中文文档
💻 TXT
📖 第 1 页 / 共 2 页
字号:
引言

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

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 心得体会

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -