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

star_66666   2018-4-18 17:35 楼主
昨天下午开始接触双核到现在,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+内核开始运行


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

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复