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.

[参考译文] TMS320F280049C:指针数组问题

Guru**** 2577385 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1219539/tms320f280049c-a-problem-of-an-array-of-pointers

器件型号:TMS320F280049C

您好、TI 专家:

我,了一个指针数组,这保存了 ADC 的默认严格的地址,但当我加载和运行程序使用乳化剂,它似乎运转良好

但当我以离线模式运行程序时、我读取阵列的内容都是"0000"使用通信、 相应的函数未成功运行

为什么指针阵列在离线模式下无法正确初始化?我该怎么做、请帮助我

注意:我没有在程序中的任何位置归零此 RAM 上的数据

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

    您好!

    您说离线模式是什么意思? 您是说、没有连接 JTAG?

    您能否共享您使用的链接器 cmd 文件? 我认为您在使用基于闪存的链接器 cmd 文件

    此致、

    Veena

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

    是,脱机模式表示未连接 JTAG。

    无论是使用 JTAG 还是不使用 JTAG、程序都会在闪存中运行。

    从内存中我们可以知道指针数组是映射在"ebss"中的。

    第1页:

    RAM_STACK:origin = 0x000000,length = 0x000300 /*片上 RAM 块 M0 */
    RAM_EBSS:origin = 0x000300,length = 0x000100 /*片上 RAM 块 M1 */

      .ebss         :> RAM_EBSS  页面= 1.

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

    EBSS 是变量部分。 还有一个使用初始值创建的.cinit 段。 此部分应逐行扫描在闪存中以供单独执行。 c_int00函数将初始值存储在闪存中、以加载 RAM 中的变量。 这在 main 函数之前发生

    .cinit       :> FLASH_BANK0_SEC1、ALIGN (8)

    此致、

    Veena

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

    好的、我使用 "const"关键字更改数组定义

    const Uint16 *pAdAddrList[]=

    (UINT16 *)(&adDataAD1)、
    (UINT16 *)(&adDataAD2)、
    (UINT16 *)(&adDataAD3)、
    (UINT16 *)(&adDataAD4)、
    (UINT16 *)(&adDataAD5)、
    (UINT16 *)(&adDataAD6)、
    (UINT16 *)(&adDataAD7)、
    (UINT16 *)(&adDataAD8)、
    (UINT16 *)(&adDataAD9)、
    (UINT16 *)(&adDataAD10)、
    (UINT16 *)(&adDataAD11)、
    (UINT16 *)(&adDataAD12)、
    (UINT16 *)(&adDataAD13)、
    (UINT16 *)(&adDataAD14)、
    (UINT16 *)(&adDataAD15)、
    (UINT16 *)(&adDataAD16)、
    (UINT16 *)(&adDataAD17)、
    };

    您可以看到"cinit"包含数组的内容

    但为什么 RAM 数据全部为0?

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

    我忘记告诉您我们使用我们自己的启动代码 befoe 主代码。

    这是否意味着在未连接 JTAG 时 c_int00代码不会运行  

    但使用乳化剂时、c_int00代码也会运行、甚至会在 code_start 之前使用我们自己的引导  

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

    c_init00作为 codestart 函数的一部分调用、我们会将其分配给分配入口点地址。 BootROM 代码完成后、将分支到该位置。

    你自己的启动代码是什么意思? 您是否在入口点位置定义此定义? 这是否会调用 c_init00函数?

    此致、

    Veena

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

    你自己的启动代码是什么意思?   是的, 当 BootROM 代码完成时,它进入 codestart (0x80000 ),然后进入我们自己的引导代码。  我们没有调用 c_init00、那么当我们不调用 c_init00函数时会出现什么问题?

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

    c_init00函数初始化所有全局变量。

    int a = 10;->编译器为变量 A 分配存储器、值10存储在闪存中、作为.cinit 段的一部分。 c_int000函数是一个通过读取.cinit 段将'a'变量初始化为10的函数

    它还会进行一些其他基本初始化、例如堆栈指针初始化、设置模式等、最后分支到主函数。 建议调用_c_init00函数 、除非您的启动代码负责所有这些初始化。

    此致、

    Veena

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

    好的,明白了

    谢谢你