首页 > 系统相关 >linux-c-tina-'伪'裸机开发--寄存器操作篇

linux-c-tina-'伪'裸机开发--寄存器操作篇

时间:2023-06-23 20:25:49浏览次数:67  
标签:文件 -- dev 裸机 mem io linux include

之所以叫伪裸机,是因为还是基于操作系统的,并不能真正的裸机开发。

/dev/mem文件:

首先得了解一下什么是/dev/mem文件,有什么作用:

/dev/mem简单来说是作为一个linux内核几乎通用的硬件地址映射文件,可以通过这个向硬件寻址,从而操作寄存器。

由图可见,此文件大概占1bytes的大小。并且这个文件是需要在特权模式下才能使用的。

更详细的解释在这一篇文章中有写

对于/dev/mem的番外了解,挺有意思的一篇文章

sys/mman.h头文件:

在c语言库中的一个虚拟地址映射头文件,可以将文件以地址的方式打开,即不需要打开全部缓存即可修改文件。用这个即可打开mem从而改写地址然后可以操作寄存器。

mmap的函数有很多,但是常用的莫非就是mmap和munmap,以v831为例,

#include "io.h"
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>

void *map_bass=NULL;
unsigned long *io_ph1se;
unsigned long *io_phdat;

void io_init()
{
    int fd=0;
    fd = open("/dev/mem", O_RDWR | O_NDELAY); //可读可写非阻塞
    if(fd<0)
    {
        printf("failed to open mem\n");
        return -1;
    }
    map_bass=mmap(0,1,PROT_READ | PROT_WRITE,MAP_SHARED,fd,IO_BASE);//从0说明自动选择起始地址,可读可写,
    //对映射区写数据同时会写入文件,且允许其他映射该文件的进程共享,fd,base应该是4096的倍数
    if (NULL == map_bass)
	{
		printf("mmap failed\n");
		return -1;
	}
    io_ph1se=(unsigned long *)(map_bass+IOH1_SELECT);
    io_phdat=(unsigned long *)(map_bass+IOH_DAT);
    close(fd);                          //映射成功,关掉文件
    // unsigned long *p;
    // p=munmap(&IOH1_SELECT,32);
    //*io_ph1se=0x77755557;
    printf("%x\n",*io_ph1se);        //读取ph的数值
    *io_ph1se=(*io_ph1se&0xf8ffffff)|0x01000000;           //PH14设置成OUTPUT
    printf("%x\n",*io_ph1se);        //成功读取

    //printf("%x\n",p);
    //*p|=0x01000000;                //PH14设置成OUTPUT
}

void io_turn()
{
    if(*io_phdat&0x4000)
    {
        //printf("led turn off %x\n",*io_phdat);
        *io_phdat&=~(0x00004000);
    }
    else
    {
        //printf("led turn on %x\n",*io_phdat);
        *io_phdat|=0x00004000;
    }
}

int io_driver()
{
    io_init();
    while (1)
    {
        io_turn();
        printf("hellow world\n");
        sleep(2);
    }
    return 0;
}

以上为读取v831的state灯然后两秒钟反复转换的例子,

可见非常成功

详细的mmap用法:

标签:文件,--,dev,裸机,mem,io,linux,include
From: https://www.cnblogs.com/recodemo/p/17499591.html

相关文章

  • LeetCode/特别的排列
    给你一个下标从0开始的整数数组nums,它包含n个互不相同的正整数。如果nums的一个排列满足以下条件,我们称它是一个特别的排列:对于0<=i<n-1的下标i,要么nums[i]%nums[i+1]==0,要么nums[i+1]%nums[i]==01.记忆化搜索+状态压缩classSolution{pub......
  • 互送礼物
    1#include<iostream>2#include<map>3usingnamespacestd;4map<string,int>na_mo;5intmain(intargc,char**argv){6intx;7cin>>x;8stringZname,n[x],m;9intr,qian;10for(inti=0;i<x;i+......
  • 礼物互送
    #include<bits/stdc++.h>usingnamespacestd;map<string,int>a;intmain(){intn,many,m;cin>>n;stringname[n],b[n],name_;for(inti=0;i<n;i++){cin>>name[i];}for(inti=0;i<n;i++){......
  • 第三次总结性blog
    目录 1.前言2.设计与分析3.踩坑心得4.改进建议5.总结 1.前言题目集8课程成绩统计程序-1题目集9统计Java程序中关键词的出现次数题目集10容器-HashMap-检索容器-HashMap-排序课程成绩统计程序-2动物发声模拟器......
  • Vue 基本认识二:使用 Vue CLI 的 Vue 项目
    注意VueCLI(手脚架)创建项目需要安装Node.js,没安装的看这里。使用VueCLI创建与运行项目,看这里。VueCLI创建的项目文件夹和文件说明,看这里。 单文件组件定义和引入  render函数......
  • 礼物互赠
    #include<iostream>#include<map>usingnamespacestd;map<string,int>na_mo;intmain(){ intn; cin>>n; stringname[n],ren[n][n],name1[n]; intrenshu[n]; intd=0; for(inti=0;i<n;i++){ cin>>name[i]; } for(int......
  • 交通标志识别系统Python+TensorFlow+Django+卷积神经网络算法实现【完整代码】
    一、介绍使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Django,开发网页端操作平台,实现用户上传一张图片识别其名称。二、效果展示三、演示视频视频+完整代码:https://www.yuque.......
  • 互送礼物
    #include<bits/stdc++.h>usingnamespacestd;intmain(intargc,char**argv){intn,m,money;stringname1,name2;cin>>n;map<string,int>name_money;stringname[n];for(inti=0;i<n;i++){cin>>na......
  • ElasticSearch依赖(7.12.1)【ElasticSearch】
    <!--ES依赖--><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><!--忽略掉冲突的依赖-->......
  • OpenFeign服务接口调用
    官网解释:https://cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/#spring-cloud-openfeignFeign是一个声明式WebService客户端。使用Feign能让编写WebService客户端更加简单。它的使用方法是定义一个服务接口然后在上面添加注解。Feign也支持可拔插式的......