找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

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

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

使用道具 舉報(bào)

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

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

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

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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