stm32中有3条总线:地址总线,数据总线,系统总线;地址总线上是地址值,数据总线上是数据值,cpu读写时会先在地址总线上传输地址值,如果是写操作之后数据总线上会放往前面地址处写入的数据值,如果是读操作之后数据总线上会放前面地址处的数据值;地址总线既可以访问RAM也可以访问ROM,而当前访问RAM和ROM的地址会被寄存器SP和PC记录下来,即SP和PC就是用来记录当前RAM和ROM的访问地址/位置。

SP MSP PSP的理解:参考 1:https://blog.csdn.net/u012351051/article/details/125107815    2: https://mp.weixin.qq.com/s?__biz=MjM5MzUxMTAwMg==&mid=2649785048&idx=2&sn=8f3c5ac9cd4d4586d1543cb96502634d&chksm=be91c1ed89e648fb6c082a77f18b6bcffafc730c0041f1de3d50f3b53b0d7a37a170a55f17f9&scene=27

在CPU中,堆栈寄存器SP一共有3个,分别为SP、MSP、PSP。SP是对外使用的寄存器,或者认为SP始终指向当前模式下使用的MSP/PSP,只不过在OS内核或Handler模式下,SP先指向MSP,或者说SP拷贝了MSP的值,可以直接访问主堆栈。而在线程模式下,SP拷贝了PSP的值,可以直接访问线程(任务)堆栈。即SP是MSP和PSP的代言人,即SP是MSP和PSP的逻辑地址,对于裸机程序,我们只需要知道SP即可,而对于OS系统,尤其涉及中断、任务上下文切换时,就需要知道PSP和MSP了,OS底层也会直接针对PSP进行编程。

在发生中断时,CPU硬件需要自动保存现场,此时SP指向MSP还是PSP,取决于发生中断前正在使用的堆栈,即如果发生中断前,正在运行线程模式,而且是task任务运行,则使用PSP,而如果进入中断前,使用的MSP,这里就继续使用MSP。一旦开始执行中断服务程序,即handler模式,则一定使用MSP,也就是,如果是有OS的情况下,正在运行task的时候,发生了中断,CPU先使用PSP自动保存现场,跳入到中断服务程序后,就从PSP切换到MSP,所有中断服务程序用到的临时变量都存放到MSP里。

只有中断服务函数ISR工作在处理模式/handler下,其余所有的代码包括os的内核、驱动、应用等都工作在线程模式/thread下;而线程模式又分为特权状态(也叫内核态)和非特权状态(也叫用户态),之所以分成两个态就是为了os设计的;os的内核代码运行在线程模式的特权态下,用户app代码运行在线程模式下的非特权态。

FreeRTOS 中栈指针的类型为uint32*,而没用uint32,虽然地址是个uint32的数,也可以通过 *(uint32 *)addr来获取地址处的值,但FreeRTOS的栈是使用uint32数组的形式实现,因此遍历数组内的元素值(其实就是cpu中寄存器中的数值,这个数值既可以是地址值也可是数据值)就需要一个数组类型的指针即uint32*,这个uint32*的数据指向(等于)数据内各元素的地址值。

32位ARM和Thumb指令:32位Thumb指令具有.w后缀。

MOV 指令码

  语法: MOV   A    B

  解释: GUN ARM    汇编语法是把右值传入左值  A <---- B
      Inter x86  汇编语法是把左值传入右值  A ----> B

C语言中对所有标号/变量的操作,都是对其值的操作,而不是操作其地址值,即使是指针变量也是如此;对指针变量的操作也是指针变量的值,即它指向的变量的地址值,而不是指针变量本身的地址值。

asm语言中对所有标号/变量的操作,都是对其地址的操作,而不是操作其值,即使是普通变量也是如此;

LDR R0 [a]; 从a变量地址值处取出值传入R0中,等同于把a的值传入R0中,这里的a指变量a的地址值;

LDR 指令码 中 =后跟标号,取得是标号的地址,而不是标号的值,如果是一个具体的数值,那这个值是个地址值。

最新文章

  1. Repeater、地址栏传值、Response--2016年12月30日
  2. (转载)iOS UILabel自定义行间距时获取高度
  3. Bootstrap之表格checkbox复选框全选
  4. HBM内存介绍
  5. [转载]浅谈组策略设置IE受信任站点
  6. 大型文档源文件拆分编辑编译\include{filename}
  7. linux 学习笔记 Linux内核的四大功能简介
  8. Linux :: vi E212: Can&#39;t open file for writing
  9. java中的double
  10. 谷哥的小弟学前端(11)——JavaScript基础知识(2)
  11. 华为云照片的爬虫程序更新(python3.6)
  12. Python小代码_9_求水仙花数
  13. openlayers4 入门开发系列之地图模态层篇(附源码下载)
  14. 快速搞定Word,提高你的工作效率
  15. sql语句实现行转列练习
  16. C#语言のC#扩展方法(.Net特性)
  17. Redis Windows上下载安装
  18. Java 是值传递
  19. array_sum(),array_product()的使用
  20. JavaScript语言简介

热门文章

  1. wtform的用法
  2. JSP图书管理系统
  3. python之路5:常用模块
  4. 数据库可视化---grafana的简单使用
  5. Java反射获取方法参数名
  6. OA产品并发访问能力
  7. 设置eclipse默认编码为UTF-8 Set default encoding to utf-8 in eclipse
  8. Twitter Bootstrap Grid System
  9. Java 04-基础 数据类型转换 自动类型转换+强制类型转换
  10. 跨时钟域之异步FIFO