pico添加devmem2读写内存模块

news2024/11/25 6:41:42

devmem2读写内存

      • 自定义msh命令devmem2
      • 验证msh命令devmem2
        • 读CPUID
        • 读写全局变量

devmem2模块可实现对设备寄存器的读写操作。在RT-Thread的命令行组件Fish中添加devmem2模块,用户可在终端输入devmem2相关命令,FinSH根据输入对指定寄存器进行读写,并将结果显示到控制终端。
关于FinSH详细内容见:Finsh

自定义msh命令devmem2

msh是FinSH的传统命令行模式,因其模式体积小,使用方便,能够解决C-style(C语言解释器模式)的弊端等,被广泛引用。
自定义的 msh 命令,可以在 msh 模式下被运行,将一个命令导出到 msh 模式可以使用如下宏接口:

MSH_CMD_EXPORT(name, desc);
name:要导出的命令,desc:导出命令的描述

在ENV工具中配置MSH:command shell,如下图:
在这里插入图片描述
添加devmem2模块至FinSH组件,需要在工程中的FinSH路径下cmd.c(如:…/bsp/raspberry-pico/dist/project/rt-thread/components/finsh/cmd.c)添加devmem2相关源码。由于pico开发板没有mmp内存映射模块,所以读写寄存器是针对物理地址进行操作。其核心代码:

void devmem2(int argc, char **argv) {
    void *phy_addr;
	unsigned long read_result, writeval;
	off_t target;
	int access_type = 'w';
	
	if(argc < 2) {
		fprintf(stderr, "\nUsage:\t%s { address } [ type [ data ] ]\n"
			"\taddress : memory address to act upon\n"
			"\ttype    : access operation type : [b]yte, [h]alfword, [w]ord\n"
			"\tdata    : data to be written\n\n",
			argv[0]);
        return;
	}
	target = strtoul(argv[1], 0, 0);
	if(argc > 2)
		access_type = tolower(argv[2][0]);

    phy_addr = (void*)target;
    printf("phy_addr:%x\n",phy_addr);
    switch(access_type) {
		case 'b':
			read_result = *((unsigned char *) phy_addr);
			break;
		case 'h':
			read_result = *((unsigned short *) phy_addr);
			break;
		case 'w':
			read_result = *((unsigned long *) phy_addr);
			break;
		default:
			fprintf(stderr, "Illegal data type '%c'.\n", access_type);
            return;
	}
    printf("Value at address 0x%X (%p): 0x%X\n", target, phy_addr, read_result); 

	if(argc > 3) {
		writeval = strtoul(argv[3], 0, 0);
		switch(access_type) {
			case 'b':
				*((unsigned char *) phy_addr) = writeval;
				read_result = *((unsigned char *) phy_addr);
				break;
			case 'h':
				*((unsigned short *) phy_addr) = writeval;
				read_result = *((unsigned short *) phy_addr);
				break;
			case 'w':
				*((unsigned long *) phy_addr) = writeval;
				read_result = *((unsigned long *) phy_addr);
				break;
		}
		printf("Written 0x%X; readback 0x%X\n", writeval, read_result); 
	}
}
MSH_CMD_EXPORT(devmem2, devmem2 sample: devmem2 { address } [ type [ data ] ]);

添加devmem会引入新的头文件,在scons构建项目时,会出现因找不到个别头文件或源文件而报错,针对此问题,需要在当前工程的根目录下,查找缺失的头文件,并将头文件所在的路径添加至project/libraries/SConscript中,如:
在这里插入图片描述

验证msh命令devmem2

读CPUID

添加devmem2模块并成功构建工程后,将在msh命令行按下Tab健查看devmem2命令。如图:
在这里插入图片描述在这里插入图片描述
读取设备的CPUID,查看pico rp2040说明文档,获取其ARM寄存器的其实地址为0xe0000000,其CPUID的偏移地址offset为0xed00,故其CPUID的地址为0xe000ed00。通过CPUID寄存器的值为0x410cc601与devmem2查看的一致。如图:
在这里插入图片描述
由于pico中地址范围为0xd0000000-0xefffffff仅支持word size,故halfword及byte的type读操作无效,如图:
在这里插入图片描述
此处,读某一寄存器,验证其type为w、h、b效果,如图:
在这里插入图片描述

读写全局变量

在…/projectt/applications/main.c中添加一全局变量test_value,scons构建项目,通过…/project/rt-thread.map查看test_value变量的地址为0x200012c4,如图:

/*
main.c
*/
#include <rtthread.h>
#include <rtdevice.h>

#define LED_PIN 25

int test_value;
int main(void)
{
    rt_kprintf("Hello, RT-Thread!\n");
    test_value = 0;
    rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);

    while (1)
    {
        rt_pin_write(LED_PIN, 1);
        rt_thread_mdelay(3000);
        rt_pin_write(LED_PIN, 0);
        rt_thread_mdelay(1000);
    }
}

在这里插入图片描述
通过devmem2命令读写test_value对应寄存器内的值,如图:
在这里插入图片描述
关于逻辑地址(虚拟地址)与物理地址(设备的实际RAM地址/硬盘空间)及映射之间说明可参考如下:
操作系统中逻辑地址和物理地址的区别
linux内存映射mmap原理分析
内存映射原理和内核是如何实现的,完全分析mmap原理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/770704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot整合feign实现RPC调用,并通过Hystrix实现服务降级

目录 一、服务提供者 二、服务消费者 三、测试效果 四、开启Hystrix实现服务降级 feign/openfeign和dubbo是常用的微服务RPC框架&#xff0c;由于feigin内部已经集成ribbon&#xff0c;自带了负载均衡的功能&#xff0c;当有多个同名的服务注册到注册中心时&#xff0c;会根…

Pycharm安装dlib

目录 一、下载dilb 二、使用pip安装dlib库(亲测有效) 三、使用Pycharm安装(未使用) 一、下载dilb 官方网址:德利卜 皮皮 (pypi.org) 二、使用pip安装dlib库(亲测有效) 将下载好的whl文件放入工程文件中 接下来使用Python自带的pip进行安装 1.winR2.输入cmd&#xff0c;回车…

vue3+vite+ts+vant 开发浙里办H5应用流程和注意事项

vue3vitets 开发浙里办H5应用流程和注意事项 最近有个项目是要开发到浙里办的一个H5项目,记录一些问题; 浙里办irs系统内node版本和npm版本如下建议切到他们的版本再进行开发这样问题少一点 1.因为浙里办有自己的irs系统 需要吧前端整体的代码传上去 除了 打包后的dist 和 no…

Vue实现阻止浏览器记住密码功能的三种方法

通常浏览器会主动识别密码表单&#xff0c;在你登录成功之后提示保存密码 &#xff0c; 密码保存到浏览器的 密码管理器中 ( 如下是谷歌浏览器 ) 这种行为是浏览器的行为 &#xff0c;这种操作也是为了方便用户的使用 现在的一个需求是要阻止这个保存密码的弹窗提示 登录页账…

【AutoGluon_01】安装与示例

文章目录 一、安装二、示例一 AutoGluon预测目标数据1、导入数据2、训练3、预测4、评估5、小结 三、示例二 AutoGluon多模态预测&#xff08;Multimodal Prediction&#xff09;1、导入数据2、训练3、预测4、评估 四、示例三 AutoGluon进行时间序列预测1、导入数据2、训练3、预…

适配器模式-不兼容结构的协调

去英语国家旅游时&#xff0c;我们只会说中文&#xff0c;为了与当地人交流&#xff0c;我们需要购买个翻译器&#xff0c;将中文翻译成英文&#xff0c;而这运用了适配器模式。 1 概述 适配器模式&#xff08;Adapter Pattern&#xff09;&#xff0c;将一个接口转换成客户喜…

golang 日志库logrus和lumberjack 日志切割库实践

package mainimport (log "github.com/Sirupsen/logrus""gopkg.in/natefinch/lumberjack.v2" )func main() {logger : &lumberjack.Logger{// 日志输出文件路径Filename: "/var/log/myapp/foo.log",// 日志文件最大 size, 单位是 MBMaxSiz…

i.MX6Q应用处理器:MCIMX6Q5EYM12AD/MCIMX6Q5EYM10AE/MCIMX6Q5EYM10ADR 4核、32位,624-LFBGA

i.MX6Q 处理器代表了集成多媒体应用处理器的最新成就。这些处理器是不断增长的多媒体产品系列的一部分&#xff0c;这些产品提供高性能处理&#xff0c;并针对最低功耗进行了优化。 i.MX6Quad处理器采用先进的四核ArmCortex-A9内核&#xff0c;运行速度高达1.2 GHz。它们包括2…

什么?微信朋友圈能够一键转发了?

作为「国民级」聊天软件&#xff0c;微信朋友圈功能一直备受关注&#xff0c;毕竟社交 3 大巨头中&#xff0c;QQ 和微博都可以转发动态。那微信朋友圈能不能也像 QQ 空间这样&#xff0c;点击转发能分享到 QQ、微信和朋友圈呢&#xff1f; 那到底朋友圈转发怎么个转法&#xf…

前端Vue自定义弹框、自定义弹框内容 alertView showModel popup 组件

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。 通过组件化开发&#xff0c;可以有效实现…

数据标注的类型有哪些?

构建像人类一样的AI或ML模型需要大量训练数据。要使模型做出决定并采取行动&#xff0c;就必须通过数据标注来训练模型&#xff0c;使其能够理解特定信息。 但是&#xff0c;什么是数据标注呢&#xff1f;数据标注是指对用于人工智能应用的数据进行分类和标注。我们必须针对特定…

SpringBoot教学篇------SpringBoot自动配置原理

一、SpringBoot自动配置的注解AutoWired SpringBoot的自动配置就是当Spring容器启动后&#xff0c;一些自动配置类&#xff08;只是自动配置类&#xff0c;并不是当前的组件配置到IOC容器中&#xff0c;自动配置类通过Conditional注解来按需配置&#xff09;就自动装配的IOC容…

微服务: 05-rabbitmq设置重试次数并设置死信队列

目录 1. 上文传送门: 2. 前言简介: 2.1 问: 消费端重复循环异常如何解决? 2.2 为什么要使用死信队列 2.3 案例思路 -> ps: 以下案例经过测试(思路一/二实现原理一样) -> 2.3.1 思路一 -> 2.3.2 思路二 3. 案例代码 3.1 简单介绍案例 3.2 声明交换机 队…

网络知识整合——Web页面请求的历程

Web页面请求的历程 内部涉及知识&#xff1a;一、准备:DHCP、UDP、IP 和以太网二、仍在准备&#xff1a;DNS和ARP三、仍在准备&#xff1a;域内路由选择到DNS服务器四、Web客户-服务器交互&#xff1a;TCP和HTTP五、HTTP请求响应格式Requests部分Responses 部分 下载一个Web页面…

【MySQL】_1.数据库基础

目录 1.数据库介绍 1.1 数据结构与数据库 1.2 常见的数据库软件 1.3 数据库的分类 1.4 MySQL介绍 1.4.1 重要概念 1.4.2 学习内容 1.4.3 数据库服务器在硬盘上组织数据的方式 2. 数据库操作 2.1 显示当前数据库 2.2 创建数据库 2.3 选中数据库 2.4 删除数据库 3…

在分区工具上,格式化分区和删除分区. 两者有什么不一样吗?

1.格式化分区&#xff1a;就是重建文件系统&#xff0c;等于把目标分区的数据全部清掉。 删除分区&#xff1a;你删除后可以再重新分区&#xff0c;可以分区多个分区&#xff0c;前提是“删除分区”的大小足够大。分了区&#xff0c;还必须格式化&#xff0c;才能用。 只有分了…

vue3+vite+pinia+vue-router搭建环境

前提&#xff1a;前面已经创建一个项目&#xff0c;涉及到vue3、vite、pinia、vue-router、openlayers创建的命令行及对应版本。接下来&#xff0c;是整个项目的详细配置。 详细配置&#xff0c;包括以下内容&#xff1a; 一、vue (一)、vue3&#xff0c;并且使用组合式API vue…

理解冯.诺依曼体系结构(操作系统和进程)

文章目录 一.冯诺依曼体系结构二.冯诺依曼体系结构与木桶效应三.操作系统与进程操作系统Linux系统中的进程 一.冯诺依曼体系结构 冯诺依曼体系结构特性: 冯诺依曼体系结构中的存储器指的是内存——一种硬件级别的缓存空间(介于IO设备与CPU之间,只有数据存储和读写功能,并且具有…

重排链表问题

给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。…

基础语言模型LLaMA

LLaMA包含从7B到65B参数的基础语言模型集合。Meta在数万亿个tokens上训练了模型&#xff0c;LLaMA-13B在大多数基准测试中优于GPT-3&#xff08;175B&#xff09;。 来自&#xff1a;LLaMA: Open and Efficient Foundation Language Models 目录 背景概述方法预训练数据架构Op…