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

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

    关注

    5056

    文章

    18950

    浏览量

    301467
  • 线程
    +关注

    关注

    0

    文章

    503

    浏览量

    19627
  • RT-Thread
    +关注

    关注

    31

    文章

    1256

    浏览量

    39790
收藏 人收藏

    评论

    相关推荐

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

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

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

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

    ethernetif_input和tcpip协议线程的作用

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

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

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

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

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

    堆和的区别和使用注意事项

    堆和是在计算机科学中广泛使用的两种数据结构,它们具有不同的用途和特点。堆和的区别涉及到内存分配、访问方式、数据存储等方面。在使用堆和时,还需要注意一些细节,以确保程序的正确性和效
    的头像 发表于 01-18 17:24 1977次阅读

    Java oom异常的原因分析

    据,而内存用于存储方法调用和局部变量。 当程序需要使用更多内存时,会向操作系统请求更多的内存空间。如果操作系统无法分配足够的内存空间,就会导致OOM
    的头像 发表于 12-05 13:43 720次阅读

    redis多线程还能保证线程安全吗

    Redis是一种使用C语言编写的高性能键值存储系统,它是单线程的,因为使用了多路复用的方式来处理并发请求。这样的实现方式带来了很好的性能,但同时也引发了一些线程安全方面的问题。 在Re
    的头像 发表于 12-05 10:28 1583次阅读

    线程池七大核心参数执行顺序

    线程池是一种用于管理和调度线程执行的技术,通过将任务分配线程池中的线程进行处理,可以有效地控制并发线程
    的头像 发表于 12-04 16:45 904次阅读

    如何设定RTOS中的任务线程)大小呢?

    首先说明的是,在 `RT-Thread` 中,将本文提及的 `任务` 称之为 `线程`。
    的头像 发表于 12-01 16:40 1545次阅读

    核心线程数和最大线程数怎么设置

    核心线程数和最大线程数是Java线程池中重要的参数,用来控制线程池中线程的数量和行为。正确地设置这两个参数可以优化
    的头像 发表于 12-01 13:50 8373次阅读

    JDK如何优雅退出一个线程

    需要线程退出的常见场景 任务执行完成,或异常终止,任务认为无需再占用线程线程池根据当前任务执行情况,伸缩线程池。当任务执行较少时
    的头像 发表于 11-17 10:02 400次阅读
    JDK如何优雅退出一个<b class='flag-5'>线程</b>?

    程序内存分区中的堆与

    表示两种内存管理方式; (2)数据结构场景下,堆与表示两种常用的数据结构。 1.程序内存分区中的堆与 1.1 简介 由操作
    的头像 发表于 11-11 16:21 709次阅读
    程序内存分区中的堆与<b class='flag-5'>栈</b>

    Linux系统上多线程和多进程的运行效率

    关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你
    的头像 发表于 11-10 10:54 1272次阅读
    Linux<b class='flag-5'>系统</b>上多<b class='flag-5'>线程</b>和多进程的运行效率

    关于Python多进程和多线程详解

    进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,
    的头像 发表于 11-06 14:46 782次阅读
    关于Python多进程和多<b class='flag-5'>线程</b>详解