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:读取和写入有关 CPU 和 CLA 之间共享变量的问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1279947/tms320f28388d-reading-and-writing-issue-about-shared-variables-between-cpu-and-cla

器件型号:TMS320F28388D

大家好、

以下是客户需要您帮助的问题:

我在 调试 CPU1和 CPU1.CLA 的共享变量时遇到问题。

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

以上是我的项目代码的近似配置。  当为变量时 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代码吗?

    此致、

    维纳

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

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    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--;
    }
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    claPara 是 cla_shard 中定义的结构变量、claPara->protect.mark 是枚举变量。 当 CPU1参数已初始化且未执行任何写入操作时、已设置非0值。  但是、当执行 FaultState = claPara->protection.mark;代码时、FaultState 变量值为0、claPara->Speed 变量的值也是如此。 然而、claPara 结构中的某些变量可被正常读取。