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

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

    关注

    5186

    文章

    20151

    浏览量

    328889
  • 线程
    +关注

    关注

    0

    文章

    508

    浏览量

    20759
  • RT-Thread
    +关注

    关注

    32

    文章

    1540

    浏览量

    44287
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    线程系统

    线程系统的事件响应也是在中断中完成的,但事件的处理是在线程中完成的。在多线程系统中,线程跟中断
    发表于 12-08 07:55

    Linux多线程对比单线程的优势

    在Linux系统中,线程是操作系统能够进行运算调度的最小单位。线程被包含在进程之中,是进程中的实际运行单位。一个进程可以拥有多个线程,这些
    发表于 12-01 06:11

    堆和的区别

    一个由C/C 编译的程序占用的内存分为以下几个部分: 区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的。 堆区(heap):一般由
    的头像 发表于 11-27 18:13 905次阅读

    低优先级线程无法调度怎么解决?

    1,设置了3,5,6,8几个优先级,设备在现场正常运行了一年多后,显示、前端、后端这3个低优先级线程异常了,表现为屏幕不动,前端采集数据没有变化等,其他高优先级的线程如通讯,按键都能正常运行,通讯有喂狗操作,停止通讯,会看门狗复
    发表于 09-25 07:33

    rt_sem_take卡住导致线程无法正常运行怎么解决?

    串口接收数据后release信号量,接收线程take sem,高频大数据量接受数据,运行一段时间后接受线程suspend,但是release正常释放 出现问题问题后查看信息如下: 接受线程为suspend,sem的值一直在增
    发表于 09-23 08:17

    rtthread线程出现异常了,有没有什么钩子函数能够定义用户操作?

    线程出现异常了,有没有什么钩子函数能够定义用户操作????
    发表于 09-18 06:36

    main线程创建中的rt_memset导致hardfault是为什么?

    main线程大小设置成2048的时候rt_memset导致hardfault,改成512就不会,这是为什么
    发表于 09-18 06:24

    网络接收线程erxmb异常的原因?怎么解决?

    两个不同的软件接收组播数据久了后均出现网络数据无法接收,网络发送是正常的。lpc54628芯片。邮箱有8个但erxmb线程已经无法运行了,这是什么原因导致
    发表于 09-15 08:06

    线程删除时遇到断言,是什么原因导致的?

    在一个线程中调用线程删除函数删除另外一个线程,这2个线程的优先级是相等的,被删除的线程也是动态创建的,出现了下面的断言内容,一般是什么情况导
    发表于 09-12 06:08

    摩尔线程吴庆详解 MUSA 软件:以技术创新释放 KUAE 集群潜能,引领 GPU 计算新高度​

    的分享。GPU 计算软件开发总监吴庆登上讲台,发表了题为《摩尔线程 MUSA 软件助力 KUAE 集群释放无限潜能》的演讲。他从专业视角出发,为在场听众深入剖析了 MUSA 软件在驱动 KUAE 集群高效运转方面的核心技术与
    的头像 发表于 07-28 13:47 5514次阅读
    摩尔<b class='flag-5'>线程</b>吴庆详解 MUSA 软件<b class='flag-5'>栈</b>:以技术创新释放 KUAE 集群潜能,引领 GPU 计算新高度​

    摩尔线程亮相WAIC 2025:以“AI工厂”理念驱动算力进化,全AI应用赋能千行百业

    7月26日-29日,2025世界人工智能大会(WAIC)在上海举办。摩尔线程携以全功能GPU为核心的“云边端”全AI产品和解决方案精彩亮相,并首次提出“AI工厂”理念,旨在为AGI时代打造生产先进
    的头像 发表于 07-28 11:34 1435次阅读
    摩尔<b class='flag-5'>线程</b>亮相WAIC 2025:以“AI工厂”理念驱动算力进化,全<b class='flag-5'>栈</b>AI应用赋能千行百业

    UVC+MSC实现中MSC线程未运行的原因?

    apiRetStatus = CY_U3P_SUCCESS; /* 为线程分配内存并创建线程 */ uvc_ptr = CyU3PMemAlloc ( UVC_APP_THREAD_STACK
    发表于 07-16 07:08

    深度剖析 RT-Thread 线程调度流程

    rt_system_scheduler_start:调度系统第一个线程rt_hw_context_switch_to:初始化上下文切换环境,触发PendSV异常first_thread:系统
    的头像 发表于 06-25 18:24 1440次阅读
    深度剖析 RT-Thread <b class='flag-5'>线程</b>调度流程

    main线程大小设置成2048的时候rt_memset导致hardfault,为什么?

    main线程大小设置成2048的时候rt_memset导致hardfault,改成512就不会,这是为什么
    发表于 06-10 06:04

    golang内存分配

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