嵌入式linux开发 (二十) 内存管理(3.1) STM32F407ZGT6内存管理之启动篇(MPU-Without)

做stm32开发可以用keil MDK,而 keil MDK 是 KEIL公司的产品,KEIL公司在2005被ARM收购.MDK(Microcontroller Development Kit),也称MDK-ARM、KEIL MDK、RealView MDK、KEIL For ARM			
所以如果查询资料,可以:
	1. 去arm官网去搜索 MDK 的资料 // http://infocenter.arm.com/help/index.jsp
	2. 去keil官网搜索 MDK 的资料 //http://www.keil.com/support/man/
	3. 去 stm32 官网搜索 stm32的资料 // https://www.stmcu.com.cn/
	4. 去 arm官网搜索 cortex-M4 的资料
	5. 去 arm 官网搜索 ARMv7的资料 
	A. 本地文档,在安装目录下D:\ProgramFiles\ForDev\Keil_v5打开cygwin,find . -name *.pdf -o -name *.chm

在这里插入图片描述

  • 启动第一阶段 BOOT引脚 存储映射 异常向量表
烧写
	当 LED bin文件 被烧入 主flash(1MB,0x0800 0000 - 0x080F FFFF)

配置
	配置BOOT0 为 0 ,BOOT1 随意

启动
	1.上电
	2.由于 BOOT0 为0,所以 0x0800 0000 - 0x080F FFFF被映射到 0x0000 0000 - 0x03FFFFFF
		// 	0x08000000地址存放的是栈顶地址 __initial_sp  //__initial_sp 为 之前定义的栈的栈顶地址,cortex-m3手册中规定 0x00000000 必须放 栈顶地址
		//  0x08000004 地址存放的是复位中断向量Reset_Handler //STM32使用32位总线,因此存储空间为4字节对齐
	3.加载 0x0000 0000 地址处的值进 SP,并以0x08000004地址处的值为目标地址,跳转到目标地址
		// 在代码中一般表示为一个标号,Reset_Handler
		// 在map 文件中找到 Reset_Handler标号 的地址为 0x08000229 ,被映射为 0x00000229
	4. 跳转到 Reset_Handler标号之后,开始顺序执行代码
  • 启动第二阶段 Reset_Handler
// Reset_Handler 为 标号, PROC 表示一个函数(在这里叫做过程更好)的起始, ENDP 表示一个函数的结束

//声明 Reset_Handler 为全局变量

// 引入 __main ,注意,这个 __main 并不是 其他.c 文件中的main,而是编译器自动生产的真是存在的__main,__main 会去调用main

// weak 引入 SystemInit

//将 SystemInit(函数地址) 写入 R0 寄存器

//跳转到 SystemInit,执行完 SystemInit后返回

//将 __main(函数地址) 写入 R0

//跳转到__main执行,执行完返回.


  • 启动第三阶段 __main ,详情请参考DUI0808C_libraries_user_guide.pdf
// __main 会调用main,用户写的main一般不会退出.所以 __main 一般不会退出
You can customize execution initialization by defining your own __main that branches to __rt_entry .
The entry point of a program is at __main in the C library where library code:
1. Copies non-root (RO and RW) execution regions from their load addresses to their execution
addresses. Also, if any data sections are compressed, they are decompressed from the load address to
the execution address.
2. Zeroes ZI regions.
3. Branches to __rt_entry .

-----------------翻译


程序的入口点位于C库中的_main,流程为
1. 将 non-root (RO and RW) execution regions 从 加载地址 拷贝到 执行地址.如果data sections被压缩,则将它们从加载地址解压缩到执行地址。//具体实现在(InRoot$$Sections) 
	// 其实 RO(RO-data) 的 加载地址 和 执行地址是一样的.都在0x08000000(主Flash上)
	// RW(RW-data) 加载地址在 0x08000000 + sizeof(RO-data),执行地址在0x20000000(SRAM1)
	// ZI(ZI-data) 加载地址在 0x08000000 + sizeof(RO-data),执行地址在0x20000000(SRAM1) // 其实这一段并没有加载,因为加载了也要清0,所以干脆留空.只记录 ZI-data 执行地址的开始地址和结束地址
2. 将ZI regions清0
3. 跳转到__rt_entry

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值