• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::

論壇索引


Board index » All Posts (b9015038)




請教有關資料型別的宣告
資深會員
資深會員



發表於: 2010/10/6 19:26
頂部


pointer function的原型宣告
資深會員
資深會員


小弟最近想要將程式裡的一個大型switch case改為pointer function型式。

使用環境:
MPLAB 8.10
header、linker script:
PIC18F6722

修改後型式如下:
Evt1(){…}
Evt2(){…}
Evt3(){…}
Evt4(){…}
Evt5(){…}
………
void (* oper_evt[])() = {Evt1,Evt2,Evt3,Evt4,Evt5,…};

因為Evt的數量共有九十多個,編譯後看到錯誤訊息如下:

Error - section '.idata_avl_09o1.o' can not fit the section. Section '.idata_avl_09o1.o' length=0x00000120

看來是儲存空間不足所造成的問題,且測試了一下,若將void (* oper_evt[])()定義改為
= {Evt1,Evt2,Evt3,Evt4};,即少一個Evt5的話,原本的length=0x00000120會改為length=0x00000117。

感覺起來像是定義了一個過大的array而用完儲存空間,
但void (* oper_evt[])() = {Evt1,Evt2,Evt3,Evt4,Evt5};似乎不儲存於AcessBank或其它DATA BANK中。

可以請教一下,上面的錯誤訊息是什麼情況會發生嗎?

因為目前並沒有使用#pragma idata來宣告,是否必須將一個bank指定為idata來放?

但原本的記憶空間便不足了,似乎也無法找到一個能放九十多個event位址的空間,令人苦惱啊

發表於: 2008/7/29 15:49
頂部


有關變數宣告
資深會員
資深會員


小弟使用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
頂部



« 1 ... 15 16 17 (18)



:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------