在Ti的DSP程序中使用C++编程
来源:互联网 发布:软件开发工程师怎么样 编辑:程序博客网 时间:2024/06/06 12:23
在嵌入式开发中,年长的开发人员都比较习惯使用C语言;而年轻人在学习时,接受的培训很多也是使用C语言教授的。其实,使用C++做嵌入式开发也是很不错的选择,也许是将来嵌入式编程的一种趋势。
下面就将在嵌入式开发中使用C++的一些方式罗列一下,主要是在Ti公司的CCS5以上的开发环境中。
欢迎交流:turner_gao@163.com
- 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中的定义即可
- 在Ti的DSP程序中使用C++编程
- 在TI DSP开发板中烧写Flash程序
- 在TI DSP开发板中烧写Flash程序
- TI DSP中各种数据类型的定义
- 怎样在TI stellaris lm3sxxx 程序中使用C语言printf()函数进行串口输出
- 【处理器体系架构系列】基于TI C6000系列DSP的C/C++程序优化技术
- 关于TI DSP 的软件编程的一些库介绍
- 关于TI DSP 的软件编程的一些库介绍
- TI-Davinci开发系列之二使用CCS5.2TI Simulator模拟器调试DSP程序
- TI DSP hex2000.exe使用
- TI DSP处理器中CMD 文件的那些事儿
- TI DSP集成开发环境CCS的使用
- [TECH]TI C55x系列DSP的GPIO如何使用
- 使用C/C++语言编写基于DSP程序的注意事项
- TI DSP的仿真模拟
- [DSP(TI)]dm642的优化
- 关于TI DSP的EDMA
- TI 的DSP BIOS学习
- Android OkHttp文件上传与下载的进度监听扩展
- PB中实现菜单的动态生成(函数递归实现)
- 同步、异步读取股票行情(源代码)
- PB如何实现动态建立菜单
- JS 隔行换色,checkbox选中换色,checkbox全选
- 在Ti的DSP程序中使用C++编程
- 驱动程序开发的步骤
- 使用jQuery修改伪属性的样式,dorado中自定义弹出框的图标
- Android蓝牙开发介绍
- Windows驱动开发之准备篇
- 【算法分析】排序算法:希尔、归并、快速、堆排序
- ThreadPool&AsyncTask
- 【leetcode】【38】Count and Say
- android BaseAdapter 自定义适配器 BaseAdapter基类抽取 二