6.2 静态内存分配模式

STM32F407+FreeRTOS工程初始化与CMSIS-RTOS v2实战配置 嵌入式实时操作系统(RTOS)是构建可靠多任务应用的基础技术,其核心在于系统时钟精度、中断优先级管理与任务内存模型。FreeRTOS作为最广泛应用的开源RTOS,通过CMSIS-RTOS v2接口实现跨平台抽象,显著提升代码可移植性与维护性。在STM32平台实践中,需严格配置HSE晶振、PLL倍频及NVIC分组,确保168MHz主频下tick定时器误差可控;同时依据安全等级选择动态或静态内存分配模式——后者规避堆碎片,契合功能安全要求。典型应用场景包括工业网关的Modbus协议解析、低功耗终端的Tickle 阅读详情

Bruce Powel Douglass大师介绍-优快云博客https://blog.youkuaiyun.com/ChatCoding/article/details/134665868

嵌入式软件开发从小工到专家-优快云博客https://blog.youkuaiyun.com/ChatCoding/article/details/135297955

C嵌入式编程设计模式源码-优快云博客https://blog.youkuaiyun.com/ChatCoding/article/details/134819019

静态分配模式只适用于负载(内存量)高度可预测且稳定的简单系统。在适用的情况下,使用这种模式可以使系统易于设计和维护。

6.2.1 摘要

动态内存分配在实时嵌入式系统中存在两个主要问题:

  • 内存分配和释放的时间不确定。
  • 内存碎片化。

这种模式采用了一种非常简单的方法来解决这两个问题:禁止动态内存分配。这意味着所有对象都在系统初始化期间分配。如果设计时能够知道内存负载,并且能够为最坏情况分配足够的内存,那么系统虽然初始化时间会长一点,但运行时将更加稳定高效。

6.2.2 问题

动态内存分配在结构化和面向对象设计中非常普遍。例如,C++ 语言使用 new 和 delete 来分配和释放内存,C 语言则使用 malloc 和 free。在这些语言中,程序员都需要显式执行这些操作,但也很难想象任何大型程序不使用分配内存的指针。而 Java 语言更加彻底,所有对象都存放在动态内存中,这意味着所有对象创建都隐式地使用了动态内存分配。此外,Java 还会在内存不再使用时自动释放它,但具体何时何地发生则不在程序员的控制范围内。

尽管很常见,动态内存分配始终是让实时系统开发疼痛的问题,主要有以下三个难题:

  • 非确定性:动态内存分配和释放的时机通常是不可预测的,因为这通常需要搜索数据结构以找到可分配的空闲内存。这会导致系统的行为难以预测,甚至出现不可预料的延迟或中断。
  • 内存泄漏:如果程序员没有正确释放不再使用的内存,就会发生内存泄漏。这会导致系统内存的逐渐减少,最终导致系统崩溃。
  • 内存碎片化:由于内存是以不同大小的块分配的,释放顺序通常与分配顺序无关。这会导致空闲内存出现碎片化,即无法找到足够大的连续空闲内存块来满足新的内存请求。

上述三个难题都可能导致实时系统出现严重的性能问题或甚至崩溃。因此,在实时系统中,应尽量避免使用动态内存分配。

6.2.3 模式结构

图 6-1 展示了该模式的基本结构。它结构非常简单,但可以通过嵌套抽象层来处理任意大小的系统。系统对象启动初始化过程,并创建最高级别的复合对象。这些复合对象通过组合关系连接到其他复合对象或原始对象。原始对象被定义为不会动态创建其他对象的类。使用组合关系是因为它们清晰地标识了创建/删除的责任。

6.2.4 协作角色

  • Allocation Plan(分配计划):如果存在,标识最大系统复合对象应该按照哪个顺序分配。
  • Composite Object(复合对象):复合对象通过组合关系负责创建它所拥有的所有对象。

分配计划

分配计划(Allocation Plan)是可选的,用于指定最大系统复合对象的分配顺序。如果没有分配计划,则系统可以按任何所需的顺序分配对象。

复合对象

复合对象(Composite Object)是指与其他对象之间存在组合关系的对象,其他对象可以是复合对象或原始对象。复合对象负责通过组合创建它所拥有的所有对象。复合对象和系统对象都不能释放内存。

复合对象可以由其他复合对象组成,但每个通过组合关系拥有的对象只能属于一个复合对象。这意味着模式中清楚地标识了系统中每个对象的创建责任。

部件对象

部件对象(Part Object)是复合对象和原始对象的父类。它允许系统对象和复合对象通过组合包含复合对象和原始对象。

原始对象

原始对象(Primitive Object)是指不负责分配任何其他对象的类。所有原始对象由复合对象创建。

系统对象

系统对象(System Object)是系统中最高抽象层级的对象。它的职责是通过创建和初始化系统的主要部分(最高级别的复合对象)来“启动”系统。这些复合对象又会创建自己的部分,依此类推。一旦所有对象都创建完毕,系统对象就会通过运行 begin 操作启动系统执行。

6.2.5 结果

静态分配模式将所有对象都在系统启动时进行内存分配,适用于以下情况:

  1. 最坏情况可预测且内存充裕: 系统的峰值内存需求是已知且可控的,并且拥有足够的内存满足这种情况。
  2. 内存负载稳定: 系统在不同运行状况下的内存需求差异不大,保持相对稳定的内存占用。
  3. 系统规模较小: 需要预先分配所有对象内存的特点限制了系统规模,适合用于较小的系统。
  4. 对内存成本不敏感: 系统对内存成本相对不敏感,预先分配内存造成的潜在浪费可以承受。

使用静态分配模式的系统拥有以下优势:

  • 更快的运行速度: 启动后执行代码无须进行动态内存分配,运行速度通常比动态分配更快,有时显著更快。
  • 更可预测的执行: 消除了动态分配带来的非确定性因素,使系统运行更加可预测。
  • 无内存碎片化: 不进行内存释放,就不会出现内存碎片化的问题。

然而,静态分配模式也存在一定的缺点:

  • 启动时间较长: 需分配所有对象内存,导致启动时间可能明显延长,对启动时间要求苛刻的系统可能不适用。
  • 潜在内存浪费: 预先分配所有对象内存可能造成一定程度的浪费,如果实际内存需求低于最坏情况,则会占用额外的内存空间。

总结: 静态分配模式适用于最坏情况可预测、内存负载稳定、规模较小且对内存成本不敏感的系统。它能带来更快的运行速度、更可预测的执行和无碎片化等优势,但需要付出启动时间较长和潜在内存浪费的代价。

6.2.6 实施策略

这个模式非常容易实现。在许多情况下,甚至不需要单独的初始化方法,可以直接使用每个复合对象的构造函数来完成对象的创建和初始化。

6.2.7 相关模式

本章中介绍的其他模式也解决了类似的问题,但会带来略有不同的利弊。例如,池分配模式、固定大小缓冲区模式、垃圾回收器模式和垃圾压缩器模式等等。

6.2.8 示例模型

图6-2展示了一个使用完全构建系统实例的简单例子。图6-2a展示了对象图的实例结构,图6-2b展示了静态分配模式在启动时的工作方式。

总结来说,静态分配模式通过在系统启动时分配所有对象,避免了动态内存分配带来的时间不确定性和内存碎片化问题。这种模式适用于内存负载可预测、系统设计简单且内存成本不是主要考虑因素的情况。在实施时,需要在设计阶段对内存需求有准确的预测,以确保在最坏情况下有足够的内存。

图形中各个箭头的含义

  • 实线箭头:代表对象之间的组合关系

图形中各个对象的含义

  • 起搏器对象(Pacemaker Object):这是整个起搏器设备的总称。
    • 电池系统(Battery Subsystem):为起搏器提供动力。
      • 电池传感器(Battery Sensor):监测电池的电压,并在电池电量不足时向起搏器发出警报。
    • 通信子系统(Comm Subsystem):允许起搏器与外部设备(如程序器和监控系统)进行通信。它使用无线遥测系统来传输和接收数据。
      • 磁簧开关(Reed Switch):检测起搏器是否置于磁场中。这可用于激活起搏器的某些功能,例如遥测。
      • 消息队列(Message Queue):用于存储由通信子系统传输或接收的数据。
      • 收发器线圈(Transceiver Coil):用于无线传输和接收数据。
    • 起搏子系统(Pacing Subsystem):起搏器的核心
      • 心房(Atrial Chamber):心脏的上腔。
        • A 心脏传感器(A Heart Sensor):监测心房的电活动。
        • A 起搏电容器(A Pacing Canacitor):为起搏电路存储能量。
      • 心室(Ventricular Chamber):心脏的下腔。
        • V 心脏传感器(V Heart Sensor):监测心室的电活动。
        • V 起搏电容器(V Pacing Capacitor):为起搏电路存储能量。

起搏子系统(Pacing Subsystem):起搏器的核心,负责生成电脉冲来刺激心肌。它由起搏电路、起搏电极和起搏电容器组成。

  • 起搏电路(Pacing Circuit):生成电脉冲。
  • 起搏电极(Pacing Electrode):将脉冲传递给心肌。
  • 起搏电容器(Pacing Capacitor):为起搏电路存储能量。

cJSON嵌入式JSON解析库:轻量、确定性与内存安全实践 JSON作为一种轻量级数据交换格式,在物联网设备、传感器节点和MCU固件中广泛应用。其解析与生成需兼顾ANSI C兼容性、确定性执行时间和严格内存控制。cJSON作为纯C实现的零依赖JSON库,凭借静态内存管理、可裁剪架构和裸机友好设计,成为STM32、ESP32、nRF52等资源受限平台的事实标准。它支持FreeRTOS/Zephyr等RTOS集成,提供三重内存模式(动态/静态池/零分配),并可通过valuestring_ref避免字符串拷贝、cJSON_PrintPreallocated规避malloc 阅读详情

相关推荐

Antares ESP HTTP库:ESP32/ESP8266轻量级IoT端云通信方案

物联网设备与云平台通信是嵌入式开发的核心环节,其本质是基于HTTP/HTTPS协议实现安全、可靠、低开销的数据交换。理解REST API调用原理、TLS加密握手机制及JSON序列化/解析流程,对保障数据完整性与系统资源效率至关重要。Antares ESP HTTP库聚焦ESP32和ESP8266平台约束,通过预分配静态JSON缓冲区、复用TLS连接、面向对象的API封装等技术手段,在有限RAM(如ESP8266仅80KB)下实现高鲁棒性端云交互。典型应用场景包括智能传感数据上报、远程设备状态获取及工业IoT

weixin_34064233的博客 521

Spark内存管理(一)——静态内存管理模型

Spark静态内存管理模型 一 .简介 spark从1.6开始引入了动态内存管理模式,即执行内存和存储内存之间可以互相抢占。所以从spark 1.6以后,spark提供两种内存分配模式,即:静态内存管理和动态内存管理。 该篇文章主要针对spark静态内存管理进行了分析与说明 二 . 模型总览 从下图可以清晰的看出每个executor的内存分配: 上图代表了spark中的每个worker(exec...

yulin 808

ESP32+Micro-ROS轻量级机器人控制系统实战

嵌入式机器人系统需在资源受限的MCU上实现高可靠、低延迟的ROS2通信与运动控制。Micro-ROS作为ROS2官方轻量化中间件,通过XRCE协议、静态内存分配和FreeRTOS适配,显著降低ESP32等无MMU平台的运行开销;其与ROS2 Humble Agent的串口/Wi-Fi桥接机制,解耦了底层硬件与DDS复杂性。该方案支撑多传感器融合(IMU/编码器/超声波)、游戏手柄遥操作、双闭环PID电机控制及底盘运动学映射等典型功能,广泛应用于教育机器人、原型验证与边缘智能终端开发。

weixin_42522857的博客 469

突破嵌入式AI内存瓶颈:NNoM静态内存分配全解与实战优化

在资源受限的微控制器(MCU)环境中部署神经网络时,内存管理往往是决定项目成败的关键瓶颈。传统动态内存分配(Dynamic Memory Allocation)在嵌入式系统中可能导致内存碎片化、分配失败和不可预测的运行时行为,这些问题对于需要高可靠性的边缘计算设备来说是致命的。NNoM(Neural Network on Microcontrollers)作为专为MCU设计的高级神经网络库,创新性...

gitblog_07972的博客 790

嵌入式C++开发:ARM Cortex-M核心优势与优化实践

嵌入式开发中,C++在ARM Cortex-M等资源受限环境展现出独特价值。通过RAII机制实现自动资源管理,结合模板元编程在编译期完成计算,显著提升类型安全并降低运行时开销。内存管理方面,静态分配器与自定义内存池解决动态内存限制问题,而-fno-exceptions等编译选项可优化代码体积。在实时系统中,中断服务例程的noexcept标记和内联策略对性能至关重要。这些技术最终服务于工业控制、物联网设备等场景,其中C++的硬件抽象能力与零成本抽象特性(如CRTP)能有效平衡效率与可维护性。

weixin_42234168的博客 368

FreeRTOS在STM32上的初始化与任务创建机制详解

实时操作系统(RTOS)是嵌入式系统实现多任务并发与确定性响应的核心基础。FreeRTOS作为轻量级开源RTOS,凭借其CMSIS-RTOS V2标准化接口和低资源占用特性,广泛应用于STM32等Cortex-M系列微控制器。其运行原理依赖于精确的SysTick节拍源、合理的中断优先级分组(如NVIC_PRIORITYGROUP_4)以及动态/静态内存分配机制。技术价值体现在任务抢占调度、栈空间安全监控(uxTaskGetStackHighWaterMark)与HAL库时钟重定向协同能力。典型应用场景包括工

weixin_42579969的博客 235

FreeRTOS 创建单任务(SRAM 静态内存)详解——标准库版完整代码

本文通过 STM32 标准外设库完整代码示例,讲解 FreeRTOS 中如何使用 SRAM 静态内存创建单任务。内容包括静态分配配置、任务堆栈与控制块的准备、空闲任务钩子实现,以及关键注意事项,帮助读者快速理解并上手静态创建任务,避免对堆的依赖。

2401_82419694的博客 469

【RandLA-Net实战】从零构建隧道点云数据集并训练大场景语义分割模型

本文详细介绍了如何使用RandLA-Net构建隧道点云数据集并进行大场景语义分割模型训练。从数据采集、标注到模型训练与优化,提供了完整的实战指南,特别针对隧道场景的特殊挑战提出了解决方案。通过实际案例展示了RandLA-Net在处理大场景点云数据时的高效性和准确性,为隧道巡检等工程应用提供了可靠的技术支持。

weixin_30485379的博客 115

SVGEdit 上手指南:浏览器里打开一个矢量图形画板

设计师让你顺手改个图标的颜色和大小,你手头又不想装重型图形软件。SVGEdit 是一个开源的 SVG 编辑器,直接跑在浏览器里:不用安装、不用注册,打开页面就能画。这篇文章先带你在本地把它跑起来,再用"画一个简单 App 图标"这个小任务走完基本操作。 ## SVG 是什么,为什么浏览器里画它刚刚好 SVG 是一种用 XML 文本来描述图形的格式,圆、矩形、路径都是可读的文字指令,所以它放大到

gitblog_00829的博客 756

<视觉>——单目相机的标定(简单原理+Opencv实现)

单目相机的标定原理大致如下: 世界坐标到像素坐标的转换。 期间的参数有S尺度因子,内参矩阵K,旋转矩阵R,平移矩阵T,一共八个未知数。 在Opencv中我们可以方便的根据相机拍摄不同位姿的标定板图片来标定相机,从而求得这些参数,从而可以将相机下的坐标和实际的世界坐标联系起来,求取单应性矩阵H 参考: 单目相机综述:写的特别好 https://www.cnblo...

Kano365的博客 1万+

MOOS-ivp 实验三 MOOS简介(3)

MOOS-ivp 实验三 MOOS简介(3) 继上一篇文章继续对实验进行记录 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录MOOS-ivp 实验三 MOOS简介(3)六、A Simple Example with pXRelay1.pXRelay基本使用2.pXRelay简单例子3.pXRelay实验七、First Experiments in Modifying MOOS App Code1.下载一个MOOS模板文件2.打开MOOS模板文件总结 六、A Simple E

weixin_44151170的博客 2534

【STM32CubeIDE实战教程】FreeRTOS静态任务创建详解(附完整代码示例)

在嵌入式RTOS开发中,FreeRTOS因其开源免费、轻量级等特点成为STM32开发者的首选。而静态内存分配方式相比动态分配,具有确定性高、内存泄漏风险低等优势,特别适合资源受限的嵌入式系统。本文将手把手教您在STM32CubeIDE环境中创建FreeRTOS静态任务。静态内存分配虽然需要开发者手动管理内存,但在关键任务系统中能提供更好的确定性和可靠性。建议在医疗设备、工业控制等对稳定性要求高的场景优先采用静态分配方案。后续会继续分享关于FreeRTOS在STM32CubeIDE上的配置,你我共勉!

weixin_46716828的博客 1009

怀旧党必备!用iPhone4s重温iOS6的保姆级教程(含游戏资源包)

本文提供了一份详细的iPhone4s降级至iOS6.1.3的保姆级教程,包括设备准备、越狱操作、系统降级及资源优化全流程。通过自制固件和越狱工具,用户可以重温经典的拟物化设计和流畅体验,同时获取经典游戏资源包,打造复古游戏神器。

nft7creator的博客 884

C语言接口开发:DeepSeek-OCR-2嵌入式SDK设计

本文介绍了如何在星图GPU平台上自动化部署📄 DeepSeek-OCR-2 智能文档解析工具镜像,实现高精度、低资源消耗的嵌入式OCR能力。该镜像专为工业质检、智能仓储等边缘场景优化,支持在工控机、PDA等设备上快速识别产品标签、发票及快递面单中的关键文本信息。

weixin_33205138的博客 330

C++ Qt6 QtQuick/QML入门进阶与项目实战视频教程

C++ Qt这些年在PC客户端、嵌入式、汽车座舱仪表等领域应用很广泛,例如剪映专业版、微信4.0、亿图脑图、Steam、美图秀秀、腾讯会议、钉钉(部分模块)等都是使用C++ QWidget/QML开发。特别是QML这种声明式UI开发更加快捷,QML的界面开发效率相对于QWidget更快速,界面效果更好,QtQuick/QML在Qt6版本也逐渐完善了,使用QML进行客户端开发是个不错的选择。

琅嬛福地 4488

【银河麒麟V10】【桌面】【服务器】系统启动问题

1、如果之前运行好好的,重启后系统报错,一般80%是因为fstab的问题,回想下之前有没有添加过外接存储,修改过/etc/fstab,如果是的话一般是因为存储异常(比如网络存储无法连接,本地存储路径变化)导致系统开机自检失败,导致无法正常启动; 处理方式:进入单用户(单用户进入的几种方式上面有专门文章介绍),修改/etc/fstab,将新增的内容暂时注释掉,然后重启系统,能正常进入系统后再分析失败原因。 ...

桂安俊@KylinOS 3万+

PolarSSL内存占用分析:如何在资源受限设备中部署

在嵌入式系统和物联网设备开发中,内存资源往往是最宝贵的资产之一。PolarSSL(现为Mbed TLS)作为一款轻量级的SSL/TLS加密库,在资源受限环境中表现出色。本文将深入分析PolarSSL的内存占用特性,并分享在低内存设备中成功部署的实用技巧。 ## PolarSSL内存优化核心策略 ### 配置精简:按需裁剪功能模块 PolarSSL的强大之处在于其高度模块化的设计。通过配置文件,

gitblog_00903的博客 393

基于YOLOv8的水果新鲜程度检测系统设计与实现

数据采集与预处理模块:负责收集水果图像数据并进行标注和增强深度学习模型:基于YOLOv8的目标检测模型新鲜度评估模块:根据检测结果评估水果新鲜程度用户界面:提供友好的交互界面系统集成:将各模块整合为完整系统水果新鲜程度检测需要包含多种水果在不同新鲜度状态下的图像数据集。:包含5种常见水果(苹果、香蕉、橙子、葡萄、草莓)在不同新鲜度下的图像包含约8,000张图像,分为新鲜和腐烂两类AgriVision:大型农业图像数据集,包含水果检测和分类任务Fruit-360:包含120种水果的高质量图像。

YOLO 444

【稀缺技术揭秘】:C#集合表达式在高并发场景下的初始化优化策略

掌握C#集合表达式实现高效数据初始化优化,提升高并发场景性能。适用于频繁创建集合对象的业务,通过简化语法与减少内存开销,显著提高执行效率。代码更简洁,性能更优,值得收藏。

PixelFlow的博客 970

SerDes系列之码间干扰的概念

码间干扰出现在传输介质或者元器件的带宽小于所发送的信号带宽时,从时域角度来看,传输路径的带宽限制会使发送信号的上升沿的变化速率变慢,有可能对信号造成高频衰减,并影响到实际数字逻辑电平的转换时序。

一只豌豆象的博客 3467

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

nanopb性能优化:7个技巧让你的嵌入式应用飞起来

想要在资源受限的嵌入式系统中实现高效的数据序列化吗?nanopb作为专为微控制器设计的轻量级Protocol Buffers实现,通过优化可以显著提升性能表现。本文将分享7个实用的nanopb性能优化技巧,让你的嵌入式应用运行得更快更流畅! ## 🚀 nanopb是什么?为什么需要性能优化? **nanopb**是一个小型代码体积的Protocol Buffers实现,专门为内存受限系统优化

gitblog_00853的博客 1075

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

lz4嵌入式开发:资源受限环境适配

在嵌入式开发中,你是否经常面临**内存不足**与**存储限制**的双重挑战?当需要在MCU(微控制器)或资源受限设备上实现数据压缩时,传统压缩算法往往因**高内存占用**和**代码体积庞大**而难以适用。LZ4作为一款"Extremely Fast Compression algorithm",其核心优势在于**超高速率**与**低资源消耗**的平衡,本文将系统讲解如何在嵌入式环境中实现LZ4的深...

gitblog_00947的博客 538

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

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

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

嵌入式JSON解析实战:cJSON与Jansson在STM32上的高效移植与内存优化

本文详细探讨了在STM32嵌入式系统中高效移植与优化cJSON和Jansson两种轻量级JSON解析库的实战方法。通过对比分析内存管理策略、静态分配方案及性能优化技巧,帮助开发者在资源受限环境下实现稳定的JSON数据处理,特别适合物联网设备开发。

weixin_30682415的博客 165

网盘直链下载助手:八大网盘一键解析直链

同事甩来一个网盘链接,你点开一看,要先装一个几百 MB 的客户端;装完登录,登录完开始下载,速度却像蜗牛爬,1GB 的文件等了俩小时。这种"链接一到手就卡壳"的经历,大概率人人都遇到过。今天要聊的**网盘直链下载助手**(LinkSwift),就是专门解决这类问题的。 更尴尬的是,你想把链接丢给 IDM、Aria2 这类专业下载器多线程加速,网页版偏偏不告诉你真实的下载地址。所以问题的本质不在网

gitblog_01062的博客 843

micro-ROS实现ESP32与ROS 2协同控制实战指南

在机器人开发中,微控制器(MCU)与ROS 2的协同是构建低成本、高实时性系统的基石。其核心在于理解分布式通信的本质:ROS 2运行于Linux主机,而ESP32等资源受限设备需通过轻量级中间件接入DDS网络。micro-ROS作为官方嵌入式方案,以uXRCE-DDS替代传统DDS,采用Client-Agent架构,将复杂协议封装在Agent端,使ESP32仅需静态内存即可运行rclc客户端。该方案兼顾实时性、可靠性与生态兼容性,显著优于rosserial等旧有串口桥接方式。典型应用场景包括游戏手柄遥控小车

m3n5b7v8c9x的博客 1101
上一篇: 6.1 内存模式概述
下一篇: 6.3 内存池模式
Let's Chat Coding
博客等级 码龄3年 1020粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值