娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年04月11日(星期五)

正在發生

2019年04月11日 | STM32的斷言機制——函數assert_param()

發布者:學思者 來源: eefocus關鍵字:STM32  斷言機制  函數assert_param() 手機看文章 掃描二維碼
隨時隨地手機看文章

我們在學STM32的時候函數assert_param出現的幾率非常大,上網搜索一下,網上一般解釋斷言機制,做為程序開發調試階段時使用。


下面我就談一下我對這些應用的看法,學習東西抱著知其然也要知其所以然。


我們在分析庫函數的時候,幾乎每一個函數的原型有這個函數assert_param();


下面以assert_param(IS_GPIO_ALL_PERIPH(GPIOx));為例說一下我的理解,


函數的參數IS_GPIO_ALL_PERIPH(GPIOx),我們可以尋找到原型

#define IS_GPIO_ALL_PERIPH(PERIPH) (((*(uint32_t*)&(PERIPH)) == GPIOA_BASE)||
((*(uint32_t*)&(PERIPH)) == GPIOB_BASE) ||
((*(uint32_t*)&(PERIPH)) == GPIOC_BASE) ||
((*(uint32_t*)&(PERIPH)) == GPIOD_BASE) ||
((*(uint32_t*)&(PERIPH)) == GPIOE_BASE) ||
((*(uint32_t*)&(PERIPH)) == GPIOF_BASE) ||
((*(uint32_t*)&(PERIPH)) == GPIOG_BASE))

這個宏定義的作用就是檢查參數PERIPH,判斷參數PERIPH是否為GPIOX(A...G)基址中的一個,只要有一個為真則其值為真,否則為假,


不用多說,這是C語言中基本的邏輯運算。當然這個庫函數也用的很有意思,看:首先對PERIPH進行取址,也就是求地址,&PERIPH,


然后對這個地址強制轉化為32位的指針,即前面加(uint32_t *),然后通過*進行訪問這個地址(指針)中的內容。


下面我們再回到assert_param這個函數,這個函數是哪里的呢?在stm32f10x_conf.h尋找到原型如下:
#ifdef USE_FULL_ASSERT

#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t*)__FILE__, __LINE__))
void assert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0)
#endif 


若是沒有定義USE_FULL_ASSERT我們調用這個函數assert_param時,不對參數IS_GPIO_ALL_PERIPH(GPIOx)的正確性進行檢查,

執行語句(void)0,這是一個相當于空語句的表達式,不對程序產生任何影響。

若是定義了USE_FULL_ASSERT它,我們調用這個函數assert_param時,及對參數IS_GPIO_ALL_PERIPH(GPIOx)的正確性進行檢查,

通過一個C語言中的雙目運算符來判斷,若是返回1,執行語句(void)0,這是一個相當于空語句的表達式;

若是返回0,則執行后面的函數assert_failed((uint8_t *)__FILE__,__LINE__),函數的作用在庫函數中有解釋,用來指示出錯的行數和文件。


注意:__FILE__,__LINE__是標準庫函數中的宏定義!切記

void assert_failed(uint8_t* file, uint32_t line);剛開始沒看明白為什么加在這里,仔細一想是在頭文件的函數聲明。

至于函數實體呢?我們從官方文件的模板中main.c中可以找到。如下:

void assert_failed(u8* file, u32 line) 
{ /* User can add his own implementation to report the file name and linenumber, 
ex: printf("Wrong parameters value: file %s on line %drn", file,line) */ 
/* Infinite loop */ 
while (1) { } 
} 英文注釋也說明了怎么應用,通過輸入參數來確定位置,最簡單的方法就是串口打印了,這個函數的主要思想是在輸入參數有問題的時候,

但是有編譯不出來,它可以幫你檢查參數的有效性,好處不必多言,自己領悟就行。


繼續說明如下: assert_param是怎樣包含進去的呢?我們在stm32f10x_conf.h這個頭文件中定義的函數聲明還是宏定義,

怎么在其它文件中都能應用呢?也很多網上朋友在剛開始學習的時候都遇到編譯不過去的問題出現,最后通過在文件中添加USE_STDPERIPH_DRIVER來解決的:


我們可以在整個工程中進行搜索USE_STDPERIPH_DRIVER,通過頭文件可以看出,是使用標準外設文件。在stm32f10x.h文件中我們可以搜索到如下情況:
#if !defined USE_STDPERIPH_DRIVER
/**
* @brief Comment the line below if you will not use the peripherals drivers.
In this case, these drivers will not be included and the application code will 
be based on direct access to peripherals registers 
*/
#define USE_STDPERIPH_DRIVER
#endif

#ifdef USE_STDPERIPH_DRIVER
#include "stm32f10x_conf.h"
#endif
可以很容易看出來,我們不在那里添加,只要把第一個的注釋去掉,就不用在配置中添加USE_STDPERIPH_DRIVER了,

在第二個文件中我們可以知道怎樣包含這個控制開關文件了,呵呵。我們也明白為什么我們在寫程序的時候只要包含stm32f10x.h就能很容易的包含所有的文件文件了吧,

我們只要在stm32f10x_conf.h配置一下就能包含所需要的庫文件了。

通過以上可以看出,通過頭文件的相互包含,來控制外設以及調試文件的調用,這樣我們理清思路,理解起來就好多了。

當然在學習中可能有些C語言問題還沒有理解透徹,多上網搜一下,或者多看書,很快就搞明白的。



這是一種常見的軟件技術,可以在調試階段幫助程序員快速地排除那些明顯的錯誤。

它確實在程序的運行上犧牲了效率(但只是在調試階段),但在項目的開發上卻幫助你提高了效率。

當你的項目開發成功,使用release模式編譯之后,或在stm32f10x_conf.h文件中注釋掉對USE_FULL_ASSERT的宏定義,

所有的assert_param()檢驗都消失了,不會影響最終程序的運行效率。

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

assert_param(IS_ADC_ALL_PERIPH(ADCx));
。。。

在執行assert_param()的檢驗時,如果發現參數出錯,它會調用函數assert_failed()向程序員報告錯誤,

在任何一個例程中的main.c中都有這個函數的模板,如下:

void assert_failed(uint8_t* file, uint32_t line)
{


while (1)
{}
}

你可以按照自己使用的環境需求,添加適當的語句輸出錯誤的信息提示,或修改這個函數做出適當的錯誤處理。

1、STM32F10xD.LIB是DEBUG模式的庫庫文件。
2、STM32F10xR.LIB是Release模式的庫庫文件。
3、要選擇DEBUG和RELEASE模式,需要修改stm32f10x_conf.h的內容。
    #define DEBUG 表示DEBUG模式,把該語句注釋掉,則為RELEASE模式。
4、要選擇DEBUG和RELEASE模式,也可以在Options,C/C++,Define里填入DEBUG的預定義。
    這樣,就不需要修改stm32f10x_conf.h的內容。
5、如果把庫加入項目,則不需要將ST的庫源文件加入項目,比較方便。
    但是,庫的選擇要和DEBUG預定義對應。


關鍵字:STM32  斷言機制  函數assert_param() 引用地址:STM32的斷言機制——函數assert_param()

上一篇:從庫函數方向入門stm32的個人建議
下一篇:STM32 斷言的使用

推薦閱讀

從Classic到Glassic?如果我們把一款經典車稱之為“Classic”,那么新途銳就可以稱之為“Glassic”(從玻璃/Glass英文引申而來)。因為,曾經在途銳車內承擔各種不同功能任務的物理按鍵,眼下在新途銳里面,都由一個叫“Innovision Cockpit”的超大號屏幕給包攬了。甚至,這還不是全部,在這個屏幕的旁邊,還有一個專門用來代替傳統儀表盤的12寸數字顯示屏。...
此次收購將會增加面向互補性高增長應用的高度差異化模擬/混合信號功率解決方案為 5G、工業、數據中心、汽車和智能家居業務增長創造新機會使 Qorvo 的潛在市場規模擴大 30 億美元以上預計在收購后第一年實現根據非公認會計準則計算的毛利率和每股盈利增加 移動應用、基礎設施與國防應用中核心技術與 RF 解決方案的領先供應商 Qorvo, Inc.宣布,其...
虛擬機環境:Oracle VM VirtualBoxLinux系統:ubuntu_14.04.6交叉編譯工具:[100ask分享的所有文件](https://eyun.baidu.com/s/3b1UtLc)100ask分享的所有文件 > 002_JZ2440資料光盤_20180516(免費) > 資料光盤 > A盤 > tools.zip > arm-linux-gcc-4.3.2.tar.bz2gcc-3.4.5-glibc-2.3.6/bin第一步:查看原理圖輸出低電平點亮LED燈輸出高電平熄滅LE...
:許松清,吳海彬,林宜,高洪張 引 言 機器人技術融合丁機械、電于、、、人工智能等許多學科的理論與技術,是當今許多前沿領域技術的綜合體。移動型機器人主要用于對一些危險和未知的地域進行探索,例如是探索外星地表、進行引爆地雷等都需要使用到移動型機器人。半自主遠程控制移動機器人由于具有較強的活動能力、良好的可控性等特點,在工農業、國...

史海拾趣

問答坊 | AI 解惑

倒計時程序有問題

《無線電》2004年第9期(帶光盤)有一個99分鐘89C2051倒計時程序,2個數碼管顯示,我按其作了一個,并將其光盤上的程序拷入,實際運行結果出現這樣一個問題:     就是十位和個位到0后并沒有停止(停止時顯示‘--’2個負號),而是繼續顯示‘ ...…

查看全部問答∨

ARM與嵌入式linux入門的建議

本帖最后由 paulhyde 于 2014-9-15 08:56 編輯 ARM與嵌入式linux入門的建議  …

查看全部問答∨

射頻電路板設計技巧

成功的RF設計必須仔細注意整個設計過程中每個步驟及每個細節,這意味著必須在設計開始階段就要進行徹底的、仔細的規劃,并對每個設計步驟的進展進行全面持續的評估。而這種細致的設計技巧正是國內大多數電子企業文化所欠缺的。     近幾 ...…

查看全部問答∨

如何控制LED靜電死燈?

replyreload += \',\' + 380148;Timson,如果您要查看本帖隱藏內容請回復…

查看全部問答∨

供S5PC100開發板 ARMcortex A8 core

供S5PC100開發板 ARMcortex A8 core iPhone 3GS 采用Samsung S5PC100主控擁有720p高清視頻engineering, 在iPhone中Apple特意降低了處理器運行頻率為600MHz,以減少功耗。 顯然S5PC100的擁有很強大的處理功能,包括3D engineering S5PC100集多 ...…

查看全部問答∨

如何在LCD 的驅動中增加一個SPI 初始化代碼

如何在LCD 的驅動中增加一個SPI 初始化代碼,而SPI 是用GPIO 來模擬的,那在BSP 當中如何應用控制GPIO 呢! PS: 主要目的就是在init.c 中的InitDisplay()中增加如下代碼:   #define HX_SCLK      (1 << ...…

查看全部問答∨

嵌入式軟件開發工程師

漢王科技股份有限公司 嵌入式軟件開發工程師-OCR軟件部 電子郵箱:          yinsg@hanwang.com.cn 發布日期:         2007-03-21         工作地 ...…

查看全部問答∨

有什么好辦法解決STM32RTC不起振么

                                 最近焊了一批板子,那個RTC的晶振死活不起振,十個里面只有一個能起來,其他的怎么弄都起不來。原來在別的板子上好 ...…

查看全部問答∨

PR788應用于LED路燈設計

簡介:德州儀器電源管理產品經理Pietro Scalia為您簡述一款LED路燈板。通過分析PR788參考設計電路圖使你更清楚的了解到這個設計是如何實現更節能的目的的   $(\'swf_lP8\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'4 ...…

查看全部問答∨

三極管電路分析

請大蝦們幫忙分析下,怎么理解?…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 桃江县| 新津县| 通榆县| 肥乡县| 景德镇市| 卢湾区| 衡山县| 鹤峰县| 鄂托克前旗| 饶河县| 防城港市| 丹阳市| 南澳县| 固镇县| 双鸭山市| 米林县| 巴林左旗| 丹东市| 资源县| 德清县| 修水县| 日土县| 临城县| 和平区| 永清县| 准格尔旗| 鸡东县| 宝应县| 卢龙县| 长治市| 嘉黎县| 冷水江市| 贺州市| 康保县| 洛浦县| 彰武县| 项城市| 墨江| 隆林| 武宣县| 藁城市|