晋城百姓网:痞子衡嵌入式:鬼话双核i.MXRT1170之Cortex-M7与Cortex-M4相互激活之道

admin 4周前 (10-01) 科技 55 1

  人人好,我是痞子衡,是正经搞手艺的痞子。今天痞子衡给人人分享的是恩智浦i.MXRT1170上Cortex-M7与Cortex-M4内核相互激活的方式

  痞子衡最近在深耕i.MXRT1170这颗划时代的MCU,已经写了不少篇相关手艺文章,涉及整体特点、Raw NAND启动、FlexRAM模块、ECC特征等,文章写得越越发以为i.MXRT1170是座宝矿,值得人人去仔细探索。话不多说,咱们继续挖矿吧,今天痞子衡为人人先容i.MXRT1170双核间相互激活的方式。

一、双核功效简介

  双核是i.MXRT1170除了1GHz主频之外的第二个显著特点,i.MX RT系列也是从RT1170最先首次引入了双核架构。i.MXRT1170包含了一个Cortex-M7内核(1GHz)以及一个Cortex-M4内核(400MHz),超强的Cortex-M7内核专注于音视频识别与处置、千兆以通讯控制等庞大义务上;低功耗Cortex-M4内核则做一些相对简朴的键盘响应、传感器采集、电机控制等义务,即如下图所示:

二、双核激活方式

  i.MXRT1170虽然是双核(Cortex-M7与Cortex-M4),但这两个核并没有确定的主从关系,i.MXRT1170系统设计里每个核都既可以当主核也可以当从核(默认CM7是主核,CM4是从核),用户设置了主从关系之后,芯片上电后先从主核启动,然后由主核来激活从核启动。

2.1 选定主核

  主核是在eFuse中选定的,fusemap中0x960[13:12]对应的是BT_CORE_CTRL和BT_CORE_SEL bit,默认两个bit都是0,即从CM7是主核,上电CM7启动,若是需要更改主核为CM4,则需要烧写eFuse。

  这里顺便插一句,我们知道芯片上电都是先执行BootROM代码,既然CM7和CM4都可以当主核,那么这个BootROM代码需要既可以在CM4下执行,也可以在CM7下执行。这里借助的是Cortex-M处置器向下兼容、软件二进制向上兼容的特征,BootROM代码使用Cortex-M4指令集去编译即可。

2.2 加载从核APP(可选)

  选定了主核之后,主核App由BootROM加载执行,我们需要在主核App里添加代码来启动从核。启动从核的第一步是加载从核App,App从加载执行位置上可分为两种,一种是在Flash里原地执行,另一个是拷贝到RAM里执行,只有后者才需要先加载再执行。
  关于从核App执行位置,这里有需要好好聊一下,下面是CM7和CM4下各自系统内存映射表,从内外可以看到除了各自内核TCM空间仅对自己可见外,其余地址空间对两个核均是可见的(而且映射地址也是相同的),以是若是加载的从核App是在TCM里执行的,主核需要将从核App加载到从核TCM对应的OCRAM空间(CM4当从核时其TCM对应的是OCRAM(M4)空间,CM7当从核时其TCM对应的是OCRAM(M7)空间)。

晋城百姓网:痞子衡嵌入式:鬼话双核i.MXRT1170之Cortex-M7与Cortex-M4相互激活之道  第1张 晋城百姓网:痞子衡嵌入式:鬼话双核i.MXRT1170之Cortex-M7与Cortex-M4相互激活之道  第2张

  下面是加载从核App示例代码,appBuffer是从核App Image在外部Flash里存放的首地址,vectorAddr是加载的目的RAM首地址。为了防止Cache滋扰后续从核取复位向量执行,主核在加载App前后最好均要清一下DCache。

void copy_app_image(uint8_t *appBuffer, uint32_t appLength, uint32_t vectorAddr)
{
#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
    SCB_CleanInvalidateDCache_by_Addr((void *)vectorAddr, appLength);
#endif

    /* Copy app image to dest addrress. */
    memcpy((void *)vectorAddr, appBuffer, appLength);

#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
    SCB_CleanInvalidateDCache_by_Addr((void *)vectorAddr, appLength);
#endif
}

2.3 指定从核初始中断向量表地址

  加载从核App完成之后,接下来即是设置从核启动所需的中断向量表位置,从核需要从中断向量内外取出初始栈地址(SP)和复位向量(pc)来执行。
  CM7启动初始向量表地址设置在IOMUXC_LPSR_GPR26里(对应SCB->VTOR[31:7]),CM4启动初始向量表地址设置在IOMUXC_LPSR_GPR0/1里(对应SCB->VTOR[31:3])。

  • Note: A0版本芯片CM7启动初始向量表设置在IOMUXC_GPR19里;B0版本芯片CM7启动初始向量表设置改到了IOMUXC_LPSR_GPR26里。
晋城百姓网:痞子衡嵌入式:鬼话双核i.MXRT1170之Cortex-M7与Cortex-M4相互激活之道  第3张

  下面是设置从核启动初始中断向量表地址的示例代码:

void set_cm4_vector(uint32_t vectorAddr)
{
    IOMUXC_LPSR_GPR->GPR0 = IOMUXC_LPSR_GPR_GPR0_CM4_INIT_VTOR_LOW(vectorAddr);
    IOMUXC_LPSR_GPR->GPR1 = IOMUXC_LPSR_GPR_GPR1_CM4_INIT_VTOR_HIGH(vectorAddr >> 16);
}

void set_cm7_vector(uint32_t vectorAddr)
{
    IOMUXC_LPSR_GPR->GPR26 = IOMUXC_LPSR_GPR_GPR26_CM7_INIT_VTOR(vectorAddr);
}

2.4 激活从核

  此时从核已经摩拳擦掌,守候来自主核的最后激活指令了。激活控制是在SRC->SCR寄存器里实现的,将BT_RELEASE_Mx位置1即可启动CMx从核。这里需要注重一点,若是是在调试,从核有可能已经被调试器的剧本激活过了,那么此时仅需要reset一下从核即可。

晋城百姓网:痞子衡嵌入式:鬼话双核i.MXRT1170之Cortex-M7与Cortex-M4相互激活之道  第4张

  下面是激活从核启动的示例代码:

void launch_cm4_core(void)
{
    /* If CM4 IS already running (released by debugger), then reset the CM4.
       If CM4 is not running, release it. */
    if ((SRC->SCR & SRC_SCR_BT_RELEASE_M4_MASK) != 0)
    {
        SRC->CTRL_M4CORE |= SRC_SLICE_CTRL_SW_RESET_MASK;
        while ((SRC->STAT_M4CORE & SRC_SLICE_STAT_UNDER_RST_MASK) != 0UL);
    }
    else
    {
        SRC->SCR |= SRC_SCR_BT_RELEASE_M4_MASK;
    }
}

void launch_cm7_core(void)
{
    /* If CM7 is already running (released by debugger), then reset the CM7.
       If CM7 is not running, release it. */
    if ((SRC->SCR & SRC_SCR_BT_RELEASE_M7_MASK) != 0)
    {
        SRC->CTRL_M7CORE |= SRC_SLICE_CTRL_SW_RESET_MASK;
        while ((SRC->STAT_M7CORE & SRC_SLICE_STAT_UNDER_RST_MASK) != 0UL);
    }
    else
    {
        SRC->SCR |= SRC_SCR_BT_RELEASE_M7_MASK;
    }
}

三、一个典型示例

  最后给一个完整示例,主核是CM7,从核是CM4,从核App代码存储在0x60010000地址,App长度是32KB,从核APP是从ITCM起始地址(0x1FFE0000)最先链接的。CM7激活CM4完整代码如下:

#define CM4_BUF_START 0x60010000U
#define CM4_BUF_LEN   0x8000U
#define CM4_CPY_START 0x20200000U
#define CM4_APP_START 0x1FFE0000U

int main(void)
{
    copy_app_image(CM4_BUF_START, CM4_BUF_LEN, CM4_CPY_START);
    set_cm4_vector(CM4_APP_START);
    launch_cm4_core();

    while (1)
    {
    }
}

  至此,恩智浦i.MXRT1170上Cortex-M7与Cortex-M4内核相互激活的方式痞子衡便先容完毕了,掌声在那里~~~

迎接订阅

文章会同时公布到我的 博客园主页、CSDN主页、微信民众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

晋城百姓网:痞子衡嵌入式:鬼话双核i.MXRT1170之Cortex-M7与Cortex-M4相互激活之道  第5张

,

SuNBet

Sunbet重要的事情说三次www.hdjkx.cn:不需要注册!不需要注册!不需要注册!各大视频平台VIP电影、连续剧、综艺动漫等大片免费观看,无需要注册会员,播放没有任何广告,纯公益平台!

Sunbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:晋城百姓网:痞子衡嵌入式:鬼话双核i.MXRT1170之Cortex-M7与Cortex-M4相互激活之道

网友评论

  • (*)

最新评论

  • 联博统计接口 2020-10-01 08:51:21 回复

    欧博亚洲客户端欢迎进入欧博亚洲客户端(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。作者很有前途啊

    1

站点信息

  • 文章总数:621
  • 页面总数:0
  • 分类总数:8
  • 标签总数:1120
  • 评论总数:255
  • 浏览总数:6874