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:非主 CLA 读取违例

Guru**** 2524550 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1383964/tms320f28388d-non-master-cla-read-violation

器件型号:TMS320F28388D
Thread 中讨论的其他器件:C2000WARE

工具与软件:

你好支持团队、

我的测试设置基于 TI 提供的示例: generateNonMasterCLAReadViolation from C2000Ware_4_01_00_00\libraries\diagnostic\f2838x\examples\sdl_ex_ram_access_protection.c

在 链接器脚本中、我在 LS0中链接了 ls6Data、而 LS0设置为仅 CPU。 LS1具有 .scratchpad 并设置为 CLA 数据。 LS5、LS6、LS7设置为 CLA 程序、 Cla1Task1在 LS5中具有运行地址。

但在测试过程中、我注意到测试仅在调试会话期间通过、 当我拔下调试器、重启硬件、再次连接调试器时、我看到测试失败。

有什么原因呢?

谢谢。

BR

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

    您好!

    为了澄清、您对 f2838x_ram_access_protect_ram_lnk_cpu1.cmd 文件进行了更改、这是正确的吗? 如果您尝试使用原始链接器 cmd 文件进行下电上电、那么您是否看到同样的问题?

    此致、

    Delaney

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

    您好!

    很抱歉,这是失败从我的一方。 我没有注意 CLA 只能从 RAM 运行代码。 我将代码从闪存复制到 RAM、CLA 任务可以运行、测试正常工作。

    另一个问题与非主 CLA 读取违例相关。 在 TI 的测试代码中、它在 CLA 任务中编码为读取变量。 在此处粘贴代码以供参考。

    #include

    extern 易失性 uint32_t ls6Data

    /* Cla1TaskForSRAM10 -对它不应访问的变量执行读取的任务代码。 */

    __attribute__(((interrupt)) void Cla1TaskForSRAM10 (void)
      uint32_t 测试
      测试= ls6Data
      TEST++
    }
    在编译和链接期间、ls6Data 只能位于一个特定的 LS RAM 区域(例如 ls0)中。 这意味着只能测试一个 LS RAM 部分。  
     
    如果需要测试所有 LS RAM 部分、则可以为每个 LS RAM 部分定义多个全局变量、例如、ls0Data 位于 LS0 RAM 中、ls1Data 位于 LS1 RAM 中、等等。 我想这种方法会起作用,我还没有尝试过。
    我尝试过的另一种方法是将全局 ls6Data 定义为 uint32_t 指针、因此在运行时可将指针配置为指向不同的 LS RAM 段。 代码为:
    #include  

    extern  volatile  uint32_t*  lsDataPtr

    /* Cla1TaskForSRAM10 -对它不应访问的变量执行读取的任务代码。 */

    __attribute__(((interrupt))  void  Cla1TaskForSRAM10 (void)
       uint32_t  测试
       测试 = * lsDataPtr
       TEST++
    }

    例如、在测试运行之前的运行期间、可以为 lsDataPtr 分配起始地址 LS0 (0x00008000)、然后将 LS0 RAM 配置为仅 CPU。 测试运行时、预期 CLA 读取0x00008000的内容、并触发非主 CLA 读取违例。 但不会触发违例。  

    原因是什么?  

    谢谢。  

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

    您好!

    很高兴您能够解决原始问题。 正确、CLA 必须从它有权访问的 LSRAM 中运行代码。 对于 F2838x、CLA 可以访问所有 LSRAM 1-7 (此信息可在器件数据表的功能方框图中找到)。  

    您在这里显示的是哪个示例代码? 您能否提供 C2000ware 路径、我先看一下?

    此致、

    Delaney

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

    c2000\C2000Ware_4_01_00_00_STL\libraries\diagnostic\f2838x\examples\sdl_ex_ram_access_protection\f2838x_sdl_ex_ram_access_cla_read.cla

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

    您好、Chao、

    谢谢、我会回顾一下并回复您。

    此致、

    Delaney

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

    我认为这种方法应该可行。 您能否共享此代码的 CPU 端、以说明如何更新 lsDataPtr 以及如何配置 RAM 访问模式? 如果 CPU 负责更新 lsDataPtr 指向的地址、lsDataPtr 变量本身是否位于 CLA 可以访问(但当然不是指向的数据)的共享存储器中?

    惠特尼

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

    您好、下面显示了代码的大致工作方式:

    /template.c:
    typedef 结构

    uint8_t ViolationType;/*!<存储测试类型*/
    uint32_t* ViolationStartAddress;/*!<存储测试违规的地址。 */
    FunctionPtr functionPtr;/*!< CLA 任务函数 ptr */
    } CONFIG_T;

    /templateCLA.cla:
    extern volatile uint32_t* lsDataPtr;

    /* Cla1Task -执行对其不应访问的变量读取的任务代码。 */

    __attribute__(((interrupt)) void Cla1Task (void)

    uint32_t 测试;
    测试=* lsDataPtr;
    TEST++;
    }

    /setup.c:
    #pragma DATA_SECTION (lsDataPtr、"在 LS7数据存储器中")
    Volatile uint32_t* lsDataPtr;

    CONFIG_T LS0Setup =

    .ViolationType =非主 CLA 读取违例、
    .ViolationStartAddress = lsDataPtr、
    functionPtr = Cla1Task;
    }

    CONFIG_T LS1SETUP =

    .ViolationType =非主 CLA 读取违例、
    .ViolationStartAddress = lsDataPtr、
    functionPtr = Cla1Task;
    }
    .
    .
    .

    空 NMCLAReadPreHook()

    交换机(whichLSSection)

    将 LS7配置为 CLA 数据存储器();
    将相关 LS 配置为 CLA 暂存区();
    配置相关的 LS 作为 CLA programmm memory();
    用例 LS0:
    lsDataPtr =(uint32_t*)((uintptr_t)(0x00008000UL);
    将 LS0配置为仅 CPU ();
    休息;
    案例 LS1:
    lsDataPtr =(uint32_t*)((uintptr_t)(0x00008800UL);
    将 LS1配置为仅 CPU ();
    休息;
    ...
    默认值:
    休息;
    }
    }

    空 RunTest()

    /**/
    }

    /main.c:
    void main(){
    基于配置(LS0Setup、LS1Setup...) 决定变量 whichLSSection ();
    NMCLAReadPreHook();
    注册 Cla1Task CLA Task1();
    软件触发 CLA task1();
    }

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

    我不会发现该结构有任何问题。 你能够在 CLA 任务中放置一个断点并确认它按预期执行吗?

    惠特尼