0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

线程栈分配惹的祸?系统异常这样解决!

RT-Thread官方账号 2024-10-31 08:08 次阅读

嵌入式操作系统通常被认为有一定的学习门槛,为帮助嵌入式工程师降低RTOS的使用难度,RT-Thread提供了文档教学中心视频中心、论坛交流等多种支持。然而在实际项目中,开发者们仍可能会遇到各种挑战,尤其当项目规模扩大、代码复杂度增加时,各种“难以捉摸”的bug便会频繁出现,令工程师们一头雾水,不知从何入手。这些问题可能涉及内存管理、任务调度、栈溢出等复杂内容。

这些问题是否也在你的项目中时常困扰着你?

51ac409a-971c-11ef-8084-92fbcf53809c.png

系统莫名其妙进入Hardfault

系统运行过程线程异常挂起

不正确使用内核API导致系统异常

系统运行过程发生断言

不清楚某些系统组件或软件包的使用方法

线程栈分配不合理导致系统异常

应用代码不规范导致系统异常

如何修改Scons脚本,Kconfig...

...

作为初学者非常容易遇到的一个问题是:线程栈分配不合理导致系统异常

1

提出问题

刚开始接触RT-Thread的小伙伴在创建线程时,常常会遇到下述问题:

51d1a9ac-971c-11ef-8084-92fbcf53809c.png

2

分析问题

从终端输出的信息我们可以获取到的关键信息有

1) 在发生异常的线程为entry

51dd8970-971c-11ef-8084-92fbcf53809c.png

2) 该线程的栈空间为0x100

51eac478-971c-11ef-8084-92fbcf53809c.png

3) SCB_CFSR_UFSR:0x01 UNDEFINSTR

UNDEFINSTR通常是PC指针指向非法地址执行指令导致,通过1)点可以定位到问题发生在entry线程,第2)点可以看出entry线程的栈空间有点小,因此初步定位线程栈溢出。

3

解决问题

最终找到问题线程栈太小导致线程栈溢出,同时回到线程入口函数可以发现在线程中定义了一个很大的数组导致了线程栈的溢出,进一步证明了上述的问题。

解决问题就是依据经验和工具进行分析尝试的一个过程。

1)将线程栈改大一些,entry线程正常运行。

2)使能内核的堆栈溢出检查,运行输出msh >thread:entry stack overflow

最终找到问题线程栈太小导致线程栈溢出,同时回到线程入口函数可以发现在线程中定义了一个很大的数组导致了线程栈的溢出,进一步证明了上述的问题。

RT-Thread开班啦,技术专家团队手把手带您上手RT-Thread嵌入式操作系统,我们开放了为期三天的嵌入式操作系统专业培训班!本次培训将会深入讲解RT-Thread嵌入式实时操作系统的核心概念、实战技巧、应用场景、嵌入式开发疑难杂症分析与答疑!

培训时间

2024/11/9-2024/11/11(3天时间)

本次培训是付费培训,培训费用:2918元 - 含税 (3日),提供培训手册+硬件平台。培训费用同时也包含午餐。

培训内容

时间

培训内容

2024/11/9

RTOS内核

1. 内核原理

1.1 RT-Thread系统启动流程

1.2 RT-Thread线程与线程切换学习

1.3 RT-Thread线程与中断切换学习

2. 应用编程

2.1 RT-Thread多线程编程

(1)RT-Thread多线程抢占学习

(2)RT-Thread多线程轮询学习

(3)RT-Thread多线程调试实践

2.2 RT-Thread线程同步

(1)RT-Thread信号量原理,调试与应用实践

(2)RT-Thread互斥量原理,调试与应用实践

(3)RT-Thread事件集原理,调试与应用实践

2.3 RT-Thread线程通信

(1)RT-Thread消息邮箱原理,调试与应用实践

(2)RT-Thread消息队列原理,调试与应用实践

3. RT-Thread动态内存管理

3.1 RT-Thread动态内存管理原理介绍

3.2 RT-Thread动态内存应用实践

2024/11/10

RT-Thread I/O设备驱动

1. RT-Thread构建与配置系统

1.1 Kconfig配置系统

(1) Kconfig工作机制

(2) Kconfig语法介绍

1.2 Scons构建系统

(1) Scons语法介绍

(2) Scons使用示例

1.3 Env工具

(1) Env常用命令使用示例

2. RT-Thread I/O设备框架

2.1 I/O设备框架原理

(1) 原厂驱动库、RTT HAL库驱动、RTT驱动框架关系介绍

2.2 I/O设备框架应用实践

(1) 虚拟驱动移植实战

3. RT-Thread 设备驱动框架

3.1 PIN设备

(1) PIN设备驱动框架原理

(2) PIN设备驱动应用实践

3.2 UART设备

(1) UART设备驱动框架原理

(2) UART设备驱动应用实践

3.3 I2C设备

(1) I2C设备驱动框架原理

(2) I2C设备驱动应用实践

4. RT-Thread设备驱动实战

4.1 串口设备组件

(1) 串口类设备组件介绍

(2) 串口设备驱动应用实践

4.2 I2C设备驱动

(1) I2C Tools软件包介绍

(2) I2C设备驱动应用实践

2024/11/11

RT-Thread组件与系统问题排查实践

1. 系统常见问题排查

(1)基础问题排查方法与实践示例

(2)内存泄漏问题排查方法与实践示例

(3)栈溢出问题排查方法与实践示例

(4)线程死锁问题排查方法与实践示例

(5)HardFault问题排查方法与实践示例

2. 组件分析与实践

(1)MQTT软件包原理与应用实践

(2)SAL抽象层原理与应用实践

(3)传感器软件包应用实践

(4)其他相关软件包应用实践

3. 综合实践

综合所学内容,手把手从零实现一个IoT设备。

培训地点

深圳福田区天安数码城天吉大厦AB座7楼7B2知了会议中心M6会议室

地铁:1、7、9、11号线到达车公庙地铁站,可从G口出,右转步行100米左右到达知了会议中心。

培训证书

培训结束后通过考核的将可以获得RT-Thread出具的结业证书和中国电子学会出具的职业技能证书-RT-Thread操作系统应用开发

5254a974-971c-11ef-8084-92fbcf53809c.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5091

    文章

    19176

    浏览量

    307221
  • 线程
    +关注

    关注

    0

    文章

    505

    浏览量

    19739
  • RT-Thread
    +关注

    关注

    31

    文章

    1305

    浏览量

    40338
收藏 人收藏

    评论

    相关推荐

    Linux网络协议的实现

    网络协议是操作系统核心的一个重要组成部分,负责管理网络通信中的数据包处理。在 Linux 操作系统中,网络协议(Network Stack)负责实现 TCP/IP 协议簇,处理应用
    的头像 发表于 09-10 09:51 362次阅读
    Linux网络协议<b class='flag-5'>栈</b>的实现

    转载 golang内存分配

    . 线程拥有一定的 cache, 可用于无锁分配. 同时 Go 对于 GC 后回收的内存页, 并不是马上归还给操作系统, 而是会延迟归还, 用于满足未来的内存需求.    在 1.10 以前 go
    的头像 发表于 09-05 14:12 301次阅读
    转载 golang内存<b class='flag-5'>分配</b>

    CPU线程和程序线程的区别

    CPU的线程与程序的线程在概念、作用、实现方式以及性能影响等方面存在显著差异。以下是对两者区别的详细阐述,旨在深入探讨这一技术话题。
    的头像 发表于 09-02 11:18 1156次阅读

    rtt工程移植后线程创建不成功怎么解决?

    之前用l431的板子跑10k的采样后来要提高到100k,更换了f446的芯片,但是根据新的内存地址从0x20000000开始写入数据后,两个线程创建不成功了,不知道是否是线程的的大小不够还是内存分配不对,求指点
    发表于 07-18 06:44

    STM32F072VBT6.icf文件堆栈分配异常的原因?

    STM32F072VBT6.icf文件堆栈分配异常
    发表于 07-05 08:10

    探索虚拟线程:原理与实现

    的开销。首先,创建成本不菲,因为每当操作系统需要创建一个新的平台线程时,它必须分配大量的内存(通常以兆字节计)来存储线程的上下文信息、本机
    的头像 发表于 06-24 11:35 348次阅读
    探索虚拟<b class='flag-5'>线程</b>:原理与实现

    MQTT客户端大小分配过大而导致无法初始化怎么处理?

    102400.但是这样就导致esp_mqtt_client_start()这个函数无法返回,且报错E (7296) MQTT_CLIENT: Error create mqtt task;我想咨询一下,idf(v4.1)对MQTT的大小有最大限制么?最大可以设多大呢?
    发表于 06-21 12:54

    鸿蒙开发:【线程模型】

    管理其他线程的ArkTS引擎实例,例如使用TaskPool(任务池)创建任务或取消任务、启动和终止Worker线程
    的头像 发表于 06-13 16:38 448次阅读
    鸿蒙开发:【<b class='flag-5'>线程</b>模型】

    FreeRTOS系统使用xTaskCreate产生的任务与osThreadDef 产生的线程有什么不同?

    请教下是要 FreeRTOS系统, 使用 xTaskCreate 产生的任务 与 osThreadDef产生的线程有什么不同?
    发表于 04-29 07:20

    在lwip历程中有ethernetif_set_link这样一个线程是否可以删除?

    请教下,在 lwip 历程中,有 ethernetif_set_link 这样一个线程, 是不是在初始化完成后就可以删除啊 ?? /* Create the Ethernet link
    发表于 04-28 08:22

    ethernetif_input和tcpip协议线程的作用

    tcpip协议线程是lwIP协议的核心线程,负责处理TCP/IP协议的各种功能,包括TCP连接管理、IP数据报的路由和转发、以及UDP
    的头像 发表于 03-20 10:01 1466次阅读

    嵌入式系统中的线程、进程与任务概念与区别

    每个线程与主程序共用地址空间,受限于2GB地址空间; 2)线程之间的同步和加锁控制比较麻烦;一个线程的崩溃可能影响到整个程序的稳定性
    发表于 03-04 15:03 1447次阅读
    嵌入式<b class='flag-5'>系统</b>中的<b class='flag-5'>线程</b>、进程与任务概念与区别

    什么是动态线程池?动态线程池的简单实现思路

    因此,动态可监控线程池一种针对以上痛点开发的线程池管理工具。主要可实现功能有:提供对 Spring 应用内线程池实例的全局管控、应用运行时动态变更线程池参数以及
    的头像 发表于 02-28 10:42 704次阅读

    RTThread中main线程有个循环,如果main线程异常退出了,有什么办法可以监测到?

    RTThread中main线程有个循环,如果main线程异常退出了,有什么办法可以监测到?
    发表于 02-22 08:15

    线程是什么的基本单位 进程与线程的本质区别

    线程是操作系统中处理器调度的基本单位,它代表着独立的执行流。在一个进程中,可以包含多个线程,这些线程共享相同的进程资源,如内存空间、文件描述符等。 进程是操作
    的头像 发表于 02-02 16:30 1004次阅读