rtthread 字节对齐问题 int指针访问非对齐地址崩溃

基于RT-Thread的工业质检AI:从启动流程到模型部署实战 从嵌入式系统的基础概念出发,阐述RT-Thread实时操作系统如何为工业质检AI提供稳定底座。文章先讲解Cortex-M启动初始化流程,说明裸机到RTOS的思维转变;再结合硬件选型、图像采集与模型转换,展示如何用轻量神经网络在MCU上实现缺陷检测。针对实际部署中的启动卡死、内存不足、量化精度损失等问题,给出排查方法与优化技巧。无论是入门开发者还是寻求工程落地,都能从中理解AI推理在资源受限设备上的实现路径。以螺丝缺陷检测为例,演示从PC训练到嵌入式推理的完整流程,体现RT-Thread在智能制造领域的应用价 阅读详情

rtthread 字节对齐问题 int指针访问非对齐地址崩溃
环境:
SOC: i.MX RT1050
底板: 野火 RT1052
Kernel: rt-thread

背景:
我正在实现解析udp包, 而udp包的结构不是字节对齐的, 这个时候我使用__packed来说明按照1字节对齐, 在解析udp包数据的地方, 取udp->srcaddr这个成员的值的时候, 出现 UNALIGN(未对齐) 错误. 我将该问题用以下代码来复现. 如果有更好的网络协议数据结构体定义方式, 还请告知, 谢谢

现象:
使用rtthread master版 生成的工程运行后会出现以下问题, 但使用裸机程序, 或者 rtthread nano版 运行后不会出现以下问题. 这个问题还未有答案, 如果有哪位道友, 遇到了, 一起学习探讨

/*
        1.内存 堆区
            a.uint32_t* 类型, 所指向的地址必须是四字节对齐
            b.uint16_t* 类型, 所指向的地址必须是两字节对齐
        2.内存 RW/ZI 区
            a.uint32_t* 类型, 所指向的地址必须是四字节对齐
            b.uint16_t* 类型, 所指向的地址必须是两字节对齐
        3.DTCM
            a.uint32_t* 类型, 非四字节对齐地址任然可以访问
            b.uint16_t* 类型, 非两字节对齐地址任然可以访问
        4.内存 栈区
            定义一字节对齐结构体, 任意成员可以访问
        5.内存 栈区 char数组
            a.uint32_t* 类型, 非四字节对齐地址无法访问
            a.uint16_t* 类型, 非两字节对齐地址无法访问
    */
    /* 内存 栈区 char数组 
    __packed char data[128];
    rt_kprintf("&data[0]: %p\n", &data[0]);
    __packed uint32_t* p = (__packed uint32_t*)(&data[0]);
    rt_kprintf("*p: %x\n", *p);
    p = (__packed uint32_t*)(&data[0]+1);
    rt_kprintf("p: %p\n", p);
    rt_kprintf("*p: %x\n", *p);
    
    __packed uint16_t* p2 = (__packed uint16_t*)(data);
    rt_kprintf("*p2: %x\n", *p2);
    p2 = (__packed uint16_t*)(data+1);
    rt_kprintf("*p2: %x\n", *p2);
    p2 = (__packed uint16_t*)(data+3);
    rt_kprintf("*p2: %x\n", *p2);*/
    
    rt_kprintf("sizeof(eth_hdr): %d; sizeof(ip_hdr): %d\n",sizeof(eth_hdr),sizeof(ip_hdr));
    uint8_t* tpoint = (uint8_t*)malloc(60);
    rt_kprintf("tpoint: %p\n", tpoint);
    eth_hdr* ethhdr = (eth_hdr*)tpoint;
    tpoint += sizeof(eth_hdr);
    ip_hdr* iphdr = (ip_hdr*)tpoint;
    rt_kprintf("tpoint: %p\n", tpoint);
    rt_kprintf("iphdr: %p\n", iphdr);
    iphdr->tlen = 0x10;
    rt_kprintf("iphdr->tlen: %x\n", iphdr->tlen);
    rt_kprintf("&iphdr->srcaddr: %p\n", &iphdr->srcaddr);
    iphdr->srcaddr = 0x1111;
    rt_kprintf("iphdr->srcaddr: %x\n", iphdr->srcaddr);
    
    /* 内存 栈区 一字节对齐结构体访问 
    ip_hdr iphdr;
    iphdr.srcaddr = 0x1111;
    rt_kprintf("sizeof(iphdr): %d\n", sizeof(iphdr));
    rt_kprintf("iphdr.srcaddr: %d\n", iphdr.srcaddr);*/
    
    /* DTCM 0x20000000 
    uint32_t* p = (uint32_t*)0x20000000;
    rt_kprintf("*p: %x\n", *p);
    p = (uint32_t*)0x20000004;
    rt_kprintf("*p: %x\n", *p);
    p = (uint32_t*)0x20000008;
    rt_kprintf("*p: %x\n", *p);
    
    uint16_t* p2 = (uint16_t*)0x20000000;
    rt_kprintf("*p2: %x\n", *p2);
    p2 = (uint16_t*)0x20000002;
    rt_kprintf("*p2: %x\n", *p2);
    p2 = (uint16_t*)0x20000004;
    rt_kprintf("*p2: %x\n", *p2);
    
    p = (uint32_t*)0x20000001;
    rt_kprintf("*p: %x\n", *p);
    p2 = (uint16_t*)0x20000001;
    rt_kprintf("*p2: %x\n", *p2);
    p2 = (uint16_t*)0x20000003;
    rt_kprintf("*p2: %x\n", *p2);*/
    
    /* 内存 RW/ZI 区, 字节对齐测试 
    uint32_t* p = (uint32_t*)0x80200000;
    rt_kprintf("*p: %x\n", *p);
    p = (uint32_t*)0x80200004;
    rt_kprintf("*p: %x\n", *p);
    p = (uint32_t*)0x80200008;
    rt_kprintf("*p: %x\n", *p);
    
    uint16_t* p2 = (uint16_t*)0x80200000;
    rt_kprintf("*p2: %x\n", *p2);
    p2 = (uint16_t*)0x80200002;
    rt_kprintf("*p2: %x\n", *p2);
    p2 = (uint16_t*)0x80200004;
    rt_kprintf("*p2: %x\n", *p2);
    
    p = (uint32_t*)0x80200001;
    rt_kprintf("*p: %x\n", *p);
    p2 = (uint16_t*)0x80200001;
    rt_kprintf("*p2: %x\n", *p2);
    p2 = (uint16_t*)0x80200003;
    rt_kprintf("*p2: %x\n", *p2);*/
    
    
    /* 堆区, 字节对齐测试
    uint32_t* p = (uint32_t*)0x802059a0;
    rt_kprintf("*p: %x\n", *p);
    p = (uint32_t*)0x802059a4;
    rt_kprintf("*p: %x\n", *p);
    p = (uint32_t*)0x802059a8;
    rt_kprintf("*p: %x\n", *p);
    
    uint16_t* p2 = (uint16_t*)0x802059a0;
    rt_kprintf("*p2: %x\n", *p2);
    p2 = (uint16_t*)0x802059a2;
    rt_kprintf("*p2: %x\n", *p2);
    p2 = (uint16_t*)0x802059a4;
    rt_kprintf("*p2: %x\n", *p2);
    
    p = (uint32_t*)0x802059a1;
    rt_kprintf("*p: %x\n", *p);
    p2 = (uint16_t*)0x802059a1;
    rt_kprintf("*p2: %x\n", *p2);
    p2 = (uint16_t*)0x802059a3;
    rt_kprintf("*p2: %x\n", *p2);*/

程序崩溃报错图示:
程序崩溃报错

在 rtthread nano版 中执行 “内存 RW/ZI 区” 测试, 测试结果如下
在这里插入图片描述

新的怀疑点
在这里插入图片描述
从图中第一行可以看出, 以太网协议数据头结构体大小为14个字节(不为4的整数倍), 而ARP协议数据头结构体, IP协议数据头结构体, UDP协议数据头结构体大小均为4的整数倍. 而保存数据的地址如图中的0x802114ac, 是可以被4整除的. 那么该地址偏移14个字节后地址为0x802114ba, 显然该地址不被4整除. 我在猜测问题是否出在这里呢? 如果数据偏移以太网协议数据头大小到达 ARP协议数据的初始位置. 该地址是4的整数倍, 情况有会是怎么样呢?
我尝试在循环前分别定义了

eth_hdr recv_eth_hdr;
ip_hdr recv_ip_hdr;
icmp_hdr recv_icmp_hdr;
arp_data recv_arp_data;

四个结构体, 然后在检测协议数据前, 从tpoint指针所指向的地址开始, 将接头体大小的数据拷贝到以上定义的结构体中, 然后再来做检测. 然而问题依旧存在, 但问题的范围更加小了, 那就是操作0x802114ba这个地址上的数据就会导致崩溃, 那为什么会这样呢? 我看后面只能通过看汇编源代码, 才能找到问题的症结所在啊.

最后对照代码发现跟以下代码有关系, 具体原因后面在研究

#if defined(BSP_USING_SDRAM)
    /* Region 7 setting */
    MPU->RBAR = ARM_MPU_RBAR(7, 0x80000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_32MB);

    /* Region 8 setting */
    MPU->RBAR = ARM_MPU_RBAR(8, 0x81E00000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB);
#endif

搜索到的相关信息
1
mpu内存保护单元寄存器种类及相关编程
ARM存储器之:存储保护单元MPU
M=0: 禁止MPU
M=1: 使能MPU
A(bit[1])选择是否支持内存访问地址对齐检查
B=0: 禁止地址对齐检查
B=1: 使能地址对齐检查

2
【安富莱STM32F407之uCOS-III教程】第6章 内存保护单元MPU
SCB->CCR |= SCB_CCR_STKALIGN_Msk; // 使能堆栈的双字对齐模式

3
访问未对齐的内存引起硬件异常的解决方法
该代码初始化MPU,使得SDRAM存储器区域被认为是Normal Memory type,而不是Device Memory type。 这将禁用访问对齐限制。

RT-Thread启动流程全解析:从硬件上电到多任务调度 嵌入式实时操作系统(RTOS)的启动流程是连接硬件与软件服务的关键桥梁,其设计直接影响系统的稳定性与实时性。启动过程通常遵循从底层硬件初始化到高层应用启动的分层递进模型,涉及中断管理、内存分配和任务调度等核心机制。在工程实践中,理解启动流程有助于快速定位系统异常,优化资源分配,并确保多任务环境可靠运行。本文以RT-Thread为例,深入剖析其从汇编启动、C运行时初始化到应用线程创建的全过程,结合常见调试技巧与内存管理实践,为开发者提供从原理到落地的系统启动指南。 阅读详情

相关推荐

MCU固件启动到OTA升级:从复位向量到异常排查的完整工程链路

嵌入式开发中,理解固件从上电复位到用户main的完整启动流程,是掌控系统运行的基础。Cortex-M内核通过向量表获取初始栈指针和复位向量,启动代码负责搬运.data、清零.bss并完成时钟初始化,最终才进入C运行时环境。当系统发生HardFault时,利用异常压栈机制读取PC和LR寄存器,可快速还原故障现场。而OTA升级的工程化实现,则依赖A/B分区设计、签名校验和断点续传,确保远程更新安全可靠。从裸机到RTOS,再到SoC平台,启动链路虽有差异,但排查方法论相通。本文系统拆解固件生命周期中的启动流程、故

weixin_33894640的博客 397

RT-Thread启动流程全解析:从芯片上电到多线程调度

实时操作系统(RTOS)的启动过程是嵌入式系统开发的核心基础,它决定了系统的稳定性和实时性。其原理是从硬件复位开始,逐步建立C语言运行环境,初始化内核数据结构,最终启动调度器实现多任务并发。这一过程的技术价值在于为上层应用提供了确定性的任务调度和资源管理能力,是物联网设备、工业控制等实时应用场景的基石。在RT-Thread中,通过精心设计的启动阶段和自动初始化机制,系统能够高效地从底层硬件过渡到多线程环境。本文聚焦于RT-Thread的启动全景,深入剖析其从芯片上电、内存初始化到线程创建与调度的完整链路,其

weixin_33946605的博客 526

RT-Thread 2.0.1移植STM32F4xx:从内核原理到工程实践详解

实时操作系统(RTOS)是嵌入式开发的核心组件,它通过任务调度、内存管理和中断处理等机制,为资源受限的微控制器(MCU)提供多任务并发执行能力。其工作原理基于优先级抢占式调度,确保关键任务能及时响应,并通过硬件抽象层(HAL)屏蔽底层硬件差异,提升代码可移植性。在工业控制、消费电子等领域,RTOS能显著提升系统可靠性和开发效率。本文以经典的Cortex-M4内核MCU STM32F407为载体,深入剖析RT-Thread 2.0.1这一轻量级RTOS的移植过程,涵盖启动流程、线程调度和内存管理等内核机制,并

weixin_30292745的博客 344

使用stm32cubemx生成rtthreadnano工程的踩的一点坑

rtthread nano

accentd的博客 1477

STM32 HardFault手动分析实战:从CFSR到堆栈回溯

HardFault是ARM Cortex-M系列MCU中最关键的异常机制,本质是CPU在执行非法操作(如除零、内存越界、未对齐访问)时触发的强制保护中断。其原理基于内核自动保存故障上下文至CFSR、HFSR等状态寄存器,并压栈PC/xPSR等关键现场。技术价值在于提供可复现、可解码的底层诊断依据,避免依赖IDE黑盒工具或玄学排查。典型应用场景涵盖裸机驱动开发、RTOS集成(如RT-Thread)、DMA与中断协同等嵌入式核心环节。本文聚焦STM32平台,详解CFSR位域解析、MSP/PSP堆栈识别及PC回溯

weixin_30595035的博客 256

嵌入式固件启动流程与故障定位:从MCU到SoC的完整解析

嵌入式固件开发中,系统启动流程是决定稳定性的基石。从复位向量、BootROM到Bootloader、RTOS初始化,每个环节出错都可能导致启动失败或偶发死机。理解启动原理不仅有助于快速定位DDR初始化失败、串口无输出、概率性启动异常等棘手问题,也是实现可靠OTA升级的基础。无论是MCU裸机开发,还是基于uboot的SoC平台,掌握从硬件上电到main函数执行的完整链路,并建立证据驱动的故障假设树,能显著提升排查效率。本文结合实际案例,拆解启动流程细节、故障定位工具链及OTA工程化要点,为嵌入式开发者提供一套

weixin_34320159的博客 406

基于RTT Nano的多任务嵌入式程序设计翼

基于RTT Nano的多任务嵌入式程序设计 一 实验任务: 参考RT-Thread官方资料,在stm32f103上移植 RTT Nano,完成一个周期性多任务嵌入式程序设计,至少包括2~3个周期性任务,例如:LED等的闪灭、串口数据输出等。综合实验报告中应包括: 1)国产RT-Thread 操作系统的特点和优势; 2)RTT Nano的功能框架; 3)在stm32F103上移植RTT Nano,完成多任务程序的详细步骤; 二 实验过程: 实验(1)国产RT-Thread 操作系统的特点和优势

lg_laowang的博客 658

akshare 布林通道策略

import datetime import pandas as pd import backtrader as bt import matplotlib.pyplot as plt from datetime import datetime import matplotlib import akshare as ak %matplotlib inline class Boll_strategy(bt.Strategy): #自定义参数,每次买入1800手 params=(('size'.

qq_26742269的博客 5340

rt-thread 使用宝典(2022-0516更新)

接触 rt-thread 已有半年,混论坛也5个半月了,期间遇到过各种奇奇怪怪的棘手问题,有过尴尬,也自信曾经提供过比较妙的应对方案。所以产生了将一些典型的使用技巧汇总分享出来的想法,遂有此篇。...

rtthreadiotos的博客 4258

量化交易新手入门:从零开始搭建你的第一个Python交易策略(附完整代码)

本文为量化交易新手提供从零开始搭建Python双均线策略的完整指南,涵盖环境配置、数据获取、策略实现及风险管理等关键步骤。通过详细的代码示例和实践建议,帮助读者快速掌握量化交易的核心技术,并避免常见陷阱。文章特别强调Python在量化交易中的技术革新优势,适合希望进入金融科技领域的初学者。

weixin_26905487的博客 443

【网络协议】TCP的拥塞控制机制

前言 计算机网络中的带宽、交换节点中的缓存和处理机等,都是网络的资源,在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞。 所谓拥塞控制,就是防止过多的数据注入到网络中,从而使网络中的路由器或链路不致过载。要注意用拥塞控制与流量控制的区别,拥塞控制是一个全局性的过程,涉及到所有的额主机、路由器,以及与降低网 拥塞控制的算法有:慢开始、拥塞避免、快重传、快恢复四种。 慢开始和拥塞避免 发送方维持一个拥塞窗口的状态变量,其大小取决于网络的拥塞程度

兰亭风雨的专栏 1万+

RT1052的介绍及MDK

无

qq_45578181的博客 4175

川崎机器人 AS语言基础运动指令表

    功能简介 动作方式 参考坐标系 位置特性 X,Y,Z 角度特性 O,A,T 指令格式(距离单位毫米,时间单位秒,角度单位度 示例1 示例2 运 动 指 令 JMOVE 以关节移动到目标点 关节移动方式 基础坐标系 不受控 伪随机动作 JMOVE 目标点 JMOVE #yd JMOVE put1 LMOVE 以直线移动到目标点 直线移动方式

喜欢自学并分享经验的技术宅 9353

rtthread 学习

.............

lanzh_syf的博客 818

描述符链表(Descriptor Chain)是什么?

描述符链表是硬件加速数据传输的核心数据结构,通过链式描述符(包含地址、长度、控制标志等)实现DMA自动批量处理,显著降低CPU负载。其工作原理为:CPU初始化链表后,硬件按序处理每个描述符,完成自动跳转与中断通知。在网卡收包、NVMe存储等场景中应用广泛,优势包括批处理、低延迟和灵活调度。需注意内存对齐、缓存一致性等实现细节,优化手段包括预分配描述符池、环形缓冲区等。该技术是网络/存储领域提升吞吐量的关键方案。

guigenyi的专栏 777

从Reset到Read:深入解析Rolling Shutter曝光流水线

本文深入解析Rolling Shutter(卷帘曝光)的工作原理,重点探讨Reset和Read信号在图像传感器中的关键作用。通过Reset-Read流水线机制,详细解释了曝光控制、时序调优及运动伪影补偿等核心技术,帮助读者理解卷帘曝光在高速摄影和动态场景中的应用。

weixin_42531925的博客 254

RT-Thread启动流程全解析:从芯片上电到多任务调度

嵌入式实时操作系统(RTOS)的启动流程是系统稳定运行的基石,它定义了内存布局、硬件初始化顺序和多任务环境搭建的基础。其核心原理是从芯片复位向量开始,依次完成数据段初始化、时钟配置,进而初始化内核调度器、内存管理和设备框架。对于开发者而言,深入理解启动流程的技术价值在于能够精准定位系统启动失败、内存分配异常等复杂问题,提升调试效率。在嵌入式开发、物联网设备等应用场景中,掌握如RT-Thread这类RTOS的启动机制,尤其是其自动初始化(INIT_EXPORT)和线程创建流程,是实现从“上电”到“多任务运行”

weixin_33853794的博客 292

安装了anaconda,pycharm导入numpy时提示没有该包(模块)?

**问题详情:**我安装了anaconda,在利用Pycharm学习numpy这个库的时候,导入numpy这个包的时候提示我没有nummpy这个模块:No module named numpy.如下图所示。 应该说安装了Anaconda,里边就自带了numpy这个库,就应该能够使用。我一个新手怎么搞得懂呢?于是网上查了查找到了一个解决办法,说是我项目的解释器应该设置为Anaconda安装目录下的python.exe,而不应该是系统自带的:https://blog.youkuaiyun.com/aanndd77/art

qq_39820505的博客 1万+

嵌入式固件进阶:启动流程、故障定位与OTA工程化实战解析

嵌入式系统开发中,从MCU复位到main函数执行,再到RTOS调度器启动,每一步都隐含硬件与软件的协作逻辑。理解启动流程是排查启动时序异常、外设初始化失败等问题的前提。当系统运行异常时,系统化的故障定位方法——如利用HardFault寄存器现场、addr2line反查PC值、RTT日志分析——能替代盲目猜测,快速还原死机现场。在量产部署阶段,OTA升级的工程化设计至关重要,包括Flash分区规划、断点续传、签名校验以及失败自动回滚机制,确保设备在恶劣网络或意外断电下仍可恢复。本文结合Cortex-M、RT-

weixin_34411563的博客 365

MinerU与Docling:智能文档处理框架对比

本文对比分析了MinerU和Docling两大智能文档处理框架。MinerU专注于高精度PDF解析,采用多模态AI技术,在学术文献、金融报表等复杂文档处理上表现优异;Docling则定位企业级多格式文档处理平台,支持10+格式转换,更适合文档管理系统等场景。技术层面,MinerU基于VLM模型实现端到端处理,Docling采用插件化多后端架构。性能测试显示MinerU精度更高(95%+),但资源消耗较大;Docling处理速度更快(1-3秒/页),部署更灵活。

轩哥的个人研究和成长记录 1913

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

FreeRTOS链表源码list.c/list.h深度解析:实时调度的底层骨架

双向循环链表是嵌入式实时操作系统的核心数据结构,其设计直接影响任务调度、同步原语和中断响应的确定性。FreeRTOS通过精简的List_t容器与ListItem_t节点,以xItemValue实现优先级/延时排序,pvOwner支持任务反查,pvContainer保障操作归属安全,从而在资源受限MCU上达成微秒级任务切换。这种轻量级链表机制支撑了队列、信号量、事件组等所有同步功能,也是理解freertos spi乱码、freertos can通信异常及任务切换时机等高频问题的根本入口。掌握list.c中vL

weixin_30383279的博客 303

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

从NEMU模拟器到RT-Thread:多道程序与上下文切换的底层实现

多道程序是现代操作系统的核心机制,它允许多个程序并发执行,从而显著提升硬件资源利用率。其底层原理依赖于任务隔离与上下文切换技术,通过为每个任务维护独立的任务控制块(TCB)和运行环境,实现CPU状态的保存与恢复。在工程实践中,这一机制是构建实时操作系统(RT-Thread)等复杂系统的基石,广泛应用于嵌入式开发、服务器调度等场景。本文以NEMU模拟器为基础,深入探讨了如何实现任务控制块(TCB)设计与上下文切换,并成功引导RT-Thread,为理解操作系统多任务管理的底层逻辑提供了实践路径。

weixin_30647065的博客 399

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

嵌入式固件进阶:启动流程、故障定位与OTA升级实战

嵌入式开发中,代码运行后的底层行为往往决定系统稳定性。理解芯片从复位向量到应用入口的启动链路,是排查启动异常与实现可靠固件升级的基础。Cortex-M内核通过向量表完成初始跳转,而RT-Thread等RTOS则在内核初始化后启动调度,任何环节的疏漏都可能导致HardFault或卡死。面对量产设备偶发故障,工程师需建立分层二分定位法,结合日志、断言与异常钩子快速缩小问题范围。同时,OTA升级不仅是固件下载,更涉及分区规划、多级校验与断电回滚设计,确保设备在任何异常下都能恢复。本文从启动流程拆解出发,深入故障定

weixin_30399155的博客 262

嵌入式固件启动流程与OTA工程化实战:从信任链建模到产线故障定位

嵌入式固件启动流程是连接硬件复位与操作系统运行的关键状态机,其本质是多阶段、带信任锚的数据流传递过程;理解 Cortex-M 的 VTOR 对齐约束、i.MX6 的 IVT 四步校验机制,是规避 HardFault 和 HAB 失败的技术前提;在资源受限的 MCU 上实现安全 OTA,需平衡签名验签、差分更新与内存占用三重约束,典型方案如流式 LZ4 解压 + AES-GCM 解密 + 增量 patch 应用;本文聚焦真实量产场景中的启动失败、升级回滚、向量表错位等高频问题,提供可落地的寄存器快照比对、启动

weixin_33997389的博客 410

RT-Thread内核解析:从任务调度到实时性保障的嵌入式开发实践

实时操作系统(RTOS)是嵌入式开发中实现多任务并发与资源管理的核心技术,其内核通过任务调度、内存管理和进程间通信等机制,解决了裸机编程中系统响应延迟和资源冲突的痛点。RTOS的原理在于通过优先级抢占式调度算法,确保高优先级任务能够即时响应外部事件,同时利用信号量、互斥锁等同步机制保障多任务环境下的数据安全。这一技术价值在于显著提升了嵌入式系统的实时性、可靠性与可维护性,广泛应用于物联网设备、工业控制和消费电子等领域。本文以RT-Thread为例,深入探讨其内核的任务管理、调度器实现及实时性优化策略,帮助开

weixin_30843605的博客 324

为什么需要字节对齐

概念   在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然边界(alignment)分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有

大自然的代码 5870
上一篇: rtthread rtconfig.h配置说明-内存管理配置
下一篇: 硬件延时任务--hwdelay_task
returningprodigal
博客等级 码龄12年 53粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值