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

news2024/11/19 10:41:41

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"则功能可正常实现。

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

具体操作如下:

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算法加速的方法与大家探讨。感谢您的阅读,如果您有什么优化方法,欢迎留言分享、收藏点赞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/946162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jeecgboot的online在线开发高级版【伸手党福利】

本文章在于充分发挥jeecgboot的在线开发功能&#xff0c;将平时开发80%以上的工作量全部收束 目录 树形结构使用固定值替换id从其他表中引用字段输入和搜索&#xff08;下拉搜索&#xff09;输入用户、单位等框架内固有值主附表 树形结构 是否树》是 自动生成pid&#xff0c;…

oracle19c-图形安装(centos7)

目录 一.环境准备1.关闭防火墙2.关闭SELINUX3.配置本地yum源4.安装ORACLE先决条件的软件包5.修改LINUX的内核文件6.添加下列参数到/etc/security/limits.conf7.添加下列条目到/etc/pam.d/login8.环境变量中添加下列语句9.创建文件目录和相应的用户10.配置oracle用户的环境变量1…

paddle 1-高级

目录 为什么要精通深度学习的高级内容 高级内容包含哪些武器 1. 模型资源 2. 设计思想与二次研发 3. 工业部署 4. 飞桨全流程研发工具 5. 行业应用与项目案例 飞桨开源组件使用场景概览 框架和全流程工具 1. 模型训练组件 2. 模型部署组件 3. 其他全研发流程的辅助…

别考,快跑!

写在前面 我一般不直接推荐院校&#xff0c;但是根据这所院校的23情况来看&#xff0c;复试一票否决率太高了&#xff0c;我看的怀疑人生&#xff0c;所以纠结很久&#xff0c;还是说出我自己的想法&#xff1a;我不推荐我的粉丝考这所学校&#xff0c;我更希望大家考研上岸是…

PMP教材改版难不难?考生应如何应对?

有很多同学都在担心PMP教材改版后&#xff0c;考试会不会增加难度&#xff0c;今天胖圆给大家详细讲解一下&#xff0c;在PMP改革背景下&#xff0c;考生应该怎样应对&#xff1f; 新教材的改动意味着8月以后的考试都将 《PMBOK指南》第七版的内容纳入考试范围&#xff0c;其中…

【USRP】调制解调系列7:GMSK、MSK、基于labview的实现

MSK 在数字调制中&#xff0c;最小频移键控&#xff08;Minimum-Shift Keying&#xff0c;缩写&#xff1a;MSK&#xff09;是一种连续相位的频移键控方式&#xff0c;在1950年代末和1960年代产生。与偏移四相相移键控&#xff08;OQPSK&#xff09;类似&#xff0c;MSK同样将…

JavaScript关于函数的小挑战

题目 回到两个体操队&#xff0c;即海豚队和考拉队! 有一个新的体操项目&#xff0c;它的工作方式不同。 每队比赛3次&#xff0c;然后计算3次得分的平均值&#xff08;所以每队有一个平均分&#xff09;。 只有当一个团队的平均分至少是另一个团队的两倍时才会获胜。否则&…

openGauss学习笔记-54 openGauss 高级特性-MOT

文章目录 openGauss学习笔记-54 openGauss 高级特性-MOT54.1 MOT特性及价值54.2 MOT关键技术54.3 MOT应用场景54.4 不支持的数据类型54.5 使用MOT54.6 将磁盘表转换为MOT openGauss学习笔记-54 openGauss 高级特性-MOT openGauss引入了MOT&#xff08;Memory-Optimized Table&…

Glide分析和总结

1. Glide概述 Glide是一款图片处理的框架&#xff0c;从框架设计的角度出发&#xff0c;最基本要实现的就是 加载图片 和 展示。 它把一个图片请求封装成一个Request对象&#xff0c;里面有开启、暂停、关闭、清除网络请求、以及载体生命周期的监听等操作。然后通过RequestBu…

导入表解析与IATHook

IAT&#xff1a;导入地址表// PE文件解析.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <Windows.h>//函数向前声明 DWORD RvaToFoa(DWORD dwRva, const char* szBuff…

【人工智能】—_贝叶斯网络、概率图模型、全局语义、因果链、朴素贝叶斯模型、枚举推理、变量消元

文章目录 频率学派 vs. 贝叶斯学派贝叶斯学派Probability&#xff08;概率&#xff09;:独立性/条件独立性&#xff1a;Probability Theory&#xff08;概率论&#xff09;:Graphical models &#xff08;概率图模型&#xff09;什么是图模型&#xff08;Graphical Models&…

【Vue3】transition-group 过渡列表

1. 基本使用 transition-group 和 transition 的用法基本上是一样的。 <template><div class"content"><button click"add">add</button><button click"pop">pop</button><div class"wrap"&…

Michael.W基于Foundry精读Openzeppelin第33期——EIP712.sol

Michael.W基于Foundry精读Openzeppelin第33期——EIP712.sol 0. 版本0.1 EIP712.sol 1. 目标合约2. 代码精读2.1 constructor(string memory name, string memory version)2.2 _domainSeparatorV4()2.3 _hashTypedDataV4(bytes32 structHash) 0. 版本 [openzeppelin]&#xff…

OpenVINO2023使用简介

1 下载安装 先在anaconda中创建一个虚拟环境&#xff0c;该环境的python版本为3.7&#xff0c;之所以使用python3.7&#xff0c;是因为我在3.9上安装过程中出现不少bug&#xff0c;后面新建了一个3.7的环境才解决&#xff0c;我不知道是否由于和我已有环境中某些包不兼容&…

222. 完全二叉树的节点个数 Python

文章目录 一、题目描述示例 1![在这里插入图片描述](https://img-blog.csdnimg.cn/8c74d1b796b74286999e09d4c6b7682f.png#pic_center)示例 2示例 3 二、代码三、解题思路 一、题目描述 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定…

【无监督学习】压缩即预测——Kolmogorov 复杂度作为终极压缩器

基于学习方法&#xff0c;机器学习大致可分为监督学习和无监督学习两种。在无监督学习中&#xff0c;我们需要用某种算法去训练无标签数据集&#xff0c;从而帮助模型找到这组数据的潜在结构。 为了进行无监督学习&#xff0c;在OpenAI成立早期&#xff0c;他们认为通过压缩可…

go gin 自定义验证

我们上一篇已经提到了gin中binding时候可以指定json字段大小等限制&#xff0c;但是那个错误却是英文的&#xff0c;现在想搞成中文的&#xff0c;以便前端可读&#xff0c;demo如下 package mainimport ("net/http""reflect""github.com/gin-gonic/…

知更鸟语音训练

现在哪还有人读小说、看视频&#xff0c;谁还用真人朗读呢&#xff1f; 现在给大家介绍&#xff0c;假人朗读是怎么来的&#xff0c;提供一些音频&#xff0c;进行训练&#xff0c;然后就能合成属于自己的音频了。这里只讲训练部分&#xff0c;使用请自己看github知更鸟&#…

javaee spring 静态代理

静态代理 package com.test.staticProxy;public interface IUsersService {public void insert(); }package com.test.staticProxy;//目标类 public class UsersService implements IUsersService {Overridepublic void insert() {System.out.println("添加用户");…

【C++作业】定义一个基类Animal,其中有一个虚函数Perform,用于在子类中实现不同的表演行为

1 动物园的讲解员和动物表演 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c…