如何在linux驱动程序保存文件

news/2025/10/21 10:26:45/文章来源:https://www.cnblogs.com/junghoo/p/19154237

碰到问题:项目中发现ADC提取的数据,偶尔有个别好像是上次采集的数据,需要查找在哪一环节出错了,因此需要保存驱动中DMA刚完成时的数据和应用程序处理完发送包的数据。应用程序比较容易,直接保存文件就行了,驱动程序在内核层如何做呢?查找了一些资料,发现在内核中需要使用filep_open函数来获取struct file结构,然后针对struct file可以写文件,最后使用filp_close函数关闭打开的文件,初步整出以下代码:
static int kernel_file_delete(char *file_path1)
{
struct path path;

int ret = kern_path(file_path1, LOOKUP_FOLLOW, &path);
if (ret) return ret;ret = vfs_unlink(d_inode(path.dentry->d_parent), path.dentry, NULL);path_put(&path);
return ret;

}

static ssize_t kernel_file_write(unsigned char *buf,int count, struct file *target_file)
{
mm_segment_t old_fs;

old_fs = get_fs();
set_fs(KERNEL_DS);

// ret = vfs_write(target_file, buf, count, &target_file->f_pos);
loff_t pos = 0;
printk("targetfile=%lx,buf=%lx,count=%d\n",target_file,buf,count);
ssize_t ret = kernel_write(target_file, buf, count, &pos); if (ret < 0) {
printk("Write failed: %d\n", ret);
return ret;
}

set_fs(old_fs);
return ret;

}

static int kernel_file_close(struct file *target_file)
{
filp_close(target_file, NULL);
}
//====================================================================================
struct file *target_file;
unsigned char *buf=(unsigned char *)p_adc_dev->dsts[0];
buf+=0x1E84;// add 0.5S@3906 sample rate
sprintf(file_path,"/kernel_data%02d.bin",p_adc_dev->layout_index);
printk("--channel%02d--1 ",p_adc_dev->current_transfer_index);
kernel_file_delete(file_path);
printk("2 ");
target_file = filp_open(file_path, O_CREAT|O_WRONLY, 0644);
if (IS_ERR(target_file)) {
printk("Failed to open %s\n", file_path);
}
printk("3 ");
kernel_file_write(buf,(p_adc_dev->bytes_cur_transfer-0x1E84),target_file);
printk("4 ");
vfs_fsync(target_file,0);
printk("5 ");
kernel_file_close(target_file);
printk("6\n");

但是在实际使用中,发现每次运行到了都会内核崩溃,考虑可能是写文件的地方在中断的原因,因此引出第二个问题:如何把对文件的操作移到中断函数之外?
综合考虑,可以使用linux内核的工作队列方式,因此得出以下代码:
首先在设备结构体中加入work_struct,并且在probe函数中初始化work
struct axi_adc_dev
{
。。。
dev_t dev_node;
bool f_on; /* flag indicates this ADC is configured to ON */
ktime_t startTime;
int abort;
int aborted;
struct work_struct my_work;
};

static int axi_adc_probe(struct platform_device *pdev)
{
。。。。
INIT_WORK(&aad->my_work,writefile_work_func);

if (dev_index == 0)
{。。。。

}

然后在中断处理程序的上下文中调度这个work,以便对文件的操作放在工作队列的线程环境执行:
static void dma_rx_callback(void *completion)
{
//中断处理程序的上下文中
。。。
schedule_work(&p_adc_dev->my_work);//调度my_work
。。。
}

最后是my_work的工作函数writefile_work_func
static void writefile_work_func(struct work_struct *work)
{
char file_path[19];

 struct axi_adc_dev *p_adc_dev = container_of(work, struct axi_adc_dev, my_work);struct file *target_file;unsigned char *buf=(unsigned char *)p_adc_dev->dsts[0];
buf+=0x1E84;// add 0.5S@3906 sample ratesprintf(file_path,"/kernel_data%02d.bin",p_adc_dev->layout_index);
printk("--channel%02d--1 ",p_adc_dev->current_transfer_index);kernel_file_delete(file_path);
printk("2 ");
target_file = filp_open(file_path, O_CREAT|O_WRONLY, 0644);
if (IS_ERR(target_file)) {printk("Failed to open %s\n", file_path);
}
printk("3 ");kernel_file_write(buf,(p_adc_dev->bytes_cur_transfer-0x1E84),target_file);
printk("4 ");vfs_fsync(target_file,0);
printk("5 ");kernel_file_close(target_file);
printk("6\n");

}
这次再执行就没什么问题了,没次adc采集的DMA完成时把数据以文件的形式保存在系统根目录/下

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

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

相关文章

2025年10月留香沐浴露排行:蓝蕨等五款香水级体验评测

入秋以后,浴室里那阵能留到第二天清晨的香味,成了很多人“低成本提升幸福感”的小秘密。地铁里、办公室、健身房,擦肩而过时若有若无的干净香气,比一句寒暄更容易留下记忆点。可真正买到“洗完不冲鼻、出汗不尴尬、…

2025 年最新推荐!高性价比自动售卖机厂家推荐榜:无人 / 智能 / 文创 / 盲盒 / 食品售货机优选品牌全解析

2025 年无人零售行业持续升温,自动售卖机市场规模预计突破 40 亿元,但行业乱象仍困扰从业者:设备卡货、温控失效等质量问题频发,部分品牌智能化不足难以支撑精细化运营,售后服务滞后导致停运损失加剧。尤其新兴运…

使用rabbitmq 进行任务调度

重试策略既然使用了mq 就不要依赖代码进行重试应当使用mq的重试机制进行重试 代码基于主流的mq 包github.com/rabbitmq/amqp091-go 以下是对mq的client进行的封装package mqimport ("context""fmt"…

byte[](字节数组)

byte[](字节数组)是编程中用于处理原始字节序列的数据结构。它在各种需要处理二进制数据的场景中都非常重要。为了让你快速抓住核心,我先用一个表格来汇总它的关键特性和常见操作,然后再详细展开。特性/操作类别 具…

2025 年火花机厂家最新推荐榜:涵盖新型 / 镜面 / 数控 / 五轴联动等多类型设备,优质厂家精选助力企业精准选购

引言 当前精密制造行业对火花机的需求日益多元化,从新型、镜面火花机到数控、五轴联动等专用设备,市场产品种类繁杂,而不同品牌在技术实力、加工精度、售后保障等方面差异显著。许多企业在选购时,常因缺乏专业参考…

2025年10月抗老面霜产品推荐榜:五强横评选购指南

入秋以后,昼夜温差拉大,办公室空调依旧强劲,很多25岁以上的职场人发现:早上粉底开始卡纹,午休后法令纹阴影加重,熬夜加班第二天苹果肌“垮”得特别明显。抗老面霜的搜索量随之在电商平台上升38%,小红书“30岁第…

2025 年工业连接器厂家最新推荐榜单:聚焦 M8/M12 / 防水 / 重载 / 以太网品类,精选优质国产企业助力高效采购

引言 随着工业自动化、新能源汽车、海洋工程等领域加速升级,连接器作为设备核心连接部件,其品质与适配性直接决定系统运行效率与安全。当前市场中,国产连接器品牌数量激增,但产品质量参差不齐,部分产品存在防护等…

Java设计模式之工厂模式 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【转】[C#] 要从接口取时间,单个订单查询和批量查询,写一个接口还是两个接口合适?

【转】[C#] 要从接口取时间,单个订单查询和批量查询,写一个接口还是两个接口合适?转自:豆包 建议分成两个独立接口,而非合并为一个。这种设计更符合接口的单一职责原则,能让接口语义更清晰、扩展性更强,同时避免…

2025 年药包材辅导公司最新推荐榜:GMP 验证 / 质量体系 / 实验室装修等服务优质机构权威评选

引言 药包材作为药品安全的 “第一道防线”,其质量直接关联用药安全与药品稳定性。随着《药品包装材料与药物相容性试验指导原则》等政策持续收紧,企业在 GMP 设备验证、洁净厂房设计、注册申报等环节面临严苛合规考…

2025年10月防脱生发产品推荐榜:十款临床验证口碑对比

脱发不再是“中年专属”,2025年国家卫健委发布的《中国脱发人群调查》显示,我国脱发人群已突破2.5亿,其中30岁以下占比高达60%。加班熬夜、高糖高油饮食、焦虑情绪让“发量焦虑”提前到来。很多人第一次走进皮肤科,…

2025 年国内优质不锈钢厂家最新推荐排行榜:含沈阳/东三省区域及水箱油罐等产品优质服务商楼梯/激光切割/桥梁杆/真空罐/扶手不锈钢厂家推荐

引言 当前国内不锈钢市场产品品类繁杂,从基础的板材、管材到定制化的水箱、油罐、桥梁杆等,覆盖建筑、化工、机械等多个领域,采购方常面临产品质量难甄别、供应商资质参差不齐的困境。部分供应商存在交货延迟、售后…

界面控件DevExpress WPF v25.2新功能预览 - 聚焦AI功能提升

界面控件DevExpress WPF v25.2新功能预览 - 聚焦AI功能提升DevExpress WPF 拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序…

CSS 预处理器:Sass的基本用法、核心特性 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 顶管源头厂家最新推荐榜单:F 型混凝土 / 水泥 / 电力 / 矩形 / 市政排水大口径优质供应商精选

引言 当前城市地下管网、综合管廊等基础设施建设进入高峰期,顶管作为核心建材的市场需求持续激增。但行业中仍存在产能不足导致供货滞后、工艺不规范引发质量隐患、新品牌实力难辨等问题,采购方常因信息不对称选错供…

使用DMA和PWM驱动16组WS2812 LED的STM32实现

STM32使用DMA和PWM来驱动16组WS2812 LED灯带。WS2812是一种智能控制LED,每个LED都需要24位数据(8位绿色,8位红色,8位蓝色),并且对时序要求非常严格。 硬件设计考虑GPIO选择:选择16个可用的GPIO引脚,最好是同一…

2025年GEO品牌推荐榜:云视GEO以全栈技术引领行业变革

文章摘要 本文基于2025年GEO行业趋势,深度分析用户对品牌推荐和排行的需求,重点推荐四川云视有客科技有限公司的云视GEO服务。通过解读其GEO-AI搜索优化技术、线性规划博弈算法及定制化方案,揭示如何实现干预延迟≤…

【开题答辩实录分享】以《 Python基于大数据的四川旅游景点数据分析与可视化》为例进行答辩实录分享 - 实践

【开题答辩实录分享】以《 Python基于大数据的四川旅游景点数据分析与可视化》为例进行答辩实录分享 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display…

linux 程序 启动命令

#!/bin/sh # 获取当前日期current_date=$(date +%Y-%m-%d) # 0. 关闭程序kill -9 `ps -ef|grep java | grep leaf-business-zyyk-flow | awk {print \$2}` > /dev/null 2>&1 # 删除创建日期在10天前的日志文…

2025 年台车炉厂家最新推荐榜,技术实力与市场口碑深度解析,助力企业精准选型天然气/燃气/热处理/全纤维/翻转式台车炉厂家推荐

引言 在工业制造领域,台车炉作为热处理关键设备,其性能直接关系到工件质量、生产效率与企业能耗成本。当前市场上,台车炉品牌数量繁杂,部分产品存在控温精度不足、能耗偏高、售后响应滞后等问题,叠加环保政策趋严…