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

Загрузка программы в параллельную флеш

Система, построенная на базе процессоров «Мультикор», имеет внешнюю энергонезависимую память для загрузки программы. В данном документе описывается загрузка из параллельной флеш-памяти. Документ иллюстрирует создание проекта для загрузки без использования загрузчика, также он описывает работу загрузчика. Поясняется, как создать проект для его работы из флеш-памяти и записать программу во флеш-память.

Работа с флеш-памятью с использованием программы-загрузчика или из флеш-памяти

Существуют два метода работы программы, находящейся во флеш-памяти:

Использование специальной программы-загрузчика

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

Программа-загрузчик читает ELF-заголовок файла, находящегося в памяти по указанному в нем (в загрузчике) адресу и копирует секции ELF-объекта по прописанным в заголовке адресам. Рассмотрим пример программы-загрузчика, подробнее по который можно узнать в статье "Работа с параллельной флеш-памятью"

  1. Инициализация порта внешней памяти.

    Частоты: RISC CPU 250МГц, MPORT 100МГц, DSP 250МГц, частота подается на все внутренние устройства процессора. Вывод CS0 подключен к SDRAM, SDRCON сконфигурирован для SDRAM.

    li $30,0xB82F0000
    li $5, 0x00941432
    sw $5,CR_PLL($30)
    li $5,0xFFFFFFFF
    sw $5,CLK_EN($30)
    li $5,0x3000FC
    sw $5,CSCON0($30)
    li $5,0x030D0030
    sw $5,SDRCON($30)
    li $5,0x00F50222
    sw $5,SDRTMR($30)
    li $5,0x00000001
    sw $5,SDRCSR($30)
  2. Определяем адрес начала стека загрузчика

      li  $29,StackTopPtr    #set stack
  3. И начальный адрес основной программы во флеш-памяти.

      li  $5,ElfObjectPtr    #set elf.obj pointer
  4. Проверяем на корректность заголовок ELF файла.

     loadelf:
    move $30,$31
    beqz $5,exit
    nop
    ## check ehp->e_magic ##
    lw $4,0x00($5)
    bne $4,ELF_MAGIC, exit
    nop
    ## check ehp->e_type ##
    lh $4,0x10($5)
    bne $4,ET_EXEC, exit
    nop
    ## check ehp->e_machine ##
    lh $4,0x12($5)
    bne $4,EM_MIPS, exit
    nop
    ## check ehp->e_ehsize ##
    lh $4,0x28($5)
    bne $4,52, exit
    nop
    ## check ehp->e_phentsize ##
    lh $4,0x2a($5)
    bne $4,32, exit
    nop
  5. Копируем секции программы в ОЗУ. Определяя параметры секций (копируемые/не копируемые, размер) по таблице формата секций copy_section:

     lw  $4,0xc($8)  # a0 <- eshp[i].sh_addr
    lw $2,0x10($8)
    add $5,$2 # a1 <- ehp + eshp[i].sh_offset
    lw $6,0x14($8) # a2 <- eshp[i].sh_size
    #srl $6,2
    jal wmemcpy
    nop
    li $5,ElfObjectPtr
  6. Переходим на точку входа основной программы.

    jr $4
    nop

Работа программы из флеш-памяти без загрузчика

Когда обычная программа newlib, созданная в MCStudio, начинает работать с адреса 0xBFC0_0000, в ее начале линкуется стартовый код, затем секции текста и данных. Корректно такая программа работать не будет. Для устранения этой проблемы необходимо настроить проект (скрипт линковки) так, чтобы в ОЗУ скопировались только секции данных .data и секция инициализированных нулем глобальных данных .bss. Секция текста .text не копируется.

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

Имеются в виду команды, предназначенные для настройки тактирования и порта внешней памяти микросхемы перед загрузкой программы в память. В среде разработки MCStudio эти команды расположены в окне «Startup registers» и могут быть выполнены в отладчике MDB без изменений. На данном этапе может проявиться ошибка, связанная с отсутствием тактирования, которая описана в предыдущем разделе. Проявляться она будет тоже в форме длительных таймаутов при выполнении каждой из команд.

Алгоритм записи программы во флеш с использованием программы-загрузчика

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

  1. Записать загрузчик в адрес 0xBFC0_0000 командой mcprog [-e2] file.bin 0xBFC0_0000. MCPROG не анализирует .BIN формат, а просто записывает его байт за байтом, начиная с указанного для записи адреса. Если мы записываем файл такого формата, то в строке вызова MCPROG мы должны за именем файла указать адрес, куда его прошивать.
  2. После удачной загрузки можно запустить верификацию данных, записанных во флеш: mcprog -v file.bin 0x0xBFC0_0000
  3. Далее необходимо загрузить программу для исполнения командой mcprog –e2 <project_name>.o 0xBFC0_0800 -e2 – ключ, при запуске с которым MCPROG производит стирание только тех секторов, в которые будет производиться запись данных, что существенно ускоряет работу с некоторыми микросхемами памяти. file.bin – бинарный файл загрузчика. После прошивки необходимо отключить от платы эмулятор USB-JTAG; снять, а затем подать питание.

Алгоритм записи программы во флеш для исполнения непосредственно из флеш-памяти

Генерация файла формата .SREC средствами MCStudio3M

Файл для прошивки можно сгенерировать из финального ELF-файла с помощью утилиты mipsel-elf32-objcopy с ключом -O format. Необходимо выполнить следующую последовательность действий:

  1. Cоздать проект стандартным для MCStudio 3M способом.

  2. В окне Options → Tools добавить строку mipsel-elf32-objcopy -O srec %Project.o %Project.srec, см рис.1

    Рисунок 1. Добавление строки в параметры.
  3. Скомпилировать проект. В случае удачной компиляции файл формата .SREC будет доступен в корневой директории проекта.

Запись во флеш

Записать программу во флеш память, используя утилиту MCPROG, можно так:

  mcprog [-e2] file.srec

На рисунке 2 представлен пример успешного запуска команды прошивки.

Рисунок 2. Успешный запуск команды прошивки.

После прошивки необходимо отключить от платы эмулятор USB-JTAG, а затем подать питание.