keil查看rtx rtos堆栈溢出

在rtx rtos等单片机系统设计程序时可能会遇见堆栈溢出的情况,此时可以通过keil的自带工具进行定位哪个堆栈溢出。

前提

1、这个工具的适用前提肯定是在硬件仿真环境下,首先点击图中圈出按钮进入仿真。
在这里插入图片描述
2、点击run按钮,是程序自动运行
在这里插入图片描述
3、此后进行自己功能的调试,就是类似于调试串口时发生错误的话,就依然复现串口出现的问题。
4、点击watch windows的下三角号,找到里面的第三项(最后一项)rtx rtos并点击,打开rtx rtos的工具。
在这里插入图片描述
打开后界面如下图所示:
在这里插入图片描述
这个是进入仿真直接打开rtx rtos的情况,程序运行一段时间,或者成功复现你的问题后,停止程序(下图所示的按钮)后会出现变化。
在这里插入图片描述
在这里插入图片描述
5、rtx rtos的使用较为简单,在Property的System选项中有诸如Kernel ID等信息,
在这里插入图片描述
在Threads选项中就是运行时得各个线程,如下图所示。
在这里插入图片描述
6、堆栈溢出的查找
首先通过点击每个线程ID前的加号,打开折叠起来的内容
在这里插入图片描述
打开后可以看见当前线程的State、Priority、Attributes、Waiting、Stack、Flags、Wait Flags等信息,而在Stack的value栏中可以查看当前线程栈的使用情况。例如现在我查看的栈使用了13%,是正常使用,无问题溢出的情况。
而如果在复现问题后某一个栈的使用率超过100%,那肯定是发生问题,栈爆掉了。
在设计程序时,也不应该将栈的使用过高甚至处于临界边缘,否则可能会发生问题。
为了避免这些问题,一般不会在线程的函数里去定义大的结构体实体和数组等,这一般都是造成堆栈溢出的重点问题。
点击Stack前的加号可以看到如下信息:
在这里插入图片描述
Used->就是当前堆栈的使用率,一定要控制在一个合理的范围内,
Top->就是堆栈顶的地址
Limit->可以理解为栈底的地址
Size->栈的大小,用Top地址减去Limit地址,就是可以容纳的size,
7、接下来就是根据线程自己栈的栈顶地址去找到出问题的具体线程任务。
每个工程都会自己的map文件,就是后缀名为map的那个文件,例如我的文件是这个样子的
在这里插入图片描述
打开map文件后直接搜索栈的栈顶地址,例如我的是以0x20208108为例。
在这里插入图片描述
可以找到栈的信息,包含栈的任务名称、栈的size等等,然后就是各回各家,各找各bug去了。
找到问题所在的栈名称后(一般都是自己复现问题的任务所在的栈),就可以去debug单步执行,随着运行就查看rtx rtos工具中对应栈的使用情况,逐步定位到问题所在的代码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值