尊敬的 Veena:
CLA1也出现了同样的问题。
我们开发的函数无法正常工作。 该函数包含多个公式、其中函数的某些部分正常工作、但函数的其他部分不工作。
我在这里附上了两个文件。 一个文件是用 C 语言编写的函数、而另一个文件是 CCS 调试器的反汇编部分。
请认真注意此问题。
此致、
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.
尊敬的 Veena:
CLA1也出现了同样的问题。
我们开发的函数无法正常工作。 该函数包含多个公式、其中函数的某些部分正常工作、但函数的其他部分不工作。
我在这里附上了两个文件。 一个文件是用 C 语言编写的函数、而另一个文件是 CCS 调试器的反汇编部分。
请认真注意此问题。
此致、
您好!
我们正在工作的项目是使用 PR 控制器进行有源谐波滤波的一部分(参考文档随附)。
我们已将 PR 控制器的传递函数(离散形式)用于单个谐波补偿、该函数在 CLA1中实现。
因为我们的内核以39.06usec 的速率运行。 在 CLA1中执行的单个函数的存储器长度变化时、这个传递函数不能正常工作。
我已在附加的 rar 文件中附上以下文件供您参考。
cla1_init.c
C1_CPU_CLA.CLA
C1_CpuCla_data.h
4.2837x_flash_lnk_cpu1.cmd
5. AHF_3800_3LVL_CPU1.MAP
6. PRController.pdf
感谢您的支持、
Dushyant Rana
[引用 user="amtech"]此传递函数在 CLA1中实现的单个函数的内存长度变化时无法正常工作。
Amtech、
这是否意味着当函数达到特定大小时、它将不再工作? 它现在是否跨越了 RAM 物理边界?
CLA 无法访问器件上的所有存储器。 这是首先要检查的问题。 在数据表中有一个存储器映射、显示了所有存储器块以及 CLA 可以访问的存储器块。 如果它进入了另一个 RAM 块、则需要配置该块以供 CLA 使用。 这是第二个要检查的问题。
如果代码在有效、已配置的 CLA 存储器中运行。 接下来要检查的是单步执行 CLA 代码-您能否判断它是读取错误还是写入错误? 这将有助于我们了解是由数据存储器引起问题、而不是由程序存储器引起。
例如、代码安全-如果 CLA 运行在不安全的存储器中、但它尝试访问不允许的安全 RAM。 CLA 只能在 CLA 也被同一个区域抓取时访问安全 RAM。 在这种情况下、要么使 RAM 不安全、要么也从同一个区域中抓取 CLA。
Lori
您好!
->这是否意味着当函数达到一定大小时、它将不再起作用? 它现在是否跨越了 RAM 物理边界?
否、函数未跨越 RAM 物理边界。
-> CLA 无法访问器件上的所有存储器。 这是首先要检查的问题。 在数据表中有一个存储器映射、显示了所有存储器块以及 CLA 可以访问的存储器块。
在我们的项目中、我们使用本地存储器 LS2、LS3和 LS4作为 CLA1的程序存储器。
我们已将用于 CLA1的 RAM 的 LS0和 LS1组合在一起。
我们在固件的 cmd 文件中的内存分配下完成的操作。
第0页:
/* begin 用于"引导至闪存"引导加载程序模式*/
开始:origin = 0x080000,length = 0x000002
RAMM0:origin = 0x000122、length = 0x0002DE
RAMD0:origin = 0x00B000、length = 0x000800
RAMLS0:origin = 0x008000、length = 0x001000
//RAMLS1:origin = 0x008800,length = 0x000800
RAMLS2:origin = 0x009000,length = 0x000800
RAMLS3:origin = 0x009800,length = 0x000800
RAMLS4:origin = 0x00A000,length = 0x000800
RAMGS12:origin = 0x018000,length = 0x004000
复位:origin = 0x3FFFC0,length = 0x000002
/*闪存扇区*/
FLASHA:origin = 0x080002,length = 0x001FFE /*片上闪存*/
FLASHB:origin = 0x082000、length = 0x002000 //片上闪存*
FLASHC:origin = 0x084000,length = 0x002000 //片上闪存*/
FLASHD:origin = 0x086000、length = 0x002000 //片上闪存*/
FLASHE:origin = 0x088000、length = 0x030000//片上闪存*/
FLASHK:origin = 0x0B8000、length = 0x002000 //片上闪存*/
FLASHL:origin = 0x0BA000、length = 0x002000 //片上闪存*/
FLASHM:origin = 0x0BC000、length = 0x002000 //片上闪存*/
FLASHN:origin = 0x0BE000、length = 0x002000 //片上闪存*/
//in 部分
Cla1Prog:load = FLASHD,
运行= RAMLS2、
load_start (_Cla1funcsLoadStart)、
load_end (_Cla1funcsLoadEnd)、
run_start (_Cla1funcsRunStart)、
load_size (_Cla1funcsLoadSize)、
PAGE = 0、ALIGN (4)
// DR-20
Cla1Prog1:load = FLASHK、
运行= RAMLS3、
load_start (_Cla1funcsLoadStart1)、
load_end (_Cla1funcsLoadEnd1)、
run_start (_Cla1funcsRunStart1)、
load_size (_Cla1funcsLoadSize1)、
PAGE = 0、ALIGN (4)
// DR-20
Cla1Prog2:load = FLASHL、
运行= RAMLS4、
load_start (_Cla1funcsLoadStart2)、
load_end (_Cla1funcsLoadEnd2)、
run_start (_Cla1funcsRunStart2)、
load_size (_Cla1funcsLoadSize2)、
PAGE = 0、ALIGN (4)
我们配置了 CLA、如下所示:
空 CLA_configClaMemory (空)
{
extern uint32_t Cla1funcsRunStart、Cla1funcsLoadStart、Cla1funcsLoadSize;
extern uint32_t Cla1funcsRunStart1、Cla1funcsLoadStart1、Cla1funcsLoadSize1;// DR-20
extern uint32_t Cla1funcsRunStart2、Cla1funcsLoadStart2、Cla1funcsLoadSize2;// DR-20
EALLOW;
#ifdef _flash
//将代码从闪存复制到 RAM
memcpy (((uint32_t *)& Cla1funcsRunStart、(uint32_t *)& Cla1funcsLoadStart、(uint32_t)& Cla1funcsLoadSize);
memcpy (((uint32_t *)& Cla1funcsRunStart1、(uint32_t *)& Cla1funcsLoadStart1、(uint32_t)& Cla1funcsLoadSize1);// DR-20
memcpy (((uint32_t *)& Cla1funcsRunStart2、(uint32_t *)& Cla1funcsLoadStart2、(uint32_t)& Cla1funcsLoadSize2);// DR-20
#endif //_FLASH
//初始化并等待 CLA1ToCPUMsgRAM
MemCfgRegs.MSGxINIT.bit.init_CLA1TOCPU = 1;
while (MemCfgRegs.MSGxINITDONE.bit.INITDONE_CLA1TOCPU!= 1)
{
};
//初始化并等待 CPUToCLA1MsgRAM
MemCfgRegs.MSGxINIT.bit.init_CPUTOCLA1 = 1;
while (MemCfgRegs.MSGxINITDONE.bit.INITDONE_CPUTOCLA1!= 1)
{
};
//选择 LSxRAM 作为 CLA 的编程空间
//首先将 CLA 配置为 LSx 的主器件,然后再配置
//将空间设置为程序块
MemCfgRegs.LSxMSEL.bit.MSEL_LS2 = 1;//RAMLS2
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS2 = 1;
MemCfgRegs.LSxMSEL.bit.MSEL_LS3 = 1;//RAMLS3
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS3 = 1;
MemCfgRegs.LSxMSEL.bit.MSEL_LS4 = 1;//RAMLS4
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS4 = 1;
//接下来将 LSxRAM 配置为 CLA 的数据空间
//首先将 CLA 配置为 LSx 的主器件,然后再配置
//将空格设置为代码块
MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1;//RAMLS0
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 0;
MemCfgRegs.LSxMSEL.bit.MSEL_LS1 = 1;//RAMLS1
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS1 = 0;
EDIS;
}
->如果它进入另一个 RAM 块、则需要配置该块以供 CLA 使用。 这是第二个要检查的问题。
没有任何函数会交叉进入另一个 RAM 块。 所有使用的块都按上述方式进行配置。
->如果代码在有效、已配置的 CLA 存储器中运行。 接下来要检查的是单步执行 CLA 代码-您能否判断它是读取错误还是写入错误? 这将有助于我们了解是由数据存储器引起问题、而不是由程序存储器引起。
您能否指导我如何检查 CLA 代码的读取和写入?
->在之前的答复中、我已发送与 CLA1配置相关的所有文件、您能否在查看这些文件后提供指导?
->还有一点是、看看 CLA1函数的反汇编代码部分、
在这里、您可以看到在常规实例中遇到 ITRAP0指令。 这是否会在执行代码时产生问题?
009000:0000 ITRAP0
009001:7840 MOV *- SP[0]、AR0
009002:872A MOVL XT、@0x2a
009003:74C0 SUB *+ XAR0[0]、AL
24 cpu_and_cla.r_pr[0].xn2 = cpu_and_cla.r_pr[0].xn1;
009004:84EC7400 XMAC P、*+ XAR4[5]、*(0x7400)
25 cpu_and_cla.r_pr[0].xn1 = cpu_and_cla.r_pr[0].xn0;
009006:84EA7400 XMAC P、*+ XAR2[5]、*(0x7400)
26 cpu_and_cla.r_pr[0].xn0 = cpu_and_cla.Rin_pr;
009008:844C73C0 XMAC P、*- SP[12]、*(0x73c0)
00900a:84EA74C0 XMAC P、*+ XAR2[5]、*(0x74c0)
27 cpu_and_cla.r_pr[0].yn2 = cpu_and_cla.r_pr[0].yn1;
00900c:84E67400 XMAC P、*+ XAR6[4]、*(0x7400)
28 cpu_and_cla.r_pr[0].yn1 = cpu_and_cla.r_pr[0].yn0;
00900e:84E47400 XMAC P、*+ XAR4[4]、*(0x7400)
29 cpu_and_cla.r_pr[0].yn0 =((cpu_and_cla.a0[0]*(cpu_and_cla.r_pr[0].xn0 - cpu_and_cla.r_pr[0].xn2))
009010:84A473C0 XMAC P、@AR4、*(0x73c0)
009012:84E673D0 XMAC P、*+ XAR6[4]、*(0x73d0)
009014:84EA73E0 XMAC P、*+ XAR2[5]、*(0x73e0)
009016:84EE0110 XMAC P、*+ XAR6[5]、*(0x0110)
009018:84642690 XMAC P、*- SP[36]、*(0x2690)
00901a:0019 INTR INT10
00901b:7C00 MOV @0x0、AR4
00901c:84C42180 XMAC P、*+ XAR4[0]、*(0x2180)
00901e:84E873D0 XMAC P、*+ XAR0[5]、*(0x73d0)
009020:0004推送 RPC
009021:7C00 MOV @0x0、AR4
009022:84842210 XMAC P、* XAR4++、*(0x2210)
009024:0004推送 RPC
009025:7C00 MOV @0x0、AR4
009026:84E474C0 XMAC P、*+ XAR4[4]、*(0x74c0)
009028:0000 ITRAP0
009029:7FA0 MOV @AR0、AR7
00902a:0000 ITRAP0
00902b:7FA0 MOV @AR0、AR7
32 TOTAL_R = TOTAL_R + CPU_AND_CLA.R_pr[0].yn0;
00902c:872A MOVL XT、@0x2a
00902d:73C0 ADD *+ XAR0[0]、AH
00902e:84E473D0 XMAC P、*+ XAR4[4]、*(0x73d0)
009030:0004推送 RPC
009031:7C20 MOV @0x20、AR4
009032:872A MOVL XT、@0x2a
009033:74C0 SUB *+ XAR0[0]、AL
34 cpu_and_cla.r_pr[1].xn2 = cpu_and_cla.r_pr[1].xn1;
009034:84F87400 XMAC P、*+ XAR0[7]、*(0x7400)
35 cpu_and_cla.r_pr[1].xn1 = cpu_and_cla.r_pr[1].xn0;
009036:84F67400 XMAC P、*+ XAR6[6]、*(0x7400)
36 CPU_AND_CLA.R_pr[1].xn0 = CPU_AND_CLA.Rin_pr;
009038:844C73C0 XMAC P、*- SP[12]、*(0x73c0)
00903a:84F674C0 XMAC P、*+ XAR6[6]、*(0x74c0)
37 cpu_and_cla.r_pr[1].yn2 = cpu_and_cla.r_pr[1].yn1;
00903c:84F27400 XMAC P、*+ XAR2[6]、*(0x7400)
38 cpu_and_cla.r_pr[1].yn1 = cpu_and_cla.r_pr[1].yn0;
00903E:84F07400 XMAC P、*+ XAR0[6]、*(0x7400)
amtech 说:您能指导我如何检查 CLA 代码的读写操作吗?
Amtech、
我们有一个 CLA 技术讲座、其中包括一个调试部分。 请参阅 CLA 软件开发人员指南的"入门"、"技术讲座"部分:
https://software-dl.ti.com/C2000/docs/cla_software_dev_guide/getting_started.html
该指南还包含许多有关 CLA 的常见问题解答和调试提示。
[引用 USER="AMTECH]->另外一件事是查看 CLA1函数的反汇编代码部分、
在这里、您可以看到在常规实例中遇到 ITRAP0指令。 这是否会在执行代码时出现问题?
Code Composer Studio 认为您正在考虑 C28x 反汇编。 这些都是 C28x 的操作码。 在 CCS Debug 窗口中、首先单击 CPU1_CLA1内核、右键单击并选择"connect target"。 现在、CCS 将知道您正在查看 CLA 环境、然后查看反汇编。 我在前面提到的研讨会中对此进行了介绍。
此致
Lori
您好、
此问题仍在处理中。
在调试 CLA1代码期间、我观察到一件事。 我使用 了 RAMLS2、 RAMLS3和 RAMLS4作为 CLA 程序存储器、并为这些存储器分配了 CLA 函数、如下所示。
extern uint32_t Cla1funcsRunStart、Cla1funcsLoadStart、Cla1funcsLoadSize;
extern uint32_t Cla1funcsRunStart1、Cla1funcsLoadStart1、Cla1funcsLoadSize1;// DR-20
extern uint32_t Cla1funcsRunStart2、Cla1funcsLoadStart2、Cla1funcsLoadSize2;// DR-20
EALLOW;
#ifdef _flash
//将代码从闪存复制到 RAM
memcpy (((uint32_t *)& Cla1funcsRunStart、(uint32_t *)& Cla1funcsLoadStart、(uint32_t)& Cla1funcsLoadSize);
memcpy (((uint32_t *)& Cla1funcsRunStart1、(uint32_t *)& Cla1funcsLoadStart1、(uint32_t)& Cla1funcsLoadSize1);// DR-20
memcpy (((uint32_t *)& Cla1funcsRunStart2、(uint32_t *)& Cla1funcsLoadStart2、(uint32_t)& Cla1funcsLoadSize2);// DR-20
#endif //_FLASH
//初始化并等待 CLA1ToCPUMsgRAM
MemCfgRegs.MSGxINIT.bit.init_CLA1TOCPU = 1;
while (MemCfgRegs.MSGxINITDONE.bit.INITDONE_CLA1TOCPU!= 1)
{
};
//初始化并等待 CPUToCLA1MsgRAM
MemCfgRegs.MSGxINIT.bit.init_CPUTOCLA1 = 1;
while (MemCfgRegs.MSGxINITDONE.bit.INITDONE_CPUTOCLA1!= 1)
{
};
//选择 LSxRAM 作为 CLA 的编程空间
//首先将 CLA 配置为 LSx 的主器件,然后再配置
//将空间设置为程序块
//MemCfgRegs.LSxMSEL.bit.MSEL_LS2 = 1;//RAMLS2
//MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS2 = 1;
MemCfgRegs.LSxMSEL.bit.MSEL_LS2 = 1;//RAMLS2
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS2 = 1;
MemCfgRegs.LSxMSEL.bit.MSEL_LS3 = 1;//RAMLS3
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS3 = 1;
MemCfgRegs.LSxMSEL.bit.MSEL_LS4 = 1;//RAMLS4
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS4 = 1;
//接下来将 LSxRAM 配置为 CLA 的数据空间
//首先将 CLA 配置为 LSx 的主器件,然后再配置
//将空格设置为代码块
MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1;//RAMLS0
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 0;
MemCfgRegs.LSxMSEL.bit.MSEL_LS1 = 1;//RAMLS1
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS1 = 0;
EDIS;
与这些设置一样、当在存储器浏览器中使用0x9000 (RAMLS2)存储器位置调试 I 观测器时、数据会发生变化、如下所示。 就像这个存储器被配置为 CLA 程序存储器一样、这是否发生呢? 这可能是什么原因?
相关信息。
Dushyant Rana
您好!
将代码插入到帖子中时、请使用代码格式器。 这是 按钮。 它使读取变得容易得多。 但是、一般而言、我无法通读大量尝试确定是否出错的代码。
[引用 USER="AMTECH]当在内存浏览器中使用0x9000 (RAMLS2)内存位置调试 I 观测器时、这些设置会发生变化、如下图所示。 就像这个存储器被配置为 CLA 程序存储器一样、这是否发生呢? 这可能是什么原因?
检查分配给此存储器区域的内容的最佳方法是检查链接器生成的.map 文件、以了解您不希望分配给此存储器的任何内容。 此文件显示每个符号及其在存储器中的分配位置。 如果它只是 CLA 程序、那么它只应该在 C28x 初始化它时被修改。
注:由于美国下周的假日,我的答复将推迟到12月的第一周。
您好!
我使用的是编译器版本18.1.1 LTS。
我从 以下链接中研究了编译器缺陷 CodeGen-3676、
http://software-dl.ti.com/codegen/esd/cgt_public_sw/C2000/18.1.1.LTS/Closed_defects.html
我面临的问题与编译器缺陷中描述的问题相同。
在下面的代码中、在将实际值复制到存储器之前执行公式的最后一行。
cpu_and_cla.r_pr[1].xn2 = cpu_and_cla.r_pr[1].xn1; cpu_and_cla.r_pr[1].xn1 = cpu_and_cla.r[1].xn0;cpu_and_cla.r.pr[1].xn1 = cpu_and_cla_pr.r1.r1].r.r_r_r.r_r1[r_r_r_r.r_r.r_r.r_r_r_r.r_r.r_r.r_r_r1]1; cpu_r_r_r_r_r_r_r_r_r_r_cla.r_r_r_r_r.r_r_r.r_r CPU_AND_CLA.R_pr[1].yn0 =((CPU_and_CLA.a0[1]*(CPU_and_CLA.R[1].xn0 - CPU_and_CLA.R.R[1].xn0) -(CPU_and_CLA.pr[1].xn2)-(CPU_AND_CLA.B1[1]* CPU_AND_1.CLA.1]*和 CPU_1.CLA.pr_1.b2]*)
如以下代码所示、在输入单个 NOP 指令后、公式的最后一行正常工作。
cpu_and_cla.r_pr[1].xn2 = cpu_and_cla.r_pr[1].xn1; cpu_and_cla.r_pr[1].xn1 = cpu_and_cla.r[1].xn0;cpu_and_cla.r.pr[1].xn1 = cpu_and_cla_pr.r1.r1].r.r_r_r.r_r1[r_r_r_r.r_r.r_r.r_r_r_r.r_r.r_r.r_r_r1]1; cpu_r_r_r_r_r_r_r_r_r_r_cla.r_r_r_r_r.r_r_r.r_r _mnop ();__mnop ();__mnop (); cpu_and_cla.r[1].yn0 =((cpu_and_cla0[1])*(cpu_and_cla.r_pr[1].xn0 - cpu_and_cla.r_pr.r_1.b1]]*(cpu_和 cla1.b1[cpu_r_1.b1.b1.])*(cpu_r_r_cla1.r_r_r_r_r.r_r_1.b1.b1.b1]-ca_r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r1[cpu_r.r1]-
但是、我使用了 您在以前的技术论坛之一中建议的三条 NOP 指令、如下链接所示。
https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/355184#pi320995=1
谢谢、
Dushyant Rana
Dushyant、
如果没有装配体、则很难确定在执行什么操作。
但是、如果您的反汇编使用了 MMOVD32指令、则可能会遇到此错误:
https://sir.ext.ti.com/jira/browse/EXT_EP-9923
遗憾的是、18.1.0.x.LTS 版本没有修复。
请使用18.12.7.LTS 或20.2.3.LTS 进行测试
如果问题消失、并且您的反汇编具有 MMOVD32指令、则我希望这是问题、而不是 CodeGen-3676
此致
Greg