0x01 LiteOS内核详解--stm32启动流程
摘要:为了能和大家说清楚LiteOS的硬件接管机制,不得不在这里谈一谈STM32上电后的启动机制。
基础知识
大家应该注意到stm32开发板上都是几个跳线帽或者拨码开关,用于切换BOOT0和BOOT1的管脚电平,其目的是为了选择启动模式:
MODE |
BOOT0 |
BOOT1 |
FLASH |
0 |
X |
SRAM |
1 |
1 |
ISP |
1 |
0 |
这里的0是指将对应管脚和GND连接,1是指将对应管脚和VCC连接,X是指任意状态都可以,默认情况下我们选择从Flash启动。
STM32大部分的Flash地址都是由0x0800_0000启动,在启动是0x0800_0000这个地址会被映射到0x0000_0000地址处,相当于我们访问0x0000_0000地址处也就是访问0x0800_0000
为什么要说这个启动地址的问题?
因为在编译程序时,把“中断向量表”链接到0x0800_0000开始的位置,地址0x0800_0000处存放栈顶地址让CPU读取,地址0x0800_0004处存放第一个中断的处理函数为“Reset”中断,也就是复位中断,单片机上电或者进行了复位操作就会跳转到该中断向量处指令中断处理函数,在Reset_Handler处理函数中设置了堆栈地址等一些初始化操作,最后通过汇编语句跳转至main函数开始执行用户代码。
下面这张表就做“中断向量表”(这里我只截取了一部分),这是由ARM硬件设计时规定的,发生xx中断就跳到某个地址,我们可以在相应地址处写好对应中断的处理函数,当发生该中断就调用其对应的处理函数来处理。
LiteOS接管硬中断的原理
本质上就是将一个中断处理函数(osInterrupt)写到我们使能的中断在向量表中地址对应的内存空间处,举个例子:无论是发生串口中断还是EXTI0中断都先调用统一的osInterrupt函数来处理,在osInterrupt函数内部判断是什么中断、应该如何处理,这就是硬中断接管的本质。
- 点赞
- 收藏
- 关注作者
评论(0)