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.

[参考译文] CCS/TMS570LS1224:如何将一段代码复制到指定的 RAM 区域并触发 MPU 操作保护?

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/781587/ccs-tms570ls1224-how-to-copy-a-piece-of-code-to-the-specified-ram-area-and-trigger-mpu-operation-protection

器件型号:TMS570LS1224

工具/软件:Code Composer Studio

这方面没有相关的教程或代码、因为我们的 MPU 将某个区域配置为不可执行、并且希望通过将函数复制到此 RAM 区域来运行 MPU 保护。

基于上述理念、我想测试闪存是否可以实现 MPU 执行保护。 如下图所示,我在0x6220 (25120)的起始地址后将32个字节配置为不可执行的权限,然后在  程序中执行“TR1+(25112)”。  当启动 MPU 保护时、程序会跳转到"b prefetchEntry"。 那么、我想问的是、程序目前一直卡在"b prefetchEntry"中、如何进入相关的中断函数?

 闪存 MPU 配置:

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

    您好!

    链接器具有支持在一个地址分配段以进行加载的功能、以及支持在另一个地址分配执行的功能。  这样可以轻松地从加载地址复制到运行地址。  请参阅 CAN 引导程序的源代码、该程序将闪存 API 部分复制到 SRAM、并从 SRAM 执行闪存 API。

    1.链接器 CMD 文件:为闪存 API 定义一个段

    存储器

      引导程序  (X) :origin=0x00000000 length=0x00000020

      Flash_API (RX) :origin=0x00000020 length=0x000014E0

      FLASH0  (RX) :origin=0x00001500 length=0x00000500 //LS04x,RM42闪存大小为0x60000

      SRAM   (RW) :origin=0x08002000 length=0x00005000 //LS04x,RM42 SRAM 大小为0x8000

      … …

    部分

     .intvecs:{}>向量

     闪存 API:

     {

      bl_flash.obj (.text)

      (笑声) (笑声)

     }load = flash_API、run = SRAM、load_start (api_load)、run_start (api_run)、size (api_size)

     .text > FLASH0

     (笑声) (笑声)

    2.将 flashAPI 段从闪存复制到 SRAM:

    ;------------------------------------------------------------------

    ;将闪存 API 从闪存复制到 SRAM。

    .def _APIcopy2RAM_
    asmfunc

    copyAPI 2RAM_

    .ref API_load
    FLASH_LOAD .word API_LOAD
    .ref API_run
    FLASH_run .word API_run
    .ref API_size
    FLASH_SIZE .word API_SIZE

    LDR r0、FLASH_LOAD
    LDR R1、FLASH_RUN
    LDR R2、FLASH_SIZE
    添加 R2、R1、R2
    COPY_Loop1:
    LDR R3、[r0]、#4
    STR R3、[R1]、#4
    CMP R1、R2
    BLT COPY_LOOP1
    BX LR

    endasmfunc

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

    大家好、非常感谢您的回复。
    还有几个问题:


    1.您提到的 CAN 引导程序源代码在哪里?


    bL_flash.obj (.text)是否引用 bi-flash.c 文件?


    3.目前,我们想把一个函数(而不是 c 文件)放入一个要运行的 RAM 中,需要做些什么?


    4、我想在闪存(RO)的某个区域执行 MPU 触发保护我设置了、我需要如何测试? 如何将数据写入指定地址 μ?的闪存

    或者您的电子邮件地址是什么? 我们可以通过电子邮件向您提出问题吗?

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

    1.源代码的链接包含在用户指南中:
    www.ti.com/.../spna186.pdf

    2.是的、bl_flash.obj 是 bi_flash.c 的目标文件

    3.您可以将一个函数放置到 RAM 中并从 RAM 中执行该函数。
    processors.wiki.ti.com/.../Placing_functions_in_RAM

    4.您必须使用闪存 API 来擦除/编程闪存。 用户指南位于 API 安装文件夹中:
    www.ti.com/.../F021FLASHAPI
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您的回复
    对于第三个问题、您能否举一个例子:
    例如、我现在在 main.c 中有一个 void fFun (void){...}的函数、那么我如何复制该函数(仅需要此函数,因为您之前的恢复似乎是将整个.c 文件复制到 RAM 中、我现在只需要一个函数。) RAM 地址0x08003CFC 开始运行的地址?
    期待您的回复!

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

    在 C 函数中:

    #pragma SET_CODE_SECTION (".blinky_section")
    空闪烁()

    int i;
    gioSetDirection (hetPORT1、1);
    while (1)

    gioToggleBit (hetPORT1、0);
    for (i=0;i<1000000;i++);


    #pragma SET_CODE_SECTION ()

    在链接器 cmd 文件中:

    --retain ="*(.blinky_section)"

    blinky_section:run=SRAM,load=FLASH0
    load_start (bkstart)、load_end (bkend)、load_sZIE (bksize)、
    run_start (runstart)、run_end (runend)。