Bootloader和APP的交互"/>
Bootloader和APP的交互
1.简介
本文主要介绍如何在Keil环境下实现MCU的Bootloader和APP交互,以ametal中的 bootloader和app组件为例进行讲解。
1.1Flash的使用
该MCU内部主flash主要划分四个部分:bootloader段区,应用段区,闲置段区和交互段区。
图1.1 flash使用
2.交互实现
2.1Boot程序设计
2.1.1关键字__attribute__
程序清单2.1 关键字__attribute__
__attribute__((used)) \
static uint8_t timer_t __attribute__((section("var"))) = 1;
使用关键字__attribute__使得用户定位变量、函数更灵活,(used)保证该代码不被优化,attribute((section(“var”))表明将变量放置在var部分。
2.1.2设计分散加载文件
程序清单2.2 Boot分散加载文件
; *************************************************************;
*** Scatter-Loading Description File generated by uVision ***;
*************************************************************
LR_IROM1 0x08000000 0x4C00 { ; load region size_region ER_IROM1 0x08000000 0x4C00 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } ;ER_IROM2 0x08005B00 0x100 { ; load address = execution address ;*.o (var) ;} RW_IRAM1 0x20000000 0x00002000 { ; RW data .ANY (+RW +ZI) }
}
LR_IROM2 0x0800C814 0x0100 { ; load region size_region ER_IROM2 0x0800C814 0x0100 { ; load address = execution address demo_core_bootloader.o(var) }
}
LR_IROM1和LR_IROM2为Bootloader的加载域,是按照图1.1实现。LR_IROM1放置Bootloader代码;LR_IROM2从0x800C814~0x800D814,正是flash的交互段区,demo_core_bootloader.o(var)表明将如程序清单2.1定义的var部分的变量放置在交互段区,var部分的变量也正是用于交互。
2.2APP程序设计
2.2.1关键字__attribute__
在APP的程序设计中也需要用到关键字__attribute__来定义交互变量,在2.1节中将交互变量定义在0x800C814~0x800D814区域,那么在APP的程序设计中也需要这么定义。
程序清单2.3 交互变量定义
__attribute__((used)) \
__attribute__ ((aligned(1024))) \
__attribute__((at(0x0800C800))) \
adjustable_parameter_t gAdjustableParameter_t = {/*这个就是Flash*/
0xff, 0x3ff,0x1e,0xff,0x5ff,0x1e,0xff,0x5ff,0x2,0x2,0x2,0x1,};
在程序清单2.3中,(used)保证该代码不被优化(aligned(1024))表明变量进行相应的对齐,(at(0x0800C800))表明将变量放置在0x0800C800地址中,虽然不等于0x800C814,但需要注意的是该变量是结构体变量,结构体变量的定义如程序清单2.4所示。
程序清单2.4 结构体定义
```
typedef struct adjustable_parameter { uint8_t gLEDA_LEDBCurrentSinkValue;int16_t gNoWater; uint16_t gVariance_No_Sml_Threshold; uint16_t gVariance_Sml_Mid_Threshold; uint16_t gVariance_Mid_Big_Threshold; uint16_t gValSum_No_Sml_Threshold; uint16_t gValSum_Sml_Mid_Threshold; uint16_t gValSum_Mid_Big_Threshold; uint8_t gBigCountThreshold; uint8_t gMidCountThreshold; uint8_t gSmlCountThreshold; uint16_t gBootWaitTime;} adjustable_parameter_t;```
最终根据地址对齐原则,该结构体变量成员gBootWaitTime的地址落在0x800C814上。
总结
通过第2章的设计,使得Bootloader和APP的交互变量共享一个地址,这样,Bootloader与APP之间的交互就实现了。
更多推荐
Bootloader和APP的交互
发布评论