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在c代码中进行了赋值,然后触发CLA执行任务,在CLA任务中执行Func1函数去读取变量a的值,发现此时a的值已经变成0了;
当我将Func1函数注释掉,直接去读a的值时又是正确的,而Func1函数只是执行一些if语句的判断。
所以在这里有一个疑问,有哪些原因会导致变量a在c代码中赋值而执行CLA时变量a的值是错误的,不再是c代码中写入的值。
我看了一下,这贴子说的是无法在 expressions window更新变量值,我的问题是我在 expressions window能看到有更新值,但实际CLA在调用函数读取的时候的值为0
请把这里修改一下,更严谨一些,我们把各种因素排除一下。
以及这里:
如果section只被分配给1个memory,单个 ’>‘ 就可以了。
也请检查一下map文件,a是否被正确放置在了相关段,相关段的分配是否符合预期。
请把这里修改一下,更严谨一些,我们把各种因素排除一下。
这里我是参考例程的写法
也请检查一下map文件,a是否被正确放置在了相关段,相关段的分配是否符合预期。
我检查过了,都是正常的
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->protect.mark;代码时,FaultState变量值为0,同样claPara->Speed变量也是一样。但claPara结构体中部分变量又能正常读取。