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.

[参考译文] 编译器/TMS320F28388D:当代码大小达到特定大小时、CLA 任务不运行

Guru**** 2540720 points
Other Parts Discussed in Thread: TMDSCNCD28388D

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/894147/compiler-tms320f28388d-cla-task-does-not-run-when-code-size-reaches-certain-size

器件型号:TMS320F28388D
主题中讨论的其他器件:TMDSCNCD28388DC2000WARE

工具/软件:TI C/C++编译器

评估板: F28388D controlCARD (TMDSCNCD28388D)  

运行控制算法 CLA1并使用 GPIO28来确认 CLA 任务1正在定期执行。

当 CLA 代码大小为特定大小时、CLA-Task1运行。  但是、一旦我通过添加单个 MNOP 来增加代码大小、CLA-Task1就不再运行、因为 GPIO28不会切换。

(请参阅下面的注释掉 MNOP)

除可用内存外、CLA 不应对任务代码大小有任何限制。

在映射文件中、一旦 ClaTask1从0x54c 变为0x54e。  或 Cla1Prog 从0x584到0x586 CLA 任务不运行。

以下是一些支持信息:

编译器和链接器选项:

-v28 -ml -mt --cla_support=cla2 -float_support=fpu64 -idiv_support=idiv0 -tmu_support=tmu0 -vcu_support=vcu2 -O2 -opt_for_speed=2 -fp_mode=relaxed -fp_reassoc=on -vcu/gen3 -vcus/gencontent/texclintrends/gencontent/gencontent/包含/ti/ccs930/ccs/tools/compiler/ti-cgt-c2000_18.12.5.LTS/include -包含-包含-包含-p3_content/gencontent/gencontent/gencontent/texclinc/包含-content/gencontent/gencontent/texclinc/包含-content/gencontent/gencontent/gencontent/tex-content/gencontent/tex-content/tex-content/包含-content/gencontent/gencontent/tex-content/包含-content/gencontent/tex-sinc"–包含-content/texclinc/包含-content/tex-content/gencontent/tex-content/包含-content/gencontent/texclintr/tex-content/tex-content/gen3–包含-content/gencontent/

-v28 -ml -mt --cla_support=cla2 -float_support=fpu64 -idiv_support=idiv0 --tmu_support=vcu_support=vcu2 -O2 -opt_for_speed=2 -fp_mode=relaxed -fp_reassoc=on -vcu_support=vcubs=v-cla=v-ram_display_remote_display-命令-dag_subsize_display-ine-f=-命令-display_subsize_remote_display-命令-命令-f=-ine-dag_off-命令-命令-命令-***-命令-ine-dag_ine-dag_ines=-ine-dag_bulate-dag=-ine-dag=-ine-dag=-ine-dag_bi-display-dag_bi-display-dag_off-ine-dag_remote_remote_remote_display-ines=-ines=-dag-/ti/ccs930/ccs/tools/compiler/ti-cgt-c2000_18.12.5.LTS/include /ti/ccs930/ccs/tools/compiler/ti-cgt-c2000_18.12.5.LTS/lib

链接器文件:

存储器


/* begin 用于"引导至闪存"引导加载程序模式*/
开始:origin = 0x080000,length = 0x000002
BOOT_RSVD:origin = 0x000002,length = 0x0001AE // M0的部分,引导 ROM 将使用此栈*/
RAMM0M1:origin = 0x0001B0,length = 0x000648
// RAMM1_RSVD:origin = 0x0007F8,length = 0x000008 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超出有效内存的预取),保留并不用于代码*/

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

RAMLS0LS1:origin = 0x008000、length = 0x001000
RAMLS2LS3LS4LS5:origin = 0x009000,length = 0x002000
RAMLS6:origin = 0x00B000、length = 0x000800
RAMLS7:origin = 0x00B800,length = 0x000800

RAMD0:origin = 0x00C000、length = 0x000800
RAMD1:origin = 0x00C800,length = 0x000800

RAMGS0:origin = 0x00D000,length = 0x001000
RAMGS1:origin = 0x00E000、length = 0x001000
RAMGS2:origin = 0x00F000、length = 0x001000
RAMGS3:origin = 0x010000,length = 0x001000
RAMGS4:origin = 0x011000,length = 0x001000
RAMGS5:origin = 0x012000,length = 0x001000
RAMGS6:origin = 0x013000、length = 0x001000
RAMGS7:origin = 0x014000,length = 0x001000
RAMGS8:origin = 0x015000,length = 0x001000
RAMGS9:origin = 0x016000,length = 0x001000
RAMGS10:origin = 0x017000,length = 0x001000
RAMGS11:origin = 0x018000,length = 0x001000
RAMGS12:origin = 0x019000,length = 0x001000
RAMGS13:origin = 0x01A000,length = 0x001000
RAMGS14:origin = 0x01B000,length = 0x001000
RAMGS15:origin = 0x01C000,length = 0x000FF8
// RAMGS15_RSVD:origin = 0x01CFF8,length = 0x000008 //根据勘误咨询“Memory: pret撷取 超出有效内存”*/,保留并不用于代码

CPU1TOCPU2RAM:origin = 0x03A000,length = 0x000800
CPU2TOCPU1RAM:origin = 0x03B000,length = 0x000800
CPUTOCMRAM:origin = 0x039000,length = 0x000800
CMTOCPURAM:origin = 0x038000,length = 0x000800

CANA_MSG_RAM:origin = 0x049000、length = 0x000800
CANB_MSG_RAM:origin = 0x04B000、length = 0x000800

/*闪存扇区*/
FLASH0:origin = 0x080002,length = 0x001FFE /*片上闪存*/
FLASH1:origin = 0x082000,length = 0x002000 //片上闪存*/
FLASH2:origin = 0x084000、length = 0x002000 //片上闪存*/
FLASH3:origin = 0x086000、length = 0x002000 //片上闪存*/
FLASH4:origin = 0x088000、length = 0x008000 //片上闪存*/
FLASH5:origin = 0x090000,length = 0x008000 //片上闪存*/
Flash6:origin = 0x098000、length = 0x008000 //片上闪存*
FLASH7:origin = 0x0A0000,length = 0x008000 //片上闪存*/
FLASH8:origin = 0x0A8000、length = 0x008000 //片上闪存*/
FLASH9:origin = 0x0B0000,length = 0x008000 //片上闪存*/
FLASH10:origin = 0x0B8000、length = 0x002000 //片上闪存*/
FLASH11:origin = 0x0BA000、length = 0x002000 //片上闪存*/
FLASH12:origin = 0x0BC000、length = 0x002000 //片上闪存*/
FLASH13:origin = 0x0BE000、length = 0x001FF0 /*片上闪存*/
// FLASH13_RSVD:origin = 0x0BFFF0,length = 0x000010 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:有效内存之外的预取)来保留代码,不要将其用于代码*/

复位:origin = 0x3FFFC0,length = 0x000002

部分

codestart:>开始,align (4)
.text:>> FLASH1 | FLASH2 | FLASH3 | FLASH4、ALIGN (4)
.cinit:> FLASH4,align (4)
.switch:> FLASH1,ALIGN(4)
.reset:> reset,type = DSECT /* not used,*/
.stack:> RAMM0M1

#if defined (_TI_EABI)
init_array:> FLASH1,align (4)
.bss:>> RAMGS0 | RAMGS1,ALIG(4)
.bss:输出:> RAMGS0
.bss:CIO :>RAMGS0
.data :>RAMGS1
.sysmem:> RAMGS1
/*初始化段进入闪存*/
.const:> FLASH5、align (4)
其他
.pinit:> FLASH1,align (4)
.ebss:> RAMGS0
.esysmem:> RAMGS1
.cio:> RAMGS1
/*初始化段进入闪存*/
.econst:>> FLASH4 | FLASH5、ALIG(4)
#endif

#if defined (_TI_EABI)
.TI.ramfunc:{}负载= FLASH3,
运行= RAMD0、
Load_start (RamfuncsLoadStart)、
load_size (RamfuncsLoadSize)、
Load_End (RamfuncsLoadEnd)、
RUN_START (RamfuncsRunStart)、
run_size (RamfuncsRunSize)、
RUN_END (RamfuncsRunEnd)、
对齐(4)
其他
.TI.ramfunc:{}负载= FLASH3,
运行= RAMD0、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
对齐(4)
#endif

MSGRAM_CPU1_TO_CPU2:>CPU1TOCPU2RAM,type=NOINIT

MSGRAM_CPU2_TO_CPU1:>CPU2TOCPU1RAM,type=NOINIT
MSGRAM_CPU_TO_CM:> CPUTOCMRAM,type=NOINIT
MSGRAM_CM_TO_CPU:> CMTOCPURAM,type=NOINIT


/* CLA 特定部分*/

Cla1ToCpuMsgRAM:> CLA1_MSGRAMLOW,type=NOINIT

CpuToCla1MsgRAM:> CLA1_MSGRAMHIGH,type=NOINIT

暂存区:>RAMLS0LS1.

.bss_cla:> RAMLS0LS1
CPU1_cla1_shared:> RAMLS0LS1

#if defined (_TI_EABI)
const_cla:load = FLASH2,
运行= RAMLS2LS3LS4LS5、
RUN_START (Cla1ConstRunStart)、
Load_start (Cla1ConstLoadStart)、
load_size (Cla1ConstLoadSize)
其他
const_cla:load = FLASH2,
运行= RAMLS2LS3LS4LS5、
run_start (_Cla1ConstRunStart)、
Load_start (_Cla1ConstLoadStart)、
load_size (_Cla1ConstLoadSize)
#endif

#if defined (_TI_EABI)
Cla1Prog:load = FLASH7,
运行= RAMLS2LS3LS4LS5、
Load_start (Cla1funcsLoadStart)、
LOAD_END (Cla1funcsLoadEnd)、
run_start (Cla1funcsRunStart)、
load_size (Cla1funcsLoadSize)、
对齐(4)
其他
Cla1Prog:load = FLASH7,
运行= RAMLS2LS3LS4LS5、
load_start (_Cla1funcsLoadStart)、
load_end (_Cla1funcsLoadEnd)、
run_start (_Cla1funcsRunStart)、
load_size (_Cla1funcsLoadSize)、
对齐(4)
#endif

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

CLA 初始化代码

空 claHal_init (空)

extern uint32_t Cla1funcsRunStart、Cla1funcsLoadStart、Cla1funcsLoadSize;
extern uint32_t Cla1ConstRunStart、Cla1ConstLoadStart、Cla1ConstLoadSize;

EALLOW;

#ifdef _flash
memcpy (((uint32_t *)&Cla1funcsRunStart、(uint32_t *)&Cla1funcsLoadStart、
(uint32_t)和 Cla1funcsLoadSize);

memcpy (((uint32_t *)&Cla1ConstRunStart、(uint32_t *)&Cla1ConstLoadStart、
(uint32_t)和 Cla1ConstLoadSize);

#endif //_FLASH

MemCfgRegs.MSGxINIT.bit.init_CLA1TOCPU = 1;
while (MemCfgRegs.MSGxINITDONE.bit.INITDONE_CLA1TOCPU!= 1){};

MemCfgRegs.MSGxINIT.bit.init_CPUTOCLA1 = 1;
while (MemCfgRegs.MSGxINITDONE.bit.INITDONE_CPUTOCLA1!= 1){};

MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 0U;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS1 = 0U;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS2 = 1U;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS3 = 1U;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS4 = 1U;
MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS5 = 1U;

MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1U;
MemCfgRegs.LSxMSEL.bit.MSEL_LS1 = 1U;
MemCfgRegs.LSxMSEL.bit.MSEL_LS2 = 1U;
MemCfgRegs.LSxMSEL.bit.MSEL_LS3 = 1U;
MemCfgRegs.LSxMSEL.bit.MSEL_LS4 = 1U;
MemCfgRegs.LSxMSEL.bit.MSEL_LS5 = 1U;

#pragma diag_suppress 770

Cla1Regs.MVECT1 =(uint16_t)(&Cla1Task1);
Cla1Regs.MVECT2 =(uint16_t)(&Cla1Task2);
Cla1Regs.MVECT3 =(uint16_t)(&Cla1Task3);
Cla1Regs.MVECT4 =(uint16_t)(&Cla1Task4);
Cla1Regs.MVECT5 =(uint16_t)(&Cla1Task5);
Cla1Regs.MVECT6 =(uint16_t)(&Cla1Task6);
Cla1Regs.MVECT7 =(uint16_t)(&Cla1Task7);
Cla1Regs.MVECT8 =(uint16_t)(&Cla1Task8);
#pragma diag_default 770

DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.task1 = CLA_TRIGGER_ADCD1;

Cla1Regs.MIER 位 INT1 = 1U;

Cla1Regs.MCTL.bit.IACKE = 1;
Cla1Regs.MIER all = 0x00FF;

PieVectTable.CLA1_1_INT =&claHal_donesr1;
PieVectTable.CLA1_2_INT =&claHal_donesr2;
PieVectTable.CLA1_3_INT =&claHal_donesr3;
PieVectTable.CLA1_4_INT =&claHal_donesr4;
PieVectTable.CLA1_5_INT =&claHal_donesr5;
PieVectTable.CLA1_6_INT =&claHal_donesr6;
PieVectTable.CLA1_7_INT =&claHal_donesr7;
PieVectTable.CLA1_8_INT =&claHal_donesr8;

PieCtrlRegs.PIEIER11.all = 0xFFFF;
IER |=(M_INT11);


GPIO_setMasterCore (28、GPIO_CORE_CPU1_CLA1);

EDIS;

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

    您好!

    需要检查的事项:

    1. 任务是否至少运行一次?  
    2. 当任务未运行时、CLA 标志指示什么?  是否设置了标志? 是否设置了任务溢出标志?  中断的进入速度可能比中断完成速度快。
    3. 如果任务正由外设触发、您可以尝试使用软件触发任务并查看其是否运行。  这将指向问题是触发任务还是触发任务本身。  

    此致

    Lori

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

    感谢您的快速响应。  

    很棒的建议

    没有。任务甚至不会运行一次。

    2.当运行 ADCD4 EOC 被配置为触发 CLA 任务1时:

    CLA 寄存器:Mier=0xff、MIF=0、MIOVF=0

    CPU1寄存器:IER=0x1401、IFR=0、PIEIER1=0x5d、PIEIFR1=0x20、ADC4Regs:ADCINTSEL1N2=0x24、 ADCINTFLG=0x1、ADCINTOVF=0x01

    看起来我有一个 ADCINT1溢出。

    3.我添加了一个调用以强制任务在 mainloop 中运行、并且它正常工作。  CLA 任务从 ADC EOC 中断开始定期运行。

    看起来在设置中断/清除标志时存在一些时序问题。

    代码大小问题必须是一个红鲱鱼、它改变了我在将 Cla1Prog 从闪存复制到存储器时的计时。

    感谢给出的出色建议、我将更深入地研究中断、并返回到我的结果中的这个主题。

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

    我将 CLA_init()代码移到了 ADC_init()代码之前,一切正常。

    device_init();
    claHal_init ();<<<新 CLA 初始化
    sciHal_init();
    gpioHal_init();
    DIO_INIT();
    pwmHal_init();
    adcHal_init ();<<< ADC 初始化
    dachal_init();
    CTRL_init();
    timerHal_init();
    // claHal_init ();<<<原始 CLA 初始化、具有 ADC int OVF
    
    EINT;
    ERTM; 

    即使 Cla1Prog 大小为0x101a、它现在也能正常工作。

    谢谢!!