色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

嵌入式軟件開發常用的關鍵字和運算符

jf_Vqngj70R ? 來源:美男子玩編程 ? 2023-12-04 12:22 ? 次閱讀

1volatile關鍵字

volatile是一個特征修飾符,提醒編譯器它后面所定義的變量隨時都有可能改變,因此編譯后的程序每次需要存儲或讀取這個變量的時候,告訴編譯器對該變量不做優化,都會直接從變量內存地址中讀取數據,從而可以提供對特殊地址的穩定訪問。

常用場景:中斷服務與主程序共享變量。示例代碼如下:

//volatile uint8_t flag=1;
uint8_t flag=1;


void test(void)
{
    while(flag)
    {
        //do something
    }
}


//interrupt service routine
void isr_test(void)
{
    flag=0;
}

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

2const關鍵字

const 是 constant 的縮寫,意思是“恒定不變的”,它是定義常變量的關鍵字。

通常有4種用法。

1、修飾變量

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

const int i = 1;
或者
int const i=1;

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

2、修飾數組

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

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

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

3、修飾指針

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

int i = 1;
int j = 2;


const int *p1 = &i;
int* const p2 = &j;

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

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

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

4、 修飾函數參數

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

void fun(const int i)
{
    ……
    i++; //對i的值進行了修改,程序報錯
}

常用的函數如strlen。

size_t strlen(const char *string);

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

3static關鍵字

1、static修飾全局變量,該變量只在本文件內被訪問,不能在其他文件被直接訪問。

2、static修飾函數,該函數只能在本文件內被訪問,不能被其他文件訪問。但是可以通過嵌套的方式調用,變相的封裝的表現。

3、static修飾局部變量,更改該局部變量的生命周期。

生命周期:將臨時變量的生命周期變成全局變量的生命周期。

作用域不變:作用域仍然是在本代碼塊內。

4struct與union

可以使用struct結構體來存放一組不同類型的數據。

struct 結構體名{
    結構體所包含的變量或數組
};

結構體是一種集合,它里面包含了多個變量或數組,它們的類型可以相同,也可以不同,每個這樣的變量或數組都稱為結構體的成員,通常我們使用結構體定義和解析協議,如下所示:

// WiFi接收數據幀,控制切換模式
#pragma pack(1)
typedef struct receive_data_mode_t
{
    uint8_t device_head;        // 數據幀頭:0XA0+功能碼(FUNCTION_ID3),A款產品智能插座
    uint16_t device_len;        // 數據包總長度
    uint16_t device_id;         // 節點ID 0X0001~0XFFFE
    char software_version[15];  // 軟件版本 SMART_SW_A1_1.0 A款產品軟件1.0版本
    char hardware_version[15];  // 硬件版本 SMART_HW_A1_1.0 A款產品硬件1.0版本
    uint8_t switch_mode;        // 切換模式 0:運行模式,1:配置模式,2:節點升級,3:節點重啟
    uint16_t crc;               // 校驗位
}ReceiveData_Mode_t;
#pragma pack()

union共用體關鍵字,定義union下面的成員變量共享一塊內存,每一個成員在任一時刻有且只有一個成員使用此塊內存。

union 共用體名{
    成員列表
};

結構體和共用體的區別在于:結構體的各個成員會占用不同的內存,互相之間沒有影響;而共用體的所有成員占用同一段內存,修改一個成員會影響其余所有成員。

通常使用共用體做一些標志位操作,例如以下示例,可以非常靈活的訪問Val中的bit位。

typedef union
 {
     BYTE Val;
     struct __packed
     {
        BYTE b0:1;
        BYTE b1:1;
        BYTE b2:1;
        BYTE b3:1;
        BYTE b4:1;
        BYTE b5:1;
        BYTE b6:1;
        BYTE b7:1;
    } bits;
}BYTE_VAL, BYTE_BITS;

或者使用共用體實現單字節與多字節的轉化和拼接,如下所示:

#include "stdio.h"


typedef struct
{
    union
    {
        struct
        {
            unsigned char low;
            unsigned char high;
        };
        unsigned short result;
    };
}test_t;




int main(int argc, char *argv[])
{
    test_t hello;


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


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


    return 0;
}

5預定義標識符

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

常用的預定義標識符如下所示:

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

在Debug打印日志時候經常會用到,如下所示:

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

6#與##

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

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

#include "stdio.h"


#define TO_STR(s) #s
#define COMB(str1,str2) str1##str2


int main(int argc, char *argv[])
{
    int UART0= 115200;


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


    return 0;
}

7void 與 void*關鍵字

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

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

void * memcpy( void *dest, const void *src, size_t len );
void * memset( void *buffer, int c, size_t num);

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

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

void fun(void);

8weak關鍵字

一般簡化定義如下所示:

#define _WEAK __attribute__((weak))

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

_WEAK void fun(void)  
{  
    //do this
}  


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

這種自動選擇的機制,在代碼移植和多模塊配合工作的場景下應用較多。例如前期移植代碼,需要調用某個接口fun,但當前該接口不存在或者未移植完整使用,可以使用weak關鍵字定義為空函數先保證編譯正常。

后續移植完成實現了fun,即軟件中有2個fun函數沒有任何錯誤,編譯器自動會識別使用后者。當然也粗暴的#if 0屏蔽對fun的調用,但要確保后續記得放開。

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

    關注

    5090

    文章

    19173

    瀏覽量

    306847
  • 軟件開發
    +關注

    關注

    0

    文章

    624

    瀏覽量

    27390
  • 關鍵字
    +關注

    關注

    0

    文章

    37

    瀏覽量

    6918
  • 運算符
    +關注

    關注

    0

    文章

    172

    瀏覽量

    11097

原文標題:嵌入式軟件開發常用的關鍵字和運算符

文章出處:【微信號:美男子玩編程,微信公眾號:美男子玩編程】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言面試最常問的關鍵字

    大家好,我是嵌入式老林,從事嵌入式軟件開發多年,今天分享的內容是C語言面試最常問的三個關鍵字,希望能對你有所幫助。
    發表于 07-11 12:41 ?469次閱讀

    【下載】《嵌入式C編程與Atmel.AVR》

    對Atmel AVR RISC處理器的介紹,讀者會立即進入嵌入式C語言教程之中。在本書中,讀者將學習C語言的變量和常量、運算符和表達式、控制語句、指針和數組、存儲器類型、預處理指令、實時方法等等。本書特點
    發表于 01-11 18:02

    【下載】《嵌入式C編程與Atmel AVR》

    對Atmel AVR RISC處理器的介紹,讀者會立即進入嵌入式C語言教程之中。在本書中,讀者將學習C語言的變量和常量、運算符和表達式、控制語句、指針和數組、存儲器類型、預處理指令、實時方法等等?! ”緯?/div>
    發表于 01-31 18:06

    嵌入式軟件編程中關鍵字的用法和原理

    青島職業技術學院劉浩山東省文登市澤頭鎮***張斌引言計算機編程語言的關鍵字就好比是它的靈魂,只有深入理解了它們的含義才能編寫出優秀的代碼。C語言以其簡潔、高效和強大等特性成為嵌入式軟件編程的首選語言
    發表于 06-20 07:37

    Volatile關鍵字對于嵌入式開發有什么作用呢

    前言在進行嵌入式開發中,我們往往會看到一個名為volatile或者__IO的關鍵字,那么,它們對于嵌入式開發有什么作用呢?淺析volatile數據類型實際上,__IO和volatile是相同的
    發表于 11-05 09:20

    嵌入式程序員常見的const、static、volatile關鍵字

    開發中,const、static、volatile都是很常見的,我們嵌入式程序員需要熟知這三個關鍵字的恰當用法。下面是我參照網路上的大咖,大牛的博文,然后做一些代碼測試,撰寫一下自己的體會。歡迎大家一...
    發表于 12-21 06:08

    什么是嵌入式軟件開發

    嵌入式軟件開發又是指什么?   隨著嵌入式軟件系統結構越來越復雜,嵌入式軟件
    發表于 04-20 08:43 ?8794次閱讀

    ARM嵌入式軟件開發

    ARM嵌入式軟件開發ARM嵌入式軟件開發ARM嵌入式軟件開發
    發表于 01-15 17:29 ?65次下載

    C語言32個關鍵字九種控制語句34種運算符

    C語言32個關鍵字九種控制語句34種運算符 C語言32個關鍵字九種控制語句34種運算符
    發表于 05-06 11:47 ?6次下載

    32個關鍵字9個控制語句34個運算符概述

    32個關鍵字9個控制語句34個運算符
    發表于 05-15 09:32 ?15次下載

    關于嵌入式Linux軟件開發常用知識

    C語言是嵌入式軟件開發的基礎,c佳佳在嵌入式領域也有一定的份額,但是很少,所以我們如果要做嵌入式軟件開發,就得熟練掌握c語言語法。
    發表于 08-26 17:11 ?1476次閱讀

    python運算符是什么

    python運算符 0. 什么是運算符? 本章節主要說明Python的運算符。舉個簡單的例子 4 +5 = 9 。 例子中,4和5被稱為操作數,“+”號為運算符。 Python語言支持
    的頭像 發表于 02-21 16:44 ?2447次閱讀

    什么是運算符重載

    重載運算符是具有特殊名稱的函數,是通過關鍵字** operator **后跟運算符的符號來定義的
    的頭像 發表于 01-20 15:30 ?2560次閱讀

    C語言32個關鍵字可以分為這幾類

    C語言是一種面向過程、抽象化的通用程序設計語言,廣泛應用于嵌入式底層和系統開發。C語言關鍵字共有32個,根據用途,可分為四類:第一類:變量數據類型關鍵字:14個第二類:9條基本語句用到
    的頭像 發表于 12-31 15:28 ?5154次閱讀
    C語言32個<b class='flag-5'>關鍵字</b>可以分為這幾類

    嵌入式軟件開發軟件開發的區別

    嵌入式軟件開發軟件開發是兩個不同的概念,它們在一些關鍵方面有著明顯的區別。嵌入式軟件開發是指
    的頭像 發表于 01-22 15:27 ?2372次閱讀
    主站蜘蛛池模板: 美女快播第一网| 老司机亚洲精品影院在线观看| 久久电影院久久国产| 午夜亚洲WWW湿好爽| xiah俊秀| 日本亚洲中文字幕无码区| YELLOW视频在线观看免费版高清| 男子扒开美女尿口做羞羞的事| 中文字幕免费视频精品一| 久久热r在线视频精品| 中文字幕亚洲无线码高清不卡| 老师湿乎乎两半嫩| 99爱在线观看| 欧美乱码卡一卡二卡四卡免费| chinese国语露脸videos| 青青青久久| 父皇轻点插好疼H限| 午夜福利08550| 国内精品乱码卡一卡2卡三卡新区| 亚洲黄色录像片| 久久re视频这里精品09首页| 中文在线免费看视频| 男女肉大捧进出全过程免费| bbwvideoa欧美老妇| 少妇精品久久久一区二区三区| 国产麻豆AV伦| 一线高清视频在线播放| 麻豆天美国产一区在线播放| japanese色系free日本| 日韩久久影院| 国产在线观看成人| 中国女人内谢69XXXXXA片| 免费无码一区二区三区蜜桃大| 拔擦拔擦8X永久华人免费播放器| 色综合欧美色综合七久久| 国产亚洲免费观看| 中国二级毛片| 入禽太深免费高清在线观看5| 国产一区私人高清影院| 最新国产麻豆精品| 色偷偷爱偷偷要|