ARM
文章平均质量分 94
ARM内核学习笔记
柯西的彷徨
道阻且长,行则将至。
展开
-
[019] [ARM-Cortex-M3/4] 中断等待和异常处理优化
中断等待(延时):从检测到某中断请求,到执行了其服务例程的第一条指令时,已流逝的时间。可能造成中断等待的情况:- CPU正在处理另外一个相同或更高优先级的异常- CPU正在执行非对齐传输- 调试器访问存储器系统有些指令需要较多的周期才能完成:- 除法指令- 双字传送指令LDRD/STRD- 多重数据传送指令LDM/STM/PUSH/POP对于LDRD/STRD:为了保证中断及时响应而取消它们的执行,待返回后重新开始。对于多重数据传送指令:支持LDM/STM/PUSH/POP指原创 2022-03-24 03:12:42 · 1475 阅读 · 0 评论 -
[018] [ARM-Cortex-M3/4] 利用pendsv和systick异常编写一个简单的RTOS
对于一个函数:- 有自己的栈,只有不破坏栈即可(如数组越界访问),无需手动保存- 指令、全局/静态变量、常量都保存在flash上(启动时会将变量重定位到RAM中),无需手动保存- r0~r3、r12、lr、返回地址pc、xpsr发生中断/异常时,由硬件自动保存,并且在退出异常服务例程后,会自动恢复。- 进入函数前,保存r4\~r11到自己的栈中,退出函数后,恢复r4\~r1。(由ATPCS规定,C函数只要使用到这些寄存器,生成的汇编指令都会在进入函数时,将寄存器Push到栈中,退出时从栈中Pop)原创 2022-03-23 22:26:08 · 943 阅读 · 1 评论 -
[017] [ARM-Cortex-M3/4] 中断的硬件框架
中断源 - 引脚映射的外设,如GPIO/UART/DMA/TIMER等 - 触发方式,如GPIO可以配置上升沿、下降沿等方式触发 - 触发控制:使能中断、中断状态、中断类型等- 中断控制器 - 各中断源发出的中断信号,汇聚到中断控制器 - 可设置各中断优先级、使能/失能中断等操作 - 中断控制器向CPU发送中断信号,CPU通过读取中断控制器的寄存器,判断当前处理的是哪个中断 - 中断控制器有多种实现,比如: - STM32F103中被称为NVIC:Nested vec原创 2022-03-22 02:01:29 · 1272 阅读 · 0 评论 -
[016] [ARM-Cortex-M3/4] Systick异常实战
systick为24位向下计数的定时器- 时钟源可以选外部时钟源(AHB/8)或内核时钟AHB- `systick->ctrl`的tickint位使能systick异常、enable位使能定时器。(**定时器不使能就不会开始计数,也就无法触发异常**)- 当向下计数器`systick->val`减到0时: - systick->ctrl的tickint位使能systick异常、enable位使能态后由硬件置位,但若由于所需的处理任务花费时间太长而导致悬起状态再次置位,则需要清除systick的悬原创 2022-03-22 01:58:11 · 1368 阅读 · 0 评论 -
[015] [ARM-Cortex-M3/4] SVC和PendSV异常实战
PendSV和SVC一般用于OS,SVC用于产生系统函数的调用请求,从而导致内核的异常处理函数被调用,进而去使用内核的服务。- 使用`SVC #VAL`指令即可触发SVC异常,进入Handler模式——特权级,其中`#VAL`立即数一般作为系统调用代号。- 在SVC服务例程执行后,上次执行的SVC指令地址在异常栈帧中保存,==从SVC指令的机器码提取出立即数,即获得请求执行的功能代号==。原创 2022-03-22 01:54:46 · 2994 阅读 · 0 评论 -
[014] [ARM-Cortex-M3/4] Usage Fault 使用错误异常实战
测试使用**未定义指令**引发的使用错误异常(软件断点就是使用`未定义指令`来实现的)原创 2022-03-22 01:51:55 · 4147 阅读 · 0 评论 -
[013] [ARM-Cortex-M3/4] 异常与中断的具体内容
编号1~15为CM3/4内核**异常(**没有编号为0的异常,一般该地址设置MSP的初始值),还有240个请求信号来自CM3内核外的片上外设或外扩的外设的**中断**:原创 2022-03-22 01:49:10 · 1813 阅读 · 0 评论 -
[012] [ARM-Cortex-M3/4] 异常与中断处理流程
1. 正常程序是顺序执行的,在CM3中每执行一条指令,PC += 4;2. 通过跳转指令,程序可以跳转到特定的地址标号/特定的子程序处执行;3. 当异常/中断发生时,系统**执行完当前指令后**,将跳转到相应的ESR/ISR处执行。当执行完后程序**返回发生中断的指令的下一条指令**处执行。(进入ESR/ISR前先保护被中断程序的执行现场,从异常程序退出时,要恢复现场)原创 2022-03-22 01:44:18 · 6478 阅读 · 0 评论 -
[011] [ARM-Cortex-M3/4] CM3指令集与CMSIS函数汇总
#mermaid-svg-TiwIdPk7d0RxIFz3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TiwIdPk7d0RxIFz3 .error-icon{fill:#552222;}#mermaid-svg-TiwIdPk7d0RxIFz3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TiwIdPk原创 2022-03-19 00:27:15 · 908 阅读 · 0 评论 -
[010] [ARM-Cortex-M3/4] 复位序列与类型
- **上电复位**:复位微控制器中的所有部分,其中包括处理器、调试支持部件和外设等。- **系统复位**:只会复位处理器和外设,不包括处理器的调试支持部件。- **处理器复位**:只复位处理器。系统复位与处理器复位不会复位调试部件,因此可以保持MCU与调试器间的连接,调试器也可以通过系统控制块(SCB)的寄存器产生系统复位或处理器复位。原创 2022-03-14 11:16:36 · 2701 阅读 · 0 评论 -
[009] [ARM-Cortex-M3/4] 进位/借位与溢出
- 无符号数在相加时才会发生进位,相减发生借位;- 有符号数只有在两正数或负数相加时(减正数可视作加负数,减负数视作加正数)才会发生溢出,其他情况不会溢出;- 由于汇编不能真正区别有符号与无符号数,一般由程序员主观决定,对于无符号数关心`C`位,有符号数则关心`V`位。- 数字在计算机中是以其补码进行存储的,正数的补码为其本身,负数的补码为原码按位取反+1。原创 2022-03-13 23:12:54 · 5785 阅读 · 0 评论 -
[008] [ARM-Cortex-M3/4] 局部变量一定是保存在栈区的吗
- 局部变量不加`volatile`时,如果当前有**空闲**的寄存器(`sp`和`pc`除外),编译器会对其进行优化,即直接将值加载到这些寄存器中,在cpu内部完成运算,不需要访问内存和开辟栈空间;- 局部变量加`volatile`时,编译器不会对其进行优化,且永远都是先在栈中保存局部变量的值,再从栈中读出这些数据进行相应运算,最后弹栈释放开辟的栈内存。原创 2022-03-11 20:51:57 · 1162 阅读 · 0 评论 -
[007] [ARM-Cortex-M3/4] C与汇编深入分析
[ARM-Cortex-M3/4] ATPCS子程序调用规则](https://blog.csdn.net/kouxi1/article/details/123039106?spm=1001.2014.3001.5502)规定了函数调用过程中参数的传递、局部变量的保存、数据栈的使用等规则。| 寄存器 | 别名 | 特殊名称 | 使用规则 || ------ | ---- | -------- | -原创 2022-03-10 00:51:31 · 1611 阅读 · 0 评论 -
[006] [ARM-Cortex-M3/4] 机器码、汇编与反汇编
1. **预处理**使用预处理器把**源文件**`main.c`经过预处理生成`main.i`文件,预处理用于将所有的#include头文件以及宏定义替换成其真正的内容。2. **编译**使用编译器将**预处理文件**`main.i`编译成**汇编文件**`main.s`。3. **汇编**使用汇编器(keil中为armasm)将**汇编文件**`main.s`转换成**目标文件**`main.o`。4. **链接**链接过程使用链接器(keil中为armlink)将该目标文件与原创 2022-03-09 17:55:48 · 2678 阅读 · 1 评论 -
[005] [ARM-Cortex-M3/4] 大小端存储
- **小端存储(Little Endian)**:变量的低字节存储在内存低地址(`0x12345678`的LSB存在内存中的低地址)- **大端存储(Big Endian)**:变量的高字节存储在内存低地址(`0x12345678`的MSB存在内存中的低地址)一般的arm芯片都是小端存储,有些处理器,可以置某个寄存器,让整个系统使用大字节序或小字节序。...原创 2022-03-09 14:52:45 · 3558 阅读 · 2 评论 -
[004] [ARM-Cortex-M3/4] 汇编基础与常用指令集
```assembly标号 操作码{cond}{S} 操作数1, 操作数2, … ;注释```- `标号`:可选,**必须顶格**写,作用是让汇编器计算程序转移的地址(可以是C函数名)- `cond`:可选,即指令执行条件,如果不写则使用默认条件`AL`(无条件执行)。- `S`:可选,表示指令执行后,会修改PSR寄存器- `操作码`:即**指令助记符**,前面**必须至少有一个空格**- `操作数`:第1个操作数一般为本指令的执行结果存储处。形成操作数的有效地址的方法称为操作数的寻址原创 2022-03-09 02:58:02 · 6708 阅读 · 0 评论 -
[003] [ARM-Cortex-M3/4] 指令流水线
## 1.1 RISCARM芯片属于精简指令集CPU(`RISC: Reduced Instruction Set Computing`),它所用的指令比较简单,有如下特点:- 对内存只有读/写指令- 对于数据的运算在CPU内部实现- 使用RISC指令减少复杂度![<img src="img/image-20220306202653377.png" alt="image-20220306202653377" style="zoom:67%;" />](https://img-blog.csd原创 2022-03-06 21:45:49 · 4135 阅读 · 3 评论 -
[002] [ARM-Cortex-M3/4] ATPCS子程序调用规则(部分参考AAPCS最新调用规则)
ATPCS (ARM-Thumb Procedure Call Standard)规定了在子程序调用时的一些基本规则:- 各寄存器的使用规则及其相应的名称- 数据栈的使用规则- 参数传递的规则以上是基本ATPCS规定的规则,为适应一些特定需要,在此基础上再添加其他规则形成了几种特定的ATPCS:- 支持数据栈限制检查的ATPCS- 支持只读段位置无关(ROPI)的ATPCS- 支持可读写段位置无关(RWPI)的ATPCS- 支持ARM程序和Thumb程序混合使用的ATPCS- 处理原创 2022-02-21 02:12:50 · 1953 阅读 · 1 评论 -
[001] [ARM-Cortex-M3/4] 内部寄存器
寄存器组在Keil调试界面也可以看到:R0~R12R0~R12为通用目的寄存器,其中:R0-R7为低组寄存器,字长32位,由于指令中可用的空间有限,绝大多数16位指令只能访问低组寄存器;R8-R12为高组寄存器,字长32位,只有很少的16位Thumb指令可以访问它们。注意:32位Thumb-2指令可用访问所有通用寄存器,R0~R12复位后的初始值未知。堆栈指针R13(SP, Stack Pointer)CM3/4处理器内核中有两个堆栈指针:主堆栈指针MSP(SP_main):缺省的堆栈指原创 2022-02-15 02:11:13 · 5630 阅读 · 0 评论