2017年10月24日 星期二

Arduino語法介紹-PROGMEM

使用時機
1. 存放指令
    當你需要宣告存放指令名稱的空間。
2. 大量重覆性資料
    當你有大量的重複性資料需要透過Serial、Client…等,Steam類型的物件print。
3. 查表法表格
    當你需要設置一個資料量大的查表法表格。

為何使用
要解決硬體SRAM空間不足之問題,使用PROGMEM就是將這些大量資料從SRAM搬到Flash,當要使用的時候再從Flash中搬回來。 因為AVR系列的晶片SRAM大小不一,當資料大的情況,使用超過硬體的SRAM大小,此時編譯器編譯可能不會報錯,但是在使用上不代表程式運作不會發生異常。

如何使用
PROGMEM 變數修飾符是被定義在 pgmspace.h 之中,它是 AVR 架構中 pgmspace.h 函式庫眾多函式的其中之一。所以您要使用 PROGRAM 之前,必須在程式的開頭包含入這個函式庫,如下: #include 然後,使用下列句法給值

const dataType variableName [ ] PROGMEM = {data0, data1, data2...};

dataType - 表資料型態。
variableName - 表變數名稱。

PROGMEM 只是一個變數修飾符,它沒有被規定應該放在哪個位置,所以下列三種宣告方式都可以通過編譯器的編譯:

const dataType variableName [ ] PROGMEM = {data0, data1, data2...};
const PROGMEM dataType variableName [ ] = {data0, data1, data2...};
const dataType PROGMEM variableName [ ] = {data0, data1, data2...};

注意事項

請注意,為了要使用 PROGMEM,您必須將變數指定為全域變數(Global)或靜態變數(Static)。 下列程式碼若是被放在函式裡面,它將不會運作

const char long_str[] PROGMEM = "Hello world.";

下列程式碼若是被放在函式裡面,它會運作

const static char long_str[] PROGMEM = “Hello world." 

官方範例 =>  https://www.arduino.cc/en/Reference/PROGMEM

小小的Demo Exported from Notepad++
#include <avr/pgmspace.h> const char Command_0[] PROGMEM = "*IDN?"; const char Command_1[] PROGMEM = "Start"; const char Command_2[] PROGMEM = "END"; const char* const CommandTable[] PROGMEM = { Command_0, Command_1, Command_2 }; void setup() { Serial.begin(19200); while (!Serial); //PGM_ReadChar demo char yy[10]; PGM_ReadChar(yy, CommandTable[0]); //print yy for (int r = 0; r < strlen(yy); r++) Serial.println(yy[r]); //PGM_ReadChar_PT demo PGM_ReadChar_PT(CommandTable[1]); } void loop() { } void PGM_ReadChar(char input[], const char PGM_Arr[]) //Read PROGMEM to char[] { int len = strlen_P(PGM_Arr); int Cnt; for (Cnt = 0; Cnt < len; Cnt++) { input[Cnt] = pgm_read_byte_near(PGM_Arr + Cnt); } input[Cnt] = "\0"; } void PGM_ReadChar_PT(const char PGM_Arr[]) //Read PROGMEM to print { int len = strlen_P(PGM_Arr); char MyChar; for (int k = 0; k < len; k++) { MyChar = pgm_read_byte_near(PGM_Arr + k); Serial.print(MyChar); } }





1 則留言:

  1. Jammin' Jars Casino & Hotel - JTM Hub
    JAMMIN JARS 나주 출장안마 CASINO & HOTEL in Las Vegas, 평택 출장안마 NV, USA offers an exceptional 성남 출장안마 experience in creating a memorable 서귀포 출장샵 experience for all. 서산 출장안마

    回覆刪除