分享

基于ARM核处理器的TINYOS实现

 幸福的乐土 2012-04-16
摘要:简要介绍了面向无线传感器网络的操作系统TinyOS及其编程语言NesC的特点,详细分析了TinyOS和NesC的编译链接过程,并以AT91M40800为例给出了基于ARM核处理器芯片的TinyOS的实现.睾
关键词:TinyOS;NesC;操作系统;无线传感器网络
1 引言(Introduction)
无线传感器网络是当前国际上备受关注的、多学科高度交叉、知识高度集成的前沿热点研究领域,它是由大量无处不在的、具有通信与计算能力的微小传感器节点密集部署在监控区域而构成的自治测控网络系统,是能够根据环境自主完成指定任务的“智能系统”,它综合了传感器、嵌入式系统、现代网络及无线通信、分布式信息处理等技术,被认为是21世纪最具影响的21项技术之一.
无线传感器网络主要是面向低速、低功耗的无线应用,其单个节点是典型的资源受限的嵌入式系统,包括微处理器、存储器、传感器、无线射频和电源等模块,需要有对环境的感知、数据发送、甚至命令接收执行以及其它一些网络功能和数据处理能力,因此需要有一个小型的操作系统来组织和管理这些硬件,并完成其软件功能.TinyOS就是美国加州大学伯克利分校针对无线传感器网络而开发的一个小型操作系统。它的事件驱动、基于组件等特点使其在无线传感器网络的研究和应用中得到广泛使用.但它目前运行的平台比较少,主要集中在Atmel公司的AVR系列和TI公司MSP430系列的单片机上,也有PIC C51系列单片机上的实现.本文详细分析了TinyOS编译运行过程,并给出了其在AT91系列ARM核芯片上的实现,便于以后更加深入地研究和应用TinyOS以及无线传感器网络.
2 TinyOSNesC简介(Introduction ofTinyOS and NesC)
TinyOS是由NesC语言编写和实现的,NesC是一种类c语法的、基于组件的编程语言.一个NesC应用程序由许多连接在一起的组件构成,这些组件包括配置组件configuration和模块组件module,每一个相对独立的硬件或软件模块都可以用一个或多个组件来描述,多个下一层的组件还可以连接起来构成上一层更大的组件,而最上层的组件就是系统的应用程序。组件之间通过接El interface进行连接,这些接口是双向的,定义了一簇命令command和事件event.命令由接口的提供者实现,事件的具体操作由接口的使用者实现.TinyOS正是建立在这种组件思想之上,实现了系统应用的可裁减性.针对某一个应用,只需要编译用到的组件,没有用到的组件则不需加入到最终的应用程序中,这种结构非常适合无线传感器网络这种资源受限的嵌入式系统.
TinyOS的调度是由任务和事件组成的,任务可以在组件中抛出,加入到任务列表中,任务之间不能抢占,调度器按照FIFO的规则对建立的任务进行调度,所以任务就是延迟的处理过程.事件用来表示一个splitphase操作的完成或外部环境产生的中断,它可以抢占任务或其它事件.TinyOS的调度机制见图1
TinyOS中的任务和事件均是“运行直到停止”(run-to-completion)模式,没有阻塞操作,对于运行时问较长的任务或操作,进行分段(split-phase)处理,即在调用开始命令之后立即返回,当任务或操作完成时,通过抛出事件的方法来通知上层使用者.这种将操作的请求和操作的完成分开的实现机制,可以获得较高的执行效率.TinyOS的这种基于事件驱动的机制也使其较好地适应了无线传感器网络应用的特点.
3 .TinyOS运行机制(Operational mechanismof TinyOS)
TinyOS提供了Redhat LinuxCygwin两个开发使用环境下的版本,通过make系统进行程序编译、链接和下载的管理.由于它使用全新的编程语言NesC来实现,因此需要了解和分析NesC语言的编译过程.此外,在TinyOS分层的体系结构中包含了一个硬件抽象层,该层向上层组件屏蔽了底层硬件的特性,保证了上层组件的硬件无关性,所以在进行系统移植的时候也需要分析重写该层的组件.下面以mica2硬件平台为例进行分析,mica2平台使用的是AVR系列的ATmega128微处理器芯片.
31 NesC语言程序的编译
NesC程序的编译主要分两步,第一步是.nc文件的分析和转换,在这个阶段内调用NesC自己的编译器ncc,对基于组件思想编写的.nc源文件进行文法、语法分析,检测共享数据冲突等,根据各个组件和接口对其使用的函数和变量进行名字扩展,使其具有全局唯一性,最后把所有的函数和变量都整合到一个主函数main()中,并生成相应的appC文件.此时生成的已经是普通的c语言程序.
NesC源文件使用的函数和变量进行名字扩展的原则如下:
(1)模块组件M中定义的函数F,在生成的c文件中的函数名为F$M
(2)模块组件中的局部变量在生成的c文件中名字不变;
(3)模块组件M中定义的命令或事件c在生成的c文件中定义为M$C
(4)模块组件M中使用的接口I的命令或事件c在生成的c文件中定义为M$I$c
NesC编译器的核心程序是nesc1exe,它在ncc编译器安装的时候生成,负责具体转换NesC源文件,而nesc1exe外围有两个perl语言写的脚本文件nescncc,解释执行时利用ped强大的文法分析能力,把设置的参数放入一个数组,最后执行的命令格式如下:
nesc1exe [OPTION][OPTION][OPTION]…[filename]
ncc可以在不重新编译源文件的情况通过定义环境变量NESCMACHINE来配置一个新的硬件平台.主要定义该平台下的数据类型长度、对齐方式和在第二步中使用的交叉编译器.表1mica2.平台上NESC_MACHINE的定义。
 

 
第二步,在生成appC文件之后,ncc调用gee的交叉编译工具链对该c文件进行编译、链接,最后由下载程序写入Flash.以Blink应用程序为例,其在mica 2平台上的整个编译过程可以如图2所示.
32 硬件抽象层
硬件抽象层在系统中主要用来向上层屏蔽硬件的特性,将上层组件和物理硬件进行隔离,便于系统的移植,TinyOS中和硬件相关的源文件主要有两类:一是各个平台下HPL nc的组件,它们主要是各种物理器件或微处理器内部功能块的抽象,如RF芯片、定时器等,是TinyoS中的BSP部分.二是与硬件平台相关的头文件和.platform.头文件定义了硬件寄存器、相关常数和宏定义等;.platform 文件则是一个平台配置文件,用来配置ncc的一些编译选项.ncc的编译选项与标准gcc是兼容的,gcc下使用的编译选项同样可以用在ncc上.mica2平台下.platform 文件定义如下:
@opts= (-gcc=avr-gcc”,
mmcl- atmega128”.
fne$c-target=avr”.
fnesc-no·debug)
push@opts,“-mingw-gceif$cygwin
@comrnonplatforttl=(mwa128”,“mica”,“avrmote)
头文件中主要定义了以下几个宏和函数:
TOSH ASSIGN_ PIN(mneportbit)
TOSH SIGNAL(signame)
TOSH INTERRUPT(signame)_nesc atomic_t _nesc_ atomic_ start(void)
void nesc_ atomic_ end( nesc_atomic_t oldSreg)
TOSH_ ASSI l-PIN(nameportbit)主要用于分配芯片的IO端口,控制端口的输入/输出、置位/清零以及读取.TinyOS的中断处理部分由TOSH_SICNAL(sname)TOSHINTERRUPT( name)定义,其中sgname是中断类型,在avr-gcc的库中有定义,所不同的是前者定义的中断处理函数,在执行时全局中断是屏蔽的,不能再响应其它中断,而后者定义的中断处理函数在执行时全局中断是打开的,可以响应其它中断.两个函数_atomic_start_sc_atomic_ end则为TinyOS的原子操作atomic提供了保证,它们分别用于关闭和恢复全局中断,TinyOS的组件中若有代码使用了atomic关键词,则在最后编译生成的C文件中进入该部分代码之前先调用nesc_ atomic start关闭全局中断,执行完之后再调用_nesc_ atomic end恢复全局中断,以此保证在该临界代码运行期间不被打断,这两个函数均是用avr汇编语言写的内联函数,以此提高运行效率.
4 基于ARM 核处理器的TinyOS实现(TinyOSimplementation based on ARM)
通过对TinyOS运行机制的分析可知,实现基于ARM核的TinyOS关键就是ncc编译器的移植和硬件抽象层的重写.此外,对于mica2平台,编译时芯片ATmega128的引导程序使用的是avr-libc中默认的,而为了移植到新的微处理器上,芯片的引导部分也需要重写.以ARM核微处理器ARID1M40800为例,TinyOS在此新平台上的实现主要包括以下几部分:
4.1 nee编译器的平台移植
首先是ARM核处理器的交叉编译工具链的选择,由于TinyOS提供的两个使用开发环境是基于LinuxCygwinLinux环境的,因此选用Linux下开发的交叉编译工具链alln_elf_gee,如前所述通过定义环境变量NESC_MACHINEarm_elf-gee引入到ncc中,新的arii1平台配置文件定义如下:
@opts=(.“-fnesc-target=egtv”,
-gcc=arrn-elf-gcc”.
fne,c-no-debug”.
- mthumb-interwork”。
- nostdlib”,
-nostartfiles”。
- $TOSDlRplaiformarmstartupro ld”,
Lstart
_L,4191”,
_L{}TOSDIRplatformarmstartup”。
TOSDIRplatformarmA79l_lib
)
$ENV{NESC_MACHINE}=pointer=44 float=4,‘4double=84 long_ double=84 short22 int=44 long=44 long_long=84 int1248_align=1244 wchar_size_size=44 char_Wchar_signed=falsetrue gcc=arm_elf-gee”;push@opts,“_mingw_gccif $ cygwin
@commonplatfo$= ()
42 芯片引导
每款芯片上电以后的第一条指令的取指地址是固定不变的,这个地址由芯片的硬件设计决定,而下载到Flash中的操作系统的人口地址则是可变的,因此需要一段代码在进入操作系统之前对芯片进行必要的配置工作,使芯片在进入系统之前处于合适的状态,这段代码是严重依赖硬件而实现的.对于TinyOS的移植,由于整个系统最后是和应用整合在一起以一个大的main()函数的形式来运行的,AT91M40800的引导就是保证它从上电后能够正确地从0x00000000地址运行到main()主函数,流程图如图3所示
 

 
芯片引导程序的源代码是cstartupS,为了保证程序能够找到正确的入口地址,还需要重写arnl-elfld使用的链接脚本ldX,该链接脚本建立了内存映射、规定了程序的下载地址和加载地址.最后在arm-elf-ld链接的时候还需要通过一nostdlib-nostartfiles编译选项去掉gcc默认的芯片引导和不必要的库.
43 硬件抽象层定制
32节的分析,硬件抽象层包括与平台相关的头文件和底层硬件抽象的组件,如HPLCIockncHPLUARTOMnc等.头文件中TOSH-ASSIGN-JP,Ⅳ(rtarr-portbi曲定义了以下5个函数,来实现对AI91 M40800芯片通用I0口的操作.
void AI91- SetPio(at91 reg bit)
void AT9 1_ ClrPio(at91_reg bit)
void AT9 1_SetPioAsOut(atgl_reg bit)
void AT9 1_SetPioAslnput(at91-reg bit);
at91_reg AT91_ ReadPio(at9l_reg bit)
_nesc atomic_ start和_nesc atomic_end两个函数也分别用arm汇编进行了重写,分别用来屏蔽和恢复ATglM40800IRQFIQ中断.
然后是中断处理函数的注册,以定义Timer2的中断处理函数为例,ATglM40800的高级中断控制器AIC需要在初始化的时候把Timer2的中断处理函数的地址放到相应的SVR寄存器 J,由于在编译的过程中没有链接arm_elf-gcc的标准库文件,所以需要自己定义Timer2的中断处理函数#define SIG_TIMER2 timer2 c_irq_hand_c之后就可以通过TOSH_SIGNAL(SIG_TIMER2)来定义Timer2中断处理函数的C语言部分实现,而其汇编部分实现如下,在调用timer2_c_irq_handler前后分别进行堆栈的现场保护,在Timer2的初始化函数中只需要要把timer2_asm_irq_handler注册到Timer2对应的SVR寄存器即可.
EXTERN timer 2_c_ irq_handler
GLOBAL timer 2_asm_irq_ handler
timer 2_asm_irq_handler
IRQ_ENTRY
ldr    r 0=timer 2_c_irq_ handler
mov  r14pc
bx    r 0
IRQ_EXIT
硬件抽象层的组件以HPLClocknc的实现为例,它把底层芯片的计数/定时器抽象成一个组件,向上层系统时钟组件TimerC提供了ClockStd-Control两个接口.由于TinyOS系统软定时器的需要,Clock接口应当每1ms产生一个Clockfired()的事件,HPLCIock1112中就通过配置ATglM40800定时器的寄存器来设定定时中断产生的时间间隔以满足要求,此外还要分配定时器中断优先级、中断触发类型、注册中断处理函数等,部分初始化代码如下:
command result_t StdContro1init(){
ptrA1C->A1C_ 1DCR=AIc_TC2_ID
ptrAIC_AIC_s [6]=(unsigned int)
time r2_asm_irq_handler
ptrAIC->AIC_SMR[ AIC_PRIOR_ 4 I
AIC SRCTYPE EXT LOW LEVEL;
PtrAIC->AIC ICCR = AIC_TC2
ptrAIC->AIC_IECR = AIC_TC2__ID
atomic{
rescale=A19I_DEFAULT_SCALE
mintervalAI91_DEFAULT_ INTERVAL
msCounter=O
}
return SUCCESS
}
5 结束语(Conclusion)
本文在详细分析了TinyOS操作系统和NesC语言编译运行过程的基础上,论证了TinyOS移植的可行性,并以ARM核处理器ATglM40800芯片为例实现了TinyOS的一些基本组件.在新的硬件平台下,通过make arnl即可编译链接NesC应用程序,保持了与原mica2平台的兼容性,为无线传感器网络和TinyOS的研究与应用提供了更多的平台选择.
ARM -Based TinyOS Implementation
LIU Hua ,YANG Zhijia
Abstract.This paper briefly introduces the properties of TinyOS(an operating system for wireless sensor networks)and its programming language NesC,analyzes the compilation and link process of TinyOS in detail.and illustrates the TinyOS implementation by taking A'I91 M40800 as the ARM core-based MCU.
Keywords:TinyOS;NesC;operating system;wireless sensor network
作者简介
刘华(1981一),男,硕士生.研究领域为无线传感器网络和嵌入式系统.
杨志家(1968一),男,研究员,硕士生导师.研究领域为工业控制,IC设计和嵌入式系统.
论文来源:信息与控制 2003年4第65第2

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多