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/TM4C123GH6PM:如何根据需要对存储器进行分区

Guru**** 2455360 points
Other Parts Discussed in Thread: TM4C123GH6PM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/639054/ccs-tm4c123gh6pm-how-to-partition-the-memory-as-per-need

器件型号:TM4C123GH6PM

工具/软件:Code Composer Studio

大家好、

我正在尝试运行一个需要超过32、768字节的特定代码。

是否有某种方法可以使用空白存储器(闪存262KB 的93%)、如下图所示?

是否可以根据用户的需要对存储器进行分区? 如果是、我应该更新哪个文件?

提前感谢您的帮助

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

    [报价用户="Rohan Chahwan"]是否有某种方法可以使用下图所示的空白存储器(闪存262KB 的93%)?

    您的帖子显示-但不解释- 32KB 存储器限制描述了 MCU 的 SRAM。   空白存储器是闪存-不能用作与 SRAM 相同的角色。

    您会说、"分区"(这是可能的)、但"扩展 SRAM 失败、超出 MCU 列出的(32KB)限制。"   

    相反-不会更多地"关注"哪些变量"真正/真正"需要"在 SRAM 中放置"-证明是更好的路径?   为了帮助这种关注-您是否可以重新检查您的标准、"放置和/或声明/定义对象-以便它们(可能)成为 SRAM 驻留对象?"   (例如、如果函数的参数块(变量)不太可能更改、您可以"对其进行硬编码"-并转义由此产生的 SRAM 使用。)

    您还可以考虑 MCU 的 EEPROM -但会受到相应的惩罚-勘误手册很多。  (和预测)  外部 EEPROM 更快、更轻松且更可靠。   (因此非常出色!)   这个供应商生产一个相当独特的外部 RAM 器件(fram)-您可以通过搜索来考虑它。    

    MCU 的闪存是一种(不太可能)替代方案-可能允许(部分)可变存储-但速度、代码大小和复杂性会受到非常严重的影响。  

    远远超过32KB SRAM 的其他 MCU 也可能会" ping 您的雷达"。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢
    我正在研究进一步减少变量和存储器使用量。
    尽管我想知道是否可以以及如何使用闪存? 我需要执行一系列添加和乘法并将数据存储在数组中。 我认为如果使用闪存、这不应该成为问题。 我之前曾在 C2000 MCU 上工作过、并且构建了一个 IF 闪存项目(工作正常)。

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

    [引用 user="Rohan Chahwan"]尽管想知道是否以及如何使用闪存?

    这样的"虽然..." 从 Thread 的主题快速/硬切换(如何分区)-不是吗?   多个主题-包含在单个主题中-使该主题极难"表征和清晰放置"-这极大地推动了"未来读者"的努力。

    您的(真实的)问题"如何分区"是否得到了有效的回答?   (尚未(尚未)标记为已解决!)   分区不可能帮助您-而是必须强制执行"SRAM 纪律措施"-以避免超过 SRAM 容量-尤其是在 SRAM 容量如此有限的情况下。

    我记得有一些关于闪存使用的解释-超出了"正常/习惯"-也许还有"正如您所寻求的那样"。   这种情况应出现在另一个主题中(在这一个主题标记为"已解决"后) -您不同意吗?

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

    [引用 USER="CB1_MOBILE"]

     这种情况应出现在另一个主题中(在这一个主题标记为"已解决"后) -您不同意吗?

    [/报价]

    的确是这样

    感谢您的澄清

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

    我已经研究了 TM4C123GH6PM 手册和这里的一篇有关使用闪存存储数据和读取的相关文章、其中有一些指针来激励我不要在其中花费时间。 (因为我正在为该项目计时... 无论如何!)

    在这里提及这些要点:

    1) 1)它会减慢该过程

    2) 2)有限的闪存擦除周期。

    我通过某种方式设法将 SRAM 使用量降低到44%、在不同的时间将同一阵列用于不同的数据存储。 (尚未测试... 完成后将在此处更新结果!)

    因此、我不发布用于闪存存储器读取/写入的新线程

    如果读者想了解更多相关信息、我只找到了1篇与此相关的文章。

    谢谢:)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的朋友-您似乎"在火上"(意味着完全专注-并以极快的速度有效前进!) 您的"帮助者"必须站起来、以免火花/飞出的发射器点燃"附近"的火花。

    正如之前在这里发布的-现在已得到您的确认-使用 MCU 闪存作为 SRAM 替代产品、"尝试男人的灵魂"(即很少-如果有-推荐!)

    如果尚未掌握-请查看您的"映射文件"、该文件应显示您(实际)的 SRAM 使用情况。 我毫不怀疑你报告44%的使用率-然而(有些)似乎是"可疑的"-如此巨大的"储蓄"-如此迅速-在"正常/习惯!"之外转向
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引述 user="CB1_MOBIT">我的朋友-您似乎"火上火"(意思是完全专注-并以极快的速度高效前进!) 您的"帮助者"必须站起来、以免火花/飞出的发射器点燃"附近"的火花。
    [/报价]

    哈哈:D

    [引述]

    我毫不怀疑你报告44%的使用率-然而(有些)似乎是"可疑的"-如此巨大的"储蓄"-如此迅速-在"正常/习惯!"之外转向

    [/报价]

    之前、我为每个后续级(平滑->乘法器->滤波)使用了不同的数组、这些数组消耗了空间。 现在、我将在每个阶段更新虚拟数组、但代价是要增加几个变量(而不是数组)。 帮助我降低了要求。

    此致、

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

    [引用用户="Rohan Chahwan"]

    我通过某种方式设法将 SRAM 使用量降低到44%、在不同的时间将同一阵列用于不同的数据存储。 (尚未测试... 完成后将在此处更新结果)

    [/报价]

    正如我在前面的帖子中提到的、用于更新结果

    在这里-

    //---include 库
    
    //---variable declarations
    
    extern int sin_tab[198];//查找正弦波1周期198点
    extern float B[257]的表;// FIR fiter 系数;order 256
    
    main (void)
    {
    //时钟设置为80MHz
    SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz | SYSCTL_OSC_MAIN);
    
    //初始化 ADC、GPIOE、计时器
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);// ADC 输入引脚
    SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);//ADC 外设
    SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);//Timer0外设
    
    //Initialize the data acquisition array with zeroes (使用零初始化数据采集数组
    对于(i=0;i<1500;i++)
    {
    Data0[i]=0;
    }
    I=0;
    
    //配置 TIMER0
    TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODICASE);
    TimerLoadSet (TIMER0_BASE、TIMER_A、0x1);//采样@500kHz
    TimerControlTrigger (TIMER0_BASE、TIMER_A、TRUE);
    
    //配置 ADC0
    GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);//设置通道1的 GPIO_E3
    ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_TIMER、0);//序列发生器3
    ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END);
    ADCSequenceEnable (ADC0_BASE、3);
    
    while (1)
    {
    //while c=1时、ADC 将继续将光电探测器输出存储在中
    //Data0[]数组。 ADC 采样频率由定义
    //定时器触发和 ADC0IntHandler 处理上述操作。
    如果(c==1)
    {
    //启用中断
    TimerEnable (TIMER0_BASE、TIMER_A);
    ADCIntEnable (ADC0_BASE、3);
    IntEnable (INT_ADC0SS3);
    I=0;
    C=2;
    }
    
    //while c=4时、通过9点移动平均滤波器对采集的数据进行平滑处理
    如果(c==4)
    {
    TimerDisable (TIMER0_BASE、TIMER_A);
    ADCIntDisable (ADC0_BASE、3);
    //IntDisable (INT_ADC0SS3);
    
    C=5;
    //… 负重9点 MA 滤波器… //
    for (i=4;i<1497;i++)
    {
    Data0[i]=(Data0[I-4]+Data0[I-3]+Data0[I-2]+Data0[i]+Data0[i]+Data0[i+1]+Data0[i+2]+Data0[i+3]+Data0[i+4])/9;
    }
    I=0;
    C=6;
    }
    
    //while c=6信号被进一步处理、即乘以
    //基准正弦波,然后从256阶 FIR 滤波器中滤除
    如果(c==6)
    {
    //… 乘以参考 sinusoid。fs = 100ksps。。。 //
    对于(i=0;i<1500;i++)
    {
    //"(((((float)sin tab[(((harm *6*i)+(int)(phase /1.818181818181818181)))%198]-500)*0.002"是正弦
    //波形生成、查找表中包含0-1000范围内的198个点
    // HARM -控制用户想要选择的谐波
    //相位-以度数控制相位延迟(具有198个点、用户可以跳过1.818181步长)
    MULT[i]= Data0[i]*(((float) sin_tab[(harm *6*i)+(int)(phase/1.818181))%198])-500)*0.002;
    }
    M=0;
    I=0;
    
    //FIR 滤波器0rder 256、B 存储滤波器系数
    对于(m = 0;m < 1200;m++)
    {
    对于(I = 0;I < 257;I++)
    {
    temp = temp + B[256-i]*mult[m + i];
    }
    //I = 0;
    lkin[m]=温度;
    温度= 0;
    }
    }
    
    
    
    }
    

    ADC ISR

    //读取变量"value"中的 ADC 输出
    ADCSequenceDataGet (ADC0_BASE、3、VALUE);
    
    //检查“值”是否大于阈值
    //并更新状态检查变量“c”
    如果(c<3)
    {
    if (value[0])<(uint32_t) 1600)
    {
    C=3;
    I=0;
    }
    }
    
    //开始将数据存储在 Data0[]中
    //完成时更新状态变量“c”
    如果(c==3)
    {
    if (i<1500)
    {
    Data0[i++]=(float)值[0];
    }
    其他
    {
    I=0;
    C=4;
    }
    }
    
    ADCIntClear (ADC0_BASE、3);
    
    

    这是否可以进一步减少并提高效率? (我认为这应该是可能的!)

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

    大家好

    我知道、下面给出的查询不是仅与此帖子标题相关的。 但是、我还是在这里发布、因为在之前的帖子中、我提供了代码片段(几乎已满)、现在我觉得没有必要为下面的查询启动一个新的线程、因为它没有太多的技术依据。

    所以、

    查询:-我想在下降沿开始读取 ADC 值,如下图所示。 关于先前帖子中提供的代码、有人可以建议 对此进行任何改进吗?  仅 ADC 数据采集部分、而不是平滑处理和后续处理部分

    信号是周期性的、因此应看起来像一个从最低点开始的类似斜坡的信号、并且在结束时、是否覆盖整个斜坡并不重要(或者、可能略大于/小于1个斜坡式信号周期)