查看: 2434|回复: 4

[原创] lpc54114第一次接触双核

[复制链接]
  • TA的每日心情
    奋斗
    2021-7-30 11:40
  • 签到天数: 1792 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2018-4-18 17:37:22 | 显示全部楼层 |阅读模式
    分享到:
    昨天下午开始接触双核到现在,1天半了,开始接触时,一直搞不懂双核的怎么工作的,没办法,只能到处看别人发的帖子,加上自己不断的摸索,逐渐明白双核的调用规则,在此先谢谢各位先前研究双核的兄弟们了。
    下面就我的理解,给大家简要的说明一下,如有雷同,纯属巧合。。。。。


    LPC54114是M4和M0+的双核,如果想把2个内核都用上,需要新建2个工程,而且2个工程都要在同一个workspace下。于是我就找了个官方的例程,开始研究。
    使用的官方hello_world例程,我没有做任何改动,只是研究明白了具体流程,我把自己的理解分享给大家。
    下图是打开的workspace,导入2个现有的工程。

    其中M0+的工程大家可以按正常的操作步骤,增加自己的代码,编译,但不能下载,同时要生成bin文件,而且要指定烧录的首地址,便于m4和的调用,和互相通讯。下面是M0+核代码生成bin文件的设置,已经有人发帖说明了,在此,不多表。

    $K\ARM\ARMCC\bin\fromelf.exe --bincombined --bincombined_base=0x20010000 --output=$Lcore1_image.bin !L
    M4核的配置就比较多了,也很麻烦,我仔细研究了好长时间,才懂了点皮毛。
    首先会调用M0+生成的代码,导入ram,使M0+核控制的代码有运行的条件

    上图是incbin.s的内容,实现把M0+内核的代码导入ram。
    在hello_world_core0.c是(m4内核的main函数)增加如下代码
    /* Address of RAM, where the image for core1 should be copied */
    #define CORE1_BOOT_ADDRESS (void *)0x20010000
    这个宏定义是M0+内核烧录到rom的首地址        
    #if defined(__CC_ARM)
    extern uint32_t Image$$CORE1_REGION$$Base;
    extern uint32_t Image$$CORE1_REGION$$Length;
    #define CORE1_IMAGE_START &Image$$CORE1_REGION$$Base
    #elif defined(__ICCARM__)
    extern unsigned char core1_image_start[];
    #define CORE1_IMAGE_START core1_image_start
    #endif


    #ifdef CORE1_IMAGE_COPY_TO_RAM
    uint32_t get_core1_image_size()//读取m0+内核代码的大小
    {
        uint32_t core1_image_size;
    #if defined(__CC_ARM)
        core1_image_size = (uint32_t)&Image$$CORE1_REGION$$Length;
    #elif defined(__ICCARM__)
    #pragma section = "__sec_core"
        core1_image_size = (uint32_t)__section_end("__sec_core") - (uint32_t)&core1_image_start;
    #endif
        return core1_image_size;
    }
    #endif
    然后在main函数中增加拷贝m0+代码的代码
    #ifdef CORE1_IMAGE_COPY_TO_RAM
        /* Calculate size of the image  - not required on LPCExpresso. LPCExpresso copies image to RAM during startup
         * automatically */
        uint32_t core1_image_size;
        core1_image_size = get_core1_image_size();
        PRINTF("Copy Secondary core image to address: 0x%x, size: %d\n", CORE1_BOOT_ADDRESS, core1_image_size);

        /* Copy Secondary core application from FLASH to RAM. Primary core code is executed from FLASH, Secondary from RAM
         * for maximal effectivity.*/
        memcpy(CORE1_BOOT_ADDRESS, (void *)CORE1_IMAGE_START, core1_image_size);
    #endif
    编译,下载,即可运行,下面是串口助手的截图,说明运行正常,同时,M0+内核控制的led(4个红色一组,4个绿色一组)也在交替闪烁。

    按下PB2后,M0+内核停止运行,按下PB3后M0+内核开始运行


    以上是个人今日的一点收获,分享给大家,希望初学者可以少走弯路。

    回复

    使用道具 举报

    该用户从未签到

    发表于 2018-4-20 09:11:09 | 显示全部楼层
    讲得易懂,不错,谢谢分享
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2025-1-12 19:04 , Processed in 0.162826 second(s), 23 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.