Hello
I'm using Cortex-M3, and because of speed and peripherals, I want to use a dual core MCU.
I realized I have to write two separate code and make two separate executable file.
But I don't know how to merge these executable files.
I have to write down the executable files in separate specific region of flash?
Can anyone help me? I'm a little confused
Thank you
You write a text file ending in .s (or .S), and add it to your Cortex-M4 project like you would add a .c file there.
This file will now be built using the assembler instead of the compiler (.s files are built using the assembler, .c and .cpp files by the compiler).
A short example file showing most of the assembler-directives you would be using:
;/* File: example.s */
.syntax unified /* this makes the assembler automatically generate IT instructions for you */
.cpu cortex-m0 /* this selects the cortex-m0 architecture and helps you avoid using cortex-m3/cortex-m4 instructions */
.text /* this makes sure the code goes into the .text section */
.global m0vectors
.word 0x20004000 /* this defines the initial stack pointer for the Cortex-M0 */
.word m0reset /* the reset exception vector */
/* here you should place your other exception vectors. There are too many to include in this example */
.global m0test /* this exports the symbol m0test, so you can reference it from for instance C */
.func m0test,m0test /* this names the symbol m0test as a function (for the debug-info) */
.type m0test,%function /* this tells the assembler (and linker) what kind of symbol we're generating */
.thumb_func /* this is necessary if pointers use the symbol */
.align /* this makes sure the code is positioned on a 16-bit boundary */
m0test: /* this defines the actual symbol */
ldr r0,=0x01234567 /* example code, load a value into r0 */
bx lr /* return to the calling function */
m0reset:
bl m0test /* this is the startup-code, call our function */
lockup: wfi /* sleep the CPU; it'll wake up if an interrupt occurs */
b lockup /* go back to sleep */
.size m0test, . - m0test /* this tells the linker how big this function is, so it can correctly exclude it if it's unused */
.endfunc /* this marks the end of the function (for the debug-info) */
You can then refer to the code from your C file...
/* File: main.c */
#include <ipc_queue.h>
/* Note: you don't need argc and argv on a microcontroller. */
int main(int argc, const char *argv[])
{
IPC_haltSlave();
SET_SLAVE_SHADOWREG(m0vectors);
IPC_startSlave();
while(1)
asm volatile("wfi");
}
return(0);
I'm not completely sure about the .c file; I haven't tested the code, so expect a lot of errors. It would be something in that direction, though.