Linux嵌入式驱动管理调试平台 ------ 我的第一个开源项目
- 首先得设置下github的dns 要不然会非常慢
- 修改 hosts ,github的下载速度会非常快
特别说明:github 速度不稳定所以开始使用 gitee
gitee 仓库 https://gitee.com/hongdayugitee/arm_linux_platform.git
停更 忙完Rust 学习 元旦之后继续
- 建立这个项目的目的就是: 加快驱动业务代码的部署和整合,驱动对软件的要求不高,但是测试调试的东西很多,部署的板卡上,整体修改的东西多,现在通过抽象,用一个配置文件,告诉驱动管理平台,需要配置那些东西和流程是那些
- 经过测试使用C++ 开发效率更快, 关于效率问题,多虑了,实际的驱动接口是做在kernel里面了, 应用层只是启动配置的作用,并不会影响到 实际的驱动调用效率的问题,影响板卡的整体性能
- 所有以下软件设计思路来源于各个开源软件,所以开源协议也会遵守 MIT 协议,所以放心,公司的东西是公司的,以下我说的是我自己根据各个开源软件项目思考得来的
- 由于公司近半年,一天比一天闲,所以大家都懂的哈,闲着没事抽象出了一个嵌入式软件的基础框架,但是也是基于linux 的操作系统,纯属个人乐趣,公司用的比这要简单的多,我也没啥义务,对整个软件的基础框架进行重构,不涉及侵权,能用到的筒子随便用,本人自己的构思,过段时间开放一个源码,给大家
- 源码的话采用主要语言是C++ 其次就是 Makefile 然后就是 shell 启动 脚本,桌面程序比较麻烦,所以估计得明年才能构造好, 主要就是用的 QT构造,桌面程序
项目中的问题
- 没有C 代码写起来丝滑,类的构造比较繁琐,需要硬性考虑析构的问题
- 在驱动调试中最主要的就是读的操作要远大于写的操作,在我之前写过的底层软件中,是采用的一种RCU机制 (read copy update),现在也会采用这种机制,读的操作,直接作用于高速缓冲层,如果数据库发生改变也会触发, 数据缓冲层发生变化,这样做的目的是为了减少,数据库的操作,为什么呢? 数据库的读写操作,其实很耗时间,同时也是为了减少对flash的读写操作, 目前接触到的flash,频繁读写,容易造成坏块的情况出现
- 抽象类接口,还得在思索,创建实用的抽象接口
- 一般类的构造 是2种,无参构造,有参构造,在有参构造中还得考虑深度拷贝, 目前我并没有这样做, 为了省事儿,也避免出现内存泄露的问题
- 存在 free 多次的问题,在cjson源码中 Cjson_delete()中采用的递归释放内存,但是我在析构中调用,只要调用的次数多,就又free多次的问题
DONE:
- 现在基本适应这种编程习惯
- sqlite 基本操作完成,但未创建缓冲层
- 过度设计的问题: 正在考虑日志子模块的,读写并发的问题,fnctl,不实用的全部删除
- free 问题解决,应注意对象的生命周期
- RCU 机制,高速缓冲层 类构造完成
TODO:
- 增加线程池, 方便对主线程之内的, 所有子线程进行管理
- 共享的抽象层建立完毕 —> 查询设置链路(map 以index 为排序条件,构建查询树)
FIXME:
模拟不成熟内核的组建方法, 1Mb 的缓存数据
使用指针是为了直接修改共享内中的数据,同时查看,内核中内存映射的缩影
可能会有一些问题
对了这个struct 实际上是 #define struct _attribute_(packed)
> 小数据测试建页概念成功
void cache_layer::ipc_init(){std::string ipc_path;int ipc_id;fp->find("cache_layer","fs_path",ipc_path);fp->find("cache_layer","key_id",ipc_id);shm(ipc_path.c_str(),ipc_id,SHM);shm.xsi_ipc_init();sem(ipc_path.c_str(),ipc_id,SEM);sem.xsi_ipc_init();shm.write((char*)this->zone,0,sizeof(cache_mem)); //FIXME:将整个内存池拷贝过去,对使用的空间需要重新计算 TODO: 添加异常处理
}
最终映射的内存结构
想法测试
日志和命令行打印随时切换使用
现在没有问题了,还是直接系统调用比较好
项目中需要添加的模块
- tcp 和 uart 通信 桌面客户端 (也得需要建立缓存机制)
- 如果是单板测试以上够用,如果是1对多的测试,得采用,io复用的机制, 提升处理速度 (待定)
- 命令行要不要变成一个小型的解释器, 方便调试测试(之前我写过,但是总体效果不理想,可以根据之前写的在做改进)
- 添加进程管理组,为了加快程序的处理速度,使用软中断的方式,在进程组中同时发送信号,有进程组的组长负责通知共享层发生的变化,子进程做出自己相应的判断,组长进程同时也是守护进程(方便管理), 组员进程发送修改数据库的操作,主进程相应信号,更新虚拟层数据,然后更新数据库, 组长进程屏蔽阻塞组员进程非数据库操作信号
- 组长进程修改 STOP 信号时的操作,发现在默认STOP的信号无法满足现有的需求?进程资源没有得到回收和释放,关键是,无法完成析构操作,达到回收的目的,SIGIN 的信号也得修改默认操作方式,也无法完成资源回收的工作、
- 防止系统长时间运行导致内存碎片化严重,使用 alarm() 重启
- watchdog 防止 进程挂死的情况, 重启进程
- 整个打印需要重载,便于将打印日志随时切换,先复制保存 STDOUT_FILENO STDERR_FILENO 的文件描述符,可以使用命令行随时切换,
- 然后再将IO 缓冲区的信息,写入日志文件中,或者写入,/dev/null linux的垃圾桶中 , 需要将文件描述符转化为文件流,供C库使用,使用可以设置缓冲的大小,做全缓冲,在全缓冲的信息写入日志文件中
- 日志使用logger 命令行 加 syslog的方式, 方便获取整个组网中所有的子设备的日志信息
- 可以程序自解压缩,加载到内存? 内核是怎么做到的,减小了flash的负担,涉及到了汇编,放到最后,这个难度在于汇编,估计得有点汇编的底子
- 主从网络交互,上限设置到256 台设备 SIGIO 异步交互
- 但是对于比较熟悉的移动网管标准,使用多路复用,应该是不让开源,我到是希望,在行业内部开源整合。
项目心情记录
2021-12-2 没有告警又是开心的一天
2021-12-3 娘的,忘了C++ 中对象的生命周期,还有拷贝构造的问题,终于找到问题了,还是指针好使,又检查了一遍没啥问题了
2021-12-7 没有告警但是,还存在隐患
2021-12-8 没有告警,又是开心的一天
2021-12-11 拟定基础框架,拟定测试方法
Linux嵌入式驱动管理调试平台 ------ 我的第一个开源项目相关推荐
- Linux嵌入式驱动开发02——驱动编译到内核
文章目录 全系列传送门 make menuconfig图形化配置界面 1. 怎么进入到make menuconfig图形化界面? 2. make menuconfig图形化界面的操作 3. 退出 4. ...
- Linux嵌入式驱动开发零基础入门集合(STM32过渡到Linux嵌入式)
Linux嵌入式驱动开发01--第一个驱动Hello World(附源码) Linux嵌入式驱动开发02--驱动编译到内核 Linux嵌入式驱动开发03--杂项设备驱动(附源码) Linux嵌入式驱动 ...
- Linux嵌入式驱动开发13——ioctl接口(gpio控制使用)
文章目录 全系列传送门 引言 什么是unlocked_ioctl接口? unlocked_ioctl和read/write函数有什么相同和不同 unlocked_ioctl接口命令规则 命令的合成宏与 ...
- Linux嵌入式驱动开发07——GPIO驱动过程记录(飞凌开发板)
文章目录 全系列传送门 1. 在/arch/arm/boot/dts/imx6q-pinfunc.h查找 2. 在设备树配置文件中添加设备节点定义以及其引脚定义 3. 修改设备树文件添加配置 4. d ...
- Linux嵌入式驱动开发01——第一个驱动Hello World(附源码)
文章目录 全系列传送门 引言 驱动介绍 Hello World 1. 包含头文件 2. 驱动模块的入口和出口 3. 声明信息 4. 功能实现 完整代码 编译 第一种方法 第二种方法 编译成模块 第一步 ...
- linux驱动程序设计21 Linux设备驱动的调试
本章导读 "工欲善其事,必先利其器",为了方便进行Linux设备驱动的开发和调试,建立良好的开发环境很重 要,还要使用必要的工具软件以及掌握常用的调试技巧等. 21.1节讲解了Li ...
- Linux设备驱动模型4——平台总线实践
以下内容源于朱有鹏<物联网大讲堂>课程的学习,如有侵权,请告知删除. 参考http://www.cnblogs.com/deng-tao/p/6033571.html 一.平台总线实践环节 ...
- Linux一个驱动管理多个设备,poll方法(select多路监控原理与实现)
1.什么是Poll方法,功能是什么? 2.Select系统调用(功能) Select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程. int select(int maxf ...
- ARM/Linux/嵌入式/驱动必需知道的官网网站
快速链接: .
最新文章
- java word 纸张大小_如何在Java中为Word文档(.doc或.docx)设置背景色(页面颜色)?...
- CSS3盒模型box-sizing属性详解,布局更方便
- Day14作业 二、有两个List集合怎么取两个无重复的并集
- 『设计模式』简单工厂模式
- 【Tensorflow】深度学习实战04——Tensorflow实现VGGNet
- scala学习-Description	Resource	Path	Location	Type value toDF is not a member of org.apache.spark.rdd.R
- matlab图像分类器,Matlab 基于svm的图像物体分类
- 连接本地虚拟机和数据库很慢
- 黑客已经盗了 $15,945,221.72 美元!
- 奇安信代码安全实验室帮助微软修复两个“重要”漏洞,获官方致谢
- getchar() 和 scanf(%c)的区别
- SpringBoot读取配置文件
- Binding.scala使用教程8--binding.scala结合semanticUI
- app商城源码_淘客多商城系统开发 APP软件开发 源码搭建
- linux更新war包操作步骤,关于Linux系统下基于Tomcat部署和升级war包的详细过程
- 鹿晗关晓彤公布恋情阿里云服务器救场 这位微博程序员新婚还加班
- mysql 1205 解决_mysql 1205 ,自动重启数据库
- Java实现json报文的比对(不考虑内部顺序 + 可设置跳过部分字段比对)
- Failed to execute ‘btoa‘ on ‘Window‘: The string to be encoded contains characters outside of the La
- 编写程序把24小时制的时间改成12小时制
热门文章
- HotApp小程序统计,第一个专业的微信第三方小程序统计工具
- /etc/fstab 文件解释
- createDocumentFragment
- 深入解析windows操作系统。。。。
- php 创建文件编码,php fopen创建utf8编码文件例子
- python 输入学生成绩 若成绩在90、流程图_Python习题选编
- android fersco 框架,Android Fresco框架的简单使用
- 服务器出口ip怎样修改,服务器出口ip设置
- java script中==和===_Java Script与CSS的问题
- jQuery简单实现遍历的方法