請教有關資料型別的宣告
|
|
|||
---|---|---|---|---|
資深會員
|
發表於: 2010/10/6 19:26
|
|||
|
有關變數宣告
|
||||
---|---|---|---|---|
資深會員
|
小弟使用p18f6722,先前有問過關於#pragma的用法。因為p18f6722從linker script中可看到DATABANK有十多個,而這些data bank似乎是在硬體上是分開的。
根據詢問公司前輩的結果,若宣告變數時,變數的範圍跨越兩個bank,使用時會出問題,因此現在是手動宣告變數位址: #pragma udata bank00=0x60 //160 -- 變數宣告段 -- #pragma udata bank02=0x200 //256 -- 變數宣告段 -- 然後在每一個bank中計算宣告的變數總size,以避免變數超過邊界 因為手動宣告變數位址實在相當不方便,若不用擔心變數宣告時跨bank會出問題,做起來會方便一些 請問版主大哥是否有遇到過這個問題?一般又是如何做這樣的宣告? --------------------------------------------------------------------------- 問題舉例:若在bank00的0x196位址處宣告一個char array[10], 會使得array跨越bank00及bank02 ---------------------------------------------------------------------------
發表於: 2008/6/20 11:17
|
|||
|
有關#pragma的使用
|
||||
---|---|---|---|---|
資深會員
|
小弟欲處理的程式中包含下列指令:
#pragma udata access AccessSection //39 near unsigned char Rec_Data; //1 near unsigned int RXQTop; //2 near unsigned int RXQEnd; //2 #pragma udata bank00=0x60 //160 char USBTXQ[UTXQSize]; //160 #pragma udata bank01=0x100 //256 char TCPData[TCPDSize]; //192 char StoreString[StoreSize]; 因這些變數會被多個函數所使用,因此想提出放到header檔中,但卻發現無法在header中將其設為extern 變數,是否只要規定了使用的位址後,就不能將其提出至header呢? 假設我將上述內容存於res.h中,再於A.c及B.c檔中分別include res.h,會產生如下錯誤(未設為extern時): section 'bank00' type is non-overlay and absolute but occurs in more than one input file. 若header中設為extern時,則為: section address permitted only at definition 這是表示#pragma udata bank00=0x60,無法在header中進行宣告嗎? 說起來res.h檔中使用extern 應為declaration,A.c及B.c中,有一個應是definition,但在compiler的錯誤訊息中似乎沒有對它們加以分別 若各位前輩有相關的經驗,還請不吝指教
發表於: 2008/4/17 12:39
|
|||
|
Re: 在header檔中定義全域的struct變數
|
||||
---|---|---|---|---|
資深會員
|
感謝您的回覆,已拜讀兩份說明,的確是相當實用的文件
發表於: 2008/4/17 12:11
|
|||
|
Re: 在header檔中定義全域的struct變數
|
||||
---|---|---|---|---|
資深會員
|
感謝指教
小弟最近接觸的程式因行數較多,想拆成多個檔案方便管理,但突然發現自己對於header的定義及使用方式不太熟悉,整理程式碼時又遇到許多全域變數,造成想拆都不知如何下手 不知各位前輩能否提供一些有關自訂header使用上的相關經驗?又該如何尋找相關的說明資料?
發表於: 2008/4/14 22:03
|
|||
|
在header檔中定義全域的struct變數
|
||||
---|---|---|---|---|
資深會員
|
小弟使用的是MPLAB+C18
mcc18目錄下的p18f6722.h中,看到如下定義: extern volatile near union { struct { unsigned ABDEN:1; unsigned WUE:1; unsigned :1; unsigned BRG16:1; unsigned SCKP:1; unsigned :1; unsigned RCIDL:1; unsigned ABDOVF:1; }; struct { unsigned :6; unsigned RCMT:1; }; } BAUDCON1bits; 只要include <p18f6722.h>,在程式中可以直接使用 BAUDCON1bits.BRG16=1; ---------------------------------------------------------------- 想請教各位前輩,BAUDCON1bits.BRG16 代表的是一個全域變數嗎?即是說,只要多個程式檔中各自include<p18f6722.h>,便能共用BAUDCON1bits.BRG16的值嗎? 小弟試著自訂一個utility.h檔,並於其內宣告一個struct,希望只要include "utility.h"後,便可直接在main.c與utility.c內,使用PData.name[0]='a';的語法 但實際使用時,main.c檔內若沒有定義該struct,便無法操作PData的值。 小弟希望能夠在多個.c檔中共用PData,是否能夠只要在header中定義一次,以後便不必再宣告呢? 在mcc目錄中,p18f6722的副檔有.h、.inc、.asm、.lib,是否與此有關? 在多個程式檔中多次以extern struct宣告結構,會覺得程式碼有些冗長。 還請各位前輩提示小弟一些可行的作法 下面是小弟使用的檔案及宣告的struct: ------------------------------------------------------------- main.c utility.c utility.h -------------------------------------------------------------- extern struct { char name[16]; //Unit Name[0] char status[2]; //Status[16] char date[7]; //Date[18] char utct[7]; //UTC Time[25] char lat[11]; //Latitude[32] char lon[12]; //Longitude[43] char speed[10]; //Speed Over }PData; -------------------------------------------------------------------------
發表於: 2008/4/13 17:54
|
|||
|