一、进入异常之前处理器可能的状态有:
1.handler
2.线程,MSP
3.线程,PSP
二、产生异常时:
1、有一个压栈的过程,产生异常时使用PSP,就压入到PSP中,产生异常时使用MSP,就压入到MSP中
2、会根据处理器的模式和使用的堆栈,设置LR的值(当然设置完的LR的值再压栈)
三、异常返回时:
根据LR的值,判读使用那个堆栈,然后再从相应的堆栈中POP数据到寄存器。
举例说明:
在利用OSStartHighRdy->OSPendSV->OSPendSV_nosave启动第一个线程时,在异常进入的时候,压栈到MSP(不会影响PSP的内容),在通过BX LR指令从异常返回之前,有一句ORR LR, LR, #0x04来设置LR的值,保证我们从异常返回时是从PSP中POP数据到寄存器里,而此时PSP的值是OSTCBHighRdy->OSTCBStkPtr,即任务创建时定义的堆栈数组,同时在OSTaskStkInit函数中对该任务数组初始化时,要保证其组织结构和异常产生时处理器自动压栈产生的栈的结构相同。
四、栈中的内容分析:
1、变量
2、调用函数时,如果子函数比较复杂,会由编译器自动的压入r4-r11, lr(压入多少寄存器,由子函数的复杂程度决定的)
3、异常保存,压入栈的是r0-r3,r12,LR,PC,xSPR(硬件直接完成的)
4、进程切换,所有寄存器全部压栈
由于异常死机了之后的具体操作:
产生异常时,两个值我们需要,一个是pc,一个是LR,通过LR找到栈, 再通过栈找到pc
1、如果LR=0xFFFFFFF9说明产生异常的时候使用的是MSP,我们只需要读出当前sp的值,
sp += 0x1c; 读出的内容就是产生异常时压入栈的PC的值,这个值跟反汇编代码对比,就能得到具体哪句话产生的异常。
2、如果LR=0xFFFFFFFD明产生异常的时候使用的是PSP,我们需要读出PSP的值,不要直接来读sp的值,在keil集成开发环境中,调试时寄存器窗口有个Banked选项,会给出当前PSP的值,当然也可以在异常处理中加入两句话:
MRS R0,PSP
PUSH {R0}
我们就能在当前MSP中得到,我们PSP的值了,之后操作和上面一样,psp+=0x1c; 读出的内容就是产生异常时压入栈的PC的值,这个值跟反汇编代码对比,就能得到具体哪句话产生的异常。
关键字:ARM cortex-M3 异常处理
引用地址:
ARM cortex-M3 异常处理分析
推荐阅读最新更新时间:2024-11-09 11:13
NVIDIA 与 Ampere Computing 携手创建用于云游戏的Arm 架构云原生服务器平台
NVIDIA 与 Ampere Computing 携手创建用于云游戏的Arm 架构云原生服务器平台 AICAN 平台将带来原生兼容性和高性能,大幅加快云端移动游戏的传输速度。 北京 - 2022 年 8 月 29 日 – NVIDIA 和 Ampere Computing 于今日宣布 推出 AICAN 服务器平台 。该平台能够将位于云数据中心的移动游戏流式直接传输至终端用户,使用户无需下载。 AICAN 服务器平台(Android-in-Cloud-with-Ampere-and-NVIDIA)是由 Ampere Computing 和 NVIDIA 所共同打造 ,它采用 Ampere® Altra® 云原生处理器和
[网络通信]
ch32和gd32哪个好用?
Ch32和Gd32是两个比较常见的芯片系列,都是基于ARM Cortex-M3内核设计的,因此具有类似的特点和性能。在选择使用哪个芯片时,需要根据具体的项目需求和开发难度加以考虑。 首先,我们来简单介绍一下这两个芯片系列的特点。Ch32是中国厂商江苏长鹰半导体公司生产的一款芯片,可以实现信号的高速处理和计算机视觉应用,广泛应用于机器人、智能家居、智能驾驶等领域。Gd32则是由中国厂商北京兆易创新科技有限公司生产的芯片,主要应用于工控、嵌入式、智能家居、智能穿戴等领域。 在开发难度方面,刚开始学习嵌入式开发的初学者可能会觉得Gd32更加好用,因为它有完善的开发工具链和丰富的文档资料,对于初学者来说更加友好。Ch32的开发工具链和文档
[单片机]
arm-linux-gcc & 一个相当低级的错误
今天将以前在windows ADS上写好的一些裸机程序用linux + arm-linux tools 移植到 TQ2440上,刚弄第一个 LED,就卡住了, main.c 不加任何修改 #define rGPBCON (*(volatile unsigned *)0x56000010) //Port B control #define rGPBDAT (*(volatile unsigned *)0x56000014) //Port B data #define rGPBUP (*(volatile unsigned *)0x56000018) //Pull-up control B static void le
[单片机]
...arch/arm: Is a directory. Stop." 的错误解决
今天在make s3c2410_defconfig时出现了: arch/arm: Is a directory. Stop. 错误... 查找半天, 原来是Makefile中ARCH=arm这一句后面多了两个空格变成ARCH=arm__ 所以就不识了... 果断去断空格,就OK了.
[单片机]
【ARM】Linux驱动移植
#1驱动模块移植过程 ##1.1模块的第一种编译方法——改kconfig 第一步:改kconfig 文件在:Drivers/char/kconfig; tristate三态表示可以编译在模块 M ; bool表示只能被选择编 或不编 。 第二步:配置内核 make menuconfig后会自动生成供编译的.config文件。 wuchengbing@ubuntu:~/linux/kernel-2.6.13$ make menuconfig Device Drivers --- Character devices --- S3C2410 RTC Driver │ │
[单片机]
ARM裸机篇(二)——i.MX6ULL启动过程
一、 i.MX6ULL启动流程 I.MX6U 支持多种启动方式以及启动设备,比如可以从 SD/EMMC、 NAND Flash、 QSPI Flash等启动。 i.MX6UL完整的启动流程如下图所示,完成启动任务的代码位于0x0000 0000 地址处的Boot ROM。 启动流程过程大致可分为六步。①检查CPU的ID ,②检查复 位状态,③获取启动方式,④加载程序映像,⑤校验映像,⑥跳转到映像去执行。 i.MX6ULL有四个启动模式,如下表,具体使用哪种启动模式通过内部寄存器 BOOT_MODE 中的值来选择,如图: 当 BOOT_MODE 设置为内部 BOOT 模式以后,所谓“内部”是相对于“Serial Down
[单片机]
聚焦AI,探析边缘智能新动向,研华AI on Arm合作伙伴会议开启报名!
研华Arm人工智能合作伙伴会议将于3月28日于上海古井假日酒店召开,此次会议将汇集芯片厂家和软件生态合作伙伴,共同探讨Arm平台的AI技术创新及服务升级,开拓边缘智能在多行业全方位的应用机会。 议程一览: 上午主会场:边缘运算未来趋势 迎接新兴产业应用新时代 下午分会场1:硬件设计构建AI可靠基础 下午分会场2:软件服务助力AI应用落地 演讲嘉宾: 本次活动邀请到来自高通,瑞芯微,Hailo,瞰瞰智能,微软,麒麟,海华为各位带来关于生态伙伴AI技术的新成果分享和落地应用经验。 活动亮点: 与业界专家面对面交流,了解Arm平台AI技术的新动态。 分享研华硬件可靠性设计经验,探索工控行业品质标兵。
[工业控制]
Teledyne e2v的四核宇航处理器为星载成像和人工智能提供巨大的推动力
Teledyne e2v外设丰富的四核ARM®Cortex®-A72宇航处理器为星载成像和人工智能提供巨大的推动力 这款高灵活性的耐辐射宇航处理器可帮助实现数据和通信密集型应用 特点 内嵌时钟频率高达1.8 GHz的四核ARM® Cortex®-A72内核 计算性能是现有宇航级计算平台的30倍 配备8通道高速串行接口,包括3个PCIe 内置快速2.1 GT/s DDR4 SDRAM控制器 总电离剂量为100 krad(TID),并经过宇航认证 面向太空飞行的耐辐射的处理器加速太空边缘计算 法国格勒诺布尔 - Media OutReach - 2022年10月18日 - Teledyne e2v很高兴
[工业控制]