大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是超级下载算法开发笔记(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. PropertySheet外壳扩展AppWizard

    下载source files - 39 Kb 下载Wizard - 17 Kb 本文旨在简化属性表外壳扩展的实现.它紧接我的第一篇文章 处理上下文菜单壳扩展和灵感 由Michael Dunn最优秀的系 ...

  2. Github个人首页美化指北

    当你尝试去创建一个与你Github用户名相同的仓库时,会发现这是Github为你预留的特殊仓库,用来作为你的Github Profile,这个仓库就相当于一个可以显示在你Github个人页的READM ...

  3. Rust之路(0)

    Rust--一个2012年出现,2015年推出1.0版本的"年轻"语言.在 2016 至 2018 年的 stack overflow 开发人员调查中,被评比为 "最受欢 ...

  4. charles详解

    Charles抓包https:https://www.jianshu.com/p/ec0a38d9a8cf 浅谈charles抓取https原理:https://www.jianshu.com/p/4 ...

  5. Convert to Ones CodeForces(超水题)

    题目大意:给你几个数,这些数里面只有0或1,你有两种操作:1.把一段区域内的所有数前后交换位置.2.把一段区域内所有数取反.(区域可大可小,可以是所有数也                       ...

  6. nginx配置laravel lumen重写

    location / { try_files $uri $uri/ /index.php?$query_string;}

  7. OSI七层网络

    7-应用层 各种应用软件 6-表示层 转换.加密.解密压缩 5-会话层 建立会话,保证会话,终止会话 4-传输层 TCP/UDP 3-网络层 路由 2-数据链路层 交换 1-物理层

  8. Spring Cloud Alibaba Sentinel

    一.介绍(sentinel 1.7.0) 1,官网地址 https://github.com/alibaba/Sentinel 中文地址:https://github.com/alibaba/Sent ...

  9. dd 在度娘上看到的一个大牛的《背包九讲》 (:

    P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 基本思路 这是最 ...

  10. Pytorch可视化指定层(Udacity)

    import cv2 import matplotlib.pyplot as plt %matplotlib inline # TODO: Feel free to try out your own ...