pico添加devmem2读写内存模块

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 25int 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.mzph.cn/news/3458.shtml

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

相关文章

Flask SQLAlchemy_Serializer ORM模型序列化

在前后端分离项目中&#xff0c;经常需要把ORM模型转化为字典&#xff0c;再将字典转化为JSON格式的字符串。在遇到sqlalchemy_serializer之前&#xff0c;我都是通过类似Java中的反射原理&#xff0c;获取当前ORM模型的所有字段&#xff0c;然后写一个to_dict方法来将字段以及…

FPGA adrv9002 4收4发板卡,支持NVME SATA EMMC 光口 FMC

板卡采用ADI 射频直采芯片ADRV9002 &#xff0c;支持4收4发支持外部本振 跳频 同时支持4X 10G光口对外传输&#xff0c;FMC扩展 。同时支持4X NVME接口&#xff0c;可以实时流盘&#xff0c;备份一路SAT A接口&#xff0c;板卡同时预留了EMMC&#xff0c;可以PS PL选通访问&…

IDEA 常用快捷键

•快速生成&#xff1a;main psvm / main •控制台快速输出语句 sout •删除一行&#xff1a;CTRL Y •复制一行&#xff1a;CTRL D •查找 •跳转切换 •阅读源码 •编辑 •新添&#xff0c;新建&#xff1a;ALT insert •目录显示与关闭&#xff1a;CTRL Fn F12 …

【Ajax】笔记-服务端响应JSON数据

服务端响应JSON数据 构建测试案例 键盘按键触发请求服务端&#xff1a; 键盘按下触发事件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,…

【剧前爆米花--web】HTTP协议格式详解以及构造

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaEE初阶》 文章分布&#xff1a;这是一篇关于HTTP协议的文章&#xff0c;在这篇文章中我会说明HTTP协议格式以及相关的构造&#xff0c;希望对你有所帮助&#xff01; 目录 HTTP协议 HTTP协议格式 HTTP请求 HTTP响应详情…

TCP的窗口控制和重发控制【TCP原理(笔记三)】

文章目录 利用窗口控制提高速度窗口控制与重发控制确认应答未能返回的情况某个报文段丢失的情况 控制流 利用窗口控制提高速度 TCP以1个段为单位&#xff0c;每发一个段进行一次确认应答的处理&#xff0c;如图。这样的传输方式有一个缺点。那就是&#xff0c;包的往返时间越长…

【Spring】Spring AOP入门及实现原理剖析

文章目录 1 初探Aop1.1 何为AOP&#xff1f;1.2 AOP的组成1.2.1 切面(Aspect)1.2.2 连接点(Join Point)1.2.3 切点(Pointcut)1.2.4 通知(Advice) 1.3 AOP的使用场景 2 Spring AOP入门2.1 添加 Spring AOP 框架⽀持2.2 定义切面和切点2.3 定义相关通知 3 Spring AOP实现原理3.1 …

Fofa搜索技巧(理论加实践的整理)

目录 题记技巧&#xff08;我一般找国内的&#xff0c;所以下边一直加cn&#xff09;1、搜索HTTP响应头中含有"thinkphp"关键词的网站和IP。2、加上标题带有后台的。3、加上时间&#xff0c;现在新网站有thinkphp日志泄露的有很多。4、搜索html正文中含有"管理…

http-server 的安装与使用

文章目录 问题背景http-server简介安装nodejs安装http-server开启http服务http-server参数 问题背景 打开一个文档默认使用file协议打开&#xff0c;不能发送ajax请求&#xff0c;只能使用http协议才能请求资源&#xff0c;所以此时我们需要在本地建立一个http服务&#xff0c…

list最常用的遍历五种方式以及使用场景

目录 遍历方式的适用场景对比 迭代器遍历 列表迭代器 增强for遍历 Lambda表达式 lambda表达式简介 普通for遍历 集合中通用的并且常用的六种方法 遍历方式的适用场景对比 迭代器遍历 &#xff1a;在遍历过程中需要删除元素&#xff0c;请使用迭代器 列表迭代器&#xff1…

Segment Tree 线段树算法(java)

线段树算法 Segment Tree 线段树算法代码演示 蓄水池算法 Segment Tree 线段树算法 什么是线段树算法&#xff1a; 线段树&#xff08;Segment Tree&#xff09;是一种基于树结构的数据结构&#xff0c;用于解决区间查询问题&#xff0c;例如区间最大值、最小值、区间和等。线段…

在阿里云linux上安装MySql数据库

我们先远程连接服务器 然后输入 sudo yum update重新运行一下 然后 sudo yum install mysql-server安装 mysql 服务 其中有两次 y n 选择 都选y就好了 然后 运行 sudo service mysqld start启动MySql 然后 我们查看一下MySql sudo service mysqld status

git rebase 合并提交

一. 合并提交步骤 git log --oneline 查看当前提交记录 git rebase -i HEAD~2 选择最后提交的2条记录进行合并进入编辑界面,将c865404的pick改为f, 表示向前合并也就是向cc5a54合并 编辑完之后:wq 保存并退出git rebase --continuegit push --force origin feature/v1.2 推送…

opencv -11 图像运算之按位逻辑运算(图像融合图像修复和去除)

按位逻辑运算是一种对图像进行像素级别的逻辑操作的方法&#xff0c;使用OpenCV的按位逻辑运算函数可以对图像进行位与&#xff08;AND&#xff09;、位或&#xff08;OR&#xff09;、位非&#xff08;NOT&#xff09;和位异或&#xff08;XOR&#xff09;等操作。 通俗点就是…

docker-compose搭建prometheus+grafana+钉钉告警

前言&#xff1a; 本文将介绍使用docker-compose部署搭建promtheus监控容器、主机、服务等相关状态&#xff1b; 配合granfana面板构建监控大屏&#xff1b; 由于grafana的报警不是很友好&#xff0c;使用dingtalk&#xff0c;配合altermanager&#xff0c;实现钉钉报警。 …

认识Spring(1)

hi,大家好,今天继续为大家带来Spring的相关内容 文章目录 &#x1f9c1;1.理解Spring和IOC&#x1f9c1;2.DI和DF&#x1f378;2.1什么是DI&#x1f378;2.2什么是DF&#x1f378;2.3DI和DF的区别 &#x1f9c1;3 Spring创建和使用&#x1f378;3.1创建Spring项目&#x1f361…

【机器人模拟-02】 模拟移动机器人设置里程计

一、说明 在本教程中,我将向您展示如何设置移动机器人的测程。本教程是“机器人模拟”指南中的第二个教程。测量位移是仿真中的重要内容,设置测程的官方教程在此页面上,但我将逐步引导您完成整个过程。 您可以在此处获取此项目的完整代码。让我们开始吧! 二、ROS 2 中的里程…

密码学学习笔记(十五):ECDSA - 椭圆曲线数字签名算法

椭圆曲线数字签名算法是DSA的一种椭圆曲线变体&#xff0c;它发明的初衷只是避免使用Schnorr签名的专利。椭圆曲线数字签名算法依赖于验证器中的私钥和主机用于验证验证器的公钥。它的缺点和DSA一样&#xff0c;它也没有提供安全性证明。 椭圆曲线算法 DSS&#xff08;数字签…

torch分布式通信基础

torch分布式通信基础 1. 点到点通信2. 集群通信 官网文档&#xff1a;WRITING DISTRIBUTED APPLICATIONS WITH PYTORCH 1. 点到点通信 # 同步&#xff0c;peer-2-peer数据传递 import os import torch import torch.distributed as dist import torch.multiprocessing as mpdef…

php 开发微信 h5 支付 APIv3 接入超详细流程

✨ 目录 &#x1f388; 申请商户号&#x1f388; 申请商户证书&#x1f388; 设置V3密钥&#x1f388; 开通H5支付&#x1f388; 设置支付域名&#x1f388; SDK 下载&#x1f388; 第一次下载平台证书&#x1f388;非第一次下载平台证书&#x1f388; H5下单 &#x1f388; 申…