DSP_TMS320F28377D_算法加速方法1_拷贝程序到RAM运行

这篇具有很好参考价值的文章主要介绍了DSP_TMS320F28377D_算法加速方法1_拷贝程序到RAM运行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

TI C2000系列的DSP芯片算力有限,用于来控制有时候常会出现控制程序无法实现实时运行的情况,因此从本文开始,将陆续推出几篇DSP算法加速的方法

此方法只需要添加一行代码一个预定义,即可达到算法整体加速的目的。先声明本文是讲的是TMS320F28377D,其他C2000系列芯片操作类似。

1 一行代码

#pragma CODE_SECTION(testfunction,".TI.ramfunc");

或者

#pragma CODE_SECTION(testfunction,"ramfunc");

这行代码,我认为标准做法是放于 "声明testfunction的.h文件"中。这个testfunction就是你需要加速的算法函数。

那上述有两行代码,我到底应该选择哪一行呢? 它们的区别是".TI.ramfunc"和"ramfunc",用哪个其实主要取决于你的编译器版本。 我用的是CCS 7.4.0,这两行代码我都测试过,用"ramfunc"会进入错误异常中断。而用".TI.ramfunc"则功能可正常实现。

DSP_TMS320F28377D_算法加速方法1_拷贝程序到RAM运行,DSP,dsp,算法加速

2 一个预定义

 另外需要注意的一点是项目文件需要预定义 _FLASH。 在InitSysCtrl函数中,只有你预定义了_FLASH,才会执行下面这行代码。而这行代码的执行对于我们需要的功能是至关重要的。

memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
void InitSysCtrl(void)
{
    //
    // Disable the watchdog
    //
    DisableDog();


    //
    // Copy time critical code and Flash setup code to RAM. This includes the
    // following functions: InitFlash()
    //
    // The  RamfuncsLoadStart, RamfuncsLoadSize, and RamfuncsRunStart
    // symbols are created by the linker. Refer to the device .cmd file.
    //
#ifdef _FLASH
    memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);

    //
    // Call Flash Initialization to setup flash waitstates. This function must
    // reside in RAM.
    //
    InitFlash();
#endif

具体操作如下:

DSP_TMS320F28377D_算法加速方法1_拷贝程序到RAM运行,DSP,dsp,算法加速

3 测试方法

测试方法很简单,就是对比优化前和优化后测试的功能模块的运行时间。如何获取代码块的运行时间我这里就不赘述了,我以前写过一个相关博客:DSP_TMS320F28377D_使用定时器实现<获取代码块运算时间>的功能_江湖上都叫我秋博的博客-CSDN博客。

4 普通程序测试 

我28377D的程序框架还是延用

DSP_基于TMS320F28377D双核芯片和CCS7.40的编程入门_ccs双核芯片下载_江湖上都叫我秋博的博客-CSDN博客

这篇博客的风格,下面我贴出和测试相关的部分。

main.c

#include <main.h>

void main(void)
{
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    InitGpio();
    IER     = 0x0000;
    IFR     = 0x0000;
    InitPieVectTable();
    InitCpuTimers();

    runtime_init();
    while(1){
        runtime_start();
        testfunction();
        runtime_stop();
    }

}

void testfunction(void){
    int i = 0;
    int sum = 0;
    for(i = 0; i < 1000; i++){
        sum = sum+i;
    }
}

main.h

#include <F28x_Project.h>
#include <runtime.h>

#pragma CODE_SECTION(testfunction,".TI.ramfunc");

void testfunction(void);

测试结果

加速前 85us,加速后70us,约加速20%。

5 中断程序测试

除了上述测试以外,我还说测试了中断处理函数。我把testfunction放在中断里面执行。

main.c
#include <main.h>

void main(void)
{
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    InitGpio();
    IER     = 0x0000;
    IFR     = 0x0000;
    InitPieVectTable();
    InitCpuTimers();

    /* 定时器中断配置 */
    ConfigCpuTimer(&CpuTimer0, 200, 1000000/5000);
    CpuTimer0Regs.TCR.bit.TIE   = 1;                //  1: The CPU-Timer interrupt is enabled

    // TIMER0 INT1.7 [Page102: Table 3-2.PIE Channel Mapping]
    EALLOW;
    PieVectTable.TIMER0_INT = &CpuTimer0ISR;        //  Specify the interrupt service routine
    EDIS;
    IER |= M_INT1;                                  //  Enable CPU Level interrupt
    PieCtrlRegs.PIEIER1.bit.INTx7   = 1;            //  Enable PIE Level interrupt

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;              // Enable the PIE block
    EINT;                                           //  Turn on the switch of system global interrupt
    ERTM;
    CpuTimer0Regs.TCR.bit.TSS = 0;                  //  Start CPU Timer 0



    runtime_init();
    while(1){
    }

}

interrupt void CpuTimer0ISR(void){
    runtime_start();
    testfunction();
    runtime_stop();
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

void testfunction(void){
    int i = 0;
    int sum = 0;
    for(i = 0; i < 1000; i++){
        sum = sum+i;
    }
}

main.h

#include <F28x_Project.h>
#include <runtime.h>

interrupt void CpuTimer0ISR(void);
#pragma CODE_SECTION(testfunction,".TI.ramfunc");

void testfunction(void);

测试结果

加速前 90us,加速后70us。  同样的代码,放在中断里面运行还慢了点,这个有点匪夷所思,不过加速后的运算速度是一样的。

注意

这里需要提醒一下, 如果你在中断处理函数里面调用了其他的函数,比如CpuTimer0ISR调用testfunction

#pragma CODE_SECTION(CpuTimer0ISR,".TI.ramfunc");

这样写是无法加速的。

要想实现对中断程序整体的加速,你有三种选择

1 你还是加速testfunction

#pragma CODE_SECTION(testfunction,".TI.ramfunc");

2 你把testfunction函数实现的内容直接写到CpuTimer0ISR里面

#pragma CODE_SECTION(CpuTimer0ISR,".TI.ramfunc");

interrupt void CpuTimer0ISR(void){
    runtime_start();
    // testfunction();
    int i = 0;
    int sum = 0;
    for(i = 0; i < 1000; i++){
        sum = sum+i;
    }
    runtime_stop();
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

3 你把两个函数都搬到RAM里面运行,即

#pragma CODE_SECTION(CpuTimer0ISR,".TI.ramfunc");
#pragma CODE_SECTION(testfunction,".TI.ramfunc");

后续会再推出几篇DSP算法加速的方法与大家探讨。感谢您的阅读,如果您有什么优化方法,欢迎留言分享、收藏点赞文章来源地址https://www.toymoban.com/news/detail-683523.html

到了这里,关于DSP_TMS320F28377D_算法加速方法1_拷贝程序到RAM运行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DSP TMS320F2803x、TMS320F2806x COMP比较器模块开发笔记(代码基于TMS320F28069 详解)

    比较器模块是一个真正的模拟电压比较器在VDDA领域。核心模拟电路包括比较器,它的输入和输出,以及内部的DAC参考。支持的数字电路包括DAC控制、与其他片上逻辑的接口、输出确认块和可编程控制信号。 比较器块可以监视两个外部模拟输入,或者使用内部DAC引用监视另一

    2024年02月13日
    浏览(29)
  • [DSP学习笔记]基于TMS320F28335的FIR滤波实现

    首先进入TI官网,搜索C2000 wave,进行下载安装。 安装完成后,在2000 wave的安装目录下,进入以下目录:C2000Ware_4_02_00_00librariesdspFPUc28 以我本地的安装目录为例:E:tic2000C2000Ware_4_02_00_00librariesdspFPUc28 复制include、source文件夹到新建工程中。再根据选用的DSP型号对文件夹内

    2024年02月10日
    浏览(66)
  • TMS320F28374S之X-BAR

    X-BAR可翻译为 交叉开关 或者 交换总线 ,在DSP中有四种 X-BAR,分别是: Input X-BAR、 Output X-BAR、 CLB X-BAR 和 ePWM X-BAR。Input X-BAR可以将外部信号传输到CPU内部,Output X-BAR则可以将内部信号传输到外部GPIO端口。CLB X-BAR 和ePWM X-BAR将内部信号传输到CLB和 ePWM模块。 Input X-BAR用于将信号从

    2024年02月13日
    浏览(25)
  • 【轮式平衡机器人】——TMS320F28069片内外设之ePWM

    声明:本系列博客参考有关专业书籍,截图均为自己实操,仅供交流学习! 脉冲宽度调制(PWM)是一种对模拟信号进行数字编码的方法,硬件原理是根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现 开关 稳压电源输出晶体管 或 晶体管导通时间的 改变。 一个重要

    2024年03月11日
    浏览(36)
  • 11.TMS320C5509V+Win10+CCS8开发环境搭建

    众所周知,相较于TMS320F28335,TMS320C5509V属于较老的平台,在新版本的CCS版本上支持一直是一个问题。 最基本的问题便是,无法新建基础工程。各开发版厂商提供的例程无法在CCS8上使用,只支持CCS3.3环境,但是由于目前Win7、Win10等系统均不再支持CCS3.3,所以只能折腾虚拟机来

    2024年02月07日
    浏览(33)
  • 【TES600】基于XC7K325T与TMS320C6678的通用信号处理平台

    板卡概述         TES600是一款基于FPGA+DSP协同处理架构的通用高性能实时信号处理平台,该平台采用1片TI的KeyStone系列多核浮点/定点DSP TMS320C6678作为主处理单元,采用1片Xilinx的Kintex-7系列FPGA XC7K325T作为协处理单元,具有1个FMC子卡接口,具有4路SFP+万兆光纤接口,具有2路

    2024年02月06日
    浏览(28)
  • 基带信号处理设计原理图:2-基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理板

    基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理板          综合图像处理硬件平台包括图像信号处理板2块,视频处理板1块,主控板1块,电源板1块,VPX背板1块。 一、板卡概述          图像信号处理板包括2片TI 多核DSP处理器-TMS320C6678,1片Xilinx FPGA XC7K420T-

    2024年03月15日
    浏览(44)
  • 图像信号处理板设计原理图:2-基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理板

             综合图像处理硬件平台包括图像信号处理板2块,视频处理板1块,主控板1块,电源板1块,VPX背板1块。 一、板卡概述          图像信号处理板包括2片TI 多核DSP处理器-TMS320C6678,1片Xilinx FPGA XC7K420T-1FFG1156,1片Xilinx FPGA XC3S200AN。实现四路千兆以太网输出,两路

    2024年02月04日
    浏览(38)
  • C++程序加速方法

    需要重复使用的数据,比如加载的图片,CSV文件等数据,存放在全局变量里面,每次加载DLL时,只加载一次,直到卸载DLL,这些数据一直保持在内存中,避免重复加载。 全局变量的使用参考文献: https://blog.csdn.net/guoqianqian5812/article/details/52397930 如果程序中有可以同时进行的

    2024年02月07日
    浏览(20)
  • 图像处理ASIC设计方法 笔记18 轮廓跟踪算法的硬件加速方案

    P129 轮廓跟踪算法的硬件加速方案 如果图像中某区域存在相邻像素之间仅有对角连接的部位,则对包围该区域的像素进行跟踪时,在对角连接部位,轮廓跟踪方向可能发生转移,跨越目标区域,最终生成断裂链表或者伪孤立点链表。伪孤立点是指与相邻像素仅存在对角连通的

    2024年04月28日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包