这个功能也非常实用,以MDK为例,他的stack和heap经过__main都会初始化为0, 所以可以用来检测最大实用情况。
【系统栈监测】
设置系统栈大小和系统栈首地址
系统栈大小是需要手动添加的:
[C] 纯文本查看 复制代码 local Stack_Size = 0x00001000 -- 根据工程里面配置,手动填写栈大小
设置栈首地址,可以看map文件,也可以TOOL上位机Trace解析,获取并填写栈首地址,以MDK为例,对应的是__initial_sp
实现代码:
[Lua] 纯文本查看 复制代码 local ok
local bytes
local off
local Stack_Size = 0x00001000 -- 根据工程里面配置,手动填写栈大小
local __initial_sp = 0x2000b9d0 -- 可以看map文件,也可以TOOL上位机Trace解析,获取并填写栈首地址
beep()
pg_init() -- 初始化SWD接口函数
ok,bytes = pg_read_mem(__initial_sp - Stack_Size + 1, Stack_Size) -- M内核栈空间是向下生长的满栈
if(ok == 1) then
for i=1,Stack_Size,1 do
if(string.sub(bytes,i,i) ~= '\0') then -- 遇到非0,停止监测
off = i
break
end
end
else
print("读取stack空间失败")
end
print(string.format("当前系统栈最大使用情况 = %4.1f%%\r\n", (1 - off/Stack_Size)*100))
效果如下:
【堆监测】
堆监测不太好实现,我们这里将其全部内容打印出了:
手动填写堆大小和堆首地址__heap_base
[Lua] 纯文本查看 复制代码 local Heap_Size = 0x0000800 -- 根据工程里面配置,手动填写栈大小
local __heap_base = 0x2000a1d0 -- 可以看map文件,也可以TOOL上位机Trace解析,获取并填写堆首地址
测试的C代码:
[C] 纯文本查看 复制代码 p = malloc(100);
p1 = malloc(300);
for(i=0; i<100; i++)
{
p[i] = 0x55;
}
LUA代码:
[Lua] 纯文本查看 复制代码 local ok
local bytes
local off
local Heap_Size = 0x0000800 -- 根据工程里面配置,手动填写栈大小
local __heap_base = 0x2000a1d0 -- 可以看map文件,也可以TOOL上位机Trace解析,获取并填写堆首地址
beep()
pg_init() -- 初始化SWD接口函数
ok,bytes = pg_read_mem(__heap_base, Heap_Size) -- M内核堆空间是向上生长
if(ok == 1) then
print_hex(bytes)
else
print("读取heap空间失败")
end
效果如下:
|