Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
栈溢出_StackOverflow
5
一个简单的线程,只有简单几个常量和调用,128字节的栈竟然溢出了
发布于 2021-08-03 17:38:58 浏览:837
订阅该版
代码比较简单,就是测试串口 ```c #define BUFF_SIZE_128 128 #define BUFF_SIZE_256 256 #define BUFF_SIZE_512 512 #define UART_USER_UI_CMD "uart2" /* 串口设备句柄 */ static rt_device_t uart_ui_cmd; /* 消息队列控制块 */ static struct rt_messagequeue rx_mq; /* 串口输出数据长度 */ static rt_uint8_t console_length = 0; /* 发送输出内容 */ rt_err_t console(char *msg, rt_uint8_t length) { console_length = length; rt_err_t result = rt_mq_send(&rx_mq, msg, length); return result; } /* 循环输出hello */ void write_thread(void *parameter) { while (1) { console("hello\r\n", 7); rt_thread_mdelay(2000); } } /* 接收输出消息,在串口打印输出内容 */ void uart_ui_cmd_thread(void *parameter) { rt_err_t result; rt_uint32_t rx_length; static char rx_buffer[BUFF_SIZE_128]; while (1) { rt_memset(rx_buffer, 0, BUFF_SIZE_128); /* 从消息队列中读取消息*/ result = rt_mq_recv(&rx_mq, rx_buffer, BUFF_SIZE_128, RT_WAITING_FOREVER); if (result == RT_EOK) { //输出操作 rt_device_write(uart_ui_cmd, 0, rx_buffer, console_length); } } } /* 线程句柄 */ rt_thread_t thread, thread2; /* 消息队列存储空间 */ static char msg_pool[BUFF_SIZE_256]; int uart_ui_cmd_start(void) { rt_err_t ret = RT_EOK; /* 查找串口设备 */ uart_ui_cmd = rt_device_find(UART_USER_UI_CMD); if (!uart_ui_cmd) { return RT_ERROR; } /* 初始化消息队列 */ rt_mq_init(&rx_mq, "rx_mq", msg_pool, /* 存放消息的缓冲区 */ 8, /* 一条消息的最大长度 */ BUFF_SIZE_256, /* 存放消息的缓冲区大小 */ RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ /* 以 DMA 接收及DMA发送方式打开串口设备 */ rt_device_open(uart_ui_cmd, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); /* 创建 thread 线程 */ thread = rt_thread_create("waiter", uart_ui_cmd_thread, RT_NULL, BUFF_SIZE_512, 25, 10); /* 创建 thread2 线程 */ thread2 = rt_thread_create("writer", write_thread, RT_NULL, BUFF_SIZE_256, 26, 10); /* 创建成功则启动线程 */ if (thread != RT_NULL) { rt_thread_startup(thread); rt_thread_startup(thread2); ret = RT_EOK; } else { ret = RT_ERROR; } return ret; } ``` 当把这个的栈设置为128时,打印一次hello,第二次就挂掉。 ```c _thread2 = rt_thread_create("writer", write_thread, RT_NULL, BUFF_SIZE_128, 26, 10); __rt_scheduler_stack_check, ``` 进入 while(level)循环。 我现在有2个困惑,我的thread2中没有使用过多的变量,128字节的栈空间怎么会用光,这栈空间里面存储的是什么? 第一次能输出hello也就说明空间够用,为什么会在第二次调用console时会用光,第二次调用比第一次调用增加了什么内容?
查看更多
出出啊
2021-08-03
恃人不如自恃,人之为己者不如己之自为也
关于线程栈,有个误区,以为完全被线程使用了,其实不是。单单论线程内函数调用树的深度,总是有个固定的值(包括递归调用)。 但是,中断不在函数调用树内,中断是随机的,任何时候可能出现的。只要你没关中断,就有可能进入中断异常。如果中断回调函数内有比较复杂的函数调用,比如 rt_mq_send ,中断 + 中断 + 任务调度 + 任务调度的情况都是有几率出现的。 一次中断耗用了多少栈,一次任务调度又耗用了多少栈,加上线程自己函数调用占用。还觉得 128 很富余吗?
2
个回答
默认排序
按发布时间排序
aozima
2021-08-03
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
第2次打印时,已发生过切换,所以有把线程上下文也保存到线程栈里面,可能第1次时勉强,再加点就爆了。
撰写答案
登录
注册新账号
关注者
0
被浏览
837
关于作者
itdreamworks
求一硬件开发工程师合作
提问
16
回答
9
被采纳
0
关注TA
发私信
相关问题
1
栈溢出怎么找原因,只提示了StackOverflow?
2
仿真运行出现“tidle0 stack overflow”?
3
main stack overflow
4
简单任务切换,出现stack overflow
5
rt-thread堆栈溢出的问题
6
rt-thread-nano防止某个任务的堆栈溢出
7
互斥量的地址怎么突变了?
8
正弦波形不全,是什么机制引起的?
9
使用minizip包的minizip指令报内存溢出故障
10
创建多个线程和消息队列失败
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部