1. 程式人生 > >在Ti的DSP程式中使用C++程式設計

在Ti的DSP程式中使用C++程式設計

在嵌入式開發中,年長的開發人員都比較習慣使用C語言;而年輕人在學習時,接受的培訓很多也是使用C語言教授的。其實,使用C++做嵌入式開發也是很不錯的選擇,也許是將來嵌入式程式設計的一種趨勢。

下面就將在嵌入式開發中使用C++的一些方式羅列一下,主要是在Ti公司的CCS5以上的開發環境中。

歡迎交流:[email protected]


  •  inline函式的使用

對於簡短的函式呼叫,一般在標頭檔案中宣告成行內函數。

呼叫行內函數的程式碼,被編譯時,會直接插入行內函數的執行程式碼,而不會有函式呼叫的發生。

雖然巨集替代也可以實現內聯的功能和效能,但是編譯器對行內函數進行嚴格的型別檢查,從而減少程式中的錯誤。

例如:

封裝簡單的語句,簡化呼叫程式碼的書寫。

	/**
	 * 使能全域性中斷
	 */
	inline void eint(){
		asm(" clrc INTM");
	}

	/**
	 * 禁用全域性中斷
	 */
	inline void dint(){
		asm(" setc INTM");
	}

	/**
	 * 使能全域性實時中斷
	 * 一般在eint()之後呼叫
	 */
	inline void ertm(){
		asm(" clrc DBGM");
	}

對函式呼叫的引數封裝,使功能一目瞭然。

	inline void enableInt1(){
		enableInt(0);
	}

	inline void enableInt2(){
		enableInt(1);
	}

	inline void enableInt3(){
		enableInt(2);
	}

	inline void enableInt4(){
		enableInt(3);
	}

	inline void enableInt5(){
		enableInt(4);
	}

	inline void enableInt6(){
		enableInt(5);
	}

	inline void enableInt7(){
		enableInt(6);
	}

	inline void enableInt8(){
		enableInt(7);
	}

	inline void enableInt9(){
		enableInt(8);
	}

	inline void enableInt10(){
		enableInt(9);
	}

	inline void enableInt11(){
		enableInt(10);
	}

	inline void enableInt12(){
		enableInt(11);
	}


  • 使用常量

程式中往往要定義一些系統常數,一般將其定義成常量。

同樣,巨集定義也可以定義常量,但是編譯器對巨集也是不進行型別檢查的。

  • 函式引數使用引用

嵌入式中記憶體往往是比較重要的資源,程式編寫過程中,儘量減少記憶體的佔用。

	inline void set( const int& i ){
		m_set |= (0x0001<<i);
	}

	inline void clear( const int& i ){
		m_clr |= (0x0001<<i);
	}

	inline void toggle( const int& i ){
		m_toggle |= (0x0001<<i);
	}


  • 使用模板程式設計
  • 使用類

面向物件的程式設計思想和方法在當代程式設計中已經非常普及。嵌入式中各種外設的使用,就像面向物件是為其而生的。比如2812有兩個串列埠,兩個串列埠的用法是一模一樣的,就可以為其定義一個串列埠類。

但是類的繼承和動態聯編的特性給人的印象是執行效率低,佔用程式空間的。

其實在嵌入式中使用類,還是應該有限制的。一般只是用類來封裝,繼承時不使用基類的虛擬函式呼叫,而是直接使用子類的函式呼叫。

當然,我們在編寫複雜的應用程式時,或者編寫一類應用程式的框架時,還是會使用虛擬函式的。算是犧牲部分效能和空間換取可複用的可靠程式碼吧。

比如我們做了一個基於串列埠的使用者控制檯程式框架。就是基於抽象的串列埠類實現的,可以執行在281x,283x,674x等平臺。這樣的話,只要寫一份程式,就可以保證在不同硬體上通用,為後續的應用開發提供基礎構件。

  • 使用類的靜態物件

一般地,我們為每個外設申明一個類。比如串列埠是一個CSci基類,而串列埠A,會申明位CSciA:public CSci。

事實上,系統只有一個SCIA裝置,這樣我們會定義一個靜態物件static CSciA& CSciA::ins()介面來獲取SCIA裝置的物件。

這樣有多個方面的考慮:有一個統一的封裝方式;有些同類外設的不同物件之間是有細微差別的;如果某個物件要頻繁的訪問,減少建構函式的開銷。

  • 使用名稱空間

名稱空間真是個好東西。在Java中有包的概念,這樣在不同包之間可以有同名的類和物件。在C++中使用名字空間也能實現的。

比如:281x的串列埠類就可以宣告成這樣

namespace NF281x{

/**
 * SCI基類
 */
class CSci{
public:
	CSci( volatile unsigned int& ccr,volatile unsigned int& ctl1 );
};
}

而同時可以宣告283x的串列埠類
namespace NF283x{

/**
 * SCI基類
 */
class CSci{
public:
	CSci( volatile unsigned int& ccr,volatile unsigned int& ctl1 );
};
}

雖然,這兩款晶片的串列埠可以認為是一樣的,這樣我們可以什麼一個更加基本的類
namespace NF28x{

/**
 * SCI基類
 */
class CSci{
public:
	CSci( volatile unsigned int& ccr,volatile unsigned int& ctl1 );

};
}

這樣我們可以在281x和283x中直接引用28x中的定義即可

相關推薦

如何編譯執行譚浩強所著C++程式設計這本書程式

如何編譯執行譚浩強所著C++程式設計這本書中程式 工具:Microsoft Visual Studio 2013 操作:檔案-新建-專案-Win32-Win32控制檯應用程式(確定名稱-空專案-完 成) 所謂空專案,是指當學習簡單的C++語言示例,不需要預設的預編譯標頭檔案選項,

C++程式設計提高程式執行效率的方式(不斷更新)

在實際的工作中,利用程式實現同樣的功能會有很多種方式,但是考慮到程式的執行時間時,很多方式並不可取。不斷提高程式的執行效率,而又不影響程式功能是程式設計師的不竭追求! 以下是我在工作中總結的提高程式程式碼效率的方式: 1.整型執行速度快於浮點型,所以能用整型的地方儘量不要

linux應用程式設計筆記(1)gdb除錯方法及如何找出dbg.c程式的錯誤

摘要: 介紹了gdb偵錯程式以及其使用流程,總結了常用的幾個gdb除錯命令,最後使用這些方法找出dgb.c檔案中的錯誤。 一、gdb簡介     gdb是gnu釋出的一款功能強大的程式除錯工具,其主

程式語言】在Unity3DC#程式設計初級

一、前言 這篇文章主要是給零基礎想要Unity入門的關於C#程式設計的一些意見 二、參考文章 三、正文 1、支援Unity3D的程式語言 C#、JavaScript、UnityScript 先說C#與JavaScript,因

在Ti的DSP程式使用C++程式設計

在嵌入式開發中,年長的開發人員都比較習慣使用C語言;而年輕人在學習時,接受的培訓很多也是使用C語言教授的。其實,使用C++做嵌入式開發也是很不錯的選擇,也許是將來嵌入式程式設計的一種趨勢。 下面就將在嵌入式開發中使用C++的一些方式羅列一下,主要是在Ti公司的CCS5以上的

Android程式,內嵌ELF可執行檔案-- Android開發C語言混合程式設計總結

前言 都知道的,Android基於Linux系統,然後覆蓋了一層由Java虛擬機器為核心的殼系統。跟一般常見的Linux+Java系統不同的,是其中有對硬體驅動進行支援,以避開GPL開源協議限制的HAL硬體抽象層。 大多數時候,我們使用JVM語言進行程式設計,比如傳統的Java或者新貴Kotlin。碰到對

COMP20003作業代做、代寫C/C++程式設計作業、Algorithms and Data Structures作業代寫、代做C/C++程式作業

COMP20003作業代做、代寫C/C++程式設計作業、Algorithms and Data Structures作業代寫、代做C/C++程式作業COMP20003 Algorithms and Data StructuresSecond (Spring) Semester 2018[Assignment

簡單遠端遙控程式【網路程式設計 - 簡單遠端遙控程式C實現】

實驗內容 基於Windows下Winsocket程式設計 實現 1.list (顯示伺服器端當前路徑下所有檔案) 2.get 遠端檔案路徑 本地檔案路徑 (下載遠端檔案 到 本地檔案路徑 ) 3.port 本地檔案路徑 遠端檔案路徑 (上傳 本地檔案 到 本地檔案路徑下 ) 4.quit (退出程式) 參

C++---使用VS在C++程式設計出現 fatal error C1010: 在查詢預編譯頭時遇到意外的檔案結尾。是否忘記了向源新增“#include "stdafx.h"”?

啦啦啦,好久沒寫部落格啦... 對於C++初學者來說適應一個新的編譯器還是需要蠻長一段時間的,現在我就給你們說說標題所說的這個問題吧... 第一步:選單--〉專案--〉設定,出現“專案設定”對話方塊,左邊展開專案,在“原始檔”中找到出錯的檔案。 第二步:在右邊選擇“C/C++”屬性頁,在Category

正則表示式之C程式使用正則

POSIX規定了正則表示式的C語言庫函式,詳見regex(3)。我們已經學習了很多C語言庫函式的用法,讀者應該具備自己看懂man手冊的能力了。本章介紹了正則表示式在grep、sed、awk中的用法,學習要能夠舉一反三,請讀者根據regex(3)自己總結正則表示式在C語言中的用法,寫一些簡單的程式,例

C#程式設計基礎第四課2:使用if語句、if-else語句、多重if語句、巢狀if語句完成的C#控制檯小程式

知識點:基本算術運算、簡單if語句、if-else語句的練習。利用語句完成簡單C#控制檯程式。 1、運用if-else語句,判斷使用者輸入的年份是否是閏年 static void Main(string[] args) { /*

C#程式設計基礎第四課:c#的邏輯運算子、多重if語句、巢狀if語句的使用

知識點:邏輯運算子、多重if語句、巢狀if語句 1、邏輯運算子 練習1:邏輯或、邏輯與運算子的使用 本次計算機考試成績規定:筆試成績等於100分且機試成績大於等於60分,或筆試成績大於等於60分且機試成績等於100分,     輸出“成績優秀”,&

C#程式設計基礎第三課:C#的運算子和分支語句

知識點:運算子、if結構、if-else語句 一、運算子 運算子用於執行程式程式碼運算,會針對一個以上運算元專案來進行運算。例如:2+3,其運算元是2和3,而運算子則是“+”。在vb2005中運算子大致可以分為5種類型:算術運算子、連線運算子、關係運算符、賦值運算子和邏輯運算子。。

C程式設計快速進階大學教程》第五章程式

1.編寫程式求三個整型數的和、積和平均值,輸入三個數的值,輸出結果。 #include <stdio.h> #include <stdlib.h> int main() { int a,b,c; scanf("%d %d %d",&a,&

程式設計師教程-10章-C++程式設計

  本來這章是不打算寫了的,畢竟自己學的是JAVA,C++就不想看了,但畢竟還有一點時間,就把C++也看一下吧   目錄結構   10.1 C++程式基礎     10.1.1 資料型別       1 基本資料型別       2 常量和變數       3 複合資料型別       4 引用

C程式設計,設定兩個外部中斷(INT0和INT1)按鍵,優先順序IP=0x04,即把外部中斷1設定為高階優先順序,外部中斷0為低階優先順序,使外部中斷1巢狀在外部中斷0

問題 用C程式設計,設定兩個外部中斷(INT0和INT1)按鍵,優先順序IP=0x04,即把外部中斷1設定為高階優先順序,外部中斷0為低階優先順序,使外部中斷1巢狀在外部中斷0中。 要求:中斷觸發方式為下降沿觸發,按鍵有消抖功能 模擬 程式碼 #include <

代做COMP20003留學生作業、C/C++程式設計作業代寫、代做Algorithms作業、代寫C/C++程式作業

代做COMP20003留學生作業、C/C++程式設計作業代寫、代做Algorithms作業、代寫C/C++程式作業COMP20003 Algorithms and Data StructuresSecond (Spring) Semester 2018[Assignment 2]Solving Puzzle

代寫HCI Project作業、代做C/C++課程設計作業、linux程式作業代寫代做、C/C++程式設計作業代做

  代寫HCI Project作業、代做C/C++課程設計作業、linux程式作業代寫代做、C/C++程式設計作業代做HCI Project DescriptionWe will be designing a notepad application for linux, as we found t

C++應用程式設定生成dump並使用VS進行除錯

首先,包含標頭檔案 #include "Windows.h" #include "DbgHelp.h" 其次,在程式碼中新增這兩個函式 int GenerateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExceptionPointers, P

C#程式設計基礎第五課:c#swtich結構語句的使用

知識點:swtich結構。 1、switch選擇結構 switch結構是除if結構外的另一種分支語句,主要用於單個值的判斷。 多分支語句,通過判斷整型表示式的值,來決定執行語句,通常與case配合使用 switch ——開關,case ——情況,開關決定發生的情