I.MX RT1170双核学习(2):双核相互激活和启动流程

news2024/11/18 18:32:27

RT1170这个芯片带有双核:Cortex-M7和Corterx-M4,两个核都可以独立地运行,当然双核也可以同时运行。在上一篇文章中,介绍了一下在RT1170中消息模块MU的使用:双核通信之MU消息单元详解,因为这是双核之间用来通信的核心单元。那有了这个基础之后,这一篇文章就来学习一下在这个芯片中如何启动双核。

文章目录

  • 1 内存映射
  • 2 双核启动
    • 2.1 CM7作为主核
    • 2.2 CM4作为主核
  • 3 总结

1 内存映射

首先我们来分别看一下CM7和CM4的芯片内置内存分配:

(1)CM7

Start AddressEnd AddressSizeDescription
2038_0000203F_FFFF512KBOCRAM M7 (FlexRAM)
2036_00002037_FFFF128KBOCRAM M7 (FlexRAM ECC)
2035_00002035_FFFF64KBOCRAM2 ECC
2034_00002034_FFFF64KBOCRAM1 ECC
202C_00002033_FFFF512KBOCRAM2
2024_0000202B_FFFF512KBOCRAM1
2020_00002023_FFFF256KBOCRAM M4 (LMEM 128KB SRAM_L + 128KB SRAM_U backdoor)
2000_00002007_FFFF512KBDTCM (FlexRAM)
0000_00000007_FFFF512KBITCM (FlexRAM)

上面0x20200000~0x2023FFFF的OCRAM M4是CM4 TCM的重映射地址,CM7可以通过这个别名区域访问CM4 TCM。

  • 当CM4关闭电源时,CM7不能访问这块内存,否则结果是不可预测的。
  • CM7通过重映射地址访问这块内存时,速度不及CM4中直接访问这块内存

(2)CM4

Start addressEnd addressSizeDescription
2038_0000203F_FFFF512KBOCRAM M7 (FlexRAM)
2036_00002037_FFFF128KBOCRAM M7 (FlexRAM ECC)
2035_00002035_FFFF64KBOCRAM2 ECC
2034_00002034_FFFF64KBOCRAM1 ECC
202C_00002033_FFFF512KBOCRAM2
2024_0000202B_FFFF512KBOCRAM1
2000_00002001_FFFF128KBSystem TCM (LMEM RAM_U)
1FFE_00001FFF_FFFF128KBCode TCM (LMEM RAM_L)

对于这里的OCRAM M7 (FlexRAM)OCRAM M7 (FlexRAM ECC),虽然这里写的是M7的内存,但是经过我的测试,M4是可以访问和修改这块内存的。

(3)共享内存区域

这里M7和CM4可以共同访问一些内存:

RAMAccess address for CM7Access address for CM4Size
OCRAM M40x2020_00000x1FFE_0000128KB
OCRAM M40x2022_00000x2000_0000128 KB
OCRAM M70x2038_0000Same as CM7128KB
OCRAM M7 ECC0x2036_0000Same as CM7128KB
OCRAM10x2024_0000Same as CM7512 KB
OCRAM20x202C_0000Same as CM7512 KB
OCRAM1_ECC0x2034_0000Same as CM764 KB
OCRAM2_ECC0x2035_0000Same as CM764 KB
  • 当然FlexSPI1和FlexSPI2接的Flash、SEMC接的SDRAM所映射的内存在双核间也是共享的。

2 双核启动

对于RT1170的双核来说,它们有一个主从关系(默认是CM7为主核,CM4为从核)。上电后将启动主核,然后由主核在代码中激活并启动从核。

2.1 CM7作为主核

默认情况下,CM7为主核。在CM7上电后需要激活CM4核。当然我们还需要准备好CM4核的代码,这就有两种情况:

1、CM4代码在NOR上XIP执行:需要提前将CM4的程序放在NOR的指定内存位置即可(编译的时候程序也要链接到这个位置)。

2、CM4代码在内置SRAM中执行

在这里插入图片描述

此时CM7中的程序需要将CM4的程序拷贝到CM4的ITCM中。

  • CM4的程序可以保存在SD卡、EMMC、U盘等存储介质中
  • 这里CM7就可以通过CM4 TCM的重映射地址0x20200000进行拷贝

接下来就是启动CM4核,有两个步骤

(1)设置CM4的向量表地址

RT芯片提供了寄存器来(IOMUXC_LPSR_GPRGPR0GPR1)设置CM4程序的vector table的地址,正确地设置才能成功激活从核。

在这里插入图片描述

我们需要填充CM4_INIT_VTOR_HIGHCM4_INIT_VTOR_LOW为CM4的向量表地址。

(2)激活M4核

需要置以下两个寄存器的位:

在这里插入图片描述

(1)Slice Control Register中的偏移在284h的CTRL_M4CORE寄存器

置bit0为1,可以给CM4进行软件复位

(2)SRC Control Register

CM4会一直保持在复位状态,我们需要置这个寄存器的bit0为1来解除CM4的复位状态。

现在CM4核就成功启动了。

2.2 CM4作为主核

在RT1170中,默认CM7为主核,如果需要设置CM4为主核的话,需要烧写0x960处熔丝的第12位为1。

在这里插入图片描述

同样地,如果CM7的程序需要在RAM中运行,需要CM4的程序来拷贝CM7的程序到RAM中。

接下来也是设置向量表和启动CM7核:

1、向量表:IOMUXC_LPSR_GPRGPR26寄存器

2、复位CM7核:Slice Control Register中的偏移在2A4h的CTRL_M7CORE寄存器

2、启动CM7核:SRC Control Register的bit1

这里就不详细介绍了,因为这种方法需要烧写熔丝,也很少有人用到。

3 总结

本文介绍了CM7和CM4相互激活的基本设置,在SDK中,有一个MCMGR(Multicore Manager)实现了多核之间的管理操作,除了实现本文所述的设置外,还有双核之间状态的同步。下一节就来剖析MCMGR中的源码实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1309017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Dockerfile创建LNMP

实验组件 172.111.0.10:nginx docker-nginx 172.111.0.20:mysql docker-mysql 172.111.0.30:php docker-php 实验步骤 1.建立nginx-lnmp镜像及容器 cd /opt mkdir nginx cd nginx/ --上传nginx-1.22.0.tar.gz和wordpress-6.4.2-zh_C…

JOSEF 约瑟 时间继电器 DHC6A AC/DC100-240V 面板安装

特点 DIN(4848mm)标准面板尺寸 9 种工作模式可任意设定,简化外围线路,增强可靠性 带背光源 LCD 显示,在阳光或黑夜都能清晰显示 键保护可按要求锁定相关的按键,保护部分或全部的设定数据不受更 改,有效的防止误操…

02-详解请求路由的实现和常见的断言工厂

请求路由 路由转发 第一步: 新建一个SpringBoot工程如gateway模块, 引入网关依赖和nacos服务发现依赖 <!--网关依赖--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId&…

【免费神器】一键转换PDF文件,轻松解决你的烦恼!

你是否曾经因为PDF文件的格式问题而感到困扰&#xff1f;是否曾经因为无法快速转换PDF文件而感到烦恼&#xff1f; 现在&#xff0c;这些问题都可以迎刃而解了&#xff01;下面这个在线PDF转换网站&#xff0c;就是你的解决方案。 目前5M以下文件免费转换&#xff0c;赶紧来看…

Python-自制简易音乐播放器

文章目录 前言一、代码二、代码实现1.库2.做ui窗口3爬虫 前言 原理简单&#xff1a;通过外链和歌曲Id拼接成下载链接来下载歌曲。 一、代码 做了个ui输入歌单链接&#xff1a; 注意这里歌单的url格式固定: https://music.163.com/playlist?id歌单id import sys from PyQt5.…

JavaWeb笔记之MySQL数据库

#Author 流云 #Version 1.0 一、引言 1.1 现有的数据存储方式有哪些&#xff1f; Java程序存储数据&#xff08;变量、对象、数组、集合&#xff09;&#xff0c;数据保存在内存中&#xff0c;属于瞬时状态存储。 文件&#xff08;File&#xff09;存储数据&#xff0c;保存…

飞致云与上海吉谛达成战略合作,获得Gitea企业版中国大陆地区独家代理权

2023年12月13日&#xff0c;中国领先的开源软件提供商FIT2CLOUD飞致云宣布与上海吉谛科技有限公司&#xff08;以下简称为上海吉谛&#xff09;正式达成战略合作&#xff0c;FIT2CLOUD飞致云获得上海吉谛旗下代码托管平台Gitea企业版中国大陆地区独家代理权。 Gitea项目&…

Github 2023-12-14开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-14统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量非开发语言项目5TypeScript项目2JavaScript项目1Jupyter Notebook项目1PHP项目1 基于项目的学习 创建周期&a…

[ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证

文章目录 一、前言二、在 Azure Portal 中创建 VM三、验证已创建的虚拟机资源3.1 方法一&#xff1a;在虚拟机服务中查看验证3.1 方法二&#xff1a;在资源组服务中查看验证 四、文末总结 一、前言 本文会开始创建新系列的专栏&#xff0c;专门更新 Azure 云实践相关的文章。 …

CAN 三: STM32 CAN相关寄存器介绍

1、寄存器列表&#xff08;F1/F4/F7&#xff09; 寄存器名称作用CAN_MCRCAN主控制寄存器主要负责CAN工作模式的配置CAN_BTR位时序寄存器用来设置分频/TBS1/TBS2/TSWJ等参数&#xff0c;设置测试模式CAN_(T/R)IxR标识符寄存器存放(待发送/接收)的报文ID、扩展ID、IDE位及RTR位C…

MySQL 报错 You can‘t specify target table for update in FROM clause解决办法

You can’t specify target table for update in FROM clause 其含义是&#xff1a;不能在同一表中查询的数据作为同一表的更新数 单独执行复合查询是正常的&#xff0c;如下&#xff1a; 但是当执行子查询删除命令时&#xff0c;报如下错误 DELETE FROM abpusers WHERE Id I…

loki 如何格式化日志

部署 grafana-loki 首先介绍一下如何部署 官方文档&#xff1a;部署 grafana-loki 部署命令 设置集群的存储类&#xff0c;如果有默认可以不设置设置命名空间 helm install loki oci://registry-1.docker.io/bitnamicharts/grafana-loki --set global.storageClasslocal -n …

改进YOLOv8注意力系列二:结合CBAM、Coordinate Attention、deformable_LKA_Attention可变形大核注意力

改进YOLOv8注意力系列二:结合ACmix、Biformer、BAM注意力机制 代码CBAM注意力Coordinate Attention坐标注意力deformable_LKA_Attention可变形大核注意力加入方法各种yaml加入结构本文提供了改进 YOLOv8注意力系列包含不同的注意力机制以及多种加入方式,在本文中具有完整的代…

Linux查看端口使用情况

1、netstat命令 netstat命令用于显示与网络相关的信息&#xff0c;包括正在使用的端口。 netstat -tuln 其中&#xff0c;-t选项表示显示TCP连接&#xff0c;-u选项表示显示UDP连接&#xff0c;-l选项表示仅显示监听状态的连接&#xff0c;-n选项表示显示数字格式的IP地址和端口…

在Linux上安装配置Nginx高性能Web服务器

1 前言 Nginx是一个高性能的开源Web服务器&#xff0c;同时也可以作为反向代理服务器、负载均衡器、HTTP缓存以及作为一个邮件代理服务器。它以其出色的性能和灵活性而闻名&#xff0c;被广泛用于处理高流量的网站和应用程序。本文将介绍在Linux环境中安装Nginx的步骤&#xf…

设计模式之开篇

在软件开发的世界里&#xff0c;设计模式有如一本精妙的工程艺术指导准则&#xff0c;为我们提供了解决常见问题的优雅实现方案。然而&#xff0c;有些程序员可能会认为设计模式太过繁琐&#xff0c;一个简单的 if/else 语句就能解决问题&#xff0c;何必费心去学习这些看似复杂…

利用python批量压缩图教程:如何轻松减小图片大小

在日常的编程工作中&#xff0c;我们经常需要处理图像&#xff0c;例如上传、下载、显示、编辑等。有时候&#xff0c;我们需要对图像进行压缩&#xff0c;以减少占用的空间和带宽&#xff0c;提高加载速度和用户体验。那么&#xff0c;如何用Python来实现图像压缩呢&#xff1…

Linux_Ubuntu 系统入门

Ubuntu 系统是和 Windows 系统一样的大型桌面操作系统&#xff0c;因此功能非常强大。 本节的目的是掌握后续嵌入式开发所需的 Ubuntu 基本技能&#xff0c;比如系统的基本设置、常用的 shell 命令、vim 编译器的基本操作等等…… Ubuntu 的图形化界面操作和 Windows 下基本一致…

leetcode(平衡二叉树)

https://leetcode.cn/problems/balanced-binary-tree/description/ 这题的思路分成子问题就是计算左右子树的高度然后相减看看是不是大于1的就可以了&#xff0c;所以代码如下 int _isBalanced(struct TreeNode* root) {if(root NULL){return 0;}int leftdepth _isBalanced(…

dialog 在xml文件进行了自适应宽,但是失效了

如下图 讲述了为什么已经设置好了dialog的宽高 到了显示的时候就会失效的原因 解决方式 &#xff1a; 在自定的dialog中的onstart()方法中进行重新设置宽高 Window window getWindow();WindowManager.LayoutParams lp window.getAttributes();lp.height LinearLayout.La…