PICCl8编译器命令行驱动及其应用

发布者:独行侠客最新更新时间:2007-11-22 来源: 单片机及嵌入式系统应用关键字:链接  周期  调用  偏移 手机看文章 扫描二维码
随时随地手机看文章
引 言

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的使用有着重要意义。该优先级没有传递优先级苛刻,但对代码长度的缩减很有意义。在一个执行函数的基础上,全局优先级可以最优化寄存器的使用。它也利用代码中常最的传递来避免不必要的存储器访问。

该选项默认的级为1(最低优先级)。优先级可以设置为l~9的任意一级(9为最高优先级)。数字表明优先级试图缩减代码的程度。对于PICCl8,高于3的优先级通常没有什么用处。

了解了命令行驱动后,对第1节中在MPLAB IDE中对C源文件进行编译的例子就有了更深入的理解。

3 命令行驱动应用

下面介绍命令行驱动在实际应用中的一些例子。通过这些例子,可以对命令行驱动的应用有一个初步的认识,并可以此为基础,对PICCl8编译器进行深入的学习和应用。

3.1 命令行驱动编译源文件

在Win2000下进行如下操作:执行“开始”→“运行”命令,然后输入“CMD”;或执行“开始”→“程序”→“附件”→“命令提示符”命令,弹出cmd.exe的界面,如图1所示。若cmd.exe中出现的当前目录不是在C盘根目录下,则需要通过输入命令“cd c:\”进入C盘根目录。输入“cd htsoft\picl8\bin”命令,进入PICCl8.exe软件所在目录 (默认安装时的目录),如图2所示。

(1)编译Izqmwyz.c

输入“piccl8-18f458 lzqmwyz.c”,含义是使用piccl8.exe编译器对lzqmwyz.c源文件进行编译,单片机型号为18f458(即PIC18F458单片机)。这时会输出所需要的编译结果,生成的文件中,以hex为扩展名的lzqmwyz.hex较为重要。若源程序有语法错误,还会显示出错信息及所在的行。

注意:在cmd.exe界面中进行操作时,所有的源文件均存放在PICC18.exe同一目录下(PICCl8.exe默认安装目录是c:\HTSOFT\PIC18\Bin)。在本文中,PICC18均采用此默认安装目录。这里lzqmwyz.c存放在c:\HTSOFT\PICl8\Bin下。

(2)-noerrata选项

“-noerrata”选项不使能输出代码的错误修改,而缺省时,会对编译器的输出代码有所修改。有些芯片没有正误表,不会用编译器对此修改。这个选项可以用编译器来禁止任何正误表方位。当正误表变化时,会安全禁止。对有些芯片(如PIC18F458等),PICCl8对程序的代码长度进行了限制(一般限制在0x4000之内,即16KB之内)。这就是同上的PICl8应用论坛中。有些网友提出代码有限制的原因。有些编程者则在程序中编写了下面的提示程序:

若编译的程序代码超出了这个范围,将会列出出错信息。

图3是对solar050408.c源文件编译时,代码超过了Ox4000长度时出现的提示信息。

使用-noerrata选项时,solar050408.c源文件编译就会得到正确的编译结果,命令为“piccl8-18f458solar050408.c-o-zgl-noerrata”。命令中“-o”表示调用PICCl8的优化器,“-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源文件存放在PICCl8.exe同一目录下,然后在cmd.exe中输入“PICCl8-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源文件。

结语

PICCl8编译器命令行驱动在实践中有许多应用,只有了解了它,才能对C编译器有更多、更深入的认识。限于篇幅,本文只起抛砖引玉的作用,提供一种思路供广大编程者参考;同时,对于PICC也有相应的参考价值。

关键字:链接  周期  调用  偏移 引用地址:PICCl8编译器命令行驱动及其应用

上一篇:基于P87LPC762单片机的电子计时牌设计
下一篇:基于飞思卡尔MCU的AEC算法实现

推荐阅读最新更新时间:2024-03-16 12:22

MSP430F5438A 指令周期 和 时钟周期
MSP430的一个时钟周期 = 晶振的倒数。如果晶振是8M,则一个时钟周期为1/8微秒; 一个机器周期 = 一个时钟周期,即430每个动作都能完成一个基本操作; 一个指令周期 = 1~6个机器周期; 也就是说执行一条指令最多花6*1/8微秒。 另外,_NOP()是单周期的指令,I/O口赋值是4周期的。
[单片机]
STM32开发笔记80: 在构造函数中调用延时函数应注意的问题
单片机型号:STM32L053R8T6 W5500驱动程序完成后,运行时,单片机死机。W5500驱动程序先前已经在项目中具体应用过,运行的比较稳定。这次移植后,没有做改动,但是单片机运行时死机。 此项目与先前项目的不同点在于,项目中有FreeRTOS操作系统运行,原先的项目没有,最后将问题聚焦于W5500的构造函数上,如下程序所示: CW5500::CW5500(void):CSpi() { //uint8_t memsize = {{2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}}; //注册相关的函数 reg_wizchip_cris_cbfunc(w5500_cris_enter
[单片机]
C语言函数的调用
在一个程序的编写过程中,随着代码量的增加,如果把所有的语句都写到 main 函数中,一方面程序会显得的比较乱,另外一个方面,当同一个功能需要在不同地方执行时,我们就得再重复写一遍相同的语句。此时,如果把一些零碎的功能单独写成一个函数,在需要它们时只需进行一些简单的函数调用,这样既有助于程序结构的清晰条理,又可以避免大块的代码重复。 在实际工程项目中,一个程序通常都是由很多个子程序模块组成的,一个模块实现一个特定的功能,在 C 语言中,这个模块就用函数来表示。一个 C 程序一般由一个主函数和若干个其他函数构成。主函数可以调用其它函数,其它函数也可以相互调用,但其它函数不能调用主函数。在我们的 51 单片机程序中,还有中断服务函数,是
[单片机]
ARM-GCC对于函数指针调用的编译有错误?【已经找到原因】
函数指针是实现回调函数的基础,回调函数是C程序架构的基础。所以函数指针的重要性不言而喻。然而最近在ARM开发板上测试程序时,发现函数指针虽然能编译通过,但是运行时确总是报错。如下是一个最简单的测试程序源码。 static void test() { puts( testn ); } static void(*f)() = test; void Main(void) { led_init(); key_init(); io_init(0); f(); while(1){ puts( -------hello from main()----------n ); delay(100
[单片机]
4*4矩阵键盘模块程序的调用
产生.lib文件的方法:选择 工程 目标target属性 输出 产生库文件*.lib,修改完后,编译一下程序,无措后,就在工程目录下产生一个.lib文件,到时要用到这个模块程序时,直接把.c和.lib文件拷贝到所在的目录下,再把.c的文件加载到工程文件里就OK了。 /* *************************************************************************************** 摘 要: 4*4小键盘模块程序,供以后其他程序调用.其中P2口高四位接键盘列,P2口低四位接键盘行, 版 本: V1.0 完成日期: 2008.4.28 作 者: ZHOUSFE
[单片机]
应对有序用电的短周期应急交易市场(品种)设计
中国储能网讯: 叶泽 长沙理工大学教授 近年来,电力负荷尖峰化引起有序用电的现象日益严重,部分地区出现了一定程度的电力供应紧张,甚至要采取拉闸限电、有序用电的措施。 以南方电网五省区为例,负荷尖峰化现象有四个明显体征。一是负荷尖峰化的规模持续增加,3%尖峰负荷615万千瓦,5%尖峰负荷1025万千瓦;二是累计持续时间短,3%尖峰负荷持续时间不超过30小时,5%尖峰负荷持续时间一般不超过100小时;三是电量少,3%尖峰负荷电量占比大多不超万分之七,5%尖峰负荷电量占比一般不超过千分之四;四是单次持续时间短、出现频次低,5%尖峰负荷单次持续时间最长为3-6小时,全年出现频次10-40次;3%尖峰负荷单次持续时间最长为2
[新能源]
今年AI芯片需求狂潮不减 半导体供应链接单强劲
2017年全球半导体产业受到存储器价格上扬、虚拟货币高涨、数据中心与云端企业因应人工智能(AI)应用大幅采用绘图处理器(GPU),以及电竞比赛普及等带动,整体营收及获利明显增长,展望2018年全球半导体产业规模仍将持续成长,尽管未必能够再现2017年两位数的增长幅度,但仍有不少科技发展将对半导体产业带来正面影响,包括10纳米制程、自驾车、5G、虚拟实境∕扩增实境(VR/AR)等,其中又以AI发展备受业界瞩目。   2018年AI应用将进一步跨越各垂直领域范畴,并扩大影响半导体产业发展,不仅手机品牌大厂苹果(Apple)、三星电子(Samsung Electronics)纷在智能手机中导入AI功能,全球无人机商用市场亦将在AI驱动下
[半导体设计/制造]
ST 推出世界第一个90nm内置闪存的安全型微控制器
注重成本效益的智能卡解决方案有助于卡制造商缩短生产准备时间,简化供应链管理,消除ROM掩模成本 中国,2007年11月7日 — 意法半导体(纽约证券交易所: STM)今天推出一个新的内置闪存的安全型微控制器(MCU),该产品是世界第一个采用90nm (90纳米)制造工艺的微控制器。ST21F384是ST成功的ST21智能卡平台内的第一款安全型微控制器,是为2.5G和3G移动通信优化的产品。新产品改用闪存做程序存储器,淘汰了以前的掩膜ROM,提高了产品制造的灵活性,缩短了从设计到制造的准备时间,同时90nm技术还提高了成本效益。 新的ST21F系列产品使卡制造商能够对飞速变化的手机市场需求做出快速的注重成本效益的反应,然后在制
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved