欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 關于C語言重入函數 [打印本頁]

作者: 15348420767    時間: 2021-1-11 20:24
標題: 關于C語言重入函數
程序編譯的時候出現警告,經過查資料后發現是有一個子函數,被主函數和中斷都調用了,所以出現了警告。請問那個重入函數怎么寫?求指導
作者: npn    時間: 2021-1-11 23:04
主函數正在調用該函數且未返回,再被中斷搶占就會造成內存錯亂。
作者: xhaity    時間: 2021-1-11 23:25
本帖最后由 xhaity 于 2021-1-11 23:28 編輯

一般情況下,中斷和主函數不調用同一函數,一定要調用的話,那就用鎖標志,主函數正在執行某部分時,做鎖標記,沒執行完,在中斷調用查該標志,如果有鎖,跳過該程序段。
作者: xhaity    時間: 2021-1-11 23:31
一般情況下,中斷和主函數不調用同一函數,一定要調用的話,那就用鎖標志,主函數正在執行某部分時,做鎖標志,執行完清除;中斷中查詢該標志,如果該標志存在,就跳過該段。
作者: zyztoto    時間: 2021-1-12 14:19
一般情況下,別在中斷調子函數,留個標志就可以了,比如累加。再根據標志寫函數。
作者: zyztoto    時間: 2021-1-12 14:27
zyztoto 發表于 2021-1-12 14:19
一般情況下,別在中斷調子函數,留個標志就可以了,比如累加。再根據標志寫函數。

樓上的標志鎖有點問題,中斷都跳過了還要中斷干嘛?
作者: hz_dyg    時間: 2021-1-25 17:11
如果邏輯互不干擾,就分成兩個函數
作者: hz_dyg    時間: 2021-1-25 17:13
如果邏輯上互不干擾,就用兩個函數;如果邏輯上有耦合的地方,就需要加鎖或標記了
作者: rundstedt    時間: 2021-1-25 17:36
不要說“一般情況”,在一般情況下,樓主的問題不存在,真正的c語言里面,中斷和主函數都是可以調用同一個函數的,局部變量在調用的時候在堆棧上生成,退出該函數釋放局部變量,沒有什么不能用的。

樓主的情況屬于特殊情況,8051這個體系結構對于高級語言太不友好了,如果用標準c的做法,那點兒可憐的ram很快就會被用光,間址指令很少,這么做不光浪費空間也非常浪費時間。所以c51在這里才用了非標準的做法,局部變量地址固定,在鏈接后就有了具體位置,那么主函數調用這個函數的時候發生中斷調用這個函數,里面的局部變量就全亂套了,中斷返回后,繼續運行主函數調用的這個函數,里面的局部變量值都是錯的。我的辦法就是再寫一個函數,讓主函數和中斷函數調用的不是同一個即可。
作者: f556    時間: 2021-1-26 00:58
剛用IAR試了一下,main中調用,TA中斷內再調用同一個函數,編譯沒有任何問題,看來是編譯器與MCU架構的關系。
作者: rundstedt    時間: 2021-1-26 11:10
f556 發表于 2021-1-26 00:58
剛用IAR試了一下,main中調用,TA中斷內再調用同一個函數,編譯沒有任何問題,看來是編譯器與MCU架構的關系 ...

被你笑死,IAR做過幾十種指令集的編譯器。。。至少在IAR8051這個編譯器上,你說的是錯誤的。
作者: f556    時間: 2021-1-26 22:31
rundstedt 發表于 2021-1-26 11:10
被你笑死,IAR做過幾十種指令集的編譯器。。。至少在IAR8051這個編譯器上,你說的是錯誤的。

“.....看來是編譯器與MCU架構的關系”
有這句話。我沒有說IAR的C51可以!

作者: rundstedt    時間: 2021-1-26 23:04
f556 發表于 2021-1-26 22:31
“.....看來是編譯器與MCU架構的關系”
有這句話。我沒有說IAR的C51可以!

我當然知道你用的IAR一定不是51平臺的,只是提醒你以后發言要把自己要表達的內容說清楚,你瞧你這次回復還是沒說清楚你用的IAR到底是什么不是?
作者: rundstedt    時間: 2021-1-27 13:38
最后說一下,主函數和中斷能不能同時調用同一個函數,看編譯器是否支持遞歸即可。標準c語言是支持的,那么就可以隨便調用。大部分8位單片機c語言不支持,那就不能用。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1