Bootloader和APP的交互

编程入门 行业动态 更新时间:2024-10-05 13:18:49

<a href=https://www.elefans.com/category/jswz/34/1754948.html style=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的交互

本文发布于:2024-02-28 03:08:08,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1767827.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Bootloader   APP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!