一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

為什么中斷處理函數(shù)不能直接調(diào)用不可重入函數(shù)

strongerHuang ? 來(lái)源:strongerHuang ? 作者:C語(yǔ)言與CPP編程 ? 2021-02-17 09:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1 前言

最近在公司維護(hù)的項(xiàng)目中碰到一個(gè)解決了定位很久的 bug , bug 找到的時(shí)候發(fā)現(xiàn)犯了很低級(jí)的錯(cuò)誤——在中斷處理函數(shù)中調(diào)用了 printf 函數(shù),因?yàn)橹袛嗵幚砗瘮?shù)的調(diào)用了不可重入函數(shù),導(dǎo)致中斷丟失和系統(tǒng)位置錯(cuò)誤,這里直接導(dǎo)致嵌入式 linux 系統(tǒng)應(yīng)用進(jìn)程中的所有線程停掉,進(jìn)而導(dǎo)致看門(mén)狗進(jìn)程得不到喂狗,設(shè)備重啟。

那什么是不可重入函數(shù)呢?

為什么中斷處理函數(shù)不能直接調(diào)用不可重入函數(shù)?

怎樣寫(xiě)可重入函數(shù)?

就以上三個(gè)問(wèn)題展開(kāi)小短文:

2 什么是不可重入函數(shù)?

可重入函數(shù)主要用于多任務(wù)環(huán)境中,一個(gè)可重入的函數(shù)簡(jiǎn)單來(lái)說(shuō)就是可以被中斷的函數(shù),也就是說(shuō),可以在這個(gè)函數(shù)執(zhí)行的任何時(shí)刻中斷它,轉(zhuǎn)入 OS 調(diào)度下去執(zhí)行另外一段代碼,而返回控制時(shí)不會(huì)出現(xiàn)什么錯(cuò)誤;而不可重入的函數(shù)由于使用了一些系統(tǒng)資源,比如全局變量區(qū),中斷向量表等,所以它如果被中斷的話,可能會(huì)出現(xiàn)問(wèn)題,這類函數(shù)是不能運(yùn)行在多任務(wù)環(huán)境下的。

滿足下列條件的函數(shù)多數(shù)是不可重入的:

函數(shù)體內(nèi)使用了靜態(tài)(static)的數(shù)據(jù)結(jié)構(gòu);

函數(shù)體內(nèi)調(diào)用了 malloc() 或者 free() 函數(shù);

函數(shù)體內(nèi)調(diào)用了標(biāo)準(zhǔn) I/O 函數(shù);

A. 可重入函數(shù)

o4YBAF_2ZTuAc1xyAAAeslwkBXY186.jpg

B. 不可重入函數(shù)1

o4YBAF_2ZU2AR4Z7AAAkUu9cugE344.jpg

C. 不可重入函數(shù)2

pIYBAF_2ZV6AJsskAAAo5ZMEv4M490.jpg

3 為什么中斷處理函數(shù)不能直接調(diào)用不可重入函數(shù)?

在多任務(wù)系統(tǒng)下,中斷可能在任務(wù)執(zhí)行的任何時(shí)間發(fā)生;如果一個(gè)函數(shù)的執(zhí)行期間被中斷后,到重新恢復(fù)到斷點(diǎn)進(jìn)行執(zhí)行的過(guò)程中,函數(shù)所依賴的環(huán)境沒(méi)有發(fā)生改變,那么這個(gè)函數(shù)就是可重入的,否則就不可重入。

在中斷前后不都要保存和恢復(fù)上下文嗎,怎么會(huì)出現(xiàn)函數(shù)所依賴的環(huán)境發(fā)生改變了呢?我們知道中斷時(shí)確實(shí)保存一些上下文,但是僅限于返回地址,cpu 寄存器等之類的少量上下文,而函數(shù)內(nèi)部使用的諸如全局或靜態(tài)變量,buffer 等并不在保護(hù)之列,所以如果這些值在函數(shù)被中斷期間發(fā)生了改變,那么當(dāng)函數(shù)回到斷點(diǎn)繼續(xù)執(zhí)行時(shí),其結(jié)果就不可預(yù)料了。

在中斷處理函數(shù)中調(diào)用有互斥鎖保護(hù)的全局變量,如果恰好該變量正在被另一個(gè)線程調(diào)用,會(huì)導(dǎo)致中斷處理函數(shù)不能及時(shí)返回,導(dǎo)致中斷丟失等嚴(yán)重問(wèn)題。

并且在多線程環(huán)境中使用,在沒(méi)有加鎖的情況下,對(duì)同一段內(nèi)存塊進(jìn)行并發(fā)讀寫(xiě),就會(huì)造成 segmentfault/coredump 之類的問(wèn)題。

總而言之,中斷處理函數(shù)做的事情越簡(jiǎn)單越好。

4 如何寫(xiě)出可重入的函數(shù)?

在函數(shù)體內(nèi)不訪問(wèn)那些全局變量;

如果必須訪問(wèn)全局變量,記住利用互斥信號(hào)量來(lái)保護(hù)全局變量?;蛘哒{(diào)用該函數(shù)前關(guān)中斷,調(diào)用后再開(kāi)中斷;

不使用靜態(tài)局部變量;

堅(jiān)持只使用缺省態(tài)(auto)局部變量;

在和硬件發(fā)生交互的時(shí)候,切記關(guān)閉硬件中斷。完成交互記得打開(kāi)中斷,在有些系列上,這叫做“進(jìn)入/退出核心”或者用 OS_ENTER_KERNAL/OS_EXIT_KERNAL 來(lái)描述;

不能調(diào)用任何不可重入的函數(shù);

謹(jǐn)慎使用堆棧。最好先在使用前先 OS_ENTER_KERNAL;

責(zé)任編輯:xj

原文標(biāo)題:中斷函數(shù)調(diào)用不可重入函數(shù)的后果

文章出處:【微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141548
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4379

    瀏覽量

    64785
  • 中斷函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    5486

原文標(biāo)題:中斷函數(shù)調(diào)用不可重入函數(shù)的后果

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    為什么中斷回調(diào)函數(shù)不能使用接收中斷開(kāi)啟函數(shù)?

    我看(書(shū)是基于stm32f407編寫(xiě))書(shū)上說(shuō)在串口接收中斷回調(diào)函數(shù)里面不能使用 接收中斷開(kāi)啟函數(shù),書(shū)上是利用自己創(chuàng)建了空閑
    發(fā)表于 05-28 07:19

    為什么中斷回調(diào)函數(shù)不能使用接收中斷開(kāi)啟函數(shù)?

    我看(書(shū)是基于stm32f407編寫(xiě))書(shū)上說(shuō)在串口接收中斷回調(diào)函數(shù)里面不能使用 接收中斷開(kāi)啟函數(shù),書(shū)上是利用自己創(chuàng)建了空閑
    發(fā)表于 04-22 08:19

    函數(shù)指針的六個(gè)常見(jiàn)應(yīng)用場(chǎng)景

    函數(shù)指針在嵌入式開(kāi)發(fā)中有著廣泛的應(yīng)用,它讓代碼更加靈活,減少冗余,提高可擴(kuò)展性。很多時(shí)候,我們需要根據(jù)不同的情況動(dòng)態(tài)調(diào)用不同的函數(shù),而函數(shù)指針正是實(shí)現(xiàn)這一需求的重要工具。本文將介紹六個(gè)
    的頭像 發(fā)表于 04-07 11:58 ?494次閱讀
    <b class='flag-5'>函數(shù)</b>指針的六個(gè)常見(jiàn)應(yīng)用場(chǎng)景

    C語(yǔ)言如何處理函數(shù)的返回值

    當(dāng)你在函數(shù)的最后寫(xiě)上 return 0 的時(shí)候,它是如何返回給調(diào)用函數(shù)的? 比如 test 函數(shù),為了待會(huì)更好的看懂匯編代碼,我寫(xiě)成了 return 1234。
    的頭像 發(fā)表于 01-16 09:21 ?443次閱讀

    如何把兩個(gè)數(shù)據(jù)返回給調(diào)用函數(shù)

    函數(shù)處理結(jié)果包含兩個(gè)數(shù)據(jù),如何把兩個(gè)數(shù)據(jù)返回給調(diào)用函數(shù)? 第一種,把兩個(gè)數(shù)據(jù)封裝成一個(gè)結(jié)構(gòu)體,函數(shù)返回結(jié)構(gòu)體。
    的頭像 發(fā)表于 01-08 10:15 ?399次閱讀

    EE-128:C語(yǔ)言中的DSP:從C調(diào)用匯編類成員函數(shù)

    電子發(fā)燒友網(wǎng)站提供《EE-128:C語(yǔ)言中的DSP:從C調(diào)用匯編類成員函數(shù).pdf》資料免費(fèi)下載
    發(fā)表于 01-07 13:48 ?0次下載
    EE-128:C語(yǔ)言中的DSP:從C<b class='flag-5'>調(diào)用</b>匯編類成員<b class='flag-5'>函數(shù)</b>

    HAL庫(kù)的函數(shù)調(diào)用示例

    HAL(Hardware Abstraction Layer,硬件抽象層)庫(kù)是STM32等微控制器中常用的庫(kù),它為開(kāi)發(fā)者提供了訪問(wèn)和控制硬件設(shè)備的接口。以下是一些常用的HAL庫(kù)函數(shù)及其調(diào)用示例: 一
    的頭像 發(fā)表于 12-02 14:01 ?1578次閱讀

    c51單片機(jī)中斷

    的其他函數(shù)通過(guò)函數(shù)調(diào)用語(yǔ)句(如 C 語(yǔ)言中的函數(shù)名加括號(hào)的形式)來(lái)調(diào)用的。 中斷
    發(fā)表于 11-25 21:43

    關(guān)于中斷知識(shí)學(xué)習(xí)總結(jié)筆記

    硬件觸發(fā),其調(diào)用不受程序邏輯的常規(guī)控制,如果進(jìn)行遞歸調(diào)用且沒(méi)有正確處理終止條件,每一次遞歸都會(huì)占用額外的??臻g,很容易導(dǎo)致棧溢出,進(jìn)而引發(fā)系統(tǒng)崩潰。例如,在一個(gè)中斷
    發(fā)表于 11-23 11:23

    RNN的損失函數(shù)與優(yōu)化算法解析

    RNN的損失函數(shù) RNN(循環(huán)神經(jīng)網(wǎng)絡(luò))在處理序列數(shù)據(jù)的過(guò)程中,損失函數(shù)(Loss Function)扮演著重要的角色,它可以測(cè)量模型在訓(xùn)練中的表現(xiàn),并推動(dòng)模型朝著正確的方向?qū)W習(xí)。RNN中常見(jiàn)的損失
    的頭像 發(fā)表于 11-15 10:16 ?1379次閱讀

    如何優(yōu)化SUMIF函數(shù)的效率

    在Excel中, SUMIF 函數(shù)是一個(gè)非常有用的工具,它可以根據(jù)指定的條件對(duì)數(shù)據(jù)進(jìn)行求和。然而,在處理大量數(shù)據(jù)時(shí), SUMIF 函數(shù)可能會(huì)變得效率低下。以下是一些優(yōu)化 SUMIF 函數(shù)
    的頭像 發(fā)表于 11-11 09:20 ?1313次閱讀

    SUMIF函數(shù)對(duì)比VLOOKUP的優(yōu)勢(shì)

    在Excel中,數(shù)據(jù)管理和分析是日常工作中不可或缺的一部分。SUMIF函數(shù)和VLOOKUP函數(shù)是兩個(gè)非常受歡迎的函數(shù),它們可以幫助用戶快速地處理
    的頭像 發(fā)表于 11-11 09:16 ?1239次閱讀

    SUMIF函數(shù)與SUMIFS函數(shù)的區(qū)別

    SUMIF函數(shù)和SUMIFS函數(shù)都是Excel中用于條件求和的函數(shù),它們可以幫助用戶根據(jù)特定的條件對(duì)數(shù)據(jù)進(jìn)行求和。盡管它們的基本功能相似,但在使用場(chǎng)景和功能上存在一些差異。以下是對(duì)這兩個(gè)函數(shù)
    的頭像 發(fā)表于 10-30 09:51 ?7461次閱讀

    在GD32F407跑了freeRTOS,中斷調(diào)用xEventGroupSetBitsFromISR函數(shù)后就會(huì)死機(jī),為什么?

    在GD32F407跑了freeRTOS,串口接收使用了DMA+IDLE中斷來(lái)實(shí)現(xiàn)不定長(zhǎng)接收,串口的IDLE中斷中接收完數(shù)據(jù)后,通過(guò)事件通知線程執(zhí)行解析,但是中斷調(diào)用xEventGro
    發(fā)表于 07-26 06:37

    定時(shí)器回調(diào)函數(shù)不能用ICACHE_FLASH_ATTR定義?

    非 OS SDK 在中斷處理函數(shù)中,請(qǐng)勿使用任何 ICACHE_FLASH_ATTR 定義的函數(shù)。 請(qǐng)問(wèn): 1、定時(shí)器和hw定時(shí)器的回調(diào)函數(shù)
    發(fā)表于 07-22 06:33