福彩快三中轴线_STM32 堆栈的理解

2019-12-02来源: eefocus关键字:STM32  堆栈  内存分配

1、MDK STM32的内存分配 (摘自网络)


C语言上分为栈、堆、bss、data、code段。福彩快三中轴线具体每个段具体是存储什么数据的,直接百度吧。重点分析一下STM32以及在MDK里面段的划分。


MDK下Code,RO-data,RW-data,ZI-data这几个段:


Code是存储程序代码的。


福彩快三中轴线RO-data是存储const常量和指令。


福彩快三中轴线RW-data是存储初始化值不为0的全局变量。


ZI-data是存储未初始化的全局变量或初始化值为0的全局变量。


Flash=Code + RO Data + RW Data;


RAM= RW-data+ZI-data;


这个是MDK编译之后能够得到的每个段的大小,也就能得到占用相应的FLASH和RAM的大小,但是还有两个数据段也会占用RAM,但是是在程序运行的时候,才会占用,那就是堆和栈。在stm32的启动文件.s文件里面,就有堆栈的设置,其实这个堆栈的内存占用就是在上面RAM分配给RW-data+ZI-data之后的地址开始分配的。


堆:是编译器调用动态内存分配的内存区域。


栈:是程序运行的时候局部变量的地方,所以局部变量用数组太大了都有可能造成栈溢出。


2、M3手册相关内容


1、 工作模式

Cortex-M3 处理器支持两种工作模式,线程模式和处理模式:

福彩快三中轴线1) 在复位时处理器进入线程模式, 异常返回时也会进入该模式。 特权和用户(非特权)


代码能够在线程模式下运行。


2) 出现异常时处理器进入处理模式,在处理模式中,所有代码都是特权访问的。


2、特权访问和用户访问

代码可以是特权执行或非特权执行。 非特权执行时对有些资源的访问受到限制或不允许

访问。特权执行可以访问所有资源。处理模式始终是特权访问,线程模式可以是特权或非特

权访问。

线程模式在复位之后为特权访问,但可通过 MSR 指令清零 CONTROL[0],将它配置为

用户(非特权)访问。用户访问禁止:

1) 部分指令的使用,例如设置 FAULTMASK 和 PRIMASK 的 CPS 指令。

福彩快三中轴线2)对系统控制空间(SCS)的大部分寄存器的访问。


当线程模式从特权访问变为用户访问后,本身不能回到特权访问。只有处理操作能够改


变线程模式的访问特权。处理模式始终是特权访问的。


3、主堆栈和进程堆栈

福彩快三中轴线结束复位后,所有代码都使用主堆栈。异常处理程序(例如 SVC)可以通过改变其在

退出时使用的 EXC_RETURN 值来改变线程模式使用的堆栈。所有异常继续使用主堆栈,堆

栈指针 r13 是分组寄存器,在 SP_main 和 SP_process 之间切换。在任何时候,进程堆栈和主

堆栈中只有一个是可见的,由 r13 指示。

除了使用从处理模式退出时的 EXC_RETURN 的值外,在线程模式中,使用 MSR 指令

对 CONTROL[1]执行写操作也可以从主堆栈切换到进程堆栈。


3、关于STM32的 主堆栈指针 和 进程堆栈指针 


1、RTOS调用sheduler之前,起作用的是MSP,PSP的值是00000

2、sheduler之后 , RTOS进入运行状态,在task的代码中时此时,起作用的是PSP栈指针 (图示为idel task)

3、进一步验证


在任务调度的代码中设置断点,任务调度过程一定不属于任何一个task。从断点看,任务调度过程使用的是MSP

继续debug,单步至调度过程结束,进入一个task代码,此时栈指针立刻切换到PSP。

4、结论


单片机启动时运行MSP栈,RTOS在执行调度时使用的是MSP


RTOS task运行时,使用的是当前task的栈,栈指针使用的是PSP


即粗略地可以认为 task代码段使用的都是PSP指针,而非task代码段使用任然是MSP指针


附:


1、查找系统栈的起始地址。


map文件中,关于栈的起始地址和大小都有描述。起始地址即栈的栈底地址,栈顶地址为栈低地址加上栈大小的地址


栈的设置如文件中描述,在arm_startup_nrf52.c中

2、在map中,查看heap的情况


startup文件中申请的heap内存管,如果没有被使用的话,会被编译器优化掉

如有错误,敬请斧正

关键字:STM32  堆栈  内存分配 编辑:什么鱼 引用地址:http://news.socialskive.com/mcu/ic481701.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过上海快三app赚钱—主页-彩经_彩喜欢子邮件或上海快三app赚钱—主页-彩经_彩喜欢话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32堆栈空间大小设置
下一篇:STM32-modbus rtu 之从机程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8S存储器的读写操作
/************************************************************************************************************************************ Name    : STM8S存储器的读写操作* Author  : MingMing* Release : 2014/1/2* Update  : 2014/1/2* E-mail  : clint.wang@foxmail.com
发表于 2019-12-05
stm8l051 halt之后外部中断唤醒问题
最近用到stm8l051 halt,在halt之后开启了外部中断,有时灵,有时不灵,设置下降沿触发,但是按键(低有效)放开了才会从HALT退出,最后发现在进去外部中断的时候一直在外部中断里面不退出。在外部中断程序里面把端口的外部中断和端口使能的外部中断功能关闭,问题解决,可以在下降沿从halt退出。1、开启halt,其他代码省略,只贴halt部分:    /* 禁止TIM3 */    TIM3->SR1 = (uint8_t)(~(uint8_t)TIM3_IT_Update);    CLK_PeripheralClockConfig
发表于 2019-12-05
STM8L052低功耗模式
Stm8L系列单片机的低功耗有五种模式:§ wait模式§ Lowpower run模式§ Lowpower wait模式§ Active-haltwith full RTC模式§ Halt模式最低功耗的就是就是halt模式。这里也主要总结一下如何进入halt模式,进入以后可以通过什么方式唤醒,以及有很多客户会关心的如何自动唤醒。Halt模式进入很简单,执行一条halt指令,调用库函数也就是halt()就行了。但是进入前要注意把所有的中断挂起标志给清除掉。要是不清零又恰巧有中断标志的时候进入该模式也会被立马唤醒。进入这种模式,所有的外设全都关闭了,所有时钟关闭。这时候它自己是醒不过来的,只能靠掐人中(给个外部中断)或者重新复活
发表于 2019-12-05
解决STM8类型单片机空间太小,使用不了printf串口打印问题
概述:在使用STM8L101F3这款单片机时,由于它只有8K的flash,空间非常小,只要调用C库函数printf编译后整个文件很大,直接程序溢出。这也就意味着我们实现printf串口打印调试就没办法进行。既然使用不了库函数,那么我们就可以自己动手封装类似printf的函数,这样我们就可以实现数据串口打印啦。这里就直接放上我的STM8L101F3的部分源码了,希望可以给你一些参考。源码:#include "stdarg.h"#include "stm8l10x.h" void USART_Config(void){    /*Set the USART RX
发表于 2019-12-04
解决STM8类型单片机空间太小,使用不了printf串口打印问题
基于STM8的IIC协议--协议篇
4.3.8代码示例。3.6 数据有效性  I2C总线进行数据传送时,时钟信号为高上海快三app赚钱—主页-彩经_彩喜欢平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低上海快三app赚钱—主页-彩经_彩喜欢平期间,数据线上的高上海快三app赚钱—主页-彩经_彩喜欢平或低上海快三app赚钱—主页-彩经_彩喜欢平状态才允许变化。3.7 I2C通信总过程 4. 例程4.1 编译环境:  我的编译环境是IAR,这款软件是现在STM8的主流平台,比较推荐。不过我打算等到STCubeMX更新出比较方便的版本后再去使用Keil5,因为我在用STM32的时候就是利用Keil5,的确很方便,你们也可以学着用一下。4.2 主芯片:  我的主芯片是STM8S系列中的103,其中STM8S的003、005、和103、105,配置一样(外设和CPU频率,FLASH),在代码相同的
发表于 2019-12-04
基于STM8的IIC协议--协议篇
基于STM8的ADC读取---STM8-第四章
和连续转换的扫描模式具有上限和下限门槛的模拟看门狗模拟看门狗时间发生可产生中断----------------------------------------------------------------------------------------------------------------------------------3. 例程3.1 编译环境  我的编译环境是IAR,这款软件是现在STM8的主流平台,比较推荐。不过我打算等到STCubeMX更新出比较方便的版本后再去使用Keil5,因为我在用STM32的时候就是利用Keil5,的确很方便,你们也可以学着用一下。3.2 主芯片  我的主芯片是STM8S系列中的103
发表于 2019-12-04
基于STM8的ADC读取---STM8-第四章
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

上海快三app赚钱—主页-彩经_彩喜欢子工程世界版权所有 京ICP证060456号 京ICP备10001474号 上海快三app赚钱—主页-彩经_彩喜欢信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 socialskive.com, Inc. All rights reserved