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

  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. [WPF] 如何实现文字描边

    1. 前言 WPF 的 TextBlock 提供了大部分常用的文字修饰方法,在日常使用中基本够用.如果需要更丰富的表现方式,WPF 也提供了其它用起来复杂一些的工具去实现这些需求.例如这篇文章介绍的文 ...

  2. 发现Compound的第二个严重漏洞

    本文转自 发现Compound的第二个严重漏洞 | 登链社区 | 深入浅出区块链技术 (learnblockchain.cn) 这个漏洞原作者在2022年02月23日已经发布过,由于内容比较敏感,发布 ...

  3. 4月16日 python学习总结 封装之property、多态 、classmethod和staticmethod

    一.封装之property @property把一个函数伪装成一个数据类型  @伪装成数据的函数名.setter   控制该数据的修改,修改该数据时触发 @伪装成数据的函数名.delect  控制该数 ...

  4. python监控cpu 内存实现邮件微信报警

    # qianxiao996精心制作 #博客地址:https://blog.csdn.net/qq_36374896 import psutil, time,smtplib,socket import ...

  5. path()的name属性,有什么用?

    官网(参考:命名 URL 模式) 命名 URL 模式: 为了完成反向解析 URL ,你需要像上面那样使用 命名 URL 模式 .用于命名 URL 的字符串可以包含任意字符,并不仅限于 Python 里 ...

  6. linux更新源管理

    1.备份源 主要防止在更新了新的源之后出现错误情况,备份一下现有的源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.old 2.编辑sourc ...

  7. Oracle数据常用的备份与恢复?

    Oracle的备份与恢复有三种标准的模式,大致分为两大类,备份恢复(物理上的)以及导入导出(逻辑上的),而备份恢复又可以根据数据库的工作模式分为非归档模式(Nonarchivelog-style)和归 ...

  8. django CBV 及其装饰器

    #urls.py from django.contrib import admin from django.urls import path, re_path from app01 import vi ...

  9. Linux 基础优化

    1.操作的最小化原则 1)安装系统最小化 一般情况下安装OS时,软件安装包组(Package Group)的选择: base--------------------------基本环境 editors ...

  10. vsftd及虚拟用户

    临时需要搭建一个ftp,突然忘记怎么搞了,重新整一下,以后备用 vsftd及虚拟用户 1.安装vsftpd yum install vsftpd 2.添加用户(用于虚拟用户映射) adduser se ...