You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌入式编程中如何访问并写入指定内存地址0x8729?

访问嵌入式内存地址0x8729并写入数据的方法

当然存在访问该内存地址并写入数据的方法,具体实现取决于嵌入式系统的运行环境,以下是几种常见场景的实现方式:

1. 裸机环境(无操作系统)

裸机环境下没有内存保护机制,直接通过指针操作内存地址是最直接的方式。以C语言为例:

#define CONTROL_ADDR 0x8729

int main(void) {
    // 将物理地址转换为可写的指针类型,volatile防止编译器优化
    volatile unsigned char *ctrl_reg = (volatile unsigned char *)CONTROL_ADDR;
    // 写入0xff触发硬件操作
    *ctrl_reg = 0xff;
    return 0;
}

必须加上volatile关键字,避免编译器将对该地址的写入操作优化掉——硬件相关的内存地址访问通常不能被编译器优化。

2. RTOS环境(如FreeRTOS、RT-Thread)

多数RTOS默认不开启内存保护,可直接使用裸机的指针操作方式。如果系统开启了MMU/MPU内存保护,需要先在系统配置中把0x8729地址所在的内存区域设置为可读写权限,之后再用同样的指针代码完成写入。

3. Linux嵌入式系统(用户空间)

用户空间受内存保护机制限制,无法直接访问物理地址,可通过以下两种方式实现:

  • 方式一:借助/dev/mem设备文件映射物理地址
    通过将物理地址映射到用户空间来访问,示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>

#define PHYS_ADDR 0x8729
#define MAP_SIZE  1  // 仅映射1字节

int main() {
    int fd = open("/dev/mem", O_RDWR | O_SYNC);
    if (fd == -1) {
        perror("Failed to open /dev/mem");
        return -1;
    }

    // 映射物理地址到用户空间
    unsigned char *mem_ptr = mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, PHYS_ADDR);
    if (mem_ptr == MAP_FAILED) {
        perror("Failed to mmap");
        close(fd);
        return -1;
    }

    // 写入0xff
    *mem_ptr = 0xff;

    // 清理资源
    munmap(mem_ptr, MAP_SIZE);
    close(fd);
    return 0;
}

编译运行时需要root权限,因为/dev/mem仅对管理员开放。

  • 方式二:编写内核模块
    内核空间不受用户态内存保护限制,可直接操作物理地址,示例模块片段:
#include <linux/module.h>
#include <linux/kernel.h>

#define CONTROL_ADDR 0x8729

static int __init my_module_init(void) {
    // 将物理地址映射为内核虚拟地址
    volatile unsigned char *ctrl_reg = (volatile unsigned char *)ioremap(CONTROL_ADDR, 1);
    if (!ctrl_reg) {
        printk(KERN_ERR "Failed to ioremap address 0x%x\n", CONTROL_ADDR);
        return -ENOMEM;
    }
    // 写入触发操作
    *ctrl_reg = 0xff;
    // 解除映射
    iounmap(ctrl_reg);
    return 0;
}

static void __exit my_module_exit(void) {
    printk(KERN_INFO "Control module exited\n");
}

module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");

内核模块需编译后加载,同样需要root权限执行加载操作。

内容的提问来源于stack exchange,提问作者Satish Kumar Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:30:52