Это похоже на более старый NXP (бывший Freescale / Motorola) HCS08, HCS12 или Coldfire.На этих устройствах у вас бывают разные случаи написания флеш-драйвера: либо вы можете запустить его из флеш-памяти, либо нет.Это полностью зависит от того, к какому «банку» относится флэш-программа: обычно вы не можете выполнить код на MCU из того же флэш-банка, который она в данный момент программирует.
Так что в идеале вы должны поместить код флэш-программирования в другой банк, но некоторые устройства имеют только один банк флэш-памяти.Затем они предоставляют обходной путь, выполняя код из ОЗУ, что является своего рода быстрым и грязным исправлением.
Обычно они решают эту проблему, предоставляя массив кодов операций с необработанными данными.Этот массив кодов операций копируется в RAM, а затем они устанавливают указатель на функцию, указывающую на адрес RAM.Я подозреваю, fnRAM_code
такой указатель на функцию.Часть (volatile unsigned char *)FLASH_STATUS_REGISTER
просто передает адрес регистра состояния флэш-памяти.Вероятно, FLASH_STATUS_REGISTER является синонимом FSTAT.
* uDisable_Interrupt();
и uEnable_Interrupt();
должны соответствовать asm SEI
и asm CLI
соответственно, блокируя все маскируемые прерывания от запуска во время флэш-записи, что потенциально может вызватьзапись для сбоя или зависания программы.
Должны быть доступны заметки приложений, подробно описывающие все это.
Обратите внимание, что этот код очень близок к оборудованию и использует тонныплохо определенного поведения.Я бы не стал рассчитывать на его компиляцию, как ожидалось, ни на что, кроме компилятора Codewarrior.gcc, например, будет выдавать множество ошибок строгого алиасинга.