labview设置处理器内核数_嵌入式之Cortex-M3内核
[TOC]操作模式和特权级别两种操作模式 用以区分普通应用程序的代码和异常中断服务例程的代码处理者模式 :Handler模式。异常服务例程所在的模式。这个模式永远是使用MSP堆栈指针。线程模式 :主应用程序所在的模式两种特权分级 提供一种存储器访问的保护机制,使得普通的用户程序代码不能执行涉及到要害的操作。特权级别 :在特权级别下,程序可以访问所有范围的存储器,并且可以执行...
[TOC]
操作模式和特权级别
两种操作模式
用以区分普通应用程序的代码和异常中断服务例程的代码
处理者模式 : Handler模式。异常服务例程所在的模式。这个模式永远是使用MSP堆栈指针。
线程模式 : 主应用程序所在的模式
两种特权分级
提供一种存储器访问的保护机制,使得普通的用户程序代码不能执行涉及到要害的操作。
特权级别 : 在特权级别下,程序可以访问所有范围的存储器,并且可以执行所有指令。
用户级别 : 一般模式
异常服务例程必须在处理者模式下,以特权级执行
主应用程序必须在线程模式下执行,但既可以使用特权级,也可以使用用户级
复位后,处理器默认进入线程模式以及特权级访问
从用户级进入特权级的唯一方法是触发异常,比如软中断。
系统寄存器
通用功能寄存器
R0-R7 : 低组寄存器。所有指令都能访问。它们的字长是32位。复位后初始值是不可预料的。
绝大数16位指令只能使用低组,部分16位指令能够访问高组。32位Thumb-2指令可以使用所有通用寄存器。
通过专用的指令来访问特殊功能寄存器
R8-R12 : 高组寄存器。他们也是32位字长。复位后初始值不可预料。
R13 : 堆栈指针,sp,双堆栈机制,有两个堆栈指针。
- 主堆栈指针,MSP,SP_main,它由OS内核、异常服务程序、所有需要特权访问的应用程序代码来使用。简单的应用程序只使用MSP就够了。 - 进程堆栈指针,PSP,SP_process,用于非异常服务程序的常规应用程序。 - 堆栈指针用于访问堆栈,执行PUSH指令和POP指令,
R14 : 连接寄存器,LR
用于在调用子程序之前,存储返回地址。
R15 : 程序计数器,PC,可读
读PC时返回的值是当前读指令的地址+4。如0x1000:MOV R0,PC ;R0=0x1004
关于对pc进行写操作时,会引发程序的分支和内核模式的改变,以及引发异常
EXC_RETURN
在进入异常服务程序后,LR寄存器的值自动更新为此值,用以设置异常处理返回后的处理器模式和堆栈指针种类
[31:5]位,保留,全为1。
[4]位,设置硬件自动压栈大小。为0时,压入26个字的空间。为1时,压入8个字的空间。若不使用FPU时,总为1,否则,与CONTROL[4]相反。 CM3没有FPU。 3,为0时,返回后进入Handler模式。为1时,返回后进入线程模式。
2,为0时,从主堆栈中做出栈操作,返回后使用MSP。为1时,从进程堆栈中做出栈操作,返回后使用PSP。
1,保留,必须为0。
0,为0时,返回ARM状态。为1时,返回Thumb状态。必须为1。
特殊功能寄存器
他们只能被MSR和MRS指令来访问
MRS 通用寄存器,特殊功能寄存器;读出特殊功能寄存器
MSR 特殊功能寄存器,通用寄存器;写入
程序状态寄存器组
通过MSR和MRS指令,这三个寄存器可以单独访问,也可以组合访问xPSR或PSR。
APSR : 应用程序状态寄存器
只有[31:27]位有效
IPSR : 中断号状态寄存器
只有[8:0]位有效
EPSR : 执行状态寄存器
只有[26:24]位和[15:10]位有效
中断屏蔽寄存器组
用于控制异常的使能和除能。 只有在特权级下,才能访问中断屏蔽寄存器 除了MSR和MRS指令,还增加了CPS指令来操作他们
MRS R0,BASEPRI;读取寄存器到R0
MSR PRIMASK,R0;写入R0到寄存器
CPSID I ;PRIMASK=1,;关中断
CPSIE I ;PRIMASK=0,;开中断
CPSID F ;FAULTMASK=1,;关异常
CPSIE F ;FAULTMASK=0,;开异常
PRIMASK : 只有一个位有效。为1时,关闭所有可屏蔽的异常。默认为0。
异常中,中断是可屏蔽的,NMI和硬件Fault异常不可屏蔽
FAULTMASK : 只有一个位有效。为1时,关闭所有可控的异常。默认为0。这个寄存器专门给OS使用的。
异常中,屏蔽包括中断和硬件Fault异常,但NMI异常不可屏蔽。
BASEPRI : 最多有9个位有效。用以定义被屏蔽优先级的阈值。
当它被设置成某个值后,所有优先级号大于等于此值的中断都被关。缺省值为0,即不关闭任何中断。
优先级号越大,优先级越低
控制寄存器
CONTROL : 用于定义特权级别和堆栈指针的使用。 同样是使用MSR写和MRS读指令来操作。 [31:2]位,保留
[1]位,决定堆栈指针的选择。为0时,选择MSP,这是缺省值。为1时,选择PSP。
在特权级别的线程模式下,这个位才可写,即选择堆栈指针,才可以使用PSP。 在用户级别的线程模式和handler模式下,只允许使用MSP,所以总是为0,即此时不能将该位写1。
改变处理器模式的方法见目录:R14寄存器、操作模式和特权级别。
一旦进入了用户级,唯一自定义返回特权级的途径是触发一个软中断,然后通过服务程序改写该位。
[0]位,决定线程模式的级别。为0时,选择特权级的线程模式。为1时,选择用户级别的线程模式。
在特权级下才允许写该位。 注意,另外的handler模式永远都是特权级的
堆栈
向下生长的满栈模型
入栈压栈PUSH : SP指向最后一个被压入的元素的数值,下一次压栈时,SP先自减4,再存入新元素的数值。
出栈弹栈POP : 从SP指针处读出上一次被压入的值,再把SP指针自增4,等待下一次出栈。
中断现场的保留
ISR时压栈和出栈 : 在进入ISR时,内核会自动把一些寄存器压栈,使用进入ISR之前的堆栈种类。离开ISR时,若系统控制寄存器的位1没有更改过,则依然使用这个堆栈来弹栈。
内核只会把xPSR+PC+LR+R12+R0-R3,其余的R4-R11就需要用户手动入栈,而且入栈顺序不能乱。
用来保存中断现场数据的堆栈空间部分称为Stack frame,该区域存储时涉及是否使用双字对齐和有无FPU的问题
双堆栈机制
通过控制寄存器的位1来实现在线程模式和处理者模式下,两种堆栈指针的切换使用 特权级别下,用户可以任意操作两种堆栈指针,不受当前程序存储的堆栈限制。
多任务中的上下文切换
系统调用
SVC异常
SVC原理
系统服务调用,亦简称系统调用
用于产生系统函数的调用请求,因为操作系统不让用户程序直接访问硬件,而是通过提供一些系统服务函数,用户程序使用SVC发出对系统服务函教的呼叫请求,以这种方法调用它们来间接访问硬件。因此,当用户程序想要招制特定的硬件时,它就会产生一个SVC异常,然后操作系统提供的SVC异常服务例程得到执行,它再调用相关的操作系统函数,后者完成用户程序请求的服务。这种“提出要求——得到满足”的方式,很好、很强大、很方便、很灵活、很能可持续发展。
SVC作用
- 第一,也是最核心的作用,使应用层和硬件层隔离。
它使用户程序从控制硬件的 繁文缛节中解脱出来,而是由内核负责控制具体的硬件。 - 第二,使内核代码更具有可测性
内核的代码可以经过充分的测试,从而能使系统更加健壮和可靠。 - 第三,使应用层更安全和自由,无权损坏实际硬件
它使用户程序无需在特权级下执行,用户租序无需承担因误操作而瘫唤整个系统的风险。 - 第四,使应用层开发更具有可移植性、易开发性
通过SVC的机制,还让用户程序变得与硬件无关,因此在开发应用程序时无需了解硬件的操作细节,从而简化了开发的难度和繁琐度,并且使应用程序跨硬件平台移植成为可能,开发应用程序唯一需要知道的就是操作系统提供的应用编程接口(API),并且了解各个请求代号和参数表,然后就可以使用SVC来提出要求了,
其实,严格地讲,操作硬件的工作是由设备驱动程序完成的,只是对应用程序来说,它们也是操作系统的一部分
SVC执行步骤
SVC指令产生SVC异常,而且它需要一个立即数,充当系统调用代号。SVC异常服务例程会提取代号,然后解释本次调用的具体要求,调用相应的服务函数。
SVC 0x3;调用3号系统服务
PendSV异常
可悬起的系统调用,与SVC协同使用
PendSV应用场景
典型应用场景是上下文切换,即在不同任务之间切换。
PendSV和SVC的区别
一方面,,SVC异常是必须立即得到响应的,应用程序执行SVC时都是希望所需的请求立即得到响应 另一方面,PendSV则不同,它是可以像普通的中断一样被悬起的(不像SVC那样会上访)。内核可以利用它“缓期执行一个异常,直到其它重要的任务完成后才执行动作
悬PendSV的方法
: 用户将NVIC的PendSV 悬起寄存器中写1,悬起后,如果优先级不够高,则将缓期等待执行。
运行过程分析
程序运行发生事件的流水账
- 任务开始
(1)任务A呼叫SVC来请求任务切换(例如,等待某些工作完成)
(2)内核接收到请求,做好上下文切换的准备,并且pend一个PendSV异常。
(3)当CPU退出SVC后,它立即进入PendSV,从而执行上下文切换。
- 上下文切换
(4)当PendsV执行完毕后,将返回到任务B,同时进入线程模式。
(5)发生了一个中断,并且中断服务程序开始执行
(6)在ISR执行过程中,发生SysTick异常,并且抢占了该ISR
(7)内核执行必要的操作,然后pend 起Pendsv异常以作好上下文切换的准备、
(8)当SysTick退出后,回到先前被抢占的ISR中,ISR继续执行
(9) ISR执行完毕并退出后,Pendsv服务例程开始执行,并且在里面执行上下文切换
- 完成一次上下文切换
(10)当PendSV 执行完毕后,回到任务A,同时系统再次进入线程模式。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐



所有评论(0)