HCS08寻址模式与指令集实战:从原理到嵌入式性能优化

HCS08指令集与BGND调试指令深度解析及MC9S08QD4实战应用 指令集是微控制器执行程序的基础,它定义了CPU能够理解和执行的所有操作命令。其工作原理是将高级语言代码编译成特定的机器指令序列,通过不同的寻址模式访问数据,并利用条件码寄存器控制程序流程。掌握指令集的技术价值在于能够进行底层代码优化、精准调试和资源受限场景下的高效编程。在嵌入式开发中,指令集广泛应用于外设控制、实时系统调度和低功耗设计等场景。本文以恩智浦HCS08系列微控制器为例,深入剖析其指令集设计,特别是**BGND指令**在后台调试模式中的关键作用,并结合**MC9S08QD4**的ADC模块,演示如 阅读详情

1. 项目概述:为什么我们需要深入理解寻址模式?

在嵌入式开发的底层世界里,我们写的每一行C语言或汇编代码,最终都要被翻译成微控制器(MCU)能够识别和执行的一串串二进制指令。这些指令要完成计算、跳转、数据搬运等任务,一个核心问题就是: 数据在哪里? 这个“在哪里”以及“如何找到它”的规则,就是寻址模式。

很多刚接触底层开发的朋友,可能觉得寻址模式是枯燥的教科书概念,离实际应用很远。但在我十多年的嵌入式开发生涯里,无数次性能瓶颈的突破和内存危机的解决,都源于对寻址模式的深刻理解和灵活运用。比如,在一个使用MC9S08SF4做电机控制的项目中,主循环里有一段频繁调用的速度计算函数。最初使用扩展寻址,每次计算都要读取完整的16位地址,代码臃肿且执行慢。后来我将其关键变量调整到直接页(Direct Page),改用直接寻址,代码尺寸减少了近10%,循环执行时间缩短了15%——这对于要求实时响应的电机控制来说是质的提升。这就是寻址模式的威力。

HCS08作为Freescale(现NXP)经典的8位微控制器内核,其寻址模式设计在简洁性与灵活性之间取得了很好的平衡。它不像一些更古老的架构那样只有寥寥几种模式,导致编程繁琐;也不像一些复杂指令集那样模式过多,增加学习负担。HCS08提供了一套恰到好处的寻址方式,覆盖了从访问固定常数、快速操作常用变量,到灵活处理数组、结构体乃至动态数据结构的各种场景。

理解HCS08的寻址模式,不仅仅是记住几个名词。它的价值在于:

  1. 写出高效的代码 :知道哪种寻址模式最快、最省字节,能在资源受限的8位MCU上挤出每一分性能。
  2. 精准控制内存布局 :通过合理规划变量地址(尤其是直接页内的变量),可以最大化利用高效的直接寻址。
  3. 深入调试与优化 :当程序出现异常时,能通过反汇编的指令快速判断是数据访问错误还是地址计算错误。
  4. 奠定底层功底 :这是理解计算机体系结构、编译原理乃至更复杂ARM内核MCU的基础。

本文将以MC9S08SF4的参考手册第八章为核心资料,结合我个人的实战经验,为你彻底拆解HCS08的寻址模式与指令集。我们不仅会看“是什么”,更会深究“为什么这么设计”以及“在实际项目中怎么用最好”。无论你是正在学习HCS08的学生,还是希望优化现有8位MCU代码的工程师,相信都能从中获得直接的帮助。

2. HCS08寻址模式深度解析

寻址模式是CPU的“寻路法则”。HCS08的所有资源,包括64KB的线性内存空间(涵盖RAM、Flash、I/O和控制寄存器),都通过统一的16位地址进行访问。这种统一内存映射的好处是极大的灵活性:操作寄存器和操作变量用的是同一套指令。接下来,我们逐一剖析每种模式的内在逻辑和使用场景。

2.1 固有寻址模式:指令自包含的快速操作

固有寻址模式是效率的极致体现。在这种模式下,指令本身已经包含了所有必要的操作数,这些操作数位于CPU内部的寄存器中(如累加器A、变址寄存器X、条件码寄存器CCR),因此CPU无需额外访问内存去获取数据。

核心原理与操作数来源 指令的操作码(Opcode)已经指明了要操作的寄存器。例如, INCA (累加器加1)、 CLRX (清除X寄存器)等指令。执行时,CPU直接从指令译码结果中知道要对哪个寄存器进行操作,然后通过内部数据通路完成运算,整个过程不占用外部总线周期去读写内存,因此速度最快,通常只需1-2个时钟周期。

典型指令与应用场景

  • 寄存器操作 : INCA , DECX , LSRA , TAP (A传送到CCR)等。这些是完成算术、逻辑和数据处理的基础。
  • 栈指针操作 : RTS (子程序返回)、 RTI (中断返回)虽然涉及栈内存访问,但其操作对象(程序计数器PC)的恢复流程是固定的,也属于固有操作的一部分。
  • 控制指令 : NOP (空操作)、 BGND (进入背景调试模式)等。

实操心得 :在编写对时间要求极其苛刻的代码段(如高速ADC采样中断服务程序)时,应优先使用固有寻址的指令。例如,用 INCA 代替 INC $80 (假设A中存有需要递增的计数值),前者1个周期,后者至少5个周期(读-修改-写内存),优势立现。

2.2 相对寻址模式:实现程序流程的灵活跳转

相对寻址是专为改变程序流而设计的,主要用于所有条件分支( BCC , BNE 等)和无条件分支( BRA , BSR )指令。

偏移量计算与地址生成机制 指令操作码后面跟一个8位 有符号 偏移量(范围-128到+127)。CPU执行时,先将这个8位偏移量进行符号扩展为16位,然后与 当前程序计数器(PC) 的值相加,得到目标地址。这里的“当前PC”指向的是 紧跟在偏移量字节之后的那条指令的地址 。

举个例子, BRA LABEL 指令位于地址 $C100 ,占两个字节(操作码 $20 和偏移量)。如果 LABEL 在地址 $C150 ,那么偏移量 = $C150 - ( $C100 + 2) = $4E 。执行时,PC已指向 $C102 ,加上 $004E ,正好跳转到 $C150 。

在分支指令中的关键作用 这种模式的巨大优势在于 位置无关性 。只要跳转目标与当前指令的相对距离不变,无论这段代码被加载到内存的哪个位置,偏移量都是正确的,无需修改。这对于制作可重定位代码(如Bootloader)非常有用。缺点是跳转范围受限在前后约128字节内。

注意事项 :计算分支偏移量时,务必记住PC指向的是 下一条指令 。许多手工汇编时的错误都源于此。现代汇编器会自动帮你计算,但在调试反汇编代码时,理解这个机制至关重要。

2.3 立即寻址模式:将常量直接嵌入指令流

当指令需要操作一个已知的、固定的常数时,立即寻址是最直接的方式。

8位与16位立即数的存储格式 操作数直接作为指令的一部分,存放在操作码之后的内存中。对于8位立即数(如 LDA #$55 ),紧跟操作码的一个字节就是操作数。对于16位立即数(如 LDHX #$1234 ),高位字节( $12 )在前,低位字节( $34 )在后,存放在接下来的两个字节中。

适用场景与性能考量 立即寻址用于加载常数、与常数进行比较、给地址寄存器赋初值等。它的执行速度很快(通常2-3个周期),因为

HCS08 BDC调试协议与硬件断点机制深度解析 在嵌入式系统开发中,调试是定位和解决软件问题的核心环节。其原理依赖于调试器与微控制器(MCU)内部调试模块之间的专用通信协议,实现对程序执行流程和内存状态的实时监控与控制。这项技术的核心价值在于其非侵入性,允许开发者在不停机或最小干扰的情况下,对实时性要求高的应用(如电机控制、通信协议栈)进行诊断。硬件断点作为其中的关键技术,通过专用比较器电路在特定地址匹配时触发中断,相比软件断点更为可靠,尤其适用于在Flash存储器中调试或排查时序敏感型缺陷。本文聚焦于NXP HCS08系列MCU的**后台调试控制器** 阅读详情

相关推荐

HCS08寻址模式与指令集深度解析:从原理到嵌入式代码优化实战

在嵌入式系统开发中,微控制器的寻址模式和指令集是连接高级语言逻辑与底层硬件执行效率的核心桥梁。寻址模式决定了CPU如何定位和访问内存中的数据,其原理直接影响代码的时序、功耗和内存占用。理解立即寻址、直接寻址、变址寻址等不同模式的技术价值,是进行嵌入式代码优化的基础。通过精准运用变址寻址等高效模式,工程师可以在实时控制、传感器数据处理等应用场景中显著提升性能。本文聚焦于NXP HCS08内核,深入剖析其寻址模式与指令集,并结合中断服务程序、低功耗设计等实际工程问题,提供从原理到调试的完整实践指南,帮助开发者编

Golden的专栏 357

HCS08指令集与寻址模式深度解析:从原理到嵌入式实战优化

在嵌入式系统开发中,指令集与寻址模式是理解微控制器底层运行机制的核心。指令集定义了CPU可执行的基本操作,而寻址模式则决定了指令如何访问内存中的数据,二者共同构成了程序执行的基石。深入理解其原理,对于编写高效、可靠的嵌入式代码具有重要技术价值,尤其是在资源受限、实时性要求高的场景,如电机控制、低功耗传感节点等。本文聚焦于NXP经典的HCS08 8位微控制器架构,通过剖析其指令集设计哲学与丰富的寻址模式,结合中断处理、栈操作等关键机制,揭示如何利用这些底层知识进行代码性能优化与深度调试。掌握这些内容,能帮助开

justJavaC的专栏 385

HCS08指令集深度解析:从寻址模式到调试优化实战

指令集是微控制器与开发者沟通的核心语言,它定义了CPU执行操作的基本命令集合。其工作原理基于操作码和寻址模式的组合,CPU通过解码指令来访问数据并执行运算。掌握指令集对于编写高效、可靠的底层代码至关重要,尤其在资源受限的嵌入式系统中,它能直接提升代码执行效率和系统实时性。常见的应用场景包括外设寄存器操作、中断服务程序优化以及内存数据的高效搬运。本文聚焦于NXP HCS08系列微控制器的指令集,深入剖析其寻址模式、操作码映射以及调试机制。通过理解寻址模式,开发者可以优化数据访问路径;而分析指令周期,则有助于进

crazybug1987的专栏 405

HCS08寻址模式与指令集深度解析:嵌入式底层优化实战指南

在嵌入式系统与微控制器(MCU)开发中,寻址模式是连接高级语言与机器指令的核心桥梁,它定义了处理器访问操作数(数据或地址)的具体方式。其原理在于,CPU通过解析指令中的地址字段,结合特定寄存器(如基址、变址寄存器)和偏移量,计算出操作数的有效地址,从而完成数据存取。理解寻址模式的技术价值在于,它能直接决定代码的执行效率和内存占用,是在资源受限的嵌入式环境中进行性能优化的关键。例如,在处理数组遍历、函数调用栈帧访问或硬件寄存器操作等常见应用场景时,选择合适的寻址模式可以显著减少指令周期和代码体积。本文将以NX

469

HCS08 V6 CPU内核寻址模式与CCR寄存器深度解析

在计算机体系结构中,寻址模式是CPU根据指令信息计算操作数有效地址的核心规则,它直接决定了程序访问内存数据的效率与方式。其原理在于通过不同的地址计算规则,如立即寻址、直接寻址、变址寻址等,高效地连接指令与数据存储位置。理解寻址模式的技术价值在于优化代码大小、提升执行速度,并增强对底层硬件的控制能力,尤其在资源受限的嵌入式系统开发中至关重要。其应用场景广泛覆盖了从变量访问、数组遍历到函数栈帧管理等基础操作。本文聚焦于NXP HCS08 V6这一经典8位MCU内核,深入剖析其多达16种的寻址模式及其与**条件码

dayanwu2842的博客 340

深入解析MC9S08MP16:8位MCU的实时控制与低功耗设计实践

在嵌入式系统开发中,微控制器(MCU)是执行实时控制与信号处理的核心。其工作原理基于冯·诺依曼架构,通过CPU、内存和丰富外设的协同,实现对物理世界的精确感知与控制。这种技术价值在于,它能够以极低的成本和功耗,完成复杂的任务,如电机驱动、电源管理和传感器数据采集。应用场景广泛覆盖工业自动化、消费电子和物联网设备。本文聚焦于恩智浦HCS08系列的MC9S08MP16,这是一款高度集成的8位SoC。它通过增强的HCS08 CPU内核、灵活的时钟系统和包括12位ADC、可编程增益放大器(PGA)及高速模拟比较器(

congyaguan5319的博客 407

深入解析ColdFire异常与中断机制:从原理到嵌入式实战

在嵌入式系统开发中,异常处理和中断机制是保障系统稳定性和实时性的核心技术。异常是处理器响应内部或外部特殊事件的通用机制,其核心原理在于当特定事件发生时,处理器会暂停当前任务,保存现场,并跳转到预设的处理程序。中断作为异常的一种,专门用于响应外部异步事件,其技术价值在于实现任务的实时抢占与响应,是构建多任务系统和实时操作系统的基石。在嵌入式领域,尤其是在工业控制、汽车电子等对可靠性要求极高的场景中,精准的异常与中断管理直接决定了系统的健壮性和响应速度。以Freescale ColdFire系列微控制器为例,其

weixin_34377919的博客 361

从优秀到卓越(中文完整版).pdf

从优秀到卓越(中文完整版).pdf从优秀到卓越(中文完整版).pdf从优秀到卓越(中文完整版).pdf从优秀到卓越(中文完整版).pdf从优秀到卓越(中文完整版).pdf从优秀到卓越(中文完整版).pdf

Stable-Baselines3性能优化:多环境训练对比指南(DummyVecEnv vs SubprocVecEnv)

本文深入对比了Stable-Baselines3中DummyVecEnv与SubprocVecEnv两种向量化环境的性能差异与应用场景。DummyVecEnv适用于轻量级、步进快的环境,调试友好且开销低;而SubprocVecEnv则通过真正的多进程并行,能显著加速计算密集型环境的训练。文章通过基准测试与决策树,指导开发者根据环境计算成本、CPU核心数等关键因素做出最优选择,以实现训练效率最大化。

weixin_29063979的博客 147

U8+ 新建账套

一、登录 账套主管:demo 对账套有修改权限,有账套库权限 系统管理员:admin 其他所有权限 二、新建账套 admin登录–>点击系统管理–>账套–>建立 选择了参照已有账套结转期初:就是上一个的期末数据作为这一次新表的期初数据 启用会计期一旦选择更改不了。 ...

茶茶很困i 3693

Android 13 Hotseat定制化修改——001 hotseat布局方向

一.背景由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小,hotseat布局位置,hotseat图标禁止形成文件夹,hotseat图标禁止移动到Launcher...

Java_fenxiang的博客 1101

新手必看:手把手教你如何通过Github提交CVE漏洞(附完整截图流程)

本文为安全研究新手提供了一份详尽的CVE漏洞提交实战指南。文章重点介绍了如何通过Github平台,从漏洞发现、验证、撰写专业报告到最终提交CVE申请的全流程,并附有完整的截图和沟通模板,帮助初学者迈出负责任漏洞披露的第一步。

ttt77的博客 1252

AISHELL-2 中文语音数据库

AISHELL-1 is by far the largest open-source speech corpus available for Mandarin speech recognition research. It was released with a baseline system containing solid training and testing pipelines for Mandarin ASR. In AISHELL-2, 1000 hours of cle

AI_SHELL的博客 7887

当传统CFD遇上AI:PINN如何帮我们省下90%的仿真计算时间?

本文探讨了物理信息神经网络(PINN)在计算流体力学(CFD)中的应用,如何通过无网格方法节省90%的仿真计算时间。PINN将物理定律编码到神经网络中,显著减少传统CFD中的网格生成和计算时间,同时保持高精度。文章还对比了PINN与传统方法的性能,并讨论了其独特优势和当前局限。

weixin_32678995的博客 319

腾讯开源CubeSandbox:为Agent打造可随时丢弃的安全沙箱环境

在人工智能与自动化技术快速发展的今天,智能体(Agent)在执行复杂任务时往往需要独立、完整的计算环境,但环境失控带来的安全风险一直是落地瓶颈。为解决这一痛点,可丢弃式沙箱技术应运而生。它通过轻量虚拟化原理实现环境秒级重建,并严格隔离宿主资源,即使Agent执行了恶意或误操作,也不会波及其他系统。这种技术价值在于平衡了灵活性与安全性,使开发者敢于赋予Agent更多自主操作权限。目前,这类技术已广泛应用于AI编程、自动化测试、数字员工、恶意代码分析等真实场景,成为Agent可靠运行的基石。腾讯开源的CubeS

weixin_42539414的博客 251

微信小程序 - 最新详细实现 “餐厅食堂外卖点餐“ 全屏左右联动菜单列表功能界面,附带搜索框、购物车功能、商品加减计算金额、折扣等,左侧商品分类,右侧列表数据,仿美团饿了么外卖点餐页面,饭店扫码点餐!

微信小程序,vue2,vue3,左右联动菜单,商品分类页面,点餐界面,美团外卖点餐,左右布局界面,饿了么点餐页面,左分类右列表,小程序实现左侧菜单,外卖点餐联动,锚点,点击左侧大类后侧列表跟着变跟着刷新,菜单左右联动效果,左菜单右边列表数据,uniapp,左侧菜单,右侧列表双向联动效果,右侧商品滑动时,右侧列表双向联动效果,侧边菜单和右边滚动条,电商项目,购物车,商品加减计算,外卖选餐页面带购物车计算,自动计算金额,微信小程序外卖点餐界面源码,店铺页面滑动左右联动,点餐类小程序界面,堂食,扫码点餐,餐饮行业

🏆 前端领域优质创作者 5158

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

深度学习工具包 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")

上一篇: 别再死记硬背DXF组码了!用VBA写个‘组码查询器’,5分钟搞定CAD二次开发
下一篇: MC9RS08LA8 LCD驱动模块低功耗配置与工程实践详解
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值