网上关于TinyOS在CC2430上移植的文章到处都是, 8051工作组提供了最新版本的TinyOS8051wg-0.1pre4.tgz 软件包。但是,我个人觉得,这个资源包仅仅是实现了TinyOS能够运行于CC2430这样的以8051为内核的SOC上,只是告诉世人TinyOS能够支持当前最流行的无线单片机。。。比如,USART,只是在HalCC2530SimpleUartP.nc文件中实现了最简单的串口收发功能,不知道这样的系统能够应用于哪些场合。想要真正意义上的实现TinyOS对CC2530的完全支持,那么,就应当充分体现TinyOS的特点,要彻底改变目前普通顺序式结构,采用事件触发以及任务调度实现“并行操作”。
效仿TinyOS在MSP430上USART功能的实现,应用资源仲裁合理分配硬件资源。总体架构如下所示:(以端口P0上的SPI模式0为例)
供外部调用的顶层配线CC2530SpiP00C提供的给应用程序调用的接口有SpiPacket、SpiByte、Resource,资源申请以及资源配置通过配件CC2530UsartP00C连接到CC2530UsartShareP00P。使用的
接口CC2530SpiConfigure由调用者提供,用于配置SPI工作模式,当接口没有给出实现时,采用默认配置。中间配件CC2530UsartP00C如下图所示:
该配线把上层掉用的资源申请以及资源仲裁任务连接到配件CC2530UsartShareP00P上,如下图:
本层完成了资源申请与仲裁的配线,中断接口连接到CC2530UsartShareP组件上进行统一管理,中断源取决于所连接的底层配件,并由组件HplUsartInterruptP提供硬件中断,该中断触发硬件描述层中的事件,此例HplCC2530Usartp00P组件中事件将被触发。HplCC2530Usartp00C配线如下图所示:
该层属于硬件描述层,最终实现USART接口的相关操作。提供的接口主要有HplUsart、
HplUsartInterrupts。HplUsart接口实现寄存器配置,接收/发送缓冲区的读写,以及中断使能、标志位的清除等。HplUsartInterrupts对上次提供供USART中断信号,由组件HplUsartInterruptP中的硬件事件触发。使用的接口包括I/O引脚的配置、中断源的选择。接口Leds用于调试。在TinyOS for CC2430中并没有给出HplCC2530GeneralIo接口的实现,给接口除了给CC2530GpioC中的GeneralIO接口连接外,还提供了IO引脚第二功能的选择及判断。
为了便于调试,使用原有的StdOut接口,该接口独立与上述USART接口模型,只有硬件中断共用。顶层配件StdOutC平台相关,所以连接到位于平台目录下的PlatformStdOutC,如下图;
硬件适配层HalCC2530SimpleUartP提供接口SerialByteComm,实现串口的基本操作。使用的接口SimpleUartConfigP位于平台目录下,实现对串口的配置。HalCC2530SimpleUartC配线如下图所示:
到这里基本上实现了CC2530 USART模块在TinyOS上的移植。CC2530分别提供了4组SPI和UART,所以在具体实现中,分别提供4组顶层配线:SPI:CC2530SpiP00C、CC2530SpiP01C 、CC2530SpiP10C、CC2530SpiP11C,UART: CC2530UartP00C、CC2530UartP01C、CC2530UartP10C、CC2530UartP11C。这种方式的优点在于思路清晰,使用简单,不易出错,其缺点也是显而易见的:当使用多组SPI或UART时,代码重用率较低,占用内存较大。