嵌入式系统的‘心脏移植’:FreeRTOS在STM32上的生态融合与未来演进

单点DToF激光测距传感器各家产品的比较 汇总DToF 单点测距传感器的相关信息 阅读详情

嵌入式系统的‘心脏移植’:FreeRTOS在STM32上的生态融合与未来演进

在嵌入式系统开发领域,实时操作系统(RTOS)与硬件平台的深度融合已成为提升设备性能与可靠性的关键。对于广泛应用的STM32微控制器系列而言,FreeRTOS的引入不仅是技术上的“心脏移植”,更是整个系统生态的重构与升级。这一过程涉及底层硬件架构的适配、系统资源的优化调度,以及面向物联网时代的安全性与协议集成能力拓展。本文将从实际工程经验出发,深入探讨FreeRTOS与STM32协同设计的核心逻辑,分析移植过程中的关键技术挑战,并展望未来嵌入式系统的发展趋势。

1. FreeRTOS与STM32的协同设计哲学

FreeRTOS作为一个开源的实时操作系统内核,其设计理念强调轻量级、可裁剪性和高实时性。而STM32系列微控制器基于ARM Cortex-M内核,具备丰富的外设资源和低功耗特性。两者的结合并非简单的代码移植,而是架构层面的深度适配。

从内核机制来看,Cortex-M系列处理器的中断控制器(NVIC)与FreeRTOS的调度器需要高度协同。FreeRTOS的任务切换依赖于系统的滴答定时器(SysTick)中断,而STM32的时钟配置直接影响调度精度。在实际项目中,我们通常需要根据应用场景调整时钟源和分频系数,以平衡功耗和实时性要求。

以STM32F4系列为例,其系统时钟可配置为168MHz,而FreeRTOS的时钟节拍通常设置为1kHz(即1ms中断一次)。这意味着每个时钟节拍间处理器可执行约168,000条指令,为任务调度提供了充足的粒度空间。但需要注意的是,过高的时钟频率会增加功耗,因此在电池供电的设备中需要谨慎权衡。

提示:在配置系统时钟时,建议使用STM32CubeMX工具生成初始化代码,确保时钟树配置的正确性,然后再手动集成FreeRTOS内核。

2. 硬件抽象层(HAL)与FreeRTOS的接口融合

STM32Cube生态提供了完整的硬件抽象层(HAL)驱动库,这为FreeRTOS的移植提供了便利,但也带来了新的挑战。HAL库的中断处理机制与FreeRTOS的中断优先级管理需要精心设计才能避免冲突。

关键的一步是正确配置中断优先级分组。FreeRTOS要求将SysTick和PendSV中断设置为最低优先级,以确保系统调度的稳定性。同时,所有调用FreeRTOS API的中断服务程序(ISR)必须配置在可管理的中断优先级范围内。

以下是典型的中断优先级配置表示例:

中断类型优先级值说明
SysTick0x0F系统滴答定时器,最低优先级
PendSV0x0F任务切换中断,最低优先级
SVC0x0F系统调用中断,最低优先级
外设中断0x0E-0x05应用中断,高于系统中断
不可管理中断0x04-0x00最高优先级,不调用FreeRTOS API

在实际移植过程中,我们还需要特别注意DMA传输与FreeRTOS的协同工作。当使用DMA进行外设数据交换时,需要确保DMA完成中断不会导致任务切换延迟,否则可能造成数据丢失或外设状态异常。

// 示例:FreeRTOS与HAL库协同的UART接收中断处理
void USART1_IRQHandler(void) {
    HAL_UART_IRQHandler(&huart1);
    
    // 如果接收到数据,发送任务通知
    if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE)) {
        BaseType_t xHigherPriorityTaskWoken = pdFALSE;
        vTaskNotifyGiveFromISR(xUartTaskHandle, &xHigherPriorityTaskWoken);
        portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
    }
}

3. 内存管理策略与优化实践

FreeRTOS提供了多种内存管理方案,从最简单的heap_1到更复杂的heap_5,每种方案都有其适用的场景。在STM32平台上,选择合适的内存管理策略对系统稳定性和性能至关重要。

heap_4是最常用的内存管理算法,它使用首次适应算法合并空闲内存块,有效减少内存碎片。但对于长期运行且内存分配模式多变的系统,heap_5可能更为适合,它支持非连续内存区域的组合使用。

以下是FreeRTOS内存管理方案的对比分析:

  • heap_1:最简单的实现,不支持内存释放,适用于只需要在初始化时分配内存的系统
  • heap_2:支持内存释放但不合并相邻空闲块,会产生内存碎片
  • heap_3:添加了线程保护,但碎片问题仍然存在
  • heap_4:合并空闲块减少碎片,是大多数项目的首选
  • heap_5:支持非连续内存区域,适用于复杂内存布局

在STM32F7和H7系列等具有外部SDRAM的平台上,我们可以配置FreeRTOS同时使用内部SRAM和外部SDRAM:

// 配置heap_5使用多个内存区域
const HeapRegion_t xHeapRegions[] = {
    { (uint8_t *)0x20000000UL, 0x20000 },  // 内部SRAM, 128KB
    { (uint8_t *)0xC0000000UL, 0x100000 }, // 外部SDRAM, 1MB
    { NULL, 0 }  // 数组终止标记
};

vPortDefineHeapRegions(xHeapRegions);

注意:在使用多内存区域时,需要考虑不同内存的访问速度差异。将频繁访问的数据(如任务栈和队列)放在内部SRAM中,而将大容量数据缓冲区放在外部SDRAM中。

4. 物联网协议栈集成与安全性扩展

随着物联网设备的普及,FreeRTOS与STM32的组合不再局限于简单的多任务管理,更需要支持丰富的网络协议和安全功能。FreeRTOS+TCP库提供了完整的TCP/IP协议栈,可与STM32的以太网MAC或Wi-Fi模块协同工作。

MQTT协议作为物联网设备的主流通信协议,其与FreeRTOS的集成尤为重要。我们可以使用核心MQTT库实现与云平台的高效通信:

// 创建MQTT任务示例
void vMQTTTask(void *pvParameters) {
    MQTTContext_t xMQTTContext;
    NetworkContext_t xNetworkContext;
    
    // 初始化网络连接
    xNetworkContext.pcHostname = "mqtt.broker.com";
    xNetworkContext.xPort = 8883;
    
    // 建立TLS连接
    TLS_SocketConnect(&xNetworkContext);
    
    // 连接MQTT代理
    MQTT_Connect(&xMQTTContext, &xNetworkContext);
    
    for (;;) {
        // 发布消息
        MQTT_Publish(&xMQTTContext, "device/data", pcPayload, ulPayloadLength);
        
        // 保持连接活跃
        MQTT_ProcessLoop(&xMQTTContext);
        vTaskDelay(pdMS_TO_TICKS(5000));
    }
}

在安全性方面,STM32系列芯片提供了多种硬件安全特性,如TrustZone安全扩展(在STM32L5系列中)、硬件加密加速器和安全固件安装(SFI)功能。FreeRTOS通过其内核感知特性可以与这些安全功能深度集成。

对于具有TrustZone的STM32芯片,我们可以将FreeRTOS任务分别部署在安全区和非安全区:

  1. 安全区任务:处理敏感数据(如加密密钥、安全认证)
  2. 非安全区任务:处理常规应用逻辑和网络通信
  3. 跨域通信:通过安全回调函数实现安全区与非安全区的受控数据交换

这种架构既保证了关键数据的安全性,又保持了系统的灵活性和可扩展性。

5. 性能调优与系统监控

在实际部署中,FreeRTOS在STM32上的性能表现需要通过精细调优来达到最佳状态。任务栈大小的配置是一个常见难点:分配过少会导致栈溢出,分配过多则会浪费宝贵的内存资源。

FreeRTOS提供了堆栈溢出检测机制,可以在开发阶段帮助我们发现潜在问题:

// 在FreeRTOSConfig.h中启用堆栈溢出检测
#define configCHECK_FOR_STACK_OVERFLOW 2

// 实现堆栈溢出钩子函数
void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) {
    // 记录错误信息并采取恢复措施
    log_error("Stack overflow in task: %s", pcTaskName);
}

对于性能要求苛刻的应用,我们可以使用FreeRTOS的运行时统计功能来分析CPU使用率和任务执行时间:

// 启用运行时统计
#define configGENERATE_RUN_TIME_STATS 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1

// 配置运行时统计时钟
void configureRuntimeStats(void) {
    // 使用STM32的DWT周期计数器
    CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
    DWT->CYCCNT = 0;
    DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
}

// 获取运行时统计时钟值
#define portGET_RUN_TIME_COUNTER_VALUE() DWT->CYCCNT

通过这些工具,我们可以识别性能瓶颈并优化任务优先级分配,确保关键任务及时得到执行。

6. 未来演进与技术选型考量

随着嵌入式系统复杂度的不断提升,FreeRTOS与STM32的生态融合也在持续演进。从技术发展趋势看,以下几个方面值得关注:

微内核架构扩展:FreeRTOS正在向更模块化的方向发展,开发者可以仅包含需要的组件,减少内存占用。与STM32CubeMX的深度集成使得这种模块化选择更加直观便捷。

多核支持:STM32H7系列等多核处理器需要RTOS能够有效管理异构核间通信和资源共享。FreeRTOS SMP(对称多处理)版本为这类应用提供了基础支持。

功能安全认证:对于工业控制和汽车电子等应用,FreeRTOS提供了经过认证的版本(如FreeRTOS-Kernel-MPU),与STM32的存储器保护单元(MPU)协同工作,满足ISO 26262和IEC 61508等安全标准要求。

能源效率优化:FreeRTOS的低功耗 tickless 模式与STM32的多种低功耗模式(睡眠、停机和待机)相结合,可以显著延长电池供电设备的运行时间。通过合理配置,系统在空闲时可以降至微安级电流消耗。

在与其它RTOS方案的对比中,FreeRTOS在STM32平台上的优势在于其成熟的生态系统、丰富的中间件支持和活跃的社区。但对于特定应用场景,如极高确定性要求的工业控制,可能需要考虑专为实时性能优化的RTOS;而对于极度资源受限的设备,可能更适合选择更轻量级的调度器。

我在多个物联网设备项目中实践发现,FreeRTOS与STM32的组合提供了最佳的性能与资源平衡点。特别是在需要OTA更新、安全连接和远程设备管理的场景中,这一组合展现出了显著的开发效率优势。随着STM32Cube生态的不断完善和FreeRTOS功能的持续增强,这一技术栈将继续在嵌入式领域发挥核心作用。

ubuntu下安装多版本cuda及版本切换教程 首先,从官网下载所需版本的cuda安装包,下载链接。选择对应版本后,会跳转到该版本的配置信息页面。比如我是ubuntu20.04系统,已经安装好了cuda10.0,但是现在还需要用到cuda9.0。那么,在选定版本后,配置信息如下图所示(由于Version选项中没有20.04,因此我们随便选一个即可,这里选的16.04,这一选项不会影响后面的安装),Installer Type选择为runfile(因为使用deb文件进行安装的话,可能会将已经安装的较新的显卡驱动给替换掉),选择好之后点击Base Insta 阅读详情

相关推荐

FPGA之VGA转HDMI之编码模块的编写

VGA 图像信息到 HDMI 图像信息的转化需要对输入的 VGA 图像信息进行编码、并行串行转换、单端信号转差分信号、单沿采样转双沿采样。 其中,编码模块就是为了完成 VGA 图像数据 8b 转 10b 的编码。其结构框图如下所示: 图1 编码模块框图 图2 编码模块输入输出信号功能框图 图3 编码模块参考流程图 图4 编码模块参考流程图参数说明 下面我们依据HDMI官方手册中的流程图(图3)进行 HDMI 8b...

qq_51264805的博客 3024

注塑机智能数据采集网关 ZK-D1/D3:如何把工艺参数与 SPC 监测数据送到 MES 和 IoT 平台

注塑车间设备型号杂、通信协议不一,ZK-D1/D3智能采集网关作为“协议翻译+数据建模+边缘计算”中间件,实现多机型兼容与数据标准化。通过控制器接口、IO信号及辅助设备数据融合,按模次组织工艺参数,生成含质量标记的SPC数据,支持断网缓存与补传。数据以统一模型对接MES与IoT平台,助力良率分析与过程优化。实施关键:摸清接口、统一字典、保障断网可靠性。

专业采集注塑机数据,为mes系统提供数据服务! 298

OpenCV图像去畸变实战指南:从原理到参数调优(附完整代码与效果对比)

本文深入解析了OpenCV图像去畸变的原理与实战技巧,详细对比了标准透视、鱼眼及全能型omnidir三种校正函数的核心参数调优方法。通过分析alpha、balance、centerX/Y及focalScale四大参数对输出效果的影响,并结合完整代码与效果对比图,帮助开发者精准校正镜头畸变,提升计算机视觉任务精度。

weixin_29046611的博客 341

electronica 2026|SC236亮相,面向AIoT终端的新一代智能模组

该产品基于高通跃龙™ Q-2390处理器打造,融合计算、多媒体处理与无线连接能力,为AIoT终端提供从连接、计算到应用承载的一体化能力,助力客户打造面向未来的智能设备。面向无线智能支付终端、工业手持设备、执法仪、行车记录仪等行业设备,SC236融合计算、多媒体与无线连接能力,为终端提供更丰富的交互体验和智能化应用能力。相比传统连接型模组,SC236进一步增强设备本地处理能力,使终端能够承载更多智能应用功能,推动行业设备从“连接”向“智能”演进。

Fibocom_Wireless的博客 210

Meta DINOv3实战指南:如何用7B参数ViT模型提升你的视觉任务性能(附Hugging Face部署教程)

本文提供了Meta DINOv3 7B参数ViT模型的实战部署指南。文章详细解析了该自监督视觉模型的优势,并重点演示了如何在Hugging Face平台上高效加载这一大规模模型,同时给出了图像分类、语义分割等下游任务的性能提升技巧与代码示例,帮助开发者在实际视觉任务中应用这一前沿技术。

pz89012345的博客 326

《QMT量化实战系列》支持自定义筛选与排序的多因子策略,实测年化收益超100% (1)

公众号推出《QMT量化实战》系列,通过多维度、多策略、多场景讲解QMT量化平台应用,每期附代码解读。本期复现《支持自定义筛选与排序的多因子策略》,策略包含三大核心模块:1. 通过Tushare获取30+财务因子数据;2. 提供灵活筛选机制(支持排除ST股、次新股及特定板块);3. 创新性多因子加权排序系统(支持自定义因子权重组合)。交易逻辑包含动态调仓机制,当持仓标的排名低于阈值时触发卖出。该策略具有高度可配置性,适合不同风险偏好的投资者。(149字)

qq_46262068的博客 1734

注塑机数据采集网关 ZK-D1/D3:读取控制器哪些数据对接 MES/IoT 平台

ZK-D1/D3数据采集网关可统一接入多品牌注塑机,采集设备状态、生产计数、工艺参数、报警及能耗等核心数据,通过MQTT/HTTP等协议标准化上传至MES/IoT平台。实现“一次接入、统一建模”,支撑OEE分析、产量看板、质量追溯与故障闭环管理。关键在于规范数据映射、合理设置采集频率、保障时间同步与安全传输,最终将设备数据转化为生产效率与质量管理价值。

专业采集注塑机数据,为mes系统提供数据服务! 512

微信小程序marker 上的自定义气泡cover-view字体丢失以及max-width不生效问题

微信小程序marker 上的自定义气泡cover-view字体丢失以及max-width不生效问题

weixin_42028275的博客 1502

注塑机数据采集网关 ZK-D1/D3 困局解析:如何实现与 MES/IoT 平台的实时数据对接

注塑车间数字化困局源于设备异构导致的数据采集难题。中科晟达ZK-D1/D3网关虽具备多协议适配与边缘采集能力,但常遇“采得到却采不准”“与MES对不上”“实时性与稳定性难兼顾”等挑战。核心问题在于点位映射错误、状态判定单一、数据模型错位及断网丢数。破解之道需构建四层架构:通过协议模板库与远程配置降低实施成本;以多信号组合+状态机实现精准状态判定;在网关侧下沉计算逻辑,完成数据预聚合与清洗;采用分级传输、消息幂等、本地缓存与统一时间同步,确保数据可信、实时、可消费。最终实现从“设备语义”到“业务语义”的高效转

专业采集注塑机数据,为mes系统提供数据服务! 385

深入解析Android Qcom Camera HAL3架构与Camx线程模块

本文深入解析了Android Qcom Camera HAL3架构与Camx线程模块的核心原理。文章以高通芯片平台为例,剖析了从按下快门到生成照片的完整Camera流程分析,重点阐述了Camx框架中线程池、消息队列及Fence同步机制如何协同工作,以实现高效、稳定的多线程并发图像处理,为相机性能优化提供理论基础。

weixin_29184075的博客 222

Smart PLC高速脉冲输入计米轮模块(编码器测速/计米详细讲解)

线缆行业单绞机PLC控制算法详细解读可以参看下面的文章链接:线缆行业单绞机控制算法(详细图解+代码)_RXXW_Dor的博客-优快云博客在了解单绞机之前需要大家对收放卷以及排线控制有一定的了解,不清楚的可以参看下面几篇博客,这里不再赘述,受水平和能力所限,文中难免出现错误和不足之处,诚恳的欢迎大家批评和指正。PLC张力控制(开环闭环算法分析)_RXXW_Dor的博客-优快云博客_plc闭环控制实例。SMART PLC时间间隔定时器应用(高速脉冲测频/测速)_RXXW_Dor的博客-优快云博客。

RXXW_Dor的博客 2821

009基于物联网的智能厨房安全监测系统

本文讲解物联网毕业设计选题《基于物联网的智能厨房安全监测系统》的实现:ESP32 搭配 MQ-2 燃气传感器采集可燃气体浓度、DHT11 采集温湿度,按浓度区分预警与危险两级做分级声光报警;危险时自动驱动常闭电磁阀切断气源,并通过 WiFi 推送告警到微信,数据上传云平台留存,隐患排除后可按键复位。内容含硬件清单与接线、传感器预热与阈值标定、分级报警与危险锁存设计、.h/.c 分离的多模块代码,并附测试验收、开题表述与答辩问答。照着做即可。

x1649545783的博客 391

【温室气体数据集】CAMS 发布的温室气体(GHG)数据集总结

【温室气体数据集】CAMS 发布的温室气体(GHG)数据集总结

WW、forever的博客 555

设备iot--[McgsIot]报警处理

设备iot--[McgsIot]报警处理

胡锦波的博客 197

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

锅炉房已经有PLC,还需要IoT吗?从安全控制到全局能效的智能化升级

无论是工业蒸汽锅炉房,还是酒店、医院等商业热水场景,改造都可以从现有条件出发:先梳理控制系统、仪表和通信情况,再明确安全边界与数据需求;盈电物联网的云边协同思路,是在尽量保留原有控制与仪表设备的基础上,通过IOT控制器补齐数据接入和边缘处理能力,再与云端平台协同,逐步建立运行、能耗与运维之间的数据闭环。锅炉房智能化,不是用IoT取代PLC,也不是简单增加一块远程大屏,而是在保障安全控制独立可靠的基础上,让分散的数据真正服务于运行管理。将告警、排查、处理、复核和维修记录串联起来,形成可追溯的设备档案。

olzorange的博客 291

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IoT 固件安全与 Pwn 实战学习笔记

本文基于D-Link DCS-935L固件(版本1.09.02)分析漏洞CVE-2025-10779,系统梳理从固件解包到栈溢出利用的全流程。通过binwalk提取根文件系统,结合inittab与rcS定位HTTP/HNAP服务;利用httpd.ini映射路由,确认/HNAP1/可被外部访问;在MIPS大端架构下,使用qemu-mips-L+GDB调试运行CGI程序,发现strcpy(haystack, getenv("HNAP_AUTH"))存在无边界复制漏洞。通过构造含空格分隔符的载

2503_91800161的博客 420

lwip-2.0.3

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

【RHCA+】iotop命令(实时监控磁盘IO)

目录:RHCA+ -> 12 系统监控 -> 43 iotop命令(实时监控磁盘IO) ”[root@wuzuniao ~]# yum -y install iotop #安装工具。[root@wuzuniao ~]# iotop #实时监控磁盘io。语法格式:iotop。

302

注塑机智能数据采集网关 ZK-D1/D3 对接 MES/IoT/ERP 平台数据展示实践

ZK-D1/D3注塑机数据采集网关支持多品牌设备接入,实现运行状态、工艺参数、生产计数等数据的实时采集与标准化上报。通过MQTT、HTTP、OPCUA等协议对接MES、IoT、ERP平台,采用“边缘采集—网关汇聚—平台展示”架构,统一数据模型映射,实现设备透明化管理与生产数据闭环。实施中需注重网络规划、时间同步、断点续传与安全防护,助力工厂实现生产可追溯、决策数据化。

专业采集注塑机数据,为mes系统提供数据服务! 291

注塑机数据采集网关 ZK-D1/D3 如何与 MES/IOT 平台对接并展示数据

本文系统阐述注塑车间数据采集难题及ZK-D1/D3网关解决方案,聚焦设备异构协议统一、数据建模规范与四层链路对接。通过明确设备唯一标识、统一命名规则与上行协议选择,实现多品牌注塑机数据标准化采集与传输。结合MQTT/HTTP/OPCUA多协议支持,构建从设备层到MES/IOT平台的完整链路,支撑实时看板、历史趋势、OEE分析与报警管理。强调前期标准化与端到端验证的重要性,确保数据可靠落地,赋能智能制造。

专业采集注塑机数据,为mes系统提供数据服务! 254

IIOT数据中台是什么?有什么应用场景?

它本质上是一种集成了多源异构数据采集、边缘预处理与统一数据服务能力的工业数据平台,能够将 PLC、CNC、工业机器人、传感器、能源仪表等设备产生的实时数据,以及 ERP、MES、WMS 等系统的业务数据,统一汇聚、治理、建模后,以标准 API 或数据服务形式供上层应用调用,让工业互联网平台回归分析决策与业务创新的核心职能。针对电表、水表、气表等能源仪表数据,数据中台统一采集并标准化电、水、气、汽等能耗口径,按产线、工序、班组等维度进行分项计量与统计分析。OEE 分析与效率优化。设备互联与产线透明化。

2403_88612619的博客 114

定位数据怎么推给 IoT 平台?消息协议选型与接入准备

园区定位数据推送方式应基于消费方数量、实时性、数据量级与网络条件选择:多系统、高频小数据量且弱网络场景推荐消息中间件(发布订阅);单系统、内网环境可选接口回调或定时拉取。需合理设计主题结构,保障数据一致性与幂等性,提前规划鉴权、监控与异常处理机制。建议先小范围验证端到端性能,再逐步扩展,具体协议与规范以项目交付文档为准。

QXWZ_的博客 138

银行、电力、医疗和物联网行业证书

银行、电力、医疗和物联网行业证书

humors221的专栏 288

中科晟达注塑机数据采集网关 ZK-D1/D3:如何读取各品牌注塑机系统数据并对接 MES/IoT 平台

注塑车间数字化改造核心挑战在于多品牌、多协议设备的数据采集。中科晟达ZK-D1/D3网关通过边缘计算,兼容海天、发那科等主流机型及私有协议,支持EUROMAP63/77、Modbus、OPCUA等标准,实现南向多协议解析与北向标准化上行(MQTT/OPCUA/HTTP)。结合统一点位模型设计与断网续传机制,助力MES高效对接。部署中需重点确认通信权限、合理配置轮询周期、保障时间同步与数据去重,可有效解决“采不到数”“数据不准”等痛点,为OEE分析、工艺追溯与智能运维提供可靠数据底座。

专业采集注塑机数据,为mes系统提供数据服务! 299

填完一张场景表单,SagooIoT 在后台生成一条规则链

链上的functions节点最终要调到一个 Go 函数。msg进、msg出。业务参数从反序列化,执行结果通过交回链上,同时塞进执行日志(下一节讲)。设置属性把界面上的属性数组摊平成一个 map,交给。下行指令走的是平台既有的属性设置通道,和 REST 接口下发的指令是同一条路——场景不是旁路,它用的是同一套下行能力。获取属性按属性列表逐个调,把结果收集成 map。这样"先读当前状态、再决定动作"也能在一个动作里完成。功能调用把和parameter交给,也就是物模型里的"服务调用"。发送通知。

辛佳雨的专栏 195

越华环保集团碳惠小屋|面向碳普惠场景的 IoT 终端与碳数据链路设计方案

越华环保集团碳惠小屋这套 IoT 碳数据方案,把物联网感知技术和碳普惠业务规则深度绑定,补齐了碳普惠线下可信数据源短板。相比通用回收设备,它的核心价值在于标准化碳数据链路与可对接上层碳普惠平台的开放能力。随着各地碳普惠数字化建设提速,对合规、可溯源线下采集终端需求持续增长。这套架构具备良好扩展性,后续可以继续接入骑行、节水节电等更多低碳感知终端,作为统一的公众低碳数据采集底座,支撑区域碳普惠数字化体系持续迭代升级。

MuMuMu1223的博客 198

什么是水面蒸发监测站?基于 4G 物联网水面蒸发传感器野外部署方案详解

水面蒸发量是水文水资源监测里重要的观测要素,传统人工观测方式已经难以满足现代化水文信息化建设需求。基于 4G 物联网的水面蒸发监测站,通过标准化水面蒸发传感器、低功耗采集终端、太阳能供电体系,实现蒸发量自动连续观测。 野外站点的选址、调平、防雷、定期维护,是保证蒸发数据准确可靠的关键。这套方案目前已经广泛应用于水库、灌区、水土保持、生态湿地等水文监测项目,是水资源自动化监测体系中非常实用的观测方案

sun15369027572的博客 346
上一篇: Qt项目从x86 Ubuntu迁移至ARM树莓派:交叉编译避坑实践
下一篇: 从零构建:设备树与Makefile在嵌入式Linux移植中的双核心解析
sql99
博客等级 码龄19年 168粉丝 1905原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值