0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HAL庫(kù)中do{...} while(0U) 宏定義的作用和意義

黃工的嵌入式技術(shù)圈 ? 來(lái)源:黃工的嵌入式技術(shù)圈 ? 2020-03-03 14:07 ? 次閱讀

應(yīng)部分老鐵的要求,講一些細(xì)節(jié)知識(shí)點(diǎn)。一來(lái),我不用花費(fèi)大量精力去寫(xiě)文章;二來(lái),大家也不會(huì)因看文章覺(jué)得累。

1寫(xiě)在前面

很多初學(xué)者,以及有一定工作經(jīng)驗(yàn)的朋友都不知道這個(gè)“do{...} while(0U)”作用和意義,甚至覺(jué)得這樣寫(xiě)的代碼復(fù)雜且沒(méi)意義。

相信使用過(guò)STM32Cube HAL庫(kù)的朋友都知道,源碼里面有許多do{...} while(0U)的宏定義語(yǔ)句。

今天講的主要知識(shí)點(diǎn)是:HAL庫(kù)中do{...} while(0U)作用和意義。

當(dāng)然,do{...} while(0U)不限于HAL庫(kù)中,適用于很多地方。

2

HAL庫(kù)中do{} while(0U)宏定義

在HAL庫(kù)中,很多.h文件都有do{...} while(0U)這樣的宏定義,比如:在stm32f1xx_hal_rcc.h中,使能GPIO時(shí)鐘

對(duì)比在LL庫(kù)中時(shí)鐘使能代碼,如下:

很多人只會(huì)覺(jué)得LL庫(kù)這種函數(shù)比較合理,而想不明白為什么HAL會(huì)使用這種“do{...} while(0U)”宏定義的語(yǔ)句。

下一章節(jié)重點(diǎn)講述一下這種“do{...} while(0U)”宏定義的作用和意義。

3

do{...} while(0U)宏定義的作用和意義

使用do{...} while(0U)這種方式其實(shí)有幾種重要作用,下面簡(jiǎn)單說(shuō)幾條:

1.編譯出錯(cuò)

不使用do{}while:

使用大括號(hào),多一個(gè)分號(hào):

使用do{...} while(0U):

大家對(duì)比以上幾種,你覺(jué)得哪一種合理?

2.避免goto跳轉(zhuǎn)語(yǔ)句帶來(lái)問(wèn)題

不使用do{}hwile(0):

使用do{}hwile(0):

大家再對(duì)比以上兩種,發(fā)現(xiàn)了什么問(wèn)題?

我這里也不再繼續(xù)舉例說(shuō)明了,大家可以上網(wǎng)了解,其實(shí)還有很多重要意義和作用。

怎么說(shuō)呢,點(diǎn)到為止,希望對(duì)你有啟發(fā)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 宏定義
    +關(guān)注

    關(guān)注

    0

    文章

    49

    瀏覽量

    8983
  • stm32cubemx
    +關(guān)注

    關(guān)注

    5

    文章

    280

    瀏覽量

    14690
  • HAL庫(kù)
    +關(guān)注

    關(guān)注

    1

    文章

    114

    瀏覽量

    6119
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    SVdefine定義的用法

    SV中使用預(yù)處理指令`define來(lái)定義,可以用來(lái)創(chuàng)建文本替換。根據(jù)場(chǎng)景不同,`define主要用來(lái)定義常量、簡(jiǎn)化復(fù)雜的表達(dá)式或代碼段以及提高代碼的可移植性。其基本語(yǔ)法為:
    的頭像 發(fā)表于 10-21 14:22 ?73次閱讀

    課程上線 | STM32單片機(jī)入門(mén)教程(1)基于HAL庫(kù)的多核心開(kāi)發(fā)(F1/F4/G0/U5)

    ?好消息!華清遠(yuǎn)見(jiàn)STM32入門(mén)視頻課程《基于HAL庫(kù)的STM32多核心開(kāi)發(fā)》正式上線,已更新90講,持續(xù)更新,8月份將全部上線。課程優(yōu)勢(shì)真人出鏡,手把手教學(xué)一板玩轉(zhuǎn)STM32多型號(hào)多核心支持
    的頭像 發(fā)表于 08-08 16:42 ?262次閱讀
    課程上線 | STM32單片機(jī)入門(mén)教程(1)基于<b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b>的多核心開(kāi)發(fā)(F1/F4/G<b class='flag-5'>0</b>/<b class='flag-5'>U</b>5)

    stm32h5使用jlink調(diào)試器,在while (READ_BIT(RCC-&gt;CR, RCC_CR_PLL1RDY) == 0U)這里超時(shí)的原因?

    ,然后淘寶買(mǎi)了個(gè)jlink的調(diào)試器,就想試下,結(jié)果連上后,發(fā)現(xiàn)程序會(huì)在rcc初始化的時(shí)候,在 while (READ_BIT(RCC->CR, RCC_CR_PLL1RDY) == 0U)這里超時(shí),進(jìn)errorhandler
    發(fā)表于 05-27 07:36

    stm32h745的特殊引腳如何使用HAL庫(kù)定義?

    現(xiàn)在手上有塊stm32h745ii的板子,想把pc13 pc14 pc15三個(gè)特殊引腳重定義為普通io口,找了一下HAL庫(kù),好像沒(méi)有f4庫(kù)里面能直接調(diào)用的接口,有知道的大神麻煩告知一下該如何操作
    發(fā)表于 05-24 08:31

    求助,使用STM32cube生成的HAL庫(kù)CAN初始化函數(shù)HAL_CAN_Init的疑問(wèn)求解

    后進(jìn)行初始化配置; 然后請(qǐng)求退出初始化模式,并等待確認(rèn)初始化模式退出; 在HAL庫(kù)的CAN初始化函數(shù),上述紅色字體部分代碼如下: HAL_StatusTypeDef
    發(fā)表于 05-08 06:06

    STM32 hal庫(kù)無(wú)法接收串口數(shù)據(jù)是怎么回事?

    型號(hào):STM32L432KC官方開(kāi)發(fā)板 串口使用的是板載的USB下載口以及串口 用法: 在串口初始化后,while(1)之前調(diào)用 接收中斷函數(shù) HAL_UART_Receive_IT(),接收
    發(fā)表于 04-29 06:11

    STM32 RTX CAN封裝庫(kù)while循環(huán)無(wú)法跳出是為什么?

    ;MCRCAN_MCR_RESET) != 0U); #defineCAN_MCR_RESET((uint16_t)0x8000)/*!&lt; CAN software master
    發(fā)表于 04-19 07:58

    STM32F4初始化USART調(diào)用HAL_USART_Receive_IT開(kāi)啟接收中斷,HAL庫(kù)為什么要專(zhuān)門(mén)發(fā)0XFF?

    0xFF。 然后在HAL_USART_RxCpltCallback()中會(huì)接收到0x7F(不知從何而來(lái)),調(diào)用HAL_USART_Transmit()發(fā)送,函數(shù)返回
    發(fā)表于 04-18 07:43

    使用HAL庫(kù)的USB模塊時(shí),當(dāng)設(shè)置要接收的數(shù)據(jù)長(zhǎng)度為大于64字節(jié)時(shí),無(wú)法從接收結(jié)束回調(diào)函數(shù)的原因?

    在使用HAL庫(kù)的USB模塊時(shí),使用了自定義的USB設(shè)備,發(fā)現(xiàn)了一個(gè)問(wèn)題, 庫(kù)版本為1.1.1, 芯片為STM32F103T8 USB類(lèi)型:自定義
    發(fā)表于 04-12 06:07

    使用STM32F407 USB HOST遇到的疑問(wèn)求解

    一直不對(duì) static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx) { uint32_t count = 0U
    發(fā)表于 04-03 06:11

    arduinowhile循環(huán)怎么跳出

    Arduino 是一款開(kāi)源的硬件平臺(tái),廣泛應(yīng)用于各種物聯(lián)網(wǎng)和嵌入式系統(tǒng)項(xiàng)目。在 Arduino 上編寫(xiě)代碼時(shí),循環(huán)結(jié)構(gòu)起到了至關(guān)重要的作用。而其中的 while 循環(huán)更是常用于需要根據(jù)特定條件重復(fù)
    的頭像 發(fā)表于 02-14 16:22 ?2160次閱讀

    使用STM32 HAL庫(kù)進(jìn)行GPIO控制的實(shí)例

    在基于STM32微控制器的嵌入式系統(tǒng)開(kāi)發(fā),GPIO(GeneralPurposeInput/Output)控制是其中最基本、最常見(jiàn)的操作之一。通過(guò)使用STM32的HAL庫(kù),可以輕松地對(duì)GPIO進(jìn)行配置和控制。本文將演示如何使用
    的頭像 發(fā)表于 12-21 15:22 ?2830次閱讀

    HAL庫(kù)常用函數(shù)匯總

    1,系統(tǒng)函數(shù)HAL_Delay原型:voidHAL_Delay(uint32_tDelay);作用:利用滴答定時(shí)器生成的系統(tǒng)延遲函數(shù)參數(shù):Delay:延遲時(shí)間,單位是ms返回值:無(wú)示例代碼
    的頭像 發(fā)表于 11-29 08:00 ?2794次閱讀
    <b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b>常用函數(shù)匯總

    define定義

    ,常量表并沒(méi)有用define定義的常量,系統(tǒng)不為它分配內(nèi)存。define定義的常量,預(yù)處理時(shí)只是直接進(jìn)行了替換,,它用來(lái)將一個(gè)標(biāo)識(shí)符定義為一個(gè)字符串,該標(biāo)識(shí)符被稱(chēng)為
    的頭像 發(fā)表于 11-24 15:35 ?738次閱讀

    FreeRTOSosDelay和HAL_Delay的區(qū)別

    問(wèn)題場(chǎng)景在FreeRTOS創(chuàng)建了線程A、線程B,其中線程A優(yōu)先級(jí)大于線程B。線程A、B任務(wù)代碼如下:voidA(void*argument){while(1){printf("A\r
    的頭像 發(fā)表于 10-29 08:00 ?2379次閱讀
    FreeRTOS<b class='flag-5'>中</b>osDelay和<b class='flag-5'>HAL</b>_Delay的區(qū)別