/* * Test ArduinoMEGA with PROGMEM data above 64kB * access via pgm_read_byte_far() from pgmspace.h */ /******************************************************************** * Define an additional section, which will be placed after all others ********************************************************************/ //-------------------------------------------------------------------- #define FAR_SECTION __attribute__((__section__(".far_section"))) //-------------------------------------------------------------------- /******************************************************************** * modify the line below to calculate the flash usage correctly * * C:\Programme\Arduino\hardware\arduino\avr\plattform.txt * * ## Compute size * recipe.size.regex=^(?:\.text|\.data|\.bootloader|\.far_section)\s+([0-9]+).* ********************************************************************/ const uint8_t dummy1[32767] FAR_SECTION = {1, 2, 3, 4}; const uint16_t dummy2[16383] FAR_SECTION = {1, 2, 3, 4}; const uint32_t dummy3[8191] FAR_SECTION = {1, 2, 3, 4}; const uint8_t dummy4[32767] FAR_SECTION = {1}; const uint8_t dummy5[32767] FAR_SECTION = {1}; const uint8_t dummy6[25000] FAR_SECTION = {1}; const uint8_t dummy_PGM_A[32767] PROGMEM = {1}; const uint8_t dummy_PGM_B[31000] PROGMEM = {1}; void setup() { // put your setup code here, to run once: unsigned long ptr; int i; uint16_t tmp16; uint32_t tmp32; // access data using a pointer // arrays with indices do NOT work! // pointer calculation must take care of data type size ptr = pgm_get_far_address(dummy1); for (i=0; i<32767; i++) { PORTA = pgm_read_byte_far(ptr++); } ptr = pgm_get_far_address(dummy2); for (i=0; i<16383; i++, ptr += 2) { tmp16 = pgm_read_word_far(ptr); PORTA = tmp16; } ptr = pgm_get_far_address(dummy3); for (i=0; i<8192; i++, ptr += 4) { tmp32 = pgm_read_dword_far(ptr); PORTA = tmp32; } PORTA = pgm_read_byte_far(pgm_get_far_address(dummy4)); PORTA = pgm_read_byte_far(pgm_get_far_address(dummy5)); PORTA = pgm_read_byte_far(pgm_get_far_address(dummy6)); PORTA = pgm_read_byte_far(pgm_get_far_address(dummy_PGM_A)); PORTA = pgm_read_byte_far(pgm_get_far_address(dummy_PGM_B)); } void loop() { // put your main code here, to run repeatedly: }