關於 STM32 在使用 C++ 進行編程時無法進行中斷(觸發中斷就死迴圈)的問題

来源:https://www.cnblogs.com/Starsdust/archive/2023/08/18/17641685.html
-Advertisement-
Play Games

他媽的!!!就因為這破事導致我浪費了兩天的時間!!! 都是基礎不扎實的鍋,導致我沒能第一時間想到問題的關鍵 好了,平復一下心情,快速的寫一篇博客來記錄這個叼問題 ## 解決方法 先把結論放在這裡:用`extern "C" {}`把中斷函數包起來 ```C++ // 就像這樣 extern "C" { ...


他媽的!!!就因為這破事導致我浪費了兩天的時間!!!

都是基礎不扎實的鍋,導致我沒能第一時間想到問題的關鍵

好了,平復一下心情,快速的寫一篇博客來記錄這個叼問題

解決方法

先把結論放在這裡:用extern "C" {}把中斷函數包起來

// 就像這樣
extern "C" {
void EXTI4_IRQHandler() {
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);
}
}

問題解決,現在來講述一下過程

開端

本來我是想寫一個 RS485 通信模塊的,但是寫好之後發現發送正常,但是接收的時候沒有反應

在主程式加上 LED 閃爍以後,我發現每次發送數據,單片機都是直接卡死

然後我想了個招,使用調試器在程式運行的時候進行暫停,發現它卡在了Default_Handler之中,而這是個死迴圈

考慮到 .s 文件中,如果找不到同名函數,就直接進入Default_Handler

好了,現在程式卡死的原因找到了,可又是什麼導致了這個現象呢?我陷入了迷惘

折磨

找不到同名函數就卡死?我看了看我寫在 main 文件裡面的函數,確定了不是名字打錯了

也不是函數名的問題,事情逐漸變得棘手

我抱著僥幸心態在 .h 文件加上了中斷函數的定義,毫無疑問沒有任何用

由於我用的 platformio + Clion 來編寫的程式,我想著或許是編譯器的問題。因為這在我用 Keil 的時候是沒有發生過的

或許是 sdcc 的bug?但是不管怎麼搜都搜不到相關的資料

事情到此進入了僵局

解決

我不死心,去運行了正點原子的示例,不出我所料,它非常正常的運行了

於是我靈光一現,將所有相關文件扔到了 CLion 裡面,改好了 include 的路徑,一運行,嗨,成了!

直接給我震驚到了,這說明肯定是我的代碼哪裡有問題!

但是我對自己的代碼質量還是有點信心的,我左看看,右看看,一眼瞧到了複製來文件上面大大的 .c 尾碼名!

我感覺自己把握到了關鍵點,直接就把所有的 .c 全改成了 .cpp

再一試,壞了,好了!問題找到了!

我直接打開我的項目工程,啪啪啪把extern "C"敲了上去,果然好了!

我直接仰天長嘯:我!好!菜!啊!

原因分析

其實這個問題說透了也很簡單,就是因為 C++ 和 C 語言編譯結果不同導致的

因為 C++ 是允許同名函數的,也就是通過不同的參數進行重載,這就會導致函數名稱和編譯後的不相同

比如EXTI4_IRQHandler()這個函數,放在 C++ 裡面編譯後指不定就變成了EXTI4_IRQHandler_void

這跟 .s 文件裡面預先聲明的函數不能說一點不相干,只能說完全不一樣

加上extern "C"以後,編譯器就會按照 C 語言的標準編譯,就可以正確的被中斷調用到了


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C++ STL(Standard Template Library)是C++標準庫中的一個重要組成部分,提供了豐富的模板函數和容器,用於處理各種數據結構和演算法。在STL中,排序、算數和集合演算法是常用的功能,可以幫助我們對數據進行排序、統計、查找以及集合操作等。STL提供的這些演算法,能夠滿足各種數據處... ...
  • 為衡量個人能力水平自創的一套評分機制,根據時間、代碼行數、基礎理論三個變數生成。使用lua語言編寫,輸出成三個markdown表格。 ...
  • > 本文以一個通過正常註冊攔截器流程註冊攔截器失敗的實際場景,來帶領大家閱讀源碼,體會Spring的HandlerInterceptor攔截器整個工作流程 ### 簡單認識 org.springframework.web.servlet.HandlerInterceptor是Spring框架中的一個 ...
  • # 【狂神說Java】Java零基礎學習筆記-面向對象 ## 面向對象01:什麼是面向對象 ### 面向過程&面向對象 - 面向過程思想 - 步驟清晰簡單,第一步做什麼,第二步做什麼.... - 面對過程適合處理一些較為簡單的問題 - 面向對象思想 - 物以類聚,**分類**的思維模式,思考問題首先 ...
  • **即時編譯器優化技術一覽:** ![](https://img2023.cnblogs.com/blog/3256961/202308/3256961-20230816153001309-163136082.png) ![](https://img2023.cnblogs.com/blog/325 ...
  • # Unity 如何獲取Texture 的記憶體大小 在Unity中,要獲取Texture的記憶體文件大小,可以使用UnityEditor.TextureUtil類中的一些函數。這些函數提供了獲取存儲記憶體大小和運行時記憶體大小的方法。由於UnityEditor.TextureUtil是一個內部類,我們需要 ...
  • ## 引言 今天在做一個設置文件夾路徑的功能,就是一個文本框,加個按鈕,點擊按鈕,彈出 `FolderBrowserDialog` 再選擇文件夾路徑,簡單做法,可以直接 `StackPanel` 橫向放置一個 `TextBox` 和一個 `Image Button`,然後點擊按鈕在 後臺代碼中給 ` ...
  • # Unity 編輯器資源導入處理函數 OnPreprocessTexture 用法 [![https://github.com/AlianBlank/download.unity.com](https://img2023.cnblogs.com/other/406187/202308/406187 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...