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.
大家好、
以下是客户需要您帮助的问题:
我在 调试 CPU1和 CPU1.CLA 的共享变量时遇到问题。
/*CPU1 .c file */ #pragma SET_DATA_SECTION("cla_shared") int32_t a = 10; #pragma SET_DATA_SECTION() // // Configure LSRAMs // MemCfg_setLSRAMControllerSel(MEMCFG_SECT_LS0, MEMCFG_LSRAMCONTROLLER_CPU_CLA1); MemCfg_setCLAMemType(MEMCFG_SECT_LS0, MEMCFG_CLA_MEM_DATA); MemCfg_setLSRAMControllerSel(MEMCFG_SECT_LS1, MEMCFG_LSRAMCONTROLLER_CPU_CLA1); MemCfg_setCLAMemType(MEMCFG_SECT_LS1, MEMCFG_CLA_MEM_DATA); /*CPU1 .cmd file */ CLA_SCRATCHPAD_SIZE = 0x100; --undef_sym=__cla_scratchpad_end --undef_sym=__cla_scratchpad_start CLAscratch : { *.obj(CLAscratch) . += CLA_SCRATCHPAD_SIZE; *.obj(CLAscratch_end) } > RAMLS1 .scratchpad : > RAMLS1 .bss_cla : > RAMLS1 cla_shared : >> RAMLS1 /*CPU1 CLA shared.h */ extern int32_t a; /*CPU1_CLA .cla file */ void Func1(void);
以上是我的项目代码的近似配置。 当为变量时 A 在 CLA 和 CPU 共享 LSRAM 中定义、 A 指定单个 PHI 地址、然后触发 CLA 以执行任务。 执行 CLA 任务中的 Func1函数以读取变量的值 A ,并找到 A 已在此时变为0。
当我注释掉 Func1函数并直接读取 A 而 Func1函数仅执行一些 if 语句判断,这同样是正确的。
Func1在.cla 文件中定义、并直接由.cla 文件中的 CLAtask1 ()函数调用。 优化级别为3。 如果将其关闭、存储器将溢出。
为什么会发生这种情况?
--
谢谢、此致
耶鲁
你好,耶鲁,
您能否尝试向变量 a 添加 volatile 关键字。让我们确保它不是由于该变量周围的任何编译器优化所致。
此致、
维纳
您好、 Veena:
客户已将其添加、并关闭了编译器优化。 结果与上述描述相同。
--
谢谢、此致
耶鲁
有可能共享 Func1代码吗?
此致、
维纳
if((claPara->RunMode != 3) && (RunState ==2) && !FaultState) { if(claPara->spd.Err > claPara->Speed) { claPara->protect.Cnt++; if(claPara->protect.Cnt >= 1600) { GPIO_writePin(mGPIO_PIN_LED12, 0); FaultState = claPara->protect.mark; } } else { if(claPara->protect.Cnt > 0) { ptAxis_claPara->protect.Cnt--; } } }
claPara 是 cla_shard 中定义的结构变量、claPara->protect.mark 是枚举变量。 当 CPU1参数已初始化且未执行任何写入操作时、已设置非0值。 但是、当执行 FaultState = claPara->protection.mark;代码时、FaultState 变量值为0、claPara->Speed 变量的值也是如此。 然而、claPara 结构中的某些变量可被正常读取。