TinyOS的编译系统采用GNU Make,位于support/make文件中,包含各个平台的配置文件“*.target”和在这个平台上建立应用程序的“*.rules”文件。可以分为两个部分:使用nesc编译的公用部分 和 针对具体平台部分。
简略步骤如下
(0) TinyOS应用程序由nesC预编译器编译译形成一个“*.c”文件。(中间都会生成preHandler.pl文件)
nesC预编译器由ncc和nescc两个工具组成(都有PERL语言编写)。
(1) 将这个文件传递给合适的编译器或者工具,也就是针对具体硬件平台的编译器接受。
通常有GCC,它适合于telos,mica,intlmote2系列。但是有一些平台如motorola, inter mcs51则不适合。
具体编译操作时,首先可以参看support/make下的Makerules编译文件中,它根据“TOSMAKE_PATH”变量中所列的路径搜索“*.target”文件。"*.target"文件通常设置一些平台相关变量和提供编译平台的名称。并能过调用“TOSMake_include_platform”指向"*.rules"文件。“*.rules”文件由平台所配置的微处理器决定,因此通常几个平台共用一个“*.rules”文件。
上文所用编译过程的平台限于telos,mica,intlmote2等,下面以不支持GCC编译器的芯片为例来说明。
如CC2430支持的编译器为SDCC,KEIL,IAR。那么处理过程采用KEIL编译器。通过一个脚本程序,将经过nesC预编译生成的TinyOS应用程序转换成可以被KEIL接受的代码,然后送入KEIL编译器,最后下载到硬件,如下
使用PERL语言编写Mangle脚本程序"mangleAppC.pl"文件实现以下功能:1)声明特殊寄存器(SFR)和特殊位变量(SBIT) 2)支持KEIL数据类型;3)去除与GCC有关的内联(inline);4)去除由NesC预编译生成的行编号; 5)用“__”代替“$”作为分隔标识符。6)修改中断向量。如将void_attribute ((interrupt))_vector_5 (void)改为 void _vector_5(void) interrupt 5
一些文件内容和作用:
1) platform:在该文件中说明环境变量信息和基本编译参数,添加平台所用的硬件的代码目录,为nesC建立include路径;.platform文件是用perl脚本语言编写,由ncc解析。
2) hardware.h:该文件 用于对平台进行说明,设置非能用的、只针对平台的标识符,如常量、管脚的名称,以及引用其它的头文件,常包括说明MCU的头文件以及一些需要使用 ;
3) CC2430em.target:target文件的作用主要是让构建系统可以识别出我们移植的目标平台,在文件中需要定义平台名称及相关的变量。以及调用TOSMake_include_platform语句使用的.rules文件的编译规则;
4) Mcs51.rules本文件的内容就是生成目标平台的二进制/十六进制可执行代码时的编译说明,具体包括编译的环境、使用的工具、相关参数以及编译的步骤顺序。
5) Mcs51hardware.h:每个硬件体系都需要定义一组宏,这些宏定义就保存在这个头文件中,该头文件也会被包含在hardware.h中