HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2023/04/28

Arduino AVRで Stringクラスを使わない理由 Arduino AVRで Stringクラスを使わない理由

(Why I don't use String class with Arduino AVR)

Tags: [電子工作]




● Arduino AVRで Stringクラスを使わない理由

 Why I don't use String class with Arduino AVR

 答えは簡単、私がケチだから。

 ラズパイ OSを SDカードの書き込む場合のプログラムも既存のアプリは実行ファイルサイズが巨大すぎると言う理由で自作しました。

2020/03/01
FWinSdCardImager SDカード イメージ書き込みアプリ、ラズパイの Raspbian OS、Jetson Nanoの Ubuntuの書き込みに便利
FWinSdCardImager SDカード イメージ書き込みアプリ、ラズパイの Raspbian OS、Jetson Nanoの Ubuntuの書き込みに便利

  ラズパイや Jetson Nano等のワンボードマイコン等への OSイメージの書き込みが簡単にできる

 Stringクラスは文字列を簡単に扱えて便利ですが、プログラムサイズが肥大します。

 と言う訳で Stringクラスで使用している機能が限定的の場合は同等の関数を自前で作成した方が良いです。と言う結論です。

FLASH ROM RAM
String((byte)r、HEX)10976 bytes796 bytes
Serial.print((byte)r、HEX)9524 bytes786 bytes
自作した場合9648 bytes786 bytes
String((byte)r、HEX)を 5個11240 bytes796 bytes
Serial.print((byte)r、HEX)を 5個9550 bytes786 bytes
自作した場合を 5個9722 bytes786 bytes
 おい!.print((byte)r, HEX)が一番効率が良いじゃねえか(笑)

 とりあえず Stringクラスを使用した場合はプログラムサイズが 1300~1700バイト近く肥大すると言う事は判ったので良しとします。(強引に結論)

● Stringクラスを使う場合
Serial.print(String((byte)r, HEX));

Sketch uses 10976 bytes (36%) of program storage space. Maximum is 29696 bytes.
Global variables use 796 bytes (38%) of dynamic memory, leaving 1252 bytes for local variables. Maximum is 2048 bytes.

Serial.print(String((byte)r, HEX));
Serial.print(String((byte)r, HEX));
Serial.print(String((byte)r, HEX));
Serial.print(String((byte)r, HEX));
Serial.print(String((byte)r, HEX));

Sketch uses 11240 bytes (37%) of program storage space. Maximum is 29696 bytes.
Global variables use 796 bytes (38%) of dynamic memory, leaving 1252 bytes for local variables. Maximum is 2048 bytes.

● Serial.printの変換を使った場合
Serial.print((byte)r, HEX);

Sketch uses 9524 bytes (36%) of program storage space. Maximum is 29696 bytes.
Global variables use 796 bytes (38%) of dynamic memory, leaving 1252 bytes for local variables. Maximum is 2048 bytes.

Serial.print((byte)r, HEX);
Serial.print((byte)r, HEX);
Serial.print((byte)r, HEX);
Serial.print((byte)r, HEX);
Serial.print((byte)r, HEX);

Sketch uses 9550 bytes (37%) of program storage space. Maximum is 29696 bytes.
Global variables use 796 bytes (38%) of dynamic memory, leaving 1252 bytes for local variables. Maximum is 2048 bytes.

● String((byte)r, HEX)を自作した場合
Serial.print(toHexStr(r));

Sketch uses 9648 bytes (32%) of program storage space. Maximum is 29696 bytes.
Global variables use 786 bytes (38%) of dynamic memory, leaving 1262 bytes for local variables. Maximum is 2048 bytes.
Serial.print(toHexStr(r));
Serial.print(toHexStr(r));
Serial.print(toHexStr(r));
Serial.print(toHexStr(r));
Serial.print(toHexStr(r));

Sketch uses 9722 bytes (32%) of program storage space. Maximum is 29696 bytes.
Global variables use 786 bytes (38%) of dynamic memory, leaving 1262 bytes for local variables. Maximum is 2048 bytes.

● utoa()を使う方法も有ります
char tmp[3];
SerialDebug.print(utoa((byte)r, tmp, HEX));


●自作した toHexStr関数
char* toHexStr(byte n, bool padding_zero = true)
{
  static char buf[sizeof(byte) * 2 + 1]; // Assumes 8-bit chars plus zero byte.
  char *str = &buf[sizeof(buf) - 1];

  *str = '\0';

  do {
    char c = n & 0x0F;
    n >>= 4;

    *--str = c + '0' + (c >= 10) * ('A' - '0' - 10);
  } while((padding_zero & str != buf) || n);

  return str;
}

 Print.cppの実装をパクりました。
https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/Print.cpp#L203
Print.cpp

size_t Print::printNumber(unsigned long n, uint8_t base)
{
  char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
  char *str = &buf[sizeof(buf) - 1];

  *str = '\0';

  // prevent crash if called with base == 1
  if (base < 2) {
    base = 10;
  }

  do {
    unsigned long m = n;
    n /= base;
    char c = m - base * n;
    *--str = c < 10 ? c + '0' : c + 'A' - 10;
  } while (n);

  return write(str);
}



Tags: [電子工作]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

ESP32で東方の Bad Apple!!の動画を 128 x 64 dotの OLED SSD1306で再生する!
ESP32で東方の Bad Apple!!の動画を 128 x 64 dotの OLED SSD1306で再生する!

  ESP32で東方の Bad Apple!!の動画を再生する!実際にはパラパラ漫画です

2.4インチの大画面 OLED SSD1309で東方の Bad Apple!!の動画を再生する
2.4インチの大画面 OLED SSD1309で東方の Bad Apple!!の動画を再生する

  2.42inch 128x64 OLED LCD Display module SSD1309で Bad Apple!!を再生します

SSD1306 OLEDの描画を高速化する方法
SSD1306 OLEDの描画を高速化する方法

  How to Speed Up OLED Drawing Speed

EPS32の I2Cの SCLの周波数をクロックアップして SSD1306 OLEDの描画を高速化する方法
EPS32の I2Cの SCLの周波数をクロックアップして SSD1306 OLEDの描画を高速化する方法

  OLED SSD1306で I2Cの SCLK周波数をドーピングで高速化して描画速度を爆速にする方法

【技適付き】Freenoveの ESP32-S3-WROOMの Basic Starter Kitを買ってみた、カメラ、SD-Card付きの学習キット
【技適付き】Freenoveの ESP32-S3-WROOMの Basic Starter Kitを買ってみた、カメラ、SD-Card付きの学習キット

  Freenove Basic Starter Kit for ESP32-S3-WROOM Onboard Camera Wireless Python C FNK0084

【技適付き】Freenoveの ESP32-WROVERの Ultimate Starter Kitを買ってみた、カメラ付きの学習キット
【技適付き】Freenoveの ESP32-WROVERの Ultimate Starter Kitを買ってみた、カメラ付きの学習キット

  Freenove Ultimate Starter Kit for ESP32-WROVER Onboard Camera Wireless Python C FNK0047

LoRa通信を使用してポストに郵便物が投函されるとスマホの LINE宛に通知する IoTの作り方
LoRa通信を使用してポストに郵便物が投函されるとスマホの LINE宛に通知する IoTの作り方

  LoRaを使用した IoT郵便受け LoRa IoT Mailbox Sensor with LINE Messaging API

ESP32で Slackに「勤怠管理」メッセージをワンボタン操作で投稿する方法
ESP32で Slackに「勤怠管理」メッセージをワンボタン操作で投稿する方法

  Slackの勤怠チャンネルに毎日毎日毎日毎日 手動で投稿するのが馬鹿らしいので ESP32で作った

ESP32-S3で SPIを使う時に Arduinoでエラーが出た話
ESP32-S3で SPIを使う時に Arduinoでエラーが出た話

  ESP32 S3 SPI error VSPI was not declared in this scope

ESP32の I2Sで MCLKが必須の CS4344 DAC Audioを使用する方法
ESP32の I2Sで MCLKが必須の CS4344 DAC Audioを使用する方法

  ESP32で MCLKが必須の CS4344が問題無く使えます

ESP32で SPI接続の Color LCD ST7735S 160x80px IPSを動かす方法
ESP32で SPI接続の Color LCD ST7735S 160x80px IPSを動かす方法

  ESP32 SPI IPS Color LCD ST7735S tutorial

【ソースコード有】ESP32で I2C接続の OLED SSD1306 128x64pxを動かす方法
【ソースコード有】ESP32で I2C接続の OLED SSD1306 128x64pxを動かす方法

  ESP32 I2C OLED SSD1306 tutorial

ESP32-WROOMを購入したらヘンテコ技適マークもどきの基板が届いた話
ESP32-WROOMを購入したらヘンテコ技適マークもどきの基板が届いた話

  Fake ESP32-WROOM Ignore FCC ID and Strange TELEC mark




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2023 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/hardware/arduino_not_use_string_class/