foo()
{
int myvar = 5;
}
必须更改为
foo()
{
static int myvar;
myvar = 5;
}
参数 如果您在参数中传递大量数据,您很快就会遇到同样的256字节限制。在这里,您最好的选择可能是传递到全局分配的结构体/选项的指针。或者,您可以设置由顶层呼叫者设置并由调用程序在树下读取的全局设置变量。这真的取决于软件设计哪种方法更好。我在处理内存有限的芯片编译器/链接器方面的经验是,只要不使用递归函数并告知编译器,那么编译器非常能够确定所需的最小堆栈空间。
我甚至见过一些编译器为每个自动存储变量分配全局固定地址(完全没有堆栈),其中多个变量被分配到重叠的内存中,只要它们的生命周期不重叠。
在进行(速度或空间)优化时的一般建议是:进行测量以证明您的优化确实具有积极影响。
这可能听起来显而易见,但在8位处理器上尽量不要使用16位变量。 16位变量在更大的架构中是可以使用和需要的,但在受限制的(8位)架构中,16位算术是在短时间内耗尽RAM和ROM存储器的快速方式。
如果您尝试递增16位变量,则编译器将包含一个16位增量库,在大多数情况下会消耗大量空间。
此外,尽量不要进行除法或乘法运算,因为对于某些控制器它们是软件实现的。
个人而言,我通常使用char
,并且在需要除法运算时,使用右旋转'n'次以2的n次方进行除法运算。
希望这有所帮助!
由于你的内存快要用完了,你必须计算每个字节的RAM。使用本地变量(自动变量)可以在需要时重复使用内存(函数中的本地内存)。当您将变量移动到全局静态地址空间时,您为每个变量分配了唯一的空间。这是地址空间的浪费。
Microchip编译器允许不同的变量共享相同的地址。我手头没有文档,但可以通过pragma实现。
但是你需要的是对RAM需求的分析。当您看到堆栈无法容纳所有变量但自动变量可以减少全局内存使用时,应考虑使用启动代码和链接脚本来增加堆栈大小。
最佳实践是选择符合要求的硬件。
有些微控制器的成本只比其他微控制器高几美元,但可以节省数百或数千美元的开发成本。如果这是一项业余开发,则您的努力可能不算什么。但在现实世界中,您经常会发现硬件仅考虑硬件成本而设计。
特别是PIC18并不是紧凑代码的最佳示例,这也可能会导致闪存内存的问题。