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.

[参考译文] LAUNCHXL-F28379D:如何获取具有良好 RAM 大小(PAGE = 0)和高速 CPU 的合适 TI 器件? 就模型速度而言、RAM 和闪存之间有何差异?

Guru**** 2524550 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/956095/launchxl-f28379d-how-to-get-a-suitable-ti-device-with-a-good-ram-size-page-0-and-a-high-speed-cpu-and-what-is-the-difference-between-ram-and-flash-memory-in-terms-of-the-model-speed

器件型号:LAUNCHXL-F28379D
主题中讨论的其他器件:C2000WARE

大家好、
我通过 Matlab Simulink 和外部模式使用 LAUNCH-F28379D。
在"MATLAB Function"块中添加代码后、我遇到 RAM 问题(我无法在 RAM 上运行代码(不选择"从闪存引导") 但我仍然可以使用"从闪存引导"运行代码 、其中 RAM 与闪存存储器相比非常小。
我的问题是
问题1:就整个模型的速度而言、在 RAM 或闪存上运行代码之间是否存在差异?

问题2:实际上、我的模型使用"从闪存引导"以600微秒(模型的占空比)的时间运行、但我需要以大约200-400微秒的时间运行。 是否有办法做到这一点?

问题3:我是否能够扩展 RAM 大小以使用闪存(例如,将 FLASHA_N 添加到 RAM 中,(PAGE = 0 #ifdef CPU1 .text:>>RAMM0 | RAMD0 | RAMLS_PROG | RAMGS_PROG | FLASHA_N)?

问题4:如果我将 TI 器件(从 LAUNCH-F28379D)更改为另一个器件。 这将解决问题吗? 是否有人建议使用具有大 RAM 存储器(PAGE = 0)和高速 CPU (以快速读取代码)的良好器件?

感谢您的任何帮助

提前感谢您

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

    Ashraf、

    闪存以200MHz 的3个 WaitStateses 运行、因此它原则上比 SRAM 慢(200MHz 时为0WS)。  但是、对于线性代码、有一个预取缓冲区、通常会达到 RAM 性能的80-90%、因此它的命中率不像原始数字所示那样大。

    引导自选项不应真正影响您看到的时序、这只是告诉器件应该从哪个源(闪存/SPI/SCI/EMIF 等)开始引导。  对于已定义的代码、引导至闪存是正确的设置。  在连接到调试器(如 CCS 或 MW)的情况下、您可以将代码直接加载到 SRAM 并从 SRAM 运行、而无需引导。

    您提到的关键问题是程序代码所在的位置、您能评论一下链接器输出中程序的大小超过了多少?  该器件是我们提供的存储器占用空间最大的器件之一、每个内核具有256KW 闪存和128KW RAM。  F28379S (单核型号)确实为一个内核提供了完整的512KW 和256KW、但代价是不是双核 MIP。

    您当然可以将部分或全部程序分配给闪存、但您需要定义另一个段、以便可以单独对其进行编程和链接。

    在代码的绝对速度方面、我将确保您已启用 PLL 并正在以其全200MHz 的速度为器件计时。  与 RAM 注释非常相似、此器件具有200MHz 的最高 CPU 时钟频率、具有嵌入式闪存。   

    请记住、该器件上有一个完整的第二个内核、SRAM 和 Flash 的数量与主内核相同。  您可以考虑在2个内核之间拆分代码、因为这两个内核的大小都是速度方面的原因。

    最棒的

    Matthew

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

    尊敬的 MatthewRate
    非常感谢您的讲解
    根据您所说的内容、我认为我应该能够在 RAM 上运行我的程序。
    当我在"Flash"上运行程序时、使用的闪存大小为("7cec" hex = 31980位) 3fffe、而当我在"RAM"上运行程序时、所需的存储器出现内存错误、如所示 ("段".text"大小为0x71c6、对齐/分块放置失败、第0页。 "&"段".cinit"大小为0x395页0的对齐/分块放置失败。")。 根据我的计算结果、CPU1上的 RAM 大小为27358位(RAMM0+RAMLS_Prog+RAMD0+RAMGS_Prog)(=2DE+9000+b000+14000)。 因此、我仍然需要大约4622位(=31980-27358)。 我认为4622位不是很好。

    **是的,我启用了具有200MHz 频率的 PLL (系统 PLL 倍频器=40,CPU=200MHz,OSCCLK=10MHz)

    下面是当我使用"Flash"和"RAM"时".map"文件中的内存说明。

    使用闪存:

    存储器配置

    名称            起点      长度       已使用      未使用    的属性       填充
    ------------    ----      ------     ----      ----      ----     ----
    第0页:
    开始          00000000  00000002  00000000  00000002  RWIX
    RAMM0         00000122  000002DE  00000000  000002DE  RWIX
    RAMLS_PROG  00009000   00002000   000000d7  00001f29   RWIX
    RAMD0         0000b000  00000800  00000000  00000800  RWIX
    RAMGS_PROG  00017000  00001000  00000000  00001000  RWIX
    BEGIN_FLASH  00080000  00000002  00000002  00000000  RWIX
    FLASHA_N      00080002   0003fffe     00007cec   00038312  RWIX
    复位         003fffc0    00000002   00000000  00000002  RWIX

     

    使用 RAM (带有错误注释):

    存储器配置

    名称             起点       长度       已使用      未使用    的属性     填充
    ------------    ----       ------      ----       ----     --------    
    第0页:
    开始          00000000   00000002  00000002  00000000  RWIX
    RAMM0         00000122    000002DE  000002DE  00000000  RWIX
    RAMLS_PROG  00009000    00002000  00001fff    00000001  RWIX
    RAMD0         0000b000    00000800  00000800   00000000  RWIX
    RAMGS_PROG  00014000    00004000  00003ffb    00000005  RWIX
    BEGIN_FLASH  00080000   00000002  00000000  00000002  RWIX
    FLASHA_N      00080002   0003fffe    00000000  0003fffe   RWIX
    复位          003fffc0     00000002  00000000  00000002  RWIX

     

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

    实际上、我的程序很简单。 我使用
    a) 7个 ADC 引脚。
    b) 2个 SPI (具有4个 GPIO 和 SPI_C 的 API_A)。
    c)我的代码(算法)(使用 MATLAB 函数块)。


    根据您在下面的评论、
    "请记住、该器件上有一个完整的第二个内核、其 SRAM 和闪存的数量与主内核相同。 您可以考虑在两个内核之间拆分代码、因为大小和速度都是一个原因。"

    A)您能告诉我我如何做到这一点吗?
    b)是否可以使用一个 MATLAB 模型在 CPU2上运行"SPI"、而在 CPU1上运行其余部分? 如果是、我该怎么做?
    C)如何将 CPU1&CPU2的两个 RAM 链接在一起? 在".cmd"文件中,我知道如何将 RAM 部件和闪存连接在一起(但它们都位于同一 CPU 上)(例如,在.cmd 文件中将 FLASHA_N 添加到 RAM 中,(page = 0 #ifdef CPU1.text:>RAMM0 | RAMD0 | RAMLS_PROG | RAMGS_PROG | FLASHA_PROG)。
    d)如何使用来自另一个 CPU 的 RAM? 附件为".cmd"文件。

    e2e.ti.com/.../.cmd.txt

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

    Asraf、

    我将在下面的 C2000Ware 中内联一部分链接器命令文件、以显示 RAM 及其大小。  从 MW 输出来看、他们似乎在 LS 和 GS Progs 中将其中的多个组件组合在一起。  但是、GS RAM 的可寻址空间比列出的要大得多。  如果您修改 MW 示例以反映这一点、我认为您应该能够适应整个程序。

    查看下面的内容、看看您是否可以修改示例以获得程序所需的额外存储器。   

    如果出于存储器或带宽的原因需要使用 CPU2、则可以创建一个单独的项目(至少在 Code Composer 中是如此)、该项目是直接构建并加载到 CPU2中的。  我假设 MW 实现是类似的、即您将有一个不同的块、并且有一个地方可以将目标指定为 CPU2与 CPU1。

    MEMORY
    {
    PAGE 0:
    /* BEGIN 用于“引导至 SARAM"引导加载程序模式*/
    
    BEGIN :origin = 0x000000,length = 0x000002
    RAMM0 :origin = 0x000123,length = 0x0002DD
    RAMD0 :origin = 0x00B000、length = 0x000800
    RAMLS0 :origin = 0x008000、length = 0x000800
    RAMLS1 :origin = 0x008800,length = 0x000800
    RAMLS2 :origin = 0x009000、length = 0x000800
    RAMLS3 :origin = 0x009800,length = 0x000800
    RAMLS4 :origin = 0x00A000、length = 0x000800
    reset :origin = 0x3FFFC0,length = 0x000002
    
    page 1:
    
    boot_RSVD :origin = 0x000002、length = 0x000121 // M0的一部分,引导 ROM 将此用于栈*/
    RAMM1 :origin = 0x000400、length = 0x0003F8 /*片上 RAM 块 M1 *//
    RAMM1_RSVD :origin = 0x0007F8,length = 0x000008 /*根据勘误咨询"Memory:Prepetching Beyond Valid Memory"(内存:有效内存之外的预取)来保留和不用于代码*/
    RAMD1 :origin = 0x00B800,length = 0x000800
    
    RAMLS5 :origin = 0x00A800,length = 0x000800
    
    RAMGS0 :origin = 0x00C000、length = 0x001000
    RAMGS1 :origin = 0x00D000、length = 0x001000
    RAMGS2 :origin = 0x00E000、length = 0x001000
    RAMGS3 :origin = 0x00F000、length = 0x001000
    RAMGS4 :origin = 0x010000,length = 0x001000
    RAMGS5 :origin = 0x011000,length = 0x001000
    RAMGS6 :origin = 0x012000,length = 0x001000
    RAMGS7 :origin = 0x013000、length = 0x001000
    RAMGS8 :origin = 0x014000、length = 0x001000
    RAMGS9 :origin = 0x015000,length = 0x001000
    RAMGS10 :origin = 0x016000,length = 0x001000
    
    // RAMGS11 :origin = 0x017000、length = 0x000FF8 //取消对 F28374D、F28376D 器件的注释*//
    
    RAMGS11_RSVD:origin = 0x017FF8,length = 0x000008 //根据勘误表中的“Memory:Prepetching Beyond valid Memory”*/
    
    RAMGS11保留并不用于代码 :origin = 0x017000、length = 0x001000 /*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 */
    RAMGS12 :origin = 0x018000、length = 0x001000 /*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 */
    RAMGS13 :origin = 0x019000、length = 0x001000 /*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 */
    RAMGS14 :origin = 0x01A000、length = 0x001000 /*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 */
    RAMGS15 :origin = 0x01B000、length = 0x000FF8 /*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 //
    
    RAMGS15_RSVD:origin = 0x01BFF8,length = 0x000008 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超出有效内存的预取)来保留代码且不用于代码*/
    /*仅在 F28379D、F28377D、F28375D 器件上。 移除其他设备上的线路。 //
    
    CPU2TOCPU1RAM:origin = 0x03F800,length = 0x000400
    CPU1TOCPU2RAM:origin = 0x03FC00,length = 0x000400
    
    CANA_MSG_RAM :origin = 0x049000、length = 0x000800
    CANB_MSG_RAM :origin = 0x04B000、length = 0x000800
    } 

    最棒的
    Matthew