picl8f系列产品是美国微芯科技公司的高档产品,用户多采用c语言进行编程设计,hi-tech softwarepty.ltd.公司的picc18编译器得到了广泛应用。大部分应用者使用mplab集成环境进行编程(见参考文献),在一些重要或大型应用的开发中有一些问题。例如,如何编写c语言的库文件,如何对有代码限制的程序进行编译等,若只是采用传统方式编程,则达不到应有的效果。本文所阐述的hi-tech c编译器的picc18命令行驱动,正是要解决这些问题。
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 picc18命令行驱动器
picc18是调用dos命令行的驱动器,用来编译和/或链接c语言程序的。picc18的基本命令格式为:
picc18[选项]files[文件库]
通常在文件名之前用破折号“——”来识别,实际上这不是必须的。文件可以是源文件(c或汇编程序)和目标文件的混合。文件库是库名字的一个列表,或一l选项源文件。目标文件和库文件通过文件类型或扩展名被picc18区分,类型如表1所列。
picc18将检查每个文件并完成适当的操作。c文件将被编译,汇编文件将被汇编。最后,所有通过编译或汇编得到的目标文件或者在命令行中明确列出的目标文件,都将与标准运行代码库和任何用户指定库链接,除非它们被某种选项禁止。仅当引用源代码时,库中函数才能被链接成结果输出文件。仅用目标文件(如没有源文件)作为凋用picc18,意味着仅执行链接阶段,这是一种典型的用法。用picc18的c选项编译几个自己编写的源文件作为目标文件,然后仅用生成的目标文件和适当的库(及适当选项)调用picc18来创建最终程序。
2.1 长命令行
picc18驱动器是32位的视窗软什,可以处理超过128字符长的命令行。驱动器可以通过dos的批文件调用,或通过命令文件传递选项。当使用批文件时,送入picc18的命令行必须列成一行。在命令文件中,驱动器选项可以被传送至多行,这是通过一个空格键紧接一个反斜线“\”再接一个回车键来分开各行实现的。例如,一个命令文件可以包含:
因为没有提供命令行指令,因此picc18将读xyz.cmd得到它的命令行指令。命令文件也可以通过@符号读出。
例如:picc18@xyz.cmd
2.2 picc18编译器选项
编译器的设定主要基于rom代码的生成。表2列出了picc18编译器的几个常用的重要选项。
①定义处理器类型:-processor。
这一选项决定了哪个处理器被使用。例如,用命令行-18c452来编泽picl8c452。用户也可以增加自己的处理器到编译器。
②指定rom偏移量:-aaddress。
-a选项是用来为rom映像区指定基地址的。若该选项要求引导输入这样的调试工具,则该词试工具期望rom映射地址始于非零地址。该选项影响所有基于rom的部分,包括复位和中断向量,以及放置代码和常量数据的链接器分类。如果基地址指定到外部存储器,则必须用-rom选项指定外部存储器的可用地址范围。
③优化器及优化优先级选项:-o和-zg。
-o表示调用picc18的优化器,-zg选项在代码生成路径调用全局优先级。这对于代码长度的缩减及内部ram的使用有着重要意义。该优先级没有传递优先级苛刻,但对代码长度的缩减很有意义。在一个执行函数的基础上,全局优先级可以最优化寄存器的使用。它也利用代码中常最的传递来避免不必要的存储器访问。
该选项默认的级为1(最低优先级)。优先级可以设置为l~9的任意一级(9为最高优先级)。数字表明优先级试图缩减代码的程度。对于picc18,高于3的优先级通常没有什么用处。
了解了命令行驱动后,对第1节中在mplab ide中对c源文件进行编译的例子就有了更深入的理解。
3 命令行驱动应用
下面介绍命令行驱动在实际应用中的一些例子。通过这些例子,可以对命令行驱动的应用有一个初步的认识,并可以此为基础,对picc18编译器进行深入的学习和应用。
3.1 命令行驱动编译源文件
在win2000下进行如下操作:执行“开始”→“运行”命令,然后输入“cmd”;或执行“开始”→“程序”→“附件”→“命令提示符”命令,弹出cmd.exe的界面,如图1所示。若cmd.exe中出现的当前目录不是在c盘根目录下,则需要通过输入命令“cd c:\”进入c盘根目录。输入“cd htsoft\picl8\bin”命令,进入picc18.exe软件所在目录 (默认安装时的目录),如图2所示。
(1)编译izqmwyz.c
输入“picc18-18f458 lzqmwyz.c”,含义是使用picc18.exe编译器对lzqmwyz.c源文件进行编译,单片机型号为
18f458(即pic18f458单片机)。这时会输出所需要的编译结果,生成的文件中,以hex为扩展名的lzqmwyz.hex较为重要。若源程序有语法错误,还会显示出错信息及所在的行。
注意:在cmd.exe界面中进行操作时,所有的源文件均存放在picc18.exe同一目录下(picc18.exe默认安装目录是c:\htsoft\pic18\bin)。在本文中,picc18均采用此默认安装目录。这里lzqmwyz.c存放在c:\htsoft\picl8\bin下。
(2)-noerrata选项
“-noerrata”选项不使能输出代码的错误修改,而缺省时,会对编译器的输出代码有所修改。有些芯片没有正误表,不会用编译器对此修改。这个选项可以用编译器来禁止任何正误表方位。当正误表变化时,会安全禁止。对有些芯片(如pic18f458等),picc18对程序的代码长度进行了限制(一般限制在0x4000之内,即16kb之内)。这就是同上的picl8应用论坛中。有些网友提出代码有限制的原因。有些编程者则在程序中编写了下面的提示程序:
若编译的程序代码超出了这个范围,将会列出出错信息。
图3是对solar050408.c源文件编译时,代码超过了ox4000长度时出现的提示信息。
使用-noerrata选项时,solar050408.c源文件编译就会得到正确的编译结果,命令为“picc18-18f458solar050408.c-o-zgl-noerrata”。命令中“-o”表示调用picc18的优化器,“-zg1”表示调用优化器时采用的优先级为1级。
3.2 库文件生成及应用
3.2.1 c源文件
(1)包含main函数的lzqmwyzl.c源文件
(2)包含function_x3函数的funcx3.c源文件
3.2.2 生成库文件
用3.2.1中的两个文件直接创建一个应用程序,这在平时的应用中是经常用到的。这里介绍将funcx3.c源文件生成库文件,再由lzqmwyz.c调用的方法,也就是自己制作库文件进行使用。
(1)生成obj文件
将funcx3.c源文件存放在picc18.exe同一目录下,然后在cmd.exe中输入“picc18-18f458-c funcx3.c”。-c选项是将几个源文件编译成目标文件(.obj文件)。这里是将funcx3.c的源文件编译成funcx3.obj文件,然后就可以在c:\htsoft\picl8\bin目录下找到funcx3.obj文件。
(2)生成lib库文件
在cmd.exe中输入“libr r fun.lib runcx3.obj”。其中r选项为替换模块。fun.lib是由函数funcx3.c制作的库文件的文件名,如图4所示。
3.2.3 库文件应用
图5是使用3.2.1的lzqmwyzl.c源文件和调用3.2.2制作的库文件fun.1ib的工程。这时使用到的就只有lzqmwyzl.c源文件和fun.1ib文件,而不必再应用包含runetton_x3函数的funcx3.c源文件。
结语
picc18编译器命令行驱动在实践中有许多应用,只有了解了它,才能对c编译器有更多、更深入的认识。限于篇幅,本文只起抛砖引玉的作用,提供一种思路供广大编程者参考;同时,对于picc也有相应的参考价值。
智能家居,应避免“用户看热闹”
日韩动力电池企业入华,动力电池产业竞争更加激烈
步进电机零位标定的方法
三星表示下一款旗舰处理器中将会搭载AMD “下一代移动 GPU”
超级电容的应用范围有哪些(一)
HI-TECH C编译器的PICC18命令行驱动
KUKA给整数计数器或者二进制输出端赋值
HDJB-902L微机继电保护测试仪做综合保护装置整组试验
红米Note7Pro体验 同价位产品中性价比比较高
华为彭红华:5G是行业数字化基础,将会创造新价值带来新增长
我国工业软件为何会落后,我国该如何找准机遇
深圳鼎丰大厦通行体系完成数字化升级
USB接口的各种标准对比分析
基于一种抵押加密货币型稳定币WUSD介绍
光宝公布第3季业绩 看好LED与户外照明产业
变频器有几种方式能够获取到信号频率?
无人物流怎么走进日常生活?信息共享和有力监管助力落地
沃尔玛网站因索尼PS5订单过多而崩溃
全球工业机器人部署引发人类就业担忧
断臂求生:探寻索尼未来的救赎之路