嵌入式C實現延時程序的不同變量的區別

2020-12-13 OFweek維科網

  在嵌入式系統中,延時是經常需要使用的一種手段,延時的方法可以通過使用類似於"NOP"的指令來實現,但是如果延時的時間比較長,如果使用太多的"NOP"指令則會消耗過多的儲存空間,最好的方法是使用子程序(彙編語言中)或子函數(高級語言中)。當然這裡並不打算討論如果使用定時器中斷來實現延時。下面就在C語言中使用子函數實現延時的幾個問題做些討論,當然討論高級語言的延時就需要考慮編譯器和處理器,這裡為了討論的方便,而且不失一般性,可以用標準51單片機作處理器和uVision2作為編譯環境,晶振為12MHz,這樣一個標準的機器周期即為1uS。其他的情況則可以據此類推。

  先看一段延時程序:其中Delay1()與Delay2()兩者的型參類型不同。

  將上述的Delay1(100)(變量為unsignedint類型)或Delay2(100)(變量為unsignedchar類型)分別在兩次過程中執行,便會得到了下述的執行結果:

  斷點B減去斷點A的時間為810uS,這個時間即為執行Delay1(100)所花費的時間;

  斷點B減去斷點A的時間為608uS,這個時間即為執行Delay2(100)所花費的時間;

  由此可見,作為unsignedint變量類型來傳遞延時函數的參數,會增長延時的時間,而使用unsignedchar變量類型則會得到短的延時時間。我們都知道C語言經過編譯後是要轉化成彙編語言的,只有彙編語句才有精確的執行時間,所以要知道這兩者結果的不同,原因就在於他們經過編譯之後彙編語句的不同的地方。
 

相關焦點

  • 單片機C語言延時需注意的問題
    對於延時比較長的,要求在大於10us,採用C51中的循環語句來實現。  在選擇C51中循環語句時,要注意以下幾個問題  第一、定義的C51中循環變量,儘量採用無符號字符型變量。  第二、在FOR循環語句中,儘量採用變量減減來做循環。  第三、在do…while,while語句中,循環體內變量也採用減減方法。
  • 在進行C51程序設計時如何精確延時的常見方法介紹
    為此我特意的將如何在C51程序中精確延時進行了一個小結。用51彙編語言寫程序時,這種問題很容易得到解決,而目前開發嵌入式系統軟體的主流工具為C語言,因此很有必要了解用C51寫延時程序時需要的一些技巧。2.1 短暫延時可以在C文件中通過使用帶_NOP_( )語句的函數實現,定義一系列不同的延時函數,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一個自定義的C文件中,需要時在主程序中直接調用。
  • 單片機c語言中nop函數的使用方法和延時計算
    但在單片機的C語言編程中,經常需要用幾個空指令產生短延時的效果。這在彙編語言中很容易實現,寫幾個nop就行了。 NOP指令為單周期指令,可由晶振頻率算出延時時間,對於12M晶振,延時1uS。對於延時比較長的,要求在大於10us,採用C51中的循環語句來實現。在選擇C51中循環語句時,要注意以下幾個問題第一、定義的C51中循環變量,儘量採用無符號字符型變量。第二、在FOR循環語句中,儘量採用變量減減來做循環。
  • 總結嵌入式開發中的C語言知識點
    事實上,編寫優質嵌入式C程序並非易事,需要了解相關硬體特性和缺陷,還需要了解相應地編譯原理。#endif等)平臺擴展關鍵字(__asm, __inline,__syscall)    這些關鍵字共同構成了嵌入式平臺的C語言語法,嵌入式的應用從邏輯上可以抽象為以下三個部分:    貫穿在整個嵌入式應用開發的過程中,對數據的管理包含以下幾部分:    為了應對嵌入式開發中受限的資源環境,C語言從語法上支撐上述功能的實現,並提供相應的優化機制
  • 嵌入式C語言執行效率如何保證,看這一文就夠了!
    一般情況下對C語言程序進行編譯時,所有的程序都參加編譯,但是有時希望對其中一部分內容只在滿足一定條件才編譯,這就是條件編譯。條件編譯可以根據實際情況,選擇不同的編譯範圍,從而產生不同的代碼。彙編語言是效率最高的計算機語言,在一般項目開發當中一般都採用C語言來開發的,因為嵌入彙編之後會影響平臺的移植性和可讀性,不同平臺的彙編指令是不兼容的。
  • 在VIM中實現對嵌入式軟體的調試
    1 gdb對嵌入式軟體的調試模式 許多非Linux的嵌入式系統已經在使用gdb與gdbstub對目標板進行遠程「交叉調試」;然而,因為Linux內核實現了ptrace()系統調用,所以在對嵌入式應用程式進行調試的時候並不需要gdb stub,而採用gdb套件提供的gdb伺服器來對目標板上的嵌入式應用程式進行調試。
  • 嵌入式C語言優化你不能不知道的技巧……
    但在嵌入式系統開發中,出於對低價產品的需求,系統的計算能力和存儲容量都非常有限,因此如何利用好這些資源就顯得十分重要。開發人員應注意嵌入式 C語言和標準 C 語言的區別,減少生成代碼長度,提高程序執行效率,在程序設計中對代碼進行優化。現在的 C 編譯器會自動對代碼進行優化,但這些優化是對執行速度和代碼長度的平衡。
  • 一個簡單的按鍵去抖延時程序
    這樣的話,就有一個問題,在延時的這20ms中,cpu一直在判斷時間有沒有到。如果不是中斷,是不會打斷cpu的程序的。這樣的話,去抖延時,就會浪費cpu的效率。假如,按鍵掃描的後面跟一個協議處理的函數。所以我想了另一個方法,採用標緻位,來實現延時,當然這個方法,肯定不是我第一個想出來的。如有雷同,可採用翻鋼鏰方法進行選擇。就是採用if語句來實現延時,只不過寫程序時比較麻煩,但穩定性在stm8上測試了一下,感覺還可以。
  • 嵌入式C語言編程規範
    Implementation-defined:實現定義的行為,這有些類似於「unspecified 」問題,其主要區別在於編譯器要提供一致的行為並記錄成文檔。換句話說,不同的編譯器之間功能可能會有不同,使得代碼不具有可移植性,但在任一編譯器內,行為應當是良好定義的。比如用在一個正整數和一個負整數上的整除運算「/ 」和求模運算符「% 」。存在76個這樣的問題。
  • C語言中,全局變量濫用的後果竟如此嚴重?
    它只被初始化一次,自從第一次初始化直到程序與你新內閣結束都一直存在,他和全局變量的區別在於全局變量對所有的函數都是可見的,而靜態局部變量只對定義自己的函數體始終可見。局部變量也只有局部作用域,他是自動對象,他在程序運行期間不是一直存在,而是只在函數執行期間存在,函數的一次調用結束後,變量就被撤銷,其所佔用的內存也被收回。
  • matlab和c語言的區別
    MATLAB可以進行矩陣運算、繪製函數和數據、實現算法、創建用戶界面、連接其他程式語言的程序等,主要應用於工程計算、控制設計、信號處理與通訊、圖像處理、信號檢測、金融建模設計與分析等領域。不同的變量類型可以用結構體(struct)組合在一起。只有32個保留字(reserved keywords),使變量、函數命名有更多彈性。部份的變量類型可以轉換,例如整型和字符型變量。通過指針(pointer),C語言可以容易的對存儲器進行低級控制。預編譯處理(preprocessor)讓C語言的編譯更具有彈性。
  • ARM7嵌入式系統中啟動程序的實現
    在我們研製開發基於ARM7的嵌入式系統過程中,發現技術難點主要在於系統啟動程序的編寫,為此本文詳細論述了在arm7基礎上開發嵌入式系統
  • 嵌入式系統高級C語言編程
    內容簡介  《嵌入式系統高級C語言編程》將主要介紹針對嵌入式系統的基於C語言的軟體項目開發的流程,較為複雜的c語言編程知識和技巧,編程風格和調試習慣
  • 大神用10000字總結了嵌入式C語言必學知識點……
    從語法上來說C語言並不複雜, 但編寫優質可靠的嵌入式C程序並非易事,不僅需要熟知硬體特性和缺陷,還需要對編譯原理和計算機技術知識有著一定的了解。本文以嵌入式實踐為基礎,再結合相關資料, 闡述嵌入式需要了解的C語言知識和重點,希望每個讀到這篇文章的人都能有所收穫。關鍵字關鍵字是C語言中具有特殊功能的保留標示符,按照功能可分為1).
  • 嵌入式常用的c標準庫
    通常,嵌入式系統是一個控制程序存儲在ROM中的嵌入式處理器控制板。事實上,所有帶有數字接口的設備,如手錶、微波爐、錄像機、汽車等,都使用嵌入式系統,有些嵌入式系統還包含作業系統,但大多數嵌入式系統都是由單個程序實現整個控制邏輯。 從應用對象上加以定義,嵌入式系統是軟體和硬體的綜合體,還可以涵蓋機械等附屬裝置。
  • PIC單片機C語言程序設計(2)
    數據是實現功能的過程,功能是數據運算(或處理)的結果,沒有數據,C程序就無法實現單片機規定的功能,可見數據在C語言程序中的重要性。  C語言的數據類型,有基本型、構造型、指針型三類。對此,筆者將在使用時逐一介紹。
  • 單片機延時程序經驗
    但在單片機的C語言編程中,經常需要用幾個空指令產生短延時的效果。這在彙編語言中很容易實現,寫幾個nop就行了。NOP指令為單周期指令,可由晶振頻率算出延時時間,對於12M晶振,延時1uS。對於延時比較長的,要求在大於10us,採用C51中的循環語句來實現。在選擇C51中循環語句時,要注意以下幾個問題第一、定義的C51中循環變量,儘量採用無符號字符型變量。第二、在FOR循環語句中,儘量採用變量減減來做循環。
  • 物聯網開發筆記——嵌入式開發之Linux系統中C語言數據類型
    物聯網開發筆記——嵌入式開發之Linux系統中C程序的編譯與調試主要講解C語言程序的編譯與調試。嵌入式開發學習C語言打下基礎。本節介紹《Linux系統中C語言數據類型》。1 數據類型分類short、int、long、char、float、double 這六個關鍵字代表C 語言裡的六種基本數據類型。
  • C語言變量可以定義在任意位置?不同位置對於性能有影響嗎?
    C語言程序開發不像 Python,若是需要使用變量,必須先定義。仔細想一想,C語言這麼要求的原因也是容易理解的,至少C程序可以事先知道需要為該變量分配多少內存,這其實也是C語言程序更可控的原因之一。這其實也是C語言程序更可控的原因之一C語言程序的變量雖然「定義再使用」目的是為了使用更小的開銷,實現更高的效率,但是很多程式設計師仍然將它看作是一種落後低效的特性
  • ARM7嵌入式系統中Bootloader分析與設計
    在嵌入式系統開發中Bootloader常常是嵌入式系統開發中可能遇到的第一個技術難點。應用程式運行環境能否正確構建,內核能否啟動成功,都取決於Bootloader能否正確的工作。一個功能完善的嵌入式系統Bootloader還要求能夠提供系統更新的能力,以及為了實現這一操作所需要的一個簡單的命令控制臺。