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

  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. 1354:括弧匹配检验ybt

    [题目描述]假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ])]等为正确的匹配,[( ])或([ ]( )或 ( ( ) ) )均为错误的匹配. 现在 ...

  2. Anaconda Navigator卡logo打不开闪退问题处理方案-更换阿里云镜像源

    镜像下载.域名解析.时间同步请点击阿里云开源镜像站 一.打开软件卡logo,点击图标后闪退 最近有同事使用anaconda时出现了卡logo,显示loading applications,点击图标时发 ...

  3. 5月10日 python学习总结 单表查询 和 多表连接查询

    一. 单表查询  一 语法 select distinct 查询字段1,查询字段2,... from 表名 where 分组之前的过滤条件 group by 分组依据 having 分组之后的过滤条件 ...

  4. mybatis缓存-二级缓存

    1.2 二级缓存 [官方声明] => 如何开启[二级缓存] 默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存. 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行 ...

  5. 《前端运维》四、Jenkins--持续构建

    首先,我们先来了解下什么叫做持续构建.持续构建简称CI,负责拉取代码库中的代码后,执行用户预定义的脚本,通过一系列编译操作构建出一个制品,并将制品推送到制品库里.常用的持续构建工具有 Gitlab C ...

  6. 序列化和反序列化&持久化

    java序列化与反序列化全讲解 之前一知半解的,对于序列化的概念,为啥用,哪里用也不清楚,现在深入了解协议,先把序列化这个这个概念和和使用场景搞清楚

  7. 使用 Spring Cloud 有什么优势?

    使用 Spring Boot 开发分布式微服务时,我们面临以下问题 与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题. 服务发现-服务发现工具管理群集中的流程和服务如何查找 ...

  8. Kafka 是如何实现高吞吐率的?

    Kafka是分布式消息系统,需要处理海量的消息,Kafka的设计是把所有的消息都写入速度低容量大的硬盘,以此来换取更强的存储能力,但实际上,使用硬盘并没有带来过多的性能损失.kafka主要使用了以下几 ...

  9. 可以直接调用 Thread 类的 run ()方法么?

    当然可以.但是如果我们调用了 Thread 的 run()方法,它的行为就会和普通的方 法一样,会在当前线程中执行.为了在新的线程中执行我们的代码,必须使用 Thread.start()方法.

  10. Linux基础学习 | gcc、g++的安装和使用

    安装gcc 1.apt-get命令是debain Linux发新版的APT软件包管理工具. dabian.ubuntu.deepin等Linux系统通过以下命令: 安装gcc:Shell输入sudo ...