RTEMS 的堆(下)

Ubuntu下编译RTEMS 说明由于RTEMS 的最新版本4.12的使用信息并不完善,我们决定采用更加完善稳定的RTEMS 4.11版本,配套使用4.11的RTEMS Resource Builder。Linux下RTEMS工具链的安装Linux下的RTEMS工具链包括gcc, gdb, python等,首先使用命令安装这些工具* $ sudo apt-get build-dep binutils gcc g++ gdb un 阅读详情

 

堆的核心操作主要有初始化、申请、释放、扩展。由于工作空间(Workspace),是供内核使用的,所以相关函数使用的全部是“_”前缀。主要操作分列如下:

  •  _Heap_Initialize,将指定的内存初始化成堆;
  •  _Heap_Allocate,从指定的堆中申请指定字节数的内存;
  •  _Heap_Allocate_aligned,从指定的堆中申请指定字节的内存,并且返回的地址还按照指定的对齐要求对齐;
  •  _Heap_Free,将指定地址的内存释放到指定的堆中;
  •  _Heap_Extend,对堆栈空间进行扩展。


堆的整个实现代码非常简洁,但由于对齐的问题,稍微显得有些复杂。可以先不管_Heap_Align_down、_Heap_Align_up、_Heap_Align_up_uptr等函数,并假设所有的地址都是对齐的,可以减少相关代码的阅读难度。

 

内存初始化成堆的函数(_Heap_Initialize)比较简单,参考上一小节理解,这里不做赘述。内存申请主要通过_Heap_Allocate和_Heap_Allocate_aligned两个函数完成。_Heap_Allocate函数的原型如下:

 

    void *_Heap_Allocate(Heap_Control *the_heap, size_t size);

 

该函数首先调用_Heap_Calc_block_size计算实际应该申请的内存尺寸,实际使用的内存尺寸不会比size小,至少还要多申请4个字节,用于存储本堆块的尺寸和上一个堆块的使用状态,尺寸还要按照the_heap->page_size对齐。如果size + 4对齐后仍小于本堆块的可申请的最小尺寸(堆定义中的min_block_size),那么直接按这个最小尺寸申请内存。然后程序从the_heap中的第一个堆块开始寻找可以容纳申请尺寸的堆块。找到这个堆块后,则调用_Heap_Block_allocate执行分配工作。特别注意,分配返回的堆块指针立即被后移了8(HEAP_BLOCK_USER_OFFSET)个字节,然后统计相关的参数并将这个地址返回给用户。计算实际申请空间只是至少多算了4个字节,如果实际申请空间真只是多了4个字节,而申请到的指针被后移了8个字节,那么正如上面小节所说,下方邻接堆块的prev_size域被征用了。

 

_Heap_Allocate_aligned函数原型如下:

    void *_Heap_Allocate_aligned(Heap_Control *the_heap,
                                 size_t size,
                                 uint32_t alignment);

从函数的申明上看,仅比_Heap_Block_allocate多了一个对齐尺寸的参数alignment,正因为这个对齐参数的存在,不能再忽略对齐函数。对齐函数主要分为两类,一个是向上对齐,如果地址不能被对齐因子整除,则增大地址,增加的值小于对齐因子却刚好使得地址能被对齐因子整除;另外一个是向下对齐,与向上对齐不同,它是减小地址,减小的值小于对齐因子却刚好使得地址能被对齐因子整除。

 

如图/ref{heap_aligned},整个计算遵循以下步骤:

  1.  从第一个堆块到最后一个堆块,选择尺寸大于等于size的堆块进行分配计算;
  2.  aligned_user_addr指向block_end - (size + 4)按alignment向下对齐的地址(加4使下方邻接堆块的prev_size可存储数据);
  3.  程序将user_addr指向aligned_user_addr的地址,再使user_addr指向地址按堆块的page_size向下对齐,aligned_user_addr指向地址大于等于user_addr指向地址;
  4.  如果user_addr指向地址小于user_area指向地址,分配失败,转第一步继续寻找合适的堆块进行分配;
  5.  如果user_addr在堆的用户区内,并且user_addr与user_area之间的内存尺寸小于一个最小堆块(堆定义中的min_block_size),则进行下一步;否则,即为分配成功,进入实际分配程序;
  6.  aligned_user_addr和user_area之间的内存尺寸小于page_size,则分配算是成功,进入实际分配程序。如果大于page_size,则转下一步;
  7.  将aligned_user_addr指向user_area指向地址,将其按alignment向上对齐,再次检查其与user_area之间的内存尺寸是否小
  8. 于page_size,如果小于,那么本次分配算是成功,进行实际分配程序;否则即为失败,转第一步继续在堆中寻找下一个合适堆块进行分配。

 

 

 

内存分配调用block_allocate函数完成,该函数的执行过程较为简单。只需注意,如果申请的尺寸小于堆块的尺寸超过min_block_size,需要将堆块分割成两个堆块。由于对齐分配从堆块的尾部开始计算的,分割成的两个堆块,底部的堆块作为申请堆块返回给用户,顶部堆块留在堆中等待后续操作。这个行为与_Heap_Allocate函数正好相反。

从第五个步骤看,程序并未使用对齐操作保证aligned_user_addr与user_area之间的尺寸差小于page_size。注意进入实际分配程序前,程序申请的内存尺寸是block_end - (user_addr - 8),那么可知block_allocate函数分配的堆块地址是从user_addr - 8开始,可使用的用户区从user_addr开始,第三步已保证该地址与aligned_user_addr之间的差小于page_size。

从第六、七步骤看,内存申请成功后,会有一个内存间隙aligned_gap,如图/ref{heap_aligned},这个间隙的值在[0, page_size)区间内。

block_allocate函数返回值只是作为一个检查参数用于校验分配的结果是否满足最终的分配要求。用户最后得到的分配地址是直接指向aligned_user_addr指向的地址。aligned_user_addr指向地址是大于等于user_area指向地址的,而_Heap_Allocate分配结果是等于分配块的user_area指向地址。对于_Heap_Free函数来说,用户释放的地址都是从申请函数中得到的地址,两个申请函数的地址和控制数据的位置不一样,释放函数需要对释放地址做一个按page_size向下对齐的操作,将指针地址转换成分配块的user_area,这样即可得到分配块尺寸的数据地址,即是user_area - 4。释放函数即可按照正确的参数对用户的指针地址进行释放了。这就是对齐分配函数用aligned_user_addr与user_area指向地址差是否小于page_size作为分配成功的条件的原因了。

 

 

_Heap_Free函数的原型如下:

    bool _Heap_Free(
        Heap_Control        *the_heap,
        void                *starting_address);

 

这个函数只是将starting_address开始的内存释放到堆the_heap中。合并成功返回TRUE,失败返回FALSE。函数首先检查释放地址是否为这个堆中的地址,然后对地址按堆的对齐因子向下对齐,并计算得到此堆块的真正起始地址。检查上方邻接堆块是否为空闲,检查下方邻接堆块是否为空闲,将上方下方空闲邻接堆块合并在一起放入堆中。

 

_Heap_Extend函数原型如下:

    Heap_Extend_status _Heap_Extend(
        Heap_Control        *the_heap,
        void                *starting_address,
        size_t               size,
        uint32_t            *amount_extended);

该函数将以starting_address开始的大小为size的内存块变为堆块放入堆the_heap中。用amount_extended返回实际加入堆的内存尺寸。加入成功,函数返回HEAP_EXTEND_SUCCESSFUL。并不是所有的内存块都可以加入到堆块中,即将加入的内存块和堆的位置关系有五种情况,分列如下:

  1.  内存块与堆块地址不连续,内存块末地址小于堆顶地址;
  2.  内存块与堆地址连续,内存块末地址等于堆顶地址;
  3.  内存块的地址部分或全部处于堆内部;
  4.  内存块与堆地址连续,内存块首地址等于堆底地址;
  5.  内存块与堆地址不连续,内存块首地址大于堆底地址。



第一、二、五种情况,系统算法不支持;第三种情况是参数错误。只有第四种情况才可以扩展成功。从以上的分析看,第一、五种情况以堆当前的管理算法是无论如何也支持不了的,但是第二种应该与第四中类似,应该是可以扩展成功的,可能在扩展时,堆顶的堆块已经被用户申请使用,操作起来恐有不便,故而未实现。而堆块的尾部是有一个不被使用的伪堆块,可以很简单的做扩展操作。如果读者有兴趣,可以自行实现对第二种情况的支持。

_Heap_Extend函数首先检查内存块是否为第四种情况,如果不是,失败返回;如果是,则调整堆的结束地址到内存块的结束地址。如果增加的内存块和堆原末尾产生的对齐间隙尺寸之和小于最小堆块尺寸,那么不做任何操作,返回成功;如果大于最小堆块尺寸,则移动伪堆块到内存块尾部,将原伪堆块地址到新伪堆块地址变为一个堆块,调用_Heap_Free释放到堆中并返回成功。

 

 

飞腾CPU运行RTEMS6.0 飞腾CPU运行RTEMS 阅读详情

相关推荐

RTEMS STM32F103RCT6应用

1.准备工作 安装好RTEMS工具链,ECLIPSE插件,git RTEMS4.11最新代码。 2.安装调试工具 在FEDORA中调试STM32,可以通过GDB来调试,虽然跟在WINDOWS下调试相比易用性相差较大,但是也能达到调试的目的以及实现程序下载的功能。如果用JLINK开始用JLINK的LINUX版的软件,或者OPENOCD。在此我选择的是JLINK。下载到jlink-4.98.1.

qq_30136173的博客 3126

堆(heap)系列_0x04:堆的内部结构(_HEAP=_HEAP_SEGMENT+_HEAP_ENTRY)

_HEAP=_HEAP_SEGMENT+_HEAP_ENTRY,这3种数据结构使用WinDbg进行分析

可乐松子的博客 1689

RTEMS连载(2) RTEMS的编译

RTEMS的编译 作者 RayRTEMS版权所有,转载请注明:来源http://www.rtems.net,作者ray@rtems.net摘要   本节主要介绍RTEMS编译的步骤。交叉编译环境建立好以后,编译就很简单了,解压rtems的文件夹$tar xjvf rtems4.6.2.tar.bz2建立rtems的编译路径:$ mkdir rtems_i386 

Ray的嵌入式专栏 2466

解读编码后的HEAP_ENTRY结构

http://advdbg.org/blogs/advdbg_system/articles/5152.aspx

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 961

RTEMS 操作系统

​RTEMS,全称为 ​​(多处理器系统的实时执行体),是一个开源的实时操作系统(RTOS)​,最初由美国军方资助开发,目标是满足航空航天、国防等高安全、高性能、强实时性领域中的嵌入式系统需求。随着发展,RTEMS 已成为一个通用、高度可移植、模块化、支持多处理器架构的实时操作系统,广泛用于航空航天、工业控制、医疗设备、电信和嵌入式实时系统中。选择 RTEMS 的理由说明✅ ​高实时性与确定性​适用于任务响应要求极高的系统,如飞行控制✅ ​多核与多处理器支持​原生 SMP,适合现代多核 SoC。

baidu_38316985的博客 974

RTEMS的BSP开发流程

RTEMS BSP 的开发流程图,一共分为 8 个步骤:建立开发环境、选择 BSP 模板、新建 BSP 目录、建立 BSP 配置文件、修改 Makefile、修改启动代码、配置 RTEMS 和编译测试和运行。第一步:建立开发环境。主要是针对 Linux 上的环境配置,将 Linux 作为宿主环境,开发板作为目标环境。 第二步:选择 BSP 模板。这一步主要是针对目标开发板,寻找合适的 BSP。RT

蓝蓝蓝博特的博客 1761

HeapEntry解码过程

在调试堆时对HeapEntry解码的过程,记录下来以便以后学习用到。 在Win7上调试堆时,会发现_HEAP 增加了两个标志,一个是EncodeFlagMask,另一个是Encoding,其中EncodeFlagMask标明了堆头部是否经过了编码,这个字段的初值为0x100000,由RtlpCreateHeapEncoding()函数设置。而Encoding是一个_HEAP_ENTRY结构体的指

Puzzor的专栏 3210

使用STM32的HAL库移植RTEMS操作系统

文章目录编译运行RTEMS操作系统下STM32F4的BSPSTEP 1: 编译rtems工具链STEP 2: 编译RTEMS源码STEP 3: 烧写测试程序"hello",并下载STEP 4:使用GDB调试第1步:先下载bin文件到flash里面第2步:运行openocd第3步:开启一个新终端,运行gdb 编译运行RTEMS操作系统下STM32F4的BSP STEP 1: 编译rtems工具链 ...

bh_binghu的专栏 1967

RTEMS 的堆(上)

<br />对于实时操作系统,好的内存分配算法会使系统的稳定性增色不少。实际使用中,如果用户在代码的使用方法和系统内存管理算法相悖,会引起许多问题,甚至使系统变得不可靠。RTEMS提供了堆(Heap)、工作空间(Workspace)、内存区域(Region)和固定尺寸的内存分配算法(Partition)。RTEMS内核使用的内存从工作空间申请,而用户应用程序使用的内存从堆申请。堆与工作空间使用相同的算法管理内存,故放在一起讨论。内存区域与堆的管理算法类似,略有区别,会和固定尺寸的内存分配算法一起在后续的章节

雪松's RTEMS 3132

ENVI+SARscape实战:从哨兵一号数据到地震形变制图全流程解析

本文详细解析了使用ENVI和SARscape软件从哨兵一号数据生成地震形变图的全流程,包括数据获取、干涉处理、相位解缠等关键步骤。通过实战技巧和参数设置建议,帮助用户高效处理SAR数据,提升地震形变监测的精度和可视化效果。

weixin_30460489的博客 385

CST微带贴片天线设计全流程:从S11优化到辐射方向图分析

微带贴片天线是现代无线通信设备中的关键部件,其设计依赖于电磁场理论与仿真软件的结合。理解天线的基本工作原理,如谐振频率、阻抗匹配和辐射机制,是进行有效设计的基础。通过电磁仿真,工程师可以精确预测天线性能,避免传统手工计算的误差。在工程实践中,CST Studio Suite作为行业标准的三维电磁仿真工具,能够高效处理复杂的边界条件与材料属性,帮助优化S11参数和辐射方向图。本文聚焦于2.4GHz Wi-Fi频段微带贴片天线的完整设计流程,详细解析了端口设置、网格划分等关键步骤,并针对常见的仿真失败问题提供了

weixin_30784501的博客 459

C#非托管泄漏中HEAP_ENTRY的Size对不上是怎么回事?

这就是解答异或的完整推导逻辑,总的来说思路很重要,这些知识也是我们调试 dump 的必备功底,了解的越深,解决的问题域会越大。

一线码农的专栏 358

GPU基准测试全攻略:从驱动验证到深度学习环境部署

GPU基准测试是评估显卡性能与稳定性的核心方法,其原理在于通过标准化负载程序,对GPU的计算单元、显存和散热系统进行压力测试。这项技术的价值在于,它能科学量化硬件性能,确保软件环境配置正确,为深度学习、科学计算等重负载任务提供稳定基础。在实际应用场景中,无论是新卡验机、排查深度学习环境问题(如“warning: no usable gpu found”报错),还是验证“PyTorch GPU版本安装”后的实际算力,系统的基准测试都是不可或缺的工程实践环节。通过结合通用计算测试与深度学习框架验证,用户可以提前

weixin_30080745的博客 343

RTEMS 操作系统的概念:堆与栈

在计算机领域,堆栈是一个不容忽视的概念,只要编写程序都要用到。对于很多的初学着来说,堆栈却是一个很模糊的概念。 栈~(Stack)~在数据结构中是一种线性表,特点是先进后出~(First In Last Out,FILO)。数据结构/footnote{严蔚敏版《数据结构》}中出现堆~(heap)~的地方只有 堆排序算法。程序员口中的堆栈是存储代码中数据的方式方法,栈和数据结构中的“栈”是有些联系的,但堆和数据结构中的“堆”基本上是无任何关系的。 称呼上堆栈不分家,但实际上堆和栈的区别是非常大的。栈和数

雪松's RTEMS 2701

i茅台APP加密参数逆向分析:MT-Device-ID与mt-v生成算法

在移动应用安全领域,参数加密是防止API滥用的重要手段。通过对通信协议的逆向分析,可以揭示加密参数的生成原理,这对理解移动应用安全机制具有重要意义。以i茅台APP为例,其关键接口使用了MT-Device-ID和mt-v两个加密参数,前者基于设备硬件信息生成,后者则通过动态签名机制确保请求时效性。这类技术广泛应用于电商、金融等需要高安全性的场景。通过抓包工具和逆向工程手段,可以还原出从设备指纹生成到动态签名的完整技术链条,其中涉及MD5、SHA256等常见哈希算法的应用。掌握这些加密参数的生成逻辑,不仅有助于

weixin_28568819的博客 321

20、自定义用户窗体:从创建到使用

本文详细介绍了在Excel VBA中创建和使用自定义用户窗体的完整过程,涵盖从窗体设计、控件添加与属性设置,到事件处理程序编写及宏调用的各个环节。通过实际示例讲解了如何实现文本大小写转换和员工信息录入等功能,并深入解析了常用控件的属性与事件机制。同时提供了控件命名规范、快捷键使用、布局技巧等实用建议,帮助读者构建高效、交互性强的VBA用户界面。

h0i1j2k3l的博客 131

RTEMS 安装脚本

(嵌入式 实时操作系统 rtos rtems 开发环境 交叉工具链 shell脚本) RTEMS 安装脚本 rtems_building_v10.sh 转载请注明出处:http://blog.youkuaiyun.com/zhumaill/article/details/21478895 #!/bin/bash #rtems4.11在linuxmint-16-cinnamon-64bit上测试通过 #设置 TARGET=arm-rtemseabi4.11 PREFIX=/opt/rtems-4.11 BSP=st

天又亮了 3372

S32DS S32K312 LPSPI + DMA配置异步SPI

配置DMA->Specific Configuration->Dma Logic Channel->Configuration->Global。SpiPhyUnitMapping:将该配置Mapping到某一路Spi,此工程配置为Spi1,遂选择LPSPI_1。配置的该路SPI的片选ID,此处ID对应配置Pin脚时lpspi_pcs后的下表(本工程此处为PCS3)配置该路SPI对应的SPI硬件单元ID,本工程配置为Lpspi1,因此配置为CSIB1。首先配置SPI的Pin脚,此处使用的是LPSPI_1。

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

飞腾派上体验 RTEMS

飞腾派是由中电港萤火工场与飞腾合作推出的飞腾派,采用飞腾自主研发的高能效异构多核处理器技术,具有模块化、易上手、全开源、低成本的特点,大大降低了国产处理器的开发使用门槛,解决了国产处理器难以普及推广的问题。- RTEMS (Real-Time Executive for Multiprocessor Systems) 是一个开源实时操作系统,可以用于太空飞行、医疗、网络和各类嵌入式设备,◆支持多处理器(不同于SMP,RTEMS中多个处理器是协作关系)同时,RTEMS 也支持了大量的特性。

paofulll的博客 1200

Linux 命令行的艺术

Linux 命令行的艺术前言基础日常使用文件及数据处理系统调试单行脚本冷门但有用仅限 OS X 系统仅限 Windows 系统更多资源免责声明熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要。有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂。这篇文章并不长,但当你能够熟练...

AI天才研究院 9283

【MicroPython编程-ESP32篇:设备驱动】-SHT31温度湿度传感器驱动

SHT31 是 Sensirion 的下一代温湿度传感器。 它建立在一个新的 CMOSens® 传感器芯片之上,该芯片是 Sensirion 新湿度和温度平台的核心。

视觉与物联智能 230

RTEMS目录树

RTEMS版权所有,转载请注明来源www.rtems.net,作者ray@rtems   第 1 节: 介绍     本章介绍了RTEMS开发环境,包括         *         RTEMS的目录结构,       *         GNU Make在 RTEMS 开发环境中的用法       *         示例应用       *         RTE

andy205214的专栏 2431

OV9734 DATASHEET,完整规格书

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

构建beagleboneblack的rtems5开发环境

编译环境说明 安装工具链 下载RTEMS内核源码 编译bsp包 编译rtems-libbsd 常见错误 一些脚本 编译环境说明 时间:2018.04.28. rtems-source-builder版本哈希值:10d3aaf。rtems-src哈希值8b5a801,rtems-libbsd哈希值ef5d536。我只是在我当前的版本编译成功,如果遇到问题无法解决可以...

bh_binghu的专栏 1995

蓝牙模块HM-10手册

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

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

RTEMS 网络增补

RTEMS 网络增补 networking.RTEMS网络增补.双语.V20131224.pdf RTEMS 的networking文档的原创翻译。 目录 前言 11 1 网络任务结构和数据流 13 2 网络驱动 17 2.1 简介 17 2.2 了解网络设备 17 2.3 了解网络调度约定 19 2.4 网络驱动的Makefile 20 2.5 编写驱动程序连接函数 21 2.6 编写驱动程序启动函数 24 2.7 编写驱动程序初始化函数 24 2.8 编写驱动程序发送任务 25

天又亮了 1053

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

RTEMS 开发环境指南

RTEMS 开发环境指南 develenv.RTEMS开发环境指南.双语.V20131224.pdf RTEMS 的develenv文档的原创翻译。 目录 1 简介 7 2 目录结构 9 2.1 c/ 目录 14 2.1.1 c/src/ 目录 15 2.1.1.1 c/src/lib/libbsp BSP目录 18 2.2 CPU工具箱目录 19 2.3 testsuites/测试套件 24 2.4 Documentation目录 26 3 示例应用程序 31

天又亮了 1958
上一篇: RTEMS 的堆(上)
下一篇: 关于林锐老师的《如何管理软件企业》第二版
coolbacon
博客等级 码龄22年 1766粉丝 139原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值