敏捷开发大家都不陌生,他对文档的态度是偏向于反对,但是也不是说一点文档都没有。他的说法是 代替文档。 那么敏捷开发为什么会这么认为呢? 其实大家在做项目开发的时候都会有这样的体会: 时间紧任务重,哪有时间写文档呀?代码都写不过来。 辛辛苦苦把文档写好了,但是但是项目才进行一小半好不好,需求怎么就变了呀! 如果所有的文档都可以和代码进行这样的联动,需求有变化了,先去修改文档,然后代码会自动随之变更,那么文档就不会成为负担了! 这就是我所说的“文档式驱动”! 后来发现开发速度跟不上,于是找了一个国外的无后端的东东 ,叫做backendless。他的思路就是,凡是服务器做的事情(UI除外),都可以不用写代码了,都由他来包办。 最后说一下啥是“超敏捷”,前面说了敏捷开发,那么超敏捷开发呢,顾名思义说的就是开发速度会更快。
最近在负责通用网络层的设计和开发,会记录该过程中的一些思考,本文主要介绍职责驱动设计,以及它在网络层设计中的一些思考。 之前有整理过《在线文档的网络层设计思考》一文,其中有较完整地介绍了网络层的一些职责,包括:校验数据合法性本地数据准确的提交给后台:包括有序递交和按序升版协同数据正确处理后分发给数据层:包括本地未递交数据与服务端协同数据的冲突处理和协同数据的按序应用在最初的想法中 驱动设计的概念或许大家都很熟悉:测试驱动开发(Test-driven Development,简称 TDD)讨论在编写生产代码之前先编写测试数据驱动开发(Data-Driven Development) 讨论在数据功能中定义处理策略事件驱动开发(Event-Driven Programming)讨论在基于事件的程序中定义处理策略领域驱动设计(Domain-Driven Design,简称 DDD)谈论通过使用通用语言来解决领域问题其中 接入层职责划分上一篇文章中我也有介绍,在线文档中从后台获取的数据到前端的展示,大概可以这么进行分层:其实当我们在给系统分层、分模块的时候,很多时候都会根据职责进行划分,比如在这里我们划分成了:网络层:负责与服务端的数据提交
文档驱动的特点: 1、 前后端分离,后端只提供api,前端负责页面和交互。 2、 前后端的基础功能都可以自动实现无需编码。 (依赖注入) 3、 文档先行,先要有文档,然后由支持平台根据文档实现其他功能。 4、 如果需求有变化了,先修改文档,然后还是由支持平台根据文档的改动,自动变更各种相关功能。 (插件里面的代码除外) 5、 开发速度很快,文档写好,一键实现基本功能,然后稍加修饰(修饰部分可以计入文档),基础功能就可以搞定了。特殊功能可以用插件的方式实现。 6、 自动进行单元测试!
,驱动程序把驱动程序对象注册到USB子系统中,稍后再使用制造商和设备标识来判断是否安装了硬件。 当然,这些制造商和设备标识需要我们编写进USB 驱动程序中。 USB 驱动程序依然遵循设备模型 —— 总线、设备、驱动。 和I2C 总线设备驱动编写一样,所有的USB驱动程序都必须创建的主要结构体是 struct usb_driver,它们向USB 核心代码描述了USB 驱动程序。 鼠标驱动代码: 该模板适用于键盘驱动。 整体驱动思路: (1).
参考光盘资料: Disk-A\Datasheet\LCD\S700-AT070TN92.pdf 在以上文档的14页,我们一般用的是经典值。 六、OLED显示屏驱动+帧缓冲驱动模板 6.1 OLED简介 OLED,即有机发光二极管( Organic Light Emitting Diode)。 4)OLED屏开发了两种接口的 Demo 板,接口分别为七针的 SPI/IIC 兼容模块,四针的IIC 模块。 u8 y,u8 c); static void OLED_RefreshGRAM(void); /* 函数功能: OLED对应的GPIO口初始化 硬件连接: OLED模块---Tiny4412开发板 7.1 编写S70屏幕驱动 如果自己编写了LCD驱动(S720屏幕),测试LCD驱动之前,先去除内核自带的LCD驱动,编译烧写内核: Device Drivers --->
块设备是与字符设备并列的概念, 这两类设备在 Linux 中驱动的结构有较大差异,总体而言, 块设备驱动比字符设备驱动要复杂得多,在 I/O 操作上表现出极大的不同,缓冲、 I/O 调度、请求队列等都是与块设备驱动相关的概念 在Linux中,驱动对块设备的输入或输出(I/O)操作,都会向块设备发出一个请求,在驱动中用request结构体描述。 但对于一些磁盘设备而言请求的速度很慢,这时候内核就提供一种队列的机制把这些I/O请求添加到队列中(即:请求队列),在驱动中用request_queue结构体描述。 编写块设备驱动时,使用的一些单位介绍: 1. 扇区(Sectors):任何块设备硬件对数据处理的基本单位。通常,1个扇区的大小为512字节。(对设备而言) 2. 绝大多数硬盘都是固定硬盘,被永久性地密封固定在硬盘驱动器中。
在进行驱动开发之前,您需要先安装适当的开发环境和工具。首先,您需要安装Windows驱动开发工具包(WDK),这是一组驱动开发所需的工具、库、示例和文档。 然后,您需要安装Visual Studio开发环境,以便编写和调试驱动程序。在安装WDK和Visual Studio之后,您还需要配置适当的项目设置,以便能够正确编译和构建驱动程序。 ,某些读者可能听说过DDK或者IFSDDK,最典型的开发工具包莫过于DDK7600,直到目前此类工具包仍然可以正常使用,但并不推荐。 图片为了能测试驱动程序运行状态,读者需安装VMWare虚拟机,双击附件中的VMware-workstation-full-16.2.4-20089737.exe安装程序一直点击下一步即可,需要注意的是在如下选项中请在增强型键盘驱动程序上打对勾 Tools工具,该组件在安装后可让虚拟机具备有拖拽上传文件的功能,且鼠标键盘将可以自由切换,该功能是我们必须要用到的;图片安装VMware Tools工具很容易,只需要点击安装菜单,后会在虚拟机中出现DVD驱动器
/选中SP0总线支持*/ (使用的测试开发板是友善之臂的Tiny4412开发板) 因为开发板引出的SPI接口只有SPI0,所以只能配置SPI0总线。 1. 修改驱动端的probe函数,增加对SPI模式配置与中断号获取,正常情况下可以直接在SPI设备端直接修改,驱动端直接获取信息即可。 它们由设备驱动初始化,并且只能被设备驱动访问;高层协议不需要关心这块内存。 6.1 网络设备驱动编程步骤 1. 以下代码,在上面的网络设备驱动模型里加入了ENC28J60驱动代码,实现了完整的网卡驱动程序。
在正式开始驱动开发之前,需要自行搭建驱动开发的必要环境,首先我们需要安装Visual Studio 2013这款功能强大的程序开发工具,在课件内请双击ISO文件并运行内部的vs_ultimate.exe 安装包,Visual Studio的安装非常的简单,您只需要按照提示全部选择默认参数即可,根据机器配置不同可能需要等待一段时间; 配置驱动开发环境 在正式开始驱动开发之前,需要自行搭建驱动开发的必要环境 ,避免重装系统,在后续课程中读者会出现无数次的蓝屏,而虚拟机快照的快速恢复功能则是一个很好的选择; 配置驱动开发模板 1.打开Visual Studio开发工具,然后选择【文件】菜单新建项目,并在已安装模板中选中 DbgPrint("Hello LyShark \n"); Driver->DriverUnload = UnDriver; return STATUS_SUCCESS; } 9.最后生成一个驱动开发模板 ,依次选择【文件-导出模板-项目模板-下一步-完成】即可完成模板的导出,此时关闭VS工具并再次打开,就能直接使用我们的模板来开发驱动了,当用户需要使用时,不需要每次都配置。
在正式开始驱动开发之前,需要自行搭建驱动开发的必要环境,首先我们需要安装Visual Studio 2013这款功能强大的程序开发工具,在课件内请双击ISO文件并运行内部的vs_ultimate.exe 安装包,Visual Studio的安装非常的简单,您只需要按照提示全部选择默认参数即可,根据机器配置不同可能需要等待一段时间; 配置驱动开发环境 在正式开始驱动开发之前,需要自行搭建驱动开发的必要环境 ,避免重装系统,在后续课程中读者会出现无数次的蓝屏,而虚拟机快照的快速恢复功能则是一个很好的选择; 图片 配置驱动开发模板 1.打开Visual Studio开发工具,然后选择【文件】菜单新建项目,并在已安装模板中选中 DbgPrint("Hello LyShark \n"); Driver->DriverUnload = UnDriver; return STATUS_SUCCESS; } 9.最后生成一个驱动开发模板 ,依次选择【文件-导出模板-项目模板-下一步-完成】即可完成模板的导出,此时关闭VS工具并再次打开,就能直接使用我们的模板来开发驱动了,当用户需要使用时,不需要每次都配置。
对于驱动开发的开发指引,微软官方文档网站已经提供了很详细的教程文档,并且在Github上提供了一系列典型的例程源码用于开发人员参考。 采用的驱动类型关乎到代码的实现(需不需要考虑PNP和电源管理)和驱动的安装( NT式驱动程序以 service 的形式运行,其他驱动需要采用通用的INF文件安装),微软的官方文档这样提到: 有关软件驱动程序 基于WDF的驱动开发 WDF的开发需要遵循一定的规则,开发实现时需要考虑较多的细节,由于篇幅有限,笔者凭着自己的经验暂且稍做列举,后续将写一篇针对WDF驱动开发的文章。 开发人员熟悉驱动安装逻辑有利于驱动的开发,感兴趣可以通过此处进行了解。 6. 生产环境 从Win10开始,驱动文件包不仅需要进行扩展验证 (EV) 代码签名,还需要提交到硬件开发中心仪表盘,具体操作指南可以参考此处,你可以在该文档上找到驱动签名所需的任何内容。
,显卡设备函数地址存储在VIDEO_HW_INITIALIZATION_DATA中,修改函数地址即可自定义设备驱动 三种驱动程序 总线驱动程序(负责和具体的硬件设备交互),单个 I/O 总线设备,并提供与设备无关的单槽功能 ,创建设备对象=>PDO 功能驱动程序(设备功能的具体实现),驱动单个设备,创建设备对象=>FDO 筛选器驱动,筛选设备的 I/O 请求、设备类或总线(使用ObReferenceObjectByHandle 打开设备修改驱动关联的函数),创建设备对象=>DO API Io,IO管理 Ex,内存分配 Ke,内核对象调用函数,不能分页 Rtl,字符串内存操作 Zw、NT,文件和注册表操作 Ps,进程、线程 内核用户层数据交换 setupapi或者cmapi(pnp安装) WDM WDM、WDF(WDM基础上架构的开发框架) NT驱动通过服务安装(服务通过sc命令查询) WDM驱动inf、cat、cer文件安装 windows drv) bus注册和注销,bus_register(struct bus_type *bus) device注册和注销,int device_register(struct device *dev) 驱动安装
基于SDD驱动的开发方法实践测试请关注微信公众号:阿呆-bot记录基于AI设计与开发工程,实践总结一套方法程序员使用AI开发Top5常见问题1.需求描述不清导致AI理解偏差程序员在给AI描述需求时,常常因为表达不准确或缺乏上下文 基于SDD驱动的开发方法AI设计与开发过程中,如何确保AI生成的代码结构化、可控,成为关键难题。 目前业内普遍认识到,仅靠prompt驱动往往结果不可预测,因此逐步转向“设计驱动开发(Specification/SDDDrivenDevelopment,简称SDD)”模式。 “SDD驱动开发”是当前业界最具前瞻性的解决思路。它强调以结构化设计文档为源头,驱动AI实现,而非直接代码生成,让整个开发过程主动可控、可复查。这也是AI工程化的核心趋势之一。 社区趋势:如LLMOps、AI辅助软件工程领域,在研究如何提升AI对设计文档的理解准确率,以及规范驱动下的代码一致性问题。
杂项设备注册函数 这篇文章介绍,如何使用杂项设备框架编写一个简单的按键驱动,完成编写、编译、安装、测试等流程,了解一个杂项字符设备驱动的开发流程。 编写按键驱动 使用杂项设备注册按键驱动,应用层使用read接口读取按键值。 编写驱动之前需要先找到按键的原理图,找到按键接到CPU那个IO上的。 \n"); } module_init(tiny4412_key_init); /*驱动入口--安装驱动的时候执行*/ module_exit(tiny4412_key_exit); /*驱动出口-- 卸载驱动的时候执行*/ MODULE_LICENSE("GPL"); /*设置模块的许可证--GPL*/ 2.2 makefile文件 编译驱动的makefile代码。 : 驱动卸载成功 [root@wbyq code]#
README 驱动开发 由于,看不到一个成熟的 RDD 定义,所以我先按我的理解定义出第一个版本的 README 驱动开发: README 驱动开发是一种通过事先编写 README 的方式,以一步步驱动出受用户欢迎产品的软件开发方法论 吸引更多的潜在用户或者是开发者。 做正确的事情。 构建更好的开发者体验。 它远远要比你做完一个开源项目,再去编写 README 来得快速、可靠。 持续更新 它是一份初期的文档,随着项目的进行,越来越多的需求将会由社区反馈过来,文档也会越来越完善。 README 测试 顺便一提,最近我开始在寻找一种新的测试方式,README 测试。 结论 程序员恨别人不写文档,自己恨写文档。 README 就是一个轻量级的文档方案。
Linux 4.9 内核驱动移植 Linux 4.9 BSP 内核驱动 下载驱动后获得驱动的 tar.gz 压缩包 解压后找到如下驱动与文件夹 进入内核,找到 linux-4.9/drivers/net /wireless 文件夹中,新建文件夹aic8800 并且把上面的驱动与文件夹放入刚刚创建好的 aic8800 中。 Linux 5.15 内核驱动 下载驱动后获得驱动的 tar.gz 压缩包 解压后找到如下驱动与文件夹 由于 Linux 5.15 需要保证内核的主线化,不可将非主线的第三方驱动放置于内核文件夹中,所以将驱动放置于 进入bsp,找到 bsp/drivers/net/wireless 文件夹中,新建文件夹aic8800 并且把上面的驱动与文件夹放入刚刚创建好的 aic8800 中。 使用上面编译出来的内核与ko驱动,并且将固件放置于 rootfs 对应的 /lib/firmware/ 文件夹中
MiniFilter 微过滤驱动是相对于SFilter传统过滤驱动而言的,传统文件过滤驱动相对来说较为复杂,且接口不清晰并不符合快速开发的需求,为了解决复杂的开发问题,微过滤驱动就此诞生,微过滤驱动在编写时更简单 ,多数IRP操作都由过滤管理器(FilterManager或Fltmgr)所接管,因为有了兼容层,所以在开发中不需要考虑底层IRP如何派发,更无需要考虑兼容性问题,用户只需要编写对应的回调函数处理请求即可 ,这极大的提高了文件过滤驱动的开发效率。 接下来将进入正题,讲解微过滤驱动的API定义规范以及具体的使用流程,并最终实现一个简单的过滤功能,首先你必须在VS上做如下配置,依次打开配置菜单,并增加驱动头文件。 并输入start启动驱动,输入stop则是关闭,启动后会看到如下信息; 这里简单介绍一下如何摘除微过滤驱动回调函数,其实摘除回调的方法有多种,常用的第一种通过向过滤驱动中写出一个返回命令让其不被执行从而实现绕过
一、简介 在Linux下进行C语言开发时,经常在命令行传递参数给C程序,常见的Linux命令也是需要传参的,这样用起来就很灵活,根据不同的参数可以执行不同的效果。 Linux驱动安装时也支持传递参数,和命令行上运行的命令原理类似。 只不过在编写驱动的时候,需要在驱动代码里提前将相关信息声明好才可以使用。 这篇文章就介绍如果在命令安装驱动时,传递参数给驱动代码,演示各种类型的参数传输情况。 在驱动代码里声明传入参数的类型、权限,接收的变量名称。 module_param(变量的名称,类型,权限) 二、在驱动代码里声明传递参数的格式 /*传递整型类型数据*/ int int_data = 0; module_param(int_data, int [ 2692.220000] 安装驱动成功. [ 2692.220000] int_data=666 [ 2692.220000] p_data=789 [ 2692.220000] array_data
驱动程序加载工具有许多,最常用的当属KmdManager工具,如果驱动程序需要对外发布那我们必须自己编写实现一个驱动加载工具,当需要使用驱动时可以拉起自己的驱动,如下将实现一个简单的驱动加载工具,该工具可以实现基本的 installDvr 驱动安装#include <iostream>#include <Windows.h>using namespace std;// 安装驱动BOOL installDvr(CONST / 用户界面程序用来标识服务的显示名称SERVICE_ALL_ACCESS, // 对服务的访问权限:所有全权限SERVICE_KERNEL_DRIVER, // 服务类型:驱动服务 " << endl;}getchar();return 0;}startDvr 启动驱动#include <iostream>#include <Windows.h>using namespace std " << endl;}getchar();return 0;}stopDvr 停止驱动#include <iostream>#include <Windows.h>using namespace std
在笔者上一篇文章《驱动开发:内核监视LoadImage映像回调》中LyShark简单介绍了如何通过PsSetLoadImageNotifyRoutine函数注册回调来监视驱动模块的加载,注意我这里用的是监视而不是监控之所以是监视而不是监控那是因为 节点,该节点里面就是被加载驱动入口,通过汇编在驱动头部写入ret返回指令,即可实现屏蔽加载特定驱动文件。 原理其实很容易理解,如果我们需要实现则只需要在《驱动开发:内核监视LoadImage映像回调》这篇文章的代码上稍加改进即可,当检测到lyshark.sys驱动加载时,直接跳转到入口处快速写入一个Ret让驱动返回即可 ,至于如何写出指令的问题如果不懂建议回头看看《驱动开发:内核CR3切换读写内存》文章中是如何读写内存的,这段代码实现如下所示。 图片我们看下驱动加载器,提示的信息是拒绝访问,因为这个驱动其实是加载了的,只是入口处被填充了返回而已。