关 闭

新闻中心

EEPW首页>工控自动化>设计应用> TinyOS移植技术分析及在CC2430平台的应用

TinyOS移植技术分析及在CC2430平台的应用

作者: 时间:2012-10-23 来源:网络 收藏

1.3的运行机制
的总体框架中,物理层硬件层为框架的最底层,在该层中,传感器、射频收发器以及时钟等硬件均能触发事件(event)发生,交由上层组件处理;软件层中相对下层的组件也能出发事件并交由上层处理,而上层会发出命令(command)交下层处理。为协调各组件间任务的有序处理,需要操作系统采取一定的调度模式。
采用的是事件驱动的两级调度:任务(task)和硬件事件处理句柄(Hardware Event Handlers)。TinyOS使用两种机制支持任务,task和post。task声明必须为无参数的函数声明,执行中的任务都具有原子操作性,任务完成前彼此之间不能被抢占。硬件事件处理句柄被执行去响应硬件中断,可以抢占任务的运行和其他硬件事件处理句柄。TinyOS的任务调度队列只采用最简单的FIFO算法,内核使用一个循环队列来管理任务列表,默认任务列表大小为8。这个任务队列实际上是一个函数指针的数组,提交一个任务即是向队列里插入一个函数指针。任务提交(post)到FIFO队列中等待,当任务队列头索引号等于尾索引号时,表明任务队列为空,系统进入休眠状态并等待,直到新的事件发生。如果新事件向队列中提交了任务,则处理器返回执行状态,TinyOS规定当且仅当任务已经推入队列且没有被执行时post表达式才返回fail,否则将继续休眠。当被事件触发后,TinyOS将中发出信号的事件关联的所有任务将被迅速处理,当这个时间和所有任务被处理完成后,未被使用的CPU将再次被置于睡眠状态而不是积极寻找下一个活跃事件,从而大幅降低了功耗。

2 TinyOS的编译过程
TinyOS的编译系统采用GNU Make,首先将TinyOS程序预编译,形成一个“*.C”文件,然后将这个文件传递给与硬件相对应的编译器。TinyOS的编译系统放于support/make文件夹中,包含各个的配置文件“*.target”和在这个上建立程序的“*.rul es”文件。所以TinyOS的编译系统可以分为两个部分:使用nesC编译的公用部分和针对具体平台的部分。目前TinyOS支持AVR的Mica系列节点,还有基于MSP430芯片的Telos系列及基于PXA27芯片的Imote,而对于目前还在开发中。假设目标平台是MICA,其编译过程如图2所示。

本文引用地址://m.amcfsurvey.com/article/159772.htm

d.JPG


具体进行编译操作时,编译文件根据“TOSMAKE_PATH”变量中所列的路径搜索“*.target”文件。“*.target”文件通常设置一些平台相关变量和提供编译平台的名称,并通过调用“TOSMake_include_platform”指向具体的“*.rules”文件。“*.rules”文件由平台所配备的微处理器决定,因此通常几个平台共用一个“*.rules”文件。如果以命令行的形式给定一个虚拟平台,编译系统会自动寻找“*.ex tra”文件。

3 TinyOS操作系统在上的
3.1的特点
CC2430单片机是TI公司生产的一款专用于IEEE 802.15.4和ZigBee协议通信的片上系统解决方案。它延用了以往CC2420芯片的架构,在单个芯片上整合了ZigBee射频前端、内存和微控制器。它使用1个8位MCU(8051),具有128 kB可编程闪存和8 kB的RAM,还包含模拟数字转换器(ADC)、几个定时器(Timer)、AES128协同处理器、看门狗定时器(Watchdog Timer)、32 kHz晶振的休眠模式定时器、通电复位电路(Pow er on Reset)、掉电检测电路(Brownout Detection),以及21个可编程I/O引脚。CC2430芯片采0.18 μmCMOS工艺生产;在接收和发射模式下,电流损耗分别低于27 mA或25 mA。CC2430非常适合那些要求能耗非常低的,因为它具有休眠模式以及转换到主动模式的超短时间的特性。而无线传感器网络研究的一个核心问题就是节能,因为传感器节点经常需要布置在环境恶劣的无人区,所以能耗问题就成为一个关键问题。由于CC2430的低能耗特性,使其经常作为传感器节点的硬件平台。
3.2过程
TinyOS核心代码经nesC预编译后形成的C文件可以被GCC理解编译。而GCC适用的平台包括telos系列,mica系列和intelmote2系列。但是一些平台如Motorola HCS08,Intel MCS51则不适用于GCC编译。所以将TinyOS到CC2430上的关键问题是,如何使GCC支持MCS-51系列的交叉编译及支持CC2430硬件组件的编写。
在Windows和Linux两大主要平台上有许多8051编译器,其中使用最广泛并且经常进行更新的有2种:KEIL和Small Device C Complier(SDCC)。由于SDCC是一个新兴的开源项目,因此在移植过程中经常会出现许多问题,使一些模块无法正常工作。而且在调试中,SDCC只是简单地驻留在0地址,当单步执行代码时也没有任何调试信息。相比于SDCC,KEIL提供了一套良好的开发调试环境,因此,最终选用KEIL开发工具进行TinyOS的移植工作。
具体流程如下:
(1)根据TinyOS上层组件接口的要求,用nesC语言编写硬件表达层和硬件抽象层文件。
(2)使用TinyOS的NCC编译器将编写的应用程序编译成app.preMangle.c文件。
(3)将app.preMangle.c文件通过perl语言编写的脚本将其原语法转换为CC2430开发环境Keil支持的语法,生成app.c。
(4)利用KEIL开发工具将app.c编译、连接,生成app.hex,再通过SmartRF04 Flash Programmer下载到目标板。
3.3 TinyOS在CC2430上的移植过程
3.3.1 组件编写
由于TinyOS的组件模式是基于不同抽象层组件的系统,当移植到新的平台时,可以通过添加新的底层硬件的抽象并使用已有的上层组件。为实现CC2430的基本功能,需要对各功能模块进行移植,文中移植的功能包括Timer定时器,UART通信,AD采样,射频通信等。具体模块移植方法如下:
(1)通用I/O口。首先要对CC2430的各个接口进行定义,CC2430共有21个可编程的I/O接口,通过设置一组寄存器来控制来控制这些接口作为通用I/O口或者是用作外部电路。在HplCC2430GeneralIOC文件及相关头文件中对各个引脚进行定义。由于需要用到CC2430的UART功能,ADC功能,射频功能以及Timer定时器功能,所以需要对相应的寄存器定义。
(2)UART通信。由于需要向上位机发送数据,所以需要使用CC2430的UART通信功能。CC2430有两个UART接口,分别为UART0和UART1。分别对应CC2430两个I/O接口。选用的UART1,RX和TX对应P0_4接口和P0_5接口,通过SerialByteComm接口实现该功能。在HalCC2430SimpleUartP文件中实现SerialByteComm接口,该接口有两个命令:get和put,分别用来对U1BUF寄存器进行读写。在HplCC2430SimpleUartP文件中对CC24 30芯片串口通信所需要的配置的寄存器各位的值以及波特率等硬件信息进行设置。
在PlatformSerialC文件中对这些接口进行一个封装,并对SerialByteComm接口的put操作作一个判断,如果UART1的8位寄存器U1CSR的最低位为0,说明串口处于空闲状态,这是向串口发送数据,否则串口处于繁忙状态,不进行任何操作。
通过这3层组件对SerialByteComm接口的抽象,实现向串口发送数据的功能。
(3)数模转换。通过传感器感器采集到的模拟信号,需要通过AD转换为数字信号后才能进行下一步的处理。CC2430的ADC有最高14 bit的转换精度,可以采用内部电压或者外部电压。ADCL和ADCH两个8位寄存器存放采样到的数据,其中ADCL的有效位是2到7位,所以有效数据是14 bit。通过对READ接口的抽象实现该组件。在adc.h头文件中配置CC2430的寄存器ADCCON1、ADCCON2、ADCCON3,可以设置转换精度以及采样到的数据传输到芯片的管脚地址。
可以看到这里定义一组宏,对应了寄存器需要的值。这里使用CC2430芯片的单次采样,由于节点使用了外部传感器这里将ADC的参考电压设为外部电压,精度设为14 bit,将P0_4引脚的电压值数模转换后传入芯片处理器。
(4)定时器。CC2430有一个16位定时器Timer1和两个8位定时器Timer3和Timer4,以及一个MAC定时器Timer2。这里完成了Timer1的移植。在HplCC2430Timer1P文件中定制相关配置,通过HplCC2430Timer16接口实现基本的计时功能。
(5)射频模块。传感器节点采集到数据后需要通过无线射频的方式发送出去,这就需要使用CC2430的射频功能。TinyOS通过SimpleMac接口实现该功能,SimpleMac接口可以实现简单的数据收发功能。SimpleMac接口非常适合802.15.4协议,缺点是不支持数据重传和路由功能。在文件HPLCC2430RadioP文件及相关中对CC2430的的寄存器进行读写,HALCC2430RadioP组建对它进行进一步的抽象。
3.3.2 编译过程修改
为使TinyOS的编译系统能够找到目标平台CC2430,我们需要修改它的编译环境。基于TinyOS开源代码的约定,除核心程序外的其余项目开发放在contrib文件中。因此将代码放于cygwin/opt/tinyos-2.x-contrib/ncepu中。这里需要在此文件夹中添加CC2430的编译路径以及具体的编译方法。



评论


相关推荐

技术专区

关闭