chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

1 前言

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

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

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

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

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

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

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

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

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

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

函數(shù)體內調用了標準 I/O 函數(shù);

A. 可重入函數(shù)

o4YBAF_2ZTuAc1xyAAAeslwkBXY186.jpg

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

o4YBAF_2ZU2AR4Z7AAAkUu9cugE344.jpg

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

pIYBAF_2ZV6AJsskAAAo5ZMEv4M490.jpg

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

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

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

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

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

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

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

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

如果必須訪問全局變量,記住利用互斥信號量來保護全局變量?;蛘哒{用該函數(shù)前關中斷,調用后再開中斷;

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

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

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

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

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

責任編輯:xj

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

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

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

    關注

    183

    文章

    7642

    瀏覽量

    144625
  • 函數(shù)
    +關注

    關注

    3

    文章

    4406

    瀏覽量

    66843
  • 中斷函數(shù)

    關注

    0

    文章

    13

    瀏覽量

    5619

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    控制流和函數(shù)調用的精細調整

    特性,避免不必要的計算。 函數(shù)調用涉及開銷,因為它需要保存當前執(zhí)行環(huán)境并跳轉到新的執(zhí)行環(huán)境。減少函數(shù)調用,尤其是在頻繁執(zhí)行的循環(huán)中,可以顯著提高性能。 對于簡單且頻繁
    發(fā)表于 11-14 06:32

    深入了解系統(tǒng)調用API:探索操作系統(tǒng)底層的關鍵接口

    一、前言 為什么用戶程序不能直接訪問系統(tǒng)內核模式提供的服務? 在linux中,將程序的運行空間分為內核空間與用戶空間(內核態(tài)和用戶態(tài)),在邏輯上它們之間是相互隔離的,因此用戶程序不能訪問內核數(shù)據(jù)
    的頭像 發(fā)表于 11-03 09:20 ?442次閱讀

    RVMCU課堂「10」: 手把手教你玩轉RVSTAR—處理器內部中斷

    到其對應的中斷服務程序函數(shù)中去。 由此可知,這個參數(shù)配置的是中斷跳轉的中斷服務程序地址。需要注意的是,RV-STAR的中斷向量表是存
    發(fā)表于 10-31 06:12

    詳解hal_entry入口函數(shù)

    當使用RTOS時,程序從main函數(shù)開始進行線程調度;當沒有使用RTOS時,C語言程序的入口函數(shù)main函數(shù)調用了hal_entry函數(shù)。由
    的頭像 發(fā)表于 07-25 15:34 ?1664次閱讀

    C語言中的內聯(lián)函數(shù)與宏

    在C編程中,內聯(lián)函數(shù)和宏都用于避免函數(shù)調用的開銷并編寫可復用的邏輯部分,但它們在工作方式和安全性方面存在顯著差異。
    的頭像 發(fā)表于 07-25 15:10 ?1719次閱讀
    C語言中的內聯(lián)<b class='flag-5'>函數(shù)</b>與宏

    為什么中斷回調函數(shù)不能使用接收中斷開啟函數(shù)?

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

    HarmonyOS5云服務技術分享--ArkTS調用函數(shù)

    根據(jù)場景選擇: ?? API客戶端鑒權(Client適用):APP/本地應用調用 ?? API客戶端鑒權(Server適用):云函數(shù)調用 勾選decode選項(處理表單數(shù)據(jù)必備) ?
    發(fā)表于 05-22 18:22

    verilog模塊的調用、任務和函數(shù)

    在做模塊劃分時,通常會出現(xiàn)這種情形,某個大的模塊中包含了一個或多個功能子模塊,verilog是通過模塊調用或稱為模塊實例化的方式來實現(xiàn)這些子模塊與高層模塊的連接的.
    的頭像 發(fā)表于 05-03 10:29 ?1288次閱讀
    verilog模塊的<b class='flag-5'>調用</b>、任務和<b class='flag-5'>函數(shù)</b>

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

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

    函數(shù)指針的六個常見應用場景

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

    詳解RTOS中的Hook函數(shù)

    Hook函數(shù)是RTOS中的一個關鍵特性,通過該函數(shù),用戶可以增強對任務管理的控制,定義系統(tǒng)行為。
    的頭像 發(fā)表于 03-24 16:14 ?840次閱讀

    使用SysTick_Config函數(shù)寫延時函數(shù),顯示SysTick_Config無法被調用如何解決?

    使用SysTick_Config函數(shù)寫延時函數(shù),但顯示SysTick_Config無法被調用,怎么解決呢?
    發(fā)表于 03-12 06:56

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

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

    如何把兩個數(shù)據(jù)返回給調用函數(shù)

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

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

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