大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是超级下载算法开发笔记(1)之执行在不同CM内核下

  文接上篇 《RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计》,痞子衡开源的这个项目已经正式启动了。痞子衡说过会记录 RT-UFL 项目开发过程所有疑难点及其解决方法,和大家分享下载算法设计背后的奥秘。

  本篇是开发笔记第一篇,咱们重点聊聊这个项目的立身之本,即如何做到一个.FLM(其实就是最终的可执行机器码)能在所有i.MXRT芯片下均能正常运行。

一、从嵌入式程序角度看i.MXRT家族差异

  因为超级下载算法要运行于所有i.MXRT型号下,首先我们得知道i.MXRT家族一共有哪些型号、这些不同型号间差异是什么,哪些差异是影响超级下载算法的主要因素。

  下表是当前i.MXRT家族已面世的全部9款型号(注:部分型号下不止一款芯片,但仅是内部外设数量差别):

  虽然从芯片本身角度去细看差异会比较多,但我们可以从一个嵌入式程序最根本的三大要素(指令、外设操作、链接空间)来逐一定向分析:

  从上表我们可以看出i.MXRT都是基于ARM Cortex-M内核的,这其实是整个项目立项最重要的基础,它们的指令集一脉相承。不过虽然都是Cortex-M内核,但是涉及到三个内核处理器版本(M4、M7、M33),因此设计超级下载算法时第一要考虑的就是处理器版本差异。

  再从外设角度来看,超级下载算法代码可能涉及操作芯片内部的Clock(时钟)、IOMUXC(引脚)、FlexSPI(Flash控制器)等外设,这些外设会有差异,但并不重要,我们可以为不同i.MXRT型号引入不同代码处理分支。

  最后从链接空间来看,超级下载算法是要加载到内部RAM去执行的,这些i.MXRT内部RAM大小不一,并且在系统映射地址空间中的地址也略有不同,但也不重要,如果你看过痞子衡之前写的文章 《串行NOR Flash下载算法(Keil MDK工具篇) 》,你应该知道下载算法代码都是位置无关链接,其加载地址可以不固定(由配套xml文件或IDE工程设置中额外指定),因此RAM的差异也不重要。

二、解决Cortex-M处理器不同版本指令差异

  经过上一节的分析,我们知道解决超级下载算法在i.MXRT全系列下运行最重要的问题就是处理不同Cortex-M内核指令差异。

  在解决指令差异问题前,有一个重要问题痞子衡不得不澄清,那就是不同Cortex-M芯片其中断向量表序列定义并不同,前16个是系统向量,这是由ARM规定的,但后面的中断向量均是由厂商自定义的。不同芯片型号下,同一类型外设分配的向量号并不一定相同,因此对于一些异构双核下跑的嵌入式程序,需要处理中断向量表差异。但是这对于下载算法来说,不是个问题,因为下载算法不是一般的嵌入式程序,其不含中断向量表,这意味着下载算法中没有使用中断响应函数,不能开启外设中断(这是位置无关链接导致的)。

  好,我们现在来解决指令差异问题。查看ARM官方资料得知,Cortex-M家族共有10款处理器(M0、M0+、M1、M3、M23、M4、M33、M35P、M7、M55),分属四个架构规范(ARMv6-M、ARMv7-M、ARMv8-M、ARMv8.1-M),架构主要和指令集息息相关。

  再来看两张Cortex-M指令集关系图,从图里我们可以看出Cortex-M0/M0+/M1处理器基于ARMv6-M架构,这是一个只支持56条指令的小指令集(蓝色粗框标出),所有Cortex-M处理器都支持这个56条指令的指令集。

  看到这你是不是有所领悟?ARM公司其实为了能让Cortex-M用户的软件能重用,特地在设计Cortex-M处理器时为其赋予了处理器向下兼容、软件二进制向上兼容特性。通俗地说就是在较低版本Cortex-M处理器上编译出来的机器码可以在较高版本Cortex-M处理器上直接执行。

  因此为了实现超级下载算法在i.MXRT全系列上(M4、M7、M33)运行,我们只需要做一件事,那就是编译生成算法文件的源MDK工程设置里选择Cortex-M0处理器就行,是不是超级简单?如果你下载了CMSIS_5包,里面的下载算法模板工程默认处理器就是ARMCM0,这并不只是个偶然!

  至此,超级下载算法开发笔记(1)之执行在不同CM内核下痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

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

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

痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(1) - 执行在不同CM内核下的更多相关文章

  1. 痞子衡嵌入式:恩智浦LPC系列MCU开发那些事 - 索引

    大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是恩智浦LPC系列微控制器相关知识. 恩智浦半导体最早于2003年便开始推出LPC系列MCU,但早期的产品LPC2000/3000系列属 ...

  2. 痞子衡嵌入式:超级下载算法RT-UFL v1.0发布,附J-Link下安装教程

    痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> 历时 8 个月终于迎来了 v1.0 版发布,因为是第一个正式版,为了保证质 ...

  3. 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(2) - 识别当前i.MXRT型号

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记(2)之识别当前i.MXRT型号. 文接上篇 <超级下载算法(RT-UFL)开发笔记(1) - 执行在不同CM ...

  4. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.3)- 串行NOR Flash下载算法(J-Link工具篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是J-Link工具下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行NOR Flash X ...

  5. 痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天给大家带来的是痞子衡的开源项目 RT-UFL. 痞子衡在近两年多的i.MXRT客户项目支持过程中,遇到的一个相当高频的问题就是制作i.MXRT下载算法.我们 ...

  6. 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(3) - 统一FlexSPI驱动访问

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记(3)之统一FlexSPI驱动访问. 文接上篇 <超级下载算法(RT-UFL)开发笔记(2) - 识别当前i. ...

  7. 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(4) - 轮询Flash配置参数

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记(4)之轮询Flash配置参数. 文接上篇 <超级下载算法(RT-UFL)开发笔记(3) - 统一FlexSP ...

  8. 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记番外(1) - JLinkScript妙用

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记番外篇之JLinkScript妙用. JLinkScript 文件是配套 J-Link 调试器使用的脚本,这个脚本适 ...

  9. 痞子衡嵌入式:超级下载算法RT-UFL v1.0在恩智浦MCUXpresso IDE下的使用

    痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> v1.0 版发布近 4 个月了,部分客户已经在实际项目开发调试中用上了这个 ...

随机推荐

  1. 《New Horizon College English》 (Third Edition) -长篇阅读(Skmming and Scanning)

    <New Horizon College English>(Third Edition) <新视野大学英语>(第三版) 长篇阅读(Skmming and Scanning) 总 ...

  2. 使用css实现轮播图

    使用css3实现图片轮播 前言:实现图片轮播的方式有很多种 ,例如js ,css 等等. 本文主要讲述使用纯css3实现轮播图 工具介绍: 使用的编辑器: Hbuilder 进入正题 html代码: ...

  3. 用cgroup限制内存以防止Linux因内存用尽卡死

    Linux在内存用尽的情况下,整个界面,包括tty和ctrl-alt-F1都会卡住难以响应.虽然Linux内核有OOM Killer机制杀掉吃内存的进程,但经常内存用尽时连OOM Killer都无法动 ...

  4. JVM系列【6】GC与调优5-日志分析

    JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 主要内容 分析PS.CMS.G1的回收日志,目标使大概能读懂GC日志. 测 ...

  5. java 调用WebService【转】

    1.客户单编程方式(和第一种方式一样) //文件名:HelloService.java import javax.jws.WebMethod; import javax.jws.WebParam; i ...

  6. git学习(七) git的标签

    git的标签操作 git标签操作 git tag 不加任何参数 表示显示标签(按字母序) 非按时间 git tag 标签名 默认是给最近一次提交打上标签 git tag 标签名 commitId 给响 ...

  7. Ngnix01

    Nginx(一)------简介与安装   目录 1.Nginx 的简介 2.Nginx 的常用功能 3.Nginx 安装 ①.下载地址 ②.Windows 版本安装 ③.Linux 版本安装 说到 ...

  8. 使用Socket通信(二)

    这个socket有梗,主要是服务器端有梗,可能大家会碰到同样的问题,网上查了好久,这里分享一下解决办法.首先在第一个module建一个类SimpleServer,这个类就是服务端,建好之后在代码左边有 ...

  9. 老板,来几道web玩玩

    好久没做web了,没想到还能自己做出来555 [MRCTF2020]Ez_bypass 签到题8 给了源码,一个md5强类型比较,然后post传参,弱类型判断,直接1234567a绕过了 I put ...

  10. (python)getattr等用法

    getattr() 函数用于返回一个对象属性值; 语法 getattr(object, name[, default]) 参数 object -- 对象. name -- 字符串,对象属性. defa ...