当前位置: 首页 > news >正文

【设备树笔记整理7】实践操作

1 使用设备树给DM9000网卡_触摸屏指定中断

1.1 修改方法

        根据设备节点的compatible属性,在驱动程序中构造/注册 platform_driver,在 platform_driver 的 probe 函数中获得中断资源。

1.2 实验方法

以下是修改好的代码:第6课第1节_网卡_触摸屏驱动\001th_dm9000\dm9dev9000c.c

第6课第1节_网卡_触摸屏驱动\002th_touchscreen\s3c_ts.c

分别上传到内核如下目录:

drivers/net/ethernet/davicom
drivers/input/touchscreen

(1)编译内核

(2)使用新的uImage启动

(3)测试网卡

ifconfig eth0 192.168.1.101
ping 192.168.1.1

(4)测试触摸屏

hexdump /dev/evetn0 // 然后点击触摸屏

1.3 图示 

(1)图1

(2)图2

(3)图3

2 在设备树中时钟的简单使用

2.1 笔记

(1)设备树中定义了各种时钟,在文档中称之为"Clock providers",比如:

	clocks: clock-controller@4c000000 {compatible = "samsung,s3c2440-clock";reg = <0x4c000000 0x20>;#clock-cells = <1>;      // 想使用这个clocks时要提供1个u32来指定它, 比如选择这个clocks中发出的LCD时钟、PWM时钟};

(2)设备需要时钟时,它是"Clock consumers",它描述了使用哪一个"Clock providers"中的哪一个时钟(id),比如:

    fb0: fb@4d000000{compatible = "jz2440,lcd";reg = <0x4D000000 0x60>;interrupts = <0 0 16 3>;clocks = <&clocks HCLK_LCD>;  // 使用clocks即clock-controller@4c000000中的HCLK_LCD		};

(3)驱动中获得/使能时钟:

	// 确定时钟个数int nr_pclks = of_count_phandle_with_args(dev->of_node, "clocks","#clock-cells");// 获得时钟for (i = 0; i < nr_pclks; i++) {struct clk *clk = of_clk_get(dev->of_node, i);}// 使能时钟clk_prepare_enable(clk);// 禁止时钟clk_disable_unprepare(clk);

(4)参考文档:

  • 内核 Documentation/devicetree/bindings/clock/clock-bindings.txt
  • 内核 Documentation/devicetree/bindings/clock/samsung,s3c2410-clock.txt

2.2 图示 

3 在设备树中pinctrl的简单使用 

3.1 笔记

3.1.1 几个概念

(1)Bank

        以引脚名为依据, 这些引脚分为若干组, 每组称为一个Bank,比如s3c2440里有GPA、GPB、GPC等Bank,每个Bank中有若干个引脚,比如GPA0,GPA1, ...,GPC0,GPC1,... 等引脚。

(2) Group

        以功能为依据, 具有相同功能的引脚称为一个Group,比如s3c2440中串口0的TxD、RxD引脚使用 GPH2,GPH3,那这2个引脚可以列为一组,比如s3c2440中串口0的流量控制引脚使用GPH0,GPH1,那这2个引脚也可以列为一组。

(3)State

        设备的某种状态,比如内核自己定义的"default","init","idel","sleep"状态;也可以是其他自己定义的状态,比如串口的"flow_ctrl"状态(使用流量控制)。设备处于某种状态时,它可以使用若干个Group引脚。

3.1.2 设备树中 pinctrl 节点

(1)它定义了各种 pin bank,比如s3c2440有GPA,GPB,GPC,...,GPB各种BANK,每个BANK中有若干引脚:

	pinctrl_0: pinctrl@56000000 {reg = <0x56000000 0x1000>;gpa: gpa {gpio-controller;#gpio-cells = <2>;  /* 以后想使用gpa bank中的引脚时, 需要2个u32来指定引脚 */};gpb: gpb {gpio-controller;#gpio-cells = <2>;};gpc: gpc {gpio-controller;#gpio-cells = <2>;};gpd: gpd {gpio-controller;#gpio-cells = <2>;};};

(2)它还定义了各种group(组合),某种功能所涉及的引脚称为group,比如串口0要用到2个引脚:gph0,gph1:

	uart0_data: uart0-data {samsung,pins = "gph-0", "gph-0";samsung,pin-function = <2>;   /* 在GPHCON寄存器中gph0,gph1可以设置以下值:0 --- 输入功能1 --- 输出功能2 --- 串口功能我们要使用串口功能,  samsung,pin-function 设置为2*/};uart0_sleep: uart0_sleep {samsung,pins = "gph-0", "gph-1";samsung,pin-function = <0>;   /* 在GPHCON寄存器中gph0,gph1可以设置以下值:0 --- 输入功能1 --- 输出功能2 --- 串口功能我们要使用输入功能,  samsung,pin-function 设置为0*/};

3.1.3 设备节点中要使用某一个 pin group:

	serial@50000000 {......pinctrl-names = "default", "sleep";  /* 既是名字, 也称为state(状态) */pinctrl-0 = <&uart0_data>;pinctrl-1 = <&uart0_sleep>;};# pinctrl-names中定义了2种state: default 和 sleep,# default 对应的引脚是: pinctrl-0, 它指定了使用哪些pin group: uart0_data# sleep   对应的引脚是: pinctrl-1, 它指定了使用哪些pin group: uart0_sleep

3.1.4 platform_device,platform_driver匹配时:

really_probe:/* If using pinctrl, bind pins now before probing */ret = pinctrl_bind_pins(dev);dev->pins->default_state = pinctrl_lookup_state(dev->pins->p,PINCTRL_STATE_DEFAULT);  /* 获得"default"状态的pinctrl */dev->pins->init_state = pinctrl_lookup_state(dev->pins->p,PINCTRL_STATE_INIT);    /* 获得"init"状态的pinctrl */ret = pinctrl_select_state(dev->pins->p, dev->pins->init_state);    /* 优先设置"init"状态的引脚 */ret = pinctrl_select_state(dev->pins->p, dev->pins->default_state); /* 如果没有init状态, 则设置"default"状态的引脚 */......ret = drv->probe(dev);

所以:如果设备节点中指定了pinctrl,在对应的probe函数被调用之前,先"bind pins",即先绑定、设置引脚。

3.1.5 驱动中想选择、设置某个状态的引脚:

   devm_pinctrl_get_select_default(struct device *dev);      // 使用"default"状态的引脚pinctrl_get_select(struct device *dev, const char *name); // 根据name选择某种状态的引脚pinctrl_put(struct pinctrl *p);   // 不再使用, 退出时调用

3.1.6 参考文档

  • 内核 Documentation/devicetree/bindings/pinctrl/samsung-pinctrl.txt

3.2 图示

(1)Bank

(2)Group

 (3)State

(4)设备结点

4 使用设备树给LCD指定各种参数

4.1 参考文章

讓TQ2440也用上設備樹(1) - 摩斯电码 - 博客园

4.2 参考代码

https://github.com/pengdonglin137/linux-4.9/blob/tq2440_dt/drivers/video/fbdev/s3c2410fb.c

4.3 实验方法 

(1)替换dts文件

把"jz2440_irq.dts" 放入内核 arch/arm/boot/dts目录

(2)替换驱动文件

把"s3c2410fb.c" 放入内核 drivers/video/fbdev/ 目录,修改内核 drivers/video/fbdev/Makefile:

obj-$(CONFIG_FB_S3C2410)          += lcd_4.3.o

改为:

obj-$(CONFIG_FB_S3C2410)          += s3c2410fb.o

(3)编译驱动、编译dtbs

export  PATH=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/system/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin
cp config_ok  .config
make uImage   // 生成 arch/arm/boot/uImage
make dtbs     // 生成 arch/arm/boot/dts/jz2440_irq.dtb

(4)使用上述uImage,dtb启动内核即可看到LCD有企鹅出现

4.4 设备树相关

(1)设备树中的描述

    fb0: fb@4d000000{compatible = "jz2440,lcd";reg = <0x4D000000 0x60>;interrupts = <0 0 16 3>;clocks = <&clocks HCLK_LCD>;   /* a. 时钟 */clock-names = "lcd";pinctrl-names = "default";     /* b. pinctrl */pinctrl-0 = <&lcd_pinctrl &lcd_backlight &gpb0_backlight>;status = "okay";/* c. 根据LCD引脚特性设置lcdcon5, 指定lcd时序参数 */lcdcon5 = <0xb09>;type = <0x60>;width = /bits/ 16 <480>;height = /bits/ 16 <272>;pixclock = <100000>;       /* 单位: ps, 10^-12 S,  */xres = /bits/ 16 <480>;yres = /bits/ 16 <272>;bpp = /bits/ 16 <16>;left_margin = /bits/ 16 <2>;right_margin =/bits/ 16  <2>;hsync_len = /bits/ 16 <41>;upper_margin = /bits/ 16 <2>;lower_margin = /bits/ 16 <2>;vsync_len = /bits/ 16 <10>;};&pinctrl_0 {gpb0_backlight: gpb0_backlight {samsung,pins = "gpb-0";samsung,pin-function = <1>;samsung,pin-val = <1>;};
};

4.5 代码中的处理

(1)时钟

info->clk = of_clk_get(dev->of_node, 0);
clk_prepare_enable(info->clk);

(2)pinctrl

代码中无需处理,在platform_device/platform_driver匹配之后就会设置"default"状态对应的pinctrl

(3)根据LCD引脚特性设置lcdcon5,指定lcd时序参数,直接读设备树节点中的各种属性值, 用来设置驱动参数:

	of_property_read_u32(np, "lcdcon5", (u32 *)(&display->lcdcon5));of_property_read_u32(np, "type", &display->type);of_property_read_u16(np, "width", &display->width);of_property_read_u16(np, "height", &display->height);of_property_read_u32(np, "pixclock", &display->pixclock);of_property_read_u16(np, "xres", &display->xres);of_property_read_u16(np, "yres", &display->yres);of_property_read_u16(np, "bpp", &display->bpp);of_property_read_u16(np, "left_margin", &display->left_margin);of_property_read_u16(np, "right_margin", &display->right_margin);of_property_read_u16(np, "hsync_len", &display->hsync_len);of_property_read_u16(np, "upper_margin", &display->upper_margin);of_property_read_u16(np, "lower_margin", &display->lower_margin);of_property_read_u16(np, "vsync_len", &display->vsync_len);

4.6 图示 

5 补充笔记

5.1 确定内核的虚拟地址、物理地址的关键信息 

vmlinux虚拟地址的确定,内核源码:

.config :CONFIG_PAGE_OFFSET=0xC0000000arch/arm/include/asm/memory.h#define PAGE_OFFSET     UL(CONFIG_PAGE_OFFSET)arch/arm/Makefiletextofs-y       := 0x00008000TEXT_OFFSET := $(textofs-y)arch/arm/kernel/vmlinux.lds.S:. = PAGE_OFFSET + TEXT_OFFSET;   // // 即0xC0000000+0x00008000 = 0xC0008000, vmlinux的虚拟地址为0xC0008000arch/arm/kernel/head.S#define KERNEL_RAM_VADDR       (PAGE_OFFSET + TEXT_OFFSET)  // 即0xC0000000+0x00008000 = 0xC0008000vmlinux物理地址的确定:
内核源码: 
arch/arm/mach-s3c24xx/Makefile.boot :zreladdr-y      += 0x30008000   // zImage自解压后得到vmlinux, vmlinux的存放位置params_phys-y   := 0x30000100   // tag参数的存放位置, 使用dtb时不再需要tagarch/arm/boot/Makefile:ZRELADDR    := $(zreladdr-y)arch/arm/boot/Makefile:UIMAGE_LOADADDR=$(ZRELADDR)scripts/Makefile.lib:UIMAGE_ENTRYADDR ?= $(UIMAGE_LOADADDR)  // 制作uImage的命令, uImage = 64字节的头部 + zImage,  头部信息中含有内核的入口地址(就是vmlinux的物理地址)cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A $(UIMAGE_ARCH) -O linux \-C $(UIMAGE_COMPRESSION) $(UIMAGE_OPTS-y) \-T $(UIMAGE_TYPE) \-a $(UIMAGE_LOADADDR) -e $(UIMAGE_ENTRYADDR) \-n $(UIMAGE_NAME) -d $(UIMAGE_IN) $(UIMAGE_OUT)

5.2 参考

00-Linux设备树系列-简介 - 飞翔de刺猬 - CSDN博客.html
https://blog.csdn.net/lhl_blog/article/details/82387486

Linux kernel的中断子系统之(二):IRQ Domain介绍_搜狐科技_搜狐网.html
http://www.sohu.com/a/201793206_467784

基于设备树的TQ2440的中断(1)
https://www.cnblogs.com/pengdonglin137/p/6847685.html

基于设备树的TQ2440的中断(2)
https://www.cnblogs.com/pengdonglin137/p/6848851.html

基於tiny4412的Linux內核移植 --- 实例学习中断背后的知识(1)
http://www.cnblogs.com/pengdonglin137/p/6349209.html

Linux kernel的中断子系统之(一):综述
http://www.wowotech.net/irq_subsystem/interrupt_subsystem_architecture.html

Linux kernel的中断子系统之(二):IRQ Domain介绍

linux kernel的中断子系统之(三):IRQ number和中断描述符

linux kernel的中断子系统之(四):High level irq event handler

Linux kernel中断子系统之(五):驱动申请中断API

Linux kernel的中断子系统之(六):ARM中断处理过程

linux kernel的中断子系统之(七):GIC代码分析

相关文章:

【设备树笔记整理7】实践操作

1 使用设备树给DM9000网卡_触摸屏指定中断 1.1 修改方法 根据设备节点的compatible属性&#xff0c;在驱动程序中构造/注册 platform_driver&#xff0c;在 platform_driver 的 probe 函数中获得中断资源。 1.2 实验方法 以下是修改好的代码&#xff1a;第6课第1节_网卡_触摸…...

使用VisualStudio制作上位机(六)

文章目录 使用VisualStudio制作上位机&#xff08;六&#xff09;第五部分&#xff1a;应用程序打包第一步&#xff1a;勾选为Release模式第二步&#xff1a;生成解决方案第三步&#xff1a;将我们额外添加的文件放入到Release这个文件夹里 使用VisualStudio制作上位机&#xf…...

包管理工具--》npm的配置及使用(一)

目录 &#x1f31f;概念 &#x1f31f;背景 &#x1f31f;前端包管理器 &#x1f31f;包的安装 本地安装 全局安装 &#x1f31f;包配置 配置文件 保存依赖关系 &#x1f31f;包的使用 &#x1f31f;写在最后 &#x1f31f;概念 模块&#xff08;module&#xff09…...

期货基础知识

一、期货是什么&#xff1f;  期货是与现货相对应&#xff0c;并由现货衍生而来。期货通常指期货合约&#xff0c;期货与现货完全不同&#xff0c;现货是实实在在可以交易的货&#xff08;商品&#xff09;&#xff0c;期货主要不是货&#xff0c;而是以某种大众产品如棉花、大…...

NC后端扩展开发

前言 在日常的工作中&#xff0c;会遇到各种各样的需要进行扩展开发的需求&#xff0c;可以使用系统预留的扩展开发机制来实现&#xff0c;避免修改源码。因NC产品已迭代至BIP版本&#xff0c;所以前端扩展方式就再进行不赘述了&#xff0c;本文主要介绍后端扩展开发方式&…...

nginx vue2+webpack 和 vue3+vite 配置二级目录访问

我们开发中会遇到这样的需求&#xff0c;让我们用服务器nginx部署一个用域名的二级目录来访问项目 https&#xff1a;xxx/二级目录/来放访问项目 目录 思路 1、nginx配置&#xff08;vue2 和 vue3配置的nginx相同&#xff09; 2、vue2webpack的配置 &#xff08;1&#xff0…...

无需租云服务器,Linux本地搭建web服务,并内网穿透发布公网访问

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道&#xff0c;指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 前言 在web项目中,部署的web站点需要被外部访问,则…...

算法leetcode|76. 最小覆盖子串(rust重拳出击)

文章目录 76. 最小覆盖子串&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;提示&#xff1a;进阶&#xff1a; 分析&#xff1a;在这里插入图片描述 题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 76.…...

如何让你的jupyter notebook 排版得像Word(Markdown和网页文件写法)

案例背景 很多时候我们在jupyter notebook里面的写代码&#xff0c;画图&#xff0c;但是文字分析什么的写在里面纯文本不好看&#xff0c;需要进行排版&#xff0c;那么就得用markdown的写法&#xff0c;如何还想居中或者更花里胡哨的字体&#xff0c;那就得要网页文件的一些…...

AndroidTV端:酒店扫码认证投屏DLNA

被老板叼了几次了&#xff0c;最近实在忍不了&#xff0c;准备离职&#xff1b; 但是担心离职后长时间没有办法找到工作 就想贡献一套平时琢磨出来的程序&#xff0c;请各位有能力的话带我熬过这凛冽的寒冬。 目前写出来的&#xff0c;有三个端&#xff1a;安卓TV端&#xf…...

基于PyTorch的交通标志目标检测系统

一、开发环境 Windows 10PyCharm 2021.3.2Python 3.7PyTorch 1.7.0 二、制作交通标志数据集&#xff0c;如下图 三、配置好数据集的地址&#xff0c;然后开始训练 python train.py --data traffic_data.yaml --cfg traffic_yolov5s.yaml --weights pretrained/yolov5s.pt --e…...

feign调用失败 feign.RetryableException: xxx-service executing GET http://xxx/test

一。 问题引入 升级springcloud的版本后 突然发现 以前正常的feign调用也报错了 升级后的各组件版本如下 spring cloud 2021.0.5 spring cloud alibaba 2021.0.5.0 spring boot 2.6.13 错误日志如下 feign.RetryableException: xxx-service executing GET http://xxx-servic…...

mysql 用户管理

目录 用户 创建用户 删除用户 修改密码 权限管理 赋权 查看权限 插销权限 总结 用户 mysql 的用户都存在于系统数据库 mysql 的user 表中 mysql> show tables; --------------------------- | Tables_in_mysql | --------------------------- | column…...

pyinstaller打包exe运行闪退

这里写自定义目录标题 前言问题描述解决过程 前言 闪退原因可能有很多&#xff0c;这里记录下我遇到的问题&#xff0c;简单来说是dll调用错误导致的闪退&#xff0c;因为我的python用的是32位的&#xff0c;但是pyinstaller却是64位的&#xff0c;属于用conda的时候没注意。 …...

ARM 汇编基础知识

1.为什么学习汇编&#xff1f; 我们在进行嵌入式 Linux 开发的时候是绝对要掌握基本的 ARM 汇编&#xff0c;因为 Cortex-A 芯片一 上电 SP 指针还没初始化&#xff0c; C 环境还没准备好&#xff0c;所以肯定不能运行 C 代码&#xff0c;必须先用汇编语言设置好 C 环境…...

CRM 自动化如何改善销售和客户服务?

许多 B2B 和 B2C 公司都使用 CRM 系统来组织业务流程&#xff0c;使复杂的任务更容易完成。企业可以使用 CRM 自动化来自动化工作流程&#xff0c;让团队有更多的时间来执行高价值的任务&#xff0c;而不是陷于一堆琐碎事情中。 什么是CRM自动化&#xff1f; CRM 自动化是指 C…...

Bean 的六种作用域

目录 一、作用域是什么&#xff1f; 1、singleton&#xff08;单例作用域&#xff09; 2、prototype&#xff08;原型作用域&#xff09; 3、request&#xff08;请求作用域&#xff09; 4、session&#xff08;回话作用域&#xff09; 5、application&#xff08;全局作用域&a…...

go语言--锁

锁的基础&#xff0c;go的锁是构建在原子操作和信号锁之上的 原子锁 原子包实现协程的对同一个数据的操作&#xff0c;可以实现原子操作&#xff0c;只能用于简单变量的简单操作&#xff0c;可以把多个操作变成一个操作 sema锁 也叫信号量锁/信号锁 核心是一个uint32值&#…...

再见,CSDN

从我2018年1月31日加入CSDN&#xff0c;到现在已经5年多的时间了。在这5年里&#xff0c;陆陆续续在CSDN上发布了很多论文阅读笔记、教程、技术文章等等&#xff0c;记录了我从大四到研究生再到工作这段时间的学习和成长轨迹。 我一直有备份个人资料的习惯&#xff0c;尤其是耗…...

MySQL总复习

目录 登录 显示数据库 创建数据库 删除数据库 使用数据库 创建表 添加数据表数据 查询表 添加数据表多条数据 查询表中某数据 增insert 删delete 改update 查select ​ where like ​编辑 范围查找 order by 聚合函数 count max min sum avg g…...

2026年吃油腻重口后的脾虚湿热腹泻辨证用药与中成药选购参考

日常饮食中&#xff0c;若长期或一次性摄入过多油腻、辛辣、重口味食物&#xff0c;可能会引发肠胃不适的一种常见类型。这类情况的相关知识、公开产品信息整理如下&#xff0c;本文仅做日常健康科普&#xff0c;不构成诊断、治疗或用药建议。一、公开提到的该类型肠胃不适的常…...

2026 年 AI 工具聚合站:从模型入口到开发基础设施的进化之路

在 2026 年的 AI 开发生态中&#xff0c;开发者正面临一个矛盾的现状&#xff1a;一方面是 GPT-5.5、Claude 4.7、Gemini 3.1 等大模型的能力持续突破&#xff0c;带来了前所未有的技术红利&#xff1b;另一方面&#xff0c;模型碎片化、接口异构化、成本高企等问题&#xff0c…...

NoFences:免费开源桌面整理神器,让Windows桌面焕然一新

NoFences&#xff1a;免费开源桌面整理神器&#xff0c;让Windows桌面焕然一新 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 还在为Windows桌面上杂乱无章的图标而烦恼吗&a…...

如何用Python自动化脚本高效抢购热门演出门票?智能抢票解决方案揭秘

如何用Python自动化脚本高效抢购热门演出门票&#xff1f;智能抢票解决方案揭秘 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 还在为热门演唱会门票秒光而烦恼吗&#xff1…...

Sunshine游戏串流服务器:5步搭建你的终极私人云游戏平台

Sunshine游戏串流服务器&#xff1a;5步搭建你的终极私人云游戏平台 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要在任何设备上畅玩PC游戏&#xff0c;却受限于硬件性能&…...

AspectCore-Framework扩展组件全解析:与ASP.NET Core、Autofac、LightInject无缝集成

AspectCore-Framework扩展组件全解析&#xff1a;与ASP.NET Core、Autofac、LightInject无缝集成 【免费下载链接】AspectCore-Framework AspectCore is an AOP-based cross platform framework for .NET Standard. 项目地址: https://gitcode.com/gh_mirrors/as/AspectCore-…...

CANN/asc-devkit向量取反API

asc_neg 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcode.com/ca…...

企业级应用如何通过Taotoken聚合API管理多个大模型调用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 企业级应用如何通过Taotoken聚合API管理多个大模型调用 在构建企业级AI应用时&#xff0c;一个常见的需求是同时接入多个不同厂商的…...

智能数据上下文层:让AI代理真正理解您的企业数据价值

智能数据上下文层&#xff1a;让AI代理真正理解您的企业数据价值 【免费下载链接】WrenAI Turn any AI Agents into world-class data analysts through the open context layer that gives AI agents grounded, governed memory, context, SQL across 20 data sources, that h…...

8. Python 模块与包 深度解析

Python 模块与包 深度解析 目录 模块与包的概念模块基础 2.1 模块即 .py 文件2.2 import 语句与 from ... import2.3 模块搜索路径 sys.path 模块的编译与缓存包 4.1 常规包与 __init__.py4.2 命名空间包4.3 相对导入与绝对导入 __name__ 与 "__main__"模块与包的组…...