中断中I2C通信导致进程调度或者睡眠

I2C驱动中的中断处理机制全面讲解 剖析I2C通信中中断驱动的核心原理与实现方式,详解如何通过中断优化数据传输效率,提升系统响应速度,掌握i2c总线在复杂场景下的稳定交互策略。 阅读详情

谢谢,第一次碰到,我有个i2c的设备驱动,在中断里进行读写,就碰到以下情况,不知道是不是使用mutex_lock引起的.

出错的地方在i2c转串口(SC16IS740)的驱动程序里,该模块申请了一个IRQ中断,
中断处理函数是serial_sc16is7_interrupt(),在这个函数里
要调用i2c-core模块里的i2c_smbus_read_byte_data()函数读I2C总线,
但这时系统就panic掉了。

内核版本是2.6.21,下面是出错信息。
---------------------------------------------------------
<3>BUG: scheduling while atomic: swapper/0x00010000/0
<3>bad: scheduling from the idle thread!
<1>Unable to handle kernel NULL pointer dereference at virtual address 00000000
<1>pgd = c0004000
<1>[00000000] *pgd=00000000

Internal error: Oops: 17 [#1]
Modules linked in: nmeapipe gtspmdev

CPU: 0
PC is at dequeue_task+0xc/0x84
LR is at deactivate_task+0x34/0x40
pc : [<bf06633c>] lr : [<bf0666c0>] Not tainted
sp : c0009cec ip : c0009d00 fp : c0009cfc
r10: 00000005 r9 : b9a0f85d r8 : c00129b8
r7 : 00000002 r6 : c00129b8 r5 : c0008000 r4 : c00129b8
r3 : 00000080 r2 : 00000080 r1 : 00000000 r0 : c00129b8
Flags: nZCv IRQs off FIQs on Mode SVC_32 Segment kernel
Control: 317F
Table: 103C8000 DAC: 00000017
Process swapper (pid: 0, stack limit = 0xc0008250)
Stack: (0xc0009cec to 0xc000a000)
9fe0: 9fe0: c002f364 c002f364 c00137a4 c00137a4 00000000 00000000 c0009ff8 c0009ff8 00040070 00040070 bf0408ac bf0408ac 00000000 00000000 00000000 00000000

Backtrace:
[<bf066330>] (dequeue_task+0x0/0x84) from [<bf0666c0>] (deactivate_task+0x34/0x40)
r4 = C00129B8

[<bf06668c>] (deactivate_task+0x0/0x40) from [<bf1f2410>] (schedule+0x1b0/0x744)
r4 = 00000005

[<bf1f2260>] (schedule+0x0/0x744) from [<bf1f375c>] (__mutex_lock_slowpath+0x5c/0x88)
[<bf1f3700>] (__mutex_lock_slowpath+0x0/0x88) from [<bf1f36d4>] (mutex_lock+0x20/0x28)
r7 = C0074054 r6 = C0009DB8 r5 = 00000002 r4 = C0074034
[<bf1f36b4>] (mutex_lock+0x0/0x28) from [<bf165098>](i2c_transfer+0x38/0x64)
[<bf165060>] (i2c_transfer+0x0/0x64) from [<bf165674>] (i2c_smbus_xfer+0x350/0x464)
r7 = 00000002 r6 = 00000000 r5 = C0009DB8 r4 = 00000000
[<bf165324>] (i2c_smbus_xfer+0x0/0x464) from [<bf165a1c>] (i2c_smbus_read_byte_data+0x44/0x58)
[<bf1659d8>] (i2c_smbus_read_byte_data+0x0/0x58) from [<bf167fb0>] (Sc16is7xx_Read_Register+0x38/0x44)
[<bf167f78>] (Sc16is7xx_Read_Register+0x0/0x44) (from [<bf150480>] (serial_in+0x20/0x28)
r4 = 00000000

[<bf150460>] (serial_in+0x0/0x28) from [<bf1506a4>] (serial_sc16is7_interrupt+0x34/0xcc)
[<bf150670>] (serial_sc16is7_interrupt+0x0/0xcc) from [<bf08ae30>](handle_IRQ_event+0x44/0x80)
[<bf08adec>](handle_IRQ_event+0x0/0x80) from [<bf08bffc>] (handle_simple_irq+0x80/0xb4)
r7 = C001D96C r6 = 000000AE r5 = 000000AE r4 = C000EB80
[<bf08bf7c>] (handle_simple_irq+0x0/0xb4) from [<bf064a70>] (gpio_irq_handler+0x1ac/0x234)
r5 = 00000001 r4 = C000EB80

[<bf0648c4>] (gpio_irq_handler+0x0/0x234) from [<bf05813c>] (asm_do_IRQ+0x44/0x5c)
[<bf0580f8>] (asm_do_IRQ+0x0/0x5c) from [<bf057424>](__irq_svc+0x24/0x80)
r7 = C0048E04 r6 = FFFFFFFF r5 = FEFECB00 r4 = FFFFFFFF
[<bf058340>] (cpu_idle+0x0/0x7c) from [<bf056c24>] (rest_init+0x24/0x2c)
r6 = C000AF28 r5 = C002EEA8 r4 = C0037C00
[<bf056c00>] (rest_init+0x0/0x2c) from [<bf040b18>] (start_kernel+0x27c/0x2e4)
[<bf04089c>] (start_kernel+0x0/0x2e4) from [<00040070>] (0x40070)
r6 = C00137A4 r5 = C002F364 r4 = 0000317D

Code:c0030148 e1a0c00d e92dd810 e24cb004 (e5913000)

<0>Kernel panic - not syncing: Aiee, killing interrupt handler!
--------------------------------------------------------- 

 
/*kernel/drivers/i2c/i2c-core.c*/
int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num)
{
int ret;

if (adap->algo->master_xfer) {
#ifdef DEBUG
for (ret = 0; ret < num; ret++) {
dev_dbg(&adap->dev, "master_xfer[%d] %c, addr=0x%02x, "
"len=%d%s\n", ret, (msgs[ret].flags & I2C_M_RD)
? 'R' : 'W', msgs[ret].addr, msgs[ret].len,
(msgs[ret].flags & I2C_M_RECV_LEN) ? "+" : "");
}
#endif

mutex_lock_nested(&adap->bus_lock, adap->level);
ret = adap->algo->master_xfer(adap,msgs,num);
mutex_unlock(&adap->bus_lock);

return ret;
} else {
dev_dbg(&adap->dev, "I2C level transfers not supported\n");
return -ENOSYS;
}
}

---------------
这里的mutex_lock_nested 与mutex_lock有什么区别啊,跟中断有没有关系呢?
 
 
从 Backtrace 来看,应该是 i2c_transfer 中调用 mutex_lock 导致 schedule 调用
而产生 进程调度,导致死机. 而在中断上下文,这种情况是绝对不允许发生的.换句话说是不允许
睡眠的,不允许进程调度. 

你可以 把 mutex_lock 注释掉再试试 .
另外你的内核是什么版本?
 

 

STM32 I2C中断模式应用:高效数据传输方案 深入解析STM32如何利用i2c协议与中断机制结合,提升数据传输效率。通过实际应用案例展示中断模式在避免轮询开销、增强系统响应性方面的优势,帮助开发者掌握更高效的i2c协议通信设计方法。 阅读详情

相关推荐

深入RK3568 I2C总线锁机制:从i2c_transfer看Linux并发控制设计

本文深入剖析了RK3568平台I2C总线并发控制机制,重点解析了i2c_transfer函数如何根据执行上下文动态选择锁策略。通过分析in_atomic()与irqs_disabled()的判断逻辑,揭示了Linux内核在原子上下文与进程上下文中分别使用i2c_trylock_bus和i2c_lock_bus的并发控制设计,为嵌入式驱动开发者提供了调试和优化I2C总线访问的实践指南。

java5的博客 864

MIPS 系统 跑应用程序报bad: scheduling from the idle thread!错误,什么情况呢?

[ 378.520104] bad: scheduling from the idle thread! [ 378.525371] BUG: scheduling while atomic: swapper/0/0x00000102 [ 378.531808] bad: scheduling from the idle thread! [ 378.537047] BUG: scheduli...

庄山浪水 2873

使用DMA优化I2C驱动传输性能实践

通过引入DMA机制优化I2C驱动,显著降低CPU负载并提升数据传输稳定性,实践验证了i2c通信性能的实质性改善,适用于高频率、大数据量场景下的i2c外设控制。

weixin_34268462的博客 682

"BUG: scheduling while atomic"和"bad: scheduling from the idle thread"错误分析

linux内核中断处理函数中同步方法 "BUG: scheduling while atomic"错误分析 "bad: scheduling from the idle thread"错误分析

5684

避坑指南:STM32L431睡眠模式唤醒不了的元凶——SysTick中断处理详解

本文深入分析了STM32L431睡眠模式唤醒失败的常见原因,重点解析了SysTick中断处理对低功耗设计的影响。通过代码示例和排查思路,帮助开发者解决睡眠模式失效问题,优化中断管理策略,实现稳定可靠的嵌入式低功耗应用。

weixin_33725722的博客 393

基于TC3的I2C中断机制:汽车电子系统全面讲解

深入剖析TC3微控制器中i2c中断的工作原理及其在汽车电子系统中的实际应用,结合i2c中断与tc3特性,提升通信效率与系统响应能力,为车载设备稳定运行提供可靠支持。

weixin_29997223的博客 844

Linux驱动调试之段错误分析_根据pc值确定出错的代码位置

Linux驱动调试之段错误分析_根据pc值确定出错的代码位置

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 2449

TC3系列芯片I2C中断详解:汽车级可靠性核心要点

深入解析TC3系列芯片的i2c中断工作机制,结合汽车级可靠性需求,探讨中断配置、异常处理及稳定通信的关键设计细节,为高安全场景提供技术支撑。

weixin_42355400的博客 271

Linux i2c子系统(一) _动手写一个i2c设备驱动

i2c总线是一种十分常见的板级总线,本文以linux3.14.0为参考, 讨论Linux中的i2c驱动模型并利用这个模型写一个mpu6050的驱动, 最后在应用层将mpu6050中的原始数据读取出来 i2c子系统框架 下图就是我理解的i2c驱动框架示意图, 类似中断子系统, i2c子系统中也使用一个对象来描述一个物理实体, 设备对象与驱动分离, 驱动结合设备对象对硬件设备的描述才可以驱动一个具体的...

weixin_33675507的博客 426

智能眼镜中I2C HID中断处理机制的设计与验证

深入探讨智能眼镜中i2c hid通信的中断处理机制,通过实际设计与测试验证其响应效率与稳定性,为可穿戴设备中i2c hid交互提供可靠技术路径。

weixin_34162851的博客 651

STM8L I2C通信协议程序设计与实战

本文还有配套的精品资源,点击获取 简介:STM8L_I2C.rar资源压缩包提供了STM8L152C6微控制器的I2C通信协议程序代码。该代码支持STM8L系列超低功耗8位微控制器,适用于电池供电的嵌入式系统。程序实现包括初始化、数据传输和错误处理,通过配置SCL和SDA的GPIO引脚及I2C时钟频率来控制通信。压缩包内还包含STM8L I2C通信的详细步骤和测试确认,为开...

weixin_36001279的博客 1003

中断处理程序里不能操作I2C操作接口

在内核里中断处理程序里不能操作I2C操作接口,因为操作I2C_transfer时transfer内部也会有中断产生的。所以中断套中断这样就会死锁。

qq160816的专栏 2386

大陆毫米波雷达ARS408-21xx实战:从零搭建ROS环境下的目标检测与可视化

本文详细介绍了大陆毫米波雷达ARS408-21xx在ROS环境下的实战部署全流程。从硬件连接、CAN总线配置,到ROS驱动节点开发、CAN报文解析,再到RViz三维可视化实现,提供了完整的代码示例与调试技巧,帮助开发者快速搭建毫米波雷达目标检测与可视化系统。

open4的博客 633

Linux内核驱动——中断子系统与 I2C 子系统

本文介绍了Linux内核中的中断子系统和I2C子系统架构及其实现。中断子系统采用"顶半部+底半部"设计,顶半部快速响应中断,底半部处理耗时操作,支持tasklet(不可休眠)和workqueue(可休眠)两种实现方式。I2C子系统采用分层设计,包含总线驱动层、核心层和设备驱动层,以LM75温度传感器为例展示了设备树配置、驱动注册、数据传输和应用层数据解析的全流程。两个子系统可结合使用实现高效的事件触发和通信机制,开发时需注意资源管理、阻塞处理和数据结构配置等关键点。

lufrednow_的博客 786

【NTN 卫星通信】使用地面网络和卫星网络接入的终端应用场景

卫星接入有广覆盖的特点, 可以改善地面接入网覆盖或无线条件差的地区(例如多径干扰)的服务可用性。对于高速移动中需要实时业务的终端,如IMS语音/视频会议,可以通过地面接入和卫星接入同时实现与5G系统的双连接,在地面接入网不可用的情况下获得连续可靠的业务。

weixin_43603524的博客 2558

医学图像分割评价指标详解:从Dice到MSD的实战解析

本文深入解析医学图像分割的核心评价指标,从最常用的Dice相似系数到衡量边界精度的MSD(最大对称表面距离),通过实战案例与代码演示,系统阐述各指标的计算原理、应用场景及临床意义,帮助读者全面评估模型性能。

weixin_29070721的博客 593

I2C中断TC3向量表配置操作指南

深入讲解I2C中断机制及TC3向量表的配置方法,帮助开发者准确实现中断响应流程。通过实际操作指导,掌握i2c中断触发条件与tc3向量入口设置的关键步骤,提升嵌入式系统实时处理能力。

weixin_42527589的博客 880

CE 7.4中文版实战:如何用自动汇编功能快速生成游戏修改器(附CT表保存技巧)

本文详细介绍了CE 7.4中文版中自动汇编功能的使用方法,帮助用户快速生成游戏修改器。从环境配置、内存地址定位到自动汇编代码注入,再到CT表保存和独立EXE生成,提供全流程实战指南,适合逆向工程爱好者和游戏修改器开发者。

keras9composer的博客 357

5、i2c总线通信方法

i2c

qq_35231482的博客 363

Autodesk Genuine Service卸载失败?试试这个隐藏文件删除法(Win8-Win11通用)

本文针对Autodesk Genuine Service在Windows系统(Win8-Win11)中卸载失败的常见难题,提供了深度解析与根治方案。核心方法是手动定位并删除两个关键的隐藏文件(ProductInformation.pit和id.dat),以解除文件锁定或数据损坏导致的卸载障碍,随后再通过标准流程即可成功卸载。该方法通用性强,能有效解决这一困扰设计师和工程师的顽固问题。

weixin_29220405的博客 1477

Kimi K3大模型API实战:从调用到本地知识库问答系统构建

大语言模型(LLM)作为人工智能的核心技术,通过海量数据训练获得理解和生成自然语言的能力。其工作原理基于Transformer架构,通过自注意力机制捕捉长距离依赖关系。这项技术的核心价值在于能够将非结构化文本转化为可计算、可交互的智能体,极大地提升了信息处理和自动化任务的效率。在应用场景上,大模型广泛应用于智能对话、代码生成、文档总结与问答等领域。其中,国产大模型如月之暗面推出的Kimi K3,凭借其在**长文本处理**和**中文场景优化**方面的优势,为开发者提供了新的技术选项。本文将以Kimi K3为例

weixin_30694389的博客 299

基于UART的中断通信机制深度剖析与应用实例

剖析UART中断通信的核心原理,结合实际应用场景,详解数据收发过程中的中断处理机制。通过典型实例展示如何高效利用uart实现稳定通信,提升嵌入式系统实时性与响应效率。

weixin_35370061的博客 1059

《QGIS快速入门与应用基础》230:添加图例工具

本文系统讲解QGIS图例制作的核心方法与优化技巧。首先强调图例与地图框的绑定逻辑,提出三种绑定状态及适用场景。详细拆解三种图例添加方法:布局工具栏一键添加法(新手首选)、菜单栏添加法和右键快捷创建法,并给出单地图框和多地图框两种典型场景的规范技巧。重点解决新手常见的图例杂乱、样式不规范、内容脱节等问题,帮助用户从基础图例制作进阶到符合行业标准的专业图例设计。通过分步操作图示和实用技巧,使读者能够快速掌握图例创建的核心流程与优化方法。

LuckyHanMo的博客 551

I2C中断TC3驱动开发:手把手教程(从零实现)

深入讲解在TC3平台上从零实现I2C中断驱动的全过程,涵盖配置、调试与关键代码解析,帮助掌握i2c中断和tc3在实际项目中的应用技巧。

weixin_42113456的博客 446

PyCharm 接入 OpenAI Codex CLI 的 4 步配置与调试实录

揭示 Codex CLI 在 PyCharm 中上下文失稳的四大根源:CLI 启动模式与 IDE 进程模型冲突、stdin/stdout 流式处理不兼容、环境变量污染、AST 注释缺失,并给出基于 Shell 脚本桥接与结构化上下文注入的稳定接入方案。

weixin_42627902的博客 374

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

基于Kinetis SDK与FreeRTOS的I2C多任务通信实战指南

I2C总线作为一种广泛应用的串行通信协议,以其简单的两线制(SCL、SDA)和多主从架构,成为连接传感器、存储器等外设的通用标准。其工作原理基于主从设备间的时钟同步与数据应答机制,确保了通信的可靠性。在嵌入式系统中,I2C的价值在于以极少的硬件资源实现多设备互联。然而,当系统需要处理多个并发任务时,传统的裸机轮询方式会面临代码臃肿和实时性差的挑战。此时,引入实时操作系统(RTOS)进行任务调度与管理,成为提升系统模块化和响应能力的关键。本文聚焦于**Kinetis SDK**与**FreeRTOS**的深度

a631278993的博客 397

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: Copy_from_user函数详细分析
下一篇: Linux 同步方法剖析
tron
博客等级 码龄17年 123粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值