工具/软件:Code Composer Studio
大家好、
我正在尝试运行一个需要超过32、768字节的特定代码。
是否有某种方法可以使用空白存储器(闪存262KB 的93%)、如下图所示?
是否可以根据用户的需要对存储器进行分区? 如果是、我应该更新哪个文件?
提前感谢您的帮助
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.
工具/软件: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 您的雷达"。
[引用 user="Rohan Chahwan"]尽管我想知道是否以及如何使用闪存?
这样的"虽然..." 从 Thread 的主题快速/硬切换(如何分区)-不是吗? 多个主题-包含在单个主题中-使该主题极难"表征和清晰放置"-这极大地推动了"未来读者"的努力。
您的(真实的)问题"如何分区"是否得到了有效的回答? (尚未(尚未)标记为已解决!) 分区不可能帮助您-而是必须强制执行"SRAM 纪律措施"-以避免超过 SRAM 容量-尤其是在 SRAM 容量如此有限的情况下。
我记得有一些关于闪存使用的解释-超出了"正常/习惯"-也许还有"正如您所寻求的那样"。 这种情况应出现在另一个主题中(在这一个主题标记为"已解决"后) -您不同意吗?
我已经研究了 TM4C123GH6PM 手册和这里的一篇有关使用闪存存储数据和读取的相关文章、其中有一些指针来激励我不要在其中花费时间。 (因为我正在为该项目计时... 无论如何!)
在这里提及这些要点:
1) 1)它会减慢该过程
2) 2)有限的闪存擦除周期。
我通过某种方式设法将 SRAM 使用量降低到44%、在不同的时间将同一阵列用于不同的数据存储。 (尚未测试... 完成后将在此处更新结果!)
因此、我不发布用于闪存存储器读取/写入的新线程
如果读者想了解更多相关信息、我只找到了1篇与此相关的文章。
谢谢:)
[引述 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个斜坡式信号周期)