打印

STM32 特权级访问的问题

[复制链接]
10364|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mjj123|  楼主 | 2010-7-8 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 mjj123 于 2010-7-9 15:57 编辑

MRS     R0, PRIMASK
CPSID   I
这两个指令应该是在特权级下才能访问的吧,在用户级下使用的话,产生BusFault的
但是,我在移植ucosii操作系统的时候,在任务切换时,切换到用户级 PSP下运行,运行到关中断函数时,以上两代码处不产生总线中断,也没产生别的异常。
是不是我在调试模式下的原因,还是我的处理器的故障,你们有没有遇到这种问题呢
谢谢各位!
沙发
ShakaLeo| | 2010-7-8 19:22 | 只看该作者
特权级和用户级跟使用MSP还是PSP是两回事,特权级和用户级都是既可以使用MSP也可以使用PSP。ucosii的官方移植版本是整个代码都运行在特权级。

使用特权

评论回复
板凳
mjj123|  楼主 | 2010-7-8 19:58 | 只看该作者
谢谢楼上的回答,我也知道ucosii的官方移植版本是整个代码都运行在特权级。
在任务切换的时候,切换到了用户级+PSP下了,这个是可以实现的,切换时在PendSV的例程中实现的,我加入了   
MRS     R0, CONTROL
    ORR     R0, R0, #0x01                                      ;//用户级      
    MSR     CONTROL, R0
就切换到用户级了,切换到用户级后,在执行 OS_ENTER_CRITICAL()时,没有出现异常,代码可以执行,但不修改特殊寄存器,也就是没执行效果。
我不知道是我板子的问题呢,还是有别的什么问题,还是我的理解有问题。

使用特权

评论回复
地板
mjj123|  楼主 | 2010-7-8 21:45 | 只看该作者
本帖最后由 mjj123 于 2010-7-8 21:49 编辑

我在论坛中找到了以下答案:
在特权状态下才能执行的指令称为特权指令,由特权指令完成的操作当然叫特权操作了。例如x86,在用户状态下执行io指令只相当与nop指令,如果程序运行在用户态,要执行特权操作只有请求操作系统协助才能完成。
   在单片机中,ARM就有特权指令,例如操作cpsr和spsr的指令,用户态执行这些指令也相当于nop。不过,很多人写程序时并不使用用户态,而是直接让程序运行在特权态,所以就感觉不出来。另外,很多嵌入式操作系统也不切换处理器状态,例如ucosii。
    无论哪一种操作系统,特权保护都是依靠硬件才能实现的,包括windows,因为操作系统并不能拒绝用户程序执行任何一种指令,但是cpu可以根据工作状态选择性地拒绝某些指令的执行。
    楼上学习时要注意哪些功能是cpu提供的,哪些功能是操作系统提供的。
https://bbs.21ic.com/icview-21795-1-1.html的三楼

使用特权

评论回复
5
mjj123|  楼主 | 2010-7-8 21:47 | 只看该作者
在cm3内核权威指南中
(第三章,操作模式这节中)
在线程模式+用户级下,对系统控制空间(SCS)的访问将被阻止——该空间包含了配
置寄存器s 以及调试组件的寄存器s除此之外,还禁止使用MSR 访问刚才讲到的特殊功能寄存器——除了APSR 有例外。谁若是以身试法,则将fault 伺候。

(还用第七章异常  总线Flault小节中)
哪些因素会导致AHB 回复一个错误信号?
AHB 回复的错误信号会触发总线fault,诱因可以是:
z 企图访问无效的存储器 region。常见于访问的地址没有相对应的存储器。
z 设备还没有作好传送数据的准备。比如,在尚未初始化SDRAM 控制器的
时候试图访问SDRAM。
z 在企图启动一次数据传送时,传送的尺寸不能为目标设备所支持。例如,
某设备只接受字型数据,却试图送给它字节型数据。
z为某些原因,设备不能接受数据传送。例如,某些设备只有在特权级下
才允许访问,可当前却是用户级。


根据以上两点,在用户级下执行MRS     R0, PRIMASK     这条指令,应该是进入总线异常,
所以我就不明白了

使用特权

评论回复
6
ShakaLeo| | 2010-7-8 21:52 | 只看该作者
用户级执行特权级指令,是否产生fault可能跟具体芯片有关系。

ucosii的切换任务不能切换到用户级,因为ucosii的一些系统调用中存在特权级访问,比如挂起pendSV和开关中断,它的正常工作是以工作在特权级为前提的。

使用特权

评论回复
7
ShakaLeo| | 2010-7-8 22:04 | 只看该作者
busfault是总线错误,在访问某设备或存储器的时候才可能发生,在用户级执行特权级指令肯定不会引起busfault。
注意“因为某些原因,设备不能接受数据传送。例如,某些设备只有在特权级下
才允许访问,可当前却是用户级。”
是“设备”,执行一条指令不是访问设备。

使用特权

评论回复
8
mjj123|  楼主 | 2010-7-9 08:43 | 只看该作者
本帖最后由 mjj123 于 2010-7-9 08:44 编辑

谢谢各位的关注,
我使用的是stm32系列的处理器,实验的结果就是对特殊寄存器使用MRS、MRS的访问,在特权级下,这些指令时正常执行 的;在用户级下,这些指令就相当于NOP。
而在用户级下,对系统控制空间(SCS)的访问会产生busfault,精确数据访问错误。
这就是我实验的结果。
我觉得可能跟具体芯片有关系。 但相同的内核对指令的在不懂系列的芯片中应该一样吧。
7楼的观点,如果权威指南中的论述时正确的,就算不是产生总线异常,也应该产生别的异常吧,至少也是个硬fault吧,

6楼的看法,它的正常工作是以工作在特权级为前提的。 只是对必须用特权级访问的指令和系统控制空间,以及MPU保护的空间是必须特权级保护的访问和执行的,只要对他们访问时切换到特权级就可以正常工作了。

使用特权

评论回复
9
ShakaLeo| | 2010-7-9 09:04 | 只看该作者
回楼上
权威指南上有哪一条能够说明“就算不是产生总线异常,也应该产生别的异常吧,至少也是个硬fault
”?
任务切换是一个系统调用,不是用户级程序,任务切换还要切换到用户模式有什么意义吗?

使用特权

评论回复
10
mjj123|  楼主 | 2010-7-9 09:28 | 只看该作者
回楼上
任务切换是一个系统调用,不是用户级程序,任务切换还要切换到用户模式有什么意义吗?
可以对系统的稳定性有作用的,对操作系统中的全局变量和静态变量的访问,如果设为特权级访问,这个要配合MPU来使用,而我们编写的应用程序(任务)在用户级下运行,那么就是某个任务出错,也不会危害到操作系统的变量(全局和静态的),比如用户级下对系统控制空间的访问时禁止的。

使用特权

评论回复
11
ShakaLeo| | 2010-7-9 09:43 | 只看该作者
STM32没有MPU。楼上说的情况是保护模式操作系统,需要硬件的支持,硬件上应该有MMU或MPU。而UCOS本身就是实模式操作系统,只有线程的概念而没有进程的概念。由此可见,UCOS作为软件,不支持你所说的保护模式,STM32作为硬件,没有MPU和MMU,也没法支持保护模式。所以感觉在运行系统调用时切换到用户模式是多此一举。而且“系统调用”顾名思义,是系统对硬件进行操作, 而不是用户,本身就应该属于特权级操作。在运行系统调用的时候切换用户级模式不符合操作系统原理。

使用特权

评论回复
12
mjj123|  楼主 | 2010-7-9 09:48 | 只看该作者
本帖最后由 mjj123 于 2010-7-9 09:54 编辑

STM32是没有MPU的,可是别的系列的有MPU啊,我的意思是在任务切换的时候,切换到用户级,在调用关键的系统程序的时候切换的特权级,来对系统的资源实施保护
还有一点,是不是我使用的编译环境的问题呢,我使用的是IARv5.30
还用就是他不执行    //MOVT.W  R2,   #0x0800R2,   #0xXXX 这个指令,这是对R2高16位赋值,第16位没影响。
执行到MOVT.W 指令的时候,如同执行NOP指令

使用特权

评论回复
13
ShakaLeo| | 2010-7-9 09:50 | 只看该作者
“而我们编写的应用程序(任务)在用户级下运行,”
这个可以,但比较麻烦,尤其是你的任务里有开关中断等操作的时候。

使用特权

评论回复
14
mjj123|  楼主 | 2010-7-9 09:55 | 只看该作者
在任务切换的时候,切换到用户级,在调用关键的系统程序的时候切换的特权级,来对系统的资源实施保护
对开关中断的实现也不是很难的,不是有SVC吗,也是很容易实现的

使用特权

评论回复
15
ShakaLeo| | 2010-7-9 10:02 | 只看该作者
在任务里如果有一段代码需要在关中断的情况下运行,并且要运行在用户级,貌似就没法做到,用户级并且关中断,没办法恢复为特权级,因为关中断时不响应SVC

使用特权

评论回复
16
mjj123|  楼主 | 2010-7-9 10:15 | 只看该作者
在关中断之前 执行一条SVC 在SVC中执行特权级切换和关中断操作,就可以实现了

使用特权

评论回复
17
ShakaLeo| | 2010-7-9 10:34 | 只看该作者
楼上想的太简单。之后怎么开中断?

使用特权

评论回复
18
mjj123|  楼主 | 2010-7-9 10:45 | 只看该作者
开中断和关中断时成对出现的 既然关中断后是在特权级下执行了,那么关中断的时候不就可以先执行SVC 在开中断,开了后就可以响应SVC了(SVC的优先级要高),在例程中切换到线程 用户级

使用特权

评论回复
19
ShakaLeo| | 2010-7-9 11:05 | 只看该作者
在15楼我说的是“在任务里如果有一段代码需要在关中断的情况下运行,并且要运行在用户级”,是说这段需要关中断的代码要运行在用户级。你说的那是关中断后运行在特权级。

使用特权

评论回复
20
mjj123|  楼主 | 2010-7-9 14:36 | 只看该作者
本帖最后由 mjj123 于 2010-7-9 14:47 编辑

关中断的情况下运行,  并且要运行在用户级,那你用户级的程序
关中断的目的是什么啊,不就是这一段程序不可以被中断吗,要保持原子性。也就是在访问一些临界资源的时候应啊,我们为什么不可以把这些临界资源进行保护下访问呢(也就是在特权级下访问),这样对理解资源有些很好的保护了(因为它们被限制只能特权访问了)。
我们还有必要在用户级下访问临界资源吗?? 为什么不给他们一些保护呢,在关中断+特权级下运行。
你关中断只是为了临界资源的利用,你完全可以使用信号量、互斥量等任务间的通信来实现的,也不要关中断吧,关中断对实时操作系统的实时性有很大的影响的。不利于实时性的实现

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

54

帖子

0

粉丝