SeeeduinoXIAOていうかSAMD21D18GでFlashに定数入れるのってどうすんの?っておもっての取り組み。ATMega328Pを使ったArduinoUNOだと定数をPROGMEMってやつとともに定義するとFlashに入る。ここによると、constつけて宣言するだけって書いてあるけど、試してみる。SAMD21のデータシートによるとこうなっているので、
こんな感じで。
- const uint32_t constant_value[] ={
- 0x55555505, 0xAAAAAA0A, 0x11111101, 0xEEEEEE0E,
- 0x55555505, 0xAAAAAA0A, 0x11111101, 0xEEEEEE0E,
- 0x55555505, 0xAAAAAA0A, 0x11111101, 0xEEEEEE0E,
- 0x55555505, 0xAAAAAA0A, 0x11111101, 0xEEEEEE0E,
- 0x55555505, 0xAAAAAA0A, 0x11111101, 0xEEEEEE0E,
- 0x55555505, 0xAAAAAA0A, 0x11111101, 0xEEEEEE0E,
- 0x55555505, 0xAAAAAA0A, 0x11111101, 0xEEEEEE0E,
- 0x55555505, 0xAAAAAA0A, 0x11111101, 0xEEEEEE0E
- };
- typedef union {
- uint8_t as_Byte[4];
- uint32_t as_Dword;
- }u_Dword;
- void setup() {
- u_Dword buf0;
- u_Dword buf1;
- u_Dword buf2;
- u_Dword buf3;
- uint32_t mempos;
- char szbuf[80];
- // put your setup code here, to run once:
- Serial.begin(115200);
- while(!Serial){
- //
- }
- for(mempos=0;mempos<32;mempos=mempos+4){
- sprintf(szbuf,"%08X %08X %08X %08X",constant_value[mempos+0],constant_value[mempos+1],constant_value[mempos+2],constant_value[mempos+3]);
- Serial.println(szbuf);
- }
- Serial.println("======== ======== ======== ========");
- for(mempos=0;mempos<0x0040000;mempos=mempos+16){
- memcpy(&(buf0.as_Byte[0]),(void*)(mempos+0),4);
- memcpy(&(buf1.as_Byte[0]),(void*)(mempos+4),4);
- memcpy(&(buf2.as_Byte[0]),(void*)(mempos+8),4);
- memcpy(&(buf3.as_Byte[0]),(void*)(mempos+12),4);
- sprintf(szbuf,"%08X %08X %08X %08X",buf0.as_Dword,buf1.as_Dword,buf2.as_Dword,buf3.as_Dword);
- Serial.println(szbuf);
- }
- }
- void loop() {
- // put your main code here, to run repeatedly:
- }
するってーと、こうなる
で、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に配置されただけで良しとするかー
たったこれだけでもうやる気がおきない。
元気になる方法はないだろうか...酒をやめるとか、運動をするとか以外で。
コメントをお書きください