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.

[FAQ] [参考译文] [常见问题解答] TDA4VM:C7x 编译器在地址超出+/- 2GB 时的状态

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1186433/faq-tda4vm-c7x-compiler-status-on-address-beyond---2gb

器件型号:TDA4VM

当我们增加 C7x 暂存或 C7x 本地堆的大小时、编译期间会出现以下错误

链接/home/nikhil/SDK_8.4/ti-processor-sdk-rtos-j721e-evm-08_04_00_06/vision_apps/out/J7/C71/FREERTOS/release/vx_app_rtos_linux_c7x_1.out
"/home/nikhil/SDK_8.4/ti-processor-sdk-rtos-j721e-evm-08_04_00_06/ti-cgt-c7000_3.0.0.STS/include/string.h、第275行:错误:
  溢出从函数"AppInit"重定位到符号"g_DDR_local_mem";
  33位重定位地址0x80096600太大、无法在32位中编码
  带符号的 PC 相关字段(类型='R_C7X_PCR_OFFSET_ADDKPC_HI27'(33)、file =
  "/home/nikhil/SDK_8.4/ti-processor-sdk-rtos-j721e-evm-08_04_00_06/vision_app
  S/OUT/J7/C71/FreeRTOS/RELEASE/APP_RTOS_common_c7x_1.lib "、
  偏移= 0x000000000084、段=".text")
错误:链接过程中遇到错误;
  "/home/nikhil/SDK_8.4/ti-processor-sdk-rtos-j721e-evm-08_04_00_06/vision_app
  未构建 S/OUT/J7/C71/FreeRTOS/RELEASE/VX_APP_RTOS_LINUX_c7x_1.out"

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

    推理

    在 C7000器件上、所有符号引用均通过 PC 相对偏移以独立于位置的方式进行处理。 但是、由链接器定义的符号的值可能不会解析为有效的符号地址或解析为超出正常 PC 相对寻址+/- 2GB 范围的地址。

    让我们考虑一个场景、在 J721e SDK 8.4中演示这一点

    C7x 的代码段中的 AppInit (@ 0xab669980)可能高达2GB (即直到0x12B669980)。

     AppInit 正在访问指向 C7X_1_LOCAL_HEAP_ADDR 的变量 g_DDR_LOCAL_MEM (@ 0x12B700000)。 由于该变量无法访问、因此在编译期间会看到以下错误。

    Linking /home/nikhil/SDK_8.4/ti-processor-sdk-rtos-j721e-evm-08_04_00_06/vision_apps/out/J7/C71/FREERTOS/release/vx_app_rtos_linux_c7x_1.out
    "/home/nikhil/SDK_8.4/ti-processor-sdk-rtos-j721e-evm-08_04_00_06/ti-cgt-c7000_3.0.0.STS/include/string.h", line 275: error:
       relocation from function "appInit" to symbol "g_ddr_local_mem" overflowed;
       the 33-bit relocated address 0x80096600 is too large to encode in the 32-bit
       signed PC-Relative field (type = 'R_C7X_PCR_OFFSET_ADDKPC_HI27' (33), file =
       "/home/nikhil/SDK_8.4/ti-processor-sdk-rtos-j721e-evm-08_04_00_06/vision_app
       s/out/J7/C71/FREERTOS/release/app_rtos_common_c7x_1.lib<app_init.obj>",
       offset = 0x000000000084, section = ".text")
    error: errors encountered during linking;
       "/home/nikhil/SDK_8.4/ti-processor-sdk-rtos-j721e-evm-08_04_00_06/vision_app
       s/out/J7/C71/FREERTOS/release/vx_app_rtos_linux_c7x_1.out" not built

    解决方案

    访问此类符号时,必须使用_symval()内在函数强制使用绝对寻址。 此类寻址可防止编译器为实际不对应于地址或超出 PC 相对寻址+/- 2GB 范围的地址的符号生成 PC 相对偏移/重定位。

    考虑到我们的示例情形,我们可以在 AppInit()函数内使用_symval (g_DDR_local_mem)。

    以下信息在 SPRUIG8E_C7000_Compiler_Users_Guide.pdf 中提供、SDK 的12.6链接器符号部分提供

    ${PSDKRA}/ti-cgt-c7000_3.0.STS/docs/SPRUIG8E_C7000_Compiler_Users_Guide.pdf

    此致、
    Nikhil Dasan