我有个关于代码和奇怪异常的问题。此代码放置在数字公园上。Digispark的代码大小限制为6,010字节。当使用嵌套的if语句时,文本不会输出到液晶屏幕(参见下面的链接)。通过逐个地注释掉每一组,我能够让它再次工作。
基本液晶显示功能:
变量是浮点类型的。
float inside_temp;
float outside_temp;
float target = 74.00;
//inside_temp and outside_temp are values from 2 ds18b20's
inside_temp = 70.70;
outside_temp = 70.81;LCD在使用此代码时工作,其注释如下。编译后的大小为5,928字节。
if(inside_temp < target){
//Create a limit so heater isn't crazy hot as 5 gallons takes a while to change temperature.
// float limit = target + 1;
// if(outside_temp > limit){
// digitalWrite(RELAY_PIN, LOW);
// lcd.print("OFF");
// }
// else{
digitalWrite(RELAY_PIN, HIGH);
lcd.print("ON");
// }
}
else{
digitalWrite(RELAY_PIN, LOW);
lcd.print("OFF");
}液晶显示器也与此代码一起工作。编译后的大小为5,590字节。
// if(inside_temp < target){
//Create a limit so the heater isn't crazy hot as 5 gallons takes a while to change temperature.
float limit = target + 1;
if(outside_temp > limit){
digitalWrite(RELAY_PIN, LOW);
lcd.print("OFF");
}
else{
digitalWrite(RELAY_PIN, HIGH);
lcd.print("ON");
}
// }
// else{
// digitalWrite(RELAY_PIN, LOW);
// lcd.print("OFF");
// }当未加注释时,LCD不工作。编译后的大小为5,992字节。它所做的就是坐在那里,背光,没有文字。http://imgur.com/xPAzY0N,DdGdYoI
if(inside_temp < target){
//create a limit so heater isn't crazy hot as 5 gallons takes a while to change temperature.
float limit = target + 1;
if(outside_temp > limit){
digitalWrite(RELAY_PIN, LOW);
lcd.print("OFF");
}
else{
digitalWrite(RELAY_PIN, HIGH);
lcd.print("ON");
}
}
else{
digitalWrite(RELAY_PIN, LOW);
lcd.print("OFF");
}我不明白为什么会这样。这是因为我太接近最大尺寸限制了吗?我不能像这样构造代码吗?
发布于 2013-01-28 15:06:11
我认为在没有能够在本地测试的情况下,很难以一种决定性的方式回答这个问题。
不过,听起来确实很可疑,当代码大小接近最大值时,它就会中断。另一方面,它似乎表明了工具中的一个bug,如果超出了某些限制,它就不会破坏“难”。
关于如何减少代码大小的一些提示:
float,因为CPU必须模仿它。定点格式对温度应该是很好的.digitalWrite()和lcd.print()的函数调用,因为函数调用会生成相当多的代码。将这些调用排除在外的一种方法是这样做:
uint8_t relay_pin = LOW;
const char *lcd_text = "OFF";
if(inside_temp < target) {
float limit = target + 1;
if(outside_temp > limit) {
}
else {
relay_pin = HIGH;
lcd_text = "ON";
}
}
digitalWrite(RELAY_PIN, relay_pin);
lcd.print(lcd_text);这使用的事实是,我们希望总是更新LCD和继电器,所以我们总是可以调用的功能。然后我们使用变量来保存所需的值,因为赋值通常比函数调用便宜(在代码大小方面)。
发布于 2013-01-28 16:02:28
不要忘记内存的体积很小,因为Attiny85只有512字节的SRAM,而不是328的2K。你可能就是快没内存了。我知道当它用完的时候,它就坐在那里。
我建议从这个库中读取自述文件以获得FreeRAM。它提到了".print“如何同时消耗内存和ROM。
我现在总是用
Serial.print(F("HELLO")); 对比
Serial.print("HELLO"); 因为它节省内存,这对于lcd.print来说应该是正确的。我总是把一个
Serial.println(freeMemory(), DEC); // print how much RAM is available.在代码的开头,要注意。注意到需要有足够的空间来运行实际的代码并对其进行递归。
将.print分解为一个实例的示例是使用一个变量。它实际上与F() (旧的getPSTR())类似,因为它不再是一个const字符串。因此,它实际上也使用较少的RAM。
https://stackoverflow.com/questions/14564714
复制相似问题