上电之后main.c 如何在cpu中运行

本文深入探讨了微控制器中的复位概念,包括上电复位和手动复位,并解释了复位的主要作用是检查系统是否有错误。中断向量表作为中断处理的核心,每个表项对应中断源的子程序,其中优先级-3的中断具有特殊意义。文章还阐述了中断向量表的位置可能在FLASH的不同区域,并通过NVIC_SetVectorTable进行设置。复位过程中,首先确定栈顶和堆栈空间,接着执行复位程序和系统初始化,最终跳转到main函数。关键词涵盖了复位、中断向量表、堆栈管理和微控制器初始化等关键点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

前面一篇<中断服务子程序是如何被cpu执行的>讲了
1 中断前保护现场,中断后恢复现场。
2 中断向量表的组成和运行过程。
3 堆栈在中断的占用情况。
回顾一下

1 中断前保护现场就是 会保存之前的数据 再进入中断 反之 
中断后 恢复现场就是不保存中断数据 回到原先事件 
2{
 中断向量表的每个表项都会对应 相应的中断源的子程序
 并且直接从R14寄存器取出地址 进行函数执行 pc指针也会存入函数 以便准备下一次的运行。
}
3 {
  在保护现场 堆栈就明显增多 恢复现场明显减少了。
}

复位的概念

************解开复位的神秘面具 其实就一句话 (重要)

复位就是 检查有没有错误的意思 

引起复位的几种原因

上电复位 通道之后的检查有无错误 没有就继续往下上电.
外部手动复位:也就是常见的复位按键 只是换个方式来检查有无出错。和上电复位差不多
区别是 一个是自动 一个是手动 仅此而已。
。。。。。等等的复位。。。。。。。。

中断向量表

这里列出来很多的 中断外部中断对应了不同的优先级  -3是最高的 也就是它会起到一个承上启下的作用 他可以起到手动复位的作用 。并且 cpu 会有一部分单独的特殊中断 称之为异常.上电之后 会先给cpu 检测有无出错现象.没有 就是没有异常在运行.

在这里插入图片描述
在这里插入图片描述
而红箭头指向 没什么都没写 其实他存放的是优先级-2 -1的变量 并且不能被编程 和执行的
并且它是表示 堆栈的 栈顶 根据堆栈的“先进后出”机制 那么它是第一个进去的 也就是最后一个出来的 那么他堆栈空间大小就可以确定了 也就可以说它是一个结束地址。

中断向量表的位置

大概分成两中情况
1 很常规的 源程序 — 中断 函数的 方式 (FLASH不分块 )
在这里插入图片描述

1 他的地址就是 0x0800000 很和常规的没差别。

2 把FLASH分成两块
在这里插入图片描述

相当于 原先的一块 分成了两块 并且他们都有 两个不一样的名字 
名字就是bootlarder和app 
这里可理解为 中断存放的PC指针的地址 就是 bootlarder 或者是 app 
换名字的过程 就是你们所说的重定向 
重定向就是 换一个名字代替而已  和宏定义没区别。

在F103 可以这么实现

NVIC_SetVectorTable(NVIC_VectTab_FLASH, offset);

复位过程

用上面的 第一个例子 讲解  拿到了一个起始地址,也就是栈顶,这就确认了堆栈空间大小 并且存入SP  初始化PC指针 pc指针存放是下一个地址的指令 所以会去执行的是中断复位程序。

在这里插入图片描述
执行完复位程序之后 它会先去检测sysinit函数的复位 如果没有出错
sysinit 作用起效了 他的作用是 初始化RCC 和重定向的初始化 等等。
最后才会执行main (结合下面的图来理解)
在这里插入图片描述

总结

1 上电复位 检查cpu有无异常,有无出错---- 2 确定栈顶位置 也就知道了堆栈空间的大小
 ---3 把存放在R14的地址 取出  返回执行 函数点 因为 pc指针存放下一个地址的指令一直
 运行到了Sysinit 再次复位检查 RCC 和重定向有无出错 没有出错 就初始化 RCC和重定向 ----
 4 最后跳转到main执行 pc指针始终在前面存放。
请多多指教 这位哞
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值