Дошли руки до использования программируемой памяти.
Оказалось, что код из SPL библиотеки MDR32F9Qx_eeprom не попадает в RAM (EXECUTABLE_MEMORY_SECTION), хотя в исходниках вроде как всё предусмотрено.
Выяснилось, что виной тому странное использование символа
__GNUC__ препроцессора в заголовочном файле
MDR32F9Qx_eeprom.h. В результате мешанины #ifdef/#else и прочего, определение атрибута EXECUTABLE_MEMORY_SECTION пропадало, если в опциях Keil компилятора C/C++ стоит галка "GNU extensions". Если галку снять, то функции попадают в RAM. А всё из-за того, что Keil определяет и
__CC_ARM, и
__GNUC__ (при наличии галки). Пришлось поправить
MDR32F9Qx_eeprom.h. Теперь работает. Было так:
Код:
#if defined ( __ICCARM__ )
#define __RAMFUNC __ramfunc
#elif defined (__CMCARM__)
#define __RAMFUNC __ramfunc
#elif defined ( __CC_ARM )
#define __RAMFUNC
#elif defined ( __GNUC__ )
#define __RAMFUNC __attribute__((section(".ramfunc")))
#endif
#if defined ( __GNUC__ )
#define __RAMFUNCSECTION
#else
#define __RAMFUNCSECTION __attribute__((section("EXECUTABLE_MEMORY_SECTION")))
#endif
Сделал так:
Код:
#if defined ( __ICCARM__ )
#define __RAMFUNC __ramfunc
#define __RAMFUNCSECTION
#elif defined (__CMCARM__)
#define __RAMFUNC __ramfunc
#define __RAMFUNCSECTION
#elif defined ( __CC_ARM )
#define __RAMFUNC
#define __RAMFUNCSECTION __attribute__((section("EXECUTABLE_MEMORY_SECTION")))
#elif defined ( __GNUC__ )
#define __RAMFUNC __attribute__((section(".ramfunc")))
#define __RAMFUNCSECTION
#endif