This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

How to build an application for dual core(M4+M0) MCU?

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

Parents
  • 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.

Reply
  • 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.

Children
No data