Consulta ejemplo multicore baremetal edu-ciaa-nxp + ejemplo multicore en edu-ciaa-nxp

146 views
Skip to first unread message

Carlos Pantelides

unread,
Jun 10, 2016, 12:57:18 AM6/10/16
to Embebidos32
Buenas,


PROBLEMA UNO

1) He visto que hay un ejemplo blinking multicore, pero usa rtos y yo querría no usarlo. Mirando fijo el ejemplo ya he deducido que hay que tener dos main.c en sendas carpetas cortexM0 y cortexM4 y que hay que usar make make mcore && make mcore_download. ok?

3) Luego, hay que ingeniárselas para intercambiar información entre los cores, había pensado en que hagan cosas independientes primero y luego que compartan un ciaaLibs_circBuf y luego vería como lidiar con la concurrencia, no importa, problema mío.

2) Antes, entiendo que hay que inicializar desde el main de cortexM4 el cortexM0. Leyendo UM10503.pdf (LPC43xx/LPC43Sxx ARM Cortex-M4/M0 multi-core microcontroller manual), página 27 dice:

After power-up, the ARM Cortex-M0 remains in reset until the reset is released by clearing the corresponding RESET_CTRL1 bit (see Table 173).
En esa tabla menciona la dirección 0x40053104 que tras un git grep vamos a parar a  externals/drivers/cortexM4/lpc43xx/src/cr_start_m0.c donde se halla el código de inicialización del cortexM0.

4) Tomo entonces un programa que funciona con LCPOPEN y sAPI, creo las dos carpetas, muevo el main.c a cortexM4, creo un main.c en cortexM0 con los mismos #includes y un while(1) {}, hago make mcore y falla:

arm-none-eabi-gcc out/cortexM0/obj/fsm_keyReader.o out/cortexM0/obj/fsm_stepperMotor.o out/cortexM0/obj/util.o out/cortexM0/obj/crp.o -Xlinker --start-group  out/cortexM0/lib/sapi_bm.a  out/cortexM0/lib/ext_drivers.a  out/cortexM0/lib/ext_base.a -Xlinker --end-group -o out/cortexM0/bin/mcore_bare.axf  -fno-builtin -mcpu=cortex-m0 -mthumb -Wl,-Map="out/cortexM0/bin/mcore_bare.map",-gc-sections -nostdlib -T "externals/base/cortexM0/lpc43xx/linker/ciaa_lpc4337.ld"

out/cortexM0/lib/ext_drivers.a(cr_startup_lpc43xx-m0app.o): In function `ResetISR':

/DATA/carlos/git/Firmware/./externals/drivers/cortexM0/lpc43xx/src/cr_startup_lpc43xx-m0app.c:204: undefined reference to `main'

externals/base/cortexM0/lpc43xx/linker/ciaa_lpc4337.ld:122: undefined symbol `NMI_Handler' referenced in expression

collect2: error: ld returned 1 exit status
make[1]: *** [mcore_bare] Error 1
make[1]: Leaving directory `/DATA/carlos/git/Firmware'
make: *** [mcore] Error 2

EL ERROR:

Lo que me llama la atención es que no aparece baremetal.o en /out ni hay mención en los mensajes de la compilación.

Puede ser que esté fallando el Makefile o no estoy respetando alguna convención? es que si incluyo a mano a baremetal, parece funcionar hasta un punto. Ejecuté estos dos fixes a mano y no hubo errores. Claro que no es el proceso completo.

Ejecución agregada:

arm-none-eabi-gcc -Wno-unused-function -c -Wall -ggdb3 -fdata-sections -ffunction-sections -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mthumb -DCORE_M4  -Icurso/baremetal_mcore/inc  -I./externals/drivers/inc -I./externals/drivers/cortexM4/inc  -I./externals/drivers/cortexM4/lpc43xx/inc  -I./externals/drivers/cortexM4/lpc43xx/inc/device  -I./externals/drivers/cortexM4/lpc43xx/lpc4337/inc  -I./modules/base/inc  -I./modules/base/cortexM4/inc  -I./modules/base/cortexM4/lpc43xx/inc  -I./modules/base/cortexM4/lpc43xx/lpc4337/inc  -I./externals/base/inc  -I./externals/base/cortexM4/inc  -I./externals/base/cortexM4/lpc43xx/inc  -I./externals/base/cortexM4/lpc43xx/lpc4337/inc -DARCH=cortexM4 -DCPUTYPE=lpc43xx -DCPU=lpc4337 -DBOARD=edu_ciaa_nxp curso/baremetal_mcore/src/cortexM4/baremetal.c -o out/cortexM4/obj/baremetal.o

no error

Ejecución corregida:

arm-none-eabi-gcc out/cortexM4/obj/vector.o out/cortexM4/obj/baremetal.o out/cortexM4/obj/crp.o -Xlinker --start-group  out/cortexM4/lib/ext_drivers.a  out/cortexM4/lib/ext_base.a -Xlinker --end-group -o out/cortexM4/bin/baremetal_mcore.axf  -fno-builtin -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mthumb -Wl,-Map="out/cortexM4/bin/baremetal_mcore.map",-gc-sections -nostdlib -T "externals/base/cortexM4/lpc43xx/linker/ciaa_lpc4337.ld"

no error

PROBLEMA DOS

Inicié entonces las pruebas de cero, quería saber si multicore de algún modo anda

git checkout oilGenerator_fixing (estaba en un branch local de master)
make clean
make generate (dice usar blinking_multicore.oil, ok)
make mcore

dice no encontrar "Os_Cfg.h" desde modules/rtos/inc/os.h, pero find dice
./out/gen/inc/Os_Cfg.h

Esto seguro es otro problema, probablemente más sencillo, pero me jode pues siempre es reconfortante ver que algo sí funciona.

Aproveché estar en este branch y la falla con respecto a mi problema original es el mismo.

Sin darme la solución, alguna pista de qué esta fallando? Sobre todo para el PROBLEMA UNO. Le puedo dedicar de a ratos un tiempo, pero necesito guía.

Perdón si no soy muy claro, pero fueron cuatro horas robadas al sueño.

Gracias anticipadas


Mas detalles:

*) Si, siempre hice make clean
*) Si, hice make mcore y no make
*) Si, tomé tambien examples/baremetal que no usa sAPI, lo transformé y el error es el mismo
*) Si, ya cambié el orden en el Makefile de las arquitecturas y da igual, pero falla con cortexM4

mcore:
ifeq ($(CPUTYPE),lpc43xx)
        make ARCH=cortexM4 OUT_DIR=out/cortexM4
        make ARCH=cortexM0 OUT_DIR=out/cortexM0

Gracias anticipadas

BTW: si hago make clean,  find . -iname "*.o" no viene vacío:
./out/cortexM0/obj/sAPI_IsrVector.o
./out/cortexM0/obj/rtc_18xx_43xx.o
./out/cortexM0/obj/sAPI_Uart.o
./out/cortexM0/obj/ssp_18xx_43xx.o
./out/cortexM0/obj/stopwatch_18xx_43xx.o
....
Cambiando el orden de arquitecturas da lo mismo pero con cortexM4, onda que make clean no ve out/cortexM[0|4]


Is it a feature or a bug?


Reply all
Reply to author
Forward
0 new messages