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

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

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

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

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

應(yīng)部分老鐵的要求,講一些細節(jié)知識點。一來,我不用花費大量精力去寫文章;二來,大家也不會因看文章覺得累。

1寫在前面

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

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

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

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

2

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

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

對比在LL庫中時鐘使能代碼,如下:

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

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

3

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

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

1.編譯出錯

不使用do{}while:

使用大括號,多一個分號:

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

大家對比以上幾種,你覺得哪一種合理?

2.避免goto跳轉(zhuǎn)語句帶來問題

不使用do{}hwile(0):

使用do{}hwile(0):

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

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

怎么說呢,點到為止,希望對你有啟發(fā)。

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

    關(guān)注

    0

    文章

    48

    瀏覽量

    8956
  • stm32cubemx
    +關(guān)注

    關(guān)注

    5

    文章

    278

    瀏覽量

    14618
  • HAL庫
    +關(guān)注

    關(guān)注

    1

    文章

    114

    瀏覽量

    6030
收藏 人收藏

    評論

    相關(guān)推薦

    課程上線 | STM32單片機入門教程(1)基于HAL的多核心開發(fā)(F1/F4/G0/U5)

    ?好消息!華清遠見STM32入門視頻課程《基于HAL的STM32多核心開發(fā)》正式上線,已更新90講,持續(xù)更新,8月份將全部上線。課程優(yōu)勢真人出鏡,手把手教學(xué)一板玩轉(zhuǎn)STM32多型號多核心支持
    的頭像 發(fā)表于 08-08 16:42 ?195次閱讀
    課程上線 | STM32單片機入門教程(1)基于<b class='flag-5'>HAL</b><b class='flag-5'>庫</b>的多核心開發(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)這里超時的原因?

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

    stm32h745的特殊引腳如何使用HAL定義?

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

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

    ;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開啟接收中斷,HAL為什么要專門發(fā)0XFF?

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

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

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

    使用STM32F407 USB HOST遇到的疑問求解

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

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

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

    使用STM32 HAL進行GPIO控制的實例

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

    HAL常用函數(shù)匯總

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

    define定義

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

    FreeRTOSosDelay和HAL_Delay的區(qū)別

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

    STM32 HAL串口同時收發(fā),接收卡死?

    HAL是針對STM32系列單片機的一套常用的高級抽象層。在HAL,串口通信是通過針對U
    的頭像 發(fā)表于 10-26 17:42 ?3106次閱讀

    STM32 HAL串口收發(fā)是如何使用的?

    的一種,它提供了一種簡單易用的方法來使用STM32的各種外設(shè)。 本文將詳細介紹如何使用STM32 HAL來進行串口通信,包括初始化、發(fā)送數(shù)據(jù)和接收數(shù)據(jù)等方面。 1. 初始化串口 首先需要初始化串口外設(shè),按照
    的頭像 發(fā)表于 10-26 17:42 ?1078次閱讀

    do{}while(0)只執(zhí)行一次有意義嗎?

    在嵌入式開發(fā),定義非常強大也非常便捷,如果正確使用可以讓你的工作事半功倍。然而,在很多的C程序,你可能會看到不是那么直接的比較特殊一點的
    的頭像 發(fā)表于 10-09 14:20 ?521次閱讀
    <b class='flag-5'>do</b>{}<b class='flag-5'>while</b>(<b class='flag-5'>0</b>)只執(zhí)行一次有<b class='flag-5'>意義</b>嗎?