// import-export.h -- Unterstützung für zweigeteilte Programme // Das Macro GENERATE_CODE erzeugt im Flash-Programm die Tabelle mit den // Funktonsadressen. Dazu braucht es ein #define MAKE_EXPORT 1 // // Mit einem #define MAKE_IMPORT 1 vor dem #include definiert es die // passenden Offsets für das RAM-Programm. // // Das erste Wort der section muss in beiden Fällen eine Versionsnummer sein. // Dafür gibt es das Macro IMPORT_EXPORT_VERSION mit einer Zahl in "" als // Parameter. Als automatisch fortlaufende Versionsnummer bietet sich die // mtime dieser Header-Datei an. Die bekommt man im Makefile mit stat(1). // // Der Import im RAM-Programm passiert mit dem Macro IMPORT. Es müssen nicht // alle Funktionen importiert werden und die Reihenfolge ist egal. #ifdef MAKE_EXPORT #define FUNCTION(fun) __asm__ ("\t.word\t" #fun"\n"); #endif #ifdef MAKE_IMPORT #define FUNCTION(fun) __asm__ ("idx_"#fun " = count\n\tcount = count + 4\n"); #define IMPORT(fun) __asm__ (#fun":\n .global " #fun "\n\tpush\t{r0, r1}\n\tmovs\tr0, #idx_"#fun "\n\tb\tjump\n"); #endif #define IMPORT_EXPORT_VERSION(utc) __asm__ ("flash_exports = 0x20000100\n .global flash_exports\n\t.word " utc "\ncount = 4\n"); // Dies ist die Liste der exportierten Funktionen #define GENERATE_CODE \ FUNCTION ( __assert_func ) \ FUNCTION ( clock_info ) \ FUNCTION ( clock_setup ) \ FUNCTION ( crash ) \ FUNCTION ( getchar ) \ FUNCTION ( printf ) \ FUNCTION ( putchar ) \ FUNCTION ( puts ) \ FUNCTION ( uart_init )