Перейти к основному содержимому

Работа с параллельной флеш-памятью

Данный документ описывает подготовку и запись во флеш-память отладочного модуля NVCom-02TEM-3U проекта, работающего из параллельной флеш-памяти.

Рассмотрены следующие случаи:

  • проект без ОС, работающий непосредственно из флеш-памяти;
  • проект, работающий из ОЗУ и загружаемый с помощью загрузчика ELFLOADER.

Документ применим ко всем процессорам серии «Мультикор», основанных на базе CPU-ядра RISCore32F (MIPS32) и отладочным модулям для них.

Основные затруднения

При подготовке проекта, стартующего из флеш-памяти, при подаче питания на процессор (а не загружаемого в ОЗУ проекта по JTAG) актуальны следующие задачи:

  • осуществить запись во флеш-память;
  • обеспечить расположение данных в ОЗУ, а не во флеш-памяти.

Обеспечение расположения в ОЗУ изменяемых данных, стека и переменных необходимо, так как в ПЗУ (флеш-памяти) невозможна перезапись данных при работе программы.

Запись программы во флеш-память

Основное затруднение в данном вопросе – многообразие выпускаемых типов флеш-памяти. АО НПЦ «ЭЛВИС» выпускает и поддерживает программные средства, обеспечивающие работу набора микросхем параллельной флеш-памяти, подключаемой к порту внешней памяти общего назначения процессоров серии «Мультикор».

Исходные коды программы MCPROG доступны по ссылке. Перечень поддерживаемых типов флеш-памяти приведен в документации на данную программу. Обеспечить поддержку всех типов выпускаемых микросхем флеш-памяти не представляется возможным. При необходимости пользователь может самостоятельно добавить поддержку флеш-памяти посредством изменения исходных кодов программы MCPROG.

В случае использования флеш-памяти, уже поддерживаемой в доступных программных средствах, данная проблема может считаться решенной. Если же применяется флеш-память, не поддерживаемая в доступных программных средствах, данная задача решается написанием программы для процессора «Мультикор». Программа в этом случае должна загружаться в ОЗУ процессора по JTAG, затем, посредством отладчика, в ОЗУ процессора должны загружаться данные для записи во флеш-память, после чего загруженная программа должна осуществить запись во флеш.

Данный документ рассматривает случай, когда используемая флеш-память поддержана в программе MCPROG.

Расположение данных в ОЗУ

В случае, когда необходима работа программы непосредственно из флеш-памяти (то есть, исполняемый код располагается в адресах ПЗУ), проблема заключается в том, что используемые данные во время исполнения программы должны располагаться в ОЗУ. При этом данные, которые к моменту начала исполнения программы должны уже иметь определенные значения, должны быть записаны во флеш-память и перед выполнением функциональной части программы должны быть скопированы в ОЗУ.

На момент подготовки документа для проектов без операционной системы в средах разработки MCStudio 3M и MCStudio 4 такого шаблона проекта не предусмотрено. Имеющиеся шаблоны проектов предполагают расположение секций данных в одной и той же области, без их копирования. Для реализации проекта, исполняемого из флеш-памяти, потребуется доработка проекта, созданного по существующему шаблону. Пример такой подготовки приведен в соответствующем разделе на примере MCStudio 4.

Проекты, исполняемые из флеш-памяти

Для работы понадобятся:

  1. Среда разработки MC Studio 4 NVCom-02T ver.19.16 или выше.
  2. Утилита для работы с энергонезависимой памятью MCPROG.
  3. Эмулятор MC-USB-JTAG.

Проект без ОС на ассемблере

Проект, написанный на ассемблере, является наиболее простым для подготовки, так как в данном случае программист сам определяет все области расположения кода, переменных, стека.

В частности, практически без изменений может быть подготовлен к исполнению из флеш-памяти проект MFBSP_GPIO_assembler, входящего в состав MCStudio 4. Для этого необходимо в проекте:

  1. Изменить адреса расположения секций. По умолчанию данный пример собирается в адресах 0xB800_1000 (внутренняя память процессора, CRAM). Необходимо переназначить адреса на 0xBFC0_0000 (с данного адреса процессор начинает исполнять программу после подачи питания и снятия сигнала nRST).

    По умолчанию:

    Рисунок 1. Адреса расположения секций до переназначения

    После изменения:

    Рисунок 2. Адреса расположения секций после переназначения
  2. Добавить в цепочку сборки подготовку файла в формате для записи средствами 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:

Рисунок 3. Преобразование в формат BIN

Преобразование в формат SREC:

Рисунок 4. Преобразование в формат SREC

После данных доработок необходимо запустить сборку проекта. После сборки в директории MultiCore_Configuration_Debug или MultiCore_Configuration_Release (в зависимости от того, какая конфигурация сборки активна) появится файл в формате BIN или SREC (в зависимости от выбранного формата).

Данный файл необходимо записать во флеш-память. Для этого надо:

  1. Скопировать файл в директорию с утилитой MCPROG (данный шаг необязателен, но иначе при вызове MCPROG необходимо указывать полный путь к записываемому файлу).

  2. Убедиться, что в файле MCPROG.CONF выбрана конфигурация, соответствующая используемому отладочному модулю (для отладочного модуля NVCom-02TEM-3U в данном файле предусмотрена конфигурация [nvcom-02tem-3u]).

  3. Убедиться, что эмулятор JTAG подключен к ПК и к плате с процессором серии «Мультикор», а также, что на плату подано питание.

  4. Убедиться, что на ПК не запущены другие сессии отладки с использованием данного эмулятора JTAG.

  5. Открыть командную строку и перейти в директорию с программой MCPROG.

  6. Запустить 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:

Рисунок 5. Запись файла BIN

Запись файла SREC:

Рисунок 6. Запись файла SREC

Проект без ОС на Си

При выполнении проекта, написанного на Си и работающего из флеш-памяти, необходимо решить проблему размещения в ОЗУ изменяемых данных и стека на время исполнения программы. При создании проекта в студии по умолчанию секции располагаются следующим образом (для случая, когда проект создается по адресам 0xBFC0_1000):

Рисунок 7. Расположение секций памяти при хранении во флеш

Данная конфигурация не будет работать при исполнении из ПЗУ, так как изменяемые данные (секции данных, bss, стек) также расположены в ПЗУ. Если создавать проект в MCStudio, располагая секцию text в ПЗУ, а секцию данных - в ОЗУ, расположение секций будет выглядеть следующим образом:

Рисунок 8. Расположение секций памяти при работе программы из флеш

Такая конфигурация будет работать, если в секции данных нет ни одной заранее определенной переменной. Фактически, это будет значит, что секции данных в программе нет, и в ПЗУ будет записана только секция .text. Если же есть хотя бы одна заранее определенная переменная - она также должна быть сохранена во флеш. Но это невозможно сделать при данной конфигурации, так как адрес секции соответствует адресам ОЗУ.

Решением является подготовка скрипта линковки с использованием ключевого слова AT. Это позволит присвоить секции данных два адреса. Первый из них - тот, куда необходимо записывать секцию данных (адрес ПЗУ). Второй - адрес, по которому к переменным секции данных обращается программа. Кроме того, в процедуре стартовой инициализации такой программы должно присутствовать копирование секции данных из ПЗУ в ОЗУ.

Тогда так будет выглядеть расположение данной программы в памяти:

Рисунок 9. Расположение данных в памяти

Для решения необходимо произвести приведенные в данной главе действия. Рассмотрим алгоритм создания такого проекта по порядку.

Создание проекта (используя библиотеку newlib)

Рисунок 10. Создание проекта с использованием библиотеки Newlib
Рисунок 11. Создание проекта с использованием библиотеки Newlib

При создании данного проекта в MCStudio4 используется библиотека Newlib, в таких проектах стартовый код берется из библиотеки и содержит в себе символ точки входа _start. Переназначить его на нужный адрес невозможно, поэтому необходимо добавить ассемблерный файл со своим «предстартовым» кодом, который, скопировав секцию данных в ОЗУ, делает переход на метку_start. В проектах без Newlib стартовый код пишет программист (автор проекта). В нем точка входа _start должна быть на 0xBFC0_0000. И в том, и в другом случае необходимо скопировать секцию данных, изменяемые в процессе исполнения программы данные, стек из флеш в ОЗУ, см. Рисунок 12. Эту задачу также выполняет ассемблерный код.

Добавление файла, содержащего стартовый код

Рисунок 12. Добавление файла
Рисунок 13. Выбор папки

Стартовый код, как уже упоминалось выше, должен содержать участок копирования секции данных из флеш в ОЗУ:

# Установка 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. Кликнув два раза на синюю строку, можно прописать имя файла:

Рисунок 14. Добавление к проекту скрипта линковщика

При возникновении ошибки «multiple definition of `_start'», необходимо отключить линковку стандартных файлов, как показано на рисунке ниже.

Рисунок 15. Отключение линковки стандартных файлов

Добавление в цепочку сборки файла в формате, подходящем для записи средствами MCPROG

См. пункт Преобразование .elf файла в формат, подходящий для прошивки во флеш. Преобразование в формат SREC:

Рисунок 16. Добавление файла .srec в цепочку сборки

Сборка. Запись проекта во флеш

После преобразования в формат SREC необходимо запустить сборку проекта. После сборки в директории MultiCore_Configuration_Debug или MultiCore_Configuration_Release (в зависимости от того, какая конфигурация сборки активна) появится файл в формате BIN или SREC (в зависимости от выбранного формата).

Данный файл необходимо записать во флеш-память. Для этого надо:

  1. Скопировать файл в директорию с утилитой MCPROG (данный шаг необязателен, но иначе при вызове MCPROG необходимо указывать полный путь к записываемому файлу).
  2. Убедиться, что в файле MCPROG.CONF выбрана конфигурация, соответствующая используемой плате (для отладочного модуля NVCom-02TEM-3U в данном файле предусмотрена конфигурация nvcom-02tem-3u).
  3. Убедиться, что эмулятор JTAG подключен к ПК и к плате с процессором серии «Мультикор», а также, что на плату подано питание.
  4. Убедиться, что на ПК не запущены другие сессии отладки с использованием данного эмулятора JTAG.
  5. Открыть командную строку и перейти в директорию с программой MCPROG.
  6. Запустить MCPROG из командной строки.
Рисунок 17. Запуск mcprog
  1. Необходимыми параметрами в случае записи файла 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:

Рисунок 18. Запись файла .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) записывается загрузчик, а в другую область памяти (определенную в загрузчике) записывается основная программа. При подаче питания на процессор начинается исполнение загрузчика, который копирует основную программу в ОЗУ.

  1. Загрузить пример проекта MFBSP_GPIO в MC Studio 4 NVCom-02T: «Help → Welcome → Примеры проектов → MFBSP_GPIO → Finish».

  2. Выполнить сборку проекта MFBSP_GPIO: «Project → Build Project».

  3. Импортировать проект загрузчика ELF-объектов в MC Studio 4 NVCom-02T:

    • Загрузчик ELF-объектов можно скачать по ссылке.
    • В «File → Import → MultiCore →MCS3 Project → Next → Browse» указать путь к директории предварительно загруженного и распакованного проекта загрузчика, после чего нажать кнопку Finish.
  4. Добавить дополнительный шаг сборки «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 → ОК

  5. Изменить значение переменной ElfObjectPtr в файле main.s на 0x1C000000.

  6. Выполнить сборку проекта: «Project → Build Project».

  7. Записать полученные файлы 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
  8. По нажатию кнопки reset пронаблюдать попеременное мерцание светодиодов VD3, VD4.