购物网站最近浏览怎么做类似凡科互动的网站
2026/4/17 2:29:39 网站建设 项目流程
购物网站最近浏览怎么做,类似凡科互动的网站,网站首页有哪些内容,网站备案 改名一、 核心思想整理#xff1a;从“写死”到“通用” 1. 什么是“分离”#xff1f; 分层 (Layering)#xff1a;是纵向切割。把 file_operations#xff08;给内核看的#xff09;和 led_operations#xff08;给硬件看的#xff09;分开。分离 (Separation)#xff1a…一、 核心思想整理从“写死”到“通用”1. 什么是“分离”分层 (Layering)是纵向切割。把file_operations给内核看的和led_operations给硬件看的分开。分离 (Separation)是横向切割。在硬件操作层内部把“资源Resource”和“逻辑Logic/Driver”彻底分开。2. 为什么要分离假设你有 10 款开发板用的都是同一款 CPU比如 i.MX6ULL但 LED 接的引脚不同不分离你需要写 10 个board_xxx.c每个文件里都要写一遍“读寄存器、改方向、写寄存器”的代码。代码冗余极大。分离你只需要写1 个通用的chip_gpio.c负责算地址、读写。然后写10 个很小的board_xxx.c只记录引脚编号。效率极高不易出错。二、 代码层面的深度分析为了让你看懂“分离”是如何在 C 语言中实现的我们要构建三个部分资源定义、资源数据、通用逻辑。1. 定义标准头文件首先我们需要一个“协议”规定如何描述一个 LED 硬件资源。// led_resource.h// 定义描述硬件资源的结构体structled_resource{intgroup;// GPIO组号例如 1 代表 GPIO1intpin;// 引脚号例如 3 代表 GPIO1_3};// 获取资源的函数声明structled_resource*get_led_resource(void);2. 资源层board_A_led.c这个文件只关心数据。它不包含任何寄存器操作只负责告诉驱动“我的灯接在哪里”。// board_A_led.c (针对单板A)#includeled_resource.h// 定义具体的硬件资源我的灯接在 GPIO1_3staticstructled_resourceboard_A_led{.group1,.pin3,};// 提供给外部获取资源的接口structled_resource*get_led_resource(void){returnboard_A_led;}思考如果你换了板子灯接在GPIO5_4你只需要修改上面这一小段代码其他所有文件都不用动3. 驱动逻辑层chipY_gpio.c这个文件只关心逻辑。它是通用的不知道也不关心具体的引脚它只负责“计算和操作”。// chipY_gpio.c (针对芯片Y的通用驱动)#includeled_resource.h#includeled_opr.h// 包含 led_operations 定义// 假设的寄存器基地址 (i.MX6ULL)// 实际代码中需要通过 ioremap 映射这里仅作逻辑演示#defineCCM_CCGR1_BASE0x20C406C0#defineGPIO1_BASE0x209C0000#defineGPIO5_BASE0x20AC0000staticstructled_resource*p_res;// 初始化函数通用的不管你是哪组 GPIOstaticintchipY_gpio_init(intwhich){// 1. 获取资源关键步骤// 驱动去问资源层嘿我们要操作哪个引脚p_resget_led_resource();// 2. 根据资源计算寄存器地址 (逻辑部分)// 无论 p_res-group 是 1 还是 5这套逻辑都适用unsignedintbase_addr;if(p_res-group1){base_addrGPIO1_BASE;// 使能 GPIO1 时钟 (通用逻辑)// ...}elseif(p_res-group5){base_addrGPIO5_BASE;// 使能 GPIO5 时钟// ...}// 3. 设置 GPIO 方向为输出 (通用逻辑)// 这里的逻辑是读取 DIR 寄存器把对应 pin 位置 1// *GPIO_DIR(base_addr) | (1 p_res-pin);return0;}staticintchipY_gpio_ctl(intwhich,charstatus){// 控制函数同理根据 p_res-group 和 p_res-pin 计算地址和位移// ...return0;}// 定义 operations 结构体供上层 led_drv.c 调用structled_operationschipY_gpio_opr{.initchipY_gpio_init,.ctlchipY_gpio_ctl,};三、 总结分离的精髓通过上面的代码分析我们可以清晰地看到“分离”的效果左边是board_A_led.c(变化的部分)这里全是变量和数字。负责回答“Who?”(是哪个引脚)将来这部分会演变成 Linux 内核中的 Device Tree (.dts 文件)。右边是chipY_gpio.c(不变的部分)这里全是公式和算法。负责回答“How?”(怎么操作寄存器)。将来这部分会演变成 Linux 内核中的Platform Driver (.c 文件)。下一步上述的“分离”思想正是“总线-设备-驱动”模型的雏形是在模拟 Linux 内核中最伟大的发明之一——**Platform Bus平台总线**模型。现在你还在用 C 语言的struct来手动传递资源通过get_led_resource。未来你会学习如何用文本文件.dts来描述group1, pin3然后内核会自动解析这个文本把它变成结构体传给你的驱动。一、 概念解析1. 总线-设备-驱动 (Bus-Device-Driver) 模型在 Linux 内核中这是一种管理机制。设备 (Device)包含硬件资源如GPIO 引脚号、中断号、寄存器基地址。驱动 (Driver)包含操作逻辑如如何初始化、如何读写寄存器。总线 (Bus)它是中间人负责匹配Match。当一个新的“设备”被注册时总线会去寻找能处理它的“驱动”反之亦然。2. 设备树 (Device Tree)在没有设备树之前所有的“设备”信息都是写在.c文件里的。设备树是一种特殊的文本文件 (.dts)它用树状结构描述硬件资源。作用它把原本写在 C 代码里的硬件参数如pin3剥离出来写到一个独立的配置文件里。二、 进化之路从“手动分离”到“自动化管理”把你现在学习的代码与内核成熟模型进行对比改进点如下1. 从“手动调用”到“自动匹配” (总线模型的改进)你现在的做法你在chipY_gpio.c中必须手动调用get_led_resource()。这意味着驱动程序必须“知道”资源函数的存在。总线模型的改进优势解耦更彻底。驱动程序只需要声明“我支持名为my_led的设备”。机制内核启动时总线会对比“设备名字”和“驱动名字”。如果对上了内核就自动调用驱动的probe函数并把资源丢给驱动。驱动完全不需要知道资源定义在哪个文件里。2. 从“硬编码”到“配置化” (设备树的改进)你现在的做法你修改引脚后需要重新编译board_A_led.c然后重新生成.ko驱动文件。设备树的改进优势一套驱动到处运行。驱动程序编译一次后可以发往所有使用该芯片的客户。机制不同厂商的板子只需要提供自己的.dts设备树文件。内核在启动时解析这个文本文件。你换引脚只需改一行文本甚至不需要重新编译内核只需编译这个文本即可。三、 核心优势对比表特性现在的“分离”思想总线-设备-驱动模型设备树 (Device Tree)存放位置两个.c文件两个.c文件driver.c.dts文本匹配方式函数硬调用总线根据名字自动匹配总线根据兼容性字符串匹配可维护性中等需重编驱动高逻辑与数据解耦极高硬件变化不改驱动代码通用性仅限本项目符合内核规范易于移植工业标准跨平台能力最强四、 代码层面的视觉进化1. 你的现状C 结构体staticstructled_resourceboard_A_led{.pin3};// 写在 C 里2. 设备树时代DTS 文本/* 写在 .dts 文件里类似 JSON/XML */led1{compatiblechipY,my-led;gpiosgpio13GPIO_ACTIVE_LOW;};驱动程序Driver驱动不再去问“引脚是谁”而是从内核给的 device 结构体里“领礼物”intled_probe(structplatform_device*pdev){// 内核自动把设备树里的引脚号 3 提取出来送给这个函数intpinof_get_named_gpio(pdev-dev.of_node,gpios,0);// ... 然后直接用即可}五、总线的工作流程第一步设备登记 (Device Register)当系统启动或你插上一个新硬件时内核会创建一个device结构体里面写着“我叫my_led我的引脚是 3”。然后把它扔给总线。第二步驱动登记 (Driver Register)驱动程序加载时内核创建一个driver结构体里面写着“我能支持名为my_led的硬件”。然后也把它扔给总线。第三步匹配 (Match)这是总线最核心的工作。每当有新的“设备”或“驱动”加入总线就会自动执行一个match函数总线问“驱动啊这个新来的设备叫my_led你要吗”驱动看了一眼名字“名字对上了我要了”第四步结合 (Probe)一旦匹配成功总线就会调用驱动里的probe探查函数。总线“既然你们看对眼了驱动这是那个设备的资源引脚号等你拿去初始化吧”probe函数的核心任务是“领资源”“做初始化”总结总线模型解决了“驱动怎么找到设备”的自动化问题。设备树解决了“硬件描述”的非代码化问题让代码变纯粹。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询