国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

嵌入式C開發關鍵字的應用技巧

硬件攻城獅 ? 來源:嵌入式系統 ? 作者:嵌入式系統 ? 2022-12-12 14:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

摘要:嵌入式C開發關鍵字的應用技巧

1、volatile

volatile修飾表示變量是易變的,編譯器中的優化器在用到這個變量時必須每次都小心地從內存中重新讀取這個變量的值,而不是使用保存在寄存器里的備份,有效的防止編譯器自動優化,從而與軟件設計相符合。

中斷服務與主程序共享變量:

//volatileuint8_tflag=1;
uint8_tflag=1;

voidtest(void)
{
while(flag)
{
//dosomething
}
}

//interruptserviceroutine
voidisr_test(void)
{
flag=0;
}

如果沒使用volatile定義flag,可能在優化后test陷入死循環,因為test里使用的flag并沒修改它,開啟優化后,編譯器可能會固定從某個內存取值。例如:

for(inti=0;i<100000;i++);
//對比
for(volatileinti=0;i<100000;i++);

前者可能被優化掉,雖然編碼本意是需要執行操作延時,但編譯器認為代碼無意義。

總的來說,volatile是告知編譯器,不管代碼如何,必須保留,而且使用時需要重新從內存讀取更新,不能使用先前讀取的緩存,一般在驅動代碼中使用較多。

2、const

const是恒定不變的意思,其修飾的各種數據類似只讀效果。

1、 修飾變量

采用const修飾變量,即變量聲明為只讀,保護變量值以防被修改。例如

constinti=1;

上面這個例子表明,變量i具有只讀特性,不能夠被更改;若想對i重新賦值,如i = 10;屬于錯誤操作。

特別說明,定義變量的同時進行初始化,寫成int const i=1,是正確的。

2、 修飾數組

C語言中const還可以修飾數組,舉例如下:

constintarray[5]={1,2,3,4,5};
array[0]=array[0]+1;//錯誤,array是只讀的,禁止修改

數組元素與變量類似,具有只讀屬性,不能被更改;一旦更改,編譯時就會報錯。

使用大數組存儲固定的信息,例如查表(表驅動法的鍵值表),可以使用const節省ram。編譯器并不給普通const只讀變量分配空間,而是將它們保存到符號表中,無需讀寫內存操作,程序執行效率也會提高。

3、 修飾指針

C語言中const修飾指針要特別注意,共有兩種形式,一種是用來限定指向空間的值不能修改;另一種是限定指針不可更改。舉例如下:

inti=1;
intj=2;

constint*p1=&i;
int*constp2=&j;

上面定義了兩個指針p1和p2,區別是const后面是指針本身還是指向的內容。

在定義1中const限定的是* p1,即其指向空間的值不可改變,若改變其指向空間的值如* p1=10,則程序會報錯;但p1的值是可以改變的,對p1重新賦值如p1=&k是沒有任何問題的。

在定義2中const限定的是指針p2,若改變p2的值如p2=&k,程序將會報錯;但* p2,即其所指向空間的值可以改變,如* p2=20是沒有問題的,程序正常執行。

4、 修飾函數參數

const關鍵字修飾函數參數,對參數起限定作用,防止其在函數內部被修改。所限定的函數參數可以是普通變量,也可以是指針變量。例如:

voidfun(constinti)
{
……
i++;//對i的值進行了修改,程序報錯
}

常用的函數如strlen

size_tstrlen(constchar*string);

const在庫函數中使用非常普遍,是一種自我保護的安全編碼思維。

3、struct與union

對于struct 結構體和union共聯體在嵌入式領域是使用得非常頻繁的,一些可編程芯片提供的寄存器庫都是采用結構體和共聯體結合的方式來提供給軟件人員進行開發,同時在平時的編碼過程中這兩個數據類型的靈活應用也能夠實現代碼更好的封裝與簡化。

如下面的簡單示例,就可以非常靈活的訪問Val中的bit位。

typedefunion
{
BYTEVal;
struct__packed
{
BYTEb0:1;
BYTEb1:1;
BYTEb2:1;
BYTEb3:1;
BYTEb4:1;
BYTEb5:1;
BYTEb6:1;
BYTEb7:1;
}bits;
}BYTE_VAL,BYTE_BITS;

其中:1表示按位操作。不只是位-字節可以,單字節與多字節也可以簡化拼接。

#include"stdio.h"

typedefstruct
{
union
{
struct
{
unsignedcharlow;
unsignedcharhigh;
};
unsignedshortresult;
};
}test_t;


intmain(intargc,char*argv[])
{
test_thello;

hello.high=0x12;
hello.low=0x34;

printf("result=%04X
",hello.result);//輸出result=1234

return0;
}

運行輸出 result=1234 (win7系統下QT開發環境),原本需要 (high<<8)|low 運算,可以簡化為共用體類型自動完成,但必須注意平臺的字節順序,屬于大端還是小端模式。

在應用層面,如果明確某個數據可能存在兩種可能,而且兩種結果不會同時存在,也可以使用結構體與共用體組合的方式,確保模塊對外接口統一。

例如移動通信模塊,使用數據結構保存其基站信息,因為制式不同,模塊可能工作在2G-GSM,也可能在4G-Cat1,為保證上層讀取基站信息接口唯一,使用共用體就非常合適,否則需定義兩套接口。如果覺得文章可以,可關注微信公眾號【嵌入式系統】獲取更多信息。

4、預定義標識符

一般編譯器都支持預定義標識符,這些標識符結合printf等打印信息幫助程序員調試程序是非常有用的,一般編譯器會自動根據用戶指定完成替換和處理。

部分標識:

__FILE__//表示編譯的源文件名
__LINE__//表示當前文件的行號
__FUNCTION__//表示函數名
__DATE__//表示編譯日期
__TIME__//表示編譯時間

使用范例:

printf("file:%s,line:%d,date:%s,time:%s",__FILE__,__LINE__,__DATE__,__TIME__);

這些比較常見,主要用于日志分析、版本記錄,便于調試。

5、#與##

#:是一種運算符,用于帶參宏的文本替換,將跟在后面的參數轉成一個字符串常量。

##:是一種運算符,是將兩個運算對象連接在一起,也只能出現在帶參宏定義的文本替換中。

#include"stdio.h"

#defineTO_STR(s)#s
#defineCOMB(str1,str2)str1##str2

intmain(intargc,char*argv[])
{
intUART0=115200;

printf("UART0=%d
",COMB(UART,0));//字符串合并為變量UART0
printf("%s
",TO_STR(3.14));//將數字變成字符串

return0;
}

6、void 與 void*

void表示的是無類型,不能聲明變量或常量,但是可以把指針定義為void類型,如void* ptr。void* 指針可以指向任意類型的數據,在C語言指針操作中,任意類型的數據地址都可轉為void* 指針。因為指針本質上都是unsigned int。

常用的內存塊操作庫函數:

void*memcpy(void*dest,constvoid*src,size_tlen);
void*memset(void*buffer,intc,size_tnum);

數據指針為void* 類型,對傳入任意類型數據的指針都可以操作。另外其中memcpy第二個參數,const現在也如前文所述,拷貝時對傳入的原數據內容禁止修改。

特殊說明,指針是不能使用sizeof求內容大小的,在ARM系統固定為int 4字節。對于函數無輸入參數的,也盡量加上void,如

voidfun(void);

7、weak

一般簡化定義

#define_WEAK__attribute__((weak))

函數名稱前面加上__WEAK屬性修飾符稱為“弱函數”,類似C++的虛函數。鏈接時優先鏈接為非weak定義的函數,如果找不到則再鏈接帶weak函數。

_WEAKvoidfun(void)
{
//dothis
}

//不在同一個.c,兩同名函數不能在同一個文件
voidfun(void)
{
//dothat
}

這種自動選擇的機制,在代碼移植和多模塊配合工作的場景下應用較多。例如前期移植代碼,需要調用某個接口fun,但當前該接口不存在或者未移植完整使用,可以使用weak關鍵字定義為空函數先保證編譯正常。后續移植完成實現了fun,即軟件中有2個fun函數沒有任何錯誤,編譯器自動會識別使用后者。當然也粗暴的#if 0屏蔽對fun的調用,但要確保后續記得放開。

8、總結

存在即合理,C語言里面的關鍵字,每個都有其特殊的意義,只是一般使用較少,譬如作文,使用常用的漢字可以;但引經據典,使用特殊的修飾辭藻更能顯出水平。后續對section 進行詳細說明,它和動態加載(OTA)、接口自啟動相關。

審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5199

    文章

    20454

    瀏覽量

    334269
  • C語言
    +關注

    關注

    183

    文章

    7644

    瀏覽量

    145643
  • 編譯器
    +關注

    關注

    1

    文章

    1672

    瀏覽量

    51652

原文標題:8、總結

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Parasoft C/C++test:嵌入式安全關鍵行業的一體化軟件測試解決方案

    縫融入 DevOps 的自動化測試工具。Parasoft C/C++test 正是為解決這一痛點而生,它是面向嵌入式安全關鍵行業的集成軟件測試解決方案,憑借全面的自動化能力與深度流程適
    的頭像 發表于 03-06 09:42 ?249次閱讀

    什么是嵌入式應用開發

    概述 所謂的嵌入式應用開發就是在嵌入式操作系統下進行開發、軟硬件綜合開發 ?嵌入式應用
    發表于 01-12 16:13

    C語言嵌入式系統編程注意事項-內存操作

    C語言嵌入式系統編程注意事項之內存操作 在嵌入式系統的編程中,常常要求在特定的內存單元讀寫內容,匯編有對應的MOV指令,而除C/C++以外的
    發表于 01-04 07:31

    關鍵字volatile的含意

    關鍵字volatile有什么含意? 一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都小心
    發表于 12-23 06:33

    interrupt關鍵字使用

    中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開發商提供一種擴展—讓標準C支持中斷。具代表事實是,產生了一個新的關鍵字__interrupt。下面的代碼就使用了__interrup
    發表于 12-22 09:36

    C語言單元測試在嵌入式軟件開發中的作用及專業工具的應用

    平臺和操作系統上運行,無需進行大量的修改 二、C語言單元測試在嵌入式開發中的關鍵作用 嵌入式系統對實時性和可靠性要求極高,單元測試是確保代碼質量的
    發表于 12-18 11:46

    Temu跨境電商按關鍵字搜索Temu商品API的應用及接口請求示例

    Temu跨境電商按關鍵字搜索Temu商品API的應用及接口請求示例 Temu跨境電商按關鍵字搜索Temu商品API的應用場景 Temu跨境電商平臺按關鍵字搜索Temu商品API的主要應用場景包括但不
    的頭像 發表于 11-29 15:08 ?473次閱讀

    哪些場合會用到volatile關鍵字?

    當你理解 volatile關鍵字的含義之后,你就能明白,其實很多場合都能用到 volatile關鍵字。 1.全局變量單片機開發,難免會用到全局變量。一些初級工程師,更是全局變量滿天飛。這種情況下
    發表于 11-25 08:19

    C語言在嵌入式開發中的應用

    C 語言在汽車電子控制系統開發中的主導地位。 2、設備驅動程序 設備驅動程序是嵌入式系統中連接硬件和軟件的橋梁,它負責實現嵌入式系統與外部設備之間的通信和控制。
    發表于 11-21 08:09

    嵌入式開發關鍵點介紹

    嵌入式開發關鍵點: 1. 硬件限制: 嵌入式系統通常具有嚴格的硬件限制,例如處理器速度、內存和存儲容量等。因此,嵌入式開發需要考慮這些限制,并編寫高效的代碼以確保系統的可靠性和性
    發表于 11-13 08:12

    亞馬遜平臺根據關鍵字搜索商品API接口

    ? ?在電商開發中,集成亞馬遜平臺的商品搜索功能是常見需求。通過亞馬遜的Product Advertising API(PAAPI),開發者可以根據關鍵字高效檢索商品信息。本技術帖將逐步介紹如何調用
    的頭像 發表于 11-05 15:00 ?379次閱讀
    亞馬遜平臺根據<b class='flag-5'>關鍵字</b>搜索商品API接口

    micro 關鍵字搜索全覆蓋商品,并通過 API 接口提供實時數據

    micro 關鍵字搜索全覆蓋商品”并通過 API 接口提供實時數據
    的頭像 發表于 07-13 10:13 ?889次閱讀

    嵌入式開發入門指南:從零開始學習嵌入式

    特定功能的計算機系統,廣泛應用于智能家居、工業控制、醫療設備、車載系統等領域。 2. 學習嵌入式開發的前置知識熟悉C語言編程掌握基本的數據結構與算法了解數字電路與微控制器原理熟悉Linux操作系統
    發表于 05-15 09:29

    單片機編程關鍵字之volatile

    volatile 修飾的變量是說這變量可能會被意想不到地改變。通常對于程序員而言,單片機 中用的就算常見了volatile 是易變的,不穩定的意思。其實對于很多人來說,根本沒見過這個關鍵字,不 知道
    發表于 04-02 13:47 ?2次下載

    嵌入式主板開發詳細指南

    嵌入式主板開發涉及硬件設計、軟件集成、系統優化等多個環節,需要結合具體應用場景進行深度定制。以下是嵌入式主板開發的詳細指南,涵蓋關鍵步驟、工
    的頭像 發表于 04-02 11:35 ?1379次閱讀
    <b class='flag-5'>嵌入式</b>主板<b class='flag-5'>開發</b>詳細指南