D2000平台上Centos使用mmap函数遇到的陷阱

news2025/6/1 7:45:08

----------原创不易,欢迎点赞收藏。广交嵌入式开发的朋友,讨论技术和产品-------------

在飞腾D2000平台上,安装了麒麟linux系统,我写了个GPIO点灯的程序,在应用层利用mmap函数将内核空间映射到用户态,然后直接操作GPIO方向和数据寄存器即可控制LED管脚的电压,实现闪灯功能。

核心代码如下,利用/dev/mem设备,内核将硬件地址空间映射到用户态空间

    if ((fd_mem = open("/dev/mem", O_RDWR, 0755)) < 0)
    {
        printf("\r\n open /dev/mem err: %d-%s. \n", errno, strerror(errno));
        return 0;
    }

    mapped_gpio = (volatile unsigned char *)mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd_mem, GPIO1_BASE_ADDR);
    if (tmp == (void*)-1)
    {	
        printf("mmap error : %d-%s. \n", errno, strerror(errno));
        close(fd_mem);
        return 1;
    }

然后交叉编译后,将目标二进制文件上传到单板上运行,闪灯正常。

于是乎把这源码和可执行文件发给客户使用,结果报错。打印如下信息,提示非法参数
在这里插入图片描述
我将mmap的几个参数都研究了一下:
1、应该不是权限问题,对方用的是root账户执行的;
2、查看了单板上内核空间,看是否有GPIO物理地址的定义
#define GPIO1_BASE_ADDR 0x28005000 //PHYTIUM D2000 GPIO
cat /proc/iomem 执行结果如下,有0x28005000的空间
在这里插入图片描述
3、PROT_READ|PROT_WRITE这两个参数应该没有问题;
4、想到重要的一个因素,mmap必须以页表大小对齐的起始地址,才能做映射。于是查看当前系统的页表大小,用如下命令:getconf PAGESIZE。
在这里插入图片描述
在麒麟系统查到结果是4KB的小页面,在centos下查询得到的是65536,64KB的页面。这个参数在内核编译的时候可以设定的。肯定是centos没有设定小页面模式。关于MMU和内存页的知识,本文不叙述。有兴趣的朋友自己去研究学习。

于是乎将代码修改了一下,考虑不管多大页面都能兼容

    int pagesize;
    u32 mmap_base;
    u32 mmap_offset;
    volatile unsigned char *tmp;


    pagesize = sysconf(_SC_PAGESIZE);
    if (pagesize == -1) 
    {
        printf("Error, sysconf for _SC_PAGESIZE \n");
        return 1;
    } 
    else 
    {
        printf("Page size: %d bytes \n", pagesize);
    }

    mmap_base   = GPIO1_BASE_ADDR & ~(pagesize - 1);
    mmap_offset = GPIO1_BASE_ADDR & (pagesize - 1);

    printf("Hardware address = 0x%x,  mmap_base = 0x%x, mmap_offset = 0x%x \n", GPIO1_BASE_ADDR, mmap_base, mmap_offset);

    if ((fd_mem = open("/dev/mem", O_RDWR, 0755)) < 0)
    {
        printf("\r\n open /dev/mem err: %d-%s. \n", errno, strerror(errno));
        return 0;
    }

    tmp = (volatile unsigned char *)mmap(0, pagesize, PROT_READ|PROT_WRITE, MAP_SHARED, fd_mem, mmap_base);
    if (tmp == (void*)-1)
    {	
        printf("mmap error : %d-%s. \n", errno, strerror(errno));
        close(fd_mem);
        return 1;
    }

    mapped_gpio = (volatile unsigned int *)((unsigned long)tmp + mmap_offset);
    
    printf(" mapped_base = %p, mapped_gpio = %p \n", tmp, mapped_gpio);

    printf("GPIO_SWPORTA_DR  = 0x%x \n",    *mapped_gpio);    //GPIO_SWPORTA_DR
    printf("GPIO_SWPORTA_DDR = 0x%x \n\n",  *(mapped_gpio+1)); //GPIO_SWPORTA_DDR

重新编译后在多个版本上验证可行。当初写这个功能程序,太匆忙,没有考虑太细致。不过也很快定位解决了。这也告诫搞研发的朋友,虽然同一套代码不修改,在不同环境上也不一定成功执行。陷阱无处不在,大家谨慎小心,写出健壮可靠的代码。

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

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

相关文章

Elasticsearch索引机制与Lucene段合并策略深度解析

引言 在现代分布式搜索引擎Elasticsearch中&#xff0c;文档的索引、更新和删除操作不仅是用户交互的核心入口&#xff0c;更是底层存储架构设计的关键挑战。本文围绕以下核心链路展开&#xff1a; 文档生命周期管理&#xff1a;从客户端请求路由到分片定位&#xff0c;从内存…

整合Jdk17+Spring Boot3.2+Elasticsearch9.0+mybatis3.5.12的简单用法

Elasticsearch是一个基于Lucene的分布式搜索和分析引擎&#xff0c;广泛应用于全文搜索、日志分析等场景。结合Spring Boot可以快速构建强大的搜索应用。本文将介绍如何在Spring Boot项目中集成和使用Elasticsearch。 ES9.0.1目前支持的包只有 elasticsearch-rest-client/ …

Ubuntu从0到1搭建监控平台:本地部署到公网访问实战教程Cpolar穿透与Docker部署全过程

文章目录 前言1.关于Ward2.Docker部署3.简单使用ward4.安装cpolar内网穿透5. 配置ward公网地址6. 配置固定公网地址总结 前言 IT运维人员是否常为服务器管理系统的复杂操作所困扰&#xff1f;当海量性能指标图表与密集预警信号同时涌现时&#xff0c;这种信息过载往往让专业团…

vscode java debug terminal 中文乱码

现象 解决 快捷键 ctrl , 进入setting 配文件添加 "terminal.integrated.automationProfile.windows": {"path": "cmd","args": ["/k","chcp","65001"]}terminal 启动时&#xff0c;活动也改为 utf-…

3D PDF如何制作?SOLIDWORKS MBD模板定制技巧

SOLIDWORKS制作3D PDF模版 SOLIDWORKS MBD能够帮助工程师以清晰直观的方式描述产品尺寸信息。在3D PDF文件中&#xff0c;用户可以自由旋转和移动视图&#xff0c;方便查看模型的各个尺寸细节。 本文将带您一步步学习如何使用SOLIDWORKS MBD制作专业的3D PDF模板&#xff0c;…

Qt DateTimeEdit(时间⽇期的微调框)

使⽤ QDateEdit 作为⽇期的微调框. 使⽤ QTimeEdit 作为时间的微调框 使⽤ QDateTimeEdit 作为时间⽇期的微调框. 这⼏个控件⽤法⾮常相似, 我们以 QDateTimeEdit 为例进⾏介绍. QDateTimeEdit 核⼼属性 属性说明dateTime时间⽇期的值. 形如 2000/1/1 0:00:00date单纯⽇期…

C# 类和继承(屏蔽基类的成员)

屏蔽基类的成员 虽然派生类不能删除它继承的任何成员&#xff0c;但可以用与基类成员名称相同的成员来屏蔽&#xff08;mask&#xff09; 基类成员。这是继承的主要功能之一&#xff0c;非常实用。 例如&#xff0c;我们要继承包含某个特殊方法的基类。该方法虽然适合声明它的…

基于vue框架的动物园饲养管理系统a7s60(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;饲养员,健康登记,工作进度,动物信息,进食信息,动物健康,动物医治,饲料信息,工作留言 开题报告内容 基于Vue框架的动物园饲养管理系统开题报告 一、研究背景与意义 &#xff08;一&#xff09;研究背景 随着城市化进程加快和公众对生…

WPS自动换行

换行前 换行后 快捷键 第一步&#xff1a;启用「自动换行」功能 选中目标单元格/区域&#xff1a;点击需要设置的单元格&#xff08;或拖动选中多个单元格&#xff09;。开启自动换行&#xff08;3种方式任选&#xff09;&#xff1a; 快捷按钮&#xff1a;在顶部菜单栏点击「…

maven中的grpc编译插件protobuf-maven-plugin详解

protobuf-maven-plugin 是 Maven 中用于编译 Protocol Buffers&#xff08;protobuf&#xff09;文件并生成对应语言代码&#xff08;如 Java、C、Python 等&#xff09;的插件。在 gRPC 项目中&#xff0c;它常被用来生成服务端和客户端所需的代码。以下是该插件的详细解析&am…

服务发现Nacos

目录 Nacos server 安装 注册服务到Nacos server 接口访问Nacos server中的已注册服务 Nacos控制台介绍 Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 在分布式服务应用中&#xff0c;各类服务需要统一的注册、统一的管理&#xff0c;这个组件工具…

社群分享:义乌|杭州电商|店群卖家,私域鱼塘运营的排单系统开源|私域鱼塘运营|返款软件开源

熟悉东哥的朋友都知道&#xff0c;我自己也运营一个电商社群&#xff0c;主要是针对玩私域|鱼塘的电商玩家。 在当前电商环境下&#xff0c;社群分享型电商、店群卖家及私域鱼塘运营者&#xff0c;面临着日益复杂的订单管理和客服调度问题。传统的人工处理不仅效率低…

C#回调函数深度解析

文章目录 前言什么是回调函数C#中实现回调的方式委托(Delegate)事件(Event)Action和FuncPredicateAsyncCallback匿名方法和Lambda表达式 回调函数实际应用场景异步编程事件处理策略模式LINQ查询 回调函数的优缺点优点缺点 最佳实践与注意事项总结相关资源 前言 在现代软件开发…

通义智文开源QwenLong-L1: 迈向长上下文大推理模型的强化学习

&#x1f389; 动态 2025年5月26日: &#x1f525; 我们正式发布&#x1f917;QwenLong-L1-32B——首个采用强化学习训练、专攻长文本推理的LRM模型。在七项长文本文档问答基准测试中&#xff0c;QwenLong-L1-32B性能超越OpenAI-o3-mini和Qwen3-235B-A22B等旗舰LRM&#xff0c…

低代码——表单生成器以form-generator为例

主要执行流程说明&#xff1a; 初始化阶段 &#xff1a; 接收表单配置对象formConf深拷贝配置&#xff0c;初始化表单数据和验证规则处理每个表单组件的默认值和特殊配置&#xff08;如文件上传&#xff09; 渲染阶段 &#xff1a; 通过render函数创建el-form根组件递归渲染表…

linux centos 服务器性能排查 vmstat、top等常用指令

背景:项目上经常出现系统运行缓慢,由于数据库服务器是linux服务器,记录下linux服务器性能排查常用指令 vmstat vmstat介绍 vmstat 命令报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。由 vmstat 命令生成的报告可以用于平衡系统负载活动。系统范围内的这…

LiveGBS国标视频平台收流模式:UDP、TCP被动与TCP主动传输模式之差异剖析

LiveGBS国标视频平台收流模式&#xff1a;UDP、TCP被动与TCP主动传输模式之差异剖析 1、背景2、信令传输3、视频流传输3.1、UDP传输模式3.2、TCP被动传输模式3.3、TCP主动传输模式 4、WEB配置流传输模式4.1、编辑模式4.2、下拉切换模式 5、搭建GB28181视频直播平台 1、背景 在…

Tomcat 使用与配置全解

一、 Tomcat简介 Tomcat服务器是Apache的一个开源免费的Web容器。它实现了JavaEE平台下部分技术规范&#xff0c;属于轻量级应用服务器。 1. Tomcat版本 Tomcat版本 JDK版本 Servlet版本 JSP版本 10.0.X 8 and later 5.0 3.0 9.0.x 8 and later 4.0 2.3 8.0.x 7…

aws instance store 的恢复

1: aws instance store 要在launch instance 才可以创建,而且,通过snapshot 恢复后,instance store 里面的数据会丢失。 下面是创建instance store 的过程,和通过两种方式恢复,发现/etc/fstab 不同的写法,有的不能启动: [root@ip-xx ~]# lsblk NAME MAJ:MIN RM …

EasyRTC音视频实时通话助力微信小程序:打造低延迟、高可靠的VoIP端到端呼叫解决方案

一、方案概述​ 在数字化通信浪潮下&#xff0c;端到端实时音视频能力成为刚需。依托庞大用户生态的微信小程序&#xff0c;是实现此类功能的优质载体。基于WebRTC的EasyRTC音视频SDK&#xff0c;为小程序VoIP呼叫提供轻量化解决方案&#xff0c;通过技术优化实现低延迟通信&a…