chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

ANSIC幾種特殊的標(biāo)準(zhǔn)定義 (__FILE__、__LINE__、__STDC__···)

黃工的嵌入式技術(shù)圈 ? 來(lái)源:黃工的嵌入式技術(shù)圈 ? 2020-03-20 09:46 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Ⅰ寫在前面

為方便大家閱讀,本文內(nèi)容已經(jīng)整理成PDF文件:

http://pan.baidu.com/s/1gfHygyn

對(duì)于我們大部分使用單片機(jī)進(jìn)行裸機(jī)開發(fā)的朋友來(lái)說(shuō),可能很少有人在程序中許多關(guān)鍵的地方打印一些關(guān)鍵信息。

有較大系統(tǒng)開發(fā),或復(fù)雜系統(tǒng)開發(fā)經(jīng)驗(yàn)的朋友一般都會(huì)在程序中輸出很多調(diào)試信息,如在UCOS、freeRTOS、Linux等系統(tǒng)開發(fā)調(diào)試時(shí)打印許多關(guān)鍵信息。

1.我們?cè)谑褂?a href="http://www.brongaenegriffin.com/v/tag/751/" target="_blank">STM32庫(kù)開發(fā)時(shí),在stm32fxxx_conf.h文件下會(huì)發(fā)現(xiàn)如下這么一條語(yǔ)句:

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

這條語(yǔ)句,對(duì)于使用寄存器,開發(fā)簡(jiǎn)單且不大程序的朋友而言,可能他覺得用處不大,它可能就覺得很占資源,且耗時(shí)。

其實(shí)不然,ST這么設(shè)計(jì)是有他一定的道理的,對(duì)于開發(fā)大型、復(fù)雜系統(tǒng)的朋友而言,這條語(yǔ)句其實(shí)用處很大。每次,程序運(yùn)行錯(cuò)誤之后,它會(huì)打印程序代碼指定的位置,方便我們?cè)邶嫶蟮某绦蛑泻芸煺业藉e(cuò)誤的位置。

2.我們的系統(tǒng)會(huì)隨著時(shí)間的推移,不斷升級(jí)更新,也就是需要提交很多版本的可執(zhí)行文件(hex、bin等)。但是,產(chǎn)品后期使用中,我們對(duì)某些設(shè)備進(jìn)行了升級(jí),可能忽略了一些設(shè)備,也就是有些設(shè)備沒有升級(jí),如果出現(xiàn)故障,我們?cè)鯓硬拍芎芸煺业绞悄囊粋€(gè)版本的軟件出現(xiàn)故障呢?

這里就需要我們?cè)诔绦蛑刑砑右恍╆P(guān)于版本的信息,我們最基礎(chǔ)的就是Vx.x.x.x等這種信息,但對(duì)于大型系統(tǒng)而言,這種信息是不夠的,還需要更多,比如:編譯日期,時(shí)間,編譯環(huán)境的版本等。

Ⅱ幾種特殊標(biāo)準(zhǔn)定義

上面說(shuō)了這么多,就是需要讓大家知道,這些特殊標(biāo)準(zhǔn)定義的用途。上面說(shuō)的只是簡(jiǎn)單的舉例,其實(shí)他們的用途還很廣泛,掌握了基礎(chǔ)之后相信你們都會(huì)知道它們更多比較實(shí)用的意義。言歸正傳,下面講述這些基礎(chǔ)的知識(shí)。

本文主要講述下面幾個(gè)標(biāo)準(zhǔn)定義:

__LINE__:正在編譯文件的行號(hào)

__FILE__:正在編譯文件的文件名

__DATE__:編譯時(shí)刻的日期字符串 如“Jun 17 2017”

__TIME__:編譯時(shí)刻的時(shí)間字符串 如”1000“

__STDC__:判斷該文件是不是標(biāo)準(zhǔn)C程序

1.__FILE__編譯文件名稱

File中文意思即文件,這里的意思主要是指:正在編譯文件對(duì)應(yīng)正在編譯文件的路徑和文件的名稱。

Keil版本對(duì)應(yīng)的路徑是相對(duì)于工程文件而言的路徑,IAR版本路徑是相對(duì)Windows路徑。

比如下面提供源代碼工程:

char BuildFile[] = __FILE__;

printf("編譯文件路徑:%s\n", BuildFile);

Keil:

編譯文件路徑:App\main.c

IAR:

編譯文件路徑:C:\Users\Administrator\Desktop\STM32F417ZG(IAR)_ANSIC幾種特殊的標(biāo)準(zhǔn)定義\App\main.c

2.__LINE__編譯文件行號(hào)

上面說(shuō)的是編譯的文件名,是一個(gè)字符串,而這里說(shuō)的是行號(hào),是一個(gè)整型變量,這是這兩者的區(qū)別,所以在我提供工程中可以看到的源代碼:

char BuildLine = __LINE__;

printf("編譯代碼所在行:%d\n", BuildLine);

可以看不是數(shù)組的字符串,打印信息:

編譯代碼所在行:44

一般情況下,__FILE__是和__LINE__結(jié)合一起使用,用于打印我們代碼信息,方便快速定位代碼位置。

3.__DATE__編譯日期

__DATE__日期,需要注意的是:這個(gè)日期是你在編譯時(shí)Windows系統(tǒng)的日期,如果對(duì)應(yīng)那部分代碼之前編譯好了,后面沒有編譯,這個(gè)日期還是之前的日期,而不是后面編譯的日期。因此,如果這里用于定版本,就需要在定版本時(shí)對(duì)工程進(jìn)行全部重新編譯,它才會(huì)更新至你最后編譯的日期。

代碼:

char BuildDate[] = __DATE__;

printf("編譯日期:%s\n", BuildDate);

輸出結(jié)果:

編譯日期:Jun 17 2017

4.__TIME__編譯時(shí)間

這個(gè)和__DATE__一樣的原理,編譯時(shí)的時(shí)間,也是一個(gè)字符串。

再次提醒:用于定版本:需要重新編譯,這樣才是最后一次編譯時(shí)間。

代碼:

char BuildTime[] = __TIME__;

printf("編譯時(shí)間:%s\n", BuildTime);

輸出結(jié)果

編譯時(shí)間:1115

5.__STDC__標(biāo)準(zhǔn)C代碼

這個(gè)標(biāo)準(zhǔn)在我們單片機(jī)及嵌入式編程中運(yùn)用的比較少,當(dāng)要求程序嚴(yán)格遵循ANSIC標(biāo)準(zhǔn)時(shí)該標(biāo)識(shí)符被賦值為1,主要是判斷我們的程序文件是不是標(biāo)準(zhǔn)C程序。

#ifdef __STDC__

printf("標(biāo)準(zhǔn)C代碼文件\n");

#else

printf("非標(biāo)準(zhǔn)C代碼文件\n");

#endif

Ⅲ源代碼分析與下載

為了方便大家學(xué)習(xí),本文提供的源代碼比較基礎(chǔ)和簡(jiǎn)單,也方便理論結(jié)合實(shí)際學(xué)習(xí),僅供參考。

我們?cè)谥靶陆ê玫腄emo工程上添加了如下部分代碼:

char BuildLine = __LINE__;

char BuildFile[] = __FILE__;

char BuildDate[] = __DATE__;

char BuildTime[] = __TIME__;

printf("編譯文件路徑:%s\n", BuildFile);

printf("編譯代碼所在行:%d\n", BuildLine);

printf("編譯日期:%s\n", BuildDate);

printf("編譯時(shí)間:%s\n", BuildTime);

#ifdef __STDC__

printf("標(biāo)準(zhǔn)C代碼文件\n");

#else

printf("非標(biāo)準(zhǔn)C代碼文件\n");

#endif

Keil版本輸出結(jié)果:

編譯文件路徑:App\main.c

編譯代碼所在行:44

編譯日期:Jun 17 2017

編譯時(shí)間:1115

標(biāo)準(zhǔn)C代碼文件

IAR版本輸出結(jié)果:

編譯文件路徑:C:\Users\Administrator\Desktop\STM32F417ZG(IAR)_ANSIC幾種特殊的標(biāo)準(zhǔn)定義\App\main.c

編譯代碼所在行:44

編譯日期:Jun 17 2017

編譯時(shí)間:1100

標(biāo)準(zhǔn)C代碼文件

源代碼工程(STM32F417ZG_ANSIC幾種特殊的標(biāo)準(zhǔn)定義)下載地址:

http://pan.baidu.com/s/1hskScba

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

    關(guān)注

    6074

    文章

    45459

    瀏覽量

    667273
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5602

    瀏覽量

    129602
  • ANSIC
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    單芯片智能電源管理芯方案TP4316:精準(zhǔn)定義1A移動(dòng)電源的細(xì)分市場(chǎng)競(jìng)爭(zhēng)力

    TP4316是一款高度集成的1A移動(dòng)電源單芯片解決方案。其核心優(yōu)勢(shì)在于精準(zhǔn)集成了三大關(guān)鍵功能:1A充放電管理滿足細(xì)分市場(chǎng)基礎(chǔ)需求;內(nèi)置Type-C協(xié)議實(shí)現(xiàn)智能識(shí)別與兼容;NTC全場(chǎng)景溫度保護(hù)確保電池安全。這一定位使產(chǎn)品在成本、安全與場(chǎng)景適配性上建立起獨(dú)特競(jìng)爭(zhēng)力,精準(zhǔn)定義了1A移動(dòng)電源的細(xì)分市場(chǎng)價(jià)值。
    的頭像 發(fā)表于 01-24 11:51 ?182次閱讀
    單芯片智能電源管理芯方案TP4316:精<b class='flag-5'>準(zhǔn)定義</b>1A移動(dòng)電源的細(xì)分市場(chǎng)競(jìng)爭(zhēng)力

    IMAQ Line Gauge的實(shí)例

    各位網(wǎng)友大神,NI VISION中的IMAQ Line Gauge函數(shù),有誰(shuí)知道其用法,我主要是不了解Line Coordinates參數(shù)、參數(shù)Offset Array的意義和作用,做實(shí)驗(yàn)也沒成功。請(qǐng)大神們幫忙解釋一下,最好給個(gè)程序代碼截圖。
    發(fā)表于 01-22 13:40

    Include File解鎖Vector Logger Suite高階功能

    Include File(inc文件)是Vector Logger Suite(VLS)中使用LTL代碼片段的關(guān)鍵機(jī)制。通過(guò)Include File,用戶可以在LTL代碼中靈活定義參數(shù)、觸發(fā)
    的頭像 發(fā)表于 12-30 09:44 ?184次閱讀
    Include <b class='flag-5'>File</b>解鎖Vector Logger Suite高階功能

    斷言(Assertion)使用

    , __LINE__)) #endif void assert_failed(const char *file, int line) { printf(\"Assertion
    發(fā)表于 12-12 07:46

    CW32L010的學(xué)習(xí)筆記

    ;, __FUNCTION__,__FILE__,__LINE__,__DATE__); DEBUG_LOG("rn+-------------------+rn"
    發(fā)表于 12-01 08:26

    單片機(jī)串口調(diào)試的巧妙方法分享

    printf(\"%s %srn\" ,__DATE__ ,__TIME__ );//日期時(shí)間 printf(\"%s %s%dn\",__FILE__
    發(fā)表于 11-21 06:28

    無(wú)線充qi2新標(biāo)準(zhǔn):無(wú)線革命新篇章

    Qi2標(biāo)準(zhǔn)帶來(lái)無(wú)線充電革命,實(shí)現(xiàn)精準(zhǔn)定位、高速充電、多設(shè)備兼容與環(huán)保減廢。
    的頭像 發(fā)表于 11-15 08:14 ?3113次閱讀
    無(wú)線充qi2新<b class='flag-5'>標(biāo)準(zhǔn)</b>:無(wú)線革命新篇章

    GD32F527添加以太網(wǎng)后程序仿真器燒錄啟動(dòng)成功,手動(dòng)上電卡死是怎么回事?

    %d\\n\", __FILE__, __FUNCTION__, __LINE__); rt_kprintf(\"object:%p type:0x%x\\n\"
    發(fā)表于 11-05 13:16

    rtt studio用DAP下載不成功怎么解決?

    ;pyocdprobecmsis_dap_probe.py\", line 249, in read_dp File \"
    發(fā)表于 10-10 07:01

    rt-studio使用DAP-link不成功是哪里的問題?

    ;pyocdprobecmsis_dap_probe.py\", line 345, in read_dp File \"
    發(fā)表于 10-09 09:11

    探索PIC32CM JH-Value Line Curiosity Nano+觸摸評(píng)估套件:功能與上手指南

    (MCU)。此評(píng)估套件可輕松訪問微控制器的功能,可用于開發(fā)自定義應(yīng)用程序。Microchip Technology PIC32CM JH-Value Line 套件預(yù)裝了獨(dú)立的演示應(yīng)用程序,并通過(guò)USB Type-C^?^ 連接供電。該套件可作為獨(dú)立的發(fā)現(xiàn)元素使用,也可與
    的頭像 發(fā)表于 09-28 10:59 ?693次閱讀
    探索PIC32CM JH-Value <b class='flag-5'>Line</b> Curiosity Nano+觸摸評(píng)估套件:功能與上手指南

    GRAYSCALE+SVGA+find_line_segments報(bào)堆棧錯(cuò)誤如何處理?

    ): File "", line 36, in MemoryError: Out of fast frame buffer stack memory MPY: soft
    發(fā)表于 07-29 09:27

    華為聯(lián)合業(yè)界伙伴主導(dǎo)的SRv6壓縮標(biāo)準(zhǔn)RFC 9800正式發(fā)布

    部署加速階段。 RFC9800是SRv6核心系列標(biāo)準(zhǔn)里面定義SRv6壓縮方法的關(guān)鍵標(biāo)準(zhǔn),該標(biāo)準(zhǔn)定義了REPLACE(即華為主導(dǎo)聯(lián)合業(yè)界伙伴原創(chuàng)提出的G-SRv6技術(shù))和NEXT兩種SR
    的頭像 發(fā)表于 07-04 20:37 ?1245次閱讀

    求助,關(guān)于SGTL5000 LINE-IN聲音錄制問題

    我在定制載板上運(yùn)行帶有 IMX8MQ 處理器的 Android 11作系統(tǒng)。我正在使用SGTL5000編解碼器。 我正在嘗試通過(guò)將麥克風(fēng)連接到芯片的 Line-In 引腳來(lái)錄制聲音SGTL5000
    發(fā)表于 04-11 06:49

    基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制ADC外設(shè)

    != LZ_HARDWARE_SUCCESS) { PRINT_ERR(\"%s, %s, %d: ADC Key IO Init fail\\\\n\", __FILE__, __func__, __LINE__
    發(fā)表于 04-10 16:20