STM32F4 programming manual_1

1. 处理器模式与特权等级

处理器模式分为以下两种:

  • 线程模式:

    用来执行应用软件;

    处理器从reset出来时,进入线程模式;

    CONTROL寄存器控制软件的执行状态时特权的还是非特权的。

  • 处理模式:

    用来处理异常;

    完成异常处理后,进入线程模式;

    该模式下,软件运行在特权等级上。

特权等级有以下两种:

  • 非特权:

    对于MSR、MRS指令受限的权限,不能使用CPS指令;

    不能使用系统定时器、NVIC、系统控制块;

    对于部分内存和外设的访问受限

    必须使用SVC指令来执行超级访问者调用以控制特权等级的软件

  • 特权:

    可以使用所有指令,访问所有资源。

    可以写CONTROL寄存器来改变软件执行的特权等级。

2. 栈

处理器使用向下增长的栈,这意味着栈指针指向栈内存的最后一个成员。当处理器将数据压入栈时,首先将栈指针减小相应的字节数,然后将数据写入栈指针所指的内存地址。处理器使用了两个的栈main stackprocess stack,他俩拥有栈指针的独立拷贝。

在线程模式下,CONTROL寄存器控制处理器使用哪个栈(main stack or process stack)。在处理模式下,处理器总是使用 main stack。

处理器模式 用途 特权等级
线程模式 运行应用 特权 或 非特权 main stack or process stack
处理模式 处理异常 总是特权 main stack

3. 核心寄存器

  • 通用寄存器

    R0-R12 是32位通用寄存器,其中R0-R3四个寄存器可用于参数传递与结果返回。

  • 栈指针SP

    R13用于存储栈指针,在线程模式下,CONTROL寄存器的bit[1]表示使用哪个栈(main stack or process stack)。

    bit[1] = 0: 使用主栈main stack pointor(MSP), 这是reset时设置的值,也就是默认值。

    bit[1] = 1:使用process stack pointor(PSP)

    reset时,MSP被装载0x00000000.

  • 链接寄存器LR

    R14用于存储链接指针,主要是在发生函数调用的场合,LR寄存器存储子函数的返回地址。发生指令跳转时,如BL指令,首先将PC中地址存入LR寄存器中,然后将跳转目的地址存到PC中。

    reset时,该值被置为0xFFFFFFFFF.

  • 程序计数器PC

    R15用于存储当前程序地址,reset时该寄存器装载reset向量的地址,这在地址 0x00000004的位置。

    reset时,bit[0]的值被装载到EPSR的T位,而且必须为1。

  • 程序状态寄存器PSR,该寄存器内存在几个互斥的位域可分别用以下寄存器表示。(同一个物理地址,几个不同名字)

    应用程序状态寄存器 APSR

    中断程序状态寄存器 IPSR

    异常程序状态寄存器 EPSR

  • CONTROL 寄存器

    该寄存器控制在线程模式下使用哪个栈以及软件运行的特权等级

    指示FPU状态是否激活

处理模式下,处理器总是使用MSP的,因此处理器会忽略对寄存器bit[1]的写入操作。

在OS环境中,建议线程运行在线程模式下使用PSP(process stack);kernel和异常处理使用MSP(main stack)。

默认情况下,线程模式使用MSP(main stack)。可以通过下面两种方式将栈指针切换到PSP。

  • 使用MSR指令,将CONTROL寄存器的bit[1]设置为1
  • 异常返回到线程模式时,使用一个合适的EXC_RETURN值。

当改变栈指针时,软件必须在使用MSR指令后,立即使用ISB指令。这保证了ISB指令之后的指令使用新的栈指针。

ISR指令是指令同步屏障(instruction synchronization barrier),它刷新了处理器的管道线,导致该指令之后的指令都要重新fetch。这条指令不会改变标志位。

The Cortex microcontroller software interface standard (CMSIS)

该标准定义了如下内容

  • 访问外设的方式
  • 定义异常向量的方式
  • 核心外设寄存器的名字
  • 核心异常向量的名字
  • 使用RTOS内核的设备无关接口,包括调试模式

CMSIS包含了Cortex-M4处理器核心外设的地址和数据结构定义

简化了软件开发过程

本文图表引用自《PM0214: STM32F3, STM32F4 and STM32L4 Series Cortex®-M4 programming manual》

本文参考ST官方文档《PM0214: STM32F3, STM32F4 and STM32L4 Series Cortex®-M4 programming manual》

STM32F4 编程手册学习1_编程模型的更多相关文章

  1. STM32F4编程手册学习2_内存模型

    STM32F4编程手册学习2_内存模型 1. 内存映射 MCU将资源映射到一段固定的4GB可寻址内存上,如下图所示. 内存映射将内存分为几块区域,每一块区域都有一个定义的内存类型,一些区域还有一些附加 ...

  2. 《ASP.NET MVC4 WEB编程》学习笔记------Model模型绑定

    本文转载自haiziguo Asp.net mvc中的模型绑定,或许大家经常用,但是具体说他是怎么一回事,可能还是会有些陌生,那么,本文就带你理解模型绑定.为了理解模型绑定,本文会先给出其定义,然后对 ...

  3. Python学习---网络编程 1217【all】

    OSI七层模型: 物理层, 数据链路层, 网络层,传输层,会话层,表达层,应用层 应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 传输层:TCP,UDP 网络层:I ...

  4. Java学习疑惑(8)----可视化编程, 对Java中事件驱动模型的理解

    我们编写程序就是为了方便用户使用, 我觉得UI设计的核心就是简洁, 操作过于繁琐的程序让很大一部分用户敬而远之. 即使功能强大, 但是人们更愿意使用易于操作的软件. 近年流行起来的操作手势和逐渐趋于成 ...

  5. pthread多线程编程的学习小结

    pthread多线程编程的学习小结  pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写     程序员必上的开发者服务平台 —— DevSt ...

  6. 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)

    <Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...

  7. 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)

    <Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...

  8. 《Linux/Unix系统编程手册》读书笔记1

    <Linux/Unix系统编程手册>读书笔记 目录 最近这一个月在看<Linux/Unix系统编程手册>,在学习关于Linux的系统编程.之前学习Linux的时候就打算写关于L ...

  9. 有一定基础的 C++ 学习者该怎样学习 Windows 编程?

    人的心理有个奇异的特性:一项知识一旦学会之后,学习过程中面临的困惑和不解非常快就会忘得干干净净,似乎一切都是自然而然,本来就该这种.因此,关于「怎样入门」这类问题,找顶尖高手来回答,未必能比一个刚入门 ...

随机推荐

  1. SQL 存储过程生成

    use workflow; GO /****** 对象: StoredProcedure [dbo].[pro_GenerateProGet] 脚本日期: 08/03/2012 11:26:43 ** ...

  2. js内部事件机制--单线程原理

    原文地址:https://www.xingkongbj.com/blog/js/event-loop.html http://www.haorooms.com/post/js_xiancheng ht ...

  3. 关于c++随机种子srand( time(NULL) )的设置问题

    设置随机种子srand( time(NULL) ) ,在程序中只需要设置一次就好,而且不能被调用多次,直接看列子. a:每次都重新设置随机种子 #include<iostream> #in ...

  4. Tesseract-OCR 自动生成识别库的批处理

    用Tesseract-OCR做识别库的时候,生成字典非常麻烦,就写了一个批处理,用来生成字典还是蛮方便的,希望大家有用,该批处理已经自动生成font_properties文件,各位无需手动创建 下载地 ...

  5. uva_11806_Cheerleaders

    In most professional sporting events, cheerleaders play a major role in entertaining the spectators. ...

  6. centos7安装ftp

    1.服务器初始化检查 检查selinux,firewall,iptables是否开启 1.查看selinux的运行状态 [root@zeq ~] getenforce Disabled 我的现在是关闭 ...

  7. 在tornado中使用异步mysql操作

    在使用tornado框架进行开发的过程中,发现tornado的mysql数据库操作并不是一步的,造成了所有用户行为的堵塞.tornado本身是一个异步的框架,要求所有的操作都应该是异步的,但是数据库这 ...

  8. Hive--关联表(join)

    在hive中,关联有4种方式: 内关联:join on 左外关联:left join on 右外关联:right join on 全外关联:full join on 另外还有一种可实现hive笛卡儿积 ...

  9. JZ2440开发板:用按键点亮LED灯(学习笔记)

    本文是对韦东山嵌入式第一期学习的记录之一,如有您需要查找的信息,可以继续往下阅读. 想要用按键点亮LED灯,就需要知道按键和LED灯的相关信息,这样才可以进行之后的操作.阅读JZ2440的原理图,可以 ...

  10. 使用gogs和glide来轻松拉取golang第三方库

    golang的第三方代码拉取一直是让人头疼的问题,在github托管的代码还好,托管在其他网站上的代码总会由于大家都懂的原因,无法访问.纵使是github,在拉取文件数量较多的库时,也是比较慢的. 有 ...