近期C6000 DSP开发小结

article/2025/10/1 20:12:33

使用C++开发DSP

  如果你也跟我一样刚开始接触C6000系列的DSP,我觉得可以尝试一下用C++来开发,虽然说这么做代码的执行效率可能会比C或者纯汇编的开发来得低,但它胜在能够让整个工程的脉络更加清晰。

在这里插入图片描述

  面向C6000开发的cl6x编译器对C++有比较好的支持。上面三个文档就在编译器的安装路径下,一个是介绍COFF移植到EABI的注意点,另外两个一个是关于编译器的文档,一个是关于汇编工具的文档。本文中的部分内容主要也是参考上面的文档。
  编译器支持的C标准是C89,支持的C++标准是C++98(而且有一些例外,本文中没有列出),支持的C++的主要特性有下面这些:

- Complete C++ standard library support
- Templates
- Exceptions, which are enabled with the --exceptions option
- Run-time type information (RTTI), which can be enabled with the --rtti compiler option

  它虽然并不是完全支持C++98,但上面这些特性基本上完全够用了,模板、异常处理。特别是模板类的定义和类的继承让一些算法的实现方便很多。
  实现了C++的灵活性的同时,肯定损失了不少性能,因此还可以使能“Embedded C++”的选项,它限制了部分开销较大的C++的功能,从一定程度上能够提高代码的执行效率,受到限制的功能主要有下面这些:

- Templates
- Exception handling
- Run-time type information
- The new cast syntax
- The keyword mutable
- Multiple inheritance
- Virtual inheritance

  可以注意到,这里模板、虚继承、多重继承都被禁用了。所以如果决定使能“Embedded C++”时,就要注意写代码的时候不能用到上面这些特性。使能Embedded C++势必能够提高代码的执行效率,是否需要使能可以根据实际情况决定。
  我先写了一段最简单的代码试了一下,然后发现没有输出。(一度以为它对C++的支持有毛病)

#include <iostream>int main()
{std::cout << "Hello World!" << std::endl;return 0;
}

  后来发现是栈溢出的问题,DSP的开发,一直没有栈溢出的报错。有个Stack Usage的窗口我也用不了,可能是我的CCS版本太低的缘故。每次栈溢出了,程序就会跑飞。我一开始没有输出就是stack设置得太小了。
  cl6x对C/C++采用同样的编译命令,所以其实源代码中可以C和C++的代码混着写。C++的代码在调用C写的函数的时候,C写的函数的声明需要有exter "C"的说明,可以把C函数的声明包括在 “exter “C” {}” 的花括号中间。

#ifdef __cplusplus
extern "C" {
#endif
// function declarations
#ifdef __cplusplus
}
#endif

初始化列表中的数组初始化

  C++11中新引入了初始化列表,initializer-clause。这个在C++98里面是没有的,下面是两种规范中对“赋值运算表达式”的定义,C++11中做了这一更改。

C++11 中的定义

在这里插入图片描述

C++98 中的定义

在这里插入图片描述

  我当时是想在类的构造函数的初始化列表里直接初始化数组,后来发现不行,才在构造函数的函数体里逐个初始化数组的每个元素。后来我做了一个简单的实验。
  这是我在windows下的g++版本

在这里插入图片描述

  用C++98的标准来编译的,报错。

在这里插入图片描述

  用C++11的标准来编译的,就能正常通过。

在这里插入图片描述

COFF与EABI

  COFF和EABI主要就是设置编译生成的目标文件的格式。COFF是传统的格式,EABI是新的格式。我们能用新的就用新的呗。但以前的驱动文件是以COFF的标准写的,要从COFF移植到EABI是我们需要关心的问题。
  COFF和EABI的差异在上面的文档SPRAB09中有详细的介绍。我目前觉得最大的区别就是,在编译COFF格式的目标文件的时候,C/C++的源文件中的symbol前面会加上一个下划线。而EABI则不会有这个情况。
  如果整个工程中的源文件都是用C/C++写的,那就不会有什么问题,因为每个源文件都遵守相同的规则。但是如果有用汇编写的源文件,目标文件格式是COFF,那么“.asm”文件中的symbol前面都至少有一个下划线,那样才能和C/C++的源文件link;而如果目标文件格式是EABI,那这些symbol就和C/C++的源文件中保持一致就行。

在这里插入图片描述

  上面这个报错就是因为在汇编文件中的symbol定义都是在前面加了下划线的,所以在link的时候就出现了找不到symbol的问题。

在这里插入图片描述

  这一问题最简单的办法我觉得就是把上面这个“–strip_coff_underscore”的选项勾上。这样在编译的时候“.asm”文件中的symbol前面的下划线都会被去掉。当然还可以去改汇编的源代码,但那样就相对来说麻烦很多了。

数据地址模型

  文档里写的是“Data Adress Model”,我也不知道我的翻译合不合适。大概是说有一个数据页面指针(DP),里面存放一个基地址,在这一基地址附近的数据可以很快被访问到,因为偏移地址可以直接嵌在一条指令里面;而如果待访问的数据不在DP指针附近,那就需要多个周期才能访问到需要的数据。前者是near类型的变量,后者是far类型的变量。

在这里插入图片描述

  DSP有三种可选的设置。near和far分别表示变量默认为near类型的访问或者far类型的访问。而“far aggregates”则表示数组作为far类型访问,而其他的变量作为near类型访问。
  如果设置了很多全局变量,就有可能出现这样的错误。就是near类型的访问够不到这些变量了。

the xx-bit relocated address xxx is too large to encode in the 15-bit unsigned field

在这里插入图片描述

  最简单的解决办法就是把访问类型设置成far,这样会导致变量的访问变慢;或者设置部分变量为far。比如:

int far a;

EDMA3配置

  C6000系列的EDMA3可以实现非常灵活的数据传输功能。我用过C6455的EDMA和M6678的EDMA,它们的功能几乎完全一样,不同的可能只是通道数量、中断源的编号不同。下面的代码以C6455的CSL驱动函数为例做一个介绍。
  EDMA有很多通道,每个通道可能会和一个外部事件绑定(也可能没有),这是固定的。通道和PaRAM还有队列的关系可以用户自己设置。队列是有优先级的,队列号小的优先级高(会优先出队列)。每个队列都和一个传输控制器对应,多个传输控制器在数据总线上也有优先级,这也可以设置。EDMA功能的实现最关键的还是PaRAM的设置,它决定了每次传输要实现的功能。
  下面是某一个PaRAM的设置代码。

hParam = CSL_edma3GetParamHandle(ms_hEdma3, 0, &status);
paramSetup.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS, \CSL_EDMA3_TCCH_EN, \CSL_EDMA3_ITCINT_DIS, \CSL_EDMA3_TCINT_DIS,\CSL_EDMA3_CHA_3,\CSL_EDMA3_TCC_NORMAL,\CSL_EDMA3_FIFOWIDTH_32BIT, \CSL_EDMA3_STATIC_DIS, \CSL_EDMA3_SYNC_A, \CSL_EDMA3_ADDRMODE_INCR, \CSL_EDMA3_ADDRMODE_CONST);
paramSetup.srcAddr = IR_IMG_RD_ADDR;
paramSetup.aCntbCnt = CSL_EDMA3_CNT_MAKE(8, 1);
paramSetup.dstAddr = ms_pMatIr0->GetHeaderAddr();
paramSetup.srcDstBidx = CSL_EDMA3_BIDX_MAKE(0, 0);
paramSetup.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_MAKE(1<<5,0); 
paramSetup.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0, 0);
paramSetup.cCnt = 1;
CSL_edma3ParamSetup(hParam, &paramSetup);

一个事件产生,或者一次手动触发,通道控制器(CC)就会向传输控制器(TC)发送一个传输请求(TR)

  A模式和AB模式的区别主要在于,一个TR传输的数据量。A模式一个TR传输ACnt数据,AB模式一个TR传输ACnt×BCnt的数据。
  TC完成一次TR之后一般就会等待下一次触发,但如果设置了ITCCH,在这次TR完成之后还会触发另一个传输。TCCH表示在完成了整个PaRAM的传输之后会触发另一个传输。这个叫做“Chain”。
  中断也是类似的,ITCINT表示在这次TR完成之后会触发中断。TCINT表示在完成了整个PaRAM的传输之后会触发中断。
  在整个PaRAM传输完成之后,可以设置link字段,从别的PaRAM把参数复制过来,更新PaRAM。这个叫做“Link”。
  合理地设置Chain和Link就能利用EDMA实现复杂的数据传输功能。


http://chatgpt.dhexx.cn/article/u1Phd8Jc.shtml

相关文章

【DSP开发】CCS5.5测试代码运行时间

1、进入CCS环境&#xff0c;load已有工程.out文件&#xff0c;找到要查看的代码执行周期的地方。 2、选择CCS菜单中的Run——Clock——Enable 3、选择Run——Clock——Setup 4、在左下角观察时钟周期 5、 至此就可以解决在代码中引入<time.h>后输出为0的情况&#xff…

ADI DSP开发环境(CCES)下的程序烧录问题(以ADSP-SC589为例)

在CCES环境下将程序烧录到flash主要有两种方式。 1.通过命令窗口 首先在对项目编译产生文件的属性设置为Release。 在编译完成后&#xff0c;找到每个CORE单独生成的DXE文件&#xff1a; 文件通常位于项目目录下每个core的Release文件中。 安装SC589评估板的驱动&#xff…

DSP开发环境及工具之CCS

DSP开发环境及工具之CCS CCS( Code Composer Studio)是美国德州仪器(TI)公司的嵌入式处理器的开发环境,可以用于TI公司的各个系列处理器的软件开发和调试,如DSP,MCU,ARM等。 主要的操作都是在这个窗口之间做相应的切换。 创建工程文件 或者

【FPGA-DSP】第二期:DSP开发流程【全过程】

目录 1. System Generator安装 1.1 system generator的安装 1.1.1 vivado安装System Generator 1.1.2 System Generator配置 1.3 启动 2. FPGA-DSP开发流程 2.1 FPGA-DSP 开发流程介绍 2.2 FPGA-DSP 实际开发流程 1. 软件启动 2. matlab编写 3. Simulink仿真 Simu…

DSP开发笔记一

前言 ​ 本笔记首先对DSP的特点及其选型进行了描述&#xff0c;然后重点记录DSP开发环境的搭建及基础工程示例&#xff0c;对为DSP开发新手有一定的指导作用。 1. DSP简介 1.1 主要特点 在一个指令周期内可完成一次乘法和一次加法&#xff1b;程序和数据空间分开&#xff0…

UML状态图示例

状态图是用于表示对象状态的UML图。 在图书管理系统中&#xff0c;图书有不同的状态&#xff0c;我们可以用状态图表示如下&#xff1a;

数据库课程设计——宾馆管理系统UML状态图

客户账号状态图 前台登录状态图 客户预订状态图 会员卡状态图

【转】超详细的UML状态图符号,初学者也能轻松看懂状态图

UML状态图&#xff0c;用于显示状态机&#xff0c;即描述一个对象所处的可能状态以及状态之间的转移。用状态图建模可以帮助开发人员分析复杂对象的各种状态的转换&#xff0c;以及对象何时执行怎样的动作。那状态图又是怎样表示这些信息的呢&#xff1f;要想看明白其中的奥妙&…

菜鸟实战UML——状态图

状态图 状态图(Statechart Diagram)&#xff1a;是描述一个实体基于事件反应的动态行为&#xff0c;显示了该实体如何根据当前所处的状态对不同的事件做出反应。通常我们创建一个UML状态图是为了以下的研究目的&#xff1a;研究类、角色、子系统、或组件的复杂行为。 理解&am…

UML——活动图和状态图

目录 活动图 活动图的基本要素 状态图 状态图的基本要素 状态图与活动图之间的区别 活动图 概念&#xff1a;活动图本质上是一种流程图&#xff0c;它描述活动的序列&#xff0c;即系统从一个活动到另一个活动的控制流。 作用 描述一个操作的执行过程中所完成的工作或者…

UML状态图 2021.07.18

概述 UML状态图主要用于描述对象具有的各种状态、状态之间的转换过程以及触发状态转换的各种事件和条件。 UML 状态图的目的: UML 状态图可以捕获对象、子系统和系统的生命周期&#xff0c;可以告知一个对象可以拥有的状态&#xff0c;并且事件(如消息的接收&#xff0c;时间…

UML状态机图

状态机图&#xff08;State Machine Diagram&#xff09;也叫状态图、有限状态机图&#xff08;Finite Diagram&#xff09;&#xff0c;是一种描述所有状态及状态之间流转规则的图形。在软件设计领域&#xff0c;“状态”在业务系统中无处不在&#xff1a;订单要有状态&#x…

UML—状态图

【内容】 1.什么是状态图 状态图描述一个特定对象的所有可能状态以及由于各种事件的发生而引起的状态之间的转移。状态图侧重于从行为的结果来描述&#xff0c;只涉及一个特定的对象&#xff0c;常用于动态特性建模。 2.状态图的组成 &#xff08;1&#xff09;起点、终点 …

UML——状态图

7 状态图&#xff08;Stage Diagram&#xff09; 7.1 概述 状态图主要用于描述对象的状态变化以确定何种行为改变了对象状态&#xff0c;以及对象状态变化对系统的影响。 通常只用于描述单个对象的行为。 状态图在描述单个复杂对象的行为时非常有助于我们理解一个对象的行为…

UML活动图与状态图

笔记基于《UML和模式应用》教材 UML活动图 基本的UML表示法 基本的UML活动图表示法&#xff0c;包括动作、分区、分叉点、连接点和对象节点等。分区有助于观察多个参与者以及业务过程中涉及的并行动作&#xff0c;对象节点可以描述动作周围移动的事物。 其他UML活动图表示法…

UML状态图和活动图

转载于https://www.cnblogs.com/jingwhale/p/4230235.html UML状态图和活动图 UML状态图和活动图 统一建模语言UML&#xff08;Unified Modeling Language&#xff09;是非专利的第三代建模和规约语言。UML是一种开放的方法&#xff0c;用于说明、可视化、构建和编写一个正在…

UML图之『状态图』就是这么简单搞定

UML图之状态图 状态图的组成元素&#xff1a; 初始状态 初始状态是状态机的起始位置&#xff0c;它不须要事件的触发。由黑色实心圆点来表示 状态 状态是对象运行某项活动或等待某个事件的条件。 状态用圆角矩形表示 复合状态 复合状态是具有子状态&#xff08;或称为嵌…

UML 状态图 statechart diagram

1. 什么是状态图 状态图是一个类对象所可能经历的所有历程的模型图。状态图由对象的各个状态和连接这些状态的转换组成。说明对象在它的生命期中响应事件所经历的状态序列&#xff0c;以及它们对那些事件的响应。 2. 状态图的作用 1). 状态图描述了状态之间的转换顺序&#x…

UML状态图

状态图&#xff08;Statechart digram&#xff09;是系统分析的一种常用工具&#xff0c;系统分析员在对系统建模时&#xff0c;最先考虑的不是基于活动之间的控制流&#xff0c;而是基于状态之间的控制流&#xff0c;因为系统中对象的状态变化最易被发现和理解。 状态机…

使用EA绘制UML状态图

1.创建包&#xff0c;并命名 2.右击包&#xff0c;创建图 3.创建状态图并命名 3.拖入需要的元素&#xff0c;并命名 4.将Initial与State联系起来 点击Initial&#xff0c;旁边会出现一个向上的小箭头&#xff0c;点击小箭头&#xff0c;将其与State连在一起 5.选择Initial和S…