こないだの、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
ダライアスだ。
レモンを振って、塩でいただく。