第3节 08C工程文件组织
推荐给好友
打印
加入收藏
更新于2008-07-25 09:48:37

第一个08C工程”PrgFrame.prj”给出了Freescale MCU C编程框架,同时它也是一个很好的编程规范示例。图5-7是PrgFrame.prj的文件组织状态图。该工程的功能是通过普通I/O口控制发光二极管闪烁,它对应于上一章同名汇编工程,请读者参照阅读。

关于总头文件、主程序文件、芯片相关文件、通用文件和面向硬件对象文件这些概念已在相应的汇编工程中介绍过,这里不再详细阐述。下面将结合第一个08C工程实例“PrgFrame.prj”,详细分析08C工程的组成、C程序文件的编写规范、软硬件模块的合理划分等。希望读者通过认真分析与实践第一个实例程序,达到HC08系列C语言编程入门的目的。


1.芯片相关的程序文件

PrgFrame.prj工程中芯片相关的程序文件包括:GP32映像寄存器名定义头文件(GP32C.h)、开放或禁止MCU模块中断头文件(EnDisInt.h)、芯片初始化文件(MCUinit.c)和中断处理子程序与中断向量表文件(Vectors08.c)。
(1) GP32C.h
该文件与芯片相关,不要修改。具体内容参见附录C.2。

(2) EnDisInt.h
开放或禁止MCU模块中断往往是设置寄存器的标志位,用宏的方式在本头文件中给出形象地定义,在实际使用时,只需要调用宏,而不需要去设置位,减少出错的可能性。
//[EnDisInt.h]开放或禁止MCU各模块中断头文件-----------------------------

//头文件
#include "GP32C.h" //GP32 MCU映像寄存器名定义

//开放或禁止中断宏定义
#define EnableMCUint() asm("CLI") //开放总中断
#define DisableMCUint() asm("SEI") //禁止总中断
如果要在程序中对SCI模块使用中断设置,可以在这个头文件增加如下语句:
#define EnableSCIReInt() SCC2|= (1<<5) //令SCC2.5=1,开放SCI接收中断
#define DisableSCIReInt() SCC2&=~(1<<5) //令SCC2.5=0,禁止SCI接收中断

(3) MCUinit.c
该文件与具体的芯片型号有关,一般不要改动,并且只包含一个芯片初始化函数,来完成芯片初始化的相关工作。若想由编译器自动调用芯片初始化函数,其函数名必须为“_HC08Setup”,否则编译器会自动建立并调用一个空的“__HC08Setup”汇编子程序,而不理会用户创建的芯片初始化函数。为了统一,将该函数起名为“MCUInit”,并在主函数中调用该函数。这部分内容对初学者较难,请直接使用,本文将在第14章详细阐述。

(4) Vectors08.c
该文件与具体的芯片型号有关,可以根据需要向文件中添加中断处理函数和相应的中断向量。第一个C工程为了给出完整的编程框架,包含了“Vectors08.c”文件,但实际上,该工程只用到复位中断,这个中断比较特殊,由编译环境直接设置,所以不包含“Vectors08.c”也是可以的。5.2.3节已经详细讨论过“Vectors08.c”文件,这里不在祥述。

2.硬件对象控制文件

MCU C工程编程是面向硬件对象的。例如,要用MCU控制电机(Motor),在这样一个系统中,“面向硬件对象”概念体现在,工程中会创建“Motor.c”的源程序文件专门用于定义电机控制函数。相应的,也要创建一个同名头文件“Motor.h”,用于控制电机的MCU引脚定义、相关宏定义和电机控制函数声明等。这两个文件都是针对于Motor对象而建立,共同完成了对电机的控制动作。PrgFrame.prj工程中要控制的硬件对象是小灯,所以,本工程的硬件对象控制文件包含小灯驱动头文件(LED.h)和小灯驱动文件(LED.c)。
(1) LED.h
该文件包含:
①文件名。
②小灯控制所需用到的头文件。
③小灯控制引脚定义。
④小灯控制函数声明。
外部函数要用到小灯控制函数时,可包含这个头文件进行函数声明。
//[LED.h]小灯驱动头文件-----------------------------------------------------

//小灯控制需要用到的头文件
#include "GP32C.h" //映像寄存器名定义
#include "Type.h" //类型别名定义

//小灯控制引脚定义
#define Light_P PTA //小灯(Light)接在PTA口
#define Light_D DDRA //相应的方向寄存器
#define Light_Pin 1 //小灯接在相应口的1引脚

//小灯控制相关函数声明
void LEDinit(void); //定义控制小灯的MCU引脚为输出
void LED_L_A(INT8U flag); //驱动小灯"亮","暗"

(2) LED.c
该文件包含:
①文件描述:文件中的函数的索引、硬件对象及其与MCU的连接描述。
②头文件
小灯控制所需用到的头文件和小灯控制引脚定义及小灯控制函数中用到的其他常量声明可全部已放在“LED.h”中“LED.c”只要包含该头文件即可。
③小灯驱动函数定义
每个函数前要有相应的函数描述,包括函数名,函数的功能、参数和返回,必要时还可加上函数说明。
//[LED.c]小灯驱动----------------------------------------------------------*
//本文件包含: *
// (1)LEDinit:定义控制小灯的MCU的I/O引脚为输出 *
// (2)LED_L_A:驱动小灯"亮","暗" *
//硬件连接: *
// (1)本处的小灯是一个发光二极管,由MCU的I/O引脚控制 *
// (2)控制引脚=高电平时,小灯"暗";反之,小灯"亮" *
//-------------------------------------------------------------------------*

#include "LED.h" //该头文件中包含了小灯控制引脚定义和相关函数声明

//LEDinit:定义控制小灯的MCU引脚为输出--------------------------------------*
//功能:定义控制小灯的MCU引脚为输出,并使小灯初始为暗 *
//参数:无 *
//返回:无 *
//-------------------------------------------------------------------------*
void LEDinit(void)
{
Light_D |= 1<<Light_Pin; //令小灯引脚为输出
Light_P |= 1<<Light_Pin; //初始时,小灯"暗"
}

//LED_L_A:驱动小灯"亮","暗"------------------------------------------------*
//功能:根据flag的值控制小灯的亮和暗 *
//参数:flag(flag = 'A',小灯暗;flag = 'L',小灯亮) *
//返回:无 *
//-------------------------------------------------------------------------*
void LED_L_A(INT8U flag)
{
if (flag == 'A')
{
Light_P |= 1<<Light_Pin; //小灯"暗"
}
else if (flag == 'L')
{
Light_P &= ~(1<<Light_Pin); //小灯"亮"
}
}

3.通用程序文件

该类文件并不专门针对于某些特定的硬件对象,而是有一定的通用性,可以说它们是为整个工程的和谐运作而建立的。PrgFrame.prj工程中通用程序文件包括:总头文件(Includes.h)、类型别名定义头文件(Type.h)、通用函数头文件(GeneralFun.h)和通用函数文件(GeneralFun.c)。

(1) Includes.h
总头文件在一个工程中只有一个,它的名称较为固定,一般取为“Includes.h”。为了使主函数文件尽可能不被改动,结构清晰,“Includes.h”是主函数文件中唯一包含的头文件。主函数文件中用到的头文件(通用的和面向硬件对象的头文件)、宏定义、函数声明都放在这个总头文件中。主函数文件的这些部分如要修改,只要在总头文件中修改即可,不用改动主函数文件。注意要避免总头文件中间接的头文件重复包含。
//[Includes.h]总头文件-----------------------------------------------------*
//本文件包含: *
// 主函数(main)文件中用到的头文件,外部函数声明及有关常量命名 *
//-------------------------------------------------------------------------*

//1.包含通用头文件
#include "Type.h" //类型别名定义
#include "EnDisInt.h" //开放或禁止MCU各模块中断
#include "GeneralFun.h" //该头文件中包含了通用函数声明
//2.包含面向硬件对象头文件
#include "LED.h" //该头文件中包含了LED驱动函数声明

//函数声明
void MCUinit(void); //芯片初始化

(2) Type.h
顾名思义,“Type.h”文件就是在给C语言中的类型名起别名,这样使程序中的类型名简短明了,同时,也便于程序移植。用户还可以根据自己的需要,随时在该文件中添加条目。在工程的任一文件中,需要用到这些别名时,都要包含“Type.h”。在多个程序文件中都有可能用到类型别名定义,为了防止在一个文件中多次包含“Type.h”。因此,在
“Type.h”中需要加入条件编译语句。
//[Type.h]类型别名定义-----------------------------------------------------*
//说明:为了方便使用与程序移植定义类型别名,用户可以根据需要自行添加 *
//-------------------------------------------------------------------------*
#ifndef TYPE_H
#define TYPE_H
typedef unsigned char INT8U; //无符号8位数
typedef signed char INT8S; //有符号8位数
typedef unsigned int INT16U; //无符号16位数
typedef signed int INT16S; //有符号16位数
typedef unsigned long INT32U; //无符号32位数
typedef signed long INT32S; //有符号32位数
typedef float FP32; //单精度浮点数
typedef double FP64; //双精度浮点数
#endif

(3) GeneralFun.h
该文件包含文件名、通用函数所需用到的头文件、通用函数用到的宏定义和通用函数声明。外部函数要用到通用函数时,可包含这个头文件进行函数声明。
//[GeneralFun.h]通用函数头文件----------------------------------------------

#include "Type.h" //类型别名定义

void Delay(INT16U); //延时函数声明

(4) GeneralFun.c
该文件包含:
①文件描述:文件中的函数的索引。
②头文件
通用函数所需头文件和宏定义可都放在“GeneralFun.h”中,“GeneralFun.c”中只要包含该头文件即可。
③通用函数定义
每个函数前要有相应的函数描述,包括函数名,函数的功能、参数和返回,必要时还可加上函数说明。工程可以根据需要向“GeneralFun.c”文件中添加通用函数,如内存数据移动函数、延时函数这样的通用函数都可以放入其中。

//[GeneralFun.c]通用函数---------------------------------------------------*
//本文件包含: *
// (1)Delay:延时函数 *
//-------------------------------------------------------------------------*

#include "GeneralFun.h" //该头文件中包含了类型别名定义

//Delay:延时函数-----------------------------------------------------------*
//功 能:用程序的方法延时一段时间 *
//参 数:k = 延时长度(0-65535) *
//返 回:无 *
//-------------------------------------------------------------------------*
void Delay(INT16U k)
{
INT16U u;
for(u=0; u<k; u++);
}

4.主函数文件(Main.c)
工程中有且仅有一个主函数文件“Main.c”,它定义了工程的主处理流程。该文件中包含:
①工程概要:包含工程名、硬件连接索引、工程描述、目的、注意要点和日期等。
②总头文件
③主函数
//-------------------------------------------------------------------------*
//工 程 名:PrgFrame.prj *
//硬件连接: *
// (1)MCU的I/O口引脚接小灯(见"LED.c"文件说明) *
//程序描述:用I/O口控制小灯闪烁 *
//目 的:第1个freescale HC08系列MCU C语言程序框架 *
//说 明:提供Motorola MCU的编程框架,供教学入门使用 *
//注 意:如果延时不够长的话,会发觉灯不会闪烁,而是一直亮,这是由于人的 *
// 视觉引起的. *
//------------------清华2007版《嵌入式技术基础与实践》实例-----------------*

//总头文件
#include "Includes.h"
//主函数
void main()
{
DisableMCUint(); //禁止总中断
//1. 芯片初始化
MCUinit();
//2. 模块初始化
LEDinit(); //(1) 小灯控制引脚初始化
//总循环
while (1)
{
LED_L_A('L'); //小灯亮
Delay(15000); //延时
LED_L_A('A'); //小灯暗
Delay(15000); //延时
}
}

上述GP32 第一个C工程实例的源程序请见教学资料“MC08Ex2007\GP32\GP32C\C01_简单IO及程序框架”。通过上述C工程实例分析,除了要理解08C工程的组成、C程序文件的编写规范和软硬件模块的合理划分等内容外,还要注意文件的命名规则,现简述如下:

①工程中较为固定的程序文件,其命名也较为固定,如“Includes.h”、“Main.c”、“EnDisInt.h”、
“MCUinit.c”、“Vectors08.c”等。
②有些文件要同名,如“GeneralFun.c”,它是工程中的通用函数定义文件(像内存数据移动函数和延时函数都属于通用函数),其他文件在用到这些函数之前,必须进行函数原型声明,或者这个“.c”文件自身也需要包含一些头文件和宏定义,这些内容都可以放到一个与之同名的“GeneralFun.h”文件中。 这两个文件是相互对应的。同样,面向硬件对象头文件的名称一定要与相应的硬件对象控制文件同名。
③有些文件的命名没有特殊要求,只要表清含义就可以,如:“Type.h”。
总之,给工程中的文件命名时,要尽量做到见名知意,简洁明了。

<<上一节 下一节>>




 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.