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.

[参考译文] TMS320F28069:tms320f28069上 CLA 上的 FFT

Guru**** 2194690 points
Other Parts Discussed in Thread: C2000WARE, TMS320F28069
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1334812/tms320f28069-fft-on-cla-on-tms320f28069

器件型号:TMS320F28069
主题中讨论的其他器件:C2000WARE

大家好、我有不使用 CLA 进行 FFT 计算的工作代码。 我想将 FFT 计算移动到 CLA、因为我使用以下链接器文件:

//##########################################################################出################################出
//
//文件:f2806x_cla_c_lnk.cmd
//
//标题:运行 CLA 数学库示例的链接器命令文件
//在 f2806x 平台上
//
//该文件包括当前位置的所有 RAM 和闪存块。
// f2806x 并取决于活动的编译配置
//(RAM 或闪存)相应的部分将被加载
//加载到 RAM 或闪存块中
//
//########################################################################出################################出
//
//
//$Copyright:版权所有(C) 2023 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//########################################################################出################################出

//
//在项目属性中将 CLA_C 定义为1
// Project Properties -> C2000 Linker -> Advanced Options -> Command File
//预处理->-定义
//
//--define=CLA_C=1
//
// CLA_MATH_TABLE_IN_ROM 根据在项目属性中定义
//已选择构建配置
// Project Properties -> C2000 Linker -> Advanced Options -> Command File
//预处理->-定义
//将该变量设置为1以使用 CLA 数据 ROM 中的 CLA 数学表
//如果设置为0,请确保有正确的 CLA 数学库(没有_datarom 的库)
//后缀)
//
//--define=CLA_MATH_TABES_IN_ROM=1
//


内存
{
第0页:

begin:origin = 0x3F7FF6,length = 0x000002 /* Part of FLASHA。 用于"引导至闪存"引导加载程序模式。 */
CLAPROGRAM:origin = 0x009000、length = 0x001000 /*片上 RAM 块 L3 */
RAMM0:origin = 0x000050,length = 0x0003B0 /*片上 RAM 块 M0 */
RAML5L8:origin = 0x00C000、length = 0x008000
OTP : origin = 0x3D7800 , length = 0x000400 /*片上 OTP */

FLASHH:origin = 0x3D8000、length = 0x004000 /*片上闪存*/
FLASHG:origin = 0x3DC000,length = 0x004000 /*片上闪存*/
FLASHF:origin = 0x3E0000,length = 0x004000 /*片上闪存*/
FLASHE:origin = 0x3E4000,length = 0x004000 /*片上闪存*/
FLASHD : origin = 0x3E8000, length = 0x004000 /*片上闪存*/
FLASHC : origin = 0x3EC000 , length = 0x004000 /*片上 Flash */
FLASHA:origin = 0x3F4000,length = 0x003F80 /*片上闪存*/

ROM:origin = 0x3FF3B0,length = 0x000C10 /* Boot ROM */
复位:origin = 0x3FFFC0、length = 0x000002 /* part of boot ROM */
vectors : origin = 0x3FFFc2, length = 0x00003E /* part of boot ROM */

CSM_RSVD:origin = 0x3F7F80,length = 0x000076 /*部分 FLASHA。 当 CSM 正在使用时、全为0x0000编程。 */
// begin:origin = 0x3F7FF6,length = 0x000002 /*部分 FLASHA。 用于"引导至闪存"引导加载程序模式。 */
CSM_PWL_P0:origin = 0x3F7FF8,length = 0x000008 /*部分 FLASHA。 FLASHA 中的 CSM 密码位置*/

第1页:

BOOT_RSVD:origin = 0x000000,length = 0x000050 /* M0的一部分,引导 ROM 将此用于堆栈*/
RAMM1:origin = 0x000400,length = 0x000400 /*片上 RAM 块 M1 */

CLA1_MSGRAMLOW:origin = 0x001480、length = 0x000080
CLA1_MSGRAMHIGH:origin = 0x001500、length = 0x000080

CLARAM0:origin = 0x008800、length = 0x000400 /*片上 RAM 块 L1 */
CLARAM1 : origin = 0x008C00 , length = 0x000400 /*片上 RAM 块 L2 */
CLARAM2 : origin = 0x008000 , length = 0x000800 /*片上 RAM 块 L0 */

RAML4:origin = 0x00A000,length = 0x002000 /*片上 RAM 块 L4 */
USB_RAM:origin = 0x040000、length = 0x000800 /* USB RAM */
FLASHB:origin = 0x3F0000,length = 0x004000 /*片上闪存*/

部分
{
codestart :> begin, page = 0
csmpasswds:>csm_PWL_p0、page = 0
csm_rsvd :> csm_rsvd , page = 0
#if 已定义(RAM)
.cinit:> RAMM0、page = 0
.pinit:> RAMM0、page = 0
.text:> RAML5L8、page = 0
ramfuncs:> RAML5L8,page = 0
econst:> RAML5L8、页= 0
.switch:> RAMM0、PAGE = 0

Cla1Prog:{_Cla1ProgRunStart =.;}> CLAPROGRAM、
PAGE = 0
#if! (CLA_FFT_TABLE_IN_ROM)
CLA1fftTables :> CLARAM2, page = 1
#endif // CLA_FFT_TABLE_IN_ROM


#Elif 已定义(_FLASH)
.cinit:> FLASHA、page = 0
.pinit :> FLASHA,页面= 0
.text:> FLASHA、page = 0
CLA1mathTables :> CLARAM1, page = 1

ramfuncs : load=FLASHD,
RUN = RAML5L8、
Load_start (_RamfuncsLoadStart)、
RUN_START (_RamfuncsRunStart)、
Load_Size (_RamfuncsLoadSize)、
PAGE = 0
econst:> FLASHA、PAGE = 0
.switch:> FLASHA、PAGE = 0

CLA1fftTables : Load = FLASHB,
RUN = CLARAM2、
RUN_START (_CLA1fftTablesRunStart)、
Load_start (_CLA1fftTablesLoadStart)、
Load_Size (_CLA1fftTablesLoadSize)、
页= 1

Cla1Prog:load = FLASHD,
运行= CLAPROGRAM、
Load_Start (_Cla1ProgLoadStart)、
Load_Size (_Cla1ProgLoadSize)、
RUN_START (_Cla1ProgRunStart)、
PAGE = 0
//
//将表加载到闪存并复制到 RAM
//
CLA1mathTables : load=FLASHB,
运行= CLARAM1、
Load_start (_CLA1mathTablesLoadStart)、
Load_Size (_CLA1mathTablesLoadSize)、
RUN_START (_CLA1mathTablesRunStart)、
页= 1
#else
#error 向 C2000链接器中添加"RAM"或"_FLASH"->高级选项->命令文件预处理->--定义
#endif

.stack:> RAML4、page = 1
.ebss:> RAML4、page = 1
.esysmem:> RAML4、page = 1

Cla1ToCpuMsgRAM:> CLA1_MSGRAMLOW、page = 1
CpuToCla1MsgRAM:> CLA1_MSGRAMHIGH、page = 1
Cla1DataRam0:> CLARAM0、page = 1
Cla1DataRam1:> CLARAM1、page = 1
Cla1DataRam2:> CLARAM2、page = 1

IOBuffer :> RAML4, page = 1
RFFTmag :> RAML4,页面= 1
RFFTtwidthlads :> RAML4,页面= 1

#ifdef CLA_C
.cio:> RAML4、页= 1
//
// CLA C 编译器段
//
//必须分配给存储器 CLA 具有对
//
scratchpad:> CLARAM1、page = 1
.bss_cla:> CLARAM0、PAGE = 1
.const_cla:> CLARAM2、页= 1
#endif

.reset:> RESET、PAGE = 0、TYPE = DSECT
矢量:>矢量,页面= 0,类型= DSECT


/*
//========================================
//文件结尾。
//========================================
*/

我的主代码如下:

#include "Main.h"
#include "stdbool.h"
#include "application.h"
#include "F2806x_cla_definites.h"
#包含
//外部函数// CLA1fftTables
Uint16 RPM_2wheel = 0;
Uint16 RPM_4wheel = 0;

//#pragma DATA_SECTION (RPM_4wheel、"Cla1ToCpuMsgRAM");
//UINT16 RpmData[2];

#pragma DATA_SECTION (Num、"CpuToCla1MsgRAM");
浮点 Num=0;
#pragma DATA_SECTION (Den、"CpuToCla1MsgRAM");
浮点 Den;
#pragma DATA_SECTION (RES、"Cla1ToCpuMsgRAM");
浮点 RES;

浮点结果;
//
//定义
//
#define CLA_PROG_ENABLE 0x0001
#define CLARAM0_ENABLE 0x0010
#define CLARAM1_ENABLE 0x0020
#define CLARAM2_ENABLE 0x0040
#define CLA_RAM0CPUE 0x0100
#define CLA_RAM1CPUE 0x0200
#define CLA_RAM2CPUE 0x0400
#define RFFT_SIZE (1 << RFFT_STAGEs)
//
// CLA ISR
//
__interrupt void cla1_task1_ISR (void);
__interrupt void cla1_task2_ISR (void);
__interrupt void cla1_task3_ISR (void);
__interrupt void cla1_task4_ISR (void);
__interrupt void cla1_Task5_ISR (void);
__interrupt void cla1_task6_ISR (void);
__interrupt void cla1_task7_ISR (void);
__interrupt void cla1_task8_ISR (void);

//
//这些内容由链接器文件定义并用于复制
// CLA 代码从其加载地址到其运行地址
//在 CLA 程序存储器中
//

extern UINT16 Cla1ProgLoadSize;
extern UINT16 Cla1ProgLoadStart;
extern UINT16 Cla1ProgRunStart;

//
//这些内容由链接器文件定义并用于复制
// CLA 数学表从其加载地址到其运行地址
//集成到其中一个 CLA 数据 RAM 中
//
extern UINT16 Cla1mathTablesLoadStart;
extern UINT16 Cla1mathTablesLoadEnd;
extern UINT16 Cla1mathTablesLoadSize;
extern UINT16 Cla1mathTablesRunStart;
extern __interrupt void Cla1Task1 ();
extern __interrupt void Cla1Task2 ();
extern __interrupt void Cla1Task3 ();
extern __interrupt void Cla1Task4 ();
extern __interrupt void Cla1Task5 ();
extern __interrupt void Cla1Task6 ();
extern __interrupt void Cla1Task7 ();
extern __interrupt void Cla1Task8 ();

//全局变量
UINT16 Sensor_count= 0;
volatile bool FFT_task =false;
volatile bool RPM_CALC_TASK =false;
外部 UINT16 RPM [10];

//RAM 驱动的时间相关函数
#pragma code_section (DSP28x_usDelay、"ramfuncs");
#pragma code_section (cpu_timer0_isr、"ramfuncs");
#pragma code_section (CPU_Timer1_ISR、"ramfuncs");
#pragma code_section (ecap2_isr、"ramfuncs");
#pragma code_section (ADXL_Init、"ramfuncs");
#pragma code_section (adxL_buffer_tick、"ramfuncs");
#pragma code_section (Rpm_Display_Init、"ramfuncs");
#pragma code_section (FPU_FFT_Tick、"ramfuncs");
#pragma code_section (Rpm_Display_Tick、"ramfuncs");
#pragma code_section (scia_msg、"ramfuncs");
#pragma code_section (spi_init、"ramfuncs");
#pragma code_section (spi_fifo_init、"ramfuncs");
#pragma code_section (ADXL359_readRegister、"ramfuncs");
#pragma code_section (ADXL359_writeRegister、"ramfuncs");
#pragma code_section (four_weler、"ramfuncs");
//主菜单
//

TEST_RUN (void);

空 main (void)
{
//

//步骤1. 初始化系统控制:
InitSysCtrl();
InitSciGpio();
InitECap2Gpio();
InitSpiaGpio();
InitECapture();
InitI2Cgpio();
Init Gpio_Button ();
//
//禁用 CPU 中断并清除所有 CPU 中断标志
Dint;
//
InitPieCtrl();


IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();


// :使用 void * memcpy ( void * destination、const void * source、size_t num )
//将"Cla1Prog"和".const_cla"段从闪存复制到 RAM
memcpy (((uint32_t *)&Cla1ProgRunStart、(uint32_t *)&Cla1ProgLoadStart、
(uint32_t)&Cla1ProgLoadSize);
// memcpy ((uint32_t *)&Cla1ConstRunStart、(uint32_t *)&Cla1ConstLoadStart、
//( uint32_t )&Cla1ConstLoadSize );

//
//将用户定义的 ISR 分配至 PIE 矢量表
//
EALLOW;
PieVectTable。 CLA1_INT1 =&cla1_task1_isr;
PieVectTable。 CLA1_INT2 =&cla1_task2_isr;
PieVectTable。 CLA1_INT3 =&cla1_task3_ISR;
PieVectTable。 CLA1_INT4 =&cla1_task4_ISR;
PieVectTable。 CLA1_INT5 =&cla1_task5_ISR;
PieVectTable。 CLA1_INT6 =&cla1_task6_isr;
PieVectTable。 CLA1_INT7 =&cla1_task7_isr;
PieVectTable。 CLA1_INT8 =&cla1_task8_isr;
EDIS;

//
//计算所有 CLA 任务向量
//
EALLOW;
Cla1Regs.MVECT1 =(UINT16)((UINT32)&Cla1Task1 -(UINT32)&Cla1ProgRunStart);
Cla1Regs.MVECT2 =(UINT16)((UINT32)&Cla1Task2 -(UINT32)&Cla1ProgRunStart);
Cla1Regs.MVECT3 =(UINT16)((UINT32)&Cla1Task3 -(UINT32)&Cla1ProgRunStart);
Cla1Regs.MVECT4 =(UINT16)((UINT32)&Cla1Task4 -(UINT32)&Cla1ProgRunStart);
Cla1Regs.MVECT5 =(UINT16)((UINT32)&Cla1Task5 -(UINT32)&Cla1ProgRunStart);
Cla1Regs.MVECT6 =(UINT16)((UINT32)&Cla1Task6 -(UINT32)&Cla1ProgRunStart);
Cla1Regs.MVECT7 =(UINT16)((UINT32)&Cla1Task7 -(UINT32)&Cla1ProgRunStart);
Cla1Regs.MVECT8 =(UINT16)((UINT32)&Cla1Task8 -(UINT32)&Cla1ProgRunStart);
EDIS;

//
//第3步:映射 CLA 任务
//所有任务均已启用并且将由 ePWM 触发器启动
//将 CLA 程序存储器映射到 CLA 并启用软件断点
//
EALLOW;
Cla1Regs.MPISRCSEL1.bit.PERINT1SEL = CLA_INT1_NONE;
Cla1Regs.MPISRCSEL1.bit.PERINT2SEL = CLA_INT2_none;
Cla1Regs.MPISRCSEL1.bit.PERINT3SEL = CLA_INT3_NONE;
Cla1Regs.MPISRCSEL1.bit.PERINT4SEL = CLA_INT4_NONE;
Cla1Regs.MPISRCSEL1.bit.PERINT5SEL = CLA_INT5_none;
Cla1Regs.MPISRCSEL1.bit.PERINT6SEL = CLA_INT6_NONE;
Cla1Regs.MPISRCSEL1.bit.PERINT7SEL = CLA_INT7_NONE;
Cla1Regs.MPISRCSEL1.bit.PERINT8SEL = CLA_INT8_NONE;
Cla1Regs.Mier.all = 0x00FF;
EDIS;

//调用闪存初始化以设置闪存等待状态
//该函数必须驻留在 RAM 中
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(UINT32)&RamfuncsLoadSize);


//外设初始化
//I2C A 初始化
I2CA_Init ();

//初始化 SPI 和 SCI FIFO
SPI_INIT();
spi_fifo_init ();

//初始化 SCI 和 SCI FIFO
scia_echoback_init ();
scia_fifo_init ();

InitFlash();

//初始化 ADXL 振动传感器
ADXL_Init ();

//初始化 LCD 显示
Rpm_Display_Init ();
// display_task = true;
//初始化环形缓冲区以存储传感器数据
ADXL_BUFFER_Init (&ADXL_RingBuffer_X、(uint8*) test_input、sizeof (test_input));
ADXL_Buffer_Init (&ADXL_RingBuffer_Y、(uint8*) test_inputY、sizeof (test_inputY));
ADXL_Buffer_Init (&ADXL_RingBuffer_Z、(uint8*) test_inputZ、sizeof (test_inputZ));

//初始化计时器
// Timer_Init ();//初始化循环中断的计时器

//初始化 GPIO 引脚以通过按钮在两轮和四轮车之间切换
init_button (pButton);
memset (RPM、0、sizeof (RPM));

//
//在组和子组级别启用 CLA 中断
//
PieCtrlRegs.PIEIER11.all = 0xFFFF;
IER =(M_INT11 );

Timer_Init ();


EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM


//将 CLA 程序空间切换到 CLA 并启用软件强制
//也切换 CLA 数据 RAM 0、1和2
//注意:RAMxCPUE 位只能通过对
//寄存器,而不是单个位字段。 此外,该国的状况
//这些位域不会反映在监视视图或寄存器视图中-
//它们始终读取为零。 这是一个已知错误、建议用户
//在继续之前先测试 CPU 附件

EALLOW;
// Cla1Regs.MMEMCFG.all = CLA_PROG_ENABLE|CLARAM0_ENABLE|CLARAM1_ENABLE|CLA_RAM1CPUE;// CLA_RAM2_ENABLE|
Cla1Regs.MMEMCFG.all = CLA_PROG_ENABLE|CLARAM0_ENABLE|CLARAM1_ENABLE|
CLARAM2_ENABLE|CLA_RAM1CPUE;
Cla1Regs.MCTL.bit.IACKE = 1;
EDIS;

//无限循环
while (1)
{

task_scheduler();


//
// CLA ISR
//
__中断无效
cla1_task1_ISR (void)
{
PieCtrlRegs.PIEACK.ACK11 = 1;

__中断无效
cla1_task2_ISR (void)
{
PieCtrlRegs.PIEACK.ACK11 = 1;

__中断无效
cla1_task3_ISR (void)
{
PieCtrlRegs.PIEACK.ACK11 = 1;

__中断无效
cla1_task4_ISR (void)
{
PieCtrlRegs.PIEACK.ACK11 = 1;

__中断无效
cla1_Task5_ISR (空)
{
PieCtrlRegs.PIEACK.ACK11 = 1;

__中断无效
cla1_task6_ISR (void)
{
PieCtrlRegs.PIEACK.ACK11 = 1;

__中断无效
cla1_task7_ISR (void)
{
PieCtrlRegs.PIEACK.ACK11 = 1;

__中断无效
cla1_task8_ISR (void)
{
PieCtrlRegs.PIEACK.ACK11 = 1;

//文件结束
//


TEST_RUN (空)
{

Cla1ForceTask1andWait();
结果= RES;
PUTs("*");

在我的 while 环路中、我将调用该函数来计算 FFT、如下所示


int FPU_FFT_Tick ()
{
//局部变量
UINT16 tempRPM=0;
浮点 FFT_SIZE = RFFT_SIZE;
Uint16 RPM_4WHELE_X = 0;
Uint16 RPM_4WHELE_Y = 0;
Uint16 RPM_4WHELE_Z = 0;
静态 uint16 j=0;
{
UINT16 I=0;
for (I=0;I < RFFT_SIZE;I++){
IOBuffer[i]= TEST_INPUT[i];


hnd_rfft->FFTSize = RFFT_size;
HND_rfft->FFTStages = RFFT_stages;
hd_rfft->InBuf =&IOBuffer[0];//输入缓冲器
hnd_rfft->OutBuf =&IOBuffer2[0];//输出缓冲器

hnd_rfft->MagBuf =&RFFTmagBuff[0];//幅度缓冲器

hd_rfft->CosSinBuf =&RFFTF32Coef[0];//Twiddle 因子缓冲器
RFFT_F32_sincostable (HND_rfft);//计算 Twiddle Factor

{
UINT16 I=0;
对于(I=0;I < RFFT_SIZE;I++){
IOBuffer2[i]= 0;//清理输出缓冲器

{
UINT16 I=0;
for (I=0;I <= RFFT_SIZE/2;I++){
RFFTmagBuff[i]= 0;//清理幅度缓冲器


#ifdef run_cla
test_run();
#else
RFFT_F32 (HND_rfft);//计算实数 FFT


RFFT_F32_MAG (HND_rfft);//计算幅度
#endif
// HND_rfft->PhaseBuf =&RFFTmagBuff[0];//使用幅度缓冲器
{
UINT16 I=1;
对于(I =1;I <= RFFT_SIZE/2;++I)
{
IF ((RFFTmagBuff[I]> maxMagnitude))
{//&&(IOBuffer2[i]< 20)//&& maxMagnitude < 40
maxMagnitude = RFFTmagBuff[i];
peakIndex = i;



频率=(FS * peakIndex)/(FFT_SIZE);
if (maxMagnitude <3)
{
RPM_4WHEEL_X = 0;

否则
{
RPM_4WHEEL_X= RPM_VALUE (频率、4);

// RPM (Y 轴)
{
UINT16 I=0;
for (I=0;I < RFFT_SIZE;I++){
IOBuffer[i]= test_inputY[i];


hnd_rfft->FFTSize = RFFT_size;
HND_rfft->FFTStages = RFFT_stages;
hd_rfft->InBuf =&IOBuffer[0];//输入缓冲器
hnd_rfft->OutBuf =&IOBuffer2[0];//输出缓冲器
hnd_rfft->MagBuf =&RFFTmagBuff[0];//幅度缓冲器
hd_rfft->CosSinBuf =&RFFTF32Coef[0];//Twiddle 因子缓冲器
RFFT_F32_sincostable (HND_rfft);//计算 Twiddle Factor
{
UINT16 I=0;
对于(I=0;I < RFFT_SIZE;I++){
IOBuffer2[i]= 0;//清理输出缓冲器


{
UINT16 I=0;
for (I=0;I <= RFFT_SIZE/2;I++){
RFFTmagBuff[i]= 0;//清理幅度缓冲器


#ifdef run_cla
test_run();
#else
RFFT_F32 (HND_rfft);//计算实数 FFT

RFFT_F32_MAG (HND_rfft);//计算幅度
#endif
// HND_rfft->PhaseBuf =&RFFTmagBuff[0];//使用幅度缓冲器
{
UINT16 I=1;
对于(I =1;I <= RFFT_SIZE/2;++I)
{
IF ((RFFTmagBuff[I]> maxMagnitude))
{
maxMagnitude = RFFTmagBuff[i];
peakIndex = i;



频率=(FS * peakIndex)/(FFT_SIZE);
if (maxMagnitude <3)
{
RPM_4WHEEL_Y = 0;

否则
{
RPM_4WHEEL_Y= RPM_VALUE (频率、4);


// Z 轴 RPM
{
UINT16 I=0;
for (I=0;I < RFFT_SIZE;I++){
IOBuffer[i]= test_inputZ[i];


hnd_rfft->FFTSize = RFFT_size;
HND_rfft->FFTStages = RFFT_stages;
hd_rfft->InBuf =&IOBuffer[0];//输入缓冲器
hnd_rfft->OutBuf =&IOBuffer2[0];//输出缓冲器
hnd_rfft->MagBuf =&RFFTmagBuff[0];//幅度缓冲器
hd_rfft->CosSinBuf =&RFFTF32Coef[0];//Twiddle 因子缓冲器
RFFT_F32_sincostable (HND_rfft);//计算 Twiddle Factor
{
UINT16 I=0;
对于(I=0;I < RFFT_SIZE;I++){
IOBuffer2[i]= 0;//清理输出缓冲器


{
UINT16 I=0;
for (I=0;I <= RFFT_SIZE/2;I++){
RFFTmagBuff[i]= 0;//清理幅度缓冲器


#ifdef run_cla
test_run();
#else
RFFT_F32 (HND_rfft);//计算实数 FFT

RFFT_F32_MAG (HND_rfft);//计算幅度
#endif
// HND_rfft->PhaseBuf =&RFFTmagBuff[0];//使用幅度缓冲器
{
UINT16 I=1;
对于(I =1;I <= RFFT_SIZE/2;++I)
{
IF ((RFFTmagBuff[I]> maxMagnitude))
{//&&(IOBuffer2[i]< 20)//&& maxMagnitude < 40
maxMagnitude = RFFTmagBuff[i];
peakIndex = i;



频率=(FS * peakIndex)/(FFT_SIZE);
if (maxMagnitude <3)
{
RPM_4WHEEL_Z = 0;

否则
{
RPM_4WHEEL_Z = RPM_VALUE (频率、4);

if (((RPM_4WHEEL_X!= RPM_4WHEEL_Y)&(RPM_4WHEEL_Y!= RPM_4WHEEL_Z))
{
返回1;

else if ((RPM_4WHELE_X!= RPM_4WHEEL_Y)||(RPM_4WHEEL_Y!= RPM_4WHEEL_Z)||(RPM_4WHEEL_X!= RPM_4WHEEL_Y)
{
if ((RPM_4WHELE_X = RPM_4WHEEL_Y))
{
RPM_4WHEEL_Z = RPM_4WHEEL_Y;

否则、为((RPM_4WHELE_Z = RPM_4WHEEL_Y))
{
RPM_4WHEEL_X = RPM_4WHEEL_Y;

否则、为((RPM_4WHELE_Z = RPM_4WHELE_X))
{
RPM_4WHEEL_Y = RPM_4WHEEL_X;

RPM[j]=RPM_4WHELE_Z;//(RPM_4WHELE_X + RPM_4WHEEL_Y + RPM_4WHEEL_Z)/3;

否则
{
rpm[j]= RPM_4wel_Z;//(RPM_4wel_X + RPM_4wel_Y + RPM_4wel_Z)/3;

if ((j >= 2)&&(RPM [j]- RPM [j-1])> 30)&&(RPM [j]-RPM [j-2])< 20))
{
RPM[j-1]= RPM[j];

if ((j<2 &&(RPM[1]- RPM[0])>30)&((RPM[1]- RPM[4])< 20))
{
rpm[0]= rpm[1];

J++;
//
如果(j>4){j=0;}
{
UINT16 I=0;
for (I=0;I<5;I++)
{
tempRPM += RPM[i];

tempRPM = tempRPM/5;

RPM_4wheel =温度 RPM;
maxMagnitude = 0;
//测试结束
//完成();
//执行永远不会达到此点
返回1;

问题是、当我启用  RUN_CLA 宏时、它不是计算 FFT、而是在 IOBuffer2和 RFFTmagBuff 上获得空白数据。  

我的 CLA 文件如下所示:

__中断无效
Cla1Task1 (空)
{
_mdebugstop();
CLA_CFFT_run256Pt ();
RES =数字/数字;
CLA_CFFT_unpack256Pt ();

请告诉我在 CLA 配置或缓冲区内存段分配中有什么操作错误,为什么它不起作用,在这个控制器中是否有任何可用于 CLA FFT 计算的参考。  

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

    尊敬的 Sanjay:

    您是否使用 C2000ware 中的某个 CLA 示例作为代码的起点? 如果没有、我建议从其中一个示例开始、添加您的 FFT 计算。 对于 TMS320F28069、可在[C2000ware install]/device_support/f2806x/examples/cla 文件夹中找到这些脚本。

    此致、

    德拉尼

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

    是的、我已经遵循了相同的示例、如果我漏掉了一些内容、请检查我的代码并提供帮助

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

    尊敬的 Sanjay:

    此处链接的 是展示如何将 FFT 计算代码迁移到 CLA 的研讨会视频。 您可以尝试 在 F2806x 项目中运行这里显示的代码吗? 项目文件可在页面底部下载。 本示例使用的是 F2937D、F2806x 对 CLA 模块进行了一些细微的增强、但我不认为这应该是个问题。

    下面是一些其他线程、讨论 CLA 上的 FFT 计算、供您参考。

    TMS320F28379D:CLA FFT 表的用途- C2000微控制器论坛- C2000 ︎ 微控制器- TI E2E 支持论坛

    TMS320F28379D:将 FFT 从 CPU1移至 CLA (计算错误)- C2000微控制器论坛- C2000 ︎ 微控制器- TI E2E 支持论坛

    此致、

    德拉尼

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

    我遵循这些帖子并将我的 cmd 文件细化为下面的文件、 但现在有一个新问题、我得到了一些 FFT 输出的随机值、请看一下、让我知道我是否在该 cmd 文件中丢失了一些内容:(请注意、我的代码在没有 CLA 的情况下可以正常工作、 但当我使用 CLA 时、我提供 FFT 输出的随机值)

    /*
    // TI 文件$Revision:/main/3 $
    // Checkin $日期:2011年3月3日13:45:53 $
    //########################################################################出################################出
    //
    //文件:f28069.cmd
    //
    //标题:F28069器件的连接器命令文件
    //
    //########################################################################出################################出
    //$TI 发布:2806x C/C++头文件 v1.1美元
    //$发布日期:2011年4月7日$
    //$Copyright:
    //版权所有(C) 2009-2023 Texas Instruments Incorporated - http://www.ti.com/
    //
    //以源代码和二进制形式重新分发和使用,无论有无
    //修改,前提是满足以下条件
    //已满足:
    //
    //重新分发源代码必须保留以上版权
    //通知,此条件列表和下述免责声明。
    //
    //以二进制形式重新分发必须复制上述版权
    //通知,此条件列表和以下免责声明(位于
    ///文件和/或其他材料
    //分布。
    //
    // TI 公司名称或公司名称
    //其贡献者可用于认可或推广派生的产品。
    //未经事先书面许可从本软件获得。
    //
    //此软件由版权持有者和贡献者提供
    //"按原样"和任何明示或暗示的保证、包括但不限于
    //仅限于对适销性和适用性的暗示保证
    //不考虑特定目的。 在任何情况下、版权均不得
    //所有者或贡献者对任何直接、间接、偶然、
    //特殊、示例或后果性损害(包括但不包括
    //仅限于采购替代货物或服务;不能使用、
    ///数据或利润;或业务中断)
    //责任理论,无论是在合同,严格的责任,或侵权
    //(包括疏忽或其他)以任何方式产生的使用
    //本软件,即使已被告知此类损坏的可能性。
    //$
    //########################################################################出################################出
    */

    /*========================================
    //对于 Code Composer Studio V2.2及更高版本
    //-------------------------------------------------------
    //除了该存储器连接器命令文件,
    //将头连接器命令文件直接添加到项目中。
    //需要使用头连接器命令文件来链接
    //外设结构设置到内部的正确位置
    //存储器映射。
    //
    //头文件位于 \标题\cmd
    //
    //对于 BIOS 应用程序,添加:F2806x_Headers_BIOS.cmd
    //对于非 BIOS 应用程序,添加:f2806x_Headers_nonBIOS.cmd
    ================================ */

    /*========================================
    //对于 V2.2之前的 Code Composer Studio
    //-------------------------------------------------------
    // 1)使用以下-l 语句之一来包含
    //项目中的头连接器命令文件。 头文件链接器
    //文件需要将外设结构链接到正确的
    //存储器映射中的位置*/

    /*取消注释此行、以便仅包含非 BIOS 应用程序的文件*/
    /*-l F2806x_Headers_nonBIOS.cmd */

    /*取消注释此行、以便仅包含 BIOS 应用程序的文件*/
    /*-l F2806x_Headers_BIOS.cmd */

    /* 2)在项目中将路径添加到 \headers\cmd 添加到
    项目->构建选项、链接器选项卡下的库搜索路径、
    库搜索路径(-i)。
    /*=================================================================================== */

    /*定义 F2806x 的存储器块起始/长度
    第0页将用于组织程序段
    第1页将用于组织数据段

    注:
    F28069上的内存块是统一的(即
    物理存储器)。
    存储器区域的头文件不应
    为 PAGE 0和 PAGE 1定义了该值。
    这样做会导致程序损坏、
    和/或数据。

    连续 SARAM 存储器块可以组合
    创建更大的存储块。
    */
    _Cla1 Prog_Start =_Cla1funcsRunStart;
    -heap 0x400
    -stack 0x400

    //定义将要使用的 CLA 暂存区的大小
    //通过 CLA 编译器获取局部符号和临时变量
    //也强制引用标记
    //暂存区。
    CLA_SCRATCHPAD_SIZE = 0x100;
    -- undef_sym=_cla_scratchpad_end
    -- undef_sym=_cla_scratchpad_start
    内存
    {
    第0页:/*程序存储器*/
    /*存储器(RAM/FLASH/OTP)块可以移动到页1进行数据分配*/
    //RAML0:origin = 0x008000、length = 0x000800 /*片上 RAM 块 L0 */
    //RAML1:origin = 0x008800、length = 0x000400 /*片上 RAM 块 L1 */
    OTP : origin = 0x3D7800 , length = 0x000400 /*片上 OTP */

    FLASHH:origin = 0x3D8000、length = 0x004000 /*片上闪存*/
    FLASHG:origin = 0x3DC000,length = 0x004000 /*片上闪存*/
    FLASHF:origin = 0x3E0000,length = 0x004000 /*片上闪存*/
    FLASHE:origin = 0x3E4000,length = 0x004000 /*片上闪存*/
    FLASHD : origin = 0x3E8000, length = 0x004000 /*片上闪存*/
    FLASHC : origin = 0x3EC000 , length = 0x004000 /*片上 Flash */
    FLASHA:origin = 0x3F4000,length = 0x003F80 /*片上闪存*/
    CSM_RSVD:origin = 0x3F7F80,length = 0x000076 /*部分 FLASHA。 当 CSM 正在使用时、全为0x0000编程。 */
    begin:origin = 0x3F7FF6,length = 0x000002 /* Part of FLASHA。 用于"引导至闪存"引导加载程序模式。 */
    CSM_PWL_P0:origin = 0x3F7FF8,length = 0x000008 /*部分 FLASHA。 FLASHA 中的 CSM 密码位置*/

    FPUBLES:origin = 0x3FD590,length = 0x0006A0 /*引导 ROM 中的 FPU 表*/
    IQTABLES : origin = 0x3FDF00 , length = 0x000B50 /*引导 ROM 中的 IQMath 表*/
    IQTABLES2:origin = 0x3FEA50,length = 0x00008C /* Boot ROM 中的 IQMath 表*/
    IQTABLES3:origin = 0x3FEADC,length = 0x0000AA /*引导 ROM 中的 IQMath 表*/

    ROM:origin = 0x3FF3B0,length = 0x000C10 /* Boot ROM */
    复位:origin = 0x3FFFC0、length = 0x000002 /* part of boot ROM */
    vectors : origin = 0x3FFFc2, length = 0x00003E /* part of boot ROM */

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

    BOOT_RSVD:origin = 0x000000,length = 0x000050 /* M0的一部分,引导 ROM 将此用于堆栈*/
    RAMM0:origin = 0x000050,length = 0x000350 /*片上 RAM 块 M0 */
    RAMM1:origin = 0x000400,length = 0x000400 /*片上 RAM 块 M1 */
    //RAML2:origin = 0x008C00、length = 0x000400 /*片上 RAM 块 L2 */
    RAML3:origin = 0x009000、length = 0x001000 /*片上 RAM 块 L3 */
    RAML4:origin = 0x00A000,length = 0x002000 /*片上 RAM 块 L4 */
    RAML5:origin = 0x00C000、length = 0x001000 /*片上 RAM 块 L5 */
    RAML6:origin = 0x00D000、length = 0x001000 /*片上 RAM 块 L6 */
    RAML7:origin = 0x00E000、length = 0x001000 /*片上 RAM 块 L7 */
    RAML8:origin = 0x00F000、length = 0x005000 /*片上 RAM 块 L8 */
    USB_RAM:origin = 0x040000、length = 0x000800 /* USB RAM */
    FLASHB:origin = 0x3F0000,length = 0x004000 /*片上闪存*/

    CLARAM0:origin = 0x008800,length = 0x000400 /*L1 DSPSARAM*/
    CLARAM1 : origin = 0x008C00 , length = 0x000400 /* L2 DSPSARAM*/
    CLARAM2 : origin = 0x008000 , length = 0x000800

    CLA1_MSGRAMLOW:origin = 0x001480、length = 0x000080
    CLA1_MSGRAMHIGH:origin = 0x001500、length = 0x000080

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


    部分
    {

    /*分配计划领域:*/
    .cinit:> FLASHA、page = 0
    .pinit :> FLASHA,页面= 0
    .text:> FLASHA、page = 0
    codestart :> begin, page = 0
    // ramfuncs : load = FLASHD,
    // run = RAML0、
    // page = 0

    ramfuncs:load=FLASHB、
    RUN = RAML8、
    Load_start (_RamfuncsLoadStart)、
    Load_End (_RamfuncsLoadEnd)、
    RUN_START (_RamfuncsRunStart)、
    Load_Size (_RamfuncsLoadSize)、
    页= 1

    csmpasswds:>csm_PWL_p0、page = 0
    csm_rsvd :> csm_rsvd , page = 0

    /*分配未初始化的数据段:*/
    .stack:> RAMM1、page = 1
    .ebss:> RAML4、page = 1
    .esysmem:> RAML6、page = 1
    .cio:> RAML5、page = 1

    /*要进入闪存的已初始化段*/
    /*要使 SDFlash 对这些单元进行编程,它们必须被分配到 PAGE 0 */
    econst:> FLASHA、PAGE = 0
    .switch:> FLASHA、PAGE = 0

    /*分配 IQ 数学领域:*/
    IQMath :> FLASHA, page = 0 /*数学代码*/
    IQmathTables :> IQTABLES , PAGE = 0, TYPE = NOLOAD

    /*分配 FPU 数学领域:*/
    FPUmathTables :> FPUTABLES , PAGE = 0, TYPE = NoLoad

    IOBuffer:>CLARAM2、page = 1//align=512、
    RFFTdata2:> CLARAM2、page = 1//已添加 RAML456
    RFFTdata3:> RAML7、page = 1
    RFFTdata4 :> RAML8 , page = 1 // FPUfftTables

    /*如果调用 IQNexp()或 IQexp(),请取消注释以下部分
    库中的 Iqmath.lib 函数构建库、从而利用
    引导 ROM 中的相关 IQMath 表(这样可以节省空间和引导 ROM
    1个等待状态)。 如果未取消注释该段、则 IQmathTables2
    将加载到其他存储器(SARAM、闪存等)中、并将执行
    为 up 空间、但等待状态为0是可行的。
    */
    /*
    IQmathTables2:>IQTABLES2、PAGE = 0、TYPE = NOLOAD
    {

    IQmath.lib (IQmathTablesRam)


    */
    /*如果调用 IQNasin ()或 IQasin (),请取消注释下面的部分
    库中的 Iqmath.lib 函数构建库、从而利用
    引导 ROM 中的相关 IQMath 表(这样可以节省空间和引导 ROM
    1个等待状态)。 如果未取消注释该段、则 IQmathTables2
    将加载到其他存储器(SARAM、闪存等)中、并将执行
    为 up 空间、但等待状态为0是可行的。
    */
    /*
    IQmathTables3:>IQTABLES3、PAGE = 0、TYPE = NOLOAD
    {

    IQmath.lib (IQmathTablesRam)


    */

    /*.reset 是编译器使用的标准段。 它包含*/
    /* C 代码的_c_int00起始地址。 /*
    /*使用引导 ROM 时、此段和 CPU 矢量*/
    不需要/*表。 因此、此处将默认类型设置为*/
    /* DSECT */

    Cla1Prog:load = FLASHB,
    RUN = RAML3、
    Load_Start (_Cla1funcsLoadStart)、
    Load_End (_Cla1funcsLoadEnd)、
    Load_Size (_Cla1funcsLoadSize)、
    RUN_START (_Cla1funcsRunStart)、
    页= 1
    Cla1ToCpuMsgRAM:> CLA1_MSGRAMLOW、page = 1
    CpuToCla1MsgRAM:> CLA1_MSGRAMHIGH、page = 1
    Cla1DataRam0:> CLARAM0、page = 1
    Cla1DataRam1:> CLARAM1、page = 1
    Cla1DataRam2:> CLARAM2、page = 1

    //CLA1mathTables :> RAML7、
    // load_start (_Cla1mathTablesLoadStart)、
    //load_end (_Cla1mathTablesLoadEnd)、
    //load_size (_Cla1mathTablesLoadSize)、
    // RUN_START (_Cla1mathTablesRunStart),
    // page = 1

    CLA1mathTables : load=FLASHB,
    运行= CLARAM1、
    RUN_START (CLA1fftTablesRunStart)、
    Load_start (_Cla1mathTablesLoadStart)、
    Load_End (_Cla1mathTablesLoadEnd)、
    Load_Size (_Cla1mathTablesLoadSize)、
    RUN_START (_Cla1mathTablesRunStart)、
    页= 1

    CLA1fftTables : Load = FLASHB,
    RUN = RAML4、
    RUN_START (CLA1mathTablesRunStart)、
    Load_start (CLA1fftTablesLoadStart)、
    Load_Size (CLA1fftTablesLoadSize)、
    页= 1
    // CLA1fftTables :> RAML4,
    //load_start (_Cla1fftTablesLoadStart)、
    //load_end (_Cla1fftTablesLoadEnd)、
    //load_size (_Cla1fftTablesLoadSize)、
    //run_start (_Cla1fftTablesRunStart)、
    //页= 1
    CLAscratch:
    {*。obj (CLAscratch)
    。 += CLA_SCRATCHPAD_SIZE;
    *.obj (CLAscratch_end)}> CLARAM0,
    页= 1
    .bss_cla:> CLARAM0、PAGE = 1
    .const_cla:> CLARAM0、PAGE = 1
    scratchpad:> CLARAM0、page = 1

    .reset:> RESET、PAGE = 0、TYPE = DSECT
    矢量:>矢量,页面= 0,类型= DSECT

    /*
    //========================================
    //文件结尾。
    //========================================
    */

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

    尊敬的 Sanjay:

    您能否将代码附加为文件而不是文本? 我将仔细查看是否可以找到任何问题。

    谢谢。

    德拉尼

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

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /*
    // TI File $Revision: /main/3 $
    // Checkin $Date: March 3, 2011 13:45:53 $
    //###########################################################################
    //
    // FILE: F28069.cmd
    //
    // TITLE: Linker Command File For F28069 Device
    //
    //###########################################################################
    // $TI Release: 2806x C/C++ Header Files V1.10 $
    // $Release Date: April 7, 2011 $
    // $Copyright:
    // Copyright (C) 2009-2023 Texas Instruments Incorporated - http://www.ti.com/
    //
    // Redistribution and use in source and binary forms, with or without
    // modification, are permitted provided that the following conditions
    // are met:
    //
    // Redistributions of source code must retain the above copyright
    // notice, this list of conditions and the following disclaimer.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include "Main.h"
    #include "stdbool.h"
    #include "application.h"
    #include "DSP28x_Project.h" // DSP28x Headerfile
    #include "F2806x_Cla_defines.h"
    #include "divide_shared.h"
    //Externs Functions
    //
    // Defines
    //
    #define CLA_PROG_ENABLE 0x0001
    #define CLARAM0_ENABLE 0x0010
    #define CLARAM1_ENABLE 0x0020
    #define CLARAM2_ENABLE 0x0040
    #define CLA_RAM0CPUE 0x0100
    #define CLA_RAM1CPUE 0x0200
    #define CLA_RAM2CPUE 0x0400
    //
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    int FPU_FFT_Tick()//this function is called in main to calculate fft
    {
    // Locals
    Uint16 tempRPM=0;
    float fft_size = RFFT_SIZE;
    Uint16 RPM_4wheel_X = 0;
    Uint16 RPM_4wheel_Y = 0;
    Uint16 RPM_4wheel_Z = 0;
    static Uint16 j=0;
    {
    Uint16 i=0;
    for(i=0; i < RFFT_SIZE; i++){
    IOBuffer[i] = test_input[i];
    }
    }
    hnd_rfft->FFTSize = RFFT_SIZE;
    hnd_rfft->FFTStages = RFFT_STAGES;
    hnd_rfft->InBuf = &IOBuffer[0]; //Input buffer
    hnd_rfft->OutBuf = &IOBuffer2[0]; //Output buffer
    hnd_rfft->MagBuf = &RFFTmagBuff[0]; //Magnitude buffer
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //###########################################################################
    //
    // TITLE: divide.cla
    //
    // Description: Divide using Newton Raphson Approximation
    //
    //###########################################################################
    // $TI Release: $
    // $Release Date: $
    // $Copyright:
    // Copyright (C) 2009-2023 Texas Instruments Incorporated - http://www.ti.com/
    //
    // Redistribution and use in source and binary forms, with or without
    // modification, are permitted provided that the following conditions
    // are met:
    //
    // Redistributions of source code must retain the above copyright
    // notice, this list of conditions and the following disclaimer.
    //
    // Redistributions in binary form must reproduce the above copyright
    // notice, this list of conditions and the following disclaimer in the
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    尊敬的 Sanjay:

    我看不到您的代码有任何直接问题、但如果我发现有任何问题、我会在下周通知您。 不过、在咨询另一位 CLA 专家之后、我建议切换到使用较新的器件、如 F2837xD。 在 CLA 数学库中有硬编码 FFT 示例、并且该器件中有用于 CLA 的 ROM 专用部分。 库示例可在[C2000ware install]\libraries\math\CLAmath\c28\examples 中找到。 请告诉我、这对您而言是否是更好的选择。

    此致、

    德拉尼

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

    大家好、Delaney、我已经按照您介绍的示例进行操作。 我有时会获得 FFT 固定值、有时会获得随机值。 我很困惑、在哪里可以放置以下部分:

    FPUmathTables :> FPUTABLES , PAGE = 0, TYPE = NoLoad

    FPUfftTables :> RAML456, page = 1//added
    IOBuffer:>CLARAM2、align=2048、PAGE = 1
    IOBuffer2:> CLARAM2、align=512、page = 1
    MagnitudeBuffer :> RAML456, page = 1
    TwiddleBuffer :> RAML456, page = 1

    至于现在、我已经将 IOBuffer 段放在 CLARAM2中、因为这些缓冲器应在 C28和 CLA 之间共享。 我说对了、如果其他缓冲区也存在于 IOBuffers 等共享 RAM 中、我应该将诸如幅度和 Twiddle 因素等缓冲区放在何处、并告知我在 cmd 文件或我在较早文章中上传的代码中是否遗漏了内容。 我不知道该怎么做。 此外、我看到一些网站建议对齐这些缓冲区、没错、目前我的 IOBuffer 的大小为256个浮点值、因为我计算的 FFT 为256个点(256个浮点值)。 "那怎么行?

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

    尊敬的 Sanjay:

    这位专家目前正在休假。 请允许在她明天返回之前延迟一些答复。

    谢谢。此致、

    艾里森

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

    尊敬的 Sanjay:

    很抱歉耽误你的时间。   RAML456使用什么存储器地址? 我在您发送的上一个链接器命令文件中看不到它。 请记住、在 F2806x 上、CLA 无法访问 LSRAM4 (也没有 LSRAM5或 LSRAM6)。 如果你正在将任何内容映射到这些存储器区域、CLA 无法访问它们、这可能是你遇到的问题的原因。

    通常、应匹配 C2000ware 中针对 align 和 page 属性提供的链接器命令文件中包含的内容。 例如、如果这些存储器段在此处对齐、则它们应在文件中对齐。  

    同样、我建议切换到较新的器件、其中这些表已硬编码到 ROM 中、并且有一些示例来执行您要寻找的操作、这由您决定。   

    此致、

    德拉尼