中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開發商提供一種擴充套件—讓標準c支援中斷。
具代表事實是,產生了乙個新的關鍵字 __interrupt。
__interrupt double compute_area (double radius)
這個函式有太多的錯誤了,以至讓人不知從何說起了:
1) isr 不能返回乙個值。如果你不懂這個,那麼你不會被雇用的。
2) isr 不能傳遞引數。如果你沒有看到這一點,你被雇用的機會等同第一項。
3) 在許多的處理器/編譯器中,浮點一般都是不可重入的。有些處理器/編譯器需要讓額處的暫存器入棧,有些處理器/編譯器就是不允許在isr中做浮點運算。
此外,isr應該是短而有效率的,在isr中做浮點運算是不明智的。
4) 與第三點一脈相承,printf經常有重入和效能上的問題。如果你丟掉了第三和第四點,我不會太為難你的。不用說,如果你能得到後兩點,那麼你的被雇用前景越來越光明了。
不能在中斷服務程式中執行類似操作的原因是運算時間太長,不能在中段中作複雜的工作,你可以在中斷服務程式中置乙個標誌位.然後在主程式中查詢此位,判斷是否執行計算子程式.當然這樣做會在中斷產生與實際的中斷響應之間產生一定的延遲,如果你的系統對時間不太敏感還好,如果非常敏感可以考慮採用rtos。否則。。。多加幾句對中斷標誌位的判斷語句。。。。
在主程式中監測是否被置位來決定子程式是否執行.可能存在以下問題,就是,中斷返回後要執行幾個耗時比較長的子程式才能執行判斷標誌位的語句,這樣,可能會有太長的時間間隔.如果你在幾個耗時比較長的子程式之間加上一句判斷語句,就會減小中斷產生與中斷響應之
間的時間延遲.
中斷活動的全過程大致為:
1、中斷請求:中斷事件一旦發生或者中斷條件一旦構成,中斷源提交「申請報告」,與請求cpu暫時放下目前的工作而轉為中斷源作為專項服務
2、中斷遮蔽:雖然中斷源提交了「申請報告」,但是,是否得到cpu的響應,還要取決於「申請報告」是否能夠通過2道或者3道「關卡」(中斷遮蔽)送達cpu(相應的中斷遮蔽位等於1,為關卡放行;反之相應的中斷遮蔽位等於0,為關卡禁止通行);
3、中斷響應:如果一路放行,則cpu響應中斷後,將被打斷的工作斷點記錄下來(把斷點位址保護到堆疊),掛起「不再受理其他申請報告牌」(清除全域性中斷標誌位gie=0),跳轉到中斷服務子程式
4、保護現場:在處理新任務時可能破壞原有的工作現場,所以需要對工作現場和工作環境進行適當保護;
5、調查中斷源:檢查「申請報告」是由哪個中斷源提交的,以便作出有針對性的服務;
6、中斷處理:開始對查明的中斷源進行有針對性的中斷服務;
7、清除標誌:在處理完畢相應的任務之後,需要進行撤消登記(清除中斷標誌),以避免造成重複響應;
8、恢復現場:恢復前面曾經被保護起來的工作現場,以便繼續執行被中斷的工作;
9、中斷返回:將被打斷的工作斷點找回來(從堆疊中恢復斷點位址),並摘下「不再受理其他申請報告牌」(gie=1),繼續執行原先被打斷的工作。
中斷服務子程式
中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開發商提供一種擴充套件 讓標準c支援中斷。具代表事實是,產生了乙個新的關鍵字 interrupt。interrupt double compute area double radius 這個函式有太多的錯誤了,以至讓人不知從何說起了 1 isr 不能...
中斷服務子程式
中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開發商提供一種擴充套件 讓標準c支援中斷。具代表事實是,產生了乙個新的關鍵字 interrupt。interrupt double compute area double radius 這個函式有太多的錯誤了,以至讓人不知從何說起了 1 isr 不能...
中斷服務子程式
中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開發商提供一種擴充套件 讓標準c支援中斷。具代表事實是,產生了乙個新的關鍵字 interrupt。interrupt double compute area double radius 這個函式有太多的錯誤了,以至讓人不知從何說起了 1 isr 不能...