2013年10月1日 星期二

ISR之不能做什麼


  1.7 __interrupt double isr(double r)
      {
         double area = PI*r*r ;
         printf("%f\n",area) ;
         return area ;
      }
      說明並解釋上述之interrupt service routine 之錯誤處?


中斷嵌入式系統中重要組成部分,很多編譯器開發商都讓標準c支持中斷,並引入關鍵字_interrupt.但是:
1、ISR不能有返回值
2、ISR不能傳遞參數;
3、ISR應該是短而高效的,在ISR中做浮點運算是不明智的;
4、ISR中不應該有重入和性能上的問題,因此不應該使用pintf()函數。




1.ISR 不能有返回值。為什麼?
2.ISR 不能傳遞參數。為什麼? 

裸奔的系統:硬件中斷響應程序的運行插入時機是隨機的,程序中不存在這樣的調用語句:「value=interrupter( )」, 所以,即使有返回值也不知返回給誰。  同理,如果中斷函數有形參,但因沒有調用者,也就沒有實參對形參賦值。所以,不可能有參數傳遞。
裸奔系統中,中斷程序由硬件觸發執行。這意味著中斷函數沒有具體的調用者,所以,中斷函數無法將值返回給任何對象

  非裸奔系統:操作系統需要進行各種調度安排,所以接管了中斷的入、出口;另外,還增加了許多軟件中斷。這些中斷函數的運行插入時機已經不再是隨機了。一個中斷申請發生後,其運行時機取決於操作系統的確定安排和調用。也就是說,有了調用者,所以可以有返回值和參數傳遞。

沒有留言:

張貼留言