This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F2.8027万:TMS320F2.8027万处理速度

Guru**** 2561740 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/635216/ccs-tms320f28027-tms320f28027-processing-speed

部件号:TMS320F2.8027万

工具/软件:Code Composer Studio

大家好,

我目前正在与Piccolo TMS320F2.8027万一起工作,并尝试连接10轴IMU (GY-86)中断板,该板具有通过I2C总线连接的MPU6050+ HMC5883LC+MS5611传感器5611传感器。 我可以与传感器通话并获得传感器:) 我还可以运行加速计和陀螺仪的数据融合来计算滚动和俯仰角度。 我还可以在磁力计上运行倾斜补偿算法来计算航向...

所有这些都在CPU计时器内,每2毫秒进行一次。 我每隔2毫秒调用一次计时器,它使用I2C在400 kHz下获取传感器数据运行密集的数学运算,包括一连串的分段, 多路复用和一些三角运算...所以我对执行时间很好奇,所以我在操作开始时将GPIO设为高,并在结束时将其设为低。...使用示波器,我测量了脉冲宽度,让我惊讶的是,脉冲宽度仅为20-40 us。 这是真的吗?  

还是我犯了错误?

我还使用断点交叉检查并尝试使用CCS测量时钟周期,时钟显示显示在45万 时钟周期周围,所以我真的很困惑,哪一个是正确的...

所有操作都是使用基于IQ数学的定点库完成的,代码在闪存上运行...

有人可以给我一些建议吗? void A1执行数据处理和角度计算......

请在下面查找代码:

void A0 (void)
{//
A任务的循环速率同步
器if (CpuTimer2Regs.tcr.bit.tif ==1)
{
CpuTimer2Regs.tcr.bit.tif =1;//清除标志
//-------
(* A_Task_PTR)();//跳转至A任务(A1,A2,A3,...)
//------------------
}
}
空A1 (void)
//------------------
{
_IQ滚动,节距,cosroll,sinroll,cospitch,sinpitch, XH,YH;
中断计数++;
gPIO_setLow (myGPIO,gPIO_NUMBER_0); //代码开始
acel_x=I2CA_Read2Bytes (MPU6050_RA_ACCEL_XOUT_L,MPU6050_RA_ACCEL_XADD_H,MPU6050_ADD);//读取原始加速计x轴accel_y=I2CA_Read2CA_Read2CEU50_CA_X50_U50_URA_50

,URA_X50_URA_50,RA_X_RO_Read_50
,URA_50,URA_50,URA_50
,URA_X_U_50,URA_50,URA_X_U_50



//将原始数据y转换为g

az=_IQdiv(_IQ (((int)accel_z),_IQ (1.6384万));//将原始数据z转换为g

gx=_IQdiv((((int)gyro_x),_IQ (dvs)gy(gyx))z 65.5 ;//原始gyx转换65.5




成_igv=_igvi=_igvic=_qiqiq_yz( dvi) 65.5 ,ds_gyz/ gyz_gyz/ dvic=) 3.14 //转换为deg
pitch =_IQatan2 (ay,az);//_IQsin (_IQ (180/IQ) 3.14 ,_IQatan (1.0));//俯仰角度
=_IQadpy (_IQ (180/IQ),俯0.96



仰角=_IQad),0.005 0.96 0.005 57.2.9582万 57.2.9582万 角度=_IQad_Iq,3.14 0.04 0.04
//半径
cospitch中倾斜补偿的滚动角度正弦=_IQcos(_IQDIV(roll_angle,_IQ (57.2.9582万));//半径
sintitch中倾斜补偿的倾斜角度余弦=_IQsinPitch (_IQDIV (roll_angle,_IQ (57.2.9582万)));//纵倾角补偿的正弦值CA_DAT83_CA_Q_Q_21
,CA_CA_CA_CA_CA_Q58L_21

HMC5883L_address);
magx =_IQbumpy (_IQ ((int) mag_x),_IQ (0.73));
magy =_IQbumpy (_IQ ((int) mag_y),_IQ (0.73));
magz =_IQIq (_IQ (((int) mag_z),_IQ (0.73));
方向= magy,magany

xh =_IQbumpy(magx,cospility)+_IQbumpy(magz,sintpitle);

yh =_IQbumpy(magy,cosRoll)+_IQbumpy (magy,gpio)-_IQbumpy(_igiqi(mag,sinici),cospit_pit);

if (head_tiltilt_gip)
;
gpit_gip_gip_gip_head; gip_gip_gip_head; gip_gip_gip_gip_gip_gip_gip_gip) 6.28







;gip_head; gip_gip_head_gip_gip_gip_gip_gip_gip_gip_gip_gip_gip 6.2918 6.2918 57.2.9582万




  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好,很抱歉在这个主题上发布了一些问题……因为某些原因,页面一直在加载!!!!  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    设置和清除GPIO引脚是在代码运行时测量执行时间的可靠方法。 计时将受内存(闪存与RAM)以及其他ISR是否正在运行的影响。 看看代码,我会想到IQmath函数的1000 周期。 我不知道您对I2C读取函数周期的期望是什么,但如果它们是小函数,20-40US数字似乎是正确的。

    如果在A1函数的开头和结尾设置断点,运行到第一个并将时钟归零,然后运行到第二个时钟,则应看到类似这样的数字。 同样,如果有其他函数抢占了这个函数,您将得到一个不同的数字。 我无法解释您看到的45万 周期。

    根据可用内存的不同,您可以尝试将A1代码移动到RAM中,然后再次测量循环计数。 它应该会下降。 无论如何,GPIO方法是有效的,看起来很现实。

    此致,

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Richard:

    感谢您的回复。 我能够使用切换GPIO和示波器测量功能的执行情况,它需要1.3 ms! 我们不是20个人。 这是我的错误,我在开始时将GPIO设置为高,在执行后设置为低,我与连接到GPIO0的LED0的闪烁感到困惑。
    完成数学运算大约需要500美元。 我在使用I2C获取数据时遇到一些问题。

    我尝试使用从RAM执行A1

    #pragma code_section (a1,"ramfunc");

    但这会导致CCS生成警告

    说明 资源 路径 位置 类型
    创建输出部分"ramfunc"而不使用部分规范 example_F2802xLaunchPadDemo C/C++问题

    执行时,DSP进入非法ISR。 能告诉我怎么做吗???

    另外,CCS不允许我在代码中输入断点,我收到以下错误:
    "没有支持此工作的AET资源"

    我一次只能添加一个断点。 所以我所做的是
    1.上传代码
    2.转到行"gPIO_setLow(myGpio, gPIO_NUMBER_0);"(//代码开头)插入断点
    3. CCS->Run->Clock->Enable (运行->时钟->启用)
    4.当代码达到2...时,我将时钟重置为0
    5.我现在已从2中删除中断点,并在代码结尾的gPIO_GPIO _setHigh (myGPIO, gPIO_NUMBER_0)处再次将其重新插入;//
    6.时钟上显示的值为45万

    我不知道这是正确的还是其他的事情发生了…
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您首先遇到的问题听起来似乎是您没有告诉链接器将"ramfunc"部分放置在何处。  您已使用pragma创建了该名称,因此链接程序需要知道它的位置。  请查看链接程序命令文件的节部分,以确保它在其中。

    您的第二个问题听起来像是您正在尝试在闪存中设置中断点。  您可以设置的RAM断点数量没有实际限制,但如果代码处于闪存状态,则只能设置两个(其中一个可以由CCS保留)。  如果您期望代码执行或RAM,请检查是否已正确复制(从上面的链接器错误中我怀疑没有这样做)。 您可以通过打开反汇编窗口并在 到达中断点时检查程序内存地址来判断。  

    它不解释配置文件时钟的结果,但请记住,如果从闪存运行,执行速度将会变慢。  假设您已正确初始化闪存,您可能只会看到大约30 MIPS。  我认为这个数字肯定还有其他的解释,但我看不出它是从描述中得到的。

    此致,

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Richard:


    非常感谢您的快速回复。 请在下面找到链接程序文件的部分。 “Ramfunc”在链接程序文件中的节下定义。

    内存

    第0页:/*程序存储器*/
    /*内存(RAM/FLASE/OTP)块可移至Page1以进行数据分配*/
    BOOT_RSVD:Origin = 0x0万,length = 0x0.005万 /* M0的一部分,boot ROM将使用此堆栈*/
    程序:原点= 0x0.8万,长度= 0x0.08万
    //PRAML0:原点= 0x0.8万,长度= 0x0.08万 /*片上RAM块L0 */
    FLASHD : Origin = 0x3F0000,length = 0x0.2万 /*片上闪存*/
    FLASHC:原点= 0x3F2000,长度= 0x0.2万 /*片上闪存*/

    FLASHA:原点= 0x3F6000,长度= 0x001F80 /*片上闪存*/

    OTP:原点= 0x3D7800,长度= 0x0.04万 /*片上OTP */
    //FLASHD:原点= 0x3F0000,长度= 0x0.2万 /*片上闪存*/
    // FLASHC:原点= 0x3F2000,长度= 0x0.2万 /*片上闪存*/
    // FLASHA:原点= 0x3F6000,长度= 0x001F80 /*片上闪存*/
    CSM_RSVD:原点= 0x3F7F80,长度= 0x0.0076万 /* FLASHA的一部分。 在使用CSM时使用所有0x0000编程。 */
    BEGIN:Origin = 0x3F7FF6,length = 0x0.0002万 /*部分FLASHA。 用于“引导至闪存”引导加载程序模式。 */
    CSM_PWL:原点= 0x3F7FF8,长度= 0x0.0008万 /* FLASHA的一部分。 FLASHA */中的CSM密码位置

    //CSM_RSVD:原点= 0x3F7F80,长度= 0x0.0076万 /* FLASHA的一部分。 在使用CSM时使用所有0x0000编程。 */
    //开始:原点= 0x3F7FF6,长度= 0x0.0002万 /* FLASHA的一部分。 用于“引导至闪存”引导加载程序模式。 */
    // CSM_PWL_P0:原点= 0x3F7FF8,长度= 0x0.0008万 /* FLASHA的一部分。 FLASHA */中的CSM密码位置


    IQTABLES:ORIGIN = 0x3FE000,LENGTH = 0x000B50 /*引导ROM中的IQ数学表*/
    IQTABLES2:原始= 0x3FEB50,长度= 0x0.0008万C /*引导ROM中的IQ数学表*/
    IQTABLES3:原始= 0x3FEBDC,长度= 0x0000AA /*引导ROM中的IQ数学表*/

    ROM:Origin = 0x3FF27C,length = 0x000D44 /* Boot ROM */
    Reset : origin = 0x3FFFC0,length = 0x0.0002万 /* part of boot ROM */
    矢量:原始= 0x3FFFC2,长度= 0x0.0003万E /*启动ROM的一部分*/

    第1页:/*数据存储器*/
    /*内存(RAM/FLASE/OTP)块可以移动到PAGE0以进行程序分配*/
    /*寄存器保留在Page1上*/

    // boot_rsvd:origin = 0x0万,length = 0x0.005万 /* M0的一部分,boot ROM将使用此堆栈*/
    RAMM0:原始= 0x0.005万,长度= 0x0003B0 /*片上RAM块M0 */
    RAMM1:原点= 0x0.04万,长度= 0x0.04万 /*片上RAM块M1 */
    DataRAM:Origin = 0x0.88万,length = 0x0.08万 /*片上RAM块L0 */
    FLASHB:原点= 0x3F4000,长度= 0x0.2万 /*片上闪存*/

    }


    /*将部分分配给内存块。
    注意:
    DSP28_CodeStartBranch.asm中的codegstart用户定义部分用于重定向代码
    引导至闪存时执行
    RAMfuncs用户定义的部分,用于存储将从闪存复制到RAM的函数
    */

    章节


    /*分配方案领域:*/
    .cinit :> FLASHA | FLASHC | FLASHD,第= 0页
    .Pinit:> FLASHA | FLASHC | FLASHD,第= 0页
    text :>> FLASHA | FLASHC | FLASHD,第= 0页
    codegstart:> BEGIN PAGE =0
    ramfuncs:load = FLASHA,
    运行=程序,
    load_start(_RamfuncsLoadStart),
    load_size (_RamfuncsLoadSize),
    run_start(_RamfuncsRunStart),
    页面= 0

    csmpewds :> CSM_PWL页=0
    csm_rsvd:> CSM_RSVD页面= 0

    /*分配未初始化的数据段:*/
    stack:> RAMM0 page = 1
    .ebss:> DataRAM页面=1
    esysmem:> DataRAM页面= 1.
    //.sysmem:> DataRAM页面=1
    //.CIO:>> RAMM0 | RAMM1 | DataRAM page = 1.

    /*初始化部分进入Flash */
    /*要让SDFlash对这些进行编程,必须将它们分配到第0页*/
    econst :> FLASHA页面=0
    .switch:> FLASHA PAGE =0

    /*分配IQ数学领域:*/
    IQMath :> FLASHA页面=0/*数学代码*/
    IQmathTables:> IQTABLES,page =0,type = NoLoad

    /*如果调用IQNexp()或IQexp(),则取消注释以下部分
    从IQMath.lib库中执行函数,以便利用
    引导ROM中的相关IQ Math表(这可节省空间和引导ROM
    为1等待状态)。 如果此部分未取消注释,请使用IQmathTables2.
    将加载到其他存储器(SARAM,闪存等)中并将占用
    打开空间,但0等待状态是可能的。
    */
    /*
    IQmathTables2:> IQTABLES2,page =0,type = NoLoad


    IQMath.lib<IQNexpTable.obj>(IQmathTablesRam)

    }
    */
    /*如果调用IQNasin()或IQasin(),请取消对以下部分的注释
    从IQMath.lib库中执行函数,以便利用
    引导ROM中的相关IQ Math表(这可节省空间和引导ROM
    为1等待状态)。 如果此部分未取消注释,请使用IQmathTables2.
    将加载到其他存储器(SARAM,闪存等)中并将占用
    打开空间,但0等待状态是可能的。
    */
    /*
    IQmathTables3:> IQTABLES3,page =0,type = NoLoad


    IQMath.lib<IQNasinTable.obj>(IQmathTablesRam)

    }
    */

    /*.reset是编译器使用的标准部分。 它包含*/
    /* C代码的_c_int00起始地址。 /*
    /*当使用引导ROM时,此部分和CPU矢量*/
    不需要/*表。 因此,默认类型在此处设置为*/
    /* DSECT */
    .reset:> reset,page =0,type = dsect
    引导程序:>引导程序页=0,类型= DSECT

    }

    /*
    //===========================================================================================================================================
    //文件结束。
    //===========================================================================================================================================
    *

    如果我错了,请纠正我! 提前感谢。
    Srinivasan

    e2e.ti.com/.../f2.8027万.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Srinivasan,

    code_section pragma使用字符串"ramfunc",该字符串在链接器命令文件中的任何位置都不显示。  字符串必须匹配。

    此致,

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    感谢您的回复。 很抱歉,我的背景是更多的硬件,我仍在学习如何使用TI CCS。 哦,这太尴尬了……!!!! 我很抱歉我是复制粘贴,我把它叫做“ramfunc”而不是“ramfuns”:(
    很抱歉给您带来的不便
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没问题,Srinivasan。 希望一切顺利。

    此致,

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,它现在就能解决了:)我可以看到性能的提高,我可以使用CCS测量时钟周期,我可以看到,与以前大约500 us的情况相比,19.400 时钟周期需要处理数学部分(~ 300 us)。
    真的很棒!!!
    再次感谢Richard!!!

    谢谢,

    Srini