色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

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

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

1 前言

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

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

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

怎樣寫可重入函數?

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

2 什么是不可重入函數?

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

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

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

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

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

A. 可重入函數

o4YBAF_2ZTuAc1xyAAAeslwkBXY186.jpg

B. 不可重入函數1

o4YBAF_2ZU2AR4Z7AAAkUu9cugE344.jpg

C. 不可重入函數2

pIYBAF_2ZV6AJsskAAAo5ZMEv4M490.jpg

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

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

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

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

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

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

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

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

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

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

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

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

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

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

責任編輯:xj

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

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

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

    關注

    180

    文章

    7604

    瀏覽量

    136694
  • 函數
    +關注

    關注

    3

    文章

    4327

    瀏覽量

    62573
  • 中斷函數
    +關注

    關注

    0

    文章

    13

    瀏覽量

    5282

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

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

收藏 人收藏

    評論

    相關推薦

    HAL庫的函數調用示例

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

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

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

    FreeRTOS如何在中斷調用內存分配函數

    最近在玩FreeRTOS,遇到一個問題,就是不知如何在中斷調用內存分配函數。pvPortMalloc函數中會調用xTaskResumeAl
    發(fā)表于 05-08 08:25

    IAR庫函數中斷服務程序中無法調用函數是為什么?

    為什么在中斷服務函數里無法調用?定義的變量也不能用!求大神幫忙解決問題!子函數怎么寫,寫到哪,才能用?實在是不知道怎么辦了。
    發(fā)表于 05-08 08:01

    STVD中斷函數如何調用才能放到主函數使用?

    我用的是STVD,一直研究定時器4中斷,網上找了很多資料,現在是定時器4中斷可以正常工作,但是中斷函數只能寫在stm8_interrupt_vector.c這個里面,如果寫到主
    發(fā)表于 04-26 06:25

    STM32中斷相應函數不能持續(xù)嗎?

    在main.c中的測試函數可以使DAC芯片正常輸出多路幅值不同的方波電壓,將其放到中斷it.c文件中,發(fā)現只是輸出直線型電壓,而非方波,請問中斷相應函數
    發(fā)表于 04-08 07:05

    函數多層調用的主要注意事項分析

    應用方案設計中,開發(fā)者經常會碰到某個子函數需要多次多級調用的情況。
    的頭像 發(fā)表于 03-27 15:36 ?841次閱讀
    子<b class='flag-5'>函數</b>多層<b class='flag-5'>調用</b>的主要注意事項分析

    回調函數(callback)是什么?回調函數的實現方法

    回調函數是一種特殊的函數,它作為參數傳遞給另一個函數,并在被調用函數執(zhí)行完畢后被調用。回調
    發(fā)表于 03-12 11:46 ?2903次閱讀

    STM32cubeIDE PA0口外部中斷改變LED燈狀態(tài)時,GPIO翻轉函數放在外部中斷回調函數中不被調用怎么解決?

    STM32cubeIDE PA0口外部中斷改變LED燈狀態(tài)時,GPIO翻轉函數放在外部中斷回調函數中不被調用,放在EXTI0_IRQHand
    發(fā)表于 03-12 06:32

    函數指針與回調函數的應用實例

    通常我們說的指針變量是指向一個整型、字符型或數組等變量,而函數指針是指向函數函數指針可以像一般函數一樣,用于調用
    的頭像 發(fā)表于 03-07 11:13 ?400次閱讀
    <b class='flag-5'>函數</b>指針與回調<b class='flag-5'>函數</b>的應用實例

    內聯函數定義 為什么需要內聯函數

    inline關鍵字是C99標準的型關鍵字,其作用是將函數展開,把函數的代碼復制到每一個調用處。
    的頭像 發(fā)表于 02-19 12:20 ?540次閱讀

    verilog中函數和任務對比

    在verilog中,函數和任務均用來描述共同的代碼段,并且在模式內任意位置被調用,提高代碼效率,讓代碼更加的直觀,提高代碼可讀性。但是在實際使用的過程中,函數和任務也存在諸多的不同,下面將對而這進行
    的頭像 發(fā)表于 02-12 18:43 ?882次閱讀

    中斷調用函數IfxCcu6_PwmBc_updateHallPattern時,寄存器MCMOUTS的值為什么不能更新到MCMOUT中?

    中斷調用函數IfxCcu6_PwmBc_updateHallPattern時,寄存器MCMOUTS的值為什么不能更新到MCMOUT中
    發(fā)表于 02-05 06:32

    linux用gdb調試遇到函數調用怎么辦?

    linux用gdb調試遇到函數調用怎么辦? 在Linux上使用GDB調試時,遇到函數調用是一個常見的情況。函數
    的頭像 發(fā)表于 01-31 10:33 ?711次閱讀

    GD32 MCU是如何進入中斷函數

    用過GD32 MCU的小伙伴們都知道,程序是順序執(zhí)行的,但當有中斷來的時候程序會跳轉到中斷函數,執(zhí)行完中斷函數后程序又繼續(xù)回到原來的位置繼續(xù)
    的頭像 發(fā)表于 01-30 09:45 ?1070次閱讀
    GD32 MCU是如何進入<b class='flag-5'>中斷</b><b class='flag-5'>函數</b>的
    主站蜘蛛池模板: 国产 交换 丝雨 巅峰| 国产美女裸身网站免费观看视频 | 欧洲精品一区二区不卡观看| 日韩亚洲欧美中文在线| 亚洲精品九色在线网站| 99久久免热在线观看| 国产睡熟迷奷系列网站| 免费精品美女久久久久久久久| 丝袜情趣在线资源二区| 1973性农场未删减版| 国产精品久久久久久久A片冻果 | 后入内射国产一区二区| 欧美fxxx| 妖精视频免费看| 东北嫖妓对白粗口| 绿巨人www在线观看| 香蕉久久夜色精品国产小说| 99精品视频在线观看免费播放| 国产亚洲精品黑人粗大精选| 欧美91精品久久久久网免费| 妖精视频免费看| 国产精品久久人妻无码蜜| 男人团apk| 一个人免费观看在线视频播放| 国产AV国片精品无套内谢无码| 蜜芽最新域名解析网站| 亚洲精品成人a| 丰满的女朋友 在线播放| 內射XXX韩国在线观看| 亚洲日韩在线观看| 国产精品禁18久久久夂久| 秋霞伦理电影在2017韩国在线伦| 曰批国产精品视频免费观看| 国产欧美一区二区三区视频| 全球真实小U女视频合集| 2020国产成人精品免费视频| 激情丛林电影完整在线| 天天看学生视频| 朝鲜美女bbwbbw撒尿| 免费亚洲视频在线观看| 玉林天天论坛|