ioremap在中断处理函数中会导致错误

2023-10-28 07:18

本文主要是介绍ioremap在中断处理函数中会导致错误,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 http://bbs.chinaunix.net/thread-1960842-1-1.html

 


linux中是无法直接对外设的地址直接进行访问的,所以在这个时候必须要通过ioremap函数对外设的物理地址进行映射,然后通过ioread,iowrite等函数进行读写。
    我现在就在使用这个函数的时候遇到了一个问题,我现在要写一个关于外设的中断处理函数,在外设发出中断时会对一个寄存器赋值,然后我需要在中断处理函数中对这个寄存器进行读值,判断中断类型,然后进行具体的操作。
    现在问题出现在,如果我直接在中断处理函数中直接调用ioremap函数,板子就会直接死掉,通过printk能确定是在执行ioremap函数的时候死掉的; 但如果通过,工作队列,把这部操作放在中断下半部中则没有问题,但下半部又可能会被跟高优先级任务给抢占,所以。。。
   感觉比较困惑,按道理说应该是能访问的,但不知为什么会出错,是ioremap函数运行的具体过程中进行了一些中断处理函数所禁止的操作吗?

    希望哪位达人能跟小弟指点一下,多谢,感激不尽~


  我的linux内核是linux-2.6.24 , 板子是ppc。


CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷


我刚大致看了一下ioremap的实现源码,在这个函数里面主要是调用了get_vm_area这个函数,而get_vm_area里在分配内存空间时,使用的是kmalloc(   , GFP_KERNEL),  这个函数可能会阻塞, 可能是这个问题。
  我现在把他改成GFP_ATOMIC,正在编译内核,还不知道能不能成功。  waiting~


CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷
 

对于内存映射这种操作应该在驱动初始化的时候去做,而不应该在中断中作,
中断中是不能休眠的, 你在中断处理函数里 ioremap , 可能会引起休眠,
中断中休眠的结果就是 kernel 会死掉。

另外,你绝不应该去修改get_vm_area 中的 kmalloc 标志,你应该去修改你的驱动程序。


CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷
 

呵呵,第一次听说在中断中去remap的,难道就不能驱动加载的时候remap好吗?

所有的硬件硬件驱动我觉得都是一上来就映射好的
__________________________________
助人者自助之


CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷
 

还有,你改成GFP_ATOMIC是会好的,这个我试过,只要改成GFP_ATOMIC就可以在中断中调用kamalloc。
虽然表面上看起来没事,但我想肯定是不推荐的。
__________________________________
助人者自助之


CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷
 

谢谢,我按照楼上所说的,通过全局变量,在初始化时建立映射关系的方法,终于把这个问题解决了,真的非常感谢。 由于我是刚接触驱动编写不久,可能有些问题考虑不到,还请大家见谅~


CU 移动开发好书送不停!| Android应用开发有奖自测 | 企业级3G路由知识问答挑战赛| 家居装修有奖调查问卷
 

 

这篇关于ioremap在中断处理函数中会导致错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/291592

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

【经验交流】修复系统事件查看器启动不能时出现的4201错误

方法1,取得『%SystemRoot%\LogFiles』文件夹和『%SystemRoot%\System32\wbem』文件夹的权限(包括这两个文件夹的所有子文件夹的权限),简单点说,就是使你当前的帐户拥有这两个文件夹以及它们的子文件夹的绝对控制权限。这是最简单的方法,不少老外说,这样一弄,倒是解决了问题。不过对我的系统,没用; 方法2,以不带网络的安全模式启动,运行命令行,输入“ne

DAY16:什么是慢查询,导致的原因,优化方法 | undo log、redo log、binlog的用处 | MySQL有哪些锁

目录 什么是慢查询,导致的原因,优化方法 undo log、redo log、binlog的用处  MySQL有哪些锁   什么是慢查询,导致的原因,优化方法 数据库查询的执行时间超过指定的超时时间时,就被称为慢查询。 导致的原因: 查询语句比较复杂:查询涉及多个表,包含复杂的连接和子查询,可能导致执行时间较长。查询数据量大:当查询的数据量庞大时,即使查询本身并不复杂,也可能导致

FreeRTOS学习笔记(四)Freertos的中断管理及临界保护

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Cortex-M 中断管理1.1 中断优先级分组1.2 相关寄存器1.3 相关宏定义1.4 FreeRTOS 开关中断 二、临界段及其保护2.1 taskENTER_CRITICAL( ) 和 taskEXIT_CRITICAL( )2.2 taskENTER_CRITICAL_FROM_ISR( )

SQL2005 性能监视器计数器错误解决方法

【系统环境】 windows 2003 +sql2005 【问题状况】 用户在不正当删除SQL2005后会造成SQL2005 性能监视器计数器错误,如下图 【解决办法】 1、在 “开始” --> “运行”中输入 regedit,开启注册表编辑器,定位到 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVer

71-java 导致线程上下文切换的原因

Java中导致线程上下文切换的原因通常包括: 线程时间片用完:当前线程的时间片用完,操作系统将其暂停,并切换到另一个线程。 线程被优先级更高的线程抢占:操作系统根据线程优先级决定运行哪个线程。 线程进入等待状态:如线程执行了sleep(),wait(),join()等操作,使线程进入等待状态或阻塞状态,释放CPU。 线程占用CPU时间过长:如果线程执行了大量的I/O操作,而不是CPU计算

ssm 之事务管理出现错误

JDBC Connection will not be managed by Spring 项目采用的是分布式架构,分别有controller,service,solr三个服务器,之间通过dubbo进行调用,经过测试发现事务配置完以后不能通过spring进行管理,其中两条insert和一条update语句都执行完毕,异常并没有使得事务进行回滚,通过调取debug日志发现“JDBC Conn

Unstructured cannot write mode RGBA as JPEG 错误解决

Unstructured cannot write mode RGBA as JPEG 错误解决 0. 错误详细1. 解决方法 0. 错误详细 Image Extraction Error: Skipping the failed imageTraceback (most recent call last):File "/root/miniconda3/envs/learn-y