PICCl8编译器命令行驱动及其应用
引 言
PICl8F系列产品是美国微芯科技公司的高档产品,用户多采用C语言进行编程设计,HI-TECH SoftwarePty.Ltd.公司的PICCl8编译器得到了广泛应用。大部分应用者使用MPLAB集成环境进行编程(见参考文献[1]),在一些重要或大型应用的开发中有一些问题。例如,如何编写C语言的库文件,如何对有代码限制的程序进行编译等,若只是采用传统方式编程,则达不到应有的效果。本文所阐述的HI-TECH C编译器的PICCl8命令行驱动,正是要解决这些问题。
1 HI-TECH C编译器
HI-TECH C编译器提供了C语言的标准特性,同时还加上许多为了适应PIC系列单片机的特定硬件特性而设计的扩展功能,并与汇编器集成在一起提供共享链接器和库管理工具,因而应用较为广泛。
当编译一个程序时,就有许多操作既可由命令行驱动程序CLD(command-line driver),也可由HPD集成环境驱动程序(觋在为HI-TIDE)独立完成。在任一情况下,HPD或CLD(HPD下的菜单选项,或CLD的命令行)采用编程者指定的选项来决定哪一个内部应用需要执行,以及什么选项需要发送给每个应用。
用户提供的适合于目标系统的C语言源程序、汇编语言程序,都可以用CLD或HPD进行操作。当用CLD时,用命令行的任何命令来选择操作方式;当使用HPD时,在源文件列表对话框中键入需要的文件。
通常使用的源程序可以被编译到一个库文件中,这样文件可被编译器更方便地处理、更快速地访问。编译器可以像其他源文件一样直接接收库文件,并用.lib扩展名指定文件的类型,因而库文件必须按这种方式命名。库文件在使用CLD时,用命令行的任何命令来选择操作方式;或使用HPD时,在"源文件列表…"对话框中键入需要的库文件。
实际上,在使用MPLAB IDE集成环境进行开发时,是使用了CLD的,只是在平常的应用中没有注意到而已。下面是在MPLAB IDE中对C源文件进行编译的结果:
从上面的结果可以看出,编译器使用了CLD命令,二者是可以统一。只有了解了CLD后,才能对HI-TECHC编译器有更深入的理解和掌握。
2 PICCl8命令行驱动器
PICCl8是调用DOS命令行的驱动器,用来编译和/或链接C语言程序的。PICCl8的基本命令格式为:
piccl8[选项]files[文件库]
通常在文件名之前用破折号"--"来识别,实际上这不是必须的。文件可以是源文件(C或汇编程序)和目标文件的混合。文件库是库名字的一个列表,或一L选项源文件。目标文件和库文件通过文件类型或扩展名被PICCl8区分,类型如表1所列。
PICCl8将检查每个文件并完成适当的操作。C文件将被编译,汇编文件将被汇编。最后,所有通过编译或汇编得到的目标文件或者在命令行中明确列出的目标文件,都将与标准运行代码库和任何用户指定库链接,除非它们被某种选项禁止。仅当引用源代码时,库中函数才能被链接成结果输出文件。仅用目标文件(如没有源文件)作为凋用PICCl8,意味着仅执行链接阶段,这是一种典型的用法。用PICC18的C选项编译几个自己编写的源文件作为目标文件,然后仅用生成的目标文件和适当的库(及适当选项)调用PICCl8来创建最终程序。
2.1 长命令行
PICCl8驱动器是32位的视窗软什,可以处理超过128字符长的命令行。驱动器可以通过DOS的批文件调用,或通过命令文件传递选项。当使用批文件时,送入PICCl8的命令行必须列成一行。在命令文件中,驱动器选项可以被传送至多行,这是通过一个空格键紧接一个反斜线"\"再接一个回车键来分开各行实现的。例如,一个命令文件可以包含:
因为没有提供命令行指令,因此PICC18将读xyz.cmd得到它的命令行指令。命令文件也可以通过@符号读出。
例如:
PICCl8@xyz.cmd
2.2 PICCl8编译器选项
编译器的设定主要基于ROM代码的生成。表2列出了PICCl8编译器的几个常用的重要选项。
①定义处理器类型:-processor。
这一选项决定了哪个处理器被使用。例如,用命令行-18c452来编泽PICl8C452。用户也可以增加自己的处理器到编译器。
②指定ROM偏移量:-Aaddress。
-A选项是用来为ROM映像区指定基地址的。若该选项要求引导输入这样的调试工具,则该词试工具期望ROM映射地址始于非零地址。该选项影响所有基于ROM的部分,包括复位和中断向量,以及放置代码和常量数据的链接器分类。如果基地址指定到外部存储器,则必须用-ROM选项指定外部存储器的可用地址范围。
③优化器及优化优先级选项:-O和-Zg。
-O表示调用PICC18的优化器,-Zg选项在代码生成路径调用全局优先级。这对于代码长度的缩减及内部RAM的使用有着重要意义。该优先级没有传递优先级苛刻,但对代码长度的缩减很有意义。在一个执行函数的基础上,全局优先级可以最优化寄存器的使用。它也利用代码中常最的传递来避免不必要的存储器访问。
- 嵌入式软件工程师必须知道的:volatile的作用(05-01)
- SPARC高性能处理器集成开发环境及其编译器设计与实现(02-14)
- 编译原理 —— 编译器各阶段工作(02-14)
- ARM体系结构下的程序设计经验(08-03)
- Linux下C编程基础之:gcc编译器(08-13)
- 高效的C编程之:C编译器及其优化(08-30)