Bootloader Design of PIC18 series MCU

news2024/11/25 7:51:47

注意:下列描述是在PIC单片机上启用Bootloader的一个相关知识的近似完备集。所有需要了解的,bootloader与用户态程序交互的理论知识都已给出。

1.概述

嵌入式产品化后,需要考虑现场升级,单片机如果需要添加现场升级功能,必须考虑添加bootloader,否则,现场设备一旦升级失败,返修率会大大增加。

最小的bootloader系统,至少需要包含如下功能:

  • 用户程序完整性核查(如果不可以跳转,则需要停留在bootloader状态)
  • 用户程序跳转。
  • 用户程序下载和烧写

进阶的功能还需要考虑这些:

  • 中断的处理
    • 因为中断向量表是固定的,那么这个时候需要考虑怎么在中断发生时,切换中断向量表。

2.PIC官方的处理策略

2.1完整性核查

        pic提供了三种方式来完成用户程序的完整性核查策略,具体位置在 MCC中:

  • 检查ResetVector的方法,就是只要这个ResetVector不为0xff,或者不为0x00,类似这样,就执行跳转。
  • 最严格的方法是进行checksum计算,相当于对整个用户程序区域做了校验,用户程序的长度怎么计算,这些代码都是明的,可以自行检查。
  • 完整性核查也可以完全跳过,用类似看门狗,或者延时的方式实现,效果一样。ARM芯片,芯片级的Bootloader,就是在开机时等待串口的数据,如果比如100ms没有信号过来,就切至正常的启动过程。

这些方法,怎么做都可以。

2.1跳转

跳转涉及两个问题,怎么跳跳到哪里

跳转指令可以使用C混入asm代码来实现:

asm ("goto  0xB00"); 

 上面的代码,可以让程序跳至指令存储器的:0xB00位置。注意:PIC18系列,指令和数据存储器是独立的(哈佛架构),指令称为Rom,数据称为Ram。

这个待跳转的地址,称为Reset Vector。芯片固有的Reset Vector地址,位于指令的ROM地址0x00:

所以,现在我们首先要对存储空间进行划分,强制指定用户态程序的基地址,假定,现在这个地址,就是0xB00。(这个地址要设置为多大,取决于:

  • 你的Bootloader有多大,一般会把Bootloader放置在内存地址的最低部分
  • 地址还需要考虑Rom的最小可擦除块的大小
  • 那么在编译用户态的程序(就是Bootloader需要加载的那个程序),需要指定这个基地址:

 原厂的Bootloader可以把自己的尺寸控制在0x500以内,就是1280字节。初次写Bootloader,由于某种原因,不能直接用原厂的Bootloader程序,可以适当加大这个空间。指令空间需要进行严格划分,数据RAM,似乎无需做这类划分。用户态程序,仅需额外处理那一处地方即可。

3.用户程序下载和烧写

这个部分,就是指令 rom的分区擦除和读写,没有什么特别要说的。芯片手册有。MCC也有写好的函数,用就是了。

3.1 两个.hex文件的merge

测试时,为了同时写入bootloader和应用程序,可以使用下面的.bat脚本把相关的两个.hex文件合并为一个大的.hex,然后再用仿真器一次写入:

"C:\Program Files\microchip\MPLABX\v6.00\mplab_platform\bin\hexmate.exe"  +PicBootloader.X.production.hex  MyApp.X.production.hex -ototal.hex

4.中断的处理

中断部分,我觉得pic的做法是可以的。就是不用中断,完全靠寄存器操作与硬件设备交互。这部分如果能写得简省,也无需考虑代码复用的问题。因为bootloader中可以把总中断关掉。所以,它的中断向量表可以完全不用。

既然不用,就可以把这些区域配置为指向新的中断向量的模式,这个代码,MCC的Bootloader例程里已经给出:

    //intcode代表中断向量所在的内存区域
    asm ("psect  intcode,global,reloc=2,class=CODE,delta=1");
    asm ("GOTO " str(NEW_INTERRUPT_VECTOR_HIGH));
    //intcodelo代表启用两级中断向量,低优先级中断向量,所在位置
    asm ("psect  intcodelo,global,reloc=2,class=CODE,delta=1");
    asm ("GOTO " str(NEW_INTERRUPT_VECTOR_LOW));

5.任务量评估

因为MCC已经承担了大量的工作。此项工作,包括Bootloader相关的内存分配,代码,测试。不应该超过10个小时。比较熟悉代码和编程工具的同志,应该最快在4小时内,应该就能从无到有完成具备基本的跳转功能,并理清中断的处理。实现Bootloader,而后加载用户App的工作。

后续,如果你希望自行处理升级过程,比如你们设计了自己的升级协议,比如通过类似xmodem并添加了签名或加密的协议完成升级逻辑,那么系统的代码里,与bootloader直接相关的代码,你可以完全抛开。仅使用上面提到的这些必备的代码,然后摘出其与指令rom读写的部分即可。

6.未来拓展

bootloader的编写,特别是中断的处理,稍稍扩展,就能写出支持基础服务的包含任务调度和基础外设操控功能的操作系统——用户态向内核态的迁移,可以通过软中段进行。

First Version: Jul04,2023
Last Modified: Jul04,2023 11:13 定稿

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

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

相关文章

linux+win——嵌套虚拟机性能测试

参考博文:CSDN-Violent-Ayang(作者)-UNIX BENCH详细安装及使用步骤 unix bench wget http://175.6.32.4:88/soft/test/unixbench/unixbench-5.1.2.tar.gz tar -xzvf unixbench-5.1.2.tar.gz cd unixbench-5.1.2 vim Makefile # 将 Makefile 中…

虹科方案 | Redis Enterprise:适用于任何企业的矢量数据库解决方案

用户希望他们遇到的每个应用程序和网站都具有搜索功能。然而,超过80%的业务数据是非结构化的,以文本、图像、音频、视频或其他格式存储。因此,我们需要一种跨非结构化数据的搜索方式。 什么是矢量数据库(vector database&#xff…

【自动化测试教程】 —— pytest 框架详解 ~

pytest框架 特点: 容易上手, 入门简单, 文档丰富, 文档中有很多参考案例支持简单的单元测试和复杂的功能测试支持参数化执行测试用例过程中, 支持跳过操作支持重复失败的case支持运行Nose, unittest编写测试用例pytest支持很多第三方插件方便和持续集成工具集成 1. pytest断…

如何搭建独享的IP代理池?

随着互联网技术的日趋成熟,爬虫已经成为一种常见的数据获取方法。在采集业务中,建立本地IP代理池是非常重要的。今天将与您探讨IP代理池的选择以及如何搭建独享的IP代理池。 独享IP代理池是指由客户单独使用的IP池,优点是客户可以享受池中所…

关于opencv中cv2.imread函数读取的图像shape问题

图像坐标系是(w,h),w为x轴,h为y轴,(x,y) 但opencv读出来的数组却正好相反,是(h,w,3),(y,x,3) 所以这里会有一个转换 image cv2.imread(1.jpg) print(image.shape[0:2]) ##输出(365,500&#x…

【操作系统】Linux编程 - 多线程的创建和使用 II (临界区 、互斥量、信号量的使用)

临界区的概念 之前的实例中我们只尝试创建了1个线程来处理任务,接下来让我们来尝试创建多个线程。 不过,还是得先拓展一个概念——“临界区” 临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段&…

哈工大计算机网络课程网络层协议详解之:Internet路由BGP协议详解

哈工大计算机网络课程网络层协议详解之:BGP协议详解 在之前的网络层协议中,我们介绍了Internet网络两个自治系统内的路由协议:RIP协议和OSPF协议。这两个协议应该来说是自治系统内协议的两个代表性协议,前一个基于距离向量路由算…

优化内存利用:深入了解垃圾回收算法与回收器

🔭 大家好,我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏:JVM &am…

机器学习面试题- 特征工程

目录标题 1、为什么要对特征做归一化2、对特征归一化的方法2.1 线性函数归一化2.2 零均值归一化 3、对数据预处理时,如何处理类别型特征3.1 序号编码3.2 独热编码3.3 二进制编码 4、什么是组合特征?如何处理高维组合特征?5、怎样有效地找到组…

​python接口自动化(十)--post请求四种传送正文方式(详解)​

简介 post请求我在之前的文章已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等。我们要知道post请求四种传送正文方式首先需要先了解一下常见的四种编码方式: HTTP 协议规定 POST 提交的数据必须放在消息主体(…

SpringBoot处理全局异常详解(全面详细+Gitee源码)

前言:在日常的开发工作中,项目在运行过程中多多少少是避免不了报错的,对于报错信息肯定不可以把全部信息都抛给客户端去显示,这里就需要我们对常见的七种异常情况统一进行处理,让整个项目更加优雅。 目录 一、基本介绍…

AMEYA360:航顺芯片产品有哪些 航顺家族介绍

经济型 HK32M050 家族 采用ARM Cotex-M0内核,最新工艺标准,最高48M主频,内置16K FALSH,4K SRAM,支持DMA,内置4个模拟比较器,2路运放(PGA),支持多种通讯包括2个…

二叉树 — 给定二叉树中某个节点,返回该节点的后继节点

后继节点定义: 二叉树以中序的方式进行遍历打印,节点X的下一个节点,就是X的后继节点。 假设二叉树如下图所示:则中序遍历的后打印出来的就是 4 -> 2 -> 5 -> 1 -> 6 -> 3 -> 7。如果X 3,则X的后继节…

Docker网络模型以及容器网络初探(一)

〇、前言 安装Docker时,它会自动创建三个网络,默认bridge网桥(创建容器默认连接到此网络)、 none 、host。各个方式有各自的特点,它们有着特定的差距,比如网络性能等,一般按照实际应用方式手动…

大数据之数据采集项目总结——hadoop,hive,openresty,frcp,nginx,flume

1、前期准备 2、数据收集 1、开启openresty,nginx和frcp内网穿透 2、编辑并启动定时器 3、查看是否收集到了数据 数据收集阶段结束,进入下一个阶段 2、将收集到的切分好的数据上传到hdfs 使用的工具:flume flume像一个管道一样&#xff0c…

三十九、动态规划——线性DP问题-例题题解

线性DP问题的例题状态划分 一、问题:数字三角形1、题目内容2、状态划分1)状态编号 f[i][j]2)状态划分 3、题解 二、最长上升子序列1、题目内容2、状态划分1)状态编号 f[i]2)状态划分 3、题解 三、最长公共子序列1、题目…

【二维偏序+双指针】ABC245 E

E - Wrapping Chocolate (atcoder.jp) 题意: 思路: 因为两个数组都是无序的,因此可以考虑给这两个数组都排个序 将物品和盒子都按照两个维度去排序 我们可以先去枚举物品,然后去选对应的盒子 在选盒子的过程中,注…

【王道·操作系统】第四章 文件管理(下)

一、文件系统 1.1 文件系统的层次结构 用户需要通过操作系统提供的接口发出上述请求——用户接口由于用户提供的是文件的存放路径,因此需要操作系统一层一层地查找目录,找到对应的目录项——文件目录系统不同的用户对文件有不同的操作权限,因…

c++读取字符串字符时出错

这是我做的一个c爬虫程序但是在抓取网页的时候string类型传递出现了问题 以下是图片代码 url的值是 "http://desk.zol.com.cn/" 我不知道为什么数据传递会出问题 请大佬指教

Java 串口通信(RS232/485)

Java 串口通信(RS232/485) 一.串口通信页面二.串口服务实现1.Java 串口通信配置1.扩展包和依赖库2.Pom配置 2.启动类3.工具包类1.Common2.Crc16Modbus3.SerialUtil 4.WebSocket 配置1.启动配置2.监听配置 5.UI交互类1.串口配置对象2.串口信息获取接口3.R…