Оптимизация
- Войдите на сайт для отправки комментариев
Пт, 01/01/2016 - 21:45
#include <OneWire.h>
OneWire ds(10);
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;
if ( !ds.search(addr)) {
ds.reset_search();
return;
}
type_s = 0;
ds.reset();
ds.select(addr);
ds.write(0x44, 1);
delay(200);
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3;
if (data[7] == 0x10) {
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7;
else if (cfg == 0x20) raw = raw & ~3;
else if (cfg == 0x40) raw = raw & ~1;
}
celsius = (float)raw / 16.0;
Serial.println(celsius);
}
В качестве дуины использую ATMega8 с прошитым бутлоадером, поэтому память на код сильно урезана. Как еще можно оптимизировать этот код? Сейчас занимает 214 байт (65%).
цифры какие нереальные даешь
еще проверил с похожим кодом
Упс. Не туда глянул. 5 026 байт из 7 680
В 40,41 убрать плавающую точку. type_s всегда 0? убрать ветку ифа для не 0. выбирать из ds.read нужные данные в нужные переменные без буфера. Сама либка OneWire - безкрайний источник вдохновения оптимизатора
Serial закоментируй. И С Новым годом УСЕХ!
На такой маленькой меге проще уйти в асм. Тем более библиотека для датчиков есть под ассемблер.
Если вам нужен вывод данных в com порт и точность до десятых градуса то никак.
Serial и float жрут очень много.
Цель оптимизации? Из любви к искусству? Целевой размер скетча? 0?
Serial уберу, но в конце концов мне нужно вывести температуру на HD44780, боюсь, что на LiquidCrystal места не хватит
А Вы не бойтесь, пробуйте. Не хватит - будете уже думать.
Проблемы нужно решать по мере их посупления, а не выдумывать их без всяких оснований.