以ARM和RISC-V为内核的单片机写寄存器
我以为这是个很简单的问题,没想到还有一些初学者不会。可能他们也是跟我一样是直接学的如何操作单片机并没有学微机原理么。
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为内核的单片机写寄存器的更多相关文章
- ARM linux解析之压缩内核zImage的启动过程
ARM linux解析之压缩内核zImage的启动过程 semilog@163.com 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s ...
- 鸿蒙内核源码分析(寄存器篇) | 小强乃宇宙最忙存储器 | 百篇博客分析OpenHarmony源码 | v38.02
百篇博客系列篇.本篇为: v38.xx 鸿蒙内核源码分析(寄存器篇) | 小强乃宇宙最忙存储器 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪 ...
- 通过OpenCL内核代码猜测设备寄存器个数
在OpenCL标准中,没有给出查看计算设备一共有多少寄存器,至少能分配给每个work-item多少寄存器使用的特征查询.而由于一个段内核代码是否因寄存器紧缺而导致性能严重下降也是一个比较重要的因素,因 ...
- Windows内核基础知识-1-段寄存器
Windows内核基础知识-1-段寄存器 学过汇编的应该都知道段寄存器,在Windows里段寄存器有很多,之前可能只接触了ds数据段,cs 代码段这种,今天这个博客就介绍Windows一些比较常用的段 ...
- ARM Linux中断发生时内核堆栈切换
转载注明出处:http://www.wowotech.net/forum/viewtopic.php?id=54 对ARM Linux中断非常简洁.精确的描述. 发生了中断,最重要的是保存现场,在中断 ...
- 【Android 系统开发】 编译 Android文件系统 u-boot 内核 并烧写到 OK-6410A 开发板上
博客地址 : http://blog.csdn.net/shulianghan/article/details/40299813 本篇文章中用到的工具源码下载 : -- ok-6410A 附带的 A ...
- 2.移植3.4内核-使内核支持烧写yaffs2
在上章-制作文件系统,并使内核成功启动jffs2文件系统了 本章便开始使内核支持烧写yaffs2文件系统 1.首先获取yaffs2源码(参考git命令使用详解) cd /work/nfs_root g ...
- 2.移植3.4内核-支持烧写yaffs2,裁剪内核并制作补丁
在上章-制作文件系统,并使内核成功启动jffs2文件系统了 本章主要内容如下: 1)使内核支持yaffs2文件系统 2)裁剪内核 3)制作内核补丁 1.首先获取yaffs2源码(参考git命令使用详解 ...
- Linux 内核 标准 PCI 配置寄存器
一些 PCI 配置寄存器是要求的, 一些是可选的. 每个 PCI 设备必须包含有意 义的值在被要求的寄存器中, 而可选寄存器的内容依赖外设的实际功能. 可选的字段不被 使用, 除非被要求的字段的内容指 ...
随机推荐
- 分享一些阅读Java相关框架源码的经验
昨天和部分网友进行了线上的交流,交流中有不少网友提到阅读源码比较难,不知道怎么上手.胖哥分享了一些个人经验,这里总结一下. 阅读源码实际上是Debug源码 其实所谓的阅读源码并不是单纯的阅读,而是调试 ...
- 揭秘.NET Core剪裁器背后的技术
十天前,我发布了对.NET Core程序进行瘦身的开源软件Zack.DotNetTrimmer,与.NET Core内置的剪裁器相比,Zack.DotNetTrimmer不仅对程序的剪裁效果更好,而且 ...
- k8s 开船记-脚踏两只船:船儿还是旧的好,不翻船才是硬道理
自从上次开始脚踏两只船(2个独立的k8s集群同时运行),园子暂时用奢侈的土豪方式过上了安稳的船上生活. 这种方式除了费钱之外,还带来一个问题,我们的集装箱自动装船系统(基于gitlab-ci的自动化部 ...
- Fedora 阿里云源
镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 简介 Fedora 是一个 Linux 发行版,是一款由全球社区爱好者构建的面向日常应用的快速.稳定.强大的操作系统.它允许任何人自由地使用.修 ...
- vim设置自动添加头部注释
#自己改了改vim开头文件,如下图# 友友们可以直接修改·SetTitle() if v:lang =~ "utf8$" || v:lang =~ "UTF-8$&quo ...
- 前端知识之BOM和DOM
前端基础之BOM和DOM windw对象 指浏览器窗口,所有的浏览器都支持window对象 常用的window方法 window.innerHeight 浏览器窗口的内部高度 window.inner ...
- c# / .net wFramework winform 之运行后的窗体窗口可拖动操作
学习winform 的同志们可能会有这样的提问,我运行起来的窗体或者窗口该如何实现可拖动呢?今天它来了 思路:可以给窗体增加一个进度条(progressBar控件) 全局定义这几个变量: long p ...
- 羽夏看Win系统内核——结语
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- Mybatis的xml配置(mybatis-config.xml)精简笔记
老规矩,看着官方文档学 首先,我们需要知道的是,在MyBatis 的xml配置文件中,这些影响 MyBatis 行为的属性之间的设置是有先后顺序的.配置的先后顺序依照properties, setti ...
- springboot使用@Value注入properties文件中的值,中文乱码
最近开发一个需求,讲一个中文值配置在properties文件中,然后代码中使用@Value注解进行注入使用,然而出现了如下状况: 中文出现乱码,将代码修改如下: String str = new St ...