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.

[参考译文] TMS570LC4357:将函数移至 RAM

Guru**** 2468610 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1030220/tms570lc4357-moving-a-function-to-ram

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

我正在尝试移动 ISR、稍后再移动更多代码、以从 RAM 执行、但我正在获取数据中止。 我看到这已经在其他 E2E 对话中介绍过、
我相信我已经阅读了所有这些内容、但我仍然缺少一些东西。

我正在使用 HalCogen 来生成所有非用户代码、并且代码在闪存中无例外地运行。 我只做了以下更改来在 RAM 中放置一个 ISR:

在 HalCoGen 中、将 MPU 中的 RAM 设置为 PRIV_RW_USER_RW_EXEC。

在 cmd 文件中、添加了以下行:
RAMFUNC (rwx):origin=0x08070000 length=0x00010000
binit align (32):{}> FLASH0 | FLASH1
.TI.ramfunc align (32):{}load=FLASH0,run=RAMFUNC,table (BINIT)

在我的 ISR 之前、我有:
#pragma CODE_SECTION (func、".TI.ramfunc")

请注意、我没有--ramfuncs=on (因为它会将所有函数移动到 RAM)、并且我没有单独的 memcopy (要将函数复制到 RAM)、这与 C2000不是必需的?

我看到映射文件中的 RAM 分配、我可以使用调试器单步执行 ISR (在 RAM 中)、但单击运行将导致数据中止、 这似乎发生在 ISR 中的不同代码行。

另请注意、ARM 汇编语言工具 v20.2.0.LTS 中有一个 Wiki 用于"在 RAM 中放置函数"、但 URL 指向常规 编译器和汇编语言工具页面、因此 pdf 基本上指向自己以获取帮助。

对我在这里错过的内容有什么想法吗?

谢谢、

Jim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="2713" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1030220/tms570lc4357-moving-a-function-to-ram 文件]我在映射文件中看到 RAM 分配、我可以使用调试器单步执行 ISR (在 RAM 中)、但单击"运行"将导致数据中止、 这似乎发生在 ISR 中的不同代码行。

    我在  TMS570LC4357中设置 TMS570LC4357_sin_cos.zip 示例时遇到了类似的问题:最快的正弦/余弦代码函数、其中该示例还使用 ramfunc 将代码复制到 RAM 中。

    source/hl_sys_main.c 中 main()函数中的以下内容包含在程序调用复制到 RAM 中的任何函数之前应用的修复:

        /* In _c_int00() _cacheEnable_() is called before __TI_auto_init().
         * I.e. the cache is enabled by the time ramfuncs are copied from FLASH to SRAM, which is effectively self-modifying code.
         * Therefore, need to clean the cache to write-back the ramfuncs into SRAM so that the correct contents is loaded into the
         * instruction cache when the functions are called.
         *
         * Without this cache clean attempting to call the ramfuncs resulted in a pre-fetch abort.
         */
        cache_clean ();

    而 cache_clear()函数的代码为:

    // Clean the data cache.
    // ARM Architecture Reference Manual
    // B2.2.7 (B2-1286) Performing Cache Maintenance Operations
    // From e2e.ti.com/.../incorrect-cache-enable-disable-procedure-in-rm57-technical-reference-manual
    asm("CONST_3FF  .word 0x3ff");
    asm("CONST_7FFF .word 0x00007fff");
    
    #define CACHE_CLEAN \
        asm(" MRC p15, #1, r0, c0, c0, #1");  \
        asm(" ANDS R3, R0, #0x07000000");     \
        asm(" MOV R3, R3, LSR #23");          \
        asm(" BEQ Finished");                 \
        asm(" MOV R10, #0");                  \
        asm("Loop1:");                        \
        asm(" ADD R2, R10, R10, LSR #1");     \
        asm(" MOV R1, R0, LSR R2");           \
        asm(" AND R1, R1, #7");               \
        asm(" CMP R1, #2");                   \
        asm(" BLT Skip");                     \
        asm(" MCR p15, #2, R10, c0, c0, #0"); \
        asm(" ISB");                          \
        asm(" MRC p15, #1, R1, c0, c0, #0");  \
        asm(" AND R2, R1, #7");               \
        asm(" ADD R2, R2, #4");               \
        asm(" LDR R4,  CONST_3FF");           \
        asm(" ANDS R4, R4, R1, LSR #3");      \
        asm(" CLZ R5, R4");                   \
        asm(" MOV R9, R4");                   \
        asm("Loop2:");                        \
        asm(" LDR R7, CONST_7FFF");           \
        asm(" ANDS R7, R7, R1, LSR #13");     \
        asm("Loop3:");                        \
        asm(" ORR R11, R10, R9, LSL R5");     \
        asm(" ORR R11, R11, R7, LSL R2");     \
        asm(" MCR p15, #0, R11, c7, c10, #2");\
        asm(" SUBS R7, R7, #1");              \
        asm(" BGE Loop3");                    \
        asm(" SUBS R9, R9, #1");              \
        asm(" BGE Loop2");                    \
        asm("Skip:");                         \
        asm(" ADD R10, R10, #2");             \
        asm(" CMP R3, R10");                  \
        asm(" BGT Loop1");                    \
        asm(" DSB");                          \
        asm("Finished:")
    
    void cache_clean(void)
    {
        CACHE_CLEAN;
    }

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

    哇、我从来没找到过这种情况;我看到了您的 cache_clean、但认为它与速度测试代码有关、当然我错过了您写的好评论;再次感谢。

    Jim