野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8203|回复: 5

[rt-thread] 学习《RT-Thread内核实现与应用开发实战指南》碰到的一些问题,求指点

[复制链接]
发表于 2018-11-1 21:36:37 | 显示全部楼层 |阅读模式
在学习过程中碰到一些问题啊,求助!
一、第19章 信号量
做计数信号量实验时会报这样的错:
1、使用动态内存创建线程时:hard fault on thread :test_sem
2、使用静态内存创建线程时:hard fault on handler
详细的log见附件
二、第24章 内存管理
静态内存管理实验中
报错:hard fault on thread:alloc
详细的log见附件
三、第17章 线程管理
章末实验
问题:始终无法挂起和恢复线程
详细log见附件

平台:使用STM32CUBEMX生成的库 + rt-thread移植
芯片:stm32f103rct6


计数信号量_动态内存创建线程

计数信号量_动态内存创建线程
计数信号量_静态内存创建线程.jpg

静态内存申请时

静态内存申请时

线程管理_挂起失败_动态内存创建线程

线程管理_挂起失败_动态内存创建线程
回复

使用道具 举报

发表于 2018-11-2 08:42:24 | 显示全部楼层
把任务的堆栈设置大点试试
回复 支持 反对

使用道具 举报

发表于 2018-11-2 10:30:17 | 显示全部楼层
可能是内存堆的大小问题,你把动态内存的堆设的大一点试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-2 19:34:42 | 显示全部楼层
左丘冰 发表于 2018-11-2 08:42
把任务的堆栈设置大点试试

我把线程栈放小,结果一开始不会报错了,但是一使用了那个计数信号量就报错了,详细log与“计数信号量_静态内存创建线程”标题的图片一样。

还有一个问题是,如果我开两个线程,一个send 一个receive 一开始就会报错,详细Log与“计数信号量报错_动态内存创建线程”的图片一样。

下面是创建的两个线程,和书本里一样
        receive_thread =                                                                                                                                 /*线程控制块指针*/
        rt_thread_create("receive",                                                                                        /*线程名字*/
                                                                        receive_thread_entry,                                                /*线程入口函数*/
                                                                        RT_NULL,                                                                                        /*线程入口函数参数*/
                                                                        128,                                                                                                        /*线程栈大小*/
                                                                        3,                                                                                                                        /*线程的优先级*/
                                                                        20);                                                                                                                /*线程栈时间片*/
        if(receive_thread != RT_NULL)
                        rt_thread_startup(receive_thread);                                                        /*启动线程,开启调度*/
        else
                        return -1;
       
        send_thread =                                                                                                                                 /*线程控制块指针*/
        rt_thread_create("send",                                                                                        /*线程名字*/
                                                                        send_thread_entry,                                                /*线程入口函数*/
                                                                        RT_NULL,                                                                                        /*线程入口函数参数*/
                                                                        128,                                                                                                        /*线程栈大小*/
                                                                        2,                                                                                                                        /*线程的优先级*/
                                                                        20);                                                                                                                /*线程栈时间片*/
        if(send_thread != RT_NULL)
                        rt_thread_startup(send_thread);                                                        /*启动线程,开启调度*/
        else
                        return -1;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-2 19:35:08 | 显示全部楼层
wasd0904 发表于 2018-11-2 10:30
可能是内存堆的大小问题,你把动态内存的堆设的大一点试试

我把线程栈放小,结果一开始不会报错了,但是一使用了那个计数信号量就报错了,详细log与“计数信号量_静态内存创建线程”标题的图片一样。

还有一个问题是,如果我开两个线程,一个send 一个receive 一开始就会报错,详细Log与“计数信号量报错_动态内存创建线程”的图片一样。

下面是创建的两个线程,和书本里一样
        receive_thread =                                                                                                                                 /*线程控制块指针*/
        rt_thread_create("receive",                                                                                        /*线程名字*/
                                                                        receive_thread_entry,                                                /*线程入口函数*/
                                                                        RT_NULL,                                                                                        /*线程入口函数参数*/
                                                                        128,                                                                                                        /*线程栈大小*/
                                                                        3,                                                                                                                        /*线程的优先级*/
                                                                        20);                                                                                                                /*线程栈时间片*/
        if(receive_thread != RT_NULL)
                        rt_thread_startup(receive_thread);                                                        /*启动线程,开启调度*/
        else
                        return -1;
       
        send_thread =                                                                                                                                 /*线程控制块指针*/
        rt_thread_create("send",                                                                                        /*线程名字*/
                                                                        send_thread_entry,                                                /*线程入口函数*/
                                                                        RT_NULL,                                                                                        /*线程入口函数参数*/
                                                                        128,                                                                                                        /*线程栈大小*/
                                                                        2,                                                                                                                        /*线程的优先级*/
                                                                        20);                                                                                                                /*线程栈时间片*/
        if(send_thread != RT_NULL)
                        rt_thread_startup(send_thread);                                                        /*启动线程,开启调度*/
        else
                        return -1;
回复 支持 反对

使用道具 举报

发表于 2018-11-3 12:01:24 | 显示全部楼层
//---------------------------------

个人运营公众号:DigCore

欢迎有兴趣人士了解关注,感谢能提出宝贵意见!

个人主页: www.digcore.cn
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 09:11 , Processed in 0.060451 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表