Оптимизация

michaelukolov
Offline
Зарегистрирован: 16.04.2015
#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%).

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
Размер скетча в двоичном коде: 5 434 байт (из 7 168 байт максимум)

цифры какие нереальные даешь

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

еще проверил с похожим кодом


Размер скетча в двоичном коде: 4 978 байт (из 7 168 байт максимум)
Размер скетча в двоичном коде: 4 992 байт (из 7 168 байт максимум)

 

michaelukolov
Offline
Зарегистрирован: 16.04.2015

Упс. Не туда глянул. 5 026 байт из 7 680

Logik
Offline
Зарегистрирован: 05.08.2014

michaelukolov пишет:
Как еще можно оптимизировать этот код? Сейчас занимает 214 байт (65%).

В 40,41 убрать плавающую точку. type_s всегда 0? убрать ветку ифа для не 0. выбирать из ds.read нужные данные в нужные переменные без буфера. Сама либка OneWire - безкрайний источник вдохновения оптимизатора

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

Serial закоментируй. И С Новым годом УСЕХ!

 

temenator
Offline
Зарегистрирован: 26.12.2015

На такой маленькой меге проще уйти в асм. Тем более библиотека для датчиков есть под ассемблер.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Если вам нужен вывод данных в com порт и точность до десятых градуса то никак.

Serial и float жрут очень много.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

michaelukolov пишет:
Как еще можно оптимизировать этот код? Сейчас занимает 214 байт (65%).

Цель оптимизации? Из любви к искусству? Целевой размер скетча? 0?

michaelukolov
Offline
Зарегистрирован: 16.04.2015

Serial уберу, но в конце концов мне нужно вывести температуру на HD44780, боюсь, что на LiquidCrystal места не хватит

Alexino
Offline
Зарегистрирован: 29.12.2015

А Вы не бойтесь, пробуйте. Не хватит - будете уже думать.
Проблемы нужно решать по мере их посупления, а не выдумывать их без всяких оснований.