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.

[参考译文] TMS320F28379D:memcpy 命令将在 RAM 配置中工作??

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/609516/tms320f28379d-memcpy-command-will-work-in-ram-configuration

器件型号:TMS320F28379D

大家好、

如果从 RAM 引导 MCU (即编译配置为 RAM)、则 memcpy 无法正常工作、应用程序将崩溃、添加 了 rts2800_fpu32.lib。

请告诉我如何解决该问题。

看起来、如果要在 RAM 模式下调试 memcpy、需要在汇编语言中实现 memcpy、对吗?

谢谢

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

    您如何确认 memcpy()调用导致应用程序崩溃? 例如,如果删除了 memcpy()调用,应用程序是否正常运行? 在单步执行代码以进行调试时,应用程序是否会在程序到达 memcpy()或代码中的其他位置时立即崩溃?

    为了澄清一下、您是否意味着添加 rts2800_fpu32.lib 时应用程序将崩溃? 如果是、如果排除了该库、应用程序是否运行正常?

    建议检查 memcpy()使用的缓冲区在内存中的位置。 它们是如何分配的? 您能否检查链接器命令文件?

    我还建议您检查是否使用最新的编译器版本,如 TI v16.9.x.LTS。

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

    感谢您的回复。
    memcpy 肯定会导致应用程序崩溃,因此 memcpy 调用 added 以便复制循环逻辑,没有问题。
    memset 正在工作、看起来链接器文件需要更改。
    为了适应我的应用、我修改了链接器部分、请在下面找到链接器文件、缓冲区大小不大、所有这些都可能小于50字节。 如果您知道该修复程序、请告诉我。

    (小部分
    存储器

    第0页:
    /* begin 用于"引导至 SARAM"引导加载程序模式*/

    开始:origin = 0x000000,length = 0x000002
    RAMM0:origin = 0x000122、length = 0x0002DE
    RAMD0:origin = 0x00B000、length = 0x000800
    /* RAMLS0 :origin = 0x008000、length = 0x000800
    RAMLS1:origin = 0x008800,length = 0x000800
    RAMLS2:origin = 0x009000、length = 0x000800
    RAMLS3:origin = 0x009800,length = 0x000800
    RAMLS4:origin = 0x00A000、length = 0x000800 */
    RAMLS_0_1_2_3_4:origin = 0x008000、length = 0x002800
    复位:origin = 0x3FFFC0,length = 0x000002

    第1页:

    BOOT_RSVD :origin = 0x000002、length = 0x000120 // M0的一部分,引导 ROM 将此用于堆栈*/
    RAMM1 :origin = 0x000400、length = 0x000400 /*片上 RAM 块 M1 */
    RAMD1 :origin = 0x00B800,length = 0x000800

    RAMLS5 :origin = 0x00A800,length = 0x000800

    RAMGS0 :origin = 0x00C000、length = 0x001000
    RAMGS1 :origin = 0x00D000、length = 0x001000
    RAMGS2 :origin = 0x00E000、length = 0x001000
    RAMGS3 :origin = 0x00F000、length = 0x001000
    RAMGS4. :origin = 0x010000,length = 0x001000
    RAMGS5. :origin = 0x011000,length = 0x001000
    RAMGS6 :origin = 0x012000,length = 0x001000
    RAMGS7 :origin = 0x013000、length = 0x001000
    RAMGS8. :origin = 0x014000、length = 0x001000
    RAMGS9. :origin = 0x015000,length = 0x001000
    RAMGS10 :origin = 0x016000,length = 0x001000
    RAMGS11. :origin = 0x017000、length = 0x001000
    RAMGS12. :origin = 0x018000、length = 0x001000 /*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
    RAMGS13. :origin = 0x019000、length = 0x001000 /*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
    RAMGS14 :origin = 0x01A000、length = 0x001000 /*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
    RAMGS15 :origin = 0x01B000、length = 0x001000 /*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *

    CPU2TOCPU1RAM:origin = 0x03F800,length = 0x000400
    CPU1TOCPU2RAM:origin = 0x03FC00,length = 0x000400

    CANA_MSG_RAM :origin = 0x049000、length = 0x000800
    CANB_MSG_RAM :origin = 0x04B000、length = 0x000800



    部分

    codestart :>开始, PAGE = 0
    /*.text :> RAMM0 | RAMD0 | RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4,PAGE = 0*/
    .text :>> RAMM0 | RAMD0 | RAMLS_0_1_2_3_4,PAGE = 0 /*选项:在 M0、D0和大型 LSX 段之间拆分*/
    /*.text :> RAMLS_1_2_3_4、PAGE = 0 */ /*选项:合并 LSX 段*/
    .cinit :> RAMM0, PAGE = 0
    .pinit :> RAMM0, PAGE = 0
    切换 :> RAMM0, PAGE = 0
    复位 :>重置, PAGE = 0、TYPE = DSECT /*未使用、*/

    堆栈 :> RAMM1, PAGE = 1.
    ebss :> RAMLS5,page = 1.
    /*.econst :> RAMLS5,page = 1*/
    /*.econst :>> RAMLS5 | RAMGS0,page = 1 */*运行时间问题*/
    .econst :>> RAMLS5 | RAMM1,PAGE = 1
    等斯梅姆 :> RAMLS5,page = 1.
    filter_RegsFile:> RAMGS0,PAGE = 1

    ramgs0 :> RAMGS0,PAGE = 1
    频率1 :> RAMGS1,PAGE = 1

    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>=15009000
    .TI.ramfunc:{}>RAMM0, PAGE = 0
    其他
    ramfuncs:>RAMM0 PAGE = 0
    #endif
    #endif

    /*使用 IPC API 驱动程序时需要以下部分定义*/
    组:> CPU1TOCPU2RAM,PAGE = 1

    PUTBUFFER
    PUTWRITEIDX
    GETREADIDX


    组:> CPU2TOCPU1RAM,PAGE = 1

    GETBUFFER:TYPE = DSECT
    GETWRITEIDX:TYPE = DSECT
    PUTREADIDX:TYPE = DSECT


    /*以下部分定义适用于 SDFM 示例*/
    filter1_RegsFile:> RAMGS1,PAGE = 1,fill=0x1111
    Filter2_RegsFile:> RAMGS2,PAGE = 1,fill=0x2222
    Filter3_RegsFile:> RAMGS3,PAGE = 1,fill=0x3333
    Filter4_RegsFile:> RAMGS4,PAGE = 1,fill=0x4444
    Differit_RegsFile:>RAMGS5,PAGE = 1,fill=0x3333

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

    您好、Elizabeth Joy、

    当应用程序到达 memcpy()应用程序崩溃时,立即在调试模式下步进。

    发现了这个问题、将 F28335应用(旧)移植到 f28379d (新)、旧应用在 ccsv6上构建、编译器不是 v16.9LTS、即使编译器应用中的 memcpy 大小参数为零、但实际上它现在已被删除、仍然是不需要的代码。

    我正在使用 CCSv7 v16.9LTS 编译器,如果 size 参数为零,则应用程序会崩溃。

    如果您有从旧编译器到新编译器 v16.9LTS 的应用程序迁移的任何用户指南或参考文档、请与我们分享。

    谢谢

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

    请在此处查看 v16.9.0.LTS 的编译器用户指南:
    www.ti.com/.../spru514k.pdf

    您还可以浏览编译器 wiki、了解更多资源:
    processors.wiki.ti.com/.../Category:Compiler

    此致、
    Elizabeth