公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

Cortex M处理器汇编语言编程之一:开篇

Cortex M处理器汇编语言编程之一:开篇

User12775
Level 5
Level 5
First solution authored First like received

一般程序员用不着使用汇编语言编程,

因为C语言已经是很低级的一种语言了, 对于汇编语言来讲提供了不少的抽象. 这些抽象使得程序员从汇编语言时代近了一大步. 目前而言C语言是嵌入式开发的主流语言, 对于更低级的语言来讲,它具备的优点:

  1. 管理内存分配, 比如定义一个int a; 只要是内存够用的情况下,程序员不用管这个变量存在哪个区,哪个地址

  2. .常用结构抽象,比如switch-case,编译器可以根据实际情况选择最优化的方案(一般有if-else,jump-table,函数指针查表等几种方式),如果手工汇编则需考虑细节太多,

  3. 过程式编程, 将整个程序运行的过程分为若干个函数对顶层设计来讲可以在更高的逻辑层次思考问题.当然函数调用层次过多会增加开销,但是这种以硬件资源换取设计复杂度的交换是值得的.(inline函数可以减轻一些这种开销)

  4. 数据定义抽象,如不同长度的整数,结构体等等,使得实际的数据更符合应用需求的结构.

....
以上的这些抽象了的部分正是编程中大部分的工作. 所以采用C语言编程,比起汇编语言编程来, 开发进度能大大提高. 除了C语言之外, 还有其他几种选择,但是都不如C语言能够切中嵌入式应用的要害,故此都没有流行开来.

实际的编程虽然不使用汇编语言了,但是程序员必须能看懂汇编语言. 因为C语言仅仅是汇编语言上浅浅的一层包装,在开发嵌入式程序时不可能不时时接触到汇编语言.如:

  1. 启动文件, 虽然也能使用C语言编写,但是启动文件一般由汇编语言编写. 因为这是芯片上电后立即运行的代码, 各种初始化还没有进行. 此时的一般任务有:时钟初始化, 内存控制器初始化, 中断控制器初始化, CLib初始化.

  2. 手工优化的代码. C编译器生成的代码绝大多数比手工编写的汇编代码要更加优化, 但是并非全部.在某些位置依旧需要手工优化. 如DSP运算的函数. 尤其是对于较为新的内核, 如Cortex M/Tricore/等等,按照C语言的标准, 编译器是不能利用到能达到到更高性能的指令的. 很多专用DSP内核也是如此.

  3. RTOS中的任务切换,系统服务等等.

所有的Cortex M内核中, Cortex M0/M0+/M1的指令最为简单, 只有56条, 是熟悉汇编语言编程的比较好的平台. 因为指令比较少, 但是比较齐全. 所谓麻雀虽小五脏俱全即是这个意思. 当然还有更简洁的处理器, 比如PIC,AVR的某些型号只有30多条指令. 但那种内核过于简单, 新产品使用的可能性已经不大.

这一系列以Cortex M0为例, 简短介绍一下汇编语言编程.
计划写的贴子:


  1. 汇编语言简介, MOV,逻辑运算, 直接跳转(本帖)

  2. 加减乘除, 乘法与除法值得注意,Cortex M0的乘法指令有两种物理实现,另外没有硬件除法指令

  3. 移位, Load, Store

  4. 扩展, 字序翻转, SVC, MRS, MSR

  5. 随机数生成器,点乘

  6.  Biquad实现

  7. FIR实现

  8. Resonator实现

  9. 向量运算

  10. 行列式/矩阵相乘

  11. 平方差

  12. FFT


0 点赞
2190 次查看
5 评论