你们好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给你们介绍的是超级下载算法开发笔记(1)之执行在不一样CM内核下。html
文接上篇 《RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计》,痞子衡开源的这个项目已经正式启动了。痞子衡说过会记录 RT-UFL 项目开发过程全部疑难点及其解决方法,和你们分享下载算法设计背后的奥秘。算法
本篇是开发笔记第一篇,我们重点聊聊这个项目的立身之本,即如何作到一个.FLM(其实就是最终的可执行机器码)能在全部i.MXRT芯片下均能正常运行。微信
由于超级下载算法要运行于全部i.MXRT型号下,首先咱们得知道i.MXRT家族一共有哪些型号、这些不一样型号间差别是什么,哪些差别是影响超级下载算法的主要因素。架构
下表是当前i.MXRT家族已面世的所有9款型号(注:部分型号下不止一款芯片,但仅是内部外设数量差异):函数
虽然从芯片自己角度去细看差别会比较多,但咱们能够从一个嵌入式程序最根本的三大要素(指令、外设操做、连接空间)来逐必定向分析:工具
从上表咱们能够看出i.MXRT都是基于ARM Cortex-M内核的,这实际上是整个项目立项最重要的基础,它们的指令集一脉相承。不过虽然都是Cortex-M内核,可是涉及到三个内核处理器版本(M四、M七、M33),所以设计超级下载算法时第一要考虑的就是处理器版本差别。.net
再从外设角度来看,超级下载算法代码可能涉及操做芯片内部的Clock(时钟)、IOMUXC(引脚)、FlexSPI(Flash控制器)等外设,这些外设会有差别,但并不重要,咱们能够为不一样i.MXRT型号引入不一样代码处理分支。设计
最后从连接空间来看,超级下载算法是要加载到内部RAM去执行的,这些i.MXRT内部RAM大小不一,而且在系统映射地址空间中的地址也略有不一样,但也不重要,若是你看过痞子衡以前写的文章 《串行NOR Flash下载算法(Keil MDK工具篇) 》,你应该知道下载算法代码都是位置无关连接,其加载地址能够不固定(由配套xml文件或IDE工程设置中额外指定),所以RAM的差别也不重要。3d
通过上一节的分析,咱们知道解决超级下载算法在i.MXRT全系列下运行最重要的问题就是处理不一样Cortex-M内核指令差别。xml
在解决指令差别问题前,有一个重要问题痞子衡不得不澄清,那就是不一样Cortex-M芯片其中断向量表序列定义并不一样,前16个是系统向量,这是由ARM规定的,但后面的中断向量均是由厂商自定义的。不一样芯片型号下,同一类型外设分配的向量号并不必定相同,所以对于一些异构双核下跑的嵌入式程序,须要处理中断向量表差别。可是这对于下载算法来讲,不是个问题,由于下载算法不是通常的嵌入式程序,其不含中断向量表,这意味着下载算法中没有使用中断响应函数,不能开启外设中断(这是位置无关连接致使的)。
好,咱们如今来解决指令差别问题。查看ARM官方资料得知,Cortex-M家族共有10款处理器(M0、M0+、M一、M三、M2三、M四、M3三、M35P、M七、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全系列上(M四、M七、M33)运行,咱们只须要作一件事,那就是编译生成算法文件的源MDK工程设置里选择Cortex-M0处理器就行,是否是超级简单?若是你下载了CMSIS_5包,里面的下载算法模板工程默认处理器就是ARMCM0,这并不仅是个偶然!
至此,超级下载算法开发笔记(1)之执行在不一样CM内核下痞子衡便介绍完毕了,掌声在哪里~~~
文章会同时发布到个人 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就能够在手机上第一时间看了哦。