Здравствуйте!
Задача - перед выполнением main() запускается некий firmware programmer (FP), в котором необходимо прочитать сигнатуру из внешнего хранилища (например, микросхема внешней flash-памяти), и, в зависимости от ее значения 1) либо запрограммировать внутренний flash из внешнего; 2) либо передать управление имеющемуся firmware. При этом желательно, чтобы из той же внешней flash можно было бы перепрошивать сам FP.
Используется IAR EWARM.
Я предполагаю поместить FP в __low_level_init(), которая выполняется как раз до main(). Т.к. надо программировать внутренний flash, значит, надо переместить основное хозяйство FP во встроенный RAM, обычно это делается указанием __ramfunc перед функцией, которая будет выполняться в RAM. Но при выполнении __low_level_init() сегменты еще не проинициализированы и нужные функции в RAM не скопированы. Как взять значения начала и размера у сегментов CODE_ID (сегмент в ROM, в котором лежит код, к-рый будет скопирован в ОЗУ) и CODE_I (сегмент в RAM, куда будет скопирован код, лежащий в CODE_ID), я еще не разобрался, а внутренние (intrinsic) ф-и __segment_begin и __segment_size посылают куда подальше. Или нужно производить ручную инициализацию сегмента CODE_I как-то по-другому?
Добавлю, что соль размещения FP в __low_level_init() мне видится в том, что другой разработчик будет просто вставлять файлы исходников low_level_init.c и остальные, относящиеся к FP, а затем перекомпилять свой проект, ничего в нем не меняя и даже не глядя в исходники FP.
Еще, если это поможет, - в __low_level_init() будет располагаться только сама инициализация и передача управления ф-и, расположенной в RAM, которая, видимо, будет вызывать несколько других, расположенных там же в RAM, по ходу своей работы. Сам же __low_level_init() остается во внутреннем flash.
Спасибо за любую возможную помощь!
|