硬断点和软断点的区别

软件断点和硬件断点 这些断点对于调试程序非常有用,因为它们允许你在特定的代码位置暂停程序执行,从而可以检查程序的状态和变量。(设置断点)命令在特定的写入函数上设置断点,然后在断点命中的时候检查写入的值和地址。处理器断点(也称为硬件断点或数据断点)和软件断点是调试过程中用来暂停程序执行的两种主要类型的断点。通过这些命令,你可以非常灵活地控制程序的执行,以便在关键点检查程序状态,这对于诊断复杂的程序行为和错误非常有帮助。:当断点命中时,检查传递给函数的参数,确定它们是否与你想要监控的内存地址和大小相匹配。否则,直接继续执行。 阅读详情

转自macrossdzh

硬断点--break point

软断点--assert

 

简单的解释:

硬件断点:硬断点需要硬件寄存器提供支持,断点的数目受Embedded ICE中的Watchpoint数目的限制,但是可以在任何地方设置断点。

软件断点:软件断点通过在运行起来的程序中设置特征值实现,其数目不受限制,但是一般情况下软件断点只能在可写的存储器的地址中设置(比如:RAM),而不能在ROM(比如:Flash)中设置。 

断点可分为硬件断点和软件断点两大类: 
       1.硬件断点需要目标CPU的硬件支持,当前流行的ARM7/9内部硬件设计提供两组寄存器用来存贮断点信息,所以ARM7/9内核最多支持两个硬件断点,而ARM11则可以支持到8个硬件断点.这与调试器无关.
       2.软件断点则是通过在代码中设置特征值的方式来实现的.当需要在某地址代码处设置软件断点的时候,仿真器会先将此处代码进行备份保护,然后将预先设定好的断点特征值(一般为0x0000等不易与代码混淆的值)写入此地址,覆盖原来的代码数据.当程序运行到此特征值所在的地址时,仿真器识别出此处是一个软断点,便会产生中断.当取消断点时,之前受保护的代码信息会被自动恢复.
     硬件断点可以设置在任何位置的代码上,包括ROM和RAM;而软件断点由于需要修改相应地址的值,所以一般只能设在RAM上,但是数量可以不受限制.由于硬件断点设置的灵活性,所以是最优先选用的断点资源,但是两个断点往往很难满足工程师进行深入调试的需要,于是软件断点可以作为硬件断点的补充资源来使用.
     由于通常的软件断点只能设在RAM运行的代码上,而随着系统的代码量越来越大,特别是在移动通信领域,扩充大容量的RAM势必会增加产品的成本,所以现在很多系统直接在FlashROM上运行代码.对于这种在FlashROM上运行代码的系统,一般的软件断点是无法设置的,这也是软件断点的局限性.对于这样的系统,只能通过交替使用两个硬件断点满足需要,但是会带来一定的不便. 要很好的解决这一矛盾,只有使仿真器增加在FlashROM上设置软件断点的功能,拓展仿真器中可供利用的断点资源. 在FlashROM上设置软件断点的原理与在RAM上设置软断点类似,也是在设定的断点处用特征码替换原有代码,通过识别特征码使断点事件发生.不同的是,在FlashROM上设置软件断点需要对Flash进行擦写操作,这就需要仿真器能够有Flash编程功能,并且能够在尽可能短的时间内完成特征码的写入.完成这一系列的读写操作,就可使在FlashROM上调试代码的工程师获得更充裕的断点资源,从而大大提高了开发效率.
       但是,由于对Flash进行擦写需要一定的时间,所以在执行到Flash断点的时候会感觉到有一个停顿的时间.虽然这一点比RAM上的软件断点要差些,但是相对于给工程师调试工作整体上带来的便利而言,这一点是完全可以接受的.
设置断点进行调试是最基本的一种调试手段,选择具有丰富断点资源的ICE仿真器,可以明显地提高调试效率.当然,前提是工程师能够灵活使用各种断点资源.

 

下边这段话引自《ARM JTAG 调试原理》,可以从具体实现上理解:
     (1)WP Address Value/Mask Register和硬件断点
     断点是用来标识某个地址上的指令的,所以要将一个WATCH POINT用作断点设置,首先需要将WP Control Value寄存器的nPOC位置0,用来表示:只有在当前的周期是进行取指令的条件下,才触发断点。要在一个地址设置一个断点,可以通过WP Address Value/Mask这两个寄存器来实现。假设,要在地址0x0040设置一个断点,可以将WP Address Value寄存器的值设置为0x0040,同时将WP Address Mask寄存器的值设置为0x0。另外,将WP Data Mask设置为0xFFFFFFFF,这样可以屏蔽掉WP Data value寄存器的影响,在进行比较的时候,只考虑地址是否匹配。这样,每次ARM7TDMI从地址0x0040取指令的话,不管该指令是什么,断点就会被触发,ARM7TDMI会暂停当前的运行,自动进入调试状态,要清除该断点的话,只要改变WP Address Value寄存器的值,或者设置WP Control Value寄存器,禁止该功能。如果你想在所有地址的低16位的值为0x0040的地方设置断点,可以配合使用WP Address Mask寄存器,  将它的值设置为0xFFFF,0000,这样的话,每次比较的时候,高16为的地址就会被屏蔽掉。其实这种使用方式应该是比较少的,比较多的情况是,屏蔽掉最低2位或者最低1位的地址。在ARM状态下,因为ARM指令的长度是32位的,所有指令地址的最低2位必须为0,所以,如果在ARM状态下,一般将WP Address Mask的低2位置1,在进行地址比较的时候,屏蔽掉地址低最低2位,确保断点是被设置在正确的地址上;如果类似,如果是在THUMB状态下,一般需要将WP Address Mask的最低1位置1。上面描述的是第一种设置断点的方式,这种方式是通过地址比较来实现断点的。这也是我们常说的硬件断点,这类断点可以被设置在任何地址(包括FLASH和SDRAM)。因为ARM7TDMI提供了两组WP Address Value/Mask寄存器,所以,可以支持两个硬件断点。下面让我们来看看断点的另外一种实现方式。
     (2)WP Data Value/Mask Register和软件断点
     在调试过程当中,通过WP Data Value/Mask寄存器也可以实现断点设置。利用WP Data Value/Mask如何实现断点设置呢? 和硬件断点的设置一样,首先需要将WP Control Value寄存器的nPOC位置0,用来表示:只有在当前的周期是进行取指令的条件下,才触发断点。 然后,将WP Address Mask寄存器的值设置为:0xFFFFFFFF, 这样可以屏蔽掉WP Address value寄存器的影响,在进行比较的时候,只考虑数据是否匹配。接下来,将WP Data Value寄存器的值设置为一个固定的值,例如:0xDEDEDEDE,将WP Data Mask寄存器的值设置为0x00000000。在需要设置断点的地方,将其内容替换为0xDEDEDEDE。这样,一但程序运行到该位置,尝试从该位置取指令或者数据的时候,因为取得的数据值和WP Data Value寄存器的值相同,ARM7TDMI会暂停当前的运行,自动进入调试状态。要清除该位置上的断点,我们只需要将该位置原来的指令恢复就可以了。这样,退出调试状态后,程序可以继续正常的运行。通过WP Data Value/Mask寄存器,我们可以在任何需要设置断点的地方,将其内容替换为一个固定的序列,就可以达到设置断点的目的。这种断点就是我们通常所说的软件断点。软件断点的设置方式使得ARM7TDMI可以支持任意数量的软件断点。但也决定了软件断点的局限性:软件断点不能设置在ROM/FLASH里面。因为软件断点的实现需要替换要设置断点的位置的内容,这点在ROM/FLASH做不到。(虽然从某种意义上来说,FLASH也是可读写的,但是需要特殊的指令)。

 

参考:

http://hi.baidu.com/leetonhill/blog/item/84e9cb4635c9f03286947358.html

http://www.cnblogs.com/dongdonghuihui/archive/2010/04/13/1711030.html

 

硬件中断和软件中断的区别,以及工作原理和流程是怎样的? 硬件中断是由外部设备或硬件事件触发的异步信号,用于通知CPU需要处理某个事件。例如:键盘按下按键。网络数据包到达网卡。定时器超时。软件中断是由程序主动触发的同步事件,通常用于实现系统调用、异常处理或任务切换。例如:在Linux中,用户程序通过软件中断(如int 0x80或syscall指令)请求内核服务。在嵌入式系统中,软件中断可以用于任务调度。 阅读详情

相关推荐

通过硬件断点对抗hook检测

前言 我们知道常见的注入方式有IAT hook、SSDT hook、Inline hook等,但其实大体上可以分为两类,一类是基于修改函数地址的hook,一类则是基于修改函数代码的hook。而基于修改函数地址的hook最大的局限性就是只能hook已导出的函数,对于一些未导出函数是无能为力的,所以在真实的hook中,Inline hook反而是更受到青睐的一方。 hook测试 这里我用win32写了一个MessageBox的程序,当点击开始按钮就会弹窗,这里我写了一个Hook_E9函数用来限制对Message

hongduilanjun的博客 2852

硬件中断和软件中断的区别?

一、指代不同 1、硬件中断:指向量中断,即中断源的识别标志,可用来存放中断服务程序的入口地址或跳转到中断服务程序的入口地址。 2、软件中断:指软中断,是利用硬件中断的概念,用软件方式进行模拟,实现宏观上的异步执行效果。 二、中断方式不同 1、硬件中断:每个中断向量分配4个连续的字节单元,两个高字节单元存放入口的段地址CS,两个低字节单元存放入口的段内偏移量IP。 2、软件中断:上半部在屏蔽中断的上下文中运行,用于完成关键性的处理动作;而下半部则相对来说并不是非常紧急的,通常还是比较耗时的,因此由系统自行安排

u013750244的博客 1万+

Anlogic Future Dynasty工具介绍及其工程建立

Anlogic Future Dynasty(FD)是基于Eclipse平台开发的软件设计工具,支持SF1器件、支持eMCU IP等开发。下面将以SF1器件为例,建立GPIO工程。

wangkuijun 2170

硬件断点和软件断点的区别

硬断点--break point软断点--assert 简单的解释:硬件断点:硬断点需要硬件寄存器提供支持,断点的数目受Embedded ICE中的Watchpoint数目的限制,但是可以在任何地方设置断点。软件断点:软件断点通过在运行起来的程序中设置特征值实现,其数目不受限制,但是一般情况下软件断点只能在可写的存储器的地址中设置(比如:RAM),而不能在ROM(比如:Flash)中设置。 断点可...

D_R_L_T的博客 6356

图解说明ARM仿真器与目标板JTAG引脚连接方法

详细介绍ARM仿真器如何通过JTAG接口连接目标板,结合图解清晰展示各引脚对应关系,确保调试连接稳定可靠,是嵌入式开发中掌握ARM仿真器应用的基础步骤。

weixin_42527665的博客 546

把 SAP HANA 备份与恢复看成一条链:技术范围、依赖关系与设计边界

SAP HANA备份恢复机制的核心在于构建完整的备份链条,而非单个备份文件。数据备份提供恢复基点,日志备份实现连续回放,备份目录则记录元数据与依赖关系。真正的可恢复性取决于三点:存在时间戳≤T的数据备份、从该备份到T的完整日志链、以及能验证链条的备份目录。常见误区包括将数据备份频率等同于恢复能力、忽视日志链连续性要求等。恢复窗口由日志链覆盖范围决定,而非数据备份数量。该机制要求将备份策略设计为完整的链条体系,而非孤立的备份点集合。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 241

浅谈ARM仿真器中的断点资源

<br />Q:RT,平时仿真调试的时候要用断点,但是发现好象一般象IAR,ADS的话好象只支持你设置2个断点(在想设置断点的地方按鼠标右键设置),如果多了的话就无法单步执行了。如果这种断点是硬件断点的话,那么外面经常说的软件断点又是什么呢?应该怎么设置软件断点呢? <br />Q1:你试试用H-jtag加wiggler(使用IAR),我用它可以设好几个断点,也可以单步运行. 在H-jtag的作者的一篇“ARM JTAG 调试原理.pdf”有详细说明断点的实现原理等。有介绍软断点和硬断点的。 <br />Q

TT的小窝 1354

Android车载多屏开发实战:从零搭建同显/异显Demo(附源码)

本文详细介绍了Android车载多屏开发的实战经验,从零搭建同显/异显Demo,涵盖多屏模拟、核心API调用、同显/异显架构实现及性能优化等关键环节。通过C++构建完整开发链路,帮助开发者快速掌握多屏同显和多屏异显技术,提升智能座舱系统的交互体验。附源码供参考。

weixin_29233857的博客 404

breakpoint,watchpoint, catchpoint的区别

Abreakpointmakes your program stop whenever a certain point in the program is reached. For each breakpoint, you can add conditions to control in finer detail whether your program stops. You can set ...

CPriLuke的博客 1360

不用买显示器!用USBMMID虚拟显示器软件在Win10上扩展4个屏幕(保姆级教程)

本文提供了一份详细的保姆级教程,指导用户如何在Windows 10系统上,无需购买额外硬件,通过USBMMID虚拟显示器软件扩展出多达4个虚拟屏幕。文章深入解析了虚拟显示器的核心原理,并基于微软IDD框架,手把手教学从软件获取、环境检查到安装配置的全过程,帮助开发者和多任务用户构建高效、免费的虚拟多屏工作站,实现生产力的飞跃。

backprop5master的博客 660

具身智能的边缘计算核心构成方案

摘要: 具身智能(Embodied Intelligence)依赖物理实体与环境交互,而边缘计算(Edge Computing)通过本地化数据处理降低延迟、提升实时性。两者结合的核心方案包含五层架构:传感器层采集环境数据,边缘处理单元执行本地计算,通信模块实现低延迟传输,决策引擎运行轻量AI模型,执行器接口转化动作为物理操作。该方案以“边缘优先”为原则,满足毫秒级响应(如延迟<50ms),同时优化能效(功耗降低30%)和隐私保护。适用于机器人、自动驾驶等场景,通过分层闭环设计确保在资源受限环境中的可靠

老郑的博客 812

GDB再学习(5.1):常用指令介绍_print/display_查看变量或寄存器中的值

文章目录1 说明2 代码准备3 指令测试3.1 显示某个变量的值 print /d i3.2 显示某个变量的地址 print /a &i4 高级用法5 display 1 说明 print指令可以查看某个变量的值或者地址。 print的用法为: print /fmt expression 其中,fmt表示显示的格式,如下: 指令 说明 x 16进制 d 有符号的10进制,默认格式 u 无符号的10进制 o 8进制 t 2进制 a 地址 c 字符 f

Stoneshen的博客 3015

你学Simulink--基于储能系统的建模与仿真场景:飞轮储能系统在电网调频中的作用仿真

本文详细介绍了利用Simulink+Simscape搭建飞轮储能系统(FESS)电网调频仿真模型的全过程。主要内容包括:系统工作原理及调频作用分析,基于Simulink的模块化建模步骤(飞轮、电机/发电机、功率电子接口等组件搭建),调频控制策略实现(频率检测、功率指令生成和模式切换),以及仿真参数设置与结果分析方法。该模型可有效模拟FESS在电网频率调节中的快速响应特性,为新能源存储和智能电网研究提供重要仿真工具,同时可通过参数优化和算法改进进一步提升系统性能。

xiaoheshang_123的博客 168

硬中断和软中断

本文主要内容:硬中断 / 软中断的原理和实现 内核版本:2.6.37 Author:zhangskd @ csdn blog   概述   从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。 如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己正在做的事, 跳

华的专栏 592

【史上最全面esp32教程】网络篇和tcp/ip的使用

ESP32史上最全面wifi和tcp/ip连接及示例程序

m0_62599305的博客 9522

STM32入门教程:水位传感器应用

这是一个简单的STM32水位检测系统的入门教程。希望通过学习本教程,您能对STM32微控制器的基本应用有更深入的了解,并能成功构建一个水位检测系统。如果您需要更详细的代码实例和教程,请参考相关的STM32开发手册和应用笔记。STM32是一款功能丰富且广泛应用于嵌入式系统的微控制器系列。在本教程中,我们将介绍如何使用STM32微控制器和水位传感器构建一个水位检测系统。

wx_linying1029的博客 533

一次面试===

被巨巨面试了。。。。。 不过整体来讲还是感觉到了自己的缺点 我学习一个东西的时候 一般知识点延申的时候 我就去转手其它知识 然后知识点连成片的时候 再去往下延申就会很简单。。。。。。 但是 有一点就比较糟糕 经常会忘了回头来延申==== 一开始 提了一下 知道那些断点 区别是什么 断点有 软件断点 硬件断点 还有 内存断点 这个我刚开始学逆向的时候就 ...

qq_41071646的博客 421

22、嵌入式软件随机延迟生成与加密算法防护技术

本文探讨了嵌入式软件中的随机延迟生成方法与块密码软件实现的高阶掩码及洗牌技术。重点介绍了浮动均值延迟生成方法,其在8位AVR平台上的实现效率为Θ(1),显著提升了抗相关功率分析(CPA)攻击的能力,相比传统方法更安全且轻量。同时,分析了高阶掩码与洗牌技术结合的方案,通过理论建模量化其对高级差分功率分析(DPA)攻击的抵抗能力,并以AES为例展示了该方案的应用流程。最后对比了不同防护技术在安全性与开销之间的权衡,为实际应用中选择合适的安全策略提供了依据。未来可进一步优化实现效率并融合多种防护手段以应对复杂安全

fern8的博客 88

调试软件和硬件

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34415923的博客 670

【AI工具】免费获取各类AI大模型APIKEY的使用教程,以硅基流动+Deepseek为例

【AI工具】免费获取各类AI大模型APIKEY的使用教程,以硅基流动+Deepseek为例

funfan的博客 4263

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

linux ptrace 图文详解(七) gdb、strace跟踪系统调用

本文介绍了gdb、strace通过ptrace监控被调试程序的所有系统调用的实现原理。

h_b__k的博客 1194

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

oracle pc开发环境,FS_S5PC100平台ARM开发及环境搭建

学习ARM开发的第一件事就是先搭建编程环境,如今有非常多的IDE以及调试软件/仿真硬件,但能支持Cortex-A8的低价仿真器很少。本文介绍一种能仿真FS_S5PC100的低成本仿真器,目前价格不超过200元。一、 OpenJtag仿真器介绍目前市面上的仿真器数量众多,并且价格也有很大差异,如Keil ,IAR,RowleyAssociates等,它们的安装使用很便利,并且功能强大,但是价格很贵,...

weixin_39631370的博客 315

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

深度学习工具包 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'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('DeepLearnToolbox'));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('state',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'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',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 = 'sigm';%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, 'Too big error');```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('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';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)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';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, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% 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'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 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, 'Too big error');```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('state',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, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',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, 'Too big error');%% ex3 neural net with dropoutrand('state',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, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % 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, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % 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, 'Too big error');%% 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('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % 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, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

eSOL RTOS实战指南:eT-Kernel任务调度与调试器支持深度解析

嵌入式实时操作系统(RTOS)是汽车电子与工业控制等高可靠场景的基石,其核心价值在于通过确定性任务调度与同步互斥机制,实现对多任务并发行为的精确管理。与裸机开发不同,RTOS项目的可观测性至关重要,调试器对内核数据结构的感知能力直接影响问题定位效率。当系统面临复杂资源共享、优先级反转或偶发任务挂起时,开发者需要借助任务视图、内核对象视图及事件追踪等工具,理解系统宏观状态而非仅看单个变量。本文基于eSOL eT-Kernel的工程实践,从任务模型、调度机制、中断协作到RTOS感知调试配置,系统梳理真实项目中的

weixin_33785108的博客 442
上一篇: UEFI BIOS ROM文件格式
下一篇: 深入理解C语言指针的奥秘
LifeIce
博客等级 码龄14年 10粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值