电子产业一站式赋能平台

PCB联盟网

搜索
查看: 17|回复: 0
收起左侧

单片机OTA升级中Bootloader怎么判断APP有没有问题?

[复制链接]

289

主题

289

帖子

2142

积分

三级会员

Rank: 3Rank: 3

积分
2142
发表于 昨天 08:01 | 显示全部楼层 |阅读模式
关注公众号,回复“入门资料”获取单片机入门到高级开挂教程
开发板带你入门,我们带你飞

文 | 无际(微信:2777492857)
全文约1772字,阅读大约需要 5 分钟
没开发过OTA的工程师,职业生涯是不完整的。因为它能让设备远程更新功能,太方便了,产品有了这个功能,再也不会跟硬件工程师一起背锅了。
           
不过,新手玩OTA,搞不好,也会翻车,比如下载过程中网络掉了,新固件不完整,设备可能直接"变砖"了。
           
今天就教你,怎么在Bootloader加靠谱的验证机制,这样哪怕网络断了,数据错了,都不会显得这么狼狈。
           
在单片机OTA(空中升级)中,Bootloader是个很重要的角色,它得确保新下载的固件(也就是APP)没问题,才能放心加载运行。
           
如果APP有毛病,比如下载不全、数据坏了或者被篡改,设备可能会罢工甚至出大乱子。
           
所以,Bootloader得有一套办法来检查APP到底靠不靠谱。
           
下面我就用尽量通俗的语言,讲讲Bootloader常见的判断方法,顺便加点代码示例帮你更好理解。
           
一、为什么要检查APP有没有问题?
简单来说,Bootloader检查APP是为了避免这些麻烦:
?数据坏了:下载时信号不好或者存储器出问题,APP内容可能出错。
?没下全:网络断了一会儿,APP可能只下了一半。
?被人动了手脚:固件被恶意改过,可能会恶意破坏/控制设备。   
?版本不对:新APP跟硬件或者Bootloader不搭,跑不起来。
?放错地方了:APP没存到该存的地方,Bootloader找不到。
           
所以,Bootloader相当于是个"质检员",把APP好好检查一遍。
           
           
二、Bootloader怎么检查APP?
下面是Bootloader常用的几种方法,咱一个一个来看。
           
1. 用校验和或者CRC查数据的“身份证”
?啥意思:算个“校验值”跟APP自带的值比对,看数据有没有丢包或者坏掉。
?咋做:APP里带个校验值,Bootloader收到后自己再算一遍,比对一下。
?代码示例

zcdkeygk0oa6401403713.png

zcdkeygk0oa6401403713.png


这是无际单片机项目6的CRC16算法例子。
我们在服务器下载APP固件数据的时候,会把数据分包,比如一帧数据是200-255个字节,每帧数据都会进行CRC16校验。   

4qxixqctans6401403814.png

4qxixqctans6401403814.png


?CRC16好处:简单,算得快,单片机也能轻松搞定。
?缺点:只能查数据坏没坏,挡不住故意篡改。
           
           
2. 用数字签名验“出身”
?啥意思:就像查身份证真假,得确认APP是正宗的,没被改过。
?咋做:发送方用私钥给APP“盖章”,Bootloader用公钥验这个章。
?代码示例(简单模拟一下):
  • #define SIGN_ADDR (APP_START + APP_SIZE + 4)  // 签名放的位置uint8_t signature[64];memcpy(signature, (uint8_t *)SIGN_ADDR, 64);  // 取出签名if (!verify_signature(app_data, APP_SIZE, signature)) {  // 假设有验证函数    // 签名不对,可能是假货!    printf("签名挂了,APP不靠谱!
    ");}
    ?好处:安全性高,篡改不了。
    ?缺点:算起来费劲,单片机可能有点吃力。
               
    3. 看版本号对不对
    ?啥意思:检查APP的版本,确保跟硬件和Bootloader能搭上。
    ?咋做:从APP里读出版本号,比对一下。
    ?代码示例:
  • #define MIN_VERSION 0x0200  // 最低版本要求uint16_t app_version = *(uint16_t *)(APP_START + 8);  // 版本号位置if (app_version {    // 版本太老,不行!    printf("APP版本太低,跑不了!
    ");}?好处:简单,能避免版本不匹配。
    ?缺点:只管版本,数据坏不坏它不管。
               
               
    4. 检查APP放的位置对不对
    ?啥意思:确保APP在正确的存储区里。
    ?咋做:看看地址和大小有没有跑偏。
    ?代码示例:
  • #define FLASH_BASE 0x08000000#define FLASH_END  0x08080000if (APP_START  FLASH_END) {    // 位置不对,APP有问题!    printf("APP放错地方了!
    ");}
    ?好处:快,能马上发现存错了。
    ?缺点:只管位置,不管内容。
               
    5. 用个“通关密码”
    ?啥意思:APP里有个特定标记,证明它没问题。
    ?咋做:Bootloader下载完后写个标记,启动时检查。
    ?代码示例:
  • #define FLAG_ADDR 0x08007FFC#define FLAG_VALUE 0xA5A5uint32_t flag = *(uint32_t *)FLAG_ADDR;if (flag != FLAG_VALUE) {    // 没通关密码,APP不靠谱!    printf("标记不对,APP有问题!
    ");}
    ?好处:简单,检查快。
    ?缺点:容易被仿造,安全性不高。
               
    三、完整的检查流程   
    一般来说,Bootloader不会只用一种方法,而是把几种组合起来,比如:
    1.先看看位置对不对。
    2.再算算CRC,确认数据没坏。
    3.用签名验一下真假。
    4.检查版本能不能用。
    5.最后看标记对不对。
               
    每一步都得过关,APP才能算“合格”,不然Bootloader就得用老固件或者停下来。
               
    四、单片机资源少咋办?
    单片机不像电脑那么强,资源有限,所以得有点小聪明:
    ?用硬件帮忙:有的单片机有CRC模块,能省不少力。
    ?分块检查:别一次算太多,分成小块慢慢验。
    ?留条后路:可以划分2个内存区域,分别存老版本和新版本的APP,万一新APP有问题,能退回老版本。
               
    五、总结一下
    Bootloader要判断APP靠不靠谱,常用的招数有校验和/CRC、数字签名、版本检查、位置检查和标记验证。这些方法各有各的强项,搭配起来用,能确保APP没毛病,既安全又好用。希望这些例子和解释能让你明白咋回事儿。

    end

    lafae1f5xp56401403914.jpg

    lafae1f5xp56401403914.jpg


    下面是更多无际原创的个人成长经历、行业经验、技术干货。
    1.电子工程师是怎样的成长之路?10年5000字总结
    2.如何快速看懂别人的代码和思维
    3.单片机开发项目全局变量太多怎么管理?
    4.C语言开发单片机为什么大多数都采用全局变量的形式
    5.单片机怎么实现模块化编程?实用程度让人发指!
    6.c语言回调函数的使用及实际作用详解

    7.手把手教你c语言队列实现代码,通俗易懂超详细!

    8.c语言指针用法详解,通俗易懂超详细!
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表