工具/软件:
尊敬的 TI 专家:
我在应用程序中的 CLA 实现存在问题。 我使用从闪存运行的 TMS320F280039C、具有由 ADCA1和 ADCA2触发的两个 CLA 任务。
在一个特定的示例板上、Cla1ToCpuMsgRAM 中的所有变量始终返回零值。 但是、如果我将电路板连接到 CCS 并在调试模式下运行它、Cla1ToCpuMsgRAM 变量会返回正常的预期值。 一旦我断开与 CCS 调试模式的连接、执行电源复位并从闪存引导、问题就会再次出现:所有 Cla1ToCpuMsgRAM 变量返回零。
在 CPU 上运行的其余应用程序似乎正常工作。
我的问题是:这是否表示可能存在 MCU 或硬件缺陷、或者我的 CLA 实施是否存在问题?
下面是有关如何初始化 CLA 的更多信息:
如果您想添加或澄清任何细节、请告诉我!
CLA 初始化
/* CLA to CPU Main Control */ typedef struct { float32_t adc_processed_value_1; float32_t adc_processed_value_2; float32_t adc_processed_value_3; float32_t adc_processed_value_4; float32_t adc_processed_value_5; } cla2cpu_main_t; #pragma DATA_SECTION(cla2cpu_main, "Cla1ToCpuMsgRAM"); cla2cpu_main_t cla2cpu_main; void Init_cla(void) { extern uint32_t Cla1ProgRunStart, Cla1ProgLoadStart, Cla1ProgLoadSize; memcpy((uint32_t *)&Cla1ProgRunStart, (uint32_t *)&Cla1ProgLoadStart, (uint32_t)&Cla1ProgLoadSize); EALLOW; CpuSysRegs.PCLKCR0.bit.CLA1 = 1; MemCfgRegs.LSxMSEL.bit.MSEL_LS3 = 1; MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS3 = 1; MemCfgRegs.LSxMSEL.bit.MSEL_LS4 = 1; MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS4 = 1; MemCfgRegs.LSxMSEL.bit.MSEL_LS5 = 1; MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS5 = 0; #pragma diag_suppress = 770 CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_2, (uint16_t)&Cla1Task1); CLA_setTriggerSource(CLA_TASK_2, CLA_TRIGGER_ADCA1); CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_3, (uint16_t)&Cla1Task2); CLA_setTriggerSource(CLA_TASK_3, CLA_TRIGGER_ADCA2); #pragma diag_warning = 770 CLA_disableBackgroundTask(CLA1_BASE); CLA_enableIACK(CLA1_BASE); CLA_enableTasks(CLA1_BASE, CLA_TASKFLAG_8); asm(" IACK #0x0080"); asm(" RPT #3 || NOP"); while (Cla1Regs.MIRUN.bit.INT8 == 1) { }; CLA_enableTasks(CLA1_BASE, CLA_TASKFLAG_1); CLA_enableTasks(CLA1_BASE, CLA_TASKFLAG_2); CLA_enableTasks(CLA1_BASE, CLA_TASKFLAG_3); EDIS; }
链接器
MEMORY { BOOT_RSVD : origin = 0x00000002, length = 0x00000126 RAMM0 : origin = 0x00000128, length = 0x000002D8 RAMM1 : origin = 0x00000400, length = 0x000003F8 /* on-chip RAM block M1 */ // RAMM1_RSVD : origin = 0x000007F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ RAMLS0_2 : origin = 0x00008000, length = 0x00001800 //LS0, LS1, LS2 RAMLS3_4 : origin = 0x00009800, length = 0x00001000 //LS3, LS4 RAMLS5 : origin = 0x0000A800, length = 0x00000800 RAMLS6 : origin = 0x0000B000, length = 0x00000800 RAMLS7 : origin = 0x0000B800, length = 0x00000800 RAMGS0 : origin = 0x0000C000, length = 0x00001000 RAMGS1 : origin = 0x0000D000, length = 0x00001000 RAMGS2 : origin = 0x0000E000, length = 0x00001000 RAMGS3 : origin = 0x0000F010, length = 0x00000FE8 // RAMGS3_RSVD : origin = 0x000FFF8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ BOOTROM : origin = 0x003F8000, length = 0x00007FC0 SECURE_ROM : origin = 0x003F2000, length = 0x00006000 RESET : origin = 0x003FFFC0, length = 0x00000002 #ifdef __TI_COMPILER_VERSION__ #if __TI_COMPILER_VERSION__ >= 20012000 GROUP { /* GROUP memory ranges for crc/checksum of entire flash */ #endif #endif /* Flash sectors */ /* BANK 0 */ BEGIN : origin = 0x00080000, length = 0x00000002 FLASH_BANK0_SEC0_7 : origin = 0x080002, length = 0x007FFE FLASH_BANK0_SEC8_15 : origin = 0x088000, length = 0x008000 /* BANK 1 */ FLASH_BANK1_SEC0_3 : origin = 0x090000, length = 0x004000 FLASH_BANK1_SEC4_7 : origin = 0x094000, length = 0x004000 FLASH_BANK1_SEC8_11 : origin = 0x098000, length = 0x004000 FLASH_BANK1_SEC12_15 : origin = 0x09C000, length = 0x004000 /* BANK 2 */ FLASH_BANK2_SEC0 : origin = 0x0A0000, length = 0x001000 FLASH_BANK2_SEC1 : origin = 0x0A1000, length = 0x001000 FLASH_BANK2_SEC2 : origin = 0x0A2000, length = 0x001000 FLASH_BANK2_SEC3 : origin = 0x0A3000, length = 0x001000 FLASH_BANK2_SEC4 : origin = 0x0A4000, length = 0x001000 FLASH_BANK2_SEC5 : origin = 0x0A5000, length = 0x001000 FLASH_BANK2_SEC6 : origin = 0x0A6000, length = 0x001000 FLASH_BANK2_SEC7 : origin = 0x0A7000, length = 0x001000 /* FLASH_BANK2_SEC15_DO_NOT_USE : origin = 0x0AFFF0, length = 0x000010*/ /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ #ifdef __TI_COMPILER_VERSION__ #if __TI_COMPILER_VERSION__ >= 20012000 } crc(_ccs_flash_checksum, algorithm=C28_CHECKSUM_16) #endif #endif CLA1_MSGRAMLOW : origin = 0x001480, length = 0x000080 CLA1_MSGRAMHIGH : origin = 0x001500, length = 0x000080 } SECTIONS { codestart : > BEGIN, ALIGN(8) .text : >> FLASH_BANK0_SEC0_7 | FLASH_BANK0_SEC8_15 | FLASH_BANK1_SEC0_3, ALIGN(8) .cinit : > FLASH_BANK1_SEC4_7, ALIGN(8) .switch : > FLASH_BANK1_SEC4_7, ALIGN(8) .reset : > RESET, TYPE = DSECT /* not used, */ .stack : > RAMM1 .init_array : > FLASH_BANK1_SEC4_7, ALIGN(8) .bss : >> RAMLS6 | RAMLS7 | RAMGS0 .bss:output : > RAMLS6 .bss:cio : > RAMLS0_2 .data : >> RAMLS7 | RAMGS0 | RAMGS1 .sysmem : >> RAMLS6 | RAMLS7 .const : > FLASH_BANK1_SEC8_11, ALIGN(8) //ramgs0 : > RAMGS0 //ramgs1 : > RAMGS0 /* Allocate IQ math areas: */ IQmath : > FLASH_BANK1_SEC8_11, ALIGN(8) IQmathTables : > FLASH_BANK1_SEC8_11, ALIGN(8) // CLA Sections /* CLA specific sections */ Cla1Prog : LOAD = FLASH_BANK1_SEC12_15, RUN = RAMLS3_4, LOAD_START(Cla1ProgLoadStart), RUN_START(Cla1ProgRunStart), LOAD_SIZE(Cla1ProgLoadSize), ALIGN(8) .scratchpad : > RAMLS5 .bss_cla : > RAMLS5 Cla1ToCpuMsgRAM : > CLA1_MSGRAMLOW CpuToCla1MsgRAM : > CLA1_MSGRAMHIGH CLADataLS1 : > RAMLS5 .const_cla : LOAD = FLASH_BANK2_SEC0, RUN = RAMLS5, RUN_START(Cla1ConstRunStart), LOAD_START(Cla1ConstLoadStart), LOAD_SIZE(Cla1ConstLoadSize), ALIGN(4) GROUP { .TI.ramfunc { -l FAPI_F28003x_EABI_v1.58.01.lib} } LOAD = FLASH_BANK1_SEC12_15, RUN = RAMLS0_2, LOAD_START(RamfuncsLoadStart), LOAD_SIZE(RamfuncsLoadSize), LOAD_END(RamfuncsLoadEnd), RUN_START(RamfuncsRunStart), RUN_SIZE(RamfuncsRunSize), RUN_END(RamfuncsRunEnd), ALIGN(8) /* crc/checksum section configured as COPY section to avoid including in executable */ .TI.memcrc : type = COPY }
lib: cla2_math_library_dataom_fpu32_eabi.lib