首页 > 其他 > 详细

头文件.h中包含的内容 源文件.C中包含的内容 以及两个不同的C文件如何使用同一个函数 以及两个不同的C文件如何使用同一个变量

时间:2020-05-14 01:42:32      阅读:73      评论:0      收藏:0      [点我收藏+]

本文档旨在说明头文件.h中包含的内容, 源文件.C中包含的内容。

以及两个不同的C文件中如何使用同一个函数。

以及两个不同的C文件如何使用同一个变量。

 

头文件.h 的用途如下:

  1. 宏定义

例如:

#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

 

  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为例

  1. 可以用#include包含其他已经定义的头文件

    例如:

     

#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File

#include "DSP2833x_Examples.h" // DSP2833x Examples Include File

#include "DC_Types.h"

 

  1. 可以申明变量

    例如在主文件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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!