Just a newby asking the 64k question again - Arduino Mega2560

Good find, I didn't try anything like that. I previously wasn't able to answer the questions as that sketch is a bit obscure, but as I need pgm functionality, I've done a little investigating to work out what is happening.

Firstly, the structures placed into progmem are considered first, before the functions. So as a consequence, the function's code ( main, loop, pinMode, etc... ) is placed in a region not accessible by conventional 16-bit pointers. Therefore to call this code you have to jump to the trampoline, which in turn contains a jump to your code.

From what I was able to ingest, functions that exist in the >64K word boundary automatically have an entry in a thing called a 'trampoline'. It is a table of jumps to locations in the higher memory, allowing the entire memory range to be used.

Also as I understand it, if main is in high memory, it will still be called via the trampoline. The problem with this sketch is, not that the 'far' code isn't being called.
Its just that the arduino libraries do not expect their PGM data to be out of range.

There are a number of ways to get things working. For instance you could update the core to use far pointers where necessary, or the easiest quick fix is to place the structure data after the functions so the core can have full use of the lower address range, however there is an overhead to using high range access, critical stuff should remain in the lower section.

This macro will place data after other sections. Found here

#define PROGMEM_FAR  __attribute__((section(".fini7")))
#define nothing

template< uint64_t C, typename T >
  struct LargeStruct{
    T Data;
    LargeStruct< C - 1, T > Next;
};
template< typename T > struct LargeStruct< 0, T >{ };

typedef LargeStruct< 80, uint64_t > Container; //640 bytes

#define PROGMEM_FAR  __attribute__((section(".fini7")))

PROGMEM_FAR LargeStruct< 50, Container > l_Struct;  //32k
PROGMEM_FAR LargeStruct< 50, Container > l_Struct1;   //32k
PROGMEM_FAR LargeStruct< 50, Container > l_Struct2;   //32k
PROGMEM_FAR LargeStruct< 431, uint16_t > l_Struct8; //862 bytes

int led = 13;

void setup()
  {
    pinMode(led, OUTPUT);
    volatile int i = ( int ) &l_Struct;
    volatile int i1 = ( int ) &l_Struct1;
    volatile int i2 = ( int ) &l_Struct2;
  }

void loop(){

 digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}