www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 單片機 > 單片機
[導讀]我們在學STM32的時候函數(shù)assert_param出現(xiàn)的幾率非常大,上網(wǎng)搜索一下,網(wǎng)上一般解釋斷言機制,做為程序開發(fā)調(diào)試階段時使用。下面我就談一下我對這些應用的看法,學習東西抱著知其然也要知其所以然。4 斷言機制函數(shù)a

我們在學STM32的時候函數(shù)assert_param出現(xiàn)的幾率非常大,上網(wǎng)搜索一下,網(wǎng)上一般解釋斷言機制,做為程序開發(fā)調(diào)試階段時使用。下面我就談一下我對這些應用的看法,學習東西抱著知其然也要知其所以然。
4 斷言機制函數(shù)assert_param
我們在分析庫函數(shù)的時候,幾乎每一個函數(shù)的原型有這個函數(shù)assert_param();下面以assert_param(IS_GPIO_ALL_PERIPH(GPIOx));為例說一下我的理解,函數(shù)的參數(shù)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))
這個宏定義的作用就是檢查參數(shù)PERIPH,判斷參數(shù)PERIPH是否為GPIOX(A...G)基址中的一個,只要有一個為真則其值為真,否則為假,不用多說,這是C語言中基本的邏輯運算。當然這個庫函數(shù)也用的很有意思,看:首先對PERIPH進行取址,也就是求地址,&PERIPH,然后對這個地址強制轉(zhuǎn)化為32位的指針,即前面加(uint32_t *),然后通過*進行訪問這個地址(指針)中的內(nèi)容。不多說了,看幾遍就能明白。
下面我們再回到assert_param這個函數(shù),這個函數(shù)是哪里的呢?在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這個文件,則執(zhí)行后面的文件,我們在程序中一般都沒什么定義,即執(zhí)行后面這個語句((void)0),這個語句不用多想,沒有定義USE_FULL_ASSERT就是什么也不執(zhí)行。說的明白點,對上面的那個語句IS_GPIO_ALL_PERIPH(GPIOx)不執(zhí)行任何操作。
若是定義了USE_FULL_ASSERT它,我們調(diào)用這個函數(shù)assert_param時,及對參數(shù)IS_GPIO_ALL_PERIPH(GPIOx)的正確性進行檢查,通過一個C語言中的雙目運算符來判斷,若是返回1,執(zhí)行語句(void)0,跟上面一樣,若是返回0,則執(zhí)行后面的函數(shù)assert_failed((uint8_t *)__FILE__,__LINE__),函數(shù)的作用在庫函數(shù)中有解釋,用來指示出錯的行數(shù)和文件。注意:__FILE__,__LINE__是標準庫函數(shù)中的宏定義!切記
void assert_failed(uint8_t* file, uint32_t line);剛開始沒看明白為什么加在這里,仔細一想是在頭文件的函數(shù)聲明。至于函數(shù)實體呢?我們從官方文件的模板中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) { }
} 英文注釋也說明了怎么應用,通過輸入?yún)?shù)來確定位置,最簡單的方法就是串口打印了,這個函數(shù)的主要思想是在輸入?yún)?shù)有問題的時候,但是有編譯不出來,它可以幫你檢查參數(shù)的有效性,好處不必多言,自己領悟就行。
繼續(xù)說明如下: assert_param是怎樣包含進去的呢?我們在stm32f10x_conf.h這個頭文件中定義的函數(shù)聲明還是宏定義,怎么在其它文件中都能應用呢?也很多網(wǎng)上朋友在剛開始學習的時候都遇到編譯不過去的問題出現(xiàn),最后通過在文件中添加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配置一下就能包含所需要的庫文件了。
通過以上可以看出,通過頭文件的相互包含,來控制外設以及調(diào)試文件的調(diào)用,這樣我們理清思路,理解起來就好多了。當然在學習中可能有些C語言問題還沒有理解透徹,多上網(wǎng)搜一下,或者多看書,很快就搞明白的。



PS 2:

STM32中assert_param的使用

在STM32的固件庫和提供的例程中,到處都可以見到assert_param()的使用。如果打開任何一個例程中的stm32f10x_conf.h文件,就可以看到實際上assert_param是一個宏定義;
在固件庫中,它的作用就是檢測傳遞給函數(shù)的參數(shù)是否是有效的參數(shù)。
所謂有效的參數(shù)是指滿足規(guī)定范圍的參數(shù),比如某個參數(shù)的取值范圍只能是小于3的正整數(shù),如果給出的參數(shù)大于3,
則這個assert_param()可以在運行的程序調(diào)用到這個函數(shù)時報告錯誤,使程序員可以及時發(fā)現(xiàn)錯誤,而不必等到程序運行結果的錯誤而大費周折。


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

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

當你的項目開發(fā)成功,使用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));
。。。

在執(zhí)行assert_param()的檢驗時,如果發(fā)現(xiàn)參數(shù)出錯,它會調(diào)用函數(shù)assert_failed()向程序員報告錯誤,在任何一個例程中的main.c中都有這個函數(shù)的模板,如下:

void assert_failed(uint8_t* file, uint32_t line)
{


while (1)
{}
}

你可以按照自己使用的環(huán)境需求,添加適當?shù)恼Z句輸出錯誤的信息提示,或修改這個函數(shù)做出適當?shù)腻e誤處理。

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


本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉