Arduinoのライブラリを作る その2(ADC)

adc.h

#ifndef _ADC_H_
#define _ADC_H

class Adc {
public:
  void adc_init();
  int adc_conv(int pin);
};

#endif

adc.cpp

#include "adc.h"
#include <avr/io.h>

#define sbi(BYTE,BIT) BYTE|=_BV(BIT) 
#define cbi(BYTE,BIT) BYTE&=~_BV(BIT) 

void Adc::adc_init(){
  ADMUX |= _BV(REFS0);//AVCC as Vref
  ADCSRA |= _BV(ADEN)|_BV(ADSC);//ADC enable, Start conversation;
}

int Adc::adc_conv(int pin){
  int res;  
  ADMUX = _BV(REFS0)|pin;
  cbi(ADCSRA,ADIF);
  sbi(ADCSRA,ADSC);
  loop_until_bit_is_set(ADCSRA,ADIF);
  res = ADCL; 
  res += (ADCH<<8); 
  return res;
}

main.cpp

#include "usart.h"
#include "adc.h"
#include <util/delay.h>
#include <stdlib.h>

int main(void){
  Usart u;
  int ubrr = u.getUBRR(9600);
  u.USART_init(ubrr);
  u.putString("Hello!\n");
  Adc a;
  a.adc_init();

  int data;
  char buf[10];
  while(1){
    data = a.adc_conv(0);
    itoa(data,buf,10);
    u.putString(buf);
    u.putString("\n");
    _delay_ms(500);  
  }

  return 0;
}

ライブラリ化する前のコード

void setup(){
  Serial.begin(9600);
  Serial.println("Hello");
}

void loop(){
  int val = analogRead(A0);
  Serial.println(val);
  delay(1000);
}

ライブラリ化する前(.ino)のメモリ使用状況

AVR Memory Usage
----------------
Device: atmega328p

Program:    2666 bytes (8.1% Full)
(.text + .data + .bootloader)

Data:        203 bytes (9.9% Full)
(.data + .bss + .noinit)

cppのメモリ使用状況

AVR Memory Usage
----------------
Device: atmega328p

Program:     734 bytes (2.2% Full)
(.text + .data + .bootloader)

Data:         10 bytes (0.5% Full)
(.data + .bss + .noinit)

ArduinoはいったいSRAMで何やってるんだろう。