网站首页 > 技术教程 正文
问一个拷问灵魂的问题?单片机的程序从哪里开始?想三秒钟之后再接着往下看。有的人第一个答案是从main()函数开始。究竟这个答案是不是正确的?我们来聊聊。
我们举个例子,32位的单片机,在keil软件里面我们通常会默认或者设置的都是从0x08000000这个地方开始,这是什么?这是flash开始的地址。我们平时搭建环境、编写完程序之后编译直接下载就可以了。那这跟我将要聊到的bootloader有什么关系呢?
bootloader是一个引导程序,如果有引导程序的话,那我们的功能代码这一块就是应用app了,实际上这两块代码组合成了一个完整的单片机系统软件。为什么这么说,flash存放代码的区域其实不止一个,要是我们的flash里面存着两个app甚至是三个app的时候,单片机该从哪个地方开始,执行哪个app代码呢?这时候是不是需要一个引导程序,引导从哪个地方启动app?显然是这样的,bootloader就是这样一个作用。
最近芯片慌,一芯难求,更别说一芯一意了,从玩stm32到NXP17系列到现在的国产芯片。最近也在用GD32,我们就用GD32来举个例子说明bootloader、app和flash的爱恨情仇。
我们使用的芯片是GD32F407VE,内存情况如下:
| flash位置 | 名称 | 大小 | 
| 0x0800 0000 - 0x0800 3FFF | bootloader | 16K | 
| 0x0800 4000 - 0x0800 7FFF | 保留 | 16K | 
| 0x0800 8000 - 0x0800 BFFF | 保留 | 16K | 
| 0x0800 C000 - 0x0800 FFFF | 校验码,升级标志位 | 16K | 
| 0x0801 0000 - 0x0801 FFFF | 保存基础数据 | 64K | 
| 0x0802 0000 - 0x0803 FFFF | App1 | 128K | 
| 0x0804 0000 - 0x0805 FFFF | App 2 | 128K | 
| 0x0806 0000 - 0x0807 FFFF | App 3 | 128K | 
表中所示是整个芯片的flash地址及大小,为什么会这么分,首先要说明的一点就是,bootloader一定是要放在0x08000000这里的,因为程序开始的地址就是这个地方,为什么要把app放在后面三个呢?因为程序本身比较大,也都超过了64k,所以放在稍大一点的扇区。这样做的一个好处是,所放的程序不会占用两个扇区,多出来的小的扇区可以用来保存数据。
程序的启动,在bootloader引导程序中,我们会启用标志位,每个app对应一个标志位,如果判断成功就跳转到相应的地址去启动相应的程序。这也是我们后期需要做的在线OTA功能。
对于OTA功能,这里也做了一个规划,形式和途径可能不一样,但是原理是一样的,都是接收数据、校验、写进flash里面,然后跳转或者重启。流程大体如下:
话题一转,单片机如此,linux不也如此吗?uboot不就是一个引导程序吗?也可以应用于不同的平台,这种不同平台也还是相当于app而已,原理是一样,启动的东西不一样罢了,当然还要看兼容性。就给大家分享这么多,希望大家都有收获,欢迎交流。
猜你喜欢
- 2024-10-23 基于S12 MagniV系列的LIN Bootloader设计
- 2024-10-23 怎么使用USBasp给arduino烧写bootloader?
- 2024-10-23 腾讯 ROG 游戏手机 6 / Pro 公开内核源码并支持解锁 bootloader
- 2024-10-23 浅谈基于uds的bootloader设计(简要概述u-boot的主要功能)
- 2024-10-23 Bootloader引导程序uboot(bootice 引导)
- 2024-10-23 基于CAN总线的Bootloader设计与实现
- 2024-10-23 Rust语言开发操作系统-第二章(最小化内核)
- 2024-10-23 基于RT-Thread完整版搭建的极简Bootloader
- 2024-10-23 海信阅读手机A9现可解锁bootloader并获取root权限
- 2024-10-23 三星警告Galaxy Z Fold 3解锁bootloader将失去相机功能
欢迎 你 发表评论:
- 10-23Excel计算工龄和年份之差_excel算工龄的公式year
- 10-23Excel YEARFRAC函数:时间的"年份比例尺"详解
- 10-23最常用的10个Excel函数,中文解读,动图演示,易学易用
- 10-23EXCEL中如何计算截止到今日(两个时间中)的时间
- 10-2390%人不知道的Excel神技:DATEDIF 精准计算年龄,告别手动算错!
- 10-23计算工龄及工龄工资(90%的人搞错了):DATE、DATEDIF组合应用
- 10-23Excel中如何计算工作日天数?用这两个函数轻松计算,附新年日历
- 10-23怎样快速提取单元格中的出生日期?用「Ctrl+E」批量搞定
- 最近发表
- 
- Excel计算工龄和年份之差_excel算工龄的公式year
- Excel YEARFRAC函数:时间的"年份比例尺"详解
- 最常用的10个Excel函数,中文解读,动图演示,易学易用
- EXCEL中如何计算截止到今日(两个时间中)的时间
- 90%人不知道的Excel神技:DATEDIF 精准计算年龄,告别手动算错!
- 计算工龄及工龄工资(90%的人搞错了):DATE、DATEDIF组合应用
- Excel中如何计算工作日天数?用这两个函数轻松计算,附新年日历
- 怎样快速提取单元格中的出生日期?用「Ctrl+E」批量搞定
- Excel日期函数之DATEDIF函数_excel函数datedif在哪里
- Excel函数-DATEDIF求司龄_exceldatedif函数计算年龄
 
- 标签列表
- 
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
 

本文暂时没有评论,来添加一个吧(●'◡'●)