微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > +双核通讯

+双核通讯

时间:10-02 整理:3721RD 点击:

开发板使用的LPC54114芯片,是基于ARM? Cortex?-M4内核而构建,具有可选的Cortex?-M0+协处理器,兼备高性能和低功耗特性,让您能够尽享先进集成带来的各种优势,以及极致灵活的连接特性。

LPC5411x的系统框架


主要特点:


LPC5411x有单核和双核选项。单核选项配置的CPU是Cortex?-M4,适用于那些无需软件分区的单核处理系统,而双核选项则增加了一个Cortex?-M0+作为协处理器,更加适合于始终开机应用。在这些应用中MCU能够以节电模式运行,侦听传入数据,并在侦听到传入数据时,唤醒任一内核,收集或处理信息。在主动模式下,为了优化功效和吞吐率,开发人员可以利用高功效的Cortex?-M0+内核执行数据收集、整合,以及系统任务管理,同时通过Cortex?-M4内核更加快速地执行传感器融合等计算密集型算法,实现低功耗目标。

双核架构:


为了确保Cortex-M4和Cortex-M0+两个内核可以独立运行,自由访问系统资源,LPC541xx把SRAM划分成了三个地址连续但是可以独立操作的区块以供CPU访问。

针对始终开机应用,该系列提供了多种低功耗常开的数字和模拟传感器,它们会时刻处于监听状态并可唤醒任意一个CPU内核或相关外设模块来做数据处理。例如芯片中配置的数字麦克风子系统(DMIC)在监听状态的功耗只有不到50uA。用户可以选择唤醒Cortex-M4内核处理数据密集型任务,也可以选择唤醒Cortex-M0+内核运行系统控制相关任务。

低功耗模式:


Cortex-M4出色的功率效率


通过选择性为SRAM 供电来降低功耗


以上内容来源于网络查找资料。

实现双核通讯,就要了解双核的开发、启动、通讯和互斥等方方面面。

首先到NXP官网下载SDK包SDK_2.2.1_LPCXpresso54114,通过SDK包中的例程来学习。

在SDK的boards\lpcxpresso54114\multicore_examples\hello_world下有一个hello world的例程,下面有两个文件,一个M0的,一个是M4的。

每个文件都是一keil建立的工程,都可以单独编译,但是如果你先打开hello_world\cm4\mdk这个M4的工程先编译的话,将出错,原因是没有M0生成的core1_image.bin,看到这个错误,大家可能已经想到,这个bin文件应该就是M0的运行文件。不错,我首先必须编译M0,生成core1_image.bin这个文件。

为了方便项目管理,我们把M0和M4两个工程天加到一个工作空间中。

首先打开一个工程下的后缀为.uvmpw的文件,打开后


在WorkSpace上右键。


点击弹出的对话


可以点击增加和删除来管理项目。

通过这样我们把M0和M4的两个工程添加到了一个工作空间中了。

你需要编译和操作那个工程,就在那个工程上右键


会弹出对话框,点击Set as Active Project。就激活了当前项目,没有激活的很多是操作不了的。

既然M4工程中需要调用MO编译的bin文件,那么keil怎么生成bin文件呢?

在 Realview MDK 的集成开发环境中,默认情况下可以生成 *.axf 格式的调试文件和 *.hex 格式的可执行文
件。虽然这两个格式的文件非常有利于 ULINK仿真器的下载和调试 ,但是在很多情况下还是需要bin文件。那么

Realview MDK 集成开发环境有他的优势,可以将 *.axf 格式文件或 *.hex 格式文件转换成 *.bin 。

在 Realview MDK 中, 生成 *.bin 格式文件的工具是 ARM 公司的 RVCT 开发套件中的 fromelf.exe 。默认安装下,它 位 于 C\ : Keil\ARM\BIN40 文件 夹 下。


构选 After Build/Rebuild 框 中的 Run #1 多选框 ,在 后边 的文本 框 中 输 入
C:\Keil\ARM\BIN31\fromelf.exe --bin -o ./bin/test.bin ./test.axf 命令 行 。重新编译 文件,在 ./bin/ 文件 夹 下生成了 test.bin 文件。

fromelf.exe 转换工具的 语 法格式 如 下


例程中添加的是:

$K\ARM\ARMCC\bin\fromelf.exe --bincombined --bincombined_base=0x20010000 --output=$Lcore1_image.bin !L

生成bin文件主要是M0的工程中设置。M0的工程弄好之后,就开始设置M4了。

在m4工程中incbin.s中应用了core1_image.bin文件。


在main文件中


可以看到是0x20010000是我们在M0中生成bin文件时定义的基地址。

现在我们来分析一下源码,使用的NXP官方的SDK例程,而我们的开发板是万利提供的,所以硬件是不同的。所以注意硬件初始化。

首先分析M0的源码:main函数在hello_world_core1.c中

根据硬件


修改LED对应的引脚,定义红灯为LED0,绿灯为LED7


定义好之后M0就是红灯闪烁。

M4源码:主函数在hello_world_core0.c文件中。

按键:




get_core1_image_size函数是获取M0工程中bin文件的大小,然后拷贝到#define CORE1_BOOT_ADDRESS (void *)0x20010000定义的RAM地址中。

初始化启动M0

MCMGR_StartCore(kMCMGR_Core1, CORE1_BOOT_ADDRESS, 1, kMCMGR_Start_Synchronous);


然后通过按键来实现启动和关闭M0核。

编译下载之后就可以看到效果了。

通过终端可以看到运行状态:

启动


此时LED0开始闪烁。

按下PB2键


LED0停止闪烁。

按下PB3键


LED0又开始闪烁。

到这里就可以正常启动和关闭M0核了。

在M0中把几个红色的LED灯都初始化一下,不然一直处于微亮状态,挺烦躁的。


接下来就是双核通讯了。

M0与M4之间通讯,API函数提供了邮箱的方式进行通讯。

这里实现M4将数据传输给M0,M0通LED显示出来,并将相同的数据传输到M4,M4通终端打印出来。

在M0和M4的程序中

添加邮箱头文件#include "fsl_mailbox.h"

使用邮箱必须先初始化并使能邮箱中断:

        MAILBOX_Init(MAILBOX);

  NVIC_EnableIRQ(MAILBOX_IRQn);

编写M0函数:

M0邮箱中断函数:


在main中while下添加


根据收到的数据显示对应LED灯,并返回收到的值。

编写M4函数:

M4邮箱中断函数:


在main中while下添加


循环发生1到4.


LED也在循环点亮。

需要注意的是flatform.c中已经定义邮箱中断函数MAILBOX_IRQHandler,需要把这里屏蔽掉。

双核通讯实现了跑马灯。


这么好的帖子竟然没人回复

顶,讲的很好!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top