新闻
研讨会
设计
嵌入式系统
元件/连接器
电源与新能源
安全与国防
汽车电子
EDA/PCB
消费电子
工业自动化
模拟技术
医疗电子
测试测量
通信技术
光电显示
网络与存储
智能计算
物联网与传感器
机器人
社区
论坛
开发板试用
博客
活动中心
积分礼品
技术汇
PI技术专区
ADI技术专区
美信技术专区
研华技术专区
贝能技术社区
Fluke技术社区
ZYNQ技术社区
世强专区技术社区
Microchip资源专区
Microchip视频专区
Quark技术社区
Xilinx社区
MultiSIM BLUE
Andes专区
TE金属混合保护专区
ADI视频专区
OpenVINO生态社区
金升阳电源技术专区
Led技术社区
DSP技术社区
FPGA技术社区
MCU技术社区
USB技术社区
CPLD技术社区
Zigbee技术社区
Labview技术社区
Arduino技术社区
示波器技术社区
步进电机技术社区
无线充电技术社区
人脸识别技术社区
指纹识别技术社区
快捷导航
下载
电路
EETV
厂商专区
元件查询
计算工具
资料库
新闻中心
EEPW首页
>
嵌入式系统
>
设计应用
> [跟我学嵌入式开发] 堆和栈
[跟我学嵌入式开发] 堆和栈
作者:
时间:2016-11-28
来源:网络
加入技术交流群
扫码加入
和技术大咖面对面交流
海量资料库查询
收藏
图 3
对于堆我们已经知道了必须调用相应的API来分配内存,那从栈空间分配内存也需要调用API吗?答案是通常不需要,为什么是通常?因为,在有的平台上(Linux上就是)提供栈空间的分配API,即这种API被调用时,是从调用任务的栈空间中分配内存的。对于这一功能,在嵌入式系统中使用得非常的少,我也不建议大家使用。对于下面的代码,mem_main、mem_foo和mem_bar的大小是4K字节(假设int类型的大小是4字节),这些内存就是自动(注意是自动)分配在运行任务的栈上的。我们假设某个任务当前所使用的栈是零字节,当这一任务运行到main中且没有进入foo ()时,其所占用的空间大小是大约4K字节,之所以用大约这个词,是因为函数的调用还有其它的栈开销。一旦任务运行进入foo ()函数但没有进入bar ()函数,那么所占用的栈的大小就变为大约8K字节。同样的,如果程序运行进入bar ()函数,那么所占用的栈空间大约就是12K字节了。
00001:
void
bar
()
00002:
{
00003:
int
mem_bar
[1024];
00004:
// application logic
00005:
}
00006:
00007:
void
foo
()
00008:
{
00009:
int
mem_foo
[1024];
00010:
bar
();
00011:
}
00012:
00013:
int
main
()
00014:
{
00015:
int
mem_main
[1024];
00016:
foo
();
00017:
return 0;
00018:
}
如果程序继续运行,从bar ()函数返回到foo ()函数中,那么其所占用的栈空间就从大约12K字节变成了大约8K字节了。相类似的是,如果程序从foo ()函数中返回到main ()函数,那么所占用的栈空间又变为大约4K字节了。对于嵌入式系统开发,由于任务栈通常都比较的小,那这告诉我们什么呢?我想有以下几点需要注意。
1)函数的调用深度越是深,由于每一级的函数通常都会有局部变量,那么所使用的栈空间也会累积得越大。
2)递归调用需要的栈空间会相对的大(视具体的情况),在嵌入式系统中也建议少用。
3)我们应当尽可能的不要在函数中定义占用内存空间较大的局部变量。
下面,我们总结一下堆与栈的区别,它们是:
1)堆是大家共享的。任务可以通过调用API来从堆中分配内存空间。
2)栈是任务所独有的。在嵌入式系统中,当一个任务创建起来后其栈空间的大小往往是定了的。函数中的局部变量是由编程语言自动从栈上分配的,我们不需要调用API进行空间分配。
最后我有一个问题留给读者您,这个问题是:
前面的讲解中,我们说任务的栈是由操作系统的任务创建API从堆中分配出来的,那栈是否也可以位于.data段或是.bss段中呢?为什么?
答案
由于堆从本质上说来就是一块内存,由于在C语言中一块内存可以从堆中分配,也可以从.data段或是.bss段中分配。因此,任务的栈也是可以从这三块内存中分配获得,也就是说最终的答案是:可以。
你或许还想看一看《程序中的段》。
如果你觉得本文的哪些地方需要改进或是存在一些不明白的地方,请留言。如果你想参与讨论嵌入式系统开发相关的话题,请加入技术圈(g.51cto.com/UltraEmbedded)。
上一页
1
2
下一页
关键词:
嵌入式开发堆和
评论
我来说两句……
验证码:
相关推荐
[跟我学嵌入式开发] 堆和栈
嵌入式系统
嵌入式开发堆和
| 2016-11-28
上一篇:stm32利用固件库开发USB步骤
下一篇:stm32 usb枚举过程
技术专区
FPGA
DSP
MCU
示波器
步进电机
Zigbee
LabVIEW
Arduino
RFID
NFC
STM32
Protel
GPS
MSP430
Multisim
滤波器
CAN总线
开关电源
单片机
PCB
USB
ARM
CPLD
连接器
MEMS
CMOS
MIPS
EMC
EDA
ROM
陀螺仪
VHDL
比较器
Verilog
稳压电源
RAM
AVR
传感器
可控硅
IGBT
嵌入式开发
逆变器
Quartus
RS-232
Cyclone
电位器
电机控制
蓝牙
PLC
PWM
汽车电子
转换器
电源管理
信号放大器
关闭
评论