本文档旨在说明头文件.h中包含的内容, 源文件.C中包含的内容。
以及两个不同的C文件中如何使用同一个函数。
以及两个不同的C文件如何使用同一个变量。
头文件.h 的用途如下:
例如:
#define KM1_CTRL GpioDataRegs.GPADAT.bit.GPIO18 //DIO01
#define KM2_CTRL GpioDataRegs.GPADAT.bit.GPIO17 //DIO02
#define PORT_AD (signed int *) 0x100009
//把0X100009 "整形"强制转换为指向 "有符号号数的指针"
#define PERIOD_PWM 15625 //PWM计数周期
#define COEF_UOA _IQ22(0.132202495) //输出电压系数理想1
//---------------------------------------------------------------------------
// Include:
//---------------------------------------------------------------------------
#include "IQmathLib.h"
#include "DC_Comm.h"
#include "DC_Ethernet.h"
#include "DC_Control.h"
#include "DC_Timing.h"
#include "DC_Memory.h"
#include "DC_Protocol.h"
(3) 数据类型的定义
例如在DC_Control.h 当中
typedef struct
{
Uint16 sine_point;
_iq16 voltage_ref;
PICalcReg uaref;
PICalcReg ubref;
PICalcReg ucref;
PICalcReg ua;
PICalcReg ub;
PICalcReg uc;
PICalcReg ila;
PICalcReg ilb;
PICalcReg ilc;
PICalcReg uaf;
PICalcReg ubf;
PICalcReg ucf;
} ControlCalcReg;
(4)千万注意:在头文件.h里面没有定义过变量,变量都是在.C文件中定义的。
(5) 在头文件中用CODE_SECTION伪指令定义代码段
#pragma CODE_SECTION(RMS_Control,"ramfuncs")
(6)声明函数
例如在DC_Types.h 中声明函数
(7) 千万注意 在头文件.h 中只仅仅声明函数,不定义函数,函数的确切定义在源文件.c中完成。
C文件中包含的内容
以DC_Control.c为例
例如:
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "DC_Types.h"
例如在主文件main.C中声明如下变量
SampleReg sample_data; //采样数据
//sampleReg数据类型在mian.c文件的开头头文件
DC_Types.h中包含。
ControlCalcReg ctrl_calc; //控制计算量
ControlDataReg ctrl_data; //控制数据量
ParameterReg param_data; //参数
TimingReg timing_data; //时序保护
SCIDataReg scia_data; //SCIA
SCIDataReg scib_data; //SCIB
SCIDataReg scic_data; //SCIC
SCIDataReg eth_data; //以太网数据
AccessTaskReg mem_data; //数据存取
若在DC_Control.c文件里面定义的函数 pwm_task_fcn()用到了
ControlCalcReg ctrl_calc 变量 因为该变量是在main.c文件中定义的,仅需要在DC_Control.c的开头出 用extern 关键字进行声明
例如
extern ControlCalcReg ctrl_calc; //控制计算量
(3)定义以及初始化变量
例如 初始化正弦表
//正弦表24点Q16
_iq16 sine_table[24] = {
0,16962,32768,46341,56756,63303,
65536,63303,56756,46341,32768,16962,
0,-16962,-32768,-46341,-56756,-63303,
-65536,-63303,-56756,-46341,-32768,-16962
};
(4)定义函数到底进行什么操作
//---------------------------------------------------------------------------
// UO_Control: 电压环控制
//---------------------------------------------------------------------------
void UO_Control (PICalcReg * ux,_iq16 * forward)
{
int32 sum;
sum = _IQ16mpy(ux->now_err,_IQ16(1.0));//0.6
sum = sum - _IQ16mpy(* forward,_IQ16(1.2)); //输出电流前馈2.6
if(sum > _IQ16(1000)) //输出限幅
{
sum = _IQ16(1000);
}
else if(sum< _IQ16(-1000))
{
sum = _IQ16(-1000);
}
ux->last_err = ux->now_err;
ux->last_out = sum;
}
有了以上的两个概念 更深一步的探讨: 主要解决两个问题
第一个问题:
一个在A.C中定义的函数 InitBoard() 如何再B.C 中使用,不违法 ,(A是源文件C的名称,B是另一个源文件C的名称)
简而言之:两个不同的C文件如何使用同一个函数 。
第二个问题:
变量仅只能在C文件中声明定义初始化,一个在M.c文件中定义的变量,如何同一个工程下的另外一个C文件 N.c 所使用
先举一个例子:
InitBoard() 在DC_Config.c中定义,却拿来在main.c文件的主函数
Void main()
{
}
中直接使用?
说明 在DC_Config.C的开头处 包含了头文件
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "DC_Types.h"
前面说明了 头文件可以声明函数,但是不可以定义函数。
恰好 在DC_Types.h中声明了函数 Void Initboard()
紧接着早DC_Config.C中定义了函数 Initboard()
DC_Config.C的最前面包含DC_Types.h
//---------------------------------------------------------------------------
// 控制板初始化
//---------------------------------------------------------------------------
void InitBoard(void)
{
/* Disable and clear all CPU interrupts */
DINT;
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
InitAdc();
InitGpio();
InitEPwm();
InitMcbsp();
InitSci();
InitSpi();
XintfInit();
}
现在主文件main.c 中的主函数直接要调用InitBoard()函数,
而InitBoard()是在DC_Config.c中定义
方法很简单
在DC_types.h中声明了函数 void InitBoard(void)
DC_Config.c文件的开头包含了 DC_Types.h
并且DC_Config.c 定义了 void InitBoard()
则直接在main .c文件的开头包含头文件DC_types.h即可
例:
五星级:
定义了一个头文件 头文件可以被不同的C文件在开头处包含。而头文件声明了函数, 注意不是定义 例如 void blw() { }
并且在A.C中定义了。那么其他的C文件可以直接调用blw() 函数
其他不同的C文件只要包含该有文件即可
(二)两个不同的C文件引用了同一个变量
千万注意 变量不能在头文件中声明,只能在.C文件中声明定义,
所以 在A.C中定义了变量n 如果需要在另外一个C文件B.c中使用它 则必须用extern 关键字 加以说明
例如 在main.c 文件的开头定义了以下变量
//---------------------------------------------------------------------------
// Varible Defines:
//---------------------------------------------------------------------------
SampleReg sample_data; //采样数据
ControlCalcReg ctrl_calc; //控制计算量
ControlDataReg ctrl_data; //控制数据量
ParameterReg param_data; //参数
TimingReg timing_data; //时序保护
SCIDataReg scia_data; //SCIA
SCIDataReg scib_data; //SCIB
SCIDataReg scic_data; //SCIC
SCIDataReg eth_data; //以太网数据
AccessTaskReg mem_data; //数据存取
//---------------------------------------------------------------------------
若在DC_control.C中要用到这些变量 则在DC_CONTROL.C 的开头处 在这些变量前面增加关键字 extern
若在DC_Comm.c中用到了main.c文件中定义的SCIDataReg 则直接在DC_Comm.c 的开头处
注意 定义的全局变量在main.c文件中定义好 ,其他C文件如果需要调用 直接在前面 加extern 关键字。
头文件.h中包含的内容 源文件.C中包含的内容 以及两个不同的C文件如何使用同一个函数 以及两个不同的C文件如何使用同一个变量
原文:https://www.cnblogs.com/bailongwei654321/p/12885669.html