汽车电子expert成长之路

本博客发布的个人原创精品----嵌入式系统技术文章,欢迎大家参考学习,并转发分享!

CodeWarrior IDE使用Tips-如何编译生成和调用静态库

0
阅读(3084)

内容提要

引言

1. 嵌入式MCU应用程序开发中的库使用和使用用静态库的好处

2. 在CodeWarrior 5.x和CodeWarrior 6.x IDE中利用Libmaker for S12/S08编译生成和调用静态库

3. 在CodeWarrior 2.10 IDE中编译生成和调用静态库

4. 在CodeWarrior 10.6/7 IDE中编译生成和调用静态库

总结


引言


在嵌入式系统的C语言开发中,我们常使用到各种库(library),比如常见的ANSI标准库--其常包含对ANSI C语言环境的初始化(全局变量初始化和堆栈初始化)以及对字符串、数学运算、浮点数计算等处理和实现的标准函数以及电机控制库--包含基于汇编指令优化的三角函数、FIR/IIR滤波器以及Park、Clark变换/逆变换和SVM等,这样的库是事先使用相应的工具链编译好的目标文件(等同于.obj文件)。


生成静态库的工程仅是对其包含文件进行编译,并将编译的目标文件整理和收集在一个最终的库文件中,不包含链接过程,所以生成库的工程无需链接文件、启动文件,main()函数、中断向量表和MCU外设头文件,不会链接生成elf文件和NVM编程文件,不可以直接下载调试,CodeWarrior IDE中静态库文件后缀名一般为为.lib(如CodeWarrior 5.x和CodeWarrior 6.x)或者.a(如CodeWarrior 2.10和CodeWarrior 10.6/7中Qorivva MPC56xx MCU的编译结果)。


1. 嵌入式MCU应用程序开发中的库使用和使用用静态库的好处


默认的嵌入式MCU应用工程中,在其新建工程时就默认添加了针对目标MCU的I嵌入式ANSI C语言库(位于工具链安装目录下),用于完成应用程序ANSI C语言环境的初始化(全局变量初始化和堆栈初始化)以及对字符串、数学运算、浮点数计算等处理的标准函数的工具链MCU平台优化实现;

2.jpg

在嵌入式MCU应用程序开发时,除了使用默认的ANSI C标准库,用户还可以自己开发和调用自己的专用库,使用库的好处如下:


a. 将程序开发功能模块化,将一些常用的算法或者通用外设驱动做成库文件,使其标准化,既便于维护升级,也可提高团队的开发效率;


b.以库的方式而非源代码形式提供给客户或者团队成员使用,可以有效保护核心算法等知识产权;


Tips:在x86的PC上,C编程用到的库,可以分为静态库和动态库两大类:

静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。


动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。Windows下动态库为.dll后缀,在linux在为.so后缀。

程序编译一般需经预处理、编译、汇编和链接几个步骤。静态库特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。

静态库和动态库是两种共享程序代码的方式,它们的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存。


在嵌入式MCU的开发中,一般仅支持静态库。


下面我就介绍一下在CodeWarrior IDE中如何编译生成用户自己的静态库文件并调用:


2. 在CodeWarrior 5.x和CodeWarrior 6.x IDE中利用Libmaker for S12/S08编译生成和调用静态库


在CodeWarrior 5.x和CodeWarrior 6.x IDE中创先新工程时,只能创建应用工程,无法直接创建库工程,所以需要在应用工程的基础上修改工程设置,利用Libmaker for S12(CodeWarrior 5.x)和Libmaker for S08(CodeWarrior 6.x)来编译生成静态库,这里仅有CodeWarrior 5.1为例进行介绍,其方法适用于CodeWarrior 6.x。

具体步骤如下:


Step 1: 创建一个库工程


a.按照CodeWarrior 5.1 IDE的新建工程向导,创建一个名叫Project_S12G_lib的应用工程;

b.将其默认添加的所有文件删除,包括链接文件,启动文件和标准库文件等;

c.添加需要编译到该静态库中的源文件(*.c)和头文件(*.h),本例中仅添加lib.c和lib.h,实际使用中,可以添加多个.c和.h文件;


源文件(*.c):定义函数和变量

头文件(*.h):申明函数和变量给应用工程师调用,也可以通过external申明和使用外部变量;

3.jpg

Step 2: 设置工程的链接器(Linker)为 Libmaker for HC12

打开工程属性,Target-->arget Settings-->Linker : 下拉选择Libmaker for HC12(默认为Linker for HC12),如下图:

4.jpg

Tips:在CodeWarrior 5.x中还支持对XGATE协处理器生成静态库。


然后继续设置:Target-->Target Settings--> Libmaker for HC12 :输入静态库名字.(这里以myLib.lib为例,默认为out.lib)


5.jpg

Step3: 编译生成静态库文件,其结果位于工程根目录下的bin子目录文件夹,如下图:


6.jpg

Step4:  使用静态库


首先,需要手动将以上生成的库文件(myLib.lib)和相应的头文件(lib.h)拷贝到需要调用该库的应用工程(这里为Project_S12G_lib_test)源程序文件夹下:


7.jpg

PS:如果需要调用多个库,则需要将相应的库及其头文件全面拷贝到应用工程可以访问的文件目录下


然后,将库文件和相应的头文件添加到应用工程中,并在需要调用该库中函数或者变量的.c或者.h文件中使用include包含相应的头文件,这样就可以调用该库的中的函数或者变量了(此例中为在main.c中调用myLib.lib库中的 MyLib_Add () 函数实现返回两个输入参数相加的结果):

8.jpg

以下为下载调试运行的结果:

9.jpg


10.jpg


Tips:注意,如果在本地电脑上编译生成静态库的源文件没有删除或者移动到其他文件夹,还保留在原路径文件夹的话,调试应用工程的时候可以单步进入看到库函数的源代码(文件),这是一种调试静态库的方法。

11.jpg


3. 在CodeWarrior 2.10 IDE中编译生成和调用静态库


CodeWarrior 2.10 IDE在新建工程时与CodeWarrior 5.x和CodeWarrior 6.x IDE一样,无法直接创建可以生产静态库的工程,所以其编译和调用静态库的方法根上面讲的差不多,唯一的差别在工程属性设置不同:


将Target-->EPPC Target-->Project Type改为Library(默认为Application)并指定输出静态库的名字,即可在工程目录下生成相应的.a文件:

12.jpg



4. 在CodeWarrior 10.6/7 IDE中编译生成和调用静态库



CodeWarrior 10.6/7 IDE中新建工程时,有相应的选项可以支持直接创建静态库工程,所以非常方便:


Step1:File-->New-->Bareboard Project打开新建工程向导:


13.jpg


Step2:输入工程名-->Next:

14.jpg


Step3:选择正确的part number(对应不同的工具链),将工程类型/输出(Project Type/Ouput)设置为Library(默认为Application,即创建应用工程,会调用链接器生成一个完整可以下载执行的elf文件以及编程文件)-->Finish,即可:

16.jpg


在生成的工程中,默认就没有启动文件、链接文件和main.c以及ANSI标准C语言库文件,将用户自己需要添加到库中的源文件和头文件加入,编译即可生成相应的库文件:

17.jpg


Tips:CodeWarrior 10.6/7 IDE中应用工程调用静态库时,除了需要手动拷贝库文件和头文件到应用工程目录下,并添加到应用工程中,还需要在工程属性设置中告诉链接器(linker)该库文件所在的路径和库名字,才能正常被应用工程访问:

18.jpg



总结


本文介绍了如何利用CodeWarrior IDE编译生成静态库并调用的方法和详细步骤。不同的IDE其方法不一样,比如CodeWarrior 2.10/5.x/6.x IDE在工程创建向导中没有相关的选项设置可以直接生成编译静态库的工程,所以需要在新建应用工程的基础上手动删除应用工程默认添加的链接文件、启动文件、main.c和MCU外设头文件以及标准库文件等,并手动设置工程属性中linker选项,才能编译生成库文件,较为麻烦,而CodeWarrior 1.6/7 IDE则可以直接新建编译库的工程,所以使用较为方便。


在编译和使用静态库时,需要注意以下两点:


  • 编译静态库的工程和调用静态库的工程,其MCU part number和编译器(compiler)设置需要一样,才能保证编译的库能够被正常调用;

  • 使用时,静态库文件和相应的函数和变量声明头文件必须一起拷贝并添加到要调用该库的应用工程中;