国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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語言
    +關注

    關注

    183

    文章

    7644

    瀏覽量

    145570
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67501
  • 中斷函數
    +關注

    關注

    0

    文章

    13

    瀏覽量

    5650

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    嵌入式開發常用函數速查表

    在嵌入式開發中,掌握常用函數的用法可以大大提高開發效率。無論是單片機初學者還是有一定經驗的工程師,熟悉函數庫和調用方式都是必備技能。今天,我們為大家整理一份嵌入式開發常用函數速查表,覆
    的頭像 發表于 01-19 09:06 ?303次閱讀
    嵌入式開發常用<b class='flag-5'>函數</b>速查表

    瑞薩RA系列FSP庫開發實戰指南之DMAC中斷回調函數

    調用R_DMAC_SoftwareStart函數來發起軟件觸發請求信號來啟動DMAC傳輸。
    的頭像 發表于 12-26 09:25 ?4832次閱讀

    西門子PLC中函數FC的使用方法

    函數函數塊作為模塊化編程的重要組成部分,在PLC 用戶程序中有著相當頻繁的應用。兩者在生成與使用的過程中都有一定的相似,且都不能單獨使用。而需要賦予特定的功能,由組織塊(OB)直接
    的頭像 發表于 12-19 11:26 ?4208次閱讀
    西門子PLC中<b class='flag-5'>函數</b>FC的使用方法

    中斷函數問題

    main.c中:// 適配啟動文件cstartup.asm:綁定中斷函數中斷向量 #define CSCC_INTERRUPT_FUNCTION_ADDR INT_FUNCTION void
    發表于 12-14 21:24

    函數調用性能消耗

    函數調用對于處理器的性能消耗是很小的,只占有函數執行工作中性能消耗的一小部分。參數傳入函數變量寄存器中有一定的限制。這些參數必須是整型兼容的
    發表于 12-12 07:50

    使用setjmp及longjmp函數處理異常

    ,例如在發生錯誤或異常時,直接跳轉到錯誤處理或資源釋放的代碼,而不需要逐層返回。setjmp和longjmp函數定義在setjmp.h頭文件中,其語法為: int setjmp(jmp_buf
    發表于 12-11 08:00

    回調函數例子的應用

    步驟,這里的的例子就是,利用一個狀態機函數(根據不同狀態依次調用不同實現方法的函數),通過回調函數的方式依次調用不同的
    發表于 12-11 07:23

    使用信號處理函數

    使用信號處理函數:這是一種用于處理運行時異常的方法,就是在程序中注冊一些信號處理函數,用于響應系統或用戶發送的一些信號。信號是一種軟件
    發表于 12-11 06:40

    如何用函數指針調用函數

    ;please enter a and b:\"); scanf(\"%d%d\",a,b); c = (*p)(a, b);//通過函數指針調用Max函數
    發表于 12-11 06:26

    控制流和函數調用的精細調整

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

    詳解hal_entry入口函數

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

    C語言中的內聯函數與宏

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

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

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

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

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

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

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