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.

[参考译文] TMS320F28069:如何在 CPU 和 CLA 之间共享变量

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/718573/tms320f28069-how-to-share-variables-between-cpu-and-cla

器件型号:TMS320F28069
主题中讨论的其他器件:C2000WARE

我从 ISR 调用 Task1、如下所示:

_interrupt void
adc_isr1 (空)

ADCValue_PWM1B = AdcResult.ADCRESULT0;
Cla1ForceTask1();

AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//为下一个 SOC 清除 ADCINT1标志*/
PieCtrlRegs.PIEACK.all = PIEACK_Group1;//确认 PIE 中断


在 CLA 中、我将按如下方式修改 ADC 值:

_interrupt void
Cla1Task1 (空)

_mdebugstop();
ADCValue1= ADCValue_PWM1B*3;


然而、ADCValue1的值在 main 中不会改变、我一直读取0。 任何人能否就如何在 CPU 和 CLA 之间共享变量提出建议?

下面是我在 shared_data.c 中定义变量的方式:

#pragma DATA_SECTION (ADCValue_PWM1B、"CpuToCla1MsgRAM");
UINT16 ADCValue_PWM1B;

#pragma DATA_SECTION (ADCValue1、"Cla1ToCpuMsgRAM");
uint16 ADCValue1;

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

    您似乎正确使用了#pragma。 您能否确认这些内容是否位于.map 文件的正确部分。

    由于任务1中有 mdebugstop、因此可以连接 CLA 目标和单步执行以查看汇编代码正在执行的操作及其访问的地址。

    单步执行时、您会看到什么?

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

    我认为我在这里遇到了数据类型问题:

    _interrupt void
    Cla1Task1 (void){
      _mdebugstop();

      ADCValue1=(浮点) ADCValue_PWM1B*2;


    在调试器中、我发现 ADCValue_PWM1B=485 (这是我对 ADC 的预期)、但当我进一步执行时、我得到一个值:对于 ADCValue1为1905092393。

    以下是我的变量声明:

    #pragma DATA_SECTION (ADCValue_PWM1B、"CpuToCla1MsgRAM");
    长 ADCValue_PWM1B;

    #pragma DATA_SECTION (ADCValue1、"Cla1ToCpuMsgRAM");
    长 ADCValue1;


    unsigned long y;  

    有什么意见?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这里有一些问题。 我将 ADValue1声明为浮点值,并尝试执行下面的基本计算,但它没有给出正确的答案,我得到了一些巨大的数字,如-5.29.... e+32。 有人能告诉我为什么会发生这种情况? 它是 CLA 配置吗?

    _interrupt void
    Cla1Task1 (空)

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

    对于某些数据类型、CLA 和 C28x 具有不同的数据类型大小。 请参阅编译器用户指南 :www.ti.com/.../spru514p.pdf

    最好使用中的标准 int 类型

    您能否布置"ADCValue1 = 1.2 + 1.1;"的汇编?

    此外、当您单步执行代码时、您会看到什么? 您可以将一个__mdebugstop()添加到任务的开始位置。

    此外、如何在头文件中向 CLA 声明这些变量? 这可能是问题的一部分。 CLA 代码需要在其中声明这些变量的头文件。

    此致、
    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我现在解决了这个问题。

    这个 CLA 任务从一个 ADC ISR 内调用。 现在、尽管我在正确的时间获得 ADC 中断、此任务似乎只被调用一次。 这是否与我必须清除 CLA 内任务的任何位有关?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经分配了一个 ADC 来触发一个 CLA 任务: AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;我已经注意到 CLA 只被调用一次? 有人能告诉我可能缺少什么吗?

    _interrupt void
    Cla1Task1 (空)

      _mdebugstop();
      ADCValue_PWM1B = AdcResult.ADCRESULT0;
      ADCValue1= ADCValue_PWM1B*2;

    _interrupt void
    cla1_Task1_ISR (空)

       AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
       PieCtrlRegs.PIEACk.bit.ACK11 = 1;



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否已将调试器连接到 CLA? 如果执行此操作、它将在 mdebugstop 处停止、并且不会再次触发。

    确保它未连接、并且应连续触发。 一旦 CLA 命中由编译器在任务结束时自动插入的 MSTOP、CLA 将停止运行并等待另一个触发器再次开始运行。

    如果不再次触发、您可以查看 MIER 和 MIRUN 寄存器以帮助开始调试。

    希望这对您有所帮助、
    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复! 我仍在调试这个、我将更新您。

    是否可以在 CLA 任务内切换 GPIO;我需要这种方法进行调试、以确保我确实在正确的时间访问 CLA。

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

    是的、CLA 作为对 GPIO 的访问。 您可能需要为此器件上的主器件授予 CLA 对引脚的访问权限。

    此外、请参阅 C2000Ware 中的 CLA 数学库示例和其他 CLA 示例、这些示例应该会有所帮助。

    此致、
    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在 ADC ISR 中添加了以下代码、并且正在按预期调用 CLA。 任何人能否解释这段代码与触发 CLA 任务有什么关系?

    EALLOW;
    Cla1Regs.MMEMCFG.ALL |= CLA_PROG_ENABLE;
    EDIS;

    在 main()中,我已经调用了:
    EALLOW;
    Cla1Regs.MMEMCFG.ALL = CLA_PROG_ENABLE|CLARAM0_ENABLE|CLARAM1_ENABLE|CLARAM2_ENABLE|CLA_RAM2_ENABLE|CLA_RAM1CPUE;
    Cla1Regs.MCTL.bit.IACKE = 1;
    EDIS;


    adc_isr1 (空)

    AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; /*为下一个 SOC 清除 ADCINT2标志*/
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1; /*确认 PIE 中断*/

    EALLOW;
    Cla1Regs.MMEMCFG.ALL |= CLA_PROG_ENABLE;
    EDIS;

    Cla1ForceTask1();

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

    您之前似乎没有启用 CLA 程序 RAM。 通过不启用它、CLA 无法获取 CLA 程序、这导致 CLA 不执行任务1中的代码、随后可能在无限循环中挂起、并且永远不会再次触发。 如果程序 RAM 未被启用、那么 CLA 无法获取指令、包括将暂停 CLA 任务并使其再次被触发的 MSTOP、

    希望这对您有所帮助!
    SAL