爲了本身學習之用,轉來一遍文章函數
https://blog.csdn.net/zhangchiytu/article/details/45131915性能
中斷是嵌入式系統中重要的組成部分,這致使了不少編譯開發商提供一種擴展—讓標準C支持中斷。具表明事實是,產生了一個新的關鍵字 __interrupt。下面的代碼就使用了__interrupt關鍵字去定義了一箇中斷服務子程序(ISR),請評論一下這段代碼。學習
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf("\nArea = %f", area);
return area;
}
操作系統
這個函數有太多的錯誤了,以致讓人不知從何提及了:
1)ISR 不能返回一個值。若是你不懂這個,那麼你不會被僱用的。
2) ISR 不能傳遞參數。若是你沒有看到這一點,你被僱用的機會等同第一項。
3) 在許多的處理器/編譯器中,浮點通常都是不可重入的。有些處理器/編譯器須要讓額處的寄存器入棧,有些處理器/編譯器就是不容許在ISR中作浮點運算。此外,ISR應該是短而有效率的,在ISR中作浮點運算是不明智的。
4) 與第三點一脈相承,printf()常常有重入和性能上的問題。若是你丟掉了第三和第四點,我不會太爲難你的。不用說,若是你能獲得後兩點,那麼你的被僱用前景愈來愈光明瞭。.net
中斷是嵌入式系統中重要組成部分,不少編譯器開發商都讓標準c支持中斷,並引入關鍵字_interrupt.可是:
一、ISR不能有返回值;
二、ISR不能傳遞參數;
三、ISR應該是短而高效的,在ISR中作浮點運算是不明智的;
四、ISR中不該該有重入和性能上的問題,所以不該該使用pintf()函數。對象
1.ISR 不能有返回值。爲何?
2.ISR 不能傳遞參數。爲何? blog
裸奔的系統:硬件中斷響應程序的運行插入時機是隨機的,程序中不存在這樣的調用語句:「value=interrupter( )」, 因此,即便有返回值也不知返回給誰。 同理,若是中斷函數有形參,但因沒有調用者,也就沒有實參對形參賦值。因此,不可能有參數傳遞。開發
裸奔系統中,中斷程序由硬件觸發執行。這意味着中斷函數沒有具體的調用者,因此,中斷函數沒法將值返回給任何對象編譯器
非裸奔系統:操做系統須要進行各類調度安排,因此接管了中斷的入、出口;另外,還增長了許多軟件中斷。這些中斷函數的運行插入時機已經再也不是隨機了。一箇中斷申請發生後,其運行時機取決於操做系統的肯定安排和調用。也就是說,有了調用者,因此能夠有返回值和參數傳遞。編譯