电子说
开发环境:CS+ for CA,CX
MCU:RL78系列
仿真器:SF3000E1
程序的内存分配
一个由C/C++编译的程序占用的内存分为以下几个部分:
栈区(stack)由编译器自动分配释放,存放函数的参数值,局部变量的值等。
堆区(heap)一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
全局区(静态区)(static)全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。
文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。
程序代码区—存放函数体的二进制代码。
栈溢出的危害
栈溢出就是缓冲区溢出的一种。由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。缓冲区长度一般与用户自己定义的缓冲变量的类型有关。
如何查看程序栈的使用情况
针对瑞萨的RL78系列MCU去查看代码中使用了多少栈空间,可以按照如下步骤进行操作。
步骤一
请参照图1,打开CA78K0R(Build Tool)-->Compile options-->Debug Information选择Yes(Add to both assembly and object file)(-g2)
图1
步骤二
请参照图2,打开CA78K0R(Build Tool)-->Compile options-->Assembly file选择Yes(With no C source info)(-a)。
图2
步骤三
请参照图3,将工程项目进行编译。
图3
步骤四
请参照图4,打开Tool-->Startup Stack Usage Tracer,打开后会弹出如图5和图6的窗口。会显示我们每个源文件与每个函数所占用的栈空间大小。
图4
图5
图6
如图6栈空间使用情况例子说明
main函数使用的占空间为18个字节,计算是根据其调用的所有的函数的占空间使用的总和。其中调用的各个函数R_FDL_Write用到8个字节栈空间,R_FDL_Write用到8个字节栈空间,以及所有可以中断的栈空间。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !