STM32 堆栈的理解

2 篇文章 0 订阅
2 篇文章 0 订阅

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内存管,如果没有被使用的话,会被编译器优化掉




如有错误,敬请斧正


  • 12
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: MicroCANopen是针对嵌入式系统的一种轻量级的CAN总线通信协议,而STM32是一款由STMicroelectronics推出的32位ARM Cortex-M系列微控制器。那么"MicroCANopen STM32"可以理解为使用MicroCANopen协议在STM32微控制器上进行CAN总线通信。 MicroCANopen提供了一套简单易用的函数库,使得在嵌入式系统中实现CAN通信变得更加简便。而STM32系列微控制器则提供了强大的处理能力与丰富的外设接口,可以实现多种类型的应用。 在使用MicroCANopen和STM32进行CAN总线通信时,首先需要初始化STM32的CAN控制器,设置必要的参数如波特率、过滤器等。然后,在代码中使用MicroCANopen提供的函数库,实现CAN通信的初始化、数据发送和接收、帧过滤等功能。 通过MicroCANopen STM32的组合,可以实现各种应用,例如车辆网络中的节点通信、工业控制系统中的设备联动等。使用该组合可以减少开发者的工作量,并提高开发效率。 总之,MicroCANopen STM32是一种方便、高效的CAN总线通信解决方案,能够在嵌入式系统中实现各种应用需求,并提供了丰富的功能和接口供开发者使用。 ### 回答2: MicroCANopen是基于CAN总线通信协议的一个开源实现,用于嵌入式系统中的通信和控制。而STM32是意法半导体(STMicroelectronics)公司推出的一款微控制器系列,具有强大的性能和丰富的外设功能,广泛应用于工业控制、通信、汽车电子等领域。 MicroCANopen STM32是指在STM32系列微控制器上使用MicroCANopen协议栈。通过将MicroCANopen协议栈移植到STM32平台上,可以实现在CAN总线上的通信和控制。 MicroCANopen STM32支持具有CAN功能的各种STM32微控制器,包括STM32F0、STM32F1、STM32F3、STM32F4、STM32F7和STM32L系列。它提供了一组API函数和示例代码,使开发人员能够方便地在STM32上进行CAN通信和控制的开发。 通过MicroCANopen STM32,开发人员可以轻松实现诸如数据传输、节点连接、设备识别、远程配置和监控等功能。同时,它还提供了一些高级特性,如心跳检测、NMT命令等,用于实现高可靠性和实时性的通信。 使用MicroCANopen STM32,开发人员可以快速构建具有CAN通信功能的嵌入式系统,实现设备之间的数据交换和控制命令的传递。这对于工业自动化、机器人控制、智能交通系统等领域非常有用。 总之,MicroCANopen STM32是一种在STM32平台上使用的开源CAN协议栈,可以帮助开发人员实现在CAN总线上的通信和控制,为嵌入式系统开发提供了便利。 ### 回答3: MicroCANopen是一种适用于STM32微控制器的开源CANopen协议栈。STM32微控制器是意法半导体(STMicroelectronics)推出的基于ARM Cortex-M内核的一系列微控制器。CANopen是一种基于CAN总线的通信协议,广泛应用于工业自动化、机器人技术和控制系统等领域。 MicroCANopen stm32是将MicroCANopen协议栈适配到STM32微控制器上的实现。通过使用这个软件堆栈,使用STM32微控制器的工程师们可以轻松地实现CANopen通信功能。这个软件堆栈提供了一套功能丰富的API,涵盖了CANopen协议的各个方面,如节点配置、NMT(网络管理)命令、SDO(服务数据对象)等等。开发人员可以根据实际需求使用这些API来开发自定义的CANopen应用程序。 MicroCANopen stm32还提供了一套面向从机设备的模板代码,通过这些模板代码,工程师们可以快速地开发出符合CANopen标准的从机设备。同时,这个软件堆栈还支持网络管理、节点监测和错误报告等常用的CANopen功能。 使用MicroCANopen stm32可以简化和加快STM32微控制器上CANopen通信功能的开发过程。开源的特性还使得开发人员可以根据自己的需求对这个软件堆栈进行定制和扩展。总之,MicroCANopen stm32为工程师们提供了一个高效而强大的工具来实现STM32微控制器上的CANopen通信功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值