【Cortex-M3】中断处理时栈空间操作过程分析

Cortex-M​ 中断的压栈与出栈操作 这种设计在保证效率的同时,为开发者提供了灵活性,但需注意细节以避免隐蔽的错误(如寄存器未保存导致的变量覆盖)。这是 Cortex-M 架构的重要特性,能显著降低中断延迟并简化代码开发。等指令触发返回),硬件会自动从栈中恢复上述寄存器的值,并跳回中断前的代码位置继续执行。,但具体行为会根据使用场景和配置有所不同。如果中断服务程序(ISR)中修改了 R4-R11。当中断服务程序(ISR)执行完毕(通过。内核响应中断(异常)时,硬件会。(程序状态寄存器)、 阅读详情
AI摘要

本文通过STM32单片机的代码实例,深入分析中断发生时的现场保护及中断退出时的现场恢复机制。重点讲解Cortex-M3处理器在中断过程中对寄存器的压栈与出栈操作,以及如何确保中断服务函数执行后能准确返回中断点。

前言

本文通过一个代码实例深度分析中断发生时,stm32做了哪些操作用于保护现场,中断退出时又做了哪些操作用于恢复现场。

基础知识

Cortex-M3寄存器组如下:
在这里插入图片描述

在【Cortex-M3】C语言函数调用过程汇编层面分析 一文中介绍到,寄存器组中:
R0-R3、R12、LR和xPSR被称为“调用者保护寄存器”,
R4-R11为“被调用者保护寄存器”
这一规则来自AAPCS(ARM架构过程调用标准)。
在函数调用过程中,子函数会保证执行前后R4-R11内容不变,而中断服务函数也是一种子函数,所以在中断发生时,处理器只负责保证在进入中断服务函数前和退出中断服务函数后,R0-R3、R12、LR和xPSR的内容不变,另外处理器需要保证中断服务函数执行完可以跳转回中断发生时的代码位置继续执行。
所以,中断发生时,处理器会首先进行压栈操作,对一些寄存器的内容进行保存,压栈内容如下:
在这里插入图片描述
压栈顺序为:xPSR、返回地址(中断产生时的PC值)、LR、R12、R3、R2、R1、R0。
退出中断时,将这些内容依次出栈,也就恢复到了中断发生前的状态。
接下来通过实验对这一过程进行详细分析。

实验

本实验在stm32单片机上实现了一个外部中断,正常情况下会在主函数中执行,当开发板上的按键被按下时,单片机会产生一个外部中断,并跳转到中断服务函数执行。
主函数:

void mymain()
{
	volatile int a = 1;
	volatile int b = 2;
	volatile int c = 3;
	volatile int d;

	while (1)
	{
		d = a + b + c;
	}
}

外部中断服务函数:

void EXTI0_IRQHandler(void)
{
	int a = 1;
	int b = 2;
	int c = 3;
	int d = 4;
	int e = 5;
	int f;
	
	e = a + b + c + d + e;
	EXTI_ClearITPendingBit(EXTI_Line0);
}

主函数对应汇编代码如下:
在这里插入图片描述

中断服务函数对应的汇编代码如下:
在这里插入图片描述
想查看汇编代码可以设置Keil编译后生成.dis文件。

接下来在中断服务函数开始位置打个断点:
在这里插入图片描述
按下按键触发中断后,显示当前寄存器的状态如下:
在这里插入图片描述
可以看到当前的栈指针SP为0x20000714,接下来用Keil5找到RAM空间中这个位置,内容如下:
在这里插入图片描述
在中断服务函数汇编代码开始处有段如下代码:

0x0800067c:    e92d41f0    -..A    PUSH     {r4-r8,lr}

所以栈指针后面的6个32位数据是这5个寄存器,也就是:

寄存器Value
R40x00000000
R50x20000100
R60x00000000
R70x00000000
R80x00000000
LR0xFFFFFFF9

以上这些寄存器是中断服务函数压栈的,接下来就是处理器在执行中断时自动压栈的,也就是

寄存器Value
R00x00000003
R10x00000003
R20x00000001
R30x28010800
R120x00000001
LR0x08000217
返回地址0x080001E4
xPSR0xFFFFFFF9

查看mymain函数对应的汇编代码,0x080001E4处对应为:

0x080001e4:    4408        .D      ADD      r0,r0,r1

所以中断退出后,首先执行的是mymian函数中的这段代码。

接下来通过单步调试退出中断服务函数,返回到mymain,如下:
在这里插入图片描述
这时寄存器组的内容为:
在这里插入图片描述
可以看到R1-R8、LR、xPSR与中断发生时处理器自动压栈的、中断服务函数开始执行时压栈的内容一模一样,只有R0和PC值不一样,这是因为Keil5是在C语言层面单步执行的,没有在汇编层面单步执行,mymain函数相关位置处的汇编代码如下:

0x080001dc:    e9dd1002    ....    LDRD     r1,r0,[sp,#8]
0x080001e0:    4408        .D      ADD      r0,r0,r1
0x080001e2:    9901        ..      LDR      r1,[sp,#4]
0x080001e4:    4408        .D      ADD      r0,r0,r1
0x080001e6:    9000        ..      STR      r0,[sp,#0]
0x080001e8:    e7f8        ..      B        0x80001dc ; mymain + 16

可以看到中断返回后到断点处,处理器执行了0x080001e4、0x080001e6、0x080001e8三个位置的机器码,在0x080001e4有ADD r0,r0,r1这个操作,正好对应了
R0 = R0 + R1 = 3 + 3 = 6
而 B 0x80001dc 也就对应了将PC赋值为0x80001dc。

总结

中断发生后,压栈行为分两步:
第一步:处理器自动压栈“调用者保护寄存器”,顺序为xPSR、LR、R12、R3、R2、R1、R0。
第二步:中断服务函数首先压栈LR(这时的LR已经和进入中断前的LR不一样了),然后压栈一些用到的“被调用者保护寄存器”R4-R11。

Cortex-M 异常响应序列深度剖析:压栈顺序与取向量时机的设计智慧 Cortex-M处理器的异常响应机制通过硬件自动化设计实现了高效可靠的实时响应。其核心流程包括:硬件自动压栈(保存R0-R3、R12、LR、PC、xPSR共8个关键寄存器)、与压栈并行执行的向量表地址获取,以及最终跳转到异常处理程序。这种设计通过寄存器精选(基于AAPCS调用约定)、堆栈8字节对齐优化和访存操作并行化,在保证确定性的同时最小化中断延迟。异常处理程序执行完毕后,通过BX LR指令触发硬件自动出栈恢复上下文。整个机制体现了嵌入式实时系统对低延迟和可靠性的极致追求,使开发者无需关注底层细节即可获得 阅读详情

相关推荐

STM32的堆和栈

STM32的堆和栈

qq_39854159的博客 5416

32位保护模式下中断发生时的压栈情况

我们知道,中断在发生时,处理器根据收到的中断向量号在中断描述符表中找到相应的中断门描述符。 处理器从该描述符中加载目标代码段选择子到代码段寄存器 cs 及偏移量到指令指针寄存器 EIP。 注意,由于 cs 加载了新的目标代码段选择子,处理器只要发现段寄存器被加载,段描述符缓冲寄存器就会被刷新,因为处理器认为是换了一个段,属于段间转移,也就是远转移。 所以,当前进程被中断打断后,为了从中断返回后能...

Yannie's Blog 3246

Cortex-M3开发经验(三):在HardFault中打印栈信息

Cortex-M3开发经验(三):在HardFault中打印栈信息 在《Cortex-M3开发经验(二):确认发生HardFault的地方》中,我们提到如何查找出错地方。但是这有一个问题,就是必须链接调试器。那么在某些情况下,我们无法连接调试器,那么就无法读取到栈信息了吗?我们可以在进入HardFault时,获取栈指针,然后通过串口的方式打印出来吗? 说干就干,有好的想法,也必须有实际的行动验证自...

食梦者 3940

ARM Cortex-M3中断跳转过程

原文网址:http://home.eeworld.com.cn/my/space-uid-241610-blogid-42786.html 在学习CM3的时候,仔细学习了CM3的中断跳转过程,发现嵌入式的MCU在这一块基本上是一样的,当然不同架构的MCU也有自己的特性。 我来介绍下CM3的中断跳转过程,首先假设中断发生,CM3内核开始响应中断,由于不同厂家的CM3可能略有区别,但CM3

u014581665的博客 1247

Cortex-M0综述概览

Cortex-M0技术综述

Sisyphus415的博客 6113

【嵌入式八股17】Cortex

Cortex-M0 支持大端模式和小端模式,大端模式是指数据的高位字节存储在低地址,小端模式则是数据的高位字节存储在高地址。第 0 位用于控制线程模式的特权级别,0 表示特权级的线程模式,1 表示用户级的线程模式,而 Handler 模式永远都是特权级的。Cortex-M0 系列芯片系统主要由多个关键部分组成,其系统框图展示了芯片内部的架构和各部分之间的关系,以下是系统的主要组成部分:!BASEPRI 寄存器可以屏蔽所有优先级不高于某个具体数值的中断,通过设置该寄存器的值,可以灵活控制中断的响应。

sagima_sdu的博客 1348

Cortex-M系列中断和异常(四)

文章目录1 中断及异常的注意事项1.1 中断及异常的优先级配置1.2 中断与栈空间的关系1.3 向量表重定向情况1.4 软件中断1.5 ARM架构及中断2 函数调用与异常处理的过程2.1 函数调用过程2.2 异常处理过程2.2.1 栈帧2.2.2 EXC_RETURN3 进入异常及返回异常流程3.1 异常进入及压栈3.2 异常返回及出栈4 中断等待和异常处理优化4.1 中断等待4.2 多周期指令执...

xieyuhang727的博客 4879

【RTOS】ARM Cortex-M异常处理过程

Cortex-M3与Cortex-M4 1. 处理器输入、输出和外设访问 一般来说,外设在使用前需要初始化,一般包括以下几步: 如果需要,设置时钟控制回路使能连接到外设和对应引脚的时钟。许多现代微控制器允许对时钟信号分布的精细调节,如使能/禁止到每个外设的时钟连接以节省功耗。外设时钟一般是默认关闭的,需要在编程外设前使能时钟。有些情况下,可能还需要使能外设总线系统的时钟。 有些情况下,可能还需要配置I/O引脚的操作模式。大多数微控制器都有复用的I/O引脚,可用于多种目的。为了使用外设,配置I/O引脚以匹配

Hanrui的博客 1935

Cortex-M3深入理解

本文介绍了ARM Cortex-M3/M4处理器的核心架构特性,主要内容包括: 存储器模型:详细解析了4GB线性地址空间的分配方案,包括代码区、SRAM区、外设区等,并解释了启动模式与地址映射的关系。 栈机制:阐述了双栈指针设计(MSP/PSP)的原理及在RTOS中的应用,说明了栈在函数调用、中断处理中的关键作用。 异常处理:重点分析了PendSV和SVC两种系统异常的运作机制及其在任务调度、系统调用中的核心作用。 存储器保护:介绍了MPU单元如何实现内存区域隔离和访问权限控制,保障系统安全性。 寄存器架构

贾saisai的博客 1133

STM32 Cortex-M3 中断与函数调用栈对比:3 个关键差异与调试实践

本文深入分析了STM32 Cortex-M3架构下中断处理与函数调用在栈操作、寄存器保存和返回机制上的3个关键差异,并提供了实用的调试实践。通过对比普通函数调用遵循的AAPCS规范和硬件自动完成的中断处理机制,帮助开发者更好地理解底层运行原理,提升嵌入式系统调试效率。

weixin_34252686的博客 374

从零构建:STM32与EC800 4G模块的工业物联网数据透传实战

本文详细介绍了如何从零构建STM32与EC800 4G模块的工业物联网数据透传系统。内容涵盖硬件选型、抗干扰电路设计、AT指令稳定性优化、网络连接管理、可靠数据透传协议以及低功耗策略,为开发者提供了一套可直接应用于工业场景的完整实战方案。

uran的专栏 1014

避开嵌入式开发大坑:深入理解Cortex-M3中断对栈空间的‘隐形’消耗

本文深入探讨了Cortex-M3中断处理过程中对栈空间的‘隐形’消耗问题,揭示了中断嵌套导致的栈溢出风险。通过分析自动压栈机制、提供栈溢出诊断技巧和优化策略,帮助开发者精准计算栈需求并有效管理资源,避免嵌入式系统崩溃。

weixin_30839881的博客 450

步进电机原理及梯形加速算法

步进电机重理解与梯形加速算法

weixin_39912966的博客 1323

关于 Cortex-M3 的双堆栈机制

寄存器简介 Cortex-M 系列 CPU 的寄存器组里有 R0~R15 共 16 个通用寄存器组和若干特殊功能寄存器,如下图所示。下图中我看可以看到MSP和PSP两个堆栈指针寄存器。 通用寄存器组里的 R13 作为堆栈指针寄存器 (Stack Pointer,SP);R14 作为连接寄存器 (Link Register,LR),用于在调用子程序时,存储返回地址;R15 作为程序计数器 (Program Counter,PC),其中堆栈指针寄存器可以是主堆栈指针(MSP),也可以是进程堆栈指针(P.

挨踢农民的博客 3404

前导0预测(Leading-Zero Anticipator,LZA)

前导0预测(Leading-Zero Anticipator,LZA) 浮点加法在完成之后会进行尾数规格化移位,而在进行尾数加法时,可以使用前导0预测(Leading-Zero Anticipator,LZA)同时计算移位,前导0预测只发生在一个正数加上一个负数的情况下,电路图如图1所示。 图1 传统LZD算法和LZA算法 1. 基础算法 算法的目标是计算出加法结果序列左边连续0的数量,下文中对...

crw1111111的博客 7379

CMM软件:PC-DMIS汽车制造二次开发

PC-DMIS 是一种广泛应用于坐标测量机(CMM)的测量软件,它不仅提供了强大的测量功能,还支持用户通过二次开发来扩展其功能。二次开发可以显著提升测量效率,满足特定的测量需求,减少重复性工作,提高数据处理和分析的准确性。本节将介绍 PC-DMIS 二次开发的基本概念、开发环境的搭建以及开发中常用的工具和方法。PC-DMIS 二次开发为用户提供了强大的工具,可以显著提升测量效率、减少重复性工作并提高数据处理和分析的准确性。

kkchenjj的博客 1814

RTX4 源码分析——Cortex-M3

keil 4.7附带的 RTOS 源码

Cjsyrzy的博客 1265

[Dify] 如何在Dify中解析上传的TXT文件内容

在Dify平台上构建智能应用时,解析用户上传的.txt文件是关键步骤。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 2637

从零构建:Cortex-M3中断处理中的栈帧艺术与调试实战

本文深入探讨Cortex-M3中断处理中的栈帧机制与调试实践,详细解析硬件自动压栈过程、寄存器保护策略及栈空间管理。通过STM32实战案例,展示如何利用Keil调试工具分析栈内存和中断响应,提供栈溢出检测与中断延迟测量等高级调试技巧,帮助开发者提升系统稳定性和性能。

qqq44的博客 618

学Simulink——控制执行场景实例:基于Simulink的智能车辆电子稳定控制(ESC)仿真

本文完成了基于 Simulink 的智能车辆电子稳定控制(ESC),实现了:✅ 构建含轮胎非线性的车辆动力学模型✅ 设计滑模横摆稳定性控制器✅ 实现四轮制动力分配逻辑✅ 验证在双移线低附着场景下的卓越稳定性✅ 为主动安全控制系统开发提供完整范式。

xiaoheshang_123的博客 528

PHP实现获取当地网络时间​(附完整源码)

PHP实现获取当地网络时间​(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 237

STM32-Cortex-M3存储映射深度解析

摘要: Cortex-M3处理器采用32位地址总线,提供4GB寻址空间(0x00000000-0xFFFFFFFF),通过存储器映射实现硬件资源的统一访问。核心区域包括:1) Code区(512MB)映射Flash存储器,存储程序代码和常量;2) SRAM区(512MB)用于运行时数据,包含栈、堆和变量存储;3) Peripherals区(512MB)映射外设寄存器;4) External RAM区(1GB)支持外部存储扩展。存储器映射的关键在于硬件地址译码和软件访问机制的配合,通过VTOR寄存器实现向量表

2401_85638163的博客 1855

ROS机器人未知环境自主探索功能包explore_lite总结

本系列文章主要针对ROS机器人常使用的未知环境自主探索功能包explore_lite展开全源码的详细解析,并进行概括总结。 本系列文章共包含六篇文章,前五篇文章主要介绍explore_lite功能包中 explore.cpp、costmap_tools.h、frontier_search.cpp、costmap_client.cpp等源码实现文件中全部函数的详细介绍,第六篇文章进行概括总结,包含自主探索功能包explore_lite的简介,实现未知环境自主探索功能的原理及流程总结,效果演示,使用功能包exp

慕羽★的博客 4461

ARM Cortex-M3/M4内核架构:中断处理过程

ARM Cortex-M3/M4内核架构:中断处理流程

2301_80348599的博客 2959

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Cortex-M3开发经验:确定发生HardFault的地方

Cortex-M3开发经验(二):确定发生HardFault的地方 我们在调试时,最害怕就是出现HardFault错误了。因为我们不知道是从哪个地方跳到这里的?单步调试起来太过于麻烦,特别在代码量大的时候,更是费时间。 那么有没有一种方法,可以快速定位到发生HardFault错误的代码位置(函数)呢?Cortex-M3中断/异常的响应过程我们知道,HardFault实质上是一个中断,中断的过程如下图: 在这里我就有一个疑问了:既然FUNC1和IRQ_Handler之间不存在调用关系,那IR..

自由的天空 1097

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Cortex-M3/M4权威指南:第八章深入了解异常处理

本章对大多数开发人员不重要,但是对了解异常和中断的调试很有用。中断等待表示从中断请求开始到中断处理开始执行间的时间。对于Cortex-M3和Cortex-M4处理器,若中断系统为零等待的,而且假定系统设计允许取向量和压栈同时执行,则中断等待为12个周期,其中包括寄存器压栈、取向量以及取中断处理的指令。不过多数情况,都不止12个周期。

Dacvcv的博客 347

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 【Cortex-M3】C语言函数调用过程汇编层面分析
下一篇: 【CMake】CMake入门(一)
inputA
博客等级 码龄7年 297粉丝 44原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值