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

  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. ActiveMQ 笔记—01

  2. 什么是微服务架构 Spring Cloud?

    1 为什么微服务架构需要Spring Cloud 简单来说,服务化的核心就是将传统的一站式应用根据业务拆分成一个一个的服务,而微服务在这个基础上要更彻底地去耦合(不再共享DB.KV,去掉重量级ESB) ...

  3. dotnet 6 使用 string.Create 提升字符串创建和拼接性能

    本文告诉大家,在 dotnet 6 或更高版本的 dotnet 里,如何使用 string.Create 提升字符串创建和拼接的性能,减少拼接字符串时,需要额外申请的内存,从而减少内存回收压力 本文也 ...

  4. ubuntu忘记密码,用root修改Ubuntu密码

    今天突发奇想,想改一下ubuntu的用户名,仅仅修改了/etc/passwd中的用户名. 改完后没有用命令修改密码,直接reboot了. 结果悲剧了,登不进去了. 赶紧百度一下,结果发现,本宝宝看不懂 ...

  5. google hacker语法

    intext:关键字 搜索网页正文中含有这些关键字的网页. intitle:关键字 搜索网页标题中含有这些关键字的网页. cache:关键字 搜索含有关键字内容的cache. define:关键字 搜 ...

  6. 加速度传感器(MPA1064A)实测---LOTO虚拟示波器

    加速度传感器(MPA1064A)实测---LOTO虚拟示波器 客户提供了一个加速度传感器,型号是MPA1064A,我们帮助客户测试下是否能测到传感器的输出,验证下测试方案.传感器很小巧,带了一根很长的 ...

  7. Java基础 - 泛型详解

    2022-03-24 09:55:06 @GhostFace 泛型 什么是泛型? 来自博客 Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了&quo ...

  8. 羽夏逆向指引—— Hook

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的, ...

  9. 基于COLA架构的电商财务系统-总

    财务 清算-clearing 对账-check 结算-settle 平账-correct 划拨-remit 包划分 按照COLA规则进行划分,综合考虑功能和领域两个维度包结构定义 技术参考 dddpl ...

  10. python方面

    (113条消息) re.sub()用法的详细介绍_jackandsnow的博客-CSDN博客_re sub Python slice() 函数 | 菜鸟教程 (runoob.com) (111条消息) ...