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.

[参考译文] TMS320C6701:次级引导加载程序写入32位宽的 SRAM 问题

Guru**** 2546020 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/619719/tms320c6701-secondary-bootloader-writes-to-32-bit-wide-sram-issue

器件型号:TMS320C6701

这是一种现有设计、因此无法进行设计更改。

使用 CCS 仿真器、我可以在 SRAM 中写入单个字节。

但是、当我单步执行次级引导加载程序的复制表代码时、它会将相同的字节写入32位存储器位置内的所有4个字节。

CECTL3寄存器中 SRAM 的 M 类型为2、表示32位异步存储器。

我尝试将 M-TYPE 更改为0、但运气不好、仿真器会将其读回为2。 不确定为什么我无法更改 CE3的 M 类型。 CE1的 M-TYPE 设置为0、没有问题。

当时我想、当复制表的目标是 SRAM 存储器时、或许我可以将引导加载程序更改为使用32位访问、但我对汇编器代码不太熟悉。

请提供任何帮助。

Thx、Bill。

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

    您的症状非常奇怪、尤其是无法更改 CECTL3。

    我相信您说的 EMIF 上有一个物理32位存储器件。 是这样吗? 如果是这样、STB 指令将很难同时向四个字节写入相同的值。 您在单步执行代码时看到的是、在执行单个 STB 指令后、相同的值会同时写入4个字节吗?

    如果、从仿真器中、您可以按顺序写入八个单独的字节、并且您可以将这些字节读取为32位字、并将新的唯一值写入为32位字、那么您可以将 EMIF 配置为正常。

    由于这是一种现有设计、而且很可能是一种非常旧的现有设计、因此次级引导加载程序已使用了很长时间。 不要单步执行代码、而是尝试在循环末尾运行到断点。 行为是否有任何不同?

    将示波器或逻辑分析仪探头放在 SRAM 控制线和一些数据线上、以查看其工作是否正常或查看可能出现的问题。

    如果您只让引导加载程序在连接或未连接仿真器的情况下运行应用程序、它是否正常工作?

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

    您好、Randy、

    我同意、奇怪。

    将0写入 CECTL3、CCS 显示0x00000020进行回读。 C6701的一些限制可能是 CE3必须为32位宽。 我不知道、只是猜测而已。

    是的、 在执行一条 STB 指令后、将相同的值同时写入4个字节。 但 CCS/仿真器似乎能够写入单个字节。 仿真器是否可以读取/修改/写入?

    尝试运行到表复制已完成的断点。 当我查看 SRAM 时、我会在32位字的所有4个字节中看到相同的字节。

    我看了 Brad Griffis 的一些帖子、他 a)发布了一个"C"版本的引导加载程序;b)建议从手册中学习汇编语言。 在执行表复制时、我能够将引导加载程序更改为执行32位写入/读取。 当我使用仿真器运行代码时、它会成功运行并引导应用程序。

    但是、如果我使用 hex6x 将 COFF 文件转换为十六进制、并将程序转换为 EEPROM、则不起作用。 立即调试此问题。

    这是表副本的源文件副本。 您的汇编器是如何工作的? 发现任何问题?

    Thx、Bill。

    ;复制段
        mvkl copy_table、A3;加载表指针
        mvkh copy_table、A3
        LDW *A3++,B1  ;负载入口点
    COPY_SECTION 顶部:
        LDW *A3++,B6  ;字节计数-之前为 b0
        NOP 5.       ;新
        添加 3、B6、B6   ;新增
        shru .s2 b6、2、b0 ;new -将字节计数除以4
        LDW *A3++,A4  ;RAM 起始地址
        NOP 3.
     [!b0] b COPY_DONE     ;我们是否复制了所有段?
        NOP 5.
    COPY_LOOP:
    ;    ldb *A3++,B5
    ;    低于 b0、1、b0   ;递减计数器
        LDW *A3++,B5
        低于 b0、1、b0   ;递减计数器
     [b0] b  COPY_LOOP  ;如果未完成则设置分支
     [!b0] b  COPY_SECTION _TOP
         A1为零
     [!b0] 和 3、A3、A1
    ;    STB B5,* A4++
        STW B5、* A4++
     [!b0] 和 -4、A3、A5   ;向上舍入地址到4的下一个倍数
     [a1] 加 4、A5、A3   ;四舍五入地址到4的下一个倍数
    ;跳转到入口点
    COPY_DONE:
        b  .S2 B1
        NOP 5.

     

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

    C6000组件很难使用。 如果您非常想了解该信息、C6000优化技术讲座可能会提供有关解释延迟槽和流水线的最佳信息。

    从我看到的结果中、您有一些 NOP 的周期数大于所需的周期数。 但是、优化引导加载程序的检查可能并不是所有这些都是值得的。

    如果采用或不采用 B、b0/!b0 B 对将在 B 之后执行5个延迟时隙;检查将在 b0=0时执行的指令并检查 b0!=0时执行的指令。

    由于 CCS/JTAG 或处理器/EMIF 发生了一些奇怪的情况、很难说这样的变化将不仅仅是一个带隙、而是一个更远的步长。 如果有任何 STB 代码写入 SRAM、同样的想法也会在该处失败。 这是我问如果您将 CCS/JTAG 从图片中取出、只需启动电路板、它是否起作用的原因之一?

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

    您好、Randy、

    该汇编代码的大部分是从 SPRA999中抓取的。 我刚刚将 STB 更改为 STW、并添加了代码、将大小从8位字的数量更改为32位字的数量。

    我不想学习 C6000汇编语言。 就像35年前一样。

    您提出了一个好问题、如果我的 SRAM 不可按字节寻址、那么我可能会在稍后卡住。

    作为测试例程的一部分、我编写了一些 C 代码来在应用程序内执行字节写入/读取。 使用仿真器运行它、结果相同、代码无法单独寻址字节。 使用仿真器、将测试地址更改为未使用的 IDRAM 中、代码可以写入单个字节。 因此 C 代码是正确的、只是 SRAM 看起来不能按字节寻址。

    但是、如果我使用仿真器来更改内存浏览器窗口中的字节、那么它会起作用。 我想我之前问过 CCS /仿真器是否执行读取/修改/写入操作。 有什么想法吗?

    我查看了原理图、到 SRAM 的地址总线是地址线2到20。 这与 SPRU266e 中的方框图相匹配(图1-5)。 我已经戴过硬件设计人员帽子、但地址线配置不是这样、CE3的 MTYPE 暗示 SRAM 不可按字节寻址。

    目前、我在 SRAM 中只有代码、而数据变量在 IDRAM 中。 因此、SRAM 是32位可寻址的、没有问题。

    仍然不明白为什么 CE3的 MTYPE 固定为32位。

    因此、我的应用程序可以处理 SRAM 中的所有代码以及 IDRAM 中的所有变量。 我的 IDRAM 教室占用了16K 字节多一点的空间。 因此、我不需要在 SRAM 中放置任何变量。 我想、如果需要、我可以使我的所有变量都宽度为32位、但仍然无法解决问题。

    Bill。