网站首页 > 技术教程 正文
问一个拷问灵魂的问题?单片机的程序从哪里开始?想三秒钟之后再接着往下看。有的人第一个答案是从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将失去相机功能
你 发表评论:
欢迎- 最近发表
-
- linux日志文件的管理、备份及日志服务器的搭建
- Linux下挂载windows的共享目录操作方法
- Linux系统中的备份文件命令(linux系统中的备份文件命令有哪些)
- 麒麟KYLINOS|通过不同方法设置用户访问文件及目录权限
- 「Linux笔记」系统目录结构(linux目录的结构及含义)
- linux中修改归属权chown命令和chgrp命令
- 工作日报 2021.10.27 Android-SEAndroid权限问题指南
- Windows和Linux环境下,修改Ollama的模型默认保存路径
- 如何强制用户在 Linux 上下次登录时更改密码?
- 如何删除Linux文件夹中除某些扩展名之外的所有文件?
- 标签列表
-
- 下划线是什么 (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)
本文暂时没有评论,来添加一个吧(●'◡'●)