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

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

    文章

    1187

    瀏覽量

    132444
  • STM32
    +關注

    關注

    2308

    文章

    11160

    瀏覽量

    373043
  • STM8
    +關注

    關注

    18

    文章

    393

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】+讀深入理解Linux內核內存分配

    每個內存地址是虛擬的,不是直接指向RAM的任何地址。當用戶訪問內存的存儲單元時,都會進行地址轉換以匹配相應的物理內存。書籍的第10章討論了五個主題,對Linux內核內存分配進行詳細講解。 接著
    發表于 01-16 20:05

    深入淺出GMSSL:掌握SM2、SM3、SM4國密算法的高效實踐

    帶你從零開始,深入理解這三大核心算法在GMSSL的高效使用方式,幫助你在實際項目中快速落地國密安全方案。 本文將以通信定位二合一系列Air780EGH核心板為例,帶你快速上手GMS
    的頭像 發表于 12-12 18:20 ?537次閱讀
    <b class='flag-5'>深入</b>淺出GMSSL:掌握SM2、SM3、SM4國密算法的高效實踐

    GCC開發工程的模版

    line number * where the assert_param error has occurred. * @param file: pointer to the source file
    發表于 11-28 08:15

    線程超時函數 assert 失敗是什么原因導致的?

    最近調試 gd32h759 遇到了一個十分奇怪的問題,在初步調通所有的邏輯功能后,發現系統經常會在運行一段時間后死在一個奇怪的線程超時函數 assert 失敗導致卡死。用 cmbacktrace
    發表于 09-09 06:56

    K8s存儲類設計與Ceph集成實戰

    在云原生時代,存儲是制約應用性能的關鍵瓶頸。本文將帶你深入理解K8s存儲類的設計原理,并手把手實現與Ceph的完美集成,讓你的集群存儲性能提升300%!
    的頭像 發表于 08-22 11:50 ?826次閱讀

    SFUD驅動實戰手冊:串行SPI Flash開發全流程解析

    針對嵌入式系統SPI Flash的多樣化需求,SFUD提供了靈活且通用的解決方案。本文將從環境配置、初始化、基本操作到高級特性,完整展示SFUD的應用流程,并通過具體示例幫助開
    的頭像 發表于 07-29 13:19 ?695次閱讀
    SFUD驅動<b class='flag-5'>庫</b>實戰手冊:串行SPI Flash開發全流程解析

    基礎篇3:掌握Python的條件語句與循環

    在Python編程語言中,條件語句和循環是構成復雜邏輯和數據處理的基石。本篇基礎教程將幫助您深入了解Python的條件語句和循環結構,讓您能夠更好地控制程序流程。 條件
    發表于 07-03 16:13

    深入理解C語言:函數—編程的“積木塊”藝術

    在編程的世界里,函數就像建筑的“積木塊”——它們是構建復雜程序的基石。通過靈活組合這些模塊,開發者能打造出功能強大且結構清晰的代碼。函數之所以成為C語言的核心,正是因為它解決了編程的三大關
    的頭像 發表于 06-30 17:26 ?1798次閱讀
    <b class='flag-5'>深入理解</b>C語言:函數—編程<b class='flag-5'>中</b>的“積木塊”藝術

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

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

    半導體器件微量摻雜元素的EDS表征

    微量摻雜元素在半導體器件的發展起著至關重要的作用,可以精準調控半導體的電學、光學性能。對器件微量摻雜元素的準確表征和分析是深入理解半導體器件特性、優化器件性能的關鍵步驟,然而由于微量摻雜元素含量極低,對它的檢測和表征也面臨很
    的頭像 發表于 04-25 14:29 ?1956次閱讀
    半導體器件<b class='flag-5'>中</b>微量摻雜元素的EDS表征

    可靠性測試結構設計概述

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

    LPCVD方法在多晶硅制備的優勢與挑戰

    本文圍繞單晶硅、多晶硅與非晶硅三種形態的結構特征、沉積技術及其工藝參數展開介紹,重點解析LPCVD方法在多晶硅制備的優勢與挑戰,并結合不同工藝條件對材料性能的影響,幫助讀者深入理解硅材料在先進微納制造的應用與工藝演進路徑。
    的頭像 發表于 04-09 16:19 ?2276次閱讀
    LPCVD方法在多晶硅制備<b class='flag-5'>中</b>的優勢與挑戰

    HarmonyOS Next V2 @Local 和@Param

    HarmonyOS Next V2 @Local 和@Param @Local 背景 @Local 是 harmony 應用開發的 v2 版本 對標**@State**的狀態管理修飾器,它解決了
    的頭像 發表于 04-02 18:27 ?1016次閱讀
    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 ?1263次閱讀
    技術干貨驛站  ▏<b class='flag-5'>深入理解</b>C語言:嵌套循環與循環控制的底層原理