「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



こないだの、ESP32で大きい配列を定義すると、なぜか
実行時エラーになっちゃう件、

https://techtutorialsx.com/2018/02/13/esp32-arduino-variable-length-arrays/

このページを参考に、以前のスケッチをちょい弄って
実験しながら、あれこれ探ってみた。


まず、元のスケッチに、ヒープの残サイズを表示する
処理を付け加えてみる。処理前と処理後の両方に。

で、だいたい想像通りの結果が出てきた。初期化前に
300kB弱のヒープ(とスタックで利用できる)エリアが
残ってて、これならいくらでもスタックにデカイ配列
をおけるはずだよな、と。

で、色々考えててふと気になることに行き着く。
これ、loop関数内で動的確保してるから、スタックに
置かれるわけだよな、と。

なんかのサイトで読んだんだけど、スタックとヒープ
は、コンパイルオプションで最大サイズを云々って
いうのが有ったと思うので、もしかして、スタックに
デカイ配列を置こうとしているのが駄目なの?と。


なので、スケッチ冒頭で配列定義しちゃって、bssに
配列を置いたら、スタックをそんなに食わないので、
動くんじゃないの?と。

ちなみに、text、data、bss、heap、stackについて
”なんじゃそりゃ?”という場合は、こちらとかを
まずご参照ください。

http://keens.github.io/blog/2017/04/30/memoritosutakkutohi_puto/

で、loop関数で定義してた配列を、冒頭のglobalで
定義しなおして、bssに配置するようにしてやると…

ヒープの食い方の表示が変わってくる。おぉ。

じゃぁ、配列のサイズを8kBにしてみる。
…大丈夫だな。エラーにならない。調子こいて
一気に64kBにしてみる。うん。大丈夫。


どうやら、スタックにデカイ配列置けないような
設定になっているらしい。4kBってことは…元もとの
素のArduino(8ビット版)の設定が引き継がれている
のかなぁ?

なんにしても、スタックにデカイ配列置こうとしない
かぎりは、大きい配列をおいても大丈夫っぽいな。

これで、もうちょっと実験が先に進められそうなん
だけど、しばらく時間が取れないんだよな。


とりあえず、実験に使ったスケッチを貼っておく。

#include <driver/adc.h>

/* global variables */

#define LED 2
#define SAMPLES 32768

//int val[SAMPLES];
uint16_t val[SAMPLES];


/* sub routine */

void prt_hex(int n, char c) {
  for (int i = 1; i < 4; i++) {
    if ( (n >> (4*i)) == 0) {
      Serial.print(c);
    }
  }
  
  Serial.print(n, HEX);
}

/* main process */

void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);

  /* set up ADC1 parameters */
  Serial.println();
  Serial.println("-----  adc width = 12 bits  -----");
  adc1_config_width(ADC_WIDTH_BIT_12);
  adc1_config_channel_atten(ADC1_CHANNEL_0,ADC_ATTEN_DB_0);
}

void loop() {
  /* display heap size */
  Serial.print("Heap size : ");
  Serial.println(ESP.getFreeHeap());
  Serial.println();
  
  Serial.println("start sampling.");
  Serial.println();
  digitalWrite(LED, HIGH);

  /* input 1024 samples with simple loop */
  unsigned long starttime = millis();
  for (int i=0; i<SAMPLES; i++) {
    val[i] = adc1_get_raw(ADC1_CHANNEL_0);
  }
  unsigned long endtime = millis();

  digitalWrite(LED, LOW);
  Serial.println("complete sampling.");
  Serial.println();

  Serial.print("start time = ");
  Serial.print(starttime); 
  Serial.println("ms");
  Serial.print("end   time = ");
  Serial.print(endtime); 
  Serial.println("ms");
  Serial.print("total time = ");
  Serial.print(endtime - starttime); 
  Serial.println("ms");
  Serial.print("unit  time = ");
  Serial.print((endtime - starttime) * 1000 / SAMPLES); 
  Serial.println("us / sample");
  Serial.print("sampling speed = ");
  Serial.print(1000 * SAMPLES / (endtime - starttime)); 
  Serial.println("sps");
  
  for (int i=0; i<SAMPLES; i++) {
    if ((i % 16) == 0 ) {
      Serial.println();
      prt_hex(i, '0');
      Serial.print(" : ");
    }
    prt_hex(val[i], ' ');
    Serial.print(", ");
  }
  Serial.println();
  
  /* display heap size */
  Serial.print("Heap size : ");
  Serial.println(ESP.getFreeHeap());
  Serial.println();
  
  for (;;);
}





https://twitter.com/mai_hayabusa/status/1020595452914233346

フラウスキー少佐ーーーーーー!!!

http://cosmo14.s56.xrea.com/gallery/fra.html





https://twitter.com/livedoornews/status/1020497349225746432

これは、殺人未遂って言っても差し支えないだろう。
散々、毎年、自動車に子供置いたままにして、熱中症
で死んでしまう話、あふれているのに。数分でも
ものすごい温度に上がるんだよな。真夏の炎天下。

しかも、パチンコ屋だもんな。これ、児童相談所の
出番だろ。





https://www.youtube.com/watch?v=a2BsZCoHjwM

総統閣下はお怒りのようです。





https://twitter.com/masayang/status/1020875251779899392

なんでもかんでも、他人に不便を強要することで満足
するタイプの人たちなのかな。

そもそも、プラスチックストローだって、そのまま海に
流すもんじゃないだろ。燃やして灰を処分するとか
なんじゃないの?普通。

海が汚染されて問題だっていうなら、プラスチック製品
を作ることに問題があるんじゃなく、ゴミの処分方法
に問題があるっていう、そっちに目を向ければいいのに。





https://twitter.com/Y_Suzuki/status/1020892803423858688

ダライアスだ。

レモンを振って、塩でいただく。



コメント ( 0 )