首页 > 其他分享 >4.1 内核

4.1 内核

时间:2024-03-25 22:33:02浏览次数:24  
标签:4.1 中断 特权 内核 寄存器 堆栈 异常 处理器

相关参考资料:技术参考手册和数据手册(要知道技术文档的作用哦)

技术参考手册有关如何使用该产品的具体信息,包含各个功能模块的内部结构、所有可能的功能描述、各种工作模式的使用和寄存器配置等详细信息。 技术参考手册不包含有关产品技术特征的说明,这些内容在数据手册中。//就是说怎么用,相当于使用说明书

数据手册中的内容包括:产品的基本配置(如内置Flash和RAM的容量、外设模块的种类和数量等),管脚的数量和分配,电气特性,封装信息,和定购代码等。//科普一下产品里面都有些啥,相当于产品介绍了

之前零零散散的学,拿到板子就懵逼

拿到板子之后究竟首先该看些啥啊????

参考手册和数据手册?教学视频?(有大佬教教吗)以下这么多文档该用什么节奏学呢?

 说实话我只看视频了,然后去copy别人的代码,东拼西凑勉强跑起来

。。。学一次忘一次,慢慢来吧

开发学什么

作为CM3的使用者,我们选择自己要用的板子时应该看些什么? 这么看?

总结一下就是(已STM32F103C8T6为例)

1.内核的最高工作频率(72MHz)

2.存储器的容量(高达128K字节的闪存和20K字节的SRAM--中等容量)

3.外设(丰富的增强I/O端口和联接到两条APB总线的外设。所有型号的器件都包含2个12位的ADC、3个通用16位定时器和1个PWM定时器,还包含标准和先进的通信接口:多达2个I2C接口和SPI接口、3个USART接口、一个USB接口和一个CAN接口。)

4.引脚(STM32F103xx中等容量增强型系列产品提供包括从36脚至100脚的6种不同封装形式;根据不同的封装形式,器件中的外设配置不尽相同。)

5.时钟速度(后面讲)

至于其他的

 外中断的数目
 表达优先级的位数(优先级寄存器的有效宽度)
 是否配备了MPU
 是否配备了ETM
 对调试接口的选择(SW, JTAG或两者兼有)

这些还不太懂。。。

以后再说

4.1 内核(了解)

 首先看内核吧,对应的资料应该是Cortex-M3技术参考手册,但我看的是别人精简翻译了的这个

CM3采用经典的哈佛结构

内核本身就很复杂,我觉得初学者没有必要深入了解,这里我们就了解一下它的基本情况就好了 

寄存器组
 操作模式
 异常,嵌套向量中断
 存储器映射
 总线接口
 存储器保护单元
 指令系统
 中断和异常
 调试支持

1.寄存器组

Cortex-M3处理器拥有R0-R15的寄存器组。

1.1 R0-R12:通用寄存器 

R0-R12都是32位通用寄存器,用于数据操作。但是注意:绝大多数16位Thumb指令只能访问R0-R7,而32位Thumb-2指令可以访问所有寄存器。 

1.2 Banked R13: 两个堆栈指针


Cortex-M3拥有两个堆栈指针,然而它们是banked,因此任一时刻只能使用其中的一个。
主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)
进程堆栈指针(PSP):由用户的应用程序代码使用(不处于异常服用例程中时)。

要注意的是,并不是每个程序都要用齐两个堆栈指针才算圆满。简单的应用程序只使用MSP就够了。

堆栈指针的最低两位永远是0,这意味着堆栈总是4字节对齐的。
在ARM编程领域中,凡是打断程序顺序执行的事件,都被称为异常(exception)。除了外部中断外,当有指令执行了“非法操作”,或者访问被禁的内存区间,因各种错误产生的fault,以及不可屏蔽中断发生时,都会打断程序的执行,这些情况统称为异常。在不严格的上下文中,异常与中断也可以混用。另外,程序代码也可以主动请求进入异常状态的(常用于系统调用)。

1.3 R14:连接寄存器

当呼叫一个子程序时,由R14存储返回地址
不像大多数其它处理器,ARM为了减少访问内存的次数(访问内存的操作往往要3个以上指令周期,带MMU和cache的就更加不确定了),把返回地址直接存储在寄存器中。这样足以使很多只有1级子程序调用的代码无需访问内存(堆栈内存),从而提高了子程序调用的效率。如果多于1级,则需要把前一级的R14值压到堆栈里。在ARM上编程时,应尽量只使用寄存器保存中间结果,迫不得以时才访问内存。在RISC处理器中,为了强调访内操作越过了处理器的界线,并且带来了对性能的不利影响,给它取了一个专业的术语:溅出。 

1.4 R15:程序计数寄存器 

指向当前的程序地址。如果修改它的值,就能改变程序的执行流(很多高级技巧就在这里面——译注)。 R15是程序计数器,在汇编代码中一般我们都都叫它的外号“PC”。因为CM3内部使用了指令流水线,读PC时返回的值是当前指令的地址+4。

1.5 特殊功能寄存器 

Cortex-M3还在内核水平上搭载了若干特殊功能寄存器,包括
程序状态字寄存器组(PSRs)——程序状态寄存器在其内部又被分为三个子状态寄存器:
 应用程序PSR(APSR)
 中断号PSR(IPSR)
 执行PSR(EPSR)
通过MRS/MSR指令,这3个PSRs即可以单独访问,也可以组合访问(2个组合,3个组合都可以)
中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI)——这三个寄存器用于控制异常的使能和除能。


控制寄存器(CONTROL)——控制寄存器有两个用途,其一用于定义特权级别,其二用于选择当前使用哪个堆栈指针。由两个比特来行使这两个职能。

CONTROL[1]
在Cortex-M3的handler模式中,CONTROL[1]总是0。在线程模式中则可以为0或1。
因此,仅当处于特权级的线程模式下,此位才可写,其它场合下禁止写此位。改变处理器的模式也有其它的方式:在异常返回时,通过修改LR的位2,也能实现模式切换。这是LR在异常返回时的特殊用法,颠覆了对LR的传统使用方式,将在第5章中展开论述。
CONTROL[0]
仅当在特权级下操作时才允许写该位。一旦进入了用户级,唯一返回特权级的途径,就是触发一个(软)中断,再由服务例程改写该位。 

2.操作模式  

   Cortex-M3处理器支持两种处理器的操作模式,还支持两级特权操作。
两种操作模式分别为:处理者模式(handler mode,以后不再把handler中译——译注)和线程模式(thread mode)。引入两个模式的本意,是用于区别普通应用程序的代码和异常服务例程的代码——包括中断服务例程的代码。
Cortex-M3的另一个侧面则是特权的分级——特权级和用户级。这可以提供一种存储器访问的保护机制,使得普通的用户程序代码不能意外地,甚至是恶意地执行涉及到要害的操作。处理器支持两种特权级,这也是一个基本的安全模型。

在CM3运行主应用程序时(线程模式),既可以使用特权级,也可以使用用户级;但是异常服务例程必须在特权级下执行。复位后,处理器默认进入线程模式,特权极访问。在特权级下,程序可以访问所有范围的存储器(如果有MPU,还要在MPU规定的禁地之外),并且可以执行所有指令。
在特权级下的程序可以为所欲为,但也可能会把自己给玩进去——切换到用户级。一旦进入用户级,再想回来就得走“法律程序”了——用户级的程序不能简简单单地试图改写CONTROL寄存器就回到特权级,它必须先“申诉”:执行一条系统调用指令(SVC)。这会触发SVC异常,然后由异常服务例程(通常是操作系统的一部分)接管,如果批准了进入,则异常服务例程修改CONTROL寄存器,才能在用户级的线程模式下重新进入特权级。
事实上,从用户级到特权级的唯一途径就是异常:如果在程序执行过程中触发了一个异常,处理器总是先切换入特权级,并且在异常服务例程执行完毕退出时,返回先前的状态(也可以手工指定返回的状态——译注)。

当处理器处在线程状态下时,既可以使用特权级,也可以使用用户级;另一方面,handler模式总是特权级的。在复位后,处理器进入线程模式+特权级。
在线程模式+用户级下,对系统控制空间(SCS)的访问将被阻止——该空间包含了配置寄存器组以及调试组件的寄存器组。除此之外,还禁止使用MRS/MSR访问刚才讲到的,除了APSR之外的特殊功能寄存器。如果以身试法,则对于访问特殊功能寄存器的,访问操作被忽略;而对于访问SCS空间的,将fault伺候。

特权等级和堆栈指针的选择均由CONTROL负责。当CONTROL[0]=0时,在异常处理的始末,只发生了处理器模式的转换。
在特权级下的代码可以通过置位CONTROL[0]来进入用户级。而不管是任何原因产生了任何异常,处理器都将以特权级来运行其服务例程,异常返回后,系统将回到产生异常时所处的级别。用户级下的代码不能再试图修改CONTROL[0]来回到特权级。它必须通过一个异常handler,由那个异常handler来修改CONTROL[0],才能在返回到线程模式后拿到特权级。 

3.异常,嵌套向量中断 

 Cortex-M3在内核水平上搭载了一颗中断控制器——嵌套向量中断控制器NVIC(Nested Vectored Interrupt Controller)。它与内核有很深的“亲密接触”——与内核是紧耦合的。NVIC提供如下的功能:


3.1 可嵌套中断支持

可嵌套中断支持的作用范围很广,覆盖了所有的外部中断和绝大多数系统异常。外在表现是,这些异常都可以被赋予不同的优先级。当前优先级被存储在xPSR的专用字段中。当一个异常发生时,硬件会自动比较该异常的优先级是否比当前的异常优先级更高。如果发现来了更高优先级的异常,处理器就会中断当前的中断服务例程(或者是普通程序),而服务新来的异常——即立即抢占。 


3.2 向量中断支持

 当开始响应一个中断向量表,并且根据中断号从表中找出ISR的入口地址,然后跳转过去执行。这么一来,中断延迟时间大为缩短。举个例子,如果发生了异常11(SVC),则NVIC会计算出偏移移量是11x4=0x2C,然后从那里取出服务例程的入口地址并跳入。要注意的是这里有个另类:0号类型并不是什么入口地址,而是给出了复位后MSP的初值。


3.3 动态优先级调整支持

软件可以在运行时期更改中断的优先级。 


3.4 中断延迟大大缩短

自动的现场保护和恢复,用于缩短中断嵌套时的ISR间延迟。详情请见“咬尾中断”和“晚到中断”。 


3.5 中断可屏蔽

既可以屏蔽优先级低于某个阈值的中断/异常(设置BASEPRI寄存器),也可以全体封杀(设置PRIMASK和FAULTMASK寄存器)。这是为了让时间关键(time-critical)的任务能在死线(deadline,或曰最后期限)到来前完成,而不被干扰。 

标签:4.1,中断,特权,内核,寄存器,堆栈,异常,处理器
From: https://blog.csdn.net/V85042/article/details/137002691

相关文章

  • 肖sir__python之判断语句4.1
    python中的语句 一、if语句(1)单分支:格式:if判断条件  执行语句块1else:  执行语句块2备注:判断条件if中可以使用比较运算符>,<,!=,==,>=,<=在学习自动化中可以用if语句断言,案例1:a=10ifa!=10:print("你中奖了")else:print("谢谢惠顾")案例2:name=inpu......
  • 内核睡眠机制和等待队列
    内核睡眠机制:进程通过睡眠机制释放处理器,使其能够处理其他线程。处理器睡眠的原因可能在于感知数据可用性,或等待资源释放内核调度器管理要运行的任务列表,这被称为运行队列。睡眠进程不再被调度,因为已将它们从运行队列中移除了。除非改变状态(唤醒),否则睡眠进程将永远不会被执行。......
  • 在linux中无需修改内核驱动就能操作GPIO口的示例
    一、首先编写一个脚本文件init.sh#!/bin/bashecho2>/sys/class/gpio/exportsleep1echo3>/sys/class/gpio/exportsleep1echoout>/sys/class/gpio/gpio3/directionecho1>/sys/class/gpio/gpio3/value这段代码是在Linux系统中使用shell脚本语言编写的。让......
  • Spark重温笔记(三):Spark在企业中为什么能这么强?——持久化、Checkpoint机制、共享变量与
    Spark学习笔记前言:今天是温习Spark的第3天啦!主要梳理了Spark核心数据结构:RDD(弹性分布式数据集),包括RDD持久化,checkpoint机制,spark两种共享变量以及spark内核调度原理,希望对大家有帮助!Tips:"分享是快乐的源泉......
  • 在Linux中,如何查看内核版本?内核版本信息包含什么?
    在Linux中查看内核版本有多种方法,下面列举了几种常用且详细的命令:方法一:uname命令仅查看内核版本:uname-r这个命令会打印出当前系统运行的内核版本号,例如:4.15.0-72-generic。查看详细系统信息:uname-a这个命令会输出所有与内核相关的详细信息,包括内核名称、主机名、......
  • 设备驱动-15.内核kmalloc/vmalloc及CMA内存介绍
    1kmalloc/vmalloc区别函数位置特性大小限制kmalloc物理内存映射区域物理地址虚拟地址均连续不能超过128Kkzalloc物理内存映射区域物理地址虚拟地址均连续不能超过128Kvmalloc虚拟内存映射区域虚拟地址连续,物理地址不一定连续无限制vzalloc虚拟内......
  • 4.1.2、类模板
    1、类模板的语法类模板的作用:建立一个通用类,类中的成员数据类型可以不具体指定,用一个虚拟的类型来代表。语法:template<typenameT>类解释:template---声明创建模板typename---表面其后面的符号是一种数据类型,可以用class代替T---通用的数据类型,名称可以替......
  • 内核升级步骤
    目录内核升级步骤一、下载内核包二、检查内核载入模块是否正常三、安装内核包四、检查是否已载入到可用内核五、设置默认内核六、检查内核修改结果七、生成grub2配置八、重启后检查内核版本是否已修改九、检查显卡驱动内核升级步骤一、下载内核包首先需要下载指定内核包kernel......
  • Linux内核有什么之块设备驱动有什么第六回 —— 邂逅的三个文件系统之二:实际文件系统(3
    接前一篇文章:Linux内核有什么之块设备驱动有什么第五回——邂逅的三个文件系统之二:实际文件系统(2)本文内容参考:34|块设备(上):如何建立代理商销售模式?-趣谈Linux操作系统-极客时间特此致谢!上回书以F2FS文件系统为例,开始分析块设备邂逅的第二个文件系统:实际文件系统。本回......
  • Linux内核启动流程简介
    参考资料:https://www.bilibili.com/video/BV12E411h71h?p=38&vd_source=432ba293ecfc949a4174ab91ccc526d6 Linux内核链接脚本arch/arm/kernel/vmlinux.lds arch/arm/kernel/vmlinux.lds中OUTPUT_ARCH(arm)ENTRY(stext)//Linux内核入口,入口函数stextjiffies=......