找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2320|回復(fù): 13
收起左側(cè)

關(guān)于C語言重入函數(shù)

[復(fù)制鏈接]
ID:847202 發(fā)表于 2021-1-11 20:24 來自手機(jī) | 顯示全部樓層 |閱讀模式
程序編譯的時候出現(xiàn)警告,經(jīng)過查資料后發(fā)現(xiàn)是有一個子函數(shù),被主函數(shù)和中斷都調(diào)用了,所以出現(xiàn)了警告。請問那個重入函數(shù)怎么寫?求指導(dǎo)
回復(fù)

使用道具 舉報

ID:57657 發(fā)表于 2021-1-11 23:04 | 顯示全部樓層
主函數(shù)正在調(diào)用該函數(shù)且未返回,再被中斷搶占就會造成內(nèi)存錯亂。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:373388 發(fā)表于 2021-1-11 23:25 | 顯示全部樓層
本帖最后由 xhaity 于 2021-1-11 23:28 編輯

一般情況下,中斷和主函數(shù)不調(diào)用同一函數(shù),一定要調(diào)用的話,那就用鎖標(biāo)志,主函數(shù)正在執(zhí)行某部分時,做鎖標(biāo)記,沒執(zhí)行完,在中斷調(diào)用查該標(biāo)志,如果有鎖,跳過該程序段。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:373388 發(fā)表于 2021-1-11 23:31 | 顯示全部樓層
一般情況下,中斷和主函數(shù)不調(diào)用同一函數(shù),一定要調(diào)用的話,那就用鎖標(biāo)志,主函數(shù)正在執(zhí)行某部分時,做鎖標(biāo)志,執(zhí)行完清除;中斷中查詢該標(biāo)志,如果該標(biāo)志存在,就跳過該段。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:876745 發(fā)表于 2021-1-12 14:19 | 顯示全部樓層
一般情況下,別在中斷調(diào)子函數(shù),留個標(biāo)志就可以了,比如累加。再根據(jù)標(biāo)志寫函數(shù)。
回復(fù)

使用道具 舉報

ID:876745 發(fā)表于 2021-1-12 14:27 | 顯示全部樓層
zyztoto 發(fā)表于 2021-1-12 14:19
一般情況下,別在中斷調(diào)子函數(shù),留個標(biāo)志就可以了,比如累加。再根據(jù)標(biāo)志寫函數(shù)。

樓上的標(biāo)志鎖有點問題,中斷都跳過了還要中斷干嘛?
回復(fù)

使用道具 舉報

ID:298123 發(fā)表于 2021-1-25 17:11 | 顯示全部樓層
如果邏輯互不干擾,就分成兩個函數(shù)
回復(fù)

使用道具 舉報

ID:298123 發(fā)表于 2021-1-25 17:13 | 顯示全部樓層
如果邏輯上互不干擾,就用兩個函數(shù);如果邏輯上有耦合的地方,就需要加鎖或標(biāo)記了
回復(fù)

使用道具 舉報

ID:879809 發(fā)表于 2021-1-25 17:36 | 顯示全部樓層
不要說“一般情況”,在一般情況下,樓主的問題不存在,真正的c語言里面,中斷和主函數(shù)都是可以調(diào)用同一個函數(shù)的,局部變量在調(diào)用的時候在堆棧上生成,退出該函數(shù)釋放局部變量,沒有什么不能用的。

樓主的情況屬于特殊情況,8051這個體系結(jié)構(gòu)對于高級語言太不友好了,如果用標(biāo)準(zhǔn)c的做法,那點兒可憐的ram很快就會被用光,間址指令很少,這么做不光浪費(fèi)空間也非常浪費(fèi)時間。所以c51在這里才用了非標(biāo)準(zhǔn)的做法,局部變量地址固定,在鏈接后就有了具體位置,那么主函數(shù)調(diào)用這個函數(shù)的時候發(fā)生中斷調(diào)用這個函數(shù),里面的局部變量就全亂套了,中斷返回后,繼續(xù)運(yùn)行主函數(shù)調(diào)用的這個函數(shù),里面的局部變量值都是錯的。我的辦法就是再寫一個函數(shù),讓主函數(shù)和中斷函數(shù)調(diào)用的不是同一個即可。

評分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:282850 發(fā)表于 2021-1-26 00:58 | 顯示全部樓層
剛用IAR試了一下,main中調(diào)用,TA中斷內(nèi)再調(diào)用同一個函數(shù),編譯沒有任何問題,看來是編譯器與MCU架構(gòu)的關(guān)系。
回復(fù)

使用道具 舉報

ID:879809 發(fā)表于 2021-1-26 11:10 來自手機(jī) | 顯示全部樓層
f556 發(fā)表于 2021-1-26 00:58
剛用IAR試了一下,main中調(diào)用,TA中斷內(nèi)再調(diào)用同一個函數(shù),編譯沒有任何問題,看來是編譯器與MCU架構(gòu)的關(guān)系 ...

被你笑死,IAR做過幾十種指令集的編譯器。。。至少在IAR8051這個編譯器上,你說的是錯誤的。
回復(fù)

使用道具 舉報

ID:282850 發(fā)表于 2021-1-26 22:31 | 顯示全部樓層
rundstedt 發(fā)表于 2021-1-26 11:10
被你笑死,IAR做過幾十種指令集的編譯器。。。至少在IAR8051這個編譯器上,你說的是錯誤的。

“.....看來是編譯器與MCU架構(gòu)的關(guān)系”
有這句話。我沒有說IAR的C51可以!
回復(fù)

使用道具 舉報

ID:879809 發(fā)表于 2021-1-26 23:04 | 顯示全部樓層
f556 發(fā)表于 2021-1-26 22:31
“.....看來是編譯器與MCU架構(gòu)的關(guān)系”
有這句話。我沒有說IAR的C51可以!

我當(dāng)然知道你用的IAR一定不是51平臺的,只是提醒你以后發(fā)言要把自己要表達(dá)的內(nèi)容說清楚,你瞧你這次回復(fù)還是沒說清楚你用的IAR到底是什么不是?
回復(fù)

使用道具 舉報

ID:879809 發(fā)表于 2021-1-27 13:38 | 顯示全部樓層
最后說一下,主函數(shù)和中斷能不能同時調(diào)用同一個函數(shù),看編譯器是否支持遞歸即可。標(biāo)準(zhǔn)c語言是支持的,那么就可以隨便調(diào)用。大部分8位單片機(jī)c語言不支持,那就不能用。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表