pico添加devmem2读写内存模块

这篇具有很好参考价值的文章主要介绍了pico添加devmem2读写内存模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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,如下图:
pico添加devmem2读写内存模块,mcu
添加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中,如:
pico添加devmem2读写内存模块,mcu

验证msh命令devmem2

读CPUID

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

读写全局变量

在…/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);
    }
}

pico添加devmem2读写内存模块,mcu
通过devmem2命令读写test_value对应寄存器内的值,如图:
pico添加devmem2读写内存模块,mcu
关于逻辑地址(虚拟地址)与物理地址(设备的实际RAM地址/硬盘空间)及映射之间说明可参考如下:
操作系统中逻辑地址和物理地址的区别
linux内存映射mmap原理分析
内存映射原理和内核是如何实现的,完全分析mmap原理文章来源地址https://www.toymoban.com/news/detail-599143.html

到了这里,关于pico添加devmem2读写内存模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为你的J-FLASH添加MCU型号

    1、首先你要有你需要添加的MCU对应的FLM算法文件。这里我以某大HC32L13x为例。 2、将FLM算法文件添加到JLINK目录下的Device文件夹下,我这里新建一个HDSC文件夹,并将FLM放在此目录下。 3、修改JLINK目录下的 JLinkDevices.xml  在xml文件中添加MCU器件信息。  对应你MCU的FLASH RAM信息修

    2024年02月06日
    浏览(39)
  • MCU(Cortex - M3/M4)启动加载过程和内存分配原理 笔记

            最近发现对基础不太熟悉,写篇笔记记录一下MCU启动到用户C语言运行,之前做了那些工作,同时flash和Ram又分别保存了那个数据,每一段又是什么意义,方便后续自己忘记了,查阅。        在MCU上电/复位之后到程序开始运行前,Cortex - M处理器会从存储器中读

    2024年02月15日
    浏览(55)
  • 7.7 实现进程内存读写

    内存进程读写可以让我们访问其他进程的内存空间并读取或修改其中的数据。这种技术通常用于各种调试工具、进程监控工具和反作弊系统等场景。在 Windows 系统中,内存进程读写可以通过一些 API 函数来实现,如 OpenProcess 、 ReadProcessMemory 和 WriteProcessMemory 等。这些函数提供

    2024年02月08日
    浏览(41)
  • 5.2.11.添加读写接口

    5.2.11.添加读写接口 5.2.11.1、在驱动中添加 5.2.11.2、在应用中添加 5.2.11.3、测试 1.  app.c 2.  Makefile 文件 没有改动 只是增加了 删除 app 3. module_test.c 添加   .write        = test_chrdev_write,                                             .read        = test_c

    2024年02月16日
    浏览(24)
  • 驱动开发:内核物理内存寻址读写

    在某些时候我们需要读写的进程可能存在虚拟内存保护机制,在该机制下用户的 CR3 以及 MDL 读写将直接失效,从而导致无法读取到正确的数据,本章我们将继续研究如何实现物理级别的寻址读写。 首先,驱动中的物理页读写是指在驱动中直接读写物理内存页(而不是虚拟内

    2024年02月11日
    浏览(39)
  • 驱动开发:内核读写内存多级偏移

    让我们继续在 《内核读写内存浮点数》 的基础之上做一个简单的延申,如何实现多级偏移读写,其实很简单,读写函数无需改变,只是在读写之前提前做好计算工作,以此来得到一个内存偏移值,并通过调用内存写入原函数实现写出数据的目的。 以读取偏移内存为例,如下

    2024年02月11日
    浏览(36)
  • 驱动开发:内核读写内存浮点数

    如前所述,在前几章内容中笔者简单介绍了 内存读写 的基本实现方式,这其中包括了 CR3切换 读写, MDL映射 读写, 内存拷贝 读写,本章将在如前所述的读写函数进一步封装,并以此来实现驱动读写内存浮点数的目的。内存 浮点数 的读写依赖于 读写内存字节 的实现,因为

    2024年02月06日
    浏览(51)
  • 寄存器内存读写指令(二) —— 多寄存器读写 LDM / STM

    有的时候,CPU可能会遇到 a++; b++; c++,这个时候为了提升效率,CPU可能会一次将多个寄存器里的变量保存到内存中。这个时候之前介绍的 LDR / STR 指令虽然也能实现,但只能操作一个寄存器的读写。 因此,考虑到这点,下面介绍多个寄存器的读写指令 将 多个寄存器 的数据写

    2024年02月07日
    浏览(58)
  • QT Sqlite 内存模式 简单读写

    //本文描述了QT Sqlite 内存模式 ,使用QT 自带库文件,写入和读取。 //QT 6.2.4 MSVC2019调试通过。 //需要在pro文件中加入 QT += sql #include QCoreApplication #include QSqlDatabase #include QSqlQuery #include QDebug #include QSqlDriver //#include QSqlError //#include QStringList //#include QVariant static bool createConnection(

    2024年04月25日
    浏览(32)
  • 基于QSharedMemory的读写安全的共享内存

    多进程交互中,其中共享内存是比较常用的一种交互方式,比较高效且易于调试。网上虽然也有很多基于QSharedMemory的实现,但是都是比较基础的,同时读写,读完后分离进程之类的都没有完全保证安全性。所以我花了一整天重新封装了一个基于QSharedMemory的读写安全的类,包

    2024年01月18日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包