:::


Browsing this Thread:   1 Anonymous Users






C語言編譯問題(1510)
#1
高級會員
高級會員


查看用戶資訊
各位早
早期都使用組合在寫程式
目前改用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

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

發表於: 2018/10/24 13:10
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: C語言編譯問題(1510)
#2
版主
版主


查看用戶資訊
在主程式的函數前後加入 Interrupt Disable 及 Interrupt Enable 的功能。

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

發表於: 2018/10/24 14:16
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: C語言編譯問題(1510)
#3
高級會員
高級會員


查看用戶資訊
謝謝Ryang的回覆
請問是下面這樣子嗎?
void main (void)
{
GIE = 0 ;
DATAEE_ReadByte(0x7000);
GIE = 1 ;
}
如果是,我剛剛試了一下,還是一樣會跑出1510的錯誤

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

發表於: 2018/10/24 14:38
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: C語言編譯問題(1510)
#4
資深會員
資深會員


查看用戶資訊
你有用 MCC 產生一個自然產生的 int 嗎?

發表於: 2018/10/25 10:16
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: C語言編譯問題(1510)
#5
高級會員
高級會員


查看用戶資訊
參照:

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


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

發表於: 2018/10/26 9:06
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: C語言編譯問題(1510)
#6
版主
版主


查看用戶資訊
編譯器所出現的是"諮詢問題" 不是錯誤或是警告訊息。程式應該可以編譯成功的。因

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

發表於: 2018/10/26 11:03
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: C語言編譯問題(1510)
#7
高級會員
高級會員


查看用戶資訊
謝謝Ryang回覆
http://microchipdeveloper.com/xc8:duplicated-functions
資料提到,它只是重複編譯,DATAEE_ReadByte()好像會生成二份程式碼
以防程式執行時發生像Ryang說的問題
只是它多編譯一些程式,多暫用了一些程式空間

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

發表於: 2018/10/26 14:04
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: C語言編譯問題(1510)
#8
資深會員
資深會員


查看用戶資訊
同一個函數只能選擇在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執行。

發表於: 2018/11/2 16:05

Edited by chrC475 on 2018年11月02日 16:21:52
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
You cannot start a new topic.
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]