Arduinoのライブラリを作る その1(USART)

usart.h

#ifndef _USART_H
#define _USART_H

class Usart{
public:
  void USART_init(unsigned int ubrr);
  void USART_Transmit(unsigned char data);
  char USART_recv(void);
  void putString(char msg[]);
  int getUBRR(int baud);
  int getUBRR(int baud,unsigned long fosc);
};

#endif

usart.cpp

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

int Usart::getUBRR(int baud){
  unsigned long fosc = 16000000;
  return (fosc/(16*(unsigned long)baud)-1);
}

int Usart::getUBRR(int baud, unsigned long fosc){
  return (fosc/(16*(unsigned long)baud)-1);
}

void Usart::USART_init(unsigned int ubrr){
  UBRR0H = (ubrr>>8);
  UBRR0L = ubrr;
  UCSR0B = _BV(RXEN0)|_BV(TXEN0); //RX-TX enable
  UCSR0C = (3<<UCSZ00);//define data frame: CSZ = CharacterSiZe
}

void Usart::USART_Transmit(unsigned char data){
  loop_until_bit_is_set(UCSR0A,UDRE0);
  UDR0 = data;
}

char Usart::USART_recv(void)
{
  while(!(UCSR0A & (1<<RXC0)));
  return UDR0;
}

void Usart::putString(char msg[])
{
  int i;
  for(i=0;msg[i];i++){
    USART_Transmit(msg[i]);
  }
}

main.cpp

#include "usart.h"

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

  char msg;
  while(1){
    msg = u.USART_recv();
    u.USART_Transmit(msg); 
  }

  return 0;
}

Arduinoの同等コード

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

void loop(){
  while(Serial.available()>0){
    char s = Serial.read();
    Serial.print(s);
  }
}

Arduinoの同等コードのメモリ使用

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

Program:    1984 bytes (6.1% Full)
(.text + .data + .bootloader)

Data:        201 bytes (9.8% Full)
(.data + .bss + .noinit)

cppのメモリ使用状況

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

Program:     446 bytes (1.4% Full)
(.text + .data + .bootloader)

Data:          8 bytes (0.4% Full)
(.data + .bss + .noinit)

SerialクラスはSRAM領域を多く使うみたい。