单片机核心/RTOS必备 (前言)"/>
单片机核心/RTOS必备 (前言)
学习路线差别
- 单片机入门(HAL):简单、快速、实际上工作中涉及单片机编程时,也提倡使用HAL库。对于学习来说,HAL库封装了很多技术细节,对技术成长帮助不大。
比如,可能接触不到:重定位、代码段数据段BSS段、位置无关码、相对跳转、绝对跳转、设置栈、中断上下文、保存/恢复中断现场、ARM架构。
这些知识,是单片机的核心,学习了它,有助于在RTOS领域发展。 - 单片机深入(基于寄存器):抛开HAL库,从芯片手册开始,自己写出一切代码。工作中绝对不建议这么做,但是学习时,可以学习到更深刻的知识。
这些知识,也是后续学习RTOS、学习Linux的u-boot的必备知识。 - 不学单片机,直接上手Linux。
嵌入式发展历史
MCU->专用功能的硬件,运行RTOS。
Application Processor(MPU):MCU升级版本,添加DSP、GPU,运行Linux类的操作系统,安装应用程序->通用功能。
嵌入式系统硬件组成
系统支持SPI Flash启动,这意味着可以运行SPI FLASH上的代码,但是SPI FLASH不是XIP设备,cpu无法直接执行里面的代码。
CPU上电后,访问片内ROM(XIP设备),帮助CPU运行SPI Flash上的程序。
点亮LED灯
- 看原理图确定控制LED的引脚
- 看主芯片手册,确定如何设置/控制引脚
- 写程序
LED的电阻一般非常小,电压通常为3.3V,I = U/R,因此I就非常大,会立刻把灯烧坏,因此需要串联一个电阻。
上面能点亮的前提是,GPIO可以输出3.3V/0V的电压,但有些芯片仅能输出1.2V或更低的电压,引脚的驱动能力不足。
二极管:当左边电压大于右边电压时,电流就可以通过,发光二极管就可以发光。
当P极电压高于下面的N极时,三极管导通,上面的电流就可以往下。
对寄存器的操作:不要影响其它位
怎么访问寄存器?
用指针
unsigned int *p = 0x40010800; //p等于某个寄存器的地址
*p = val; //下寄存器
val = *p; //读寄存器
在X86架构中内存和IO是分开的,根据CPU发出的指令选择不同的设备。
X86属于复杂指令集计算机(CISC:Complex Instruction Set Computing)
它所用的指令比较复杂,比如某些复杂的指令,它是通过“微程序”来实现的。
比如执行乘法指令时,实际上会去执行一个“微程序”。
在微程序里一样是去执行这4个操作:
但是对于程序员来说,他看不到“微程序”,好像用一条指令就搞定了一切。
在ARM CPU看来,内存、IO的操作是一样的。
ARM芯片属于精简指令集计算机(RSIC:Reduced Instruction Set Computing)它所用的指令比较简单,有如下特点:
- 对内存只有读、写指令
- 对于数据的运算是在CPU内部实现
- 使用RISC指令的CPU复杂度小一点,易于设计
RISC和CISC
CISC指令能力强,但多数指令使用率低却增加了CPU的复杂度,指令是可变长格式。
RISC指令大部分为单周期指令,指令长度固定,操作寄存器,对于内存只有LOAD/STORE操作。
CPU内部有很多寄存器
无论是Cortex-M3/M4,还是Cortex-A7,CPU内部都有R0,…,R15寄存器,它们可以用来“暂存”数据。
对于R13,R14,R15,还有另外的用途:
- R13:Stack Pointer,栈指针。
- R14:Link Register,用来保存返回地址。
- R15:Program Counter,程序计数器,表示当前指令地址,写入新值即可跳转。
M3/M4:比较两个数时,结果保存在PSR中。
汇编指令使用“SP”,但是它可能对应不同的SP寄存器,一般情况下都是使用SP_main,运行RTOS时,可以让APP使用SP_Process。
xPSR:保存程序状态,比如上一条指令的执行结果、比较结果;也有一些控制作用,比如屏蔽中断、使能中断。
xPSR
对于Cortex-M3/M4来说,xPSR实际上对应3个寄存器。
- APSR: Apllication PSR,应用PSR
- IPSR:Interrupt PSR,中断PSR
- EPSR:Exectution PSR,执行PSR
这3个寄存器,可以单独访问:
MRS R0,APSR
MRS R0,IPSR
MSR APSR R0
这3个寄存,也可以一次性访问:
MRS R0,PSR
MSR PSR,R0
程序状态寄存器中的位域
- N:负标志
- Z:零标志
- C:进位(或者非借位)标志
- V:溢出标志
- Q:饱和标志
- GE:大于或等于标志
- ICI/IT:中断继续指令
- T:Thumb状态,总是1,清除此位会引起错误异常
- 异常编号:表示处理器正在处理的异常。
更多推荐
单片机核心/RTOS必备 (前言)
发布评论