We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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.