Работа с параллельной флеш-памятью
Данный документ описывает подготовку и запись во флеш-память отладочного модуля NVCom-02TEM-3U проекта, работающего из параллельной флеш-памяти.
Рассмотрены следующие случаи:
- проект без ОС, работающий непосредственно из флеш-памяти;
- проект, работающий из ОЗУ и загружаемый с помощью загрузчика ELFLOADER.
Документ применим ко всем процессорам серии «Мультикор», основанных на базе CPU-ядра RISCore32F (MIPS32) и отладочным модулям для них.
Основные затруднения
При подготовке проекта, стартующего из флеш-памяти, при подаче питан ия на процессор (а не загружаемого в ОЗУ проекта по JTAG) актуальны следующие задачи:
- осуществить запись во флеш-память;
- обеспечить расположение данных в ОЗУ, а не во флеш-памяти.
Обеспечение расположения в ОЗУ изменяемых данных, стека и переменных необходимо, так как в ПЗУ (флеш-памяти) невозможна перезапись данных при работе программы.
Запись программы во флеш-память
Основное затруднение в данном вопросе – многообразие выпускаемых типов флеш-памяти. АО НПЦ «ЭЛВИС» выпускает и поддерживает программные средства, обеспечивающие работу набора микросхем параллельной флеш-памяти, подключаемой к порту внешней памяти общего назначения процессоров серии «Мультикор».
Исходные коды программы MCPROG доступны по ссылке. Перечень поддерживаемых типов флеш-памяти приведен в документации на данную программу. Обеспечить поддержку всех типов выпускаемых микросхем флеш-памяти не представляется возможным. При необходимости пользователь может самостоятельно добавить поддержку флеш-памяти посредством изменения исходных кодов программы MCPROG.
В случае использования флеш-памяти, уже поддерживаемой в доступных программных средствах, данная проблема может считаться решенной. Если же применяется флеш-память, не поддерживаемая в доступных программных средствах, данная задача решается написанием программы для процессора «Мультикор». Программа в этом случае должна загружаться в ОЗУ процессора по JTAG, затем, посредством отладчика, в ОЗУ процессора должны загружаться данные для записи во флеш-память, после чего загруженная программа должна осуществить запись во флеш.
Данный документ рассматривает случай, когда используемая флеш-память поддержана в программе MCPROG.
Расположение данных в ОЗУ
В случае, когда необходима работа программы непосредственно из флеш-памяти (то есть, исполняемый код располагается в адресах ПЗУ), проблема за ключается в том, что используемые данные во время исполнения программы должны располагаться в ОЗУ. При этом данные, которые к моменту начала исполнения программы должны уже иметь определенные значения, должны быть записаны во флеш-память и перед выполнением функциональной части программы должны быть скопированы в ОЗУ.
На момент подготовки документа для проектов без операционной системы в средах разработки MCStudio 3M и MCStudio 4 такого шаблона проекта не предусмотрено. Имеющиеся шаблоны проектов предполагают расположение секций данных в одной и той же области, без их копирования. Для реализации проекта, исполняемого из флеш-памяти, потребуется доработка проекта, созданного по существующему шаблону. Пример такой подготовки приведен в соответствующем разделе на примере MCStudio 4.
Проекты, исполняемые из флеш-памяти
Для работы понадобятся:
- Среда разработки MC Studio 4 NVCom-02T ver.19.16 или выше.
- Утилита для работы с энергонезависимой памятью MCPROG.
- Эмулятор MC-USB-JTAG.
Проект без ОС на ассемблере
Проект, написанный на ассемблере, является наиболее простым для подготовки, так как в данном случае программист сам определяет все области расположения кода, переменных, стека.
В частности, практически без изменений может быть подготовлен к исполнению из флеш-памяти проект MFBSP_GPIO_assembler, входящего в состав MCStudio 4. Для этого необходимо в проекте:
-
Изменить адреса расположения секций. По умолчанию данный пример собирается в адресах 0xB800_1000 (внутренняя память процессора, CRAM). Необходимо переназначить адреса на 0xBFC0_0000 (с данного адреса процессор начинает исполнять программу после подачи питания и снятия сигнала nRST).
По умолчанию:
После изменения:
-
Добавить в цепочку сборки подготовку файла в формате для записи средствами MCPROG. По умолчанию MCStudio 4 собирает в конечном итоге файл в формате ELF, в формате которого предусмотрено указание адресов расположения секций программы. Чтобы MCPROG мог записать секции по указанным адресам, необходимо преобразовать файл в формате ELF либо в формат BIN (по сути, это образ участка памяти), либо в формат SREC (данный формат также содержит информацию об адресах расположения записываемых данных, но в более простом виде).
Для такого преобразования используется утилита mipsel-elf32-objcopy из комплекта поставки MCStudio 4.
Преобразование .elf файла в формат, подходящий для прошивки во флеш
Необходимо добавить вызов утилиты mipsel-elf32-objcopy в шаги, выполняемые после сборки проекта
Project Settings → C/C++ Build → Settings. В поле Post-build steps ввести строку:
mipsel-elf32-objcopy -O srec MFBSP_GPIO_assembler.elf MFBSP_GPIO_assembler.srec
Преобразование в формат BIN:
Преобразование в формат SREC:
После данных доработок необходимо запустить сборку проекта. После сборки в директории MultiCore_Configuration_Debug или MultiCore_Configuration_Release (в зависимости от того, какая конфигурация сборки активна) появится файл в формате BIN или SREC (в зависимости от выбранного формата).
Данный файл необходимо записать во флеш-память. Для этого надо:
-
Скопировать файл в директорию с утилитой MCPROG (данный шаг необязателен, но иначе при вызове MCPROG необходимо указывать полный путь к записываемому файлу).
-
Убедиться, что в файле MCPROG.CONF выбрана конфигурация, соответствующая используемому отладочному модулю (для отладочного модуля NVCom-02TEM-3U в данном файле предусмотрена конфигурация [nvcom-02tem-3u]).
-
Убедиться, что эмулятор JTAG подключен к ПК и к плате с процессором серии «Мультикор», а также, что на плату подано питание.
-
Убедиться, что на ПК не запущены другие сессии отладки с использованием данного эмулятора JTAG.
-
Открыть командную строку и перейти в директорию с программой MCPROG.
-
Запустить MCPROG из командной строки. Необходимыми параметрами в случае записи файла SREC является только имя файла. В случае, если записывается файл BIN, необходимо также указать адрес, начиная с которого его необходимо записывать.
Кроме того, программа MCPROG имеет ключи запуска, указывающие параметры стирания флеш-памяти. Это ключи, начинающиеся с «-e x» (где x – число от 0 до 2). Если при запуске не указано ключа «-e x», MCPROG по умолчанию производит стирание всех данных из микросхемы флеш-памяти.
Ключ «-e 0» говорит программе MCPROG о том, что стирания данных во флеш-памяти проводить не требуется совсем. В этом случае запись может не пройти, если во флеш-память уже были записаны -то данные – как правило, флеш-память требует стирания уже записанных данных перед записью новых.
Ключ «-e 1» аналогичен запуску без ключа «-e x» - производится стирание всей доступной памяти микросхемы флеш.
Ключ «-e 2» приводит к стиранию только тех секторов флеш-памяти, которые будут задействованы для записи данных. Важно в этом случае учитывать, что если производится запись двух или более файлов в области, имеющие один или более общих секторов флеш-памяти, данные от первого файла в этом секторе будут затерты при записи второго и последующих файлов.
В рассматриваемом же случае производится запись только одного файла, поэтому используется ключ «-e 2».
С учетом вышесказанного, для записи файла BIN необходимо использовать строку запуска:
mcprog -e 2 MFBSP_GPIO_assembler.bin 0xBFC00000
Для записи файла SREC:
mcprog -e 2 MFBSP_GPIO_assembler.srec
Запись файла BIN:
Запись файла SREC:
Проект без ОС на Си
При выполнении проекта, написанного на Си и работающего из флеш-памяти, необходимо решить проблему размещения в ОЗУ изменяемых данных и стека на время исполнения программы. При создании проекта в студии по умолчанию секции располагаются следующим образом (для случая, когда проект создается по адресам 0xBFC0_1000):
Данная конфигурация не будет работать при исполнении из ПЗУ, так как изменяемые данные (секции данных, bss, стек) также расположены в ПЗУ. Если создавать проект в MCStudio, располагая секцию text в ПЗУ, а секцию данных - в ОЗУ, расположение секций будет выглядеть следующим образом:
Такая конфигурация будет работать, если в секции данных нет ни одной заранее определенной переменной. Фактически, это будет значит, что секции данных в программе нет, и в ПЗУ будет записана только секция .text. Если же есть хотя бы одна заранее определенная переменная - она также должна быть сохранена во флеш. Но это невозможно сделать при данной конфигурации, так как адрес секции соответствует адресам ОЗУ.
Решением является подготовка скрипта линковки с использованием ключевого слова AT. Это позволит присвоить секции данных два адреса. Первый из них - тот, куда необходимо записывать секцию данных (адрес ПЗУ). Второй - адрес, по которому к переменным секции данных обращается программа. Кроме того, в процедуре стартовой инициализации такой программы должно присутствовать копирование секции данных из ПЗУ в ОЗУ.
Тогда так будет выглядеть расположение данной программы в памяти:
Для решения необходимо произ вести приведенные в данной главе действия. Рассмотрим алгоритм создания такого проекта по порядку.
Создание проекта (используя библиотеку newlib)
При создании данного проекта в MCStudio4 используется библиотека Newlib, в таких проектах стартовый код берется из библиотеки и содержит в себе символ точки входа _start. Переназначить его на нужный адрес невозможно, поэтому необходимо добавить ассемблерный файл со своим «предстартовым» кодом, который, скопировав секцию данных в ОЗУ, делает переход на метку_start. В проектах без Newlib стартовый код пишет программист (автор проекта). В нем точка входа _start должна быть на 0xBFC0_0000. И в том, и в другом случае необходимо скопировать секцию данных, изменяемые в процессе исполнения программы данные, стек из флеш в ОЗУ, см. Рисунок 12. Эту задачу также выполняет ассемблерный код.
Добавление файла, содержащего стартовый код
Стартовый код, как уже упоминалось выше, должен содержать участок копирования секции данных из флеш в ОЗУ:
# Установка gp
la $28,_gp
# Установка sp
la $29,__stack
la $4,__bss_start # a0 <- __bss_start
move $5,$0 # a1 <- 0
la $6,__bss_end
sub $6, $6, $4 # a2 = __bss_end - __bss_start
la $2, _wmemset
jalr $2
nop
la $4,__data_start # a0 <- eshp[i].sh_addr
la $5,_etext # a1 <- _etext
la $6,_edata
sub $6, $6, $4 # a2 = _edata - __data_start
la $2, _wmemcpy
jalr $2
nop
Пример стартового кода:
# SDRCSR = 0x00000001
la $2, 0xb82F4004
li $3, 0xffffffff
sw $3, 0($2)
# la $2, 0xb82F4000
# li $3, 0x00000808
# sw $3, 0($2)
la $2, 0xb82F1000
li $3, 0x003000fc
sw $3, 0($2)
la $2, 0xb82F100C
li $3, 0x000f0000
sw $3, 0($2)
# Установка gp
la $28,_gp
# Установка sp
la $29,__stack
la $4,__bss_start # a0 <- __bss_start
move $5,$0 # a1 <- 0
la $6,__bss_end
sub $6, $6, $4 # a2 = __bss_end - __bss_start
la $2, _wmemset
jalr $2
nop
la $4,__data_start # a0 <- eshp[i].sh_addr
la $5,_etext # a1 <- _etext
la $6,_edata
sub $6, $6, $4 # a2 = _edata - __data_start
la $2, _wmemcpy
jalr $2
nop
# Переход на _start()
2: lui $2,%hi(_start)
ori $2,%lo(_start)
jr $2
nop
# Переход в отладочный режим с помощью специального break
# break 0x1=.word 0x4d
break 0x1
nop
3: b 3b
nop
Секция данных при работе программы адресуется по адресам ОЗУ, а для хранения определены адреса флеш-памяти.
Создание и добавление к проекту скрипта линковки
Копирование секции данных из флеш-памяти в ОЗУ выполняет скрипт линковки. Он определяет положение секций файлов и стека, в нем должны быть символы, обозначающие начало и конец секции данных.
Скрипт необходим для того, чтобы разместить все изменяемые переменные и стек в адресах ОЗУ, так как во флеш-памяти размещать их нельзя. Приведенный ниже фрагмент скрипта линковки определяет положение секции данных в адресах ОЗУ (0xb8000000).
/* Start data (internal CRAM). */
.data : AT (ADDR (.text) + SIZEOF (.text))
{
__data_start = . ;
_gp = .; /* We have only 32k RAM, so no need for 0x8000 offset. */
*(.data .data.* .gnu.linkonce.d.*)
/* We want the small data sections together, so single-instruction offsets can access them all,
and initialized data all before uninitialized, so we can shorten the on-disk segment size. */
*(.sdata .sdata.* .gnu.linkonce.s.*)
*(.eh_frame)
*(.ctors)
*(.dtors)
_edata = .;
} > cram
Строка, определяющая переадресецию секции данных из флеш-памяти в ОЗУ:
.data : AT (ADDR (.text) + SIZEOF (.text))
Слово «AT» определяет адрес хранения секции. В качестве аргумента выступает адрес памяти. Это т адрес начала секции данных равен сумме адреса начала секции text и длине секции text.
Расположение стека также определяется скриптом линковки в ОЗУ:
.bss ADDR (.data) + SIZEOF (.data) (NOLOAD) :
{
_fbss = .;
__bss_start = .;
*(.dynbss)
*(.sbss)
*(.scommon)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
__bss_end = . ;
/* Align here to ensure that the .bss section occupies space up to
_end. Align after .bss to ensure correct alignment even if the
.bss section disappears because there are no input sections. */
. = ALIGN (32 / 8);
. += 0x8000;
PROVIDE(__stack = ALIGN(8));
. += 0x10;
PROVIDE(end = .);
_end = .;
} > cram
В дизассемблере можно убедиться, что секции данных с изменяемыми переменными, а также стек, находятся в ОЗУ:
Disassembly of section .data:
b8000000 <Flag_Corr>:
b8000000: 00000001 movf zero,zero,$fcc0
b8000004 <UART_Number>:
b8000004: 00000001 movf zero,zero,$fcc0
b8000008 <_impure_ptr>:
b8000008: b8000010 swr zero,16(zero)
b800000c: 00000000 nop
А секции текста – в адресах ПЗУ (флеш-памяти):
Disassembly of section .textS_text:
bfc00000 <_start_from_flash>:
bfc00000: 3c02b82f lui v0,0xb82f
bfc00004: 34424004 ori v0,v0,0x4004
bfc00008: 2403ffff li v1,-1
bfc0000c: ac430000 sw v1,0(v0)
Скрипт добавляется к проекту в настройках проекта через настройки линковщика, как показано на рис. 14. Кликнув два раза на синюю строку, можно прописать имя файла:
При возникновении ошибки «multiple definition of `_start'», необходимо отключить линковку стандартных файлов, как показано на рисунке ниже.
Добавление в цепочку сборки файла в формате, подходящем для записи средствами MCPROG
См. пункт Преобразование .elf файла в формат, подходящий для прошивки во флеш. Преобразование в формат SREC:
Сборка. Запись проекта во флеш
После преобразования в формат SREC необходимо запустить сборку проекта. После сборки в директории MultiCore_Configuration_Debug или MultiCore_Configuration_Release (в зависимости от того, какая конфигурация сборки активна) появится файл в формате BIN или SREC (в зависимости от выбранного формата).
Данный файл необходимо записать во флеш-память. Для этого надо:
- Скопировать файл в директорию с утилитой MCPROG (данный шаг необязателен, но иначе при вызове MCPROG необходимо указывать полный путь к записываемому файлу).
- Убедиться, что в файле MCPROG.CONF выбрана конфигурация, соответствующая используемой плате (для отладочного модуля NVCom-02TEM-3U в данном файле предусмотрена конфигурация nvcom-02tem-3u).
- Убедиться, что эмулятор JTAG подключен к ПК и к плате с процессором серии «Мультикор», а также, что на плату подано питание.
- Убедиться, что на ПК не запущены другие сессии отладки с использованием данного эмулятора JTAG.
- Открыть командную строку и перейти в директорию с программой MCPROG.
- Запустить MCPROG из командной строки.
-
Необходимыми параметрами в случае записи файла SREC является только имя файла. В случае, если записывается файл BIN, необходимо также указать адрес, начиная с которого его необходимо записывать.
Кроме того, программа MCPROG имеет ключи запуска, указывающие параметры стирания флеш-памяти. Это ключи, начинающиеся с
-e x
(где x – число от 0 до 2). Если при запуске не указано ключа-e x
, MCPROG по умолчанию производит стирание всех данных из микросхемы флеш-памяти.Ключ
-e 0
говорит программе MCPROG о том, что стирания данных во флеш-памяти проводить не требуется совсем. В этом случае запись может не пройти, если во флеш-память уже были записаны какие-то данные – как правило, флеш-память требует стирания уже записанных данных перед записью новых.Ключ
-e 1
аналогичен запуску без ключа-e x
- производится стирание всей доступной памяти микросхемы флеш.Ключ
-e 2
приводит к стиранию только тех секторов флеш-памяти, которые будут задействованы для записи данных. Важно в этом случае учитывать, что если производится запись двух или более файлов в области, имеющие один или более общих секторов флеш-памяти, данные от первого файла в этом секторе будут затерты при записи второго и последующих файлов.В рассматриваемом же случае производится запись только одного файла, поэтому используется ключ
-e 2
.
С учетом вышесказанного, для записи файла BIN необходимо использовать строку запуска:
mcprog -e 2 <путь к файлу/имя проекта>.bin 0xBFC00000
Для записи файла SREC:
mcprog -e 2 < путь к файлу/>.srec
Запись файла SREC:
После успешной записи файла во флеш-память необходимо отключить питание платы, затем отключить эмулятор USB-JTAG, снова подключить питание к плате и убедитьcя, что программа выполняется (в случае примера MFBSP_GPIO – диоды мигают попеременно с интервалом в 1 с).
Пример скрипта линковки
Пример скрипта линковки приведен ниже. Предлагается также ознакомиться с документацией по написанию линковочных скриптов.
OUTPUT_ARCH("mips:isa32")
TARGET("elf32-littlemips")
SEARCH_DIR(.)
ENTRY(_start)
GROUP(-lc -lnosys -lgcc -lm)
PROVIDE(_mem_size = 0x0010000);
/*
* Linker script for MIPS32 Elvees Multicore
*/
/* XiP linker script, for normal executables */
/* MCT-03PEM-6U memory configuration */
OUTPUT_FORMAT("elf32-littlemips", "elf32-bigmips",
"elf32-littlemips")
OUTPUT_ARCH(mips)
/* ENTRY(_start_) */
MEMORY
{
flash (rx) : ORIGIN = 0xbfc00000, LENGTH = 8M
cram (rw!x) : ORIGIN = 0xb8000000, LENGTH = 128K
sdram (rw!x) : ORIGIN = 0x80000000, LENGTH = 64M
}
/* higher address of the user mode stack */
SECTIONS
{
/* Read-only sections, merged into text segment: */
. = 0x0000;
.interp : { *(.interp) }
.hash : { *(.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) }
.gnu.version_r : { *(.gnu.version_r) }
.textS_text :
{
*(.textS_text)
} > flash
.text :
{
*(.init)
*(.text .stub .text.* .gnu.linkonce.t.*)
/* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning)
*(.glue_7t) *(.glue_7)
__rodata_start = . ;
*(.rodata .rodata.* .gnu.linkonce.r.*)
* (.fini)
* (.reginfo)
/* Align here to ensure that the .text section ends on word boundary. */
. = ALIGN (32 / 8);
_etext = .;
} > flash
/* Start data (internal CRAM). */
.data : AT (ADDR (.text) + SIZEOF (.text))
{
__data_start = . ;
_gp = .; /* We have only 32k RAM, so no need for 0x8000 offset. */
*(.data .data.* .gnu.linkonce.d.*)
/* We want the small data sections together, so single-instruction offsets
can access them all, and initialized data all before uninitialized, so
we can shorten the on-disk segment size. */
*(.sdata .sdata.* .gnu.linkonce.s.*)
*(.eh_frame)
*(.ctors)
*(.dtors)
_edata = .;
} > cram
.bss ADDR (.data) + SIZEOF (.data) (NOLOAD) :
{
_fbss = .;
__bss_start = .;
*(.dynbss)
*(.sbss)
*(.scommon)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
__bss_end = . ;
/* Align here to ensure that the .bss section occupies space up to
_end. Align after .bss to ensure correct alignment even if the
.bss section disappears because there are no input sections. */
. = ALIGN (32 / 8);
. += 0x8000;
PROVIDE(__stack = ALIGN(8));
. += 0x10;
PROVIDE(end = .);
_end = .;
} > cram
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
}
Проект, работающий из ОЗУ. Загрузчик ELFLOADER
Альтерна тивным путем является использование проекта, целиком работающего из ОЗУ. В этом случае в начало флеш-памяти (в стартовый адрес 0xBFC0_0000) записывается загрузчик, а в другую область памяти (определенную в загрузчике) записывается основная программа. При подаче питания на процессор начинается исполнение загрузчика, который копирует основную программу в ОЗУ.
-
Загрузить пример проекта MFBSP_GPIO в MC Studio 4 NVCom-02T: «Help → Welcome → Примеры проектов → MFBSP_GPIO → Finish».
-
Выполнить сборку проекта MFBSP_GPIO: «Project → Build Project».
-
Импортировать проект загрузчика ELF-объектов в MC Studio 4 NVCom-02T:
- Загрузчик ELF-объектов можно скачать по ссылке.
- В «File → Import → MultiCore →MCS3 Project → Next → Browse» указать путь к директории предварительно загруженного и распакованного проекта загрузчика, после чего нажать кнопку Finish.
-
Добавить дополнительный шаг сборки «mipsel-elf32-objcopy -O srec elfloader_NVCOM01MEM3U.elf elfloader_NVCOM01MEM3U.srec»:
-
В окне Project Explorer выбрать проект elfloader_NVCOM01MEM3U.
-
Нажатием комбинации клавиш Alt+Enter вызвать окно изменения свойств проекта.
-
В открывшимся окне перейти в «С/С++ Build → Settings → Build Steps».
-
В графу Post-build steps Command вписать
mipsel-elf32-objcopy -O srec elfloader_NVCOM01MEM3U.elf elfloader_NVCOM01MEM3U.srec
-
В графу Description вписать «elf to srec».
-
Apply → ОК
-
-
Изменить значение переменной ElfObjectPtr в файле main.s на 0x1C000000.
-
Выполнить сборку проекта: «Project → Build Project».
-
Записать полученные файлы workspace\MFBSP_GPIO\MultiCore_Configuration_Debug\MFBSP_GPIO.elf и workspace\elfloader_NVCOM01MEM3U\MultiCore_Configuration_Debug\elfloader_NVCOM01MEM3U.srec в энергонезависимую память, с помощью утилиты MCPROG:
mcprog.exe –e2 MFBSP_GPIO.elf 0x1C000000
mcprog.exe –e2 elfloader_NVCOM01MEM3U.srec -
По нажатию кнопки reset пронаблюдать попеременное мерцание светодиодов VD3, VD4.