历史上的今天
返回首页

历史上的今天

今天是:2025年01月15日(星期三)

正在发生

2020年01月15日 | STM32 堆和栈的学习

2020-01-15 来源:eefocus

stack 翻译为:栈 heap 翻译为:堆

1.堆和栈大小

定义大小在startup_stm32f2xx.s


      Stack_Size      EQU     0x00000400


      Heap_Size       EQU     0x00000200


2.堆和栈各自的意义

以下引用网上资料 理解堆和栈的区别

(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局 部变量的值等,其操作方式类似于数据结构中的栈。

(2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。

(3)全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系 统自动释放。

(4)文字常量区:常量字符串就是存放在这里的。

(5)程序代码区:存放函数体的二进制代码。

例如:


    int a=0;                             //全局初始化区

    char *p1;                            //全局未初始化区

    main()

    {

     int b;                             //栈

     char s[]="abc";                    //栈

     char *p3= "1234567";               //在文字常量区

     static int c =0 ;                  //静态初始化区

     p1= (char *)malloc(10);            //堆区

     strcpy(p1,"123456");              //"123456"放在常量区

    }


所以堆和栈的区别:

stack的空间由操作系统自动分配/释放,heap上的空间手动分配/释放。 stack的空间有限,heap是很大的自由存储区。 程序在编译期和函数分配内存都是在栈上进行,且程序运行中函数调用时参数的传递也是在栈上进行。

3.堆和栈空间分配

这里写图片描述

栈:向低地址扩展

堆:向高地址扩展

显然如果依次定义变量

先定义的栈变量的内存地址比后定义的栈变量的内存地址要大

先定义的堆变量的内存地址比后定义的堆变量的内存地址要小

4.堆和栈变量

栈:临时变量,退出该作用域就会自动释放

堆:malloc变量,通过free函数释放

另外:堆栈溢出,编译不会提示,需要注意

推荐阅读

史海拾趣

Amptek Inc公司的发展小趣事

Amptek Inc 是一家专注于放射性测量和分析仪器的公司,提供各种 X 射线和伽马射线探测器以及相关的测试设备和软件。以下是 Amptek 公司发展的五个相关故事:

  1. 公司成立与早期发展:Amptek 公司于1987年成立,总部位于美国马萨诸塞州贝弗利市。公司成立初期,主要从事于放射性测量仪器的研发和生产。创始人团队在核物理和仪器设计领域拥有丰富的经验,致力于提供高性能、高精度的测量和分析解决方案。

  2. 技术创新与产品升级:随着技术的不断进步,Amptek 公司持续进行技术创新和产品升级。公司引入先进的探测器技术和数据处理算法,不断提升产品的性能和精度。公司的 X 射线和伽马射线探测器在放射性测量和分析领域具有很高的声誉,被广泛应用于科学研究、医学诊断、工业检测等领域。

  3. 全球市场拓展:Amptek 公司在全球范围内建立了广泛的销售网络和服务体系。除了在美国设立销售和服务中心外,公司还在欧洲、亚洲等地设立了分支机构和代理商,为全球客户提供及时的技术支持和售后服务。公司的产品远销全球,赢得了国内外客户的信赖和好评。

  4. 科研合作与应用推广:Amptek 公司与世界各地的科研机构、大学和实验室保持着紧密的合作关系,共同开展科研项目和应用研究。公司的产品被广泛应用于粒子物理、天体物理、材料科学、核医学等领域的实验和研究中,为科学家和研究人员提供了强大的实验工具和数据支持。

  5. 持续发展与未来展望:Amptek 公司将继续致力于技术创新和产品研发,不断提升产品的性能和功能,满足客户不断增长的需求。公司将继续拓展国际市场,加强与客户的合作关系,进一步巩固在放射性测量和分析领域的领先地位。同时,公司还将关注新兴市场和新技术的发展趋势,积极布局未来的发展方向。

深圳杜因特(DOINGTER)公司的发展小趣事

经过数年的技术研发和产品迭代,杜因特成功开发出多款高性能的MOS场效应管产品,这些产品广泛应用于开关电源、液晶电视、充电器等多个领域。随着产品质量的不断提升和市场份额的逐步扩大,杜因特逐渐在电子行业树立了良好的品牌形象。

德欣(COV)公司的发展小趣事

作为一家有社会责任感的企业,德欣公司始终关注环境保护和可持续发展。公司积极推广绿色生产技术和资源循环利用方案,减少生产过程中的能源消耗和废弃物排放。同时,德欣公司还积极参与社会公益活动,为社区和环境贡献自己的力量。这些举措不仅体现了德欣公司的社会责任担当,也为其赢得了更多客户和合作伙伴的信任和支持。

DC Components公司的发展小趣事

在电子行业中,产品质量是企业立足之本。DC Components公司深知这一点,因此始终把质量控制放在首位。公司通过实施严格的质量控制系统,确保每一个产品都符合高质量标准,并符合所有合同要求。这种对质量的坚守,使DC Components公司在市场上赢得了良好的口碑,吸引了众多客户的青睐。

Elytone Electronics Co Ltd公司的发展小趣事

进入XXXX年代,随着电子技术的飞速发展,Elytone公司意识到技术创新是企业持续发展的关键。公司投入大量资金引进先进设备和研发人才,成功开发出一系列具有竞争力的电子产品。这些产品在市场上获得了良好的口碑,为公司的快速发展奠定了坚实基础。

Aptina (ON Semiconductor)公司的发展小趣事

在快速发展的同时,Aptina注重技术研发与专利布局。公司投入大量资源用于研发,不断推出具有创新性的图像传感器产品。这些产品不仅提升了公司的市场竞争力,还为Aptina积累了大量的技术专利。这些专利成为了公司宝贵的资产,为公司的长期发展奠定了坚实基础。

问答坊 | AI 解惑

请教DSP电源问题

问一下用过TMS320F2812的高手们,有没有用过TPS767D318这款电源芯片,它能同时输出两路电压,是不是固定电压3.3V和1.8V啊.我只知道有一个口输出的是3.3V,另外一个手册上也没有说.用过的给我讲讲吧.谢谢.…

查看全部问答>

如何学习嵌入式系统

如何学习嵌入式系统…

查看全部问答>

wince 复制文件。

大家好,本人刚刚接触wince ,想把系统里的cetsc.exe复制出来,但提示“无法复制rom中的文件” 要怎么样才能复制出来吗? 真的很郁闷,请大家帮帮忙。…

查看全部问答>

有晶体管的群吗

怎么论坛不分一块这个呀,放在硬件里面合适不…

查看全部问答>

发送中文短信程序出错

使用WCDMA短信猫发送PDU格式中文短信,源程序make后出现如下错误: [root@localhost linux_serial_sms]# make arm-uclibc-linux-gcc -g -Wall -c send.c -o send.o send.c: In function `signal_handler_IO\': send.c:764: warning: unused var ...…

查看全部问答>

RS232驱动器/接收器的作用???

1)我的ARM9芯片连了一块MAX3243,MAX3243是RS232驱动器/接收器,请问这个芯片的作用?   他是专用UART控制器的一种吗? 2)我要编写驱动,是基于ARM9内部的UART,还是涉及到MAX3243? 请高手能帮帮我吗,谢谢…

查看全部问答>

转载--单片机学习之门派选择。作者写得很有意思,建议看看

正宗的51系列少林功夫已享誉30余年,足已号令单片机天下,各类什么ARM阳功\\AVR阴功\\凌阳神功\\PLC毒功\\三星绝户功\\恐怕只是呈雄一时之后继无人功。        目前各种新派单片机武功层出不穷,跳出51\\96系列都敢 ...…

查看全部问答>

哪里可以买到STM8L151K4T6的样品?

                                 如题…

查看全部问答>

【求助】MSP430单片机如何用定时器输出固定连续时钟?

各位老师: 最近我在研究MSP430单片机,用MSP430F2121做一个东西。 考虑到外设需要一个10HZ的时钟信号。想用定时器A来完成这一功能。 以为用TimerA0的连续计数模式可以搞定。 XI,XOUT外接一个6MHZ的晶体,计数器的时钟源为ACLK,ACLK由6Mhz ...…

查看全部问答>

DSP2812 非法中断问题

自己做的DSP2812板子,出现如下问题:用合众达510PLUS仿真器链接上DSP,LOAD完.out文件,然后go main,到此系统都正常,这时如果点击全速运行(F5)程序立即跳到非法中断里面,每次重新加载都是如此。但是如果在main()中的while(1)之前的初始化 ...…

查看全部问答>