内核提供的读写寄存器接口实现可移植性

发布者:EternalWhisper最新更新时间:2025-02-06 来源: cnblogs关键字:内核  读写寄存器  可移植性 手机看文章 扫描二维码
随时随地手机看文章

arm是IO与内存统一编址,其他平台如x86是IO与内存独立编址访问方式不一样,使用内核提供的寄存器读写接口writelreadl具有可移植性


在文章随笔–Linux字符设备驱动开发基础前面写的驱动在静态映射操作寄存器,都用#define rGPJ0CON *((volatile unsigned int *)GPJ0CON)的方式来访问寄存器,这样的做法在驱动中并不是很好,因为这样的做法在不同平台的情况下不具有可移植性。现在写的驱动是在ARM平台下去写的,ARM属于内存和IO统一编址的,在读写寄存器的时候即为进行IO操作,进行IO操作是和读写内存是一样的(IO也有个地址),这就叫统一编址。但是还有另外一些CPU(像x86)是非统一编址的,这种CPU在进行IO操作时的方法跟进行内存的读写的方法是不一样的。那么在这种情况下就有一种问题,如果写的驱动不仅要求在ARM下能够运行,还要求在X86下也要能够运行,如果还用#define rGPJ0CON *((volatile unsigned int *)GPJ0CON)的方式显然是不合适的,需要进行比较大的修改。我们要怎样才能够使他能够具有很强的移植性呢?——内核已经帮我们想好了办法,即内核提供访问寄存器的读写接口(函数),使用这些函数具有可移植性。其实现的原理就是用条件编译,如下比较:


blog007


代码示例(静态映射):


...

#include gpio.h>     //虚拟地址映射表

#include  

#include <linux/io.h>

#include


#define GPJ0CON     S5PV210_GPJ0CON

#define GPJ0DAT     S5PV210_GPJ0DAT

...

    ...

    writel(0x11111111, GPJ0CON);

    writel(((0<<3) | (0<<4) | (0<<5)), GPJ0DAT);


...

代码示例(动态映射):


#include

#include

...

#define GPJ0CON_PA  0xe0200240  //要操作的寄存器的物理地址


#define S5P_GPJ0REG(x)      (x)

#define S5P_GPJ0CON         S5P_GPJ0REG(0)

#define S5P_GPJ0DAT         S5P_GPJ0REG(4)


static void __iomem *baseaddr;  // 寄存器的虚拟地址的基地址,用来保存 ioremap的返回值

...

    ...

    if (!request_mem_region(GPJ0CON_PA, 8, 'GPJ0BASE'))  //内存资源申请

        return -EINVAL;

    baseaddr = ioremap(GPJ0CON_PA, 8);


    writel(0x11111111, baseaddr + S5P_GPJ0CON);

    writel(((0<<3) | (0<<4) | (0<<5)), baseaddr + S5P_GPJ0DAT);


...


关键字:内核  读写寄存器  可移植性 引用地址:内核提供的读写寄存器接口实现可移植性

上一篇:uboot总结:uboot配置和启动过程1(主Makefile分析)
下一篇:代码示例_poll的多路复用

推荐阅读最新更新时间:2026-03-20 11:22

B001-Atmega16-16位寄存器读写步骤
临时寄存器TEMP 8位总线一次只能读写取8位数据,所以读写16位寄存器时、使用8位的临时寄存器TEMP来保存另一半的8位数据。 一个定时器只有1个临时寄存器TEMP,所以读写其他16位寄存器时,临时寄存器TEMP将被修改成当前的16位寄存器的高字节或低字节。 所以读取16位寄存器的过程中需要禁止中断,避免中断处理过程中有读写其他16位寄存器的操作, 这会修改临时寄存器TEMP的当前值,导致中断返回后临时寄存器TEMP已被修改。 读写低字节、将触发16位的读写。 -- 为了简化问题,在中断中不要读写16位寄存器 读16位定时器的步骤: in r18,SREG ; 保存全局中断标志 cli
[单片机]
B001-Atmega16-16位<font color='red'>寄存器</font>的<font color='red'>读写</font>步骤
stm32 直接读写寄存器代码风格总结
简单的总结了一下stm32 寄存器读写代码风格,以备后用: 根据memory mapping 直接写寄存器代码风格: #define GPIOA_BASE1 (uint32_t)0x40010800 #define GPIOA_CRH ((uint32_t*)(GPIOA_BASE1+0x04)) 转换为指针之后,直接读写: *GPIOA_CRH=0x000004B0; //A端口 //复用推挽输出 结构体指针解决连续多个寄存器读写设置: #define Usart1_BASE 0x40013800 typedef struct { __IO uint32_t SR; __IO
[单片机]
stm32 直接<font color='red'>读写</font><font color='red'>寄存器</font>代码风格总结
32位单片机的应用可移植性——现实还是神话?
2008 年11月,ARM®宣布推出 Cortex™ 微控制器软件接口标准 (Microcontroller Software Interface Standard,CMSIS)。他们声称,对于新器件的软件开发项目或将现有软件在不同芯片厂商的基于 Cortex-M 的单片机之间移植时,这项标准可降低软件设计成本。这听起来很不错,但事实确实如此吗?本文将对这些说法进行研究以确定其真实度。我们先回顾一下典型单片机的元件,然后观察在典型外设固件库上添加一个抽象层能够实现或无法实现什么样的结果。 根据 ARM 所言,CMSIS 是“适用于 Cortex-M 处理器系列的与厂商无关的硬件抽象层。CMSIS为不同芯片厂商和中间件提供商的处
[单片机]
浅谈Win CE应用程序的可移植性
  由于桌面Windows绝大多数情况下运行于X86平台上,也就不存在不同平台的可移植性问题。然而Windows CE运行在四大架构(X86,SHx,MIPS,ARM)的CPU上,编写应用程序时就需要考虑它的移植。                以下通过在wince系统下访问物理地址,来看看如何编写可移植性较好的应用程序。                首先必须明确两个概念。                1. 在X86平台下才有I/O地址这一说,在其他体系的CPU(如ARM/MIPS)下是没有I/O端口的。因为X86下把I/O和存储器分开编址,导致其有两种地址;而别的CPU是把两者统一编址,即把I/O映射到存储器上。
[嵌入式]
嵌入式系统硬件抽象层的建立及软件的可移植性设计
摘要:在阐述嵌入式系统软件设计方法的基础上,介绍嵌入式系统底层软件可移值性设计和硬件抽象层的建立;举例说明利用此思想的嵌入式软件的设计及测试过程。 关键词:设备驱动程序 嵌入式系统 软件设计 可移植性 1 嵌入式系统设计   由于嵌入式系统有着体积小、功能集中、可靠性高等优点,已被广泛地应用到日常生活的各个方面,如移动通信、工业控制、医疗器械,家用电器等。如何缩短嵌入式系统的开发周期,降低开发成本,以及提高产品的可靠性已成为嵌入式行业普遍关注的问题。在嵌入式系统设计中,通常采用以下设计方法。 (1)瀑布模式开发过程   瀑布模式开发过程工作模式简单,任务的划分协调及人员安排、物质材料的分配管理都比较容易。如图1所示,开发
[嵌入式]
Linux 内核将引入缓存感知调度,性能最高提升 44%
12 月 31 日消息,科技媒体 NeoWin 昨日(12 月 30 日)发布博文,报道称 Linux 发行版系统即将通过内核补丁,引入名为“缓存感知调度”(Cache Aware Scheduling,简称 CAS)的关键功能,在某些特定任务场景下,预计最高提升 44% 性能。 援引博文介绍,“缓存感知调度”是一种先进的操作系统任务调度技术,其核心理念是让系统调度器能够“感知”并理解 CPU 内部的缓存结构布局。 在分配计算任务过程中,调度器会优先将任务安排在能够最大化利用缓存数据的核心上。这样做的最终目的,是尽可能提高缓存命中率(即 CPU 能在高速缓存中直接找到所需数据),同时最大限度地减少缓存未命中(需要从更慢的内存中读取
[嵌入式]
Microchip推出SDI IP内核与四通道CoaXPress™桥接工具包,扩展PolarFire@ FPGA视频生态系统
Microchip推出SDI IP内核与四通道CoaXPress™桥接工具包,进一步扩展PolarFire ® FPGA智能嵌入式视频生态系统 该解决方案协议栈适用于下一代医疗、工业及机器人视觉应用,支持广播级视频质量、SLVS-EC至CoaXPress桥接功能及超低功耗运行 Microchip Technology Inc.(微芯科技公司)今日宣布 扩展其 PolarFire ® FPGA 智能嵌入式视频生态系统,助力开发者实现可靠、低功耗且高带宽的视频连接。 该嵌入式视觉解决方案协议栈整合了硬件评估工具包、开发工具、IP 内核及参考设计,可简化开发流程、增强安全性并加速产品上市。该协议栈包含串行数字接口(SDI)接收(
[嵌入式]
Microchip推出SDI IP<font color='red'>内核</font>与四通道CoaXPress™桥接工具包,扩展PolarFire<sup>@</sup> FPGA视频生态系统
STM32MP157 Linux系统移植开发篇12:Linux内核MIPI LCD驱动移植
本文章为《STM32MP157 Linux系统移植开发篇》系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板)。stm32mp157是ARM双核,2个A7核,1个M4核,A7核上可以跑Linux操作系统,M4核上可以跑FreeRTOS、RT-Thread等实时操作系统,STM32MP157开发板所以既可以学嵌入式linux,也可以学stm32单片机。针对FS-MP1A开发板,除了Linux系统移植篇外,还包括其他多系列教程,包括Cortex-A7开发篇、Cortex-M4开发篇、扩展板驱动移植篇、Linux应用开发篇、FreeRTOS系统移植篇、Linux驱动开发篇、硬件设计篇、人工智能机器
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved