跟工程师学嵌入式开发:基于STM32和μC OS-Ⅲ(学习笔记)

  • 堆栈:

  • 堆栈的本质就是一片内存区域,针对这片区域进行访问的规则是后进先出,加入新数据或删除旧数据都是通过栈顶指针的移动来予以完成的。

  • 堆栈有 4 种不同的类型: 满减、满增、空减、空增。我们主要讨论最常用的堆栈形式:满减栈。其中的“满”字表
    示栈顶指针始终指向(实打实的)栈顶元素,而不是栈顶元素的下一个空位,所以感觉很 “满”;而“减”字的含义就是指堆栈的生长方向是从高地址向低地址,当有新数据需要压 入时,栈顶指针首先减 1(4 个字节)指向新的空单元,然后将新数据存入此处。请注意: 指针减1 表示意味着移动 4 字节的地址。

  • 请注意入栈操作步骤:先 SP 减 1,再放数据,所以 SP 始终指向新入栈的数据。 出栈操作步骤:先弹出欲删除的数据,然后才将 SP 加1。

  • :存放局部变量,参数传递。栈空间的局部变量只生存于其所在函数截然不同。
    :方便指针/引用操作的。所谓堆空间,指的可供程序员使用malloc()和 free()等函数临时申请或释放存储单元的空间。在一个函数中使用 malloc()在堆中申请的地址单元,可以通过“传址”的方式在其它函数中引用。

  • ARM 汇编则用 EXPORT 在程序中声明一个全局的标号,该标号可以在其他的文件中引用。 与 EXPORT 语义相反的伪指令是
    IMPORT,用它来指示汇编器,它所声明的变量来自于其他源文件,但需要在本源文件中使用。

  • 在 C 语言中,可以用 char 来定义字节型数据,用 int 来定义32位的整数。在 CM3 体系结构中,DCD 伪指令的作用就是定义一个 32 位的整型变量,当然这个变量在此是一个指针,指向相应的异常服务程序入口地址。

  • 段定义。在 ARM 汇编语法规则中,段定义使用伪指令 AREA,其语法格式为:

AREA 段名 属性 1,属性 2,……

其中,属性字段表示这部分代码的类型和操作方式。如有多个属性,其间用逗号分隔。
常用的类型属性常包括:
 CODE(代码段):属性值都为 READONLY,以防代码被意外篡改。
 DATA(数据段):属性值可以是 READWRITE 或 READONLY,视用户的需要而定
 NOINIT(未初始化的数据段):也属于数据段,这样的段其内部单元在编译时其值随机,在程序运行过程中需要在这片区域申请内存时,相应单元的值才会被动态地赋值。

  • RO(只读段):包括代码和只读数据,如字符串 s=“Hello World\n”。
  • RW(读写段):指程序中已被初始化的数据,如变量 a=123
  • ZI(初始化为 0 的数据段):比如程序中某数组大小为 2000 字节,并且全初始化 0, 但在最终的 Image文件中,编译器并没有实际分配 2000 字节大小的空间(因为这会增加映像文件的体积,在嵌入式系统中,会浪费宝贵的内存资源),只是按照某种算法,将这 2000 字节进行了压缩。只有当执行 Image的时候,才解压并分配实际大小 2000 字节的空间。
posted @ 2020-11-11 11:21  火红色祥云  阅读(39)  评论(0编辑  收藏  举报