奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

C語言

嵌入式C語言編程小知識

時間:2023-12-20 11:18:05 志杰 C語言 我要投稿
  • 相關(guān)推薦

嵌入式C語言編程小知識

  嵌入式系統(tǒng)是用來控制或者監(jiān)視機(jī)器、裝置、工廠等大規(guī)模設(shè)備的系統(tǒng)。下面為大家整理了一些嵌入式C語言編程小知識,一起來看看吧!

嵌入式C語言編程小知識

  1. 流水線被指令填滿時才能發(fā)揮最大效能

  即每時鐘周期完成一條指令的執(zhí)行(僅指單周期指令)。如果程序發(fā)生跳轉(zhuǎn),流水線會被清空,這將需要幾個時鐘才能使流水線再次填滿。因此,盡量少的使用跳轉(zhuǎn)指令可以提高程序執(zhí)行效率,解決發(fā)案就是盡量使用指令的“條件執(zhí)行”功能。

  2. 在LPC2200系列中:

  可以通過過下面的程序延遲10毫秒:

  for(i=0;i<200;i++)

  {

  for(j=0;j<200;j++);

  }

  3. 同過下面語句將一個16位的變量放在兩個8位的變量中。

  //IP數(shù)據(jù)報總長度高字節(jié)

  IpHeadUint8[10]=(IpHead.e_ip.Crc&0xff00)>>8;

  //IP數(shù)據(jù)報總長度低字節(jié)

  IpHeadUint8[11]=IpHead.e_ip.Crc&0x00ff;

  4. 在對全部數(shù)組元素賦初值時,可以不指定數(shù)組長度。

  eg;inta[]={1,2,3,4,5};

  但如果當(dāng)輸出第a[5]以上的元素時,系統(tǒng)回輸出隨機(jī)數(shù)值,所以使用此方法時,不能使用超過初始值元素以上的元素。

  5.關(guān)鍵字register的用法:

  當(dāng)對一個變量頻繁被讀寫時,需要反復(fù)訪問內(nèi)存,從而花費大量的存取時間。為此,C語言提供了一種變量,即寄存器變量。這種變量存放在CPU的寄存器中,使用時,不需要訪問內(nèi)存,而直接從寄存器中讀寫,從而提高效率。寄存器變量的說明符是register。對于循環(huán)次數(shù)較多的循環(huán)控制變量及循環(huán)體內(nèi)反復(fù)使用的變量均可定義為寄存器變量,而循環(huán)計數(shù)是應(yīng)用寄存器變量的最好候選者。

  (1) 只有局部自動變量和形參才可以定義為寄存器變量。因為寄存器變量屬于動態(tài)存儲方式,凡需要采用靜態(tài)存儲方式的量都不能定義為寄存器變量,包括:模塊間全局變量、模塊內(nèi)全局變量、局部static變量;

  (2) register是一個"建議"型關(guān)鍵字,意指程序建議該變量放在寄存器中,但最終該變量可能因為條件不滿足并未成為寄存器變量,而是被放在了存儲器中,但編譯器中并不報錯(在C++語言中有另一個"建議"型關(guān)鍵字:inline)。

  6.對于程序代碼

  已經(jīng)被燒錄在FLASH或ROM中,我們可以讓CPU直接從其中讀取代碼執(zhí)行,但通常這不是一個好辦法,我們最好在系統(tǒng)啟動后將FLASH或ROM中的目標(biāo)代碼拷貝入RAM中后再執(zhí)行以提高取指令速度;

  CPU對各種存儲器的訪問速度,基本上是:

  CPU內(nèi)部RAM > 外部同步RAM > 外部異步RAM > FLASH/ROM

  7. 函數(shù)指針

  1> C語言中函數(shù)名直接對應(yīng)于函數(shù)生成的指令代碼在內(nèi)存中的地址,因此函數(shù)名可以直接賦給指向函數(shù)的指針

  2> 調(diào)用函數(shù)實際上等同于“調(diào)用指令+參數(shù)傳遞處理+回歸位置入棧”,本質(zhì)上最核心的操作是將函數(shù)生成的目標(biāo)代碼的首地址賦給CPU的PC寄存器。

  3> 因為函數(shù)調(diào)用的本質(zhì)是跳轉(zhuǎn)到某一個地址單元的code去執(zhí)行,所以可以“調(diào)用一個根本就不存在在函數(shù)實體

  4> int (*p)();定義p是一個指向函數(shù)的指針變量,次函數(shù)返回帶回整型的返回值。*P兩側(cè)的括號不能省略,表示p先于*結(jié)合,是指針變量,然后再與后面的()結(jié)合,表示此指針指向函數(shù)。

  區(qū)別:int *p()表示這個函數(shù)的返回值是指向整型變量的指針。

  說明:

  (1) 指向函數(shù)的指針變量的一般定義形式為:

  數(shù)據(jù)類型 (*指針變量名)();

  1> 此處的“數(shù)據(jù)類型”是指函數(shù)返回值的類型

  (2) 返回指針值的函數(shù):

  類型名 *函數(shù)名(參數(shù)表)

  eg: int * func(int x,int y)

  func是函數(shù)名,調(diào)用它以后能返回一個指向整型數(shù)據(jù)的指針。x,y是func的形參。

  區(qū)別方法:

  a.從右往左找第一個括號,括號里面的是函數(shù)的形參。

  b.括號外面的第一個標(biāo)識符是函數(shù)的名字,函數(shù)前面的表示函數(shù)的返回數(shù)值。

  8. 數(shù)組指針

  1>int (*p)[4]

  表示*p有4個元素,每個元素為整型。也就是p所指的對象有4個整型元素的數(shù)組,既P是行指針。

  2> 指針數(shù)組

  一個數(shù)組,其元素均為指針類型數(shù)據(jù),稱為指針數(shù)組;即指針數(shù)組中的每一個元素都相當(dāng)于一個指針變量。

  一維指針數(shù)組的定義形式為:

  類型名 *數(shù)組名[數(shù)組長度]

  eg:int *p[4]:

  作用:它用于指向若干個字符串,使字符串處理更加方便靈活。適用于一個二維字符串?dāng)?shù)組,其中每一行的字符數(shù)組的長度各不相同

  eg:char * name[]={“Follow me”,”BASIC”,”GreatWall”};

  9. 結(jié)構(gòu)體

  1> 可以用結(jié)構(gòu)體變量做實參。但是用結(jié)構(gòu)體變量作實參時,采取的是“值傳遞”的方式,將結(jié)構(gòu)體變量所占的內(nèi)存單元的內(nèi)容全部順序遞給形參。形參也必須是同類型的結(jié)構(gòu)體變量。

  eg:pint(su);//注在此處su為結(jié)構(gòu)體

  注:這種傳遞方式在空間和時間上開銷較大,如果結(jié)構(gòu)體的規(guī)模較大時,開銷是很可觀的。

  2> 用直向結(jié)構(gòu)體變量(或數(shù)組)的指針作實參,將結(jié)構(gòu)體變量(或數(shù)組)的地址傳給形參

  eg:print(&su);//注在此處su為結(jié)構(gòu)體

  10. 共用體

  1> 共用體把幾種不同數(shù)據(jù)類型的變量存放在同一塊內(nèi)存里。公用體中的變量共享同一塊內(nèi)存。

  2> 定義公用體類型變量的一般形式為:

  union 共用體名

  {

  成員列表;

  }變量列表;

  3>在共用體中同一塊內(nèi)存可以用來存放幾種不同類型的數(shù)據(jù),但在某一時刻只能在其中存放一個成員變量。共用體變量中起作用的成員是最后一次存入的數(shù)據(jù)。

  eg: union data

  {

  int i;

  char c;

  double d;

  };

  union data a;

  共用體變量a中的成員i,c,d三個變量在內(nèi)存中從同一個地址開始存儲。如進(jìn)行如下賦值:

  a.i = 100;

  a.c = ‘A’;

  那么此時共用體變量a中的成員i已經(jīng)沒有值了,因為存儲該值的內(nèi)存現(xiàn)在已經(jīng)被用來存儲成員c的值了。

  3> 共用體變量的長度取決于其成員的最大長度:

  說明:

  結(jié)構(gòu)體變量所占內(nèi)存的長度是各個成員的總和,每個成員分別占有自己的存儲空間。共用體變量所占內(nèi)存的長度是其最長成員的長度。當(dāng)然,編譯器出于提高訪問效率的目的,在編譯分配存儲空間時往往要進(jìn)行對齊操作。

  對齊操作以最大基本類型為準(zhǔn)。即以最大基本類型為基本單元。若按實際算下的長度不是基本單元的整數(shù)倍,則其實際長度應(yīng)該是基本單元的整數(shù)倍。

  (在TurboC中不進(jìn)行對齊,在Linux中進(jìn)行對齊)

  11. CPU字長與存儲器位寬不一致處理

  例如:使用共用體來解決這一沖突:

  union send_temp{

  uint16 words;

  uint8 bytes[2];

  }send_buff;

  eg:send_buff.bytes[0]=a;//此處a 是8位

  send_buff.bytes[1]=b;//此處 b 是8位;

  此時就將8位字拼成了16位字存儲了。

  發(fā)送時send(send_buff.words)就可以每次發(fā)送一個16位的數(shù)據(jù)了。

  12. C語言符號優(yōu)先級:

  1>復(fù)合賦值運算符號:

  a+=3*5;

  等價于a=a+(3*5);

  嵌入式C語言編程小知識

  1.使用位操作:嵌入式系統(tǒng)通常對內(nèi)存和處理器資源有限,位操作可以用來優(yōu)化代碼和節(jié)省內(nèi)存。例如,使用位掩碼和位運算進(jìn)行數(shù)據(jù)的打包和解包,以及對寄存器的位級操作。

  位操作示例:設(shè)置和清除位

  這個示例展示了如何使用位操作來設(shè)置和清除位標(biāo)志,以及如何檢查位標(biāo)志的狀態(tài)。

  2.使用宏定義:宏定義可以用來創(chuàng)建代碼片段的別名,增加代碼的可讀性和簡潔性。常見的用法包括定義常量、函數(shù)宏和條件編譯宏。

  宏定義示例:計算數(shù)組長度

  這個示例展示了如何使用宏定義來計算數(shù)組的長度,避免了在多個地方重復(fù)計算長度的代碼。

  3.內(nèi)存管理:嵌入式系統(tǒng)對內(nèi)存的使用非常關(guān)鍵。需要注意內(nèi)存分配和釋放的方法,以避免內(nèi)存泄漏和碎片化。可以使用靜態(tài)內(nèi)存分配、動態(tài)內(nèi)存分配(如malloc/free)或者內(nèi)存池等方法。

  動態(tài)內(nèi)存分配示例:使用malloc和free

  這個示例展示了如何使用動態(tài)內(nèi)存分配函數(shù)malloc來分配一段內(nèi)存,并使用free函數(shù)釋放該內(nèi)存。

  4.中斷處理:中斷是嵌入式系統(tǒng)中常見的事件處理方式。需要編寫中斷服務(wù)函數(shù)(ISR)來響應(yīng)中斷事件,并進(jìn)行必要的處理。在編寫ISR時,要注意避免使用過多的計算和延時操作,以確保中斷的及時響應(yīng)。

  中斷處理示例:定義中斷服務(wù)函數(shù)(ISR)

  這個示例展示了如何定義一個中斷服務(wù)函數(shù)(ISR)來處理中斷事件,然后在主循環(huán)中檢查中斷標(biāo)志位并執(zhí)行相應(yīng)的操作。

  5.低功耗優(yōu)化:嵌入式系統(tǒng)通常需要考慮功耗的優(yōu)化。可以使用低功耗模式、定時器中斷等方法來降低系統(tǒng)功耗。此外,合理設(shè)計算法和數(shù)據(jù)結(jié)構(gòu),減少CPU的計算和存儲開銷,也能有效降低功耗。

  低功耗優(yōu)化示例:休眠模式這個示例展示了如何通過進(jìn)入休眠模式來實現(xiàn)低功耗優(yōu)化。在主函數(shù)中,首先檢測系統(tǒng)是否處于空閑狀態(tài)(由is_idle()函數(shù)判斷),如果是空閑狀態(tài),就調(diào)用enter_sleep_mode()函數(shù)將系統(tǒng)置于休眠模式。在休眠模式下,系統(tǒng)將關(guān)閉不必要的電路和外設(shè),以減少功耗。通過合理地使用休眠模式,可以大大降低嵌入式系統(tǒng)的能耗。

  6.設(shè)備驅(qū)動編程:嵌入式系統(tǒng)通常需要與外設(shè)進(jìn)行交互,編寫設(shè)備驅(qū)動程序來管理硬件資源。這涉及到對寄存器、時鐘、中斷等的操作,以及與設(shè)備進(jìn)行通信和控制。

  設(shè)備驅(qū)動編程示例:讀取和寫入寄存器

  這個示例展示了如何通過讀取和寫入寄存器的方式與外設(shè)進(jìn)行通信,通過讀取和寫入指定地址的方法來訪問寄存器的值。

  7.調(diào)試和日志:在嵌入式開發(fā)中,調(diào)試和日志記錄是非常重要的。可以使用調(diào)試器、串口打印、LED指示燈等方式來進(jìn)行調(diào)試。另外,通過合理的日志記錄,可以幫助定位問題和系統(tǒng)優(yōu)化。

  調(diào)試和日志示例:使用串口打印調(diào)試信息

  這個示例展示了如何通過串口打印函數(shù)來輸出調(diào)試信息。在關(guān)鍵位置插入調(diào)試打印語句,有助于調(diào)試程序并跟蹤程序的執(zhí)行流程。

  8.防止整型溢出:在嵌入式系統(tǒng)中,經(jīng)常需要處理計數(shù)、計時等操作。為了防止整型溢出,可以使用適當(dāng)?shù)臄?shù)據(jù)類型和邊界檢查來確保數(shù)值的正確性。

  防止整型溢出示例:邊界檢查

  這個示例展示了如何使用邊界檢查來防止整型加法溢出。通過檢查相加操作后的結(jié)果是否超出整型的取值范圍,可以提前判斷是否會發(fā)生溢出。

  9.狀態(tài)機(jī)設(shè)計:嵌入式系統(tǒng)中,很多任務(wù)是基于狀態(tài)的。使用狀態(tài)機(jī)設(shè)計模式可以清晰地描述系統(tǒng)的各種狀態(tài)和狀態(tài)之間的轉(zhuǎn)換關(guān)系,提高代碼的可讀性和可維護(hù)性。

  狀態(tài)機(jī)設(shè)計示例:交通信號燈控制

  這個示例展示了一個簡單的交通信號燈控制狀態(tài)機(jī)。使用枚舉類型定義了紅燈、黃燈和綠燈三種狀態(tài),并編寫了handle_traffic_light函數(shù)來根據(jù)當(dāng)前狀態(tài)執(zhí)行相應(yīng)的操作。在主函數(shù)中,模擬了交通信號燈狀態(tài)的變化,并調(diào)用handle_traffic_light函數(shù)來處理每個狀態(tài)。

  10.優(yōu)化編譯選項:編譯器的優(yōu)化選項可以對代碼進(jìn)行優(yōu)化,提高執(zhí)行效率。

  優(yōu)化編譯選項示例:代碼執(zhí)行速度優(yōu)化

  在這個示例中,我們定義了一個簡單的函數(shù)sum_array,用于計算整型數(shù)組的和。在主函數(shù)中,我們初始化了一個包含5個元素的整型數(shù)組,并調(diào)用sum_array函數(shù)來計算數(shù)組的和,并將結(jié)果打印出來。

  代碼在默認(rèn)編譯選項下進(jìn)行編譯,這通常是沒有啟用任何優(yōu)化級別的情況。為了體現(xiàn)代碼執(zhí)行速度的優(yōu)化效果,我們將使用GCC編譯器,并在編譯時啟用優(yōu)化選項-O2,即優(yōu)化級別2。

  編譯指令:

  gcc-O2example.c-oexample

  在啟用優(yōu)化選項后,編譯器會對代碼進(jìn)行各種優(yōu)化,以提高代碼的執(zhí)行速度和效率。優(yōu)化的具體效果取決于編譯器和優(yōu)化級別。

  具體的代碼差異在優(yōu)化前后可能會有所不同,因為優(yōu)化編譯選項的作用是對代碼進(jìn)行改寫和重組,以使其更高效地執(zhí)行。優(yōu)化后的代碼可能會有以下改變:

  循環(huán)展開:編譯器可能會將循環(huán)展開,將多個迭代合并為一個,以減少循環(huán)開銷和分支預(yù)測。

  內(nèi)聯(lián)函數(shù):編譯器可能會將函數(shù)調(diào)用處直接替換為函數(shù)體,以減少函數(shù)調(diào)用的開銷。

  消除無用代碼:編譯器可能會識別和刪除沒有實際影響的代碼,以減少不必要的計算和內(nèi)存訪問。

  寄存器分配:編譯器可能會優(yōu)化寄存器的使用,以減少內(nèi)存讀寫和提高數(shù)據(jù)訪問速度。

  常量折疊:編譯器可能會在編譯時計算常量表達(dá)式的值,并將結(jié)果直接替換為常量值。

  這些優(yōu)化技術(shù)的具體應(yīng)用取決于編譯器和優(yōu)化級別。通過啟用適當(dāng)?shù)膬?yōu)化選項,編譯器可以對代碼進(jìn)行優(yōu)化。

【嵌入式C語言編程小知識】相關(guān)文章:

怎樣學(xué)習(xí)c++c語言編程04-28

c語言編程軟件有哪些03-17

嵌入式C語言優(yōu)化技巧11-10

C語言入門知識07-20

C語言的枚舉類型知識04-19

C語言入門知識:常量08-31

C語言基本知識06-27

C語言基礎(chǔ)知識12-20

Java語言編程基礎(chǔ)知識04-18

c語言入門基礎(chǔ)知識07-18

主站蜘蛛池模板: 嘉义县| 南乐县| 广宁县| 阜新| 米易县| 阳原县| 威宁| 南阳市| 平罗县| 凉城县| 延安市| 南靖县| 白水县| 沾化县| 佛坪县| 宜君县| 甘孜县| 璧山县| 宁陵县| 青冈县| 永和县| 哈巴河县| 阿克陶县| 芦山县| 赣州市| 阳高县| 邵阳市| 公主岭市| 阿坝| 巴塘县| 阳曲县| 苏尼特右旗| 定南县| 楚雄市| 绥滨县| 泾川县| 富宁县| 镇坪县| 宕昌县| 芜湖县| 平度市|