頭文件.h中包含的內容 源文件.C中包含的內容 以及兩個不同的C文件如何使用同一個函數 以及兩個不同的C文件如何使用同一個變量


本文檔旨在說明頭文件.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 關鍵字。

 

百度網盤鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM