女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

老司機帶你深入理解ST庫中的 assert_param 語句

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 2020-03-14 14:52 ? 次閱讀

還有沒上車的嗎

馬上要開車了

不等了,開始發車

老司機,再稍我一個

車已經發動了

你等下一班車吧

車子運行中,大伙兒坐穩啦!

庫函數中的assert_param

STM8STM32標準外設庫,或者HAL庫的stm8_conf.h、stm32···_conf.h文件中會看見如下一段代碼:

/* #define USE_FULL_ASSERT 1 */

#ifdef USE_FULL_ASSERT

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))

voidassert_failed(uint8_t* file, uint32_t line);

#else

#define assert_param(expr) ((void)0)

#endif

大概意思就是:如果定義了USE_FULL_ASSERT,則會宏定義:#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))

相當于是一個條件語句。

此時,還需要我們實現assert_failed函數,如果不實現,則會報錯(后面來講具體如何實現)。

而在其他地方調用情況(如GPIO)

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

assert_param(IS_GPIO_PIN(GPIO_Pin));

GPIOx->BSRR = GPIO_Pin;

}

調用assert_param的主要作用就是檢測參數正確與否,即我們所說的斷言。

assert_param詳情

1.STM8S中的assert_param

細心的朋友會發現,STM8標準外設庫stm8s_conf.h中開啟了USE_FULL_ASSERT這個宏:

#define USE_FULL_ASSERT (1)

開啟USE_FULL_ASSERT這個宏,就意味著要實現assert_failed((uint8_t *)__FILE__, __LINE__))這個函數;

那么我就在main.c文件下,按照官方的例程實現了assert_failed函數:

#ifdef USE_FULL_ASSERT //斷言(參考官方)

void assert_failed(u8* file, u32 line)

{

while (1)

{

}

}

#endif

2.STM32中的assert_param

在STM32標準外設庫,HAL庫中的USE_FULL_ASSERT這個宏是被屏蔽了的。故程序運行#define assert_param(expr) ((void)0)

也就是沒有做任何處理。

我之前提供的例程中,為了不動官方代碼,assert_param這個函數都是沒有使用的。

3.assert_failed((uint8_t *)__FILE__, __LINE__))

看到這個函數,就要說下__FILE__和__LINE__這兩個標準定義。

__LINE__:正在編譯文件的行號

__FILE__:正在編譯文件的文件名

還不懂的同學,建議參考之前的文章【ANSIC幾種特殊的標準定義(__FILE__、__LINE__、__STDC__···)】。

而上面只是申明,函數具體的實現還需要自己實現。理解了上面兩個參數,相信大家都會知道如何實現了。需要根據自己項目情況來實現。常規舉例:

voidassert_failed(uint8_t* file, uint32_t line)

{

printf("Error code in file:%s,line:%u ",file,line);

}

這條語句在調及產品出廠之前測試是很有必要的,方便分析問題所在。正式推出版本,不定義USE_FULL_ASSERT這個宏既可以關閉了。

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

    關注

    32

    文章

    1170

    瀏覽量

    130154
  • STM32
    +關注

    關注

    2289

    文章

    11011

    瀏覽量

    362355
  • STM8
    +關注

    關注

    18

    文章

    392

    瀏覽量

    57611
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    深入理解C語言:C語言循環控制

    在C語言編程,循環結構是至關重要的,它可以讓程序重復執行特定的代碼塊,從而提高編程效率。然而,為了避免程序進入無限循環,C語言提供了多種循環控制語句,如break、continue和goto,用于
    的頭像 發表于 04-29 18:49 ?790次閱讀
    <b class='flag-5'>深入理解</b>C語言:C語言循環控制

    可靠性測試結構設計概述

    深入理解設計規則,設計者可在可靠性測試結構優化兼顧性能、成本與質量,推動半導體技術的持續創新。
    的頭像 發表于 04-11 14:59 ?343次閱讀
    可靠性測試結構設計概述

    HarmonyOS Next V2 @Local 和@Param

    HarmonyOS Next V2 @Local 和@Param @Local 背景 @Local 是 harmony 應用開發的 v2 版本 對標**@State**的狀態管理修飾器,它解決了
    的頭像 發表于 04-02 18:27 ?289次閱讀
    HarmonyOS Next V2 @Local 和@<b class='flag-5'>Param</b>

    在外部中斷中將printf寫入,外部中斷LED可以翻轉,但串口不可顯示,為什么?

    number where the assert_param error has occurred. where the assert_param error has occurred.
    發表于 03-13 06:19

    技術干貨驛站 ▏深入理解C語言:嵌套循環與循環控制的底層原理

    大家好!在上一節,我們學習了C語言中的基本循環語句,如for、while和do...while循環。今天,我們將進一步探討嵌套循環和循環控制,這些技巧可以幫助我們實現更復雜的邏輯操作。無論是處理
    的頭像 發表于 02-21 18:26 ?450次閱讀
    技術干貨驛站  ▏<b class='flag-5'>深入理解</b>C語言:嵌套循環與循環控制的底層原理

    深入探討Linux系統的動態鏈接機制

    異?;虮罎ⅰ?b class='flag-5'>深入理解動態鏈接機制及其工作原理,我重溫了《程序員的自我修養》,并通過實踐演示與反匯編分析,了解了動態鏈接的過程。 本文將深入探討Linux系統的動態鏈接機制,這其中
    的頭像 發表于 12-18 10:06 ?508次閱讀
    <b class='flag-5'>深入</b>探討Linux系統<b class='flag-5'>中</b>的動態鏈接<b class='flag-5'>庫</b>機制

    深入理解C語言:循環語句的應用與優化技巧

    能讓你的代碼更加簡潔明了,還能顯著提升程序執行效率。本文將詳細介紹C語言中的三種常見循環結構——while循環、for循環和do...while循環,帶你深入理解
    的頭像 發表于 12-07 01:11 ?516次閱讀
    <b class='flag-5'>深入理解</b>C語言:循環<b class='flag-5'>語句</b>的應用與優化技巧

    技術干貨驛站 ▏深入理解C語言:掌握C語言條件判斷,從if到switch的應用

    在編程,條件判斷語句是控制程序流程的核心元素之一。它們使得程序能夠根據不同的輸入和狀態,做出相應的決策。特別是在C語言中,條件判斷語句的使用極為廣泛,涵蓋了從簡單的if語句到更復雜的
    的頭像 發表于 11-09 01:10 ?779次閱讀
    技術干貨驛站 ▏<b class='flag-5'>深入理解</b>C語言:掌握C語言條件判斷,從if到switch的應用

    深入理解 Llama 3 的架構設計

    最新的自然語言處理(NLP)技術和深度學習算法,旨在提供更加自然、流暢和智能的對話體驗。 1. 核心組件 Llama 3的架構設計可以分為以下幾個核心組件: 1.1 預處理模塊 預處理模塊負責將原始文本數據轉換為模型可以理解的格式。這包括文本清洗
    的頭像 發表于 10-27 14:41 ?1103次閱讀

    深入理解FPD-link III ADAS解串器HUB產品

    電子發燒友網站提供《深入理解FPD-link III ADAS解串器HUB產品.pdf》資料免費下載
    發表于 09-06 09:58 ?2次下載
    <b class='flag-5'>深入理解</b>FPD-link III ADAS解串器HUB產品

    技術干貨驛站 ▏深入理解C語言:掌握常量,讓你的代碼更加穩固高效!

    在C語言的世界,常量是一種不可忽視的元素。無論你是在編寫簡單的代碼,還是構建復雜的系統,常量都能為你的程序帶來更高的穩定性和可靠性。在這篇文章,我們將深入探討C語言中的常量,從整數常量到字符串
    的頭像 發表于 08-29 13:59 ?3406次閱讀
    技術干貨驛站 ▏<b class='flag-5'>深入理解</b>C語言:掌握常量,讓你的代碼更加穩固高效!

    錫焊原理解析:深入理解電子產品制造的核心工藝

    探索焊接技術在精密電子工程的重要性和創新,從基礎元件的連接到現代焊接技術的進展,深入了解焊接材料的選擇與焊接技術的分類。本文提供了對錫焊原理的深入分析,揭示了高質量電子產品制造的關鍵因素。
    的頭像 發表于 08-12 15:03 ?1315次閱讀
    錫焊原<b class='flag-5'>理解</b>析:<b class='flag-5'>深入理解</b>電子產品制造的核心工藝

    揭秘LED燈帶功率:深入理解每米功率的科學

    在現代照明設計,LED燈帶以其靈活性和節能特性,成為營造室內氛圍的重要工具。本文將深入探討LED燈帶的功率選擇,提供實用的技術指導,幫助讀者根據自身需求選擇合適的燈帶。
    的頭像 發表于 08-03 15:45 ?3657次閱讀

    技術干貨驛站 ▏深入理解C語言:基本數據類型和變量

    在C語言中,數據類型和變量是編程的基礎,也是理解更復雜概念的關鍵。數據類型決定了變量的內存分配、存儲范圍和操作方式,而變量則是存儲數據的容器。本篇文章將從基本數據類型和變量兩個方面,帶你深入了解C
    的頭像 發表于 07-26 17:53 ?2600次閱讀
    技術干貨驛站 ▏<b class='flag-5'>深入理解</b>C語言:基本數據類型和變量

    深入理解渲染引擎:打造逼真圖像的關鍵

    在數字世界,圖像渲染是創造逼真視覺效果的核心技術。渲染引擎,作為這一過程的關鍵組件,負責將二維或三維的模型、紋理、光照等數據轉化為人們肉眼可見的二維圖像。本文將深入探討渲染引擎的工作原理及其在打
    的頭像 發表于 06-29 08:28 ?584次閱讀
    <b class='flag-5'>深入理解</b>渲染引擎:打造逼真圖像的關鍵