Estoy usando un microcontrolador con procesador ARM Cortex M4 y estoy desarrollando una aplicación de cargador de arranque.
- Compilador: GCC- GNU ARM compiler
- Tamaño de flash de código: 1MB
- Interfaz para descargar el código de la aplicación: clase CDM ACM USB
- Un software de aplicación en la PC para transferir el archivo binario del código de la aplicación a MCU o USB
- Tengo dos códigos: a. código principal (código de inicio), b. Código de aplicación
- En el código de la aplicación, la función run_my_app () está escrita.
-
El flujo del código principal es el siguiente:
reset-> initialize MCU initialize USB boot status = CLEAR; while(1) { wait for command from USB : write/ erase if(boot status == BOOT_COMPLETE) { call a function name run_my_app() from application code; } } if erase command received : erase the application code at a flash location 0x0020000 if write command received : Write the application code to flash location 0x0020000 after completion successful write, boot status == BOOT_COMPLETE;
Mi pregunta es ¿cómo debo asignar la función run_my_app () del código de la aplicación al código de inicio? ¿Cómo puedo obtener la dirección de la función run_my_code () para que, con el puntero a la función, pueda llamar a esa función?
Hola a todos, tengo que modificar el punto de entrada del código de la aplicación a la ubicación 0x0020000 en flash desde la ubicación 0x0000000 usando el script del vinculador. El archivo de script del enlazador generado actualmente es:
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x0100000 /* 1M */
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x0030000 /* 192K */
DATA_FLASH (rx) : ORIGIN = 0x40100000, LENGTH = 0x0004000 /* 16K */
QSPI_FLASH (rx) : ORIGIN = 0x60000000, LENGTH = 0x4000000 /* 64M, Change in QSPI section below also */
}
ENTRY(Reset_Handler)
SECTIONS
{
.text :
{
__ROM_Start = .;
/* Even though the vector table is not 256 entries (1KB) long, we still allocate that much
* space because ROM registers are at address 0x400 and there is very little space
* in between. */
KEEP(*(.vectors))
__Vectors_End = .;
__Vectors_Size = __Vectors_End - __Vectors;
__end__ = .;
/* ROM Registers start at address 0x00000400 */
. = __ROM_Start + 0x400;
KEEP(*(.rom_registers*))
/* Reserving 0x100 bytes of space for ROM registers. */
. = __ROM_Start + 0x500;
*(.text*)
KEEP(*(.init))
KEEP(*(.fini))
/* .ctors */
*crtbegin.o(.ctors)
*crtbegin?.o(.ctors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
*(SORT(.ctors.*))
*(.ctors)
/* .dtors */
*crtbegin.o(.dtors)
*crtbegin?.o(.dtors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
*(SORT(.dtors.*))
*(.dtors)
*(.rodata*)
KEEP(*(.eh_frame*))
__ROM_End = .;
} > FLASH = 0xFF
.............
..........
Agregando algunos detalles a mi implementación:
Se define una estructura 'CodeInfoStruct' tanto en el código de inicio como en el de la aplicación.
struct CodeInfoStruct
{
uint32_t RunCodeFunctionAddress;
};
En el código de la aplicación:
Aquí, se crea una instancia de estructura en una ubicación fija '0x0020100' y la dirección de la función 'run_my_app' se almacena allí.
const struct CodeInfoStruct CodeInformation __attribute__((section(".ARM.__at_0x0020100")));
const struct CodeInfoStruct CodeInformation =
{
(uint32_t)run_my_app
};
Además, en el archivo del vinculador, la dirección de inicio de la ROM se modifica a 0x0020000:
MEMORY
{
FLASH (rx) : ORIGIN = 0x00020000, LENGTH = 0x0100000 /* 1M */
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x0030000 /* 192K */
DATA_FLASH (rx) : ORIGIN = 0x40100000, LENGTH = 0x0004000 /* 16K */
QSPI_FLASH (rx) : ORIGIN = 0x60000000, LENGTH = 0x4000000 /* 64M, Change in QSPI section below also */
}
En el código de arranque:
el puntero de estructura de 'COdeInfoStruct' está definido.
struct CodeInfoStruct* pCodeInfo = 0x0020100;
Y luego, la función 'run_my_code' se llama desde el código de inicio de la siguiente manera:
void (*trgt_fnc)(void);
trgt_fnc = (void (*)())(pCodeInfo->RunCodeFunctionAddress);
trgt_fnc();
Pero, obtengo un valor cero en este 'trgt_fnc'. ¿Es una forma correcta de compartir la dirección de la función run_my code? ¿Qué está mal aquí?