會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





C語言編譯問題(1510)
高級會員
註冊日期:
2006/06/06 08:38
所屬群組:
註冊會員
文章: 99
等級: 8; EXP: 94
HP : 0 / 198
MP : 33 / 7227
離線
各位早
早期都使用組合在寫程式
目前改用C撰寫,有個問題請問大家一下

使用MPLAB X (xc8)
void interrupt INTERRUPT_InterruptManager (void)
{
DATAEE_ReadByte(0x7000);
}

void main (void)
{
DATAEE_ReadByte(0x7000);
}

編譯後就出現
../main.c:294: advisory: (1510) non-reentrant function "_DATAEE_ReadByte" appears in multiple
call graphs and has been duplicated by the compiler

找了一下資料,好像在主程式與中斷程式內不可以呼叫同一個副程式,會造成重複編譯
http://microchipdeveloper.com/xc8:duplicated-functions

我想請問各位是如何避免或解決這個問題

10月24日 13:10:03
轉換PDF檔 列印


Re: C語言編譯問題(1510)
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14528
等級: 73; EXP: 10
HP : 1081 / 1802
MP : 4842 / 76634
離線
在主程式的函數前後加入 Interrupt Disable 及 Interrupt Enable 的功能。

GIE = 0 ; Disable All Interrupe
GIE = 1 ; Enable Global Interrupt

10月24日 14:16:33
轉換PDF檔 列印


Re: C語言編譯問題(1510)
高級會員
註冊日期:
2006/06/06 08:38
所屬群組:
註冊會員
文章: 99
等級: 8; EXP: 94
HP : 0 / 198
MP : 33 / 7227
離線
謝謝Ryang的回覆
請問是下面這樣子嗎?
void main (void)
{
GIE = 0 ;
DATAEE_ReadByte(0x7000);
GIE = 1 ;
}
如果是,我剛剛試了一下,還是一樣會跑出1510的錯誤

目前的版本是MPLAB X IDE v4.15與xc8 v1.45

10月24日 14:38:26
轉換PDF檔 列印


Re: C語言編譯問題(1510)
資深會員
註冊日期:
2007/08/13 14:27
所屬群組:
註冊會員
文章: 200
等級: 13; EXP: 18
HP : 0 / 304
MP : 66 / 10024
離線
你有用 MCC 產生一個自然產生的 int 嗎?

10月25日 10:16:21
轉換PDF檔 列印


Re: C語言編譯問題(1510)
高級會員
註冊日期:
2006/06/06 08:38
所屬群組:
註冊會員
文章: 99
等級: 8; EXP: 94
HP : 0 / 198
MP : 33 / 7227
離線
引用:

hann_mh 寫道:
你有用 MCC 產生一個自然產生的 int 嗎?


不好意思,我不太懂你的意思,產生int??
DATAEE_ReadByte()是用MCC產生的
它實際為uint8_t DATAEE_ReadByte(uint16_t bAdd);
我有試過Address=DATAEE_ReadByte(0x7000);
還是一樣的錯誤。

10月26日 09:06:28
轉換PDF檔 列印


Re: C語言編譯問題(1510)
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14528
等級: 73; EXP: 10
HP : 1081 / 1802
MP : 4842 / 76634
離線
編譯器所出現的是"諮詢問題" 不是錯誤或是警告訊息。程式應該可以編譯成功的。因

為中斷裡有呼叫了主程式使用的函數,怕在主程式正執行此函數時發生了中斷進而造成該函數所使用的變數被打亂。所以先關閉執行該函戶時的中斷應可避免此錯誤。

10月26日 11:03:11
轉換PDF檔 列印


Re: C語言編譯問題(1510)
高級會員
註冊日期:
2006/06/06 08:38
所屬群組:
註冊會員
文章: 99
等級: 8; EXP: 94
HP : 0 / 198
MP : 33 / 7227
離線
謝謝Ryang回覆
http://microchipdeveloper.com/xc8:duplicated-functions
資料提到,它只是重複編譯,DATAEE_ReadByte()好像會生成二份程式碼
以防程式執行時發生像Ryang說的問題
只是它多編譯一些程式,多暫用了一些程式空間

看起來,後續撰寫程式,要避免這個架構發生

10月26日 14:04:57
轉換PDF檔 列印


Re: C語言編譯問題(1510)
資深會員
註冊日期:
2013/10/22 15:08
來自 香港
所屬群組:
註冊會員
文章: 213
等級: 13; EXP: 62
HP : 0 / 315
MP : 71 / 4675
離線
同一個函數只能選擇在main或interrupt任一地方執行,不可能「我全都要」。

有些編譯器在偵測到這個問題時會直接取消編譯並提示錯誤。

正如Ryang所提到的,因為有interrupt有機會在你的DATAEE_ReadByte()執行期間觸發中斷,然後中斷式內執行DATAEE_ReadByte()導致原本正在main執行但被掛上的DATAEE_ReadByte()的暫存內容被覆寫。

儘管有些編譯器有機制避免發生以上問題,即例如生成兩份函數指令碼,我還是不會建議,因為EEPROM讀寫控制SFR是共用的。倘若在main呼叫讀取的位址跟interrupt呼叫的位址不同,main呼叫中途被中斷,中斷過後回到main所取得的EEPROM資料就有機會不對。

以我自己的編寫習慣,EEPROM或Flash讀取寫入、ADC讀取以及其他帶有迴圈的函數都一律避免在interrupt直接呼叫。如果要按中斷時序來執行這些操作的話,我會使用flag代替,在interrupt定時設定後再在main執行。

11月02日 16:05:03

chrC475 於 2018年11月02日 16:21:52
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2018 Winter Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project