关于看门狗实验的栈溢出问题

发布于 2020-07-01 17:17:22
使用RT-Thread studio 验证看门狗的实验,使用网站里面提供的例程,遇到如下问题
1593594842(1).png

部分源码如下
static int wdt_sample(int argc, char *argv[])
{
rt_err_t ret = RT_EOK;
rt_uint32_t timeout = 1; /* 溢 出 时 间, 单 位: 秒 */
char device_name[RT_NAME_MAX];
/* 判 断 命 令 行 参 数 是 否 给 定 了 设 备 名 称 */
if (argc == 2)
{
rt_strncpy(device_name, argv[1], RT_NAME_MAX);
}
else
{
rt_strncpy(device_name, WDT_DEVICE_NAME, RT_NAME_MAX);
}
/* 根 据 设 备 名 称 查 找 看 门 狗 设 备, 获 取 设 备 句 柄 */
wdg_dev = rt_device_find(device_name);
if (!wdg_dev)
{
rt_kprintf("find %s failed!\n", device_name);
return RT_ERROR;
}
/* 初 始 化 设 备 */
ret = rt_device_init(wdg_dev);
if (ret != RT_EOK)
{
rt_kprintf("initialize %s failed!\n", device_name);
return RT_ERROR;
}
/* 设 置 看 门 狗 溢 出 时 间 */
ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
if (ret != RT_EOK)
{
rt_kprintf("set %s timeout failed!\n", device_name);
return RT_ERROR;
}
/* 启 动 看 门 狗 */
ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
if (ret != RT_EOK)
{
rt_kprintf("start %s failed!\n", device_name);
return -RT_ERROR;
}
/* 设 置 空 闲 线 程 回 调 函 数 */
rt_thread_idle_sethook(idle_hook);
return ret;
}
/* 导 出 到 msh 命 令 列 表 中 */
MSH_CMD_EXPORT(wdt_sample, wdt sample);


int main(void)
{
int count = 1;


// wdt_sample();


while (count++)
{
// LOG_D("Hello RT-Thread!");
rt_thread_mdelay(100);


if(count==5)
{
count=1;
// rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
}
}


return RT_EOK;
}



使用msh>wdt_sample 调用,这个是什么原因?请高人解答,谢谢!

查看更多

关注者
0
被浏览
162
11 个回答
JQRR_7669
JQRR_7669 认证专家 2020-07-01
调用了打印函数的原因,打印函数用堆栈空间较大
JQRR_7669
JQRR_7669 认证专家 2020-07-01
不是栈溢出立马就出异常的,只有在溢出部分被其它线程修改或被使用才会表现出异常来
JQRR_7669
JQRR_7669 认证专家 2020-07-01
空闲线程堆栈太小了,改大些就没事啦!
guanghui_8
guanghui_8 2020-07-01
JQRR_7669 发表于 2020-7-1 17:27
空闲线程堆栈太小了,改大些就没事啦!


我看了一下有256

#define IDLE_THREAD_STACK_SIZE 256

这个不小啊,应该不是这里的问题
JQRR_7669
JQRR_7669 认证专家 2020-07-01
100%了啊!

无标题.png
guanghui_8
guanghui_8 2020-07-01
JQRR_7669 发表于 2020-7-1 17:41
100%了啊!


:handshake,确实是这里的问题,把256 改成320就不会重新启动了,那么问题来了,这个栈怎么会满的呢,是rt_device_control函数里面的变量吗?函数运行完毕后会出栈啊?
guanghui_8
guanghui_8 2020-07-01
yangjie 发表于 2020-7-1 18:33
这是显示的是目前最大,并不是实时动态显示


我说的是idle函数的栈存储的应该是函数的参数值和局部变量,如果函数执行完毕那么栈空间就会释放,那怎么会把这256字节装满的呢?除非rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);一直归递调用,一会研究一下这个函数
guanghui_8
guanghui_8 2020-07-01
JQRR_7669 发表于 2020-7-1 18:53
调用了打印函数的原因,打印函数用堆栈空间较大


但是为什么没有在第一次就栈溢出呢,溢出是在30几次之后
guanghui_8
guanghui_8 2020-07-01
guanghui_8 发表于 2020-7-1 19:14
但是为什么没有在第一次就栈溢出呢,溢出是在30几次之后


还有就是函数执行完毕后,局部变量出栈,下次在调用函数,函数的参数和局部变量不还是在以前的栈地址开始调用吗?按理说也不应该溢出啊

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友