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.

[参考译文] CCS/LUNCHXL-F2.8377万S:如何使用内存RAM和放大器;闪存以最大采样率记录数据?

Guru**** 2542160 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/616277/ccs-launchxl-f28377s-how-to-use-memory-ram-flash-to-record-data-at-maximum-sampling-rate

部件号:LAUNCHXL-F2.8377万S

工具/软件:Code Composer Studio

尊敬的先生:

我在结构健康监控项目中使用TI Launchpad F2.8377万S。 我想在2000点的ADC (12位分辨率时为3.5MSPS)的最高采样速率下记录数据(例如,对于2000/(3.5 *10^6)=0.571msec)。 现在,我使用controlSUITE "ADC_SOC_CONTAC"中的默认示例程序对这些数据进行采样。 问题是,当我使用此程序对带有“2837xS_Generic_RAM_lnk.cmd”链接器命令文件的1504样本进行采样时,它工作正常,但对于2000个样本,它显示了如所附图像中所示的错误。但与“2837xS_Generic_flash_lnk.cmd”相同的代码工作正常,但采样率会降低,这可能是因为正在写入 闪存需要比在RAM中写入更多的时间。

我再次想对这些数据进行16次采样,并对采样数据进行平均计算。 因此,我可能 需要在RAM中对这些数据进行采样,然后在闪存中复制相同的阵列,并将其复制16次,然后将其平均化。 但我 不知道如何编写这样的程序,也不知道应该使用哪个链接程序命令文件。 另外 ,我尝试使用闪存链接程序命令文件(即“2837xS_Generic_RAM_lnk.cmd”)创建2000个UINT16点的数组,当我创建3个以上的此类数组时,它显示了与图像中所示相同的错误。  

那么,问题到底是什么呢? 因为要存储2000个点数,我需要一个2000*16=32000bits=32000/8*1024=<xmt-block0>3.2万 3.90625 KB3.2万 3.90625 KB</xmt-block>1024 的9.0625万 的内存 ,对于16个这样的数组,我需要一个3.9.0625万 *16= 62.5 KB 的内存。 但此设备具有1 MB 闪存和128 KB RAM,因此确切的问题是什么。 我做什么错了吗? 我正在按照“file__C__ti_controlSUITE_DEVICE_SUPPORT_F2837xS_V210_doc_F2837xS-FRM-EX-UG.pdf”2837”文档中提到的所有步骤来设置属性和链接器命令文件。

我还是新手,之前 我使用过Arduino板。 因此,请考虑我是否提出了一些非常基本的问题。 请帮助我了解Launchpad

谢谢你  

Mandar Kothavade

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

    设备上最大的连续RAM块是GS RAM组0至15。 每个都是4K x 16,因此我认为您应该有足够的空间来存储所有捕获的数据。

    创建命名RAM部分:
    //用于存储转换结果的缓冲区
    #define results_buffer_size 6.5536万
    UINT16 resultArray[results_buffer_size];
    #pragma data_section(resultArray,".adc_result_table";

    然后编辑链接程序命令文件,将此命名部分放入特定的内存块中:
    章节

    ...
    .ADC_result_table:> RAMGS, 页面= 1.
    }

    请注意,在这里,我将'RAMGS'重新定义为一个覆盖所有16个GS块的块:
    第1页:
    RAMGS :原点= 0x00C000,长度= 0x1万
    //RAMGS0 :原点= 0x00C000,长度= 0x0.1万
    //RAMGS1 :原点= 0x00D000,长度= 0x0.1万
    //RAMGS2 :原点= 0x00E000,长度= 0x0.1万
    //RAMGS3 :原点= 0x00F000,长度= 0x0.1万
    //RAMGS4 :原点= 0x1万,长度= 0x0.1万
    //RAMGS5 :原点= 0x1.1万,长度= 0x0.1万
    //RAMGS6 :原点= 0x1.2万,长度= 0x0.1万
    //RAMGS7 :原点= 0x1.3万,长度= 0x0.1万
    //RAMGS8 :原点= 0x1.4万,长度= 0x0.1万
    //RAMGS9 :原点= 0x1.5万,长度= 0x0.1万
    //RAMGS10 :原点= 0x1.6万,长度= 0x0.1万
    //RAMGS11 :原点= 0x1.7万,长度= 0x0.1万
    //RAMGS12 :原点= 0x1.8万,长度= 0x0.1万
    //RAMGS13 :原点= 0x1.9万,长度= 0x0.1万
    //RAMGS14 :原点= 0x01A000,长度= 0x0.1万
    //RAMGS15 :原点= 0x01B000,长度= 0x0.1万

    请注意,您不必在您的案例中合并所有块,因为我认为您只需要大约一半块。

    如果需要多个阵列,可以创建多个数据段,然后将它们分配给同一组合块。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的Devin:

    感谢您的回复。 和抱歉,我的回答很晚(实际上我的生活中有什么问题)

    那么,这是否意味着我需要在程序和链接程序命令文件中每次都指定数据的存储位置(使用您所示的过程)? 难道我们没有其他方法来实现这一目标吗?或者编译器可以自动分配内存吗? 链接程序命令文件中的.ebss (用于存储未初始化的数据)部分如何?如果我更改了以下内容,它将起作用,但有什么影响(如果有)?
    //.ebss :>RAMLS5,第= 1页
    .ebss :> RAMGS,第= 1页
    此过程可能会避免使用pragma。

    另一件事是当我将程序写入RAM时,它会在其中停留一次。 关闭或重置设备后,它将消失(显然这是因为RAM只保留临时数据)。 因此,需要将数据和程序存储到闪存中,因为我需要一个永久程序。 我需要ADC采样速率的最大值,它只能与RAM一起使用。 那么做这件事的方式是什么呢?

    我检查了闪存的默认链接程序命令文件,即“2837xS_Generic_flash_lnk”。 它还将RAM部分用于未初始化的数据(即 .ebss)。 因此,我认为在使用闪存链接器命令文件时降低ADC速度的原因不是因为将捕获的样本写入内存时出现延迟(因为它仅使用RAM部分),而可能是因为从闪存中获取程序。 请你把这件事告诉我吗? 我对此感到困惑,为什么当我使用闪存链接器命令文件运行程序时ADC速度变慢。

    再次为延迟回复和愚蠢的问题(如果有的话)道歉。

    感谢您帮助我了解Launchpad并展示新的工作方式。
    曼达尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Mandal,

    您不必使用命名数据部分将大型数据结构放入内存中。 我通常喜欢为大于1K的任何部分创建一个分区,以确保它从一个好的圆形地址开始,以便在内存浏览器中轻松检查。

    如您所建议的,只要有空间,您就可以让链接程序指派结构。 但是,您仍必须手动确保有足够大的内存块(或块组合)。

    闪存中的代码执行速度将比RAM慢,因为它不是0等待状态内存。 如果有许多分支(例如紧密的内部循环或ISR),则尤其如此,因为有一个预取缓冲区,可加速从闪存执行线性代码。

    对于ISR,内部循环和任何其他时间关键型代码,您可以将代码存储在闪存中,但在开机时复制到RAM并从RAM执行。 在e2e论坛和TI文档中搜索"ramfuncs",以了解如何实现这一目标。