女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

嵌入式系統編程如何實現性能優化

Q4MP_gh_c472c21 ? 來源:嵌入式ARM ? 作者:李肖遙 ? 2020-12-24 16:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

C語言中,宏是產生內嵌代碼的唯一方法。對于嵌入式系統而言,為了能達到性能要求,宏是一種很好的代替函數的方法

使用宏定義

在C語言中,宏是產生內嵌代碼的唯一方法。對于嵌入式系統而言,為了能達到性能要求,宏是一種很好的代替函數的方法。

寫一個“標準”宏MIN ,這個宏輸入兩個參數并返回較小的一個:

錯誤做法:

1#define MIN(A,B)( A <= B ?A :B )

正確做法:

1#define MIN(A,B)((A)<=?(B)???(A)?:?(B)?)

對于宏,我們需要知道三點:

  1. 宏定義“像”函數;

  2. 宏定義不是函數,因而需要括上所有“參數”;

  3. 宏定義可能產生副作用。

下面的代碼:

1least=MIN(*p++,b);

將被替換為:

1((*p++)<=?(b)??(*p++):(b))

發生的事情無法預料。

因而不要給宏定義傳入有副作用的“參數”。

使用寄存器變量

當對一個變量頻繁被讀寫時,需要反復訪問內存,從而花費大量的存取時間。為此,C語言提供了一種變量,即寄存器變量。這種變量存放在CPU的寄存器中,使用時,不需要訪問內存,而直接從寄存器中讀寫,從而提高效率。

寄存器變量的說明符是register。對于循環次數較多的循環控制變量及循環體內反復使用的變量均可定義為寄存器變量,而循環計數是應用寄存器變量的最好候選者。

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

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

下面是一個采用寄存器變量的例子:

本程序循環n次,i和s都被頻繁使用,因此可定義為寄存器變量。

內嵌匯編

程序中對時間要求苛刻的部分可以用內嵌匯編來重寫,以帶來速度上的顯著提高。但是,開發和測試匯編代碼是一件辛苦的工作,它將花費更長的時間,因而要慎重選擇要用匯編的部分。

在程序中,存在一個80-20原則,即20%的程序消耗了80%的運行時間,因而我們要改進效率,最主要是考慮改進那20%的代碼。

嵌入式C程序中主要使用在線匯編,即在C程序中直接插入_asm{ }內嵌匯編語句:

 1/*把兩個輸入參數的值相加,結果存放到另外一個全局變量中*/
 2intresult;
 3voidAdd(longa,long*b)
 4{
 5_asm
 6{
 7MOVAX,a
 8MOVBX,b
 9ADDAX,[BX]
10MOVresult,AX
11}
12}

利用硬件特性

首先要明白CPU對各種存儲器的訪問速度,基本上是:

CPU內部RAM->外部同步RAM->外部異步RAM->FLASH/ROM

對于程序代碼,已經被燒錄在FLASH或ROM中,我們可以讓CPU直接從其中讀取代碼執行,但通常這不是一個好辦法,我們最好在系統啟動后將FLASH或ROM中的目標代碼拷貝入RAM中后再執行以提高取指令速度;

對于UART等設備,其內部有一定容量的接收BUFFER,我們應盡量在BUFFER被占滿后再向CPU提出中斷。例如計算機終端在向目標機通過RS-232傳遞數據時,不宜設置UART只接收到一個BYTE就向CPU提中斷,從而無謂浪費中斷處理時間;

如果對某設備能采取DMA方式讀取,就采用DMA讀取,DMA讀取方式在讀取目標中包含的存儲信息較大時效率較高,其數據傳輸的基本單位是塊,而所傳輸的數據是從設備直接送入內存的(或者相反)。DMA方式較之中斷驅動方式,減少了CPU 對外設的干預,進一步提高了CPU與外設的并行操作程度。

活用位操作

使用C語言的位操作可以減少除法和取模的運算。在計算機程序中數據的位是可以操作的最小數據單位,理論上可以用“位運算”來完成所有的運算和操作,因而,靈活的位操作可以有效地提高程序運行的效率。舉例如下:

1/*方法1*/
2inti,j;
3i=879/16;
4j=562%32;
5/*方法2*/
6inti,j;
7i=879>>4;
8j=562-(562>>5<

對于以2的指數次方為“*”、“/”或“%”因子的數學運算,轉化為移位運算“<< >>”通??梢蕴岣咚惴ㄐ?。因為乘除運算指令周期通常比移位運算大。

C語言位運算除了可以提高運算效率外,在嵌入式系統的編程中,它的另一個最典型的應用,而且十分廣泛地正在被使用著的是位間的與(&)、或(|)、非(~)操作,這跟嵌入式系統的編程特點有很大關系。

我們通常要對硬件寄存器進行位設置,譬如,我們通過將AM186ER型80186處理器的中斷屏蔽控制寄存器的第低6位設置為0(開中斷2),最通用的做法是:

1#defineINT_I2_MASK0x0040
2
3wTemp=inword(INT_MASK);
4outword(INT_MASK,wTemp&~INT_I2_MASK);

而將該位設置為1的做法是:

1#defineINT_I2_MASK0x0040
2wTemp=inword(INT_MASK);
3outword(INT_MASK,wTemp|INT_I2_MASK);

判斷該位是否為1的做法是:

1#defineINT_I2_MASK0x0040
2wTemp=inword(INT_MASK);
3if(wTemp&INT_I2_MASK)
4{
5/*該位為1*/
6}

上述方法在嵌入式系統的編程中是非常常見的,我們需要牢固掌握。

總結

在性能優化方面永遠注意80-20準備,不要優化程序中開銷不大的那80%,這是勞而無功的。

宏定義是C語言中實現類似函數功能而又不具函數調用和返回開銷的較好方法,但宏在本質上不是函數,因而要防止宏展開后出現不可預料的結果,對宏的定義和使用要慎而處之。

很遺憾,標準C至今沒有包括C++中inline函數的功能,inline函數兼具無調用開銷和安全的優點。

使用寄存器變量、內嵌匯編和活用位操作也是提高程序效率的有效方法。

除了編程上的技巧外,為提高系統的運行效率,我們通常也需要最大可能地利用各種硬件設備自身的特點來減小其運轉開銷,例如減小中斷次數、利用DMA傳輸方式等。

責任編輯:xj

原文標題:嵌入式系統編程怎么實現性能優化?

文章出處:【微信公眾號:嵌入式ARM】歡迎添加關注!文章轉載請注明出處。


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

    關注

    5149

    文章

    19659

    瀏覽量

    317351
  • 編程
    +關注

    關注

    88

    文章

    3689

    瀏覽量

    95223

原文標題:嵌入式系統編程怎么實現性能優化?

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    嵌入式和單片機,是同一個東西嗎?

    嵌入式系統的設計和實現需要考慮功耗、尺寸、成本和性能以外的其他因素,如可靠性、安全性和實時性。此外,嵌入式
    發表于 07-09 10:20

    嵌入式編程設計模式

    嵌入式編程設計模式,介紹如何使用設計模式為嵌入式系統創建高效且優化的C語言設計。 純分享貼,有需要可以直接下載附件獲取完整資料! (如
    發表于 04-15 14:47

    如何成為一名嵌入式軟件工程師?

    系統架構:能夠設計合理的系統架構,實現模塊間的解耦和高效的數據交互。 性能優化:通過算法優化
    發表于 04-15 14:37

    嵌入式系統存儲的軟件優化策略

    嵌入式系統開發領域,存儲器作為信息交互的核心載體,其技術特性直接影響著系統性能與穩定性。然而,有些人在面對Linux、安卓等復雜操作系統環境時,理解其存儲機制尚存局限,為突破這些技術
    發表于 02-28 14:17

    嵌入式系統中的代碼優化與壓縮技術

    在當今數字化時代,嵌入式系統廣泛應用于各個領域,從智能家居設備到工業控制系統,從汽車電子到可穿戴設備,它們無處不在。而在嵌入式系統開發中,代
    發表于 02-26 15:00

    如何提高嵌入式代碼質量?

    的情況下也必須保持穩定的性能。 3. 硬件依賴:嵌入式軟件緊密依賴硬件平臺,需要充分理解硬件特性才能編寫高效且穩定的代碼。 了解這些特點有助于開發人員在編寫代碼時有針對性地優化和調整,以滿足
    發表于 01-15 10:48

    ARM嵌入式編程高效技巧

    隨著物聯網和智能設備的快速發展,ARM嵌入式系統的應用越來越廣泛。從智能手機到智能家居,再到工業自動化,ARM處理器幾乎無處不在。因此,掌握ARM嵌入式編程的高效技巧對于開發者來說至關
    的頭像 發表于 12-28 09:17 ?659次閱讀

    新手怎么學嵌入式?

    ,實現一些簡單的功能,如點亮一個 LED 燈、讀取傳感器數據等,來加深對嵌入式技術的理解。你還可以參加一些線上或線下的嵌入式項目實踐活動,與其他愛好者一起學習和交流。 5. 學習嵌入式
    發表于 12-12 10:51

    什么是嵌入式人工智能

    。嵌入式人工智能的目標是使嵌入式系統具備智能化的感知、分析和響應能力,從而實現自主決策、自適應學習和智能交互等功能,以提高系統
    的頭像 發表于 12-11 09:23 ?993次閱讀
    什么是<b class='flag-5'>嵌入式</b>人工智能

    【「嵌入式系統設計與實現」閱讀體驗】+ 學習一個STM32的案例

    感謝電子發燒友論壇和電子工業出版社的贈書。 在[上一篇帖子](【新提醒】【「嵌入式系統設計與實現」閱讀體驗】+ 初步印象 - 社區活動專版 - 電子技術論壇 - 廣受歡迎的專業電子論壇!)中介紹了
    發表于 12-06 22:22

    什么是嵌入式?一文讀懂嵌入式主板

    在現代科技浪潮中,嵌入式技術已成為支撐各種智能設備和系統運行的核心力量。那么,究竟什么是嵌入式?嵌入式系統,顧名思義,是將計算機的硬件和軟件
    的頭像 發表于 10-16 10:14 ?2592次閱讀

    AMD 面向嵌入式系統推出高能效 EPYC 嵌入式 8004 系列

    領先地位。 ? AMD EPYC 嵌入式 8004 系列處理器專為計算密集型嵌入式系統所設計,可為高需求工作負載提供卓越性能,同時以緊湊的尺寸規格最大限度為空間和功率受限型應用提升能效
    發表于 10-11 13:58 ?1061次閱讀

    【「嵌入式Hypervisor:架構、原理與應用」閱讀體驗】+全文學習心得

    Hypervisor是一種在嵌入式系統實現虛擬化技術的關鍵組件,它能夠在同一硬件平臺上并行運行多個操作系統或應用程序,提供資源隔離、管理和優化
    發表于 10-09 19:11

    嵌入式系統的未來趨勢有哪些?

    智能家居領域,嵌入式系統可以集成語音識別和自然語言處理技術,去實現智能家電的語音控制。 2. 更強大的處理能力 在未來的嵌入式系統將具備更加
    發表于 09-12 15:42

    七大嵌入式GUI盤點

    嵌入式圖形用戶界面(GUI)是一種為嵌入式系統設計的用戶界面,它可以讓用戶通過圖形化的方式與設備進行交互。以下是對七種嵌入式 GUI 的盤點。 emWin 由德國SEGGER公司
    發表于 09-02 10:58