Re: C語言編譯問題(1510)

作者 chrC475 於 2018年11月02日 16:05:03
同一個函數只能選擇在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執行。

來自: http://www.microchip.com.tw/newbb/viewtopic.php?forum=18&topic_id=22442&post_id=78846