Я пытаюсь выяснить минимальные требования для инициализации cpu1 из cpu0 в конфигурации усилителя на zynq-7000.
У меня есть заданный FSBL, который передается на u-boot, с которой я копирую обе программы (cpu0 / 1) из fla sh в разные места в ram (с sf read ...
).
Я могу запустить обе программы на cpu0 из u-boot с go [adr]
, где adr - это начальный адрес любой программы. Я получаю ожидаемый вывод на уартс.
Что не работает, так это то, что cpu0 должен запустить cpu1, записав свой начальный адрес в регистр 0xffff_fff0
и после этого выдав системное событие sev
.
Я не включаю никакие кеши, MMU или SCU, потому что я хочу сделать это как можно более простым (без синхронизаций и сбросов), пока я не достигу запуска cpu1. Или это на самом деле проблема, и мне нужно что-то из этого?
В настоящее время я только инициализирую таблицу векторов, печатаю в uart и дополнительно для ядра 0 пытаюсь запустить ядро 1:
/* CPU 0 */
.section .vector_table, "x"
.global _init
_init:
b reset /* reset handler */
b . /* software interrupt */
b . /* prefetch abort */
b . /* data abort */
b . /* reserved */
b . /* irq */
b . /* fiq */
/* ASCII control chars */
.equ asciiLF, 0x0a
.equ asciiCR, 0x0d
.section .text
uart1fifo: .word 0xe0001030 /* UART 1 rx/tx fifo register */
reset:
/* Output "0" on UART 1 */
ldr r0, uart1fifo
mov r1, #'0'
str r1, [r0]
mov r1, #asciiCR
str r1, [r0]
mov r1, #asciiLF
str r1, [r0]
/* Set cpu1 start address */
ldr r0, =0x20000000 /* CPU 1 start address */
ldr r1, =0xfffffff0 /* Register to point to the CPU 1 start address */
str r0, [r1]
/* I added a 0.5s wait here which did not help */
sev /* Execute SEV to cause CPU 1 to wake up */
/* Output "." on UART 1 to indicate that we actually went so far */
ldr r0, uart1fifo
mov r1, #'.'
str r1, [r0]
mov r1, #asciiCR
str r1, [r0]
mov r1, #asciiLF
str r1, [r0]
b . /* Endless loop */
Я вижу «0» и «.» на uart 1, когда я запускаю приведенный выше код на процессоре 0.
/* CPU 1 */
.section .vector_table, "x"
.global _init
_init:
b reset /* reset handler */
b . /* software interrupt */
b . /* prefetch abort */
b . /* data abort */
b . /* reserved */
b . /* irq */
b . /* fiq */
/* ASCII control chars */
.equ asciiLF, 0x0a
.equ asciiCR, 0x0d
.section .text
uart0fifo: .word 0xe0000030 /* UART 0 rx/tx fifo register */
reset:
/* Output "1" on UART 0 */
ldr r0, uart0fifo
mov r1, #'1'
str r1, [r0]
mov r1, #asciiCR
str r1, [r0]
mov r1, #asciiLF
str r1, [r0]
b . /* Endless loop */
Здесь я вижу «1» на uart 0, когда я запускаю его на процессоре 0.
новичок в этом, и я немного растерялся. Я что-то упустил? Что я могу попытаться заставить это работать?
Я смотрел на xapp-1079, но он использует автономные библиотеки Xilinx, и мне очень сложно отфильтровать то, что действительно нужно. Мне нужен минимальный рабочий пример, чтобы я мог портировать его на exoti c OS, которую мы запускаем на первом ядре.