1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
1个回答
|
|
栈用于保存变量, 随着函数调用深度和变量的数量而变化. 设置小了会出现栈溢出, 设置大了会浪费.
利用率获取 RT-THREAD的统计方法是将线程栈都填充为’#’, 当需要的时候, 检查是否被修改为其他值. 利用率 = 已使用 / 栈大小. #if defined(ARCH_CPU_STACK_GROWS_UPWARD) ptr = (rt_uint8_t *)thread->stack_addr + thread->stack_size - 1; while (*ptr == '#')ptr --; rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03dn", ((rt_ubase_t)thread->sp - (rt_ubase_t)thread->stack_addr), thread->stack_size, ((rt_ubase_t)ptr - (rt_ubase_t)thread->stack_addr) * 100 / thread->stack_size, thread->remaining_tick, thread->error); #else ptr = (rt_uint8_t *)thread->stack_addr; while (*ptr == '#')ptr ++; rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03dn", thread->stack_size + ((rt_ubase_t)thread->stack_addr - (rt_ubase_t)thread->sp), thread->stack_size, (thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100 / thread->stack_size, thread->remaining_tick, thread->error); #endif 以上是对线程栈进行计算, 即PSP. 如果要计算MSP利用率也可用这种方法, 但是需要注意几点. 1. 初始化时不可将整个栈都填充 因为当前函数也在使用栈, 全部填充会导致函数无法返回. 应当获取当前的SP指针, 仅初始化到SP指向的地址, 不再进一步初始化. 除非在reset_handler处初始化, 此时未进入任何函数也不会返回. 2. 尽量在未启动操作系统时进行初始化 单片机复位后默认使用MSP, 尽早初始化可以让后面获取栈利用率更准确. 链接脚本中的栈定义 _system_stack_size = 0x400; // MSP大小 ...省略... .stack : { . = ALIGN(4); _sstack = .; . = . + _system_stack_size; . = ALIGN(4); _estack = .; } >RAM /* Set stack top to end of RAM, and stack limit move down by * size of stack section */ __StackTop = _estack; // MSP 栈顶 __StackLimit = __StackTop - _system_stack_size; // MSP栈底 PROVIDE(__stack = __StackTop); static unsigned int msp_top; static unsigned int msp_size; static unsigned int msp_bottom; // 在切换成psp前调用, 从栈底到栈当前使用深度, 赋值为'#' static void main_stack_init(void) { // 对于gcc编译器, 以下定义在连接脚本**.lds中 extern uint32_t __StackTop; extern uint32_t __StackLimit; #define STACK_BASE &__StackLimit #define STACK_TOP &__StackTop extern unsigned int _system_stack_size; msp_top = (unsigned int)STACK_TOP; msp_size = (unsigned int)&_system_stack_size; msp_bottom = (unsigned int)STACK_BASE; // unsigned int sp = GET_SP(); register unsigned sp __ASM("sp"); // 获取当前栈指针 unsigned int init_size = sp - msp_bottom; char *p_msp_bottom = (char *)msp_bottom; int i = 0; for (i = 0; i < init_size; i++){ p_msp_bottom = '#'; // 从栈底到当前栈指针处, 赋值为'#' } } // 获取MSP栈利用率 static uint16_t main_stack_used(void) { char *ptr = (char *)msp_bottom; uint16_t used_bytes = 0; while (*ptr == '#')ptr ++; // 检查被改写过的地址边界 used_bytes = (uint32_t) msp_top - (uint32_t) ptr; uint16_t used = used_bytes * 100 / msp_size; // 栈利用百分比 return used; } |
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2990 浏览 16 评论
3490 浏览 1 评论
9052 浏览 16 评论
4085 浏览 18 评论
1173浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 11:51 , Processed in 1.038858 second(s), Total 78, Slave 59 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号