- 首先得设置下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嵌入式驱动管理调试平台 ------ 我的第一个开源项目相关推荐

  1. Linux嵌入式驱动开发02——驱动编译到内核

    文章目录 全系列传送门 make menuconfig图形化配置界面 1. 怎么进入到make menuconfig图形化界面? 2. make menuconfig图形化界面的操作 3. 退出 4. ...

  2. Linux嵌入式驱动开发零基础入门集合(STM32过渡到Linux嵌入式)

    Linux嵌入式驱动开发01--第一个驱动Hello World(附源码) Linux嵌入式驱动开发02--驱动编译到内核 Linux嵌入式驱动开发03--杂项设备驱动(附源码) Linux嵌入式驱动 ...

  3. Linux嵌入式驱动开发13——ioctl接口(gpio控制使用)

    文章目录 全系列传送门 引言 什么是unlocked_ioctl接口? unlocked_ioctl和read/write函数有什么相同和不同 unlocked_ioctl接口命令规则 命令的合成宏与 ...

  4. Linux嵌入式驱动开发07——GPIO驱动过程记录(飞凌开发板)

    文章目录 全系列传送门 1. 在/arch/arm/boot/dts/imx6q-pinfunc.h查找 2. 在设备树配置文件中添加设备节点定义以及其引脚定义 3. 修改设备树文件添加配置 4. d ...

  5. Linux嵌入式驱动开发01——第一个驱动Hello World(附源码)

    文章目录 全系列传送门 引言 驱动介绍 Hello World 1. 包含头文件 2. 驱动模块的入口和出口 3. 声明信息 4. 功能实现 完整代码 编译 第一种方法 第二种方法 编译成模块 第一步 ...

  6. linux驱动程序设计21 Linux设备驱动的调试

    本章导读 "工欲善其事,必先利其器",为了方便进行Linux设备驱动的开发和调试,建立良好的开发环境很重 要,还要使用必要的工具软件以及掌握常用的调试技巧等. 21.1节讲解了Li ...

  7. Linux设备驱动模型4——平台总线实践

    以下内容源于朱有鹏<物联网大讲堂>课程的学习,如有侵权,请告知删除. 参考http://www.cnblogs.com/deng-tao/p/6033571.html 一.平台总线实践环节 ...

  8. Linux一个驱动管理多个设备,poll方法(select多路监控原理与实现)

    1.什么是Poll方法,功能是什么? 2.Select系统调用(功能) Select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程. int select(int maxf ...

  9. ARM/Linux/嵌入式/驱动必需知道的官网网站

    快速链接: .

最新文章

  1. java word 纸张大小_如何在Java中为Word文档(.doc或.docx)设置背景色(页面颜色)?...
  2. CSS3盒模型box-sizing属性详解,布局更方便
  3. Day14作业 二、有两个List集合怎么取两个无重复的并集
  4. 『设计模式』简单工厂模式
  5. 【Tensorflow】深度学习实战04——Tensorflow实现VGGNet
  6. scala学习-Description Resource Path Location Type value toDF is not a member of org.apache.spark.rdd.R
  7. matlab图像分类器,Matlab 基于svm的图像物体分类
  8. 连接本地虚拟机和数据库很慢
  9. 黑客已经盗了 $15,945,221.72 美元!
  10. 奇安信代码安全实验室帮助微软修复两个“重要”漏洞,获官方致谢
  11. getchar() 和 scanf(%c)的区别
  12. SpringBoot读取配置文件
  13. Binding.scala使用教程8--binding.scala结合semanticUI
  14. app商城源码_淘客多商城系统开发 APP软件开发 源码搭建
  15. linux更新war包操作步骤,关于Linux系统下基于Tomcat部署和升级war包的详细过程
  16. 鹿晗关晓彤公布恋情阿里云服务器救场 这位微博程序员新婚还加班
  17. mysql 1205 解决_mysql 1205 ,自动重启数据库
  18. Java实现json报文的比对(不考虑内部顺序 + 可设置跳过部分字段比对)
  19. Failed to execute ‘btoa‘ on ‘Window‘: The string to be encoded contains characters outside of the La
  20. 编写程序把24小时制的时间改成12小时制

热门文章

  1. HotApp小程序统计,第一个专业的微信第三方小程序统计工具
  2. /etc/fstab 文件解释
  3. createDocumentFragment
  4. 深入解析windows操作系统。。。。
  5. php 创建文件编码,php fopen创建utf8编码文件例子
  6. python 输入学生成绩 若成绩在90、流程图_Python习题选编
  7. android fersco 框架,Android Fresco框架的简单使用
  8. 服务器出口ip怎样修改,服务器出口ip设置
  9. java script中==和===_Java Script与CSS的问题
  10. jQuery简单实现遍历的方法