本文檔旨在說明頭文件.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包含其他已經定義的頭文件
例如:
#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 關鍵字。