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.

[参考译文] 编译器/TMS320C5534:从 C 代码访问链接器.cmd 定义的区域

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/697723/compiler-tms320c5534-accessing-a-linker-cmd-defined-area-from-c-code

器件型号:TMS320C5534

工具/软件:TI C/C++编译器

您好!

我正在尝试从我的 C 代码访问一个存储器区域。

在.cmd 文件中、我具有:

部分{

       .text:   {}> SARAM PAGE 0
       切换:   {}> SARAM 第0页
       .bss:块(0x20000)   {}> SARAM PAGE 0
       .cinit:block (0x20000)   {}> SARAM PAGE 0
       .pinit:block (0x20000)   {}> SARAM PAGE 0

    
       ERROR_buf:block (0x400){}> SARAM PAGE 0


然后在我的 C 代码中、我尝试了各种版本、但我认为这是一个可行的版本:

extern char error_buf;

void error_handler (char *fmt、void*参数)

.

.



   uint32_t * msg_buf =_symval (&error_buf);



但是、无论我尝试何种变体、我都会遇到以下链接器错误:

未定义 的首次引用   
 符号               
 ------  --------   
 _error_buf ./src/main.obj

是否有一种已知的模式来实现这一点? 动机是在退出应用程序之前转储存储器区域

谢谢、

Jacques

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

    C5000软件团队正在关注这一点。 反馈将发布在此处。

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

    雅克

    为了了解如何定义.cmd 文件中的存储器区域、请参阅 CSL 中的示例、地址为 C:\ti\c55_lp\c55_CSL_3.08\demos\audio-preprocessing\c5517\VC5505_I2S.cmd

    i2sDmaWriteBufLeft :> DARAM
    
    
    #pragma DATA_ALIGN (i2sDmaWriteBufLeft,8);
    uint32 i2sDmaWriteBufLeft [I2S_DMA_BUF_LEN];//左 Tx 写入乒乓缓冲器 

    Lali

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

    嗯、这个方向很容易、即在 C 语言中定义一个缓冲区或一个段、并将其正确映射到 cmd 文件中。

    但是、另一种方法对我来说是可行的:

    1.我使用.tcf 文件在 DSP/BIOS 中定义一个跟踪、如下所示:
    var trace2 = BIOS.log.create ("error");

    因此、tconf 和 DSP/BIOS 生成工具将创建"error$buf"对象、如下所示(在生成的.cmd 文件中)
    部分{

    .
    error$buf:"块(0x20000)对齐= 0x200{}> DARAM 页0

    (笑声)


    3.我很想从我的 C 代码中获取此 error$buf 缓冲区的地址以进行读取。
    这对我来说不起作用。

    不是这样、我成功地按如下方式进行了装配:

    .ref 错误$buf

    getErrorBaseAddr:
    XAR0 =#(error$buf)
    返回

    从我的 C 代码中,我只需调用此函数:)
    当然,必须有一种方法直接在 C 中执行同样的操作?

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

    ERROR_buf 是一个数组、而不是 CMD 文件使用存储器和段时的段。 您需要通过在代码中执行以下操作将 ERROR_buf 分配给某个段:

    #pragma DATA_SECTION (ERROR_BUF、".ERROR_BUF");
    char error_buf[1000];

    在 CMD 中使用:

    error_buf:block (0x400){}> SARAM PAGE 0

    此致、

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

    这说明了很多... 现在我意识到我的剩余问题是强制 DSP/BIOS 使用这个缓冲区、而不是传统的错误$buf

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

    如果您必须使 BIOS 识别/使用 NOR 闪存区域,则必须修改*tcf 文件以将新的“内存”(BIOS.MEM)添加为 NOR,并指定起始地址和大小。 然后、您可以使用 BIOS 配置工具(用于更新 tcf 文件的 GUI)将 error$buf 分配给 NOR 区域。

    另一种方法是、您可以自己执行该操作、即将错误信息放入 error_buf 中。 当然、通过这种方法、您将无法使用 BIOS 日志功能、但 sprintf 应该也能使用。 这样、BIOS 就不知道 NOR 闪存是否存在。

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