0x01 LiteOS内核详解--stm32启动流程

举报
樊心昊 发表于 2020/05/25 13:14:28 2020/05/25
【摘要】 摘要:为了能和大家说清楚LiteOS的硬件接管机制,不得不在这里谈一谈STM32上电后的启动机制。 基础知识大家应该注意到stm32开发板上都是几个跳线帽或者拨码开关,用于切换BOOT0和BOOT1的管脚电平,其目的是为了选择启动模式:MODEBOOT0BOOT1FLASH0XSRAM11ISP10这里的0是指将对应管脚和GND连接,1是指将对应管脚和VCC连接,X是指任意状态都可以,默认情...

摘要:为了能和大家说清楚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

image.png

为什么要说这个启动地址的问题?

因为在编译程序时,把“中断向量表”链接到0x0800_0000开始的位置,地址0x0800_0000处存放栈顶地址让CPU读取,地址0x0800_0004处存放第一个中断的处理函数为“Reset”中断,也就是复位中断,单片机上电或者进行了复位操作就会跳转到该中断向量处指令中断处理函数,在Reset_Handler处理函数中设置了堆栈地址等一些初始化操作,最后通过汇编语句跳转至main函数开始执行用户代码。

       下面这张表就做“中断向量表”(这里我只截取了一部分),这是由ARM硬件设计时规定的,发生xx中断就跳到某个地址,我们可以在相应地址处写好对应中断的处理函数,当发生该中断就调用其对应的处理函数来处理。

image.png

image.png

 

LiteOS接管硬中断的原理

       本质上就是将一个中断处理函数(osInterrupt)写到我们使能的中断在向量表中地址对应的内存空间处,举个例子:无论是发生串口中断还是EXTI0中断都先调用统一的osInterrupt函数来处理,在osInterrupt函数内部判断是什么中断、应该如何处理,这就是硬中断接管的本质。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。