我以为这是个很简单的问题,没想到还有一些初学者不会。可能他们也是跟我一样是直接学的如何操作单片机并没有学微机原理么。

  ARM和RISC-V的机器的系统架构都是哈佛结构的,意思是程序存储器、数据存储器和其他的乱七八糟的外设寄存器啥啥的都是存在同一个地址空间的,他们可以说使用同一个访问的指令去读去写。51和X86不是哈佛结构的。

  具体来讲,ARM和RV都是上电后,CPU从0地址取第一条代码,当然了这一条命令很可能是全字长的,而且是个跳转指令,跳到复位函数里的指令。0地址开始的很大一部分空间作为程序存储器是用来的存放指令的,使用flash结构存储,对于CPU来讲可读不可写。写flash需要处CPU控制外设进行,过程较为复杂,速度也慢。CPU写数据是写在RAM中的,单片机的RAM一般相对flash要小很多,ARM和RISC-V的RAM都是从0x2000-0000开始,掉电数据即都丢失。

  CPU所有的操作的数据暂存都是在内核寄存器里进行,然后写回到内存中,即RAM中,内核寄存器是可以和CPU同样的频率去读写的,但内核寄存器很少,ARM大概32个,RV多点,用处限制很多,数据还是要写回到RAM中的,但是CPU访问是需要时间的,慢点的CPU都是要2个周期,而几百兆的单片机可能还不止两个周期,所以M7内核的几个变态单片机出现了“紧密耦合内存TCM”和cache和概念,我猜想是被划到紧密耦合内存的部分RAM可以以两个周期的时间访问,而D-cache是不是可以零等待访问,当做内存寄存器一样,毕竟cache是被划到内核的组成部分的。

  单片机的RAM一般从几十KB到几百KB不等,都是SRAM结构的,嵌入式和PC机的RAM一般是DRAM,便宜低功耗,DRAM是没有SRAM读写的快的,所以嵌入式和PC机的处理器如果要从内存中找一个数据,会延迟更久,所以现在X86的CPU有一级cache二级cache甚至三级cache,应该是存放指令或者数据的。

  以上都是计算机原理的内容,对于用C写代码的我们来说不重要。

  如果我们要对某个寄存器写入数据,我们需要知道它的绝对地址,比如朝0x2002-0000这个地址写一个值,当然我们需要保证这个地址是可写的,且CPU有权限去写,否则轻则写不进去重则CPU发现自己访问非法地址进了异常。

  我们首先将这个绝对地址强制转换成指针,一般转换成整形指针,像这样,(int *)0x20020000,然后加一个读地址符号*,就可以,比如,*(int *)0x20020000=0x11223344;。当然了实际上0x2002-0000是一个内存的地址,不是外设的寄存器,当然原理一样。

  为了程序运行速度我们还是要考虑访存速度点,即使是设计单片机的代码,毕竟你从片内的SRAM取指令和从诸如FSMC外扩的RAM取指令的速度是不一样的。

以ARM和RISC-V为内核的单片机写寄存器的更多相关文章

  1. ARM linux解析之压缩内核zImage的启动过程

    ARM linux解析之压缩内核zImage的启动过程 semilog@163.com 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s  ...

  2. 鸿蒙内核源码分析(寄存器篇) | 小强乃宇宙最忙存储器 | 百篇博客分析OpenHarmony源码 | v38.02

    百篇博客系列篇.本篇为: v38.xx 鸿蒙内核源码分析(寄存器篇) | 小强乃宇宙最忙存储器 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪 ...

  3. 通过OpenCL内核代码猜测设备寄存器个数

    在OpenCL标准中,没有给出查看计算设备一共有多少寄存器,至少能分配给每个work-item多少寄存器使用的特征查询.而由于一个段内核代码是否因寄存器紧缺而导致性能严重下降也是一个比较重要的因素,因 ...

  4. Windows内核基础知识-1-段寄存器

    Windows内核基础知识-1-段寄存器 学过汇编的应该都知道段寄存器,在Windows里段寄存器有很多,之前可能只接触了ds数据段,cs 代码段这种,今天这个博客就介绍Windows一些比较常用的段 ...

  5. ARM Linux中断发生时内核堆栈切换

    转载注明出处:http://www.wowotech.net/forum/viewtopic.php?id=54 对ARM Linux中断非常简洁.精确的描述. 发生了中断,最重要的是保存现场,在中断 ...

  6. 【Android 系统开发】 编译 Android文件系统 u-boot 内核 并烧写到 OK-6410A 开发板上

    博客地址 : http://blog.csdn.net/shulianghan/article/details/40299813  本篇文章中用到的工具源码下载 : -- ok-6410A 附带的 A ...

  7. 2.移植3.4内核-使内核支持烧写yaffs2

    在上章-制作文件系统,并使内核成功启动jffs2文件系统了 本章便开始使内核支持烧写yaffs2文件系统 1.首先获取yaffs2源码(参考git命令使用详解) cd /work/nfs_root g ...

  8. 2.移植3.4内核-支持烧写yaffs2,裁剪内核并制作补丁

    在上章-制作文件系统,并使内核成功启动jffs2文件系统了 本章主要内容如下: 1)使内核支持yaffs2文件系统 2)裁剪内核 3)制作内核补丁 1.首先获取yaffs2源码(参考git命令使用详解 ...

  9. Linux 内核 标准 PCI 配置寄存器

    一些 PCI 配置寄存器是要求的, 一些是可选的. 每个 PCI 设备必须包含有意 义的值在被要求的寄存器中, 而可选寄存器的内容依赖外设的实际功能. 可选的字段不被 使用, 除非被要求的字段的内容指 ...

随机推荐

  1. Redis(一):基本数据类型与底层存储结构

    最近在整理有关redis的相关知识,对于redis的基本数据类型以及其底层的存储结构简要的进行汇总和备注(主要为面试用) Redis对外提供的基本数据类型主要为五类,分别是 STRING:可以存储字符 ...

  2. Java案例——统计字符串中各种字符出现的次数

    /*案例:统计各种字符在字符串中出现的次数 分析:只考虑三种字符类型的情况下(大写字母,小写字母,数字) 1.使用Scanner 类获取字符串数据 2.遍历字符串得到每一个字符 3.判断每一个字符是那 ...

  3. JavaWeb Bug处理

    1.(getParameter) Java文本无法解析Cannot resolve method 'getParameter(java.lang.String)方法    解决方法:1.在projec ...

  4. web服务器-nginx配置文件

    web服务器-nginx配置文件 一 nginx配置文件 #启动子进程程序的默认用户 #user nobody #一个主进程和多个工作进程.工作进程是单进程的,且不需要特殊授权即可运行:这里定义的是工 ...

  5. python练习册 每天一个小程序 第0012题

    # -*-coding:utf-8-*- def test(content): text = content flag = 0 with open('filtered_words.txt') as f ...

  6. 用ssh无密码登录远程linux

    登录linux常用的方式是:用户名+密码,多次输入密码非常不方便,所以推荐使用密钥登录,安全又方便,下面我说下怎么使用密钥登录. 生成密钥 使用密钥登录首先需要本地有ssh密钥 如果本地没有密钥,那么 ...

  7. 什么是Spring的依赖注入?

    依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释.这概念是说你不用创建对象,而只需要描述它如何被创建.你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个 ...

  8. Kafka 都有哪些特点?

    高吞吐量.低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作. ...

  9. 深入理解Java虚拟机-走进Java

    一.Java技术体系 从广义上讲, Clojure. JRuby. Groovy等运行于Java虚拟机上的语言及其相关的程序都属于Java技术体系中的一员. 如果仅从传统意义上来看, Sun官方所定义 ...

  10. Java 中的 LinkedList 是单向链表还是双向链表?

    是双向链表,你可以检查 JDK 的源码.在 Eclipse,你可以使用快捷键 Ctrl + T, 直接在编辑器中打开该类.