天天百事通!不升级版本也可以修复单片机的bug
2023-04-28 08:16:06来源:面包芯语

扫描关注一起学嵌入式,一起学习,一起成长

在嵌入式产品开发中,难以避免地会因为各种原因导致最后出货的产品存在各种各样的BUG,通常会给产品进行固件升级来解决问题。

记得之前在公司维护一款BLE产品的时候,由于前期平台预研不足,OTA参数设置不当,导致少数产品出现不能OTA的情况,经过分析只需改变代码中的某个参数数值即可,但产品在用户手里,OTA是唯一能更新代码的方式,否则只能给用户重发产品。


(资料图片)

后来再想,是否可以提前做好一个接口,支持动态地传输少量代码到产品中临时运行,通过修改特定位置的Flash代码数据来修复产品的棘手BUG?多留一个后门,有时候令产品出棘手问题的往往是那么一两行代码或者几个初始化的参数不对,那么这种方法也可以应应急,虽然操作比较骚。

二、创建演示工程

本文以STM32F103C8T6单片机为例创建演示工程,分为app和bootloader两个工程。即将mcu的Flash分为“app”和“bootloader”两个区域, bootloader放在0x8000000为起始的24KB区域内,app放在0x8006000为起始的后续区域。bootloader完成对app的Flash数据修改。

1、app工程

注意app的工程需要在keil上修改ROM起始地址。

为什么要在bootloader运行时篡改app的数据?按理说在app运行时接收到error_process函数的更新数据后可以立刻运行,但是由于涉及到对app自身代码的修改,涉及Flash修改的一些相关函数有可能会被暂时破坏而导致代码运行崩溃。

四、跳过app的某些函数

如果想跳过“led_blings_1”函数,有2种方法:

1、函数内部跳过

即将以下汇编语句0x0800655a:2400.$MOVSr4,#0修改为0x0800655a:e013.$B0x08006584

在“led_blings_1”函数入口处指令修改直接跳转到函数出口处。至于汇编的机器码和用法文末有相关资料可以查阅。

因为修改处的字节偏移为0x55a,是pageBuf下标为342元素的高2Byte,需要在error_process函数中做如下修改:

pageBuf[342]=(pageBuf[342]&0x0000FFFF)|0xe0130000;

2、函数调用处跳过

main函数汇编如下:

$ti.mainmain0x080065f8:f44f41c0O..AMOVr1,#0x60000x080065fc:f04f6000O..`MOVr0,#0x80000000x08006600:f7fffe5c..\.BLNVIC_SetVectorTable;0x80062bc0x08006604:2048HMOVSr0,#0x480x08006606:f7ffff01....BLSysTick_Init;0x800640c0x0800660a:f7ffff85....BLinit_led;0x80065180x0800660e:f7ffffa3....BLled_blings_1;0x80065580x08006612:f7ffffbb....BLled_blings_2;0x800658c0x08006616:f7ffffd3....BLled_blings_3;0x80065c00x0800661a:e011..B0x8006640;main+720x0800661c:f44f6180O..aMOVr1,#0x4000x08006620:4808.HLDRr0,[pc,#32];[0x8006644]=0x40010c000x08006622:f7fffe43..C.BLGPIO_SetBits;0x80062ac0x08006626:f44f707aO.zpMOVr0,#0x3e80x0800662a:f7ffff4f..O.BLdelay_ms;0x80064cc0x0800662e:f44f6180O..aMOVr1,#0x4000x08006632:4804.HLDRr0,[pc,#16];[0x8006644]=0x40010c000x08006634:f7fffe38..8.BLGPIO_ResetBits;0x80062a80x08006638:f44f707aO.zpMOVr0,#0x3e80x0800663c:f7ffff46..F.BLdelay_ms;0x80064cc0x08006640:e7ec..B0x800661c;main+36$d0x08006642:0000..DCW00x08006644:40010c00...@DCD1073810432

下面是调用语句:

0x0800660e:f7ffffa3....BLled_blings_1;0x8006558

直接将此语句改为空语句nop(0xbf00)即可跳过调用,由于该命令占用4个字节,nop是两个字节的命令,所以替换为两个nop命令。

0x0800660e:bf00bf00....NOP

因为修改处的字节偏移为0x60e,是pageBuf下标为387元素的高2Byte和下标为388元素的低2Byte,需要在error_process函数中做如下修改:

pageBuf[387]=(pageBuf[387]&0x0000FFFF)|0xbf000000;pageBuf[388]=(pageBuf[388]&0xFFFF0000)|0x0000bf00;

标签:

最后一页
宁夏100余家企事业单位组团跨省招才引智

精彩推荐

资讯News

  • 聚焦Policy