Bootloader Design of PIC18 series MCU

注意:下列描述是在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.hqwc.cn/news/8046.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】带你玩转排序:堆排序、希尔排序、插入排序、选择排序、冒泡排序、快排(多版本)、归并排序

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 常见算法的实现 插入排序 希尔排序 堆排序 选择排序 冒泡排序 快速排序 Hoare版本 随机选Keyi 三数取中 挖坑法 前后指针版本 归并排序 常见算法的实现 插入排序 动画演示&…

记一次自建靶场域渗透过程

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 环境搭建02 外网突破03 权限提升并维持(1)获取 meterpreter 会话(2)尝试开启远程桌面(3)Msf 派生 Cobalt Strike shell&#…

【C++】4.工具:读取yaml配置信息

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍读取yaml配置信息。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路&…

CC1310 CC1310F128RSMR 超低功耗SUB-1GHz 无线 MCU芯片

1 器件概述 1 1 特性 • 微控制器 – 性能强大的 Arm Cortex -M3 处理器 – EEMBCCoreMark评分:142 – EEMBC ULPBench™评分:158 – 时钟速率最高可达 48MHz – 32KB、64KB 和 128KB 系统内可编程闪存 – 8KB 缓存静态随机存取存储器 (SRAM) &#xff…

CMake静态库动态库的构建和链接

cmake的基础知识&#xff1a;CMakeLists常用命令&#xff0c;在这里不再赘述。 Windows平台下可用cmake-gui生成vs的.sln工程&#xff0c;Linux平台下可以运行cmake命令。 动态库和静态库的构建 现有C工程目录结构如下&#xff1a; 静态库的构建 add.h #include <iost…

C语言进阶---字符串+内存函数

本章重点 重点介绍处理字符和字符串的库函数的使用和注意事项。 求字符串长度 strlen() 长度不受限制的的字符串函数 strcpy()strcat()strcmp() 长度受限制的的字符串函数 strncpy()strncat()strncmp() 字符串查找 strstr()strtok() 错误信息报告 strerror() 字符操作内存操作函…

FPGA实验二:模可变计数器设计

目录 一、实验目的 二、实验要求 三、实验代码 1.实验源码 2.部分代码设计思路分析 四、实验结果及分析 1、引脚锁定 2、仿真波形及分析 3、下载测试结果及分析 五、实验心得 1.解决实验中遇到的困难及解决 2.完成实验后的心得 一、实验目的 &#xff08;1&#xf…

Jenkins用户权限设置和运行节点配置实战

这里写目录标题 一、Jenkins用户权限设置实战1、用户权限配置2、用户权限分配 二、Jenkins运行节点配置实战1、增加运行节点的好处2、实战B-1:添加Jenkins运行节点实战1、相关字段说明&#xff1a;2、SSH连接方式 实战B-2:配置不同类型的节点-Python 节点实战B-3:配置不同类型的…

【Java|golang】2679. 矩阵中的和

给你一个下标从 0 开始的二维整数数组 nums 。一开始你的分数为 0 。你需要执行以下操作直到矩阵变为空&#xff1a; 矩阵中每一行选取最大的一个数&#xff0c;并删除它。如果一行中有多个最大的数&#xff0c;选择任意一个并删除。 在步骤 1 删除的所有数字中找到最大的一个…

什么是DevOps? 什么是DORA?

1. 前言 对于搞云原生应用的同学&#xff0c;对于DevOps和DORA应该都不陌生。但对于传统应用程序开发的同学&#xff0c;经常被DevOps, Microservice, CICD, DORA这些新颖的名词搞得晕头转向。那么到底什么是DevOps? 什么是DORA呢&#xff1f; 2. 解析 2.1 DevOps DevOps并…

Linux进程概念

目录 冯诺依曼体系结构 操作系统 系统调用和库函数概念 进程 描述进程-PCB 组织进程 理解进程 查看进程 通过系统调用获取进程标示符 通过系统调用创建进程-fork 进程状态 进程状态查看 孤儿进程 进程优先级 查看系统进程 PRI and NI PRI vs NI 用top命令更改…

官宣 | 平行云正式升级为Paraverse平行云科技,开启全球业务新征程

6月30日, "Here is New-Gen Web"——Paraverse Global Strategy and Brand Launch Party 于香港科学园召开&#xff0c;会上平行云正式宣布升级为Paraverse平行云科技&#xff08;以下简称Paraverse)&#xff0c;并升级品牌标识“Paraverse”。这一全新命名与视觉焕新…