Da Zeiger auf Funktionen immer nur Zeiger auf Funktionen sind -also
immer nur auf den Codespeicher verweisen-, geht der Compiler
folgerichtig immer von Codezugriffen aus. Die Bestimmung der Adresse
einer Funktion liefert einen Zeiger auf Codespeicher, das
Dereferenzieren eines solchen Zeigers (sprich: Aufrufen einer Funktion)
wird auch im Codespeicher ausgeführt. Da sehe ich keine Probleme mit der
Harvard-Architektur.
Selbst eine Erweiterung des Adressraumes auf 24 Bit dürfte eigentlich
keine Probleme bereiten; der Compiler müsste dann "nur" darauf
vorbereitet werden, Codezeiger als 24- oder 32-Bit-Variablen zu
behandeln.
Wie einfach das ist und ob man gcc überhaupt dergestalt verbiegen kann,
das steht auf einem ganz anderen Blatt.
Wer weiß, vielleicht wird Atmel ja bei AVRs mit mehr als 128 KByte
Flash-ROM auch einen Banking-Mechanismus implementieren.
Mittlerweile gibt es ja sogar AVR-Varianten, die Code im RAM ablegen
können (mit einem Mapping-Mechanismus kann die Aufgabe von
Speicherblöcken umdefiniert werden) - AT76C712 ist so ein Kandidat.
Das ist überhaupt ein hochgradig interessanter Prozessor - einerseits,
weil er mit einem USB-Device-Controller ausgestattet ist, andererseits,
weil er vollständig ohne Flash- oder sonstiges ROM auskommt. Ein fest
eingebauter Bootloader lädt Firmware aus einem externen seriellen
EEPROM oder wahlweise auch per USB - genauso, wie es die
Ez-USB-Controller von Cypress machen.
Aufgrund dieser RAM-Architektur kann der (interne) Prozessortakt auf 48
MHz erhöht werden, etwas, was bei Flash-ROMs aufgrund deren relativ
langsamen Zugriffen nicht möglich war.
Bevor ich weiter ins Schwärmen komme - seht Euch einfach selbst das
Datenblatt an:
http://www.atmel.com/dyn/products/product_card.asp?part_id=3579