· 

SeeeduinoXIAO Flash定数どうする?

SeeeduinoXIAOていうかSAMD21D18GでFlashに定数入れるのってどうすんの?っておもっての取り組み。ATMega328Pを使ったArduinoUNOだと定数をPROGMEMってやつとともに定義するとFlashに入る。ここによると、constつけて宣言するだけって書いてあるけど、試してみる。SAMD21のデータシートによるとこうなっているので、

こんな感じで。

  1. const uint32_t constant_value[] ={
  2.   0x55555505, 0xAAAAAA0A, 0x11111101, 0xEEEEEE0E,
  3.   0x55555505, 0xAAAAAA0A, 0x11111101, 0xEEEEEE0E,
  4.   0x55555505, 0xAAAAAA0A, 0x11111101, 0xEEEEEE0E,
  5.   0x55555505, 0xAAAAAA0A, 0x11111101, 0xEEEEEE0E,
  6.   0x55555505, 0xAAAAAA0A, 0x11111101, 0xEEEEEE0E,
  7.   0x55555505, 0xAAAAAA0A, 0x11111101, 0xEEEEEE0E,
  8.   0x55555505, 0xAAAAAA0A, 0x11111101, 0xEEEEEE0E,
  9.   0x55555505, 0xAAAAAA0A, 0x11111101, 0xEEEEEE0E
  10. };
  11. typedef union {
  12.   uint8_t as_Byte[4];
  13.   uint32_t as_Dword;
  14. }u_Dword;
  15. void setup() {
  16.   u_Dword buf0;
  17.   u_Dword buf1;
  18.   u_Dword buf2;
  19.   u_Dword buf3;
  20.   uint32_t mempos;
  21.   char szbuf[80];
  22.   
  23.   // put your setup code here, to run once:
  24.   Serial.begin(115200);
  25.   while(!Serial){
  26.     //
  27.   }
  28.   for(mempos=0;mempos<32;mempos=mempos+4){
  29.     sprintf(szbuf,"%08X %08X %08X %08X",constant_value[mempos+0],constant_value[mempos+1],constant_value[mempos+2],constant_value[mempos+3]);
  30.     Serial.println(szbuf);
  31.   }
  32.   Serial.println("======== ======== ======== ========");
  33.   for(mempos=0;mempos<0x0040000;mempos=mempos+16){
  34.     memcpy(&(buf0.as_Byte[0]),(void*)(mempos+0),4);
  35.     memcpy(&(buf1.as_Byte[0]),(void*)(mempos+4),4);
  36.     memcpy(&(buf2.as_Byte[0]),(void*)(mempos+8),4);
  37.     memcpy(&(buf3.as_Byte[0]),(void*)(mempos+12),4);
  38.     sprintf(szbuf,"%08X %08X %08X %08X",buf0.as_Dword,buf1.as_Dword,buf2.as_Dword,buf3.as_Dword);
  39.     Serial.println(szbuf);
  40.   }
  41. }
  42. void loop() {
  43.   // put your main code here, to run repeatedly:
  44. }

するってーと、こうなる

で、Flashの中に配置されることはわかりました。

ソースコードの30行目からは、変数へのアクセスをしないと、コンパイラが勝手に省略しちゃって、FlashにもSRAMにも配置されない(変数宣言が無視される)から。

次は好きなアドレスに配置したくなったり、もし、コードから参照されなくてもちゃんと書き込んだり(コンパイラが勝手に省略しないように)ってしたい。keilのarmccのリファレンスによると、

__attribute__((at(address)))

とか

__attribute__((used))

ってやつがそれらしい。

が、Arduinoでは全く無視されるし、セクション切ってリンカスクリプトで指定ってのもArduinoではできんし、どうしたもんか...

 

#pragma address constant_value=0x0003F000

もだめ

const uint32_t constant_value[] __attribute__((location(0x0003F000)))

もだめ...

#define constant_value  (*((uint32_t*)0x0003F000))

はエラー

Flashに配置されただけで良しとするかー

 

たったこれだけでもうやる気がおきない。

元気になる方法はないだろうか...酒をやめるとか、運動をするとか以外で。