![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
操作系统
文章平均质量分 79
猪哥-嵌入式
这个作者很懒,什么都没留下…
展开
-
gdb系列1:gdb基本原理概述、quickStart快速体验
嵌入式开发,debug不可或缺,每个人有每个人的debug思路,概况来说,基本上有两种,分别为使用debug工具,或基于debug log日志调试。其中debug工具,如果我们使用IDE开发程序,一些强大的IDE工具可以帮助我们便捷的debug程序,但是在Linux平台下的嵌入式开发,是没有特别好用的IDE的,所以gdb就出现了,gdb实现的功能类似我们RTOS开发环境中的keil、IAR提供的调试工具,只不过gdb是完全独立的工具。原创 2022-11-01 22:41:39 · 480 阅读 · 0 评论 -
RTOS系列(13):汇编LDR指令、LDR伪指令、[Rn]寄存器间接引用 详细解析
汇编LDR指令在RTOS中使用的比较频繁,尤其是在PendSV中进行上下文切换的时候,LDR指令是不可缺少的,我们在看uC/OS、FreeRTOS、RT-Thread的源码时,都能够看到LDR的身影。由于LDR指令有2个名字LDR指令、LDR伪指令,这就给我们理解LDR带来了困难,很容易混淆。本文就详细分析一下汇编LDR、[Rn]间接引用的原理。......原创 2022-07-24 12:17:28 · 3491 阅读 · 0 评论 -
RTOS系列文章(10):简单OS示例分析
RTOS系列(1):基础知识——中断嵌套RTOS系列文章(2):PendSV功能,为什么需要PendSVRTOS系列文章(3): 为什么将SysTick和PendSV的优先级设置为最低RTOS系列文章(4): MDK软件仿真 + Debug-(printf)-Viewer使用方法RTOS系列文章(5):C语言程序运行原理分析:汇编、栈、栈帧、进栈、出栈、保存现场、恢复现场、返回RTOS系列文章(6):Cortex-M3/4之SP,MSP,PSP,Thread模式、Handler模式、内核态、用户态原创 2022-07-05 22:55:34 · 1503 阅读 · 5 评论 -
RTOS系列文章(9):再次分析栈帧、函数调用与中断调用的区别
在前面的系列文章中,尤其是CM3/4之LR寄存器、EXC_RETURN深入分析 中我们简单的分析了一些函数调用与中断调用的流程,那篇文章也基本上能说明函数调用和中断调用的一些区别,本文将基于栈帧的概念,再次分析一下两者之间的相同点和不通点。栈帧是一个非常专业的概念,很惭愧的说,在没有深入分析RTOS之前,我也不曾了解栈帧这一概念,之前只是大概了解到函数调用需要堆栈存放局部、临时变量,但是栈帧这个概念确实时从未关注过。我们先引入《The Definitive guide to ARM Cortex M3/4》原创 2022-06-06 22:03:24 · 1447 阅读 · 2 评论 -
RTOS系列文章(8):深入分析中断处理过程
在上一篇文章中,我们深入分析了函数调用返回、中断调用返回使用的LR和EXC_TURN,也简单说明了函数调用流程、中断调用流程。在FreeRTOS中,任务的调度是通过SysTick + PendSV 中断来实现的,尤其在PenSV中断中进行任务上下文切换原理,是理解FreeRTOS任务调度原理的重中之重。而SysTick和PendSV都是中断,所以我们有必要深入分析一下在ARM CM3/4中中断的完整处理流程。整体流程如下:接下来我们直接引用《The definitive guide to ARM Corte原创 2022-06-04 22:54:10 · 3778 阅读 · 2 评论 -
RTOS系列文章(7):CM3/4之LR寄存器、EXC_RETURN深入分析
在Cortex-M3/4中有个特殊的寄存器R14,这个寄存器还有一个大家熟知的名字LR,LR全称为Link Register,有的书本上会翻译成链接寄存器。该寄存器一般用于存放函数退出返回地址。除了函数调用返回使用,中断退出也会使用LR,不过中断返回机制与函数返回机制会有一些细节不通,中断返回虽然也是通过LR,但是还会有EXC_RETURN辅助。这里我们直接引用《The definitive guide to ARM Cortex-M3/4》中对LR的介绍:翻译过来,有如下重点知识:如上面描述,LR是链原创 2022-06-04 18:46:39 · 4456 阅读 · 4 评论 -
RTOS系列文章(5):C语言程序运行原理分析:汇编、栈、栈帧、进栈、出栈、保存现场、恢复现场、返回
C源程序; Reset handlerReset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main IMPORT SystemInit LDR R0, =SystemInit BLX R0原创 2022-05-28 19:10:46 · 3192 阅读 · 1 评论 -
RTOS系列文章(2):PendSV功能,为什么需要PendSV
背景大多数嵌入式RTOS在Cortex-M3/M4上的移植都需要PendSV,比如uCOS、RT-Thread、FreeRTOS等,本文就对PendSV的功能作用,以及为什么需要PendSV进行详细的分析。PendSV是什么?我们先引用《Cortex-M3权威指南》对PendSV的介绍:PendSV(可悬起的系统调用),它是一种CPU系统级别的异常,它可以像普通外设中断一样被悬起,而不会像SVC服务那样,因为没有及时响应处理,而触发Fault。个人理解PendSV的英文全称应该是:Pend S原创 2022-05-17 20:55:58 · 13818 阅读 · 17 评论 -
PC开机、操作系统启动、应用程序启动过程简单分析
前言原创 2021-05-29 22:26:40 · 2986 阅读 · 0 评论 -
Linux 逻辑地址、线性地址、虚拟地址、物理地址的关系
逻辑地址逻辑地址是给程序员看的,是内部编程使用的,由程序产生的与段和偏移地址,是CS:IP的形式,比如在进行C编程时,可以读取指针的值(&操作),这个值就是逻辑地址,它相当于当前进程数据段的地址。在intel-32,实模式下,逻辑地址与物理地址相等。在保护模式下,如果不开启分页机制,逻辑地址 = 线性地址。线性地址线性地址是逻辑地址与物理地址的中间层,程序代码产生逻辑地址,逻辑地址是selector:offset(CS:IP)的组成,用CS作为选择子去GDT(全局描述符表)中查找得到段基址然后原创 2021-05-18 22:08:06 · 678 阅读 · 0 评论 -
电脑启动过程小结
前言看完《x86汇编语言:从实模式到保护模式》,对很多苦涩的概念,有了进一步的了解,这里向作者致敬,写的非常棒,如果大学老师能这么讲课,没准我的汇编就不会那么烂了。本文结合书中的语言,简单的总结一下电脑的启动过程。过程分析按下电源当我们按下电源时,CPU会自动的设置CS、IP寄存器,指向BIOS的程序,这里其实可以简单的理解为,CPU上电后,地址空间会自动指向 BIOS,落实到硬件就是CPU的相关地址、数据线与BIOS芯片的地址、数据线导通,会读BIOS的程序,BIOS的程序地址肯定是从0开始的,我原创 2021-05-17 22:12:23 · 296 阅读 · 0 评论 -
CPU 地址空间分配原理分析
本文参考了 主存与CPU的连接(字扩展,位扩展,芯片的地址分配)文章中的部分文字和图片,这里向作者致敬。前言对于硬件开发工程师来说,尤其是初学者,地址空间分配原理是比较难以理解的,起码对于我来说,是比较抽象的,可能是我比较笨吧。我们在编程时,芯片手册会直接告诉我们外设的起始地址,比如STM32(cortex-M3)的SRAM的起始地址为0x20000000,其他外围的寄存器也有相关的地址,尤其是对于扩展的RAM芯片,其分配的地址不是0,而是0x68000000,所以这里就会有个疑问,CPU的地址空间分配原创 2021-05-15 22:59:44 · 8220 阅读 · 10 评论 -
BIOS提供功能调用原理分析
前言BIOS(basic input/output system)是计算机启动后执行的第一个功能代码,BIOS的功能简单的总结就是,提供基本的输入/输出功能,引导操作系统,其中基本输入、输出功能比如键盘、显示器、硬盘的操作。这些功能的是如何实现,之前一直会有些困惑,本文简单的做个分析总结。疑问我们知道BIOS的设计体量是尽可能小的,但是功能却一点都不简单,因为涉及到很多外围硬件的功能调用,注意,这里说的是功能调用,并没有特制硬件初始化。在做单片机程序开发时,也有很多的外围操作,针对外围设备的操作,一般原创 2021-05-14 22:29:08 · 837 阅读 · 0 评论 -
汇编常用寄存器功能及用途
前言在学习汇编语言时,我们知道1个程序中寄存器其实是对应CPU中的1个硬件寄存器的,由于寄存器是在CPU中的,访问速度比内存条还快,所以寄存器是一个很稀缺的资源,数量少,intel在设计寄存器时,基本上也规定了这些寄存器的专门用途,下面就分析总结一下常用的寄存器。名称大类型具体类型用途AX通用寄存器数据寄存器加减乘除运算,字的输入输出,中间结果缓存BX通用寄存器数据寄存器存储器指针CX通用寄存器数据寄存器串操作、循环控制的计数器DX通用寄存器原创 2021-05-10 22:33:29 · 761 阅读 · 0 评论 -
内存分段机制分析,为什么要对内存分段
前言先吐槽一下,在学习汇编语言时,对于那些代码段、数据段什么的概念,简直就是跟天书一样,可能学的时候不上心,但是更大的原因可能还是教材太垃圾,老师讲的不够透彻,当然啦,也可能是自己太笨了,直到工作多年后,也觉得抽象,偶然间看了一本书才发现,尼玛,原来内存分段的初衷,竟然这么简单,这里先抛出结论:内存分段机制是为了区别代码和数据,代码和代码放一起,数据和数据放一起。分析在上古时期(8086处理器),硬件内存非常小,程序一般是使用汇编语言编写,对于内存条的使用,必须要掰着手指头和脚指头省着用,所以不存在现原创 2021-05-10 22:08:38 · 1305 阅读 · 2 评论 -
软中断指令INT 理解
前言我们在学习操作系统时,在引导部分代码中,会看到 int 指令,比如:int 10h书上会解释说,通过10h中断能够实现显示屏操作。分析INT指令为 软件中断指令,是CALL指令的一种特殊形式,call指令调用的子程序是用户程序的一部分,而INT指令调用的则是操作系统或者BIOS提供的特殊子程序。INT n就好像是调用子程序,只不过其调用的是中断处理程序。格式 : int n功能:转到相应的中断处理程序执行。举例mov ah, 1 ; 设置入参int 21h ; 调用2原创 2021-05-06 21:52:17 · 3469 阅读 · 0 评论 -
CS和IP寄存器的作用及执行分析
前言我们在刚开始学习汇编或者操作系统时,会被一些寄存器搞得晕头转向,可能是我比较笨吧,抽象能力比较差,对于CS和IP寄存器的概念是知道,但是不知道他们的作用。CS和IP寄存器概念书本上的解释如下:CS是代码段寄存器,IP为指令指针寄存器,他们一起合作指向了CPU当前要读取的指令地址,可以理解为CS和IP结合,组成了PC寄存器。任何时刻,8086CPU都会将CS:IP指向的指令作为下一条需要取出的执行指令。8086CPU中的计算公式为 (CS << 4)|IP, 即CS左移4位,然原创 2021-04-21 22:05:51 · 8477 阅读 · 2 评论