|
简介 LPC541xx系列MCU包含一个主Cortex M4内核,以及一个可选的从Cortex M0 +内核。 写这篇文章时,现有的器件型号是: ● 仅具有Cortex M4的MCU: ○ LPC54101J256 ○ LPC54101J512 ○ LPC54113J256
○ LPC54114J256 ● 具有Cortex M4主控控制器和Cortex M0 +协处理器的MCU: ○ LPC54102J256 ○ LPC54102J512 ○ LPC54113J128
上电或复位后,主机和从机内核都会启动,但从机内核立即进入休眠状态。 然后主机内核负责唤醒从机内核;因此命名为主机和从机。 实际上主机和从机只适用于启动过程;启动后,应用程序可以将任何内核视为主机或从机。 LPCXpresso IDE为单核和多核系统提供高度灵活的支持,用于创建和调试LPC541xx应用。 本文详细介绍了创建和调试此类多核应用程序的过程。 创建一个主/从项目对概述 LPCXpresso中的多核应用程序包含两个相关联的项目 - 一个项目包含从机代码,另一个项目包含主机代码。 “Master”项目还将包含一个指向“Slave”项目的链接,它将“Slave”的输出镜像包含在“Master”镜像中。 以下步骤详细介绍了如何创建和链接这样一对项目。 注意:建议将创建和构建的LPC541xx多核项目链接到LPCOpen。 因此,在您按照以下顺序操作之前,请确保已从LPC5410x系列或LPC5411x系列(取决于您的目标器件)的LPCOpen软件包中导入芯片和(可选)开发板库项目(针对M4和M0 +) 。 步骤1 - 创建Slave项目 转到下面两项之一: ● Quickstart -> New project -> LPC5410x -> LPC5410x Multicore (M0+ slave) ● Quickstart -> New project -> LPC5411x -> LPC5411x Multicore (M0+ slave)
● 选择所需的项目类型(例如LPCOpen - C项目),然后单击Next。 ● 输入项目名称(例如,mc_slave),然后单击Next。 ● 选择所需的目标MCU,如LPC54102J512-M0,然后单击Next。 ● 在LPCOpen库项目选择页面上,为M0 +选择适当的芯片库,例如lpc_chip_5410x_m0,然后选择适当的开发板库,例如lpc_board_lpcxpresso_54102_m0,然后单击Next。 ● 在CMSIS DSP库选择单击Next。 ● 在“其他选项”上,确保代码读保护(CRP)未被选中 ● 在“内存配置编辑器”页面上,您应该看到默认为目标MCU定义的各种内存块:
我们需要修改默认的内存映射,只使用Cortex-M0+(而不是Cortex-M4)使用的内存。 ● 突出显示表中的“MFlash512 / Flash”行,然后单击“Delete”按钮。 ● 突出显示表中的“Ram0_64 / RAM”行,然后单击“Delete”按钮。 ● 突出显示表中的“Ram2_8 / RAM2”行,然后单击“Delete”按钮。 应该只剩下“Ram1_32 / RAM2”行。Cortex-M0+从机镜像将要从该内存块执行。
然后单击直到您可以单击“Finish”。 步骤2 - 创建master项目
转到下面两项之一: ● Quickstart -> New project -> LPC5410x -> LPC5410x Multicore (M4 master): ● Quickstart -> New project -> LPC5411x -> LPC5411x Multicore (M4 master):
● 选择所需的项目类型(例如LPCOpen - C项目),然后单击Next。 ● 输入项目名称,如mc_master,然后单击Next。 ● 选择所需的目标MCU,例如LPC54102J512,然后单击Next。 ● 在LPCOpen库项目选择页面上,选择M4的LPC5410x芯片库(例如lpc_chip_5410x),然后选择相应的开发板库(例如lpc_board_lpcxpresso_54102),然后单击Next。 ● 单击Next通过CMSIS DSP库选择和特定部分的选项页。在“其他选项”,确保代码读保护(CRP)被选中。 ● 在“内存配置编辑器”上按照默认值保留内存定义。 ● 在“多核项目设置”页面上,使用多核从项目选择框中的“Browse”按钮选择先前创建的多核M0 +项目:
● 然后单击Next,然后单击Finish。 如果现在在“项目属性”视图中选择master项目,则在“快速启动”视图中选择“生成”选项,这将触发slave项目的构建,然后是master项目(如果必要还可以触发LPCOpen库项目)。 请注意,实际上Slave项目生成的可执行文件的副本将嵌入到Master项目的可执行文件中。
调试主/从项目对概述 注意:LPC541xx调试仅支持LPC-Link2和NXP的CMSIS-DAP固件。 使用快速启动视图中的调试选项启动主项目的调试会话。 出现提示时,选择要连接的SWD目标,在本例中是“Details”列中标记为“Cortex-M4”的目标:
请注意,此设置将存储在项目的调试启动配置中,因此应在调试会话之间记住。 选择合适的内核后,LPCXpresso应该将下载包含主映像和从映像的可执行文件到目标MCU闪存中。 一旦连接已经建立,您可以在主可执行文件中的main()开头打上默认断点:
此时,在Project Explorer视图中选择Slave项目,然后使用Quickstart视图调试选项启动第二个调试连接。 选择要连接到的SWD目标。 请注意,只要您已经连接到M4,则将会自动选择M0从机。
注意:在LPCXpresso IDE 7.6.2和更高版本中,Cortex-M0将显示为Device 1,而不是Device 16。 LPCXpresso检测到这是一个Slave项目,并使用一个“仅附加”连接(因此不下载代码,并保持从镜像“执行”)。
现在,单步跳过主机映像中的boot_multicore_slave()函数,从机内核将开始执行,在它的main()打上默认断点:
您现在可以并行调试两个内核,通过在调试视图中切换它们来选择要单步调试、恢复、挂起哪个内核等。 注意:尽管在两个内核上没有调试逻辑同步的调试操作,但您可以在调试视图中同时选择两个应用程序(通常使用CTRL-Click),然后由调试器并行地在两个内核上执行操作(如单步调试、恢复、挂起等)。 当前选择的内核将是用于显示许多调试相关视图的内核,例如Register和Locals。 还可以创建许多调试相关视图的副本,并将每个副本锁定到特定内核。
例如,要创建两个寄存器视图,一个用于M4,一个用于M0 + ...首先,使用寄存器视图中的“Open New view”按钮创建第二个寄存器视图:
现在使用"Pin to Debug context”按钮将原始视图固定到当前在调试中选择的内核:
现在在Debug视图中选择另一个内核,并转到第二个Register视图。 使用此视图的“Pin to Debug context”按钮将第二个Register视图锁定到所选的内核:
注意,完成调试后,可以使用图标栏上的"Terminate / Disconnect All”按钮同时断开Master和Slave内核的调试连接:
多核项目 - 附加信息 定义
对于LPC5410x项目,会自动创建许多编译器相关的定义,以允许根据特定项目是配置为从站、主站还是两者都不是,来进行某些代码块的条件编译。 ● __MULTICORE_MASTER ○ 由LPCXpresso自动定义,用于已配置为Master项目的项目 ● __MULTICORE_MASTER_SLAVE_M0SLAVE ○ 由LPCXpresso自动定义,用于已被配置为主项目并且具有与其关联的从项目(因此向主项目指示从项目所使用的cpu类型)的项目。 ● __MULTICORE_M0SLAVE ○ 由LPCXpresso自动定义,用于已经配置为从属项目的项目 ● __MULTICORE_NONE ○ 由LPCXpresso自动定义,用于未配置为从属或主项目的项目 注:LPCXpresso IDE中的多核支持高度灵活,提供超出LPC5410x系列所需的功能。因此,符号__MULTICORE_MASTER_SLAVE_M4SLAVE和__MULTICORE_M4SLAVE也是为了完整性而提供的,但不是任何现有零件所必需的。
slave启动代码
boot_multicore_slave()是由LPCXpresso项目向导直接创建的主项目代码调用,用于唤醒睡眠中的从机内核。这个函数从LPCOpen软件包中调用LPC5410x,它们是以预构建的库形式提供的。这意味着它目前只能创建和构建链接到LPCOpen的LPC5410x多核项目。 请注意,包含此函数的源文件将包含在所有LPC5410x项目中,但将有条件地编译,以便仅在需要时包括它。这样做是为了允许最初创建的项目(例如,作为从项目)作为主项目重新配置(通过项目属性 - 链接器多核选项卡)。 请注意,如果您查看LPC5410x LPCOpen软件包中提供的多核项目,则从引导代码会直接并入主函数。但是,它执行与LPCXpresso向导生成的代码相同的初始化。
Reset Handler 代码 当配置为Master项目时,LPC5410x启动文件将在复位处理程序ResetISR()开始时使用附加(汇编程序)代码构建,并将“标准”复位处理程序代码移动到ResetISR2()。 需要此附加代码才能正确引导主机和从机内核。它是用汇编器编写的,以便强制转换成“Thumb1”代码,因此可由两个内核运行。 |