大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是超级下载算法开发笔记(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. golang RSA2加密/解密

    $go get github.com/wenzhenxi/gorsa test.go文件的内容 运行: $go run test.go package main import ( "fmt& ...

  2. java -inally转

    1.不管有木有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没有返 ...

  3. mapbox处理中文标注不能换行问题

    mapbox的换行侧率是根据空格进行的,因为中文中没有设置空格,因此换行不起作用. 解决方法:在node_modules\ol-mapbox-style\util.js  60行添加下列代码: let ...

  4. 2019年CSP-J初赛试题(普及组)试题详解

    https://www.jianshu.com/p/9e58f455c1ee https://blog.csdn.net/weixin_39104847/article/details/1086711 ...

  5. 【纯水题】POJ 1852 Ants

    题目大意 有一根长\(L\)厘米米的水平木棍上有\(n\)个蚂蚁,它们以每秒1cm/s的爬(fei)行(ben)到木棍的一端,之后掉下去. 给出每个蚂蚁的起始位置,但是不知道它们爬行的方向.相向而行的 ...

  6. Redis Hashes 数据类型简述

    Redis Hashes 是我们日常使用中比较高频的 Redis 数据类型,内部使用 Redis 字典结构存储,底层基于哈希表结构实现. 下面从哈希表节点,哈下表结构,Redis 字典,Redis 字 ...

  7. MySQL备份和恢复[2]-基于LVM的快照备份

    准备工作 请求锁定所有表 mysql> FLUSH TABLES WITH READ LOCK; 记录二进制日志文件及事件位置 mysql> FLUSH LOGS; mysql> S ...

  8. Vue内容

    vue中的过滤器 moeths点击 过滤器的含义 过滤器就是把原有的数据过一遍 放到页面中  不会改变原有的数据   只是在原有的数据上增加新的数据

  9. Shell脚本学习指南笔记(一)

    脚本语言通常是解释型的,这类程序的运行.是由解释器读入程序代码,并将其转换成内部的形式, 再执行,解释器本身是一般的编译型程序. 第一行的开头处使用#!这两个字符,当内核扫描到改行的其余部分,看是否存 ...

  10. springboot添加拦截器

    一,编写拦截器 public class TokenInterceptor implements HandlerInterceptor { @Override public boolean preHa ...