C语言程序运行在嵌入式中的方式

嵌入式开发实战:从C代码到硬件运行的完整流程解析 在嵌入式系统开发中,理解从高级语言到硬件执行的完整转换链是工程师的核心能力。其基本原理涉及计算机体系结构中的指令集架构,不同的处理器(如x86与ARM)拥有互不兼容的机器指令。为实现跨平台运行,需要借助交叉编译技术,将主机上编写的C语言源代码翻译为目标硬件可识别的机器码。这一过程的技术价值在于打通了软件逻辑与物理硬件的桥梁,是实现智能设备、物联网终端等嵌入式产品的基石。其关键环节包括利用链接器脚本进行精确的内存布局规划,以及通过烧录工具将最终的二进制镜像注入芯片存储。本文将以ARM Cortex-M开发为例 阅读详情
        我们所做的程序最后都是要放到设备中运行的,鉴于嵌入式设备的特殊性,它的程序在运行方式上和PC机上还是有一些不同,今天就来给大家总结一下:
        RAM调试运行:即在程序的调试阶段将主机的映像文件直接放置到目标系统的RAM中。此时,RAM既是程序的存储空间,也是程序的运行空间。 
        在嵌入式系统中,这是一种常用的调试方式(非通常的运行方式)。在通常的运行方式下,程序运行的起始地址一般不可能是RAM。RAM在掉电之后内容会丢失,因此系统上电的时候,RAM中一般不会有有效的程序。但是在程序的调试阶段,可以将程序直接载入RAM,然后在RAM的程序载入地址处运行程序。下图是嵌入式系统RAM中的调试程序的内存布局:

        

        这是一种相对简单的形式,因为代码段的存储地址和运行地址是相同的,都是RAM(SDRAM或者SRAM)中的地址。在这种情况下,程序没有运行初始化阶段加载的问题。 从主机向目标机载入程序的时候,程序映像文件中代码段(code或text)、只读数据段、读写数据段依次载入目标系统RAM(SDRAM或者SRAM)的空间中。程序载入到目标机之后,将从代码区的地址开始运行,在运行的初始化阶段,将开辟未初始化数据区,并将其初始化为0,在运行时将动态开辟堆区和栈区。
        在没有操作系统的情况下,开辟内存的工作都是由编译器生成的代码完成的,实现的原理是在映像文件中加入这些代码。主要工作包括:在程序运行时根据实际大小开辟未初始化的数据段;初始化栈区的指针,这个指针和物理内存的实际大小有关;在调用相关函数(malloc、free)时使用堆区,这些函数一般由调用库函数实现。下表列出了C语言程序在RAM中的调试过程:

       

        小结:程序直接载入RAM运行时,程序的加载位置和运行位置是一致的,因此不存在段复制的问题,需要在初始化阶段开辟未初始化区 域,在运行时使用堆栈。
        固化程序的XIP运行:固化应用是一种嵌入式系统常用的运行方式,其前提是目标代码位于目标系统ROM(Flash)中。ROM中的区域包括映像文件的代码段(code或text)、只读数据段(RO Data)、读写数据段(RW Data),如下图所示:

        

        代码的运行也是在ROM(Flash)中,因此,在编译过程中代码的存储地址和运行地址是相同的,由于上电时需要启动,因此该代码的位置一般是(0x0)。在这种应用中,一件重要的事情就是将已初始化读写段的数据从Flash中复制到SDRAM中,由于已初始化读写段既需要固化,也需要在运行时修改,因此这一步是必须有的,在程序的初始化阶段需要完成这一步。
        一般来说,在编译过程中需要定义读写段和未初始化段的地址。在程序中可获取这些地址,然后就可以在程序的中加入复制的代码,实现读写段的转移。下表列出了C语言程序的XIP运行过程:

       

        小结:程序在ROM或者Flash中以XIP形式运行的时候,不需要复制代码段和只读数据段,但是需要在RAM中复制读写数据 段,并另辟未初始化数据段。
        固化程序的加载运行:在某些时候,在存放程序的位置是不能运行程序的,例如程序存储在不能以XIP方式运行的Nand-Flash或者硬盘中,在这种情况下,必须将程序完全加载到RAM中才可以运行。固化程序加载运行的内存布局如下图所示:

        

        依照这种方式运行程序,需要将Flash中所有的内容全部复制到SDRAM或者SRAM中。在一般情况下,SDRAM或者SRAM的速度要快于Flash。这样做的另外一个好处是可以加快程序的运行速度。也就是说,即使Flash可以运行程序,将程序加载 到RAM中运行也还有一定的优势。
        这样做也产生了另外一个问题:代码段的载入地址和运行地址是不相同的,载入地址是在ROM(Flash)中, 但是运行的地址是在RAM(SDRAM或者SRAM)中。对于这个问题,不同的系统在加载程序的时候有不同的解决方式。
C语言固化程序的加载运行过程如下表所示:

        

        小结:固化程序在加载运行时,需要复制代码段、只读数据段和读写数据段到RAM中,并另辟未初始化数据段,然后在RAM中运行程序(执行代码段)。
        以这种加载方式的运行程序,另外一个重要的问题是:如何把代码移到RAM中。在有操作系统的情况下,代码的复制工作是由操作系统完成的,在没有操作系统的情况下,处理方式相对复杂,程序需要自我复制。显然,这种方式实现的前提是代码最初放置在可以以XIP方式执行的内存中。
        程序本身复制的过程也是需要通过程序代码完成的,这时需要程序中的代码根据将包含自己的程序从ROM或者Flash中复制到RAM中。这是一个比较复杂的过程,程序的最前面部分是具有复制功能的代 码。系统上电后,从ROM或者Flash起始地址运行,具有复制功能的代码将全部代码段和其他需要复制的部分复制到RAM中,然后跳转到RAM中重新运行程序。
        固化程序加载复制和跳转过程如下图所示:

       

        在代码的前面一小部分是初始化的内容,这部分内容中有一部分是复制程序,这段复制程序将代码段复制至RAM中,当这段初始化程序运行完成后,将跳转到RAM中的某个地址运行。

嵌入式开发中的绝对地址函数调用技术解析 函数指针是C语言中实现回调机制和动态调用的核心技术,通过内存地址间接访问函数代码段。在嵌入式系统中,绝对地址调用常用于访问ROM固化函数或实现系统启动跳转,需要处理特殊的内存模型和调用约定。以C166架构为例,far关键字和特定指令集(如LCALL/RETS)确保了跨内存段的正确调用。这种技术在Bootloader开发、中断向量重定向等场景中具有重要应用价值,但需特别注意栈空间管理和参数传递规则。通过类型转换和编译器扩展语法,开发者可以安全地实现绝对地址函数调用,同时结合调试技巧验证目标地址有效性。 阅读详情

相关推荐

嵌入式开发语言-C语言编程

C语言编程概述环境在Windows上构建C语言的环境安装在Mac上构建C语言的环境安装 概述 “C语言”被称为适合嵌入式系统开发的编程语言之一。 C语言在一般的编程中也是熟悉的开发语言,但实际上,如果试着使用C语言制作微型计算机的控制程序等,就必须使用与“普通的C程序”不同的使用方法。 作为一般的C语言的学习方法,使用“printf”“scanf”等标准函数的程序开发是固定的,但这些都是以UNIX和Windows等环境上的应用程序开发为前提的。 对此,没有显示器和键盘的嵌入式系统的微型计算机控制程序,该如何

编程老王 7976

STM32F407在RAM中执行程序

单片机SRAM运行代码

zhaodong1102的博客 4803

嵌入式系统中的C语言程序运行方式

嵌入式系统是一种特殊的计算机系统,它被嵌入到其他设备或系统中,用于控制、监测或执行特定任务。在本文中,我们将详细讨论嵌入式系统中C语言程序的运行方式,并提供相应的源代码示例。请注意,以上是一个简化的描述,实际的嵌入式系统开发涉及更多的细节和步骤,例如处理外设、中断处理等。一旦我们成功地将C语言程序编译为可执行文件,我们需要将该文件烧录到目标嵌入式系统的存储介质中,以便系统能够加载和执行该程序。在完成烧录后,我们可以启动嵌入式系统,让其加载并执行我们的C语言程序。在上面的示例程序中,我们使用了。

CyberBytezZ的博客 117

嵌入式开发中的绝对地址定位技术与实践

在嵌入式系统开发中,内存管理是核心基础技术之一。通过段(Section)机制和链接器配置,开发者可以精确控制变量在内存中的物理地址,这种绝对地址定位技术对于访问硬件寄存器、管理非易失性存储器等场景尤为重要。以C166编译器为例,其通过HDATA类别管理外部RAM,结合#pragma NOINIT指令可避免变量被意外初始化。工程实践中,这种技术常用于实现电池备份RAM数据持久化、满足特定内存布局要求等场景。合理使用绝对地址定位既能满足硬件交互需求,又能优化内存使用效率,是嵌入式开发中的关键技术手段。

weixin_32744285的博客 245

嵌入式系统中的高级C语言编程技巧

指针是C语言中一种基础且强大的数据类型,用于存储变量的内存地址。一个指针变量可以指向任何类型的数据,比如整数、字符或函数。它提供了一种间接访问内存的方式,允许程序在运行时动态地访问和操作数据。在C语言中,定义指针的语法如下:数据类型 *指针变量名;其中,用于声明指针变量,数据类型表示指针指向的变量类型。以下是一个指针定义的示例:int *p;这行代码声明了一个名为p的指针变量,它可以指向一个int类型的变量。

weixin_42497762的博客 1115

C语言至嵌入式C:编程语言进阶之路

本文还有配套的精品资源,点击获取 简介:《从C到嵌入式C编程语言》为程序员提供了从C语言到嵌入式系统编程的全面指南。书中内容涵盖了C语言的基础知识、指针操作、嵌入式系统开发的关键技能,以及如何控制硬件设备和编写驱动程序。还深入讲解了处理器架构、中断服务、内存管理、I/O操作等高级主题,并探讨了嵌入式系统设计原则、资源优化、低功耗编程和实时操作系统概念。本书分为入门篇、实用篇...

weixin_29363791的博客 1069

嵌入式操作系统组成结构(软硬件之间的联系)--硬件如何执行第一行代码?

引言: 最近纠结了两周决定自己以后还是走爱好的嵌入式方向,细分就是操作系统相关,下一步的目标是从0到1编写 RT-Thread的内核,然后转战嵌入式linux软件驱动开发, 正好之前有做FreeRTOS,但都是偏上层的API函数的调用,这种仅会应用的层面给人带来一种不踏实的虚假感,因此为加强自己对整个系统的理解,一周内恶补了七、八本经典的书籍,针对各本书前几章对整个嵌入式操作系统的架构讲解,自己进行了汇总整理。 本文涉及到的知识有汇编语言 计算机系统结构 操作系统等。 写者叙: 如果在学习讨...

zhouv_的博客 2923

2025年人形机器人产业研究

人形机器人是一种模仿人类外形、动作和行为的机器人,旨在替代或辅助人类完成各种任务。其显著特征包括人类外形、动作模仿和智能交互能力。根据形态和功能,人形机器人可分为小型、中型、大型以及服务型、工业型、救援型和娱乐型等类别。发展历程经历了初始阶段、高度集成系统阶段和突破性进展阶段,技术不断进步。关键技术包括执行系统、控制系统和感知与交互系统,涉及机械结构、运动控制、平衡控制、任务执行控制以及感知与交互能力。主要研究方向包括外部仿人化和内部仿生,前者关注外观设计、动作控制和任务执行能力,后者致力于模拟人类核心机制

一名80后IT人的成长记录,记录自己在工作、学习中的点点滴滴,在成长的喜悦与忧心的故事里,铭记反脆弱的勇气。 1567

《嵌入式C语言》C语言介绍及环境搭建

标题《嵌入式C语言》 --最具价值的嵌入式C语言 #1 C语言简介 C语言是国际上广泛流行的高级语言,是在B语言的基础上发展起来的, 1970年, 美国贝尔实验室的D.M.Ritchie设计了B 语言, 并用于编写了第一个UNIX操作系统。 1973年, D.M.Ritchie 在B语言的基础上设计出了C语言, 对B取长补短, 并用之改写了原来的UNIX。 • 1983年-1987年,美国国家标准化协会

xiaoeleis的专栏 2907

IT资产管理(三)之GLPI资产录入

glpi 在 10 版本之后已经有自带的 glpi-agent 代理程序可自动获取服务器、电脑等的信息并进行自动录入和更新,不再依赖 10 版本之前的 fusioninventory 插件或者第三方资产统计平台 OCS Inventory 等

予挚之的博客 2983

【UE5】多用户协同编辑实战:从配置到实时协作

本文详细介绍了在虚幻引擎5中配置和使用多用户协同编辑功能的完整流程。从启用Multi-User Editing插件、配置UDP Messaging网络通信,到启动服务器、创建会话并实现实时协作,提供了从环境准备到实战协作的清晰指南。文章还分享了资产同步、场景分批、对象锁定等实用技巧,并强调了网络配置与版本一致性等关键避坑点,旨在帮助中小型团队提升关卡设计和原型开发的协作效率。

weixin_29001683的博客 267

第 1 章 嵌入式C语言概述

C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。1.1.1C语言是一门面向过程的计算机编程语言,与C++、C#、Java等面向对象编程语言有所不同。

JJ_KING123的博客 1686

博图编写温度程序_s7 smart200的CRC-16校验程序

最近做一个小项目,项目中采用485自由口通讯方式,使用一台西门子S7 smart200对一台冷水机做多个状态和温度做监控,并能对冷水机进行启停控制,和参数设置,因为冷水机的协议不是标准modbus格式,所以要自己编写通信协议。其中要用到CRC校验,在网上找了些别人写的程序,基本上用不了。只能自力更生了。首先,找到CRC校验的算法,并理解。 下面就是我找的算法(这个网上很多),1....

weixin_39539761的博客 3062

C语言的嵌入式系统

嵌入式系统是指将计算机技术应用于某种特定的应用中,是一种以计算机为核心,集成应用特定软硬件的系统。它通常是嵌入在设备内部以实现特定的功能,如控制、监视或者通信等。嵌入式系统通常具有实时性、稳定性高和低功耗等特点。C语言由丹尼斯·里奇(Dennis Ritchie)于1972年在贝尔实验室开发,最初是为了在Unix操作系统上编写系统软件。由于其简洁高效的特性,C语言迅速获得了广泛应用,并成为系统编程的事实标准。

2501_90425623的博客 572

MATLAB基础应用精讲-【数模应用】数字预失真(DPD)(附MATLAB代码实现)

近年来,随着无线通信技术的发展,高功率放大器 (PA) 在提高信号传输功率的同时,也带来了非线性失真问题。PA的非线性失真会造成信号频谱扩展、功率下降、邻道干扰等问题,严重影响系统性能。为了克服PA的非线性失真,数字预失真 (DPD) 技术应运而生。DPD技术通过在发射机中引入一个非线性模块,对信号进行预失真处理,从而补偿PA的非线性失真。

qq_36130719的博客 896

YOLOv11改进,YOLOv11结合DynamicConv(动态卷积),CVPR2024,二次创新C3k2结构

DynamicConv(动态卷积)是一个用于提高卷积神经网络(CNN)性能的技术,核心思想是动态地生成卷积核(filter),而不是使用固定的卷积核。通过引入更多的计算灵活性和适应性来增强卷积操作的表达能力,进而提升模型的性能。专家选择:DynamicConv 通过引入多个“专家”(experts),每个专家学习特定的卷积模式。输入图像的不同部分会选择不同的专家进行卷积。动态卷积核生成:根据输入的不同特征,专家网络动态地生成卷积核,而不是使用固定的卷积核。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2262

知名外企嵌入式C语言笔试试题

知名外企嵌入式C语言笔试试题 嵌入式C语言笔试试题知名外企嵌入式C语言笔试试题一. 选择题二. 填空题三.写出程序的运行结果 一. 选择题 01.C语言合法的常量是() A…45 B.078 C.25 D.“xy” 解答:答案选择D。这个是字符串常量。 02.设x和y均为int型变量,则语句x+=y;y=x-y;x-=y的功能是() A.把x和y按从大到小排列 B.把x和y按从小到大排列 C.无确定结果 D.交换x和y中的值 解答:答案选择D。 03.设a为int型变量,值为5的枚举常量是() e

千月星跡 1849

基于Gossip算法的柔性互联自治微网群分布式协调控制策略:复现代码与详细解释

摘要(149字): 本文基于Gossip算法实现了柔性互联微网群(MMG)的分布式协调控制策略仿真。研究构建了包含3个微网、10个分布式电源(DG)的MATLAB/Simulink模型,采用双层控制架构:上层通过柔性交流开关(FAS)实现微网间功率协调,下层利用Gossip算法完成DG间的边际成本一致性控制。重点开发了异步通信的Gossip算法核心函数,实现了分布式电源的自主边际成本估计与功率分配。仿真验证了系统在负荷变化和DG故障等工况下的协调控制能力,结果表明该策略能有效维持微网群的经济运行与功率平衡。

huanghm88的专栏 281

一文了解C语言与嵌入式C语言的区别

嵌入式系统是各行各业的具体应用相结合的产物。例如计算机技术、半导体技术、电子技术。 其更在乎效率和内存有效使用。嵌入式系统是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。 C语言是目前世界使用最广泛的系统编程语言。嵌入式C是C的扩展,在嵌入式系统中应用于编写嵌入式软件。 针对嵌入式开发的C语言就是嵌入式C语言,嵌入式C与标准C没有特别大的差别,主要区别在于嵌入式程序员思考角度、使用习惯与普通C不一样。 具体体现在启动过程、存储空间的分配、对于硬件的访问、资源的限制等方面。 1.启动过程 PC机上

wy122222222的博客 1815

1、JMP脚本编程全面指南:从基础到高级应用

本博客全面介绍了JMP脚本编程的各个方面,从JMP基础和JSL入门,到数据类型、数据结构、编程方法、数据表操作、图形与三维场景脚本,再到应用程序创建与扩展功能。内容涵盖脚本工具使用、常见任务实现、兼容性说明及未来发展趋势,旨在帮助用户掌握JMP脚本语言的强大功能,提升数据分析的自动化与定制化能力。适合从初学者到高级用户的深入学习与实践参考。

flink9streamer的博客 266

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

嵌入式中c语言运行过程,嵌入式C语言程序的运行

我们做C语言中这么多年,都知道这样一句话,C语言代码形成可执行程序,需要经过编译->汇编->链接三个阶段。背都背熟了,但是到底啥意思,每一步都会产生一些什么东西,很多人都不是太了解。今天就详细的来说说这个问题:先看下图,在这个图中,我详细的描述了,整个过程及中间的一些步骤:代码段,只读数据段,读写数据段,未初始化数据段属于静态区域。栈和堆属于动态区域。代码段,只读数据段和读写数据段将在...

weixin_30171859的博客 566

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

嵌入式Linux C语言介绍

开发工具通常依赖于操作系统提供的各种功能和服务。许多开发工具都基于操作系统的API(应用程序接口)进行开发,这些API提供了文件处理、网络通信、图形界面等核心功能。没有操作系统的支持,这些开发工具就无法正常工作。而开发工具也反过来影响操作系统的设计和发展。为了满足开发工具的需求,操作系统需要提供更加高效、稳定和安全的运行环境。同时,随着开发工具的不断升级和发展,操作系统也需要不断更新和改进,以适应新的开发需求和技术趋势。此外,开发工具与操作系统之间的关系还体现在它们之间的协作和配合上。在软件开发过程中,

anananajiushiwo的博客 1913

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

linux c与c语言的区别吗,嵌入式c语言与c语言的区别

原标题:嵌入式c语言与c语言的区别最广泛使用的系统编程语言是C语言,它是使用自由格式源代码的简单编程语言;它曾用于以前用汇编语言构建的应用程序中。嵌入式C是C语言的扩展,它在嵌入式系统中应用于编写嵌入式软件,那么二者之间究竟有什么差异呢?一、启动过程1. 通用c语言程序的启动过程普通c语言启动程序搭载了windows或linux等通用操作系统的PC机,编译器会自动完成启动程序,对微处理器和外围设备...

weixin_35544325的博客 1541

嵌入式C语言实战教程

目录第1章嵌入式C语言概述1.1 嵌入式C语言简介1.2 嵌入式C语言的发展历史1.3 嵌入式C语言的主要特点1.4 单片机的汇编语言与嵌入式C语言比较1.5 嵌入式C语言与标准C语言的异同1.6 嵌入式C语言总结嵌入式C语言程序的基本结构2.1 嵌入式C语言入门实例2.2 程序工作原理2.3 源程序1. 源程序 12. 源程序 2嵌入式C语言程序的基本结构头文件2.6 主函数2.7 函数3.1 嵌入式C语言的基本数据类型3.2 基本数据类型3.3 常量与变量3.4 自定义变量类型 typedef4.1 运

m0_67931155的博客 1375

嵌入式C语言知识总结

1 嵌入式C语言总结 从语法上来说C语言并不复杂, 但编写优质可靠的嵌入式C程序并非易事,不仅需要熟知硬件特性和缺陷,还需要对编译原理和计算机技术知识有着一定的了解。在这么多年的嵌入式开发中,我也积累了一些这方面的经验和思考,就希望总结下来,系统的阐述嵌入式C语言的重要知识点,就是这篇文章的由来。本文以自己在嵌入式上的实践为基础,在结合相关资料, 阐述嵌入式需要了解的C语言知识和重点,希望每个读到这篇文章的人都能有所收获。 1. 关键字 关键字是C语言中具有特殊功能的保留标示符,按照功能可分为 ..

qq_35656655的博客 1704

嵌入式开发中C语言编程的一些要点简述

在嵌入式Linux的C语言开发中,C语言的基本编程依然是最重要的内容。

高空的博客 591
上一篇: C语言中的位运算在嵌入式中的应用
下一篇: 数据挖掘中的相似性度量指数
wustdatamining
博客等级 码龄15年 12粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值