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.

[参考译文] RTOS/F28M35H52C:EPI 外部 SRAM 初始化和.bss 分配

Guru**** 2538955 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/683155/rtos-f28m35h52c-epi-external-sram-initialization-and-bss-allocation

器件型号:F28M35H52C
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

您好!

在通过 EPI 连接的外部 SRAM 中放置.bss 段时遇到问题。

配置:
目标 F28M35H52C1 (Cortex-M3 + C2000 DSP)   CCS 版本: 5.5.0.00077   编译器 TI v5.1.1  IPC 3.10.1.11    SYS/BIOS 6.35.04.50   TI RTOS 1.20.0.28
硬件是一款定制电路板、在 EPI 总线上具有 F28M35H52C1处理器、2 MB 外部 SRAM (Alliance Memory AS6C1616-55TIN)和 LCD 控制器(EPSON S1D13742)。

我已经使用这个外部 SRAM 来存储 GUI 映像(1Mbyte)和显示缓冲区(768KB)、一些其他段(所有这些段都正常)以及我要存储.bss 的 ARM_EXTRAM 段。

以下是 cmd 文件的摘录:
   存储器
   {
      EXTRAM (RW)       :origin = 0x60020D00,length = 0xBB800
      EXTRAM_BIN (RW)  :origin = 0x600DC500,length = 0x100000
      ARM_EXTRAM (rwx):origin = 0x601E6E10,length = 0x191F0
   }
   部分
   {
     .SDRRAM               :> EXTRAM
     .remote_bin            :> EXTRAM_BIN
     .bss                   :> ARM_EXTRAM
   }

EXTRAM 和 EXTRAM_BIN 与#pragma 一同使用:
#pragma DATA_SECTION (GuiLib_DisplayBuf、".SDRRAM")
#pragma DATA_SECTION (SD_Card_RamBuffer、".remote_bin")

EPI 在 EPI_CONFIG.c (见下面的附件)中配置了 EPI_Init(),这两个函数中调用:
e2e.ti.com/.../EPI_5F00_config.c
void customResetISR (void){
   EPI_Init();
   返回;

void customStartFunction (void){
   EPI_Init();
   返回;

这两个函数在 main.cfg 中进行配置,并按预期在 main 之前调用(使用断点进行验证):
   startup.resetFxn ="&customResetISR";
   var len = Startup.firstFxns.length
   startup.firstFxns.length++;
   startup.firstFxns[len]='customStartFunction;

当我尝试将.bss 段放在 ARM_EXTRAM 中时、会出现问题。 我获得以下消息"存储器映射阻止读取0x601F1E1C":

仔细检查后,似乎 BIOS_start()中出现了此错误。
我尝试使用以下代码操作 main 开头的存储器、它不会产生任何错误:
   short * MemLoc =(short *)(0x601F1E1C);
   *MemLoc = 1234;

总之、访问外部 SRAM 对于.bss 以外的其他段可以正常工作、并且 EPI 使用 XDC 复位和启动函数进行初始化、这应该是在.bss 以零初始化之前进行的。

请问我是否错过了 EPI 初始化的步骤,这会导致 BIOS_start()失败?

提前感谢您的帮助。
此致、
Paul Noalhyt

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

    我有点困惑;BIOS_start()是否失败? 您的应用程序崩溃了吗? 调试窗口是否显示"Memory map prevented reading..."? 我只是想确保我了解您的问题。

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

    您好、Emmanuel、
    感谢您的快速回复。

    是的、当我尝试将.bss 放入外部存储器时、应用程序崩溃、为我提供了"存储器映射阻止读取..." 调试控制台中的错误消息:

    在使用断点进行调查之后,我发现执行了以下操作,在重置后:
    -调用 customResetISR
    -调用 customStartFunction
    -进入 main
      ->执行 BIOS_start()时、我得到"Memory map preved reading..." 包含 abort()和 loader_exit()函数的消息,如屏幕截图中所示

    感谢你的帮助。
    此致、
    Paul

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

    尊敬的 Paul:

    您在调试窗口中看到的错误是因为 CCS 不知道外部存储器。 您可以通过执行以下操作来更新 CCS GEL 文件(CCS 在访问器件时使用的存储器映射):

    1. 启动调试会话。
    2. 在工具栏中选择:tools->GEL Files。
    3. 将弹出一个窗口。  双击 f28m35h52c1_m3.gel 文件。
    4. 在  F28M35H52C1_Memory_Map()函数中添加一个外部存储器条目。

    请告诉我这是否有帮助、

    伊曼纽尔

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

    您好、Emmanuel、

    谢谢、此建议解决 了"存储器映射阻止读取..." 消息! 如您所见、我们现在可以通过"CCS Debug Disassembly"窗口访问外部存储器。

    尽管并非所有问题都得到了解决、您可以在下面的屏幕截图中看到:

    您知道如何知道导致 XDC 中止的原因吗? 因为现在、调用堆栈并不是很有用。

    根据我的理解、调试器使用 CIO 系统调用来读取/写入存储器中的数据。
    但 CIO 部分是这样映射的:
       .cio       :> C03SRAM    ,其中 C03SRAM 为 ARM RAM (C03SRAM (rwx)        :origin = 0x20000000,length = 0x8000)

    正如我之前说过的、在我将.bss 放置在外部存储器之前、一切都正常运行。
    你有什么建议吗?

    感谢你的帮助。
    此致、
    Paul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴听到有一些进展。 我将向同事咨询有关最终 CIO 命令警告的信息。

    同时,让我们尝试找出导致 BIOS_exit()的原因。 您能否发布 ROV 屏幕截图:BIOS -> Scan for Errors、Hwi-> Exceptions 和 SysMin。 这些可以帮助我们了解正在发生的情况。 此外、您能否发布0x002618F2 (导致崩溃的地址)中的内容?

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

    [引用 user="Emmanuel Trinidad - Alicea"]我将向同事咨询有关最终 CIO 命令警告的信息。

    在链接器命令文件中、确保.cio 段位于有效的读取/写入存储器中。  此提示以及其他类似的提示来自文章 使用 printf 的提示

    谢谢、此致、

    乔治

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

    您好!

    感谢你们帮助我解决这个问题。

    要回答您的问题、Emmanuel 提供了您需要的屏幕截图:

    • BIOS ->扫描错误:

    • Hwi->例外(此处没有要显示的数据)

    • SysMin

    以下也是一个 txt 文件、其中包含 SysMin 的 Raw 选项卡中列出的所有信息:
    e2e.ti.com/.../SysMin_5F00_Raw.txt

    最后是地址0x002618F2的屏幕截图,该屏幕截图似乎执行了堆栈检查,如果遇到任何问题,则会产生错误:

    George

    我没有移动.cio 段、正如我在上一篇文章中提到的、该段声明如下:
    .cio       :> C03SRAM    ,其中 C03SRAM 为 ARM RAM (C03SRAM (rwx)        :origin = 0x20000000,length = 0x8000)

    我只是在尝试移动外部存储器中的.bss 段。 在我尝试这么做之前、一切都运行得很好。
    尽管我不理解的是、我在外部存储器中看到错误"Invalid CIO command (0) in the CIO buffer at address (0x601f841c) was not recognized (无法识别地址(0x601f841c)的 CIO 缓冲区中的无效 CIO 命令(0))"、 但 CIO 部分位于内部 ARM 存储器中(在0x20000000和0x20008000之间)、那么 CIO 缓冲器在外部存储器中做什么?

    再次感谢你的帮助。
    此致、
    Paul

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

    尊敬的 Paul:

    遗憾的是、您的屏幕截图未正确加载。  您可以将其重新加载到此帖子吗?  您能否发布 SysMin 的"Output Buffer"选项卡?

    感谢您的反汇编窗口;您能否缓慢向上滚动到下一个函数调用(以便我们可以查看我们所处的函数)?   

    谢谢、

    伊曼纽尔

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

    您好、Emmanuel、

    的确,我不知道发生了什么。 其中包括:

    BIOS ->扫描错误:

    Hwi->例外(此处没有要显示的数据)

    SysMin

    SysMin -> OutputBuffer (此处没有要显示的数据)

    下面是一个更详细的汇编视图:

    我希望这就是您想要的、我们似乎在 ti_sysbios_KNL_Task_checkStacks__e 中

    感谢你的帮助。
    此致、
    Paul

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

    您是否有时间查看我的问题? 您能提出解决方案吗?

    此致、
    Paul
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    看起来您的任务堆栈太小或任务对象列表中存在损坏。 您能否在 BIOS_start 函数之前查看 ROV->Tasks->Detailed 以了解任务堆栈的大小? 然后、在遇到错误情况后、请看一下。

    以下是有关堆栈使用情况的视频/演示: training.ti.com/debugging-common-application-issues-ti-rtos

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

    您好 Todd、

    下面是 ROV->Tasks->BIOS 开始前的详细信息:

    在出错后:

    奇怪的是、当我将.bss 分配给内部 RAM 时、一切都正常。 因此、任务大小很合适。 我认为这是一个内部与外部 RAM 问题。

    谢谢你。
    此致、
    Paul Noalhyt

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

    同时、我发现了可能是错误原因的东西。

    我正在使用的外部 RAM 由1、048、576字的16位组成。 我使用 EPI 16位主机总线(HB-16)模式配置了该模式、但没有字节选择。
    这意味着我可以读取或写入的最小数据是一个16位的字。

    我进行了一个简单的测试、在地址0x60000000处写入一个字节、然后在地址0x60000001处写入另一个字节。
    结果如下:

    • 在0x60000000处写入0x12、然后在存储器中写入:0x60000000 = 0x12、0x60000001 = 0x00
    • 在0x60000001写入0x34,然后在内存中写入0x60000000 = 0x00和0x60000001 = 0x34

    因此我注意到、写入一个字节是不可能的、因为它会覆盖整个字。 解决此问题的方法是使用 RAM 芯片的 UpperByte 和 LowerByte 引脚(见下文)并配置具有字节选择的 EPI 16位主机总线(HB-16)模式。

    RAM 芯片的引脚和图:

    关键是我们的电路板在 LB 和 UB 接地的情况下进行布线、此时我们无法修改硬件:

    考虑到所有这些,是否不可能访问外部 RAM 中的单个字节? 或者是否有权变措施?

    是否不可能将.bss 放置在外部存储器中?

    谢谢你。
    此致、
    Paul Noalhyt

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

    如果不重新映射 UB/LB 信号、就无法避免字节寻址能力的丧失。

    我可以想到的唯一软件权变措施是仅使用大小为16位倍数的变量、但可能需要进行一些特殊处理来确保这些变量是字节对齐的。 这方面我不是很熟悉。

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

    Paul、

    使用该存储器配置、您不能将.bss 放在那里。 我立即看到一个问题...任务堆栈。 内核将堆栈初始化为0xbe。 例如、下面是一个任务、其中第一个字节已在28379D 器件的内部 RAM 中使用(栈增长到更高的地址)。


    #define STACK_INIT_VAL 0xbe

    PTR TaskSupport_start (PTR currTsk、ITaskSupport_FuncPtr enter、
    ITaskSupport_FuncPtr 退出,Error_Block *EB)

      ptr sp;
      UINT 大小;
      char * sptr;
      Task_Object * tsk =(Task_Object *)(currTsk);

      …

      if (Task_initStackFlag){

        sptr =(Char *) tsk->stack;
        大小= tsk->STACKSIZE;
        while (size--){
          *sptr++= STACK_INIT_VAL;
        }
      }

    当然、您可以禁用堆栈的初始化、但我确信还会出现其他问题。

    Todd

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

    这个答案令人失望,这就是我所担心的。
    感谢你的帮助。

    Bests、
    Paul