在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么中斷處理函數不能直接調用不可重入函數

strongerHuang ? 來源:strongerHuang ? 作者:C語言與CPP編程 ? 2021-02-17 09:33 ? 次閱讀

1 前言

最近在公司維護的項目中碰到一個解決了定位很久的 bug , bug 找到的時候發現犯了很低級的錯誤——在中斷處理函數中調用了 printf 函數,因為中斷處理函數的調用了不可重入函數,導致中斷丟失和系統位置錯誤,這里直接導致嵌入式 linux 系統應用進程中的所有線程停掉,進而導致看門狗進程得不到喂狗,設備重啟。

那什么是不可重入函數呢?

為什么中斷處理函數不能直接調用不可重入函數?

怎樣寫可重入函數?

就以上三個問題展開小短文:

2 什么是不可重入函數?

可重入函數主要用于多任務環境中,一個可重入的函數簡單來說就是可以被中斷的函數,也就是說,可以在這個函數執行的任何時刻中斷它,轉入 OS 調度下去執行另外一段代碼,而返回控制時不會出現什么錯誤;而不可重入的函數由于使用了一些系統資源,比如全局變量區,中斷向量表等,所以它如果被中斷的話,可能會出現問題,這類函數是不能運行在多任務環境下的。

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

函數體內使用了靜態(static)的數據結構;

函數體內調用了 malloc() 或者 free() 函數;

函數體內調用了標準 I/O 函數;

A. 可重入函數

o4YBAF_2ZTuAc1xyAAAeslwkBXY186.jpg

B. 不可重入函數1

o4YBAF_2ZU2AR4Z7AAAkUu9cugE344.jpg

C. 不可重入函數2

pIYBAF_2ZV6AJsskAAAo5ZMEv4M490.jpg

3 為什么中斷處理函數不能直接調用不可重入函數?

在多任務系統下,中斷可能在任務執行的任何時間發生;如果一個函數的執行期間被中斷后,到重新恢復到斷點進行執行的過程中,函數所依賴的環境沒有發生改變,那么這個函數就是可重入的,否則就不可重入。

在中斷前后不都要保存和恢復上下文嗎,怎么會出現函數所依賴的環境發生改變了呢?我們知道中斷時確實保存一些上下文,但是僅限于返回地址,cpu 寄存器等之類的少量上下文,而函數內部使用的諸如全局或靜態變量,buffer 等并不在保護之列,所以如果這些值在函數被中斷期間發生了改變,那么當函數回到斷點繼續執行時,其結果就不可預料了。

在中斷處理函數中調用有互斥鎖保護的全局變量,如果恰好該變量正在被另一個線程調用,會導致中斷處理函數不能及時返回,導致中斷丟失等嚴重問題。

并且在多線程環境中使用,在沒有加鎖的情況下,對同一段內存塊進行并發讀寫,就會造成 segmentfault/coredump 之類的問題。

總而言之,中斷處理函數做的事情越簡單越好。

4 如何寫出可重入的函數?

在函數體內不訪問那些全局變量;

如果必須訪問全局變量,記住利用互斥信號量來保護全局變量。或者調用該函數前關中斷,調用后再開中斷;

不使用靜態局部變量;

堅持只使用缺省態(auto)局部變量;

在和硬件發生交互的時候,切記關閉硬件中斷。完成交互記得打開中斷,在有些系列上,這叫做“進入/退出核心”或者用 OS_ENTER_KERNAL/OS_EXIT_KERNAL 來描述;

不能調用任何不可重入的函數;

謹慎使用堆棧。最好先在使用前先 OS_ENTER_KERNAL;

責任編輯:xj

原文標題:中斷函數調用不可重入函數的后果

文章出處:【微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140545
  • 函數
    +關注

    關注

    3

    文章

    4372

    瀏覽量

    64287
  • 中斷函數
    +關注

    關注

    0

    文章

    13

    瀏覽量

    5448

原文標題:中斷函數調用不可重入函數的后果

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    為什么中斷回調函數不能使用接收中斷開啟函數

    我看(書是基于stm32f407編寫)書上說在串口接收中斷回調函數里面不能使用 接收中斷開啟函數,書上是利用自己創建了空閑
    發表于 05-28 07:19

    為什么中斷回調函數不能使用接收中斷開啟函數

    我看(書是基于stm32f407編寫)書上說在串口接收中斷回調函數里面不能使用 接收中斷開啟函數,書上是利用自己創建了空閑
    發表于 04-22 08:19

    函數指針的六個常見應用場景

    函數指針在嵌入式開發中有著廣泛的應用,它讓代碼更加靈活,減少冗余,提高可擴展性。很多時候,我們需要根據不同的情況動態調用不同的函數,而函數指針正是實現這一需求的重要工具。本文將介紹六個
    的頭像 發表于 04-07 11:58 ?378次閱讀
    <b class='flag-5'>函數</b>指針的六個常見應用場景

    C語言如何處理函數的返回值

    當你在函數的最后寫上 return 0 的時候,它是如何返回給調用函數的? 比如 test 函數,為了待會更好的看懂匯編代碼,我寫成了 return 1234。
    的頭像 發表于 01-16 09:21 ?377次閱讀

    如何把兩個數據返回給調用函數

    函數處理結果包含兩個數據,如何把兩個數據返回給調用函數? 第一種,把兩個數據封裝成一個結構體,函數返回結構體。
    的頭像 發表于 01-08 10:15 ?362次閱讀

    EE-128:C語言中的DSP:從C調用匯編類成員函數

    電子發燒友網站提供《EE-128:C語言中的DSP:從C調用匯編類成員函數.pdf》資料免費下載
    發表于 01-07 13:48 ?0次下載
    EE-128:C語言中的DSP:從C<b class='flag-5'>調用</b>匯編類成員<b class='flag-5'>函數</b>

    HAL庫的函數調用示例

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

    c51單片機中斷

    的其他函數通過函數調用語句(如 C 語言中的函數名加括號的形式)來調用的。 中斷
    發表于 11-25 21:43

    關于中斷知識學習總結筆記

    硬件觸發,其調用不受程序邏輯的常規控制,如果進行遞歸調用且沒有正確處理終止條件,每一次遞歸都會占用額外的棧空間,很容易導致棧溢出,進而引發系統崩潰。例如,在一個中斷
    發表于 11-23 11:23

    如何優化SUMIF函數的效率

    在Excel中, SUMIF 函數是一個非常有用的工具,它可以根據指定的條件對數據進行求和。然而,在處理大量數據時, SUMIF 函數可能會變得效率低下。以下是一些優化 SUMIF 函數
    的頭像 發表于 11-11 09:20 ?1119次閱讀

    SUMIF函數對比VLOOKUP的優勢

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

    SUMIF函數與SUMIFS函數的區別

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

    在GD32F407跑了freeRTOS,中斷調用xEventGroupSetBitsFromISR函數后就會死機,為什么?

    在GD32F407跑了freeRTOS,串口接收使用了DMA+IDLE中斷來實現不定長接收,串口的IDLE中斷中接收完數據后,通過事件通知線程執行解析,但是中斷調用xEventGro
    發表于 07-26 06:37

    定時器回調函數不能用ICACHE_FLASH_ATTR定義?

    非 OS SDK 在中斷處理函數中,請勿使用任何 ICACHE_FLASH_ATTR 定義的函數。 請問: 1、定時器和hw定時器的回調函數
    發表于 07-22 06:33

    實現一個ns級的延時函數,延時時間不可控的原因?

    現在要實現一個ns級的延時函數,用nop指令已經調試完成,然而問題在于這個延時函數經常被中斷,導致延時時間不可控,我在延時函數前后加了 p
    發表于 06-26 06:50
    主站蜘蛛池模板: 天天曰天天爽 | 男男浪荡双性受hplay | 亚洲成人高清 | 免费高清在线观看a网站 | 亚洲精品美女在线观看 | 91成人免费福利网站在线 | 天天狠狠干 | 视频免费播放 | 五月婷婷综合激情网 | 色女人在线| 深夜视频在线免费 | 亚洲一区二区在线视频 | 男女午夜剧场 | 天堂网www在线 | 免费91视频| 日本三级黄色网址 | 午夜影视啪啪免费体验区入口 | 狠狠做深爱婷婷久久一区 | 欧美成人午夜毛片免费影院 | 韩国三级中文字幕hd | 国产精品久久久福利 | 道区二区三区四区 | 人人射人人澡 | 色婷婷在线视频 | 色综合激情丁香七月色综合 | 日本黄色网址大全 | 亚洲一区二区高清 | 激情91| 黄字幕网 | 2021久久精品99精品久久 | 种子 在线播放 | 高清成年美女黄网站色大 | 亚洲一区二区精品推荐 | 天天爽夜夜爽一区二区三区 | 国产三级日本三级日产三级66 | 亚洲国产成人久久 | 性欧美护士18xxxxhd | 成人国产一区二区三区 | 未成人禁止视频高清在线观看 | 热99热| 狠狠躁夜夜躁人人爽天天天天 |