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 tms320c6678:FAL_START符号解析错误

Guru**** 2607635 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/631316/ccs-tms320c6678-far_start-symbol-resolution-error

部件号:TMS320C6678

工具/软件:Code Composer Studio

您好,

我需要手动清除BSS和目标的远端部分(我无法使用cinit自动归零功能)

我在主函数中编写了这个代码

int main (void)
{
U16指示器;
U16尺寸;
U8* ADR;

// BSS RAM部分的零初始化
//size =(U16)_symval (&BSS_size);//不运行
大小=((U32)_symval (&BSS_END))-((U32)_symval (&BSS_start));
用于(Ind=0;Ind<大小;Ind++)
*((U8*)_symval (&BSS_start)+ Indd)= 0;
// Far RAM部分的零初始化
大小=((U32)&FAL_END)-((U32)&FAL_START);
ADR =(U8*)_symval(&F_start);
用于(Ind=0;Ind<大小;Ind++)
*ADR++=0;

在cmd文件中,我添加了以下声明

   .far          > SHRAM
           运行_启动(fal_start)
           运行结束(远端)
           运行大小(fal_size)

   .bss        > CORE0_L2_SRAM_OTHER
          运行启动(BSS_START)
           运行结束(BSS_END)
           运行大小(bss_size)

在地图文件中,使用正确的值创建符号

代码位于CORE0_L2_SRAM中(主地址为0x1083b580)。

为BSS部分编译和运行代码,但不适用于FAR部分:我收到以下错误消息:“#1.7003万-D: 从函数“main”重定位到符号“FAL_END”溢出; 28位重定位地址0xb7947e6太大,无法在15位无符号字段中进行编码(类型='R_C6000_SBR_U15_B'(11),文件="./main.obj",偏移= 0x0.0064万,节=".text")   main.c   /bbbm_foe_dp_dsp_cpu01   行125   C/C++问题"


请帮帮我。

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

    代码必须声明符号BSS_START,FAL_START等 。执行此操作时,请确保使用FAR关键字。  喜欢这里

    外部远端int bss_start,bss_end,bss_size;
    外部远端int fal_start,fal_end,fal_size; 

    如果没有FAR,编译器将假定这些符号与数据页寄存器(DP)相关,并以此方式计算地址。  因为这些符号与DP无关,所以编译器生成的汇编代码不会生成。  添加FAR关键字可以告诉编译器这些是绝对符号,并且它会生成不使用DP的不同代码。   

    C6000汇编语言工具手册 中有一节标题为 在C/C++应用程序中使用链接器符号,描述如何引用链接器定义的符号(如BSS_START)。  本节应说明使用FAR是必要的,但不需要。  所以我在 SDOWP系统中提交了CodeGen-3797以更正该部分。  欢迎您使用我签名中下面的SDOWP链接进行关注。

    要考虑的优化... 不要手动对这些循环进行编码,而是调用RTS例程memset。  它看起来像...

    #include <string.h>// for memset
    
    //多行,在main ...
    memset中(&bss_start,0,_symval (&bss_size));
    memset (&fal_start,0, _symval (&fal_size)); 

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢您的回答:我在我的声明中添加了FAR关键字,现在它起作用了。
    我还考虑了您的优化建议。