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

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

Данный документ описывает подготовку и запись во флеш-память отладочного модуля 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.