ESP32-IDF GPIO 专题
目录
- 一、基本介绍
- 1、配置结构体
- 2、API
- 2.1 gpio_config
- 2.2 gpio_reset_pin
- 2.3 gpio_set_intr_type
- 2.4 gpio_intr_enable
- 2.5 gpio_intr_disable
- 2.6 gpio_set_level
- 2.7 gpio_get_level
- 2.8 gpio_set_direction
- 2.9 gpio_set_pull_mode
- 2.10 gpio_isr_register
- 2.11 gpio_install_isr_service
- 2.12 gpio_uninstall_isr_service
- 2.13 gpio_isr_handler_add
- 2.14 gpio_isr_handler_remove
- 3、枚举类型
- 3.1 gpio_mode_t
- 3.2 gpio_pullup_t
- 3.3 gpio_pulldown_t
- 3.4 gpio_pull_mode_t
- 3.5 gpio_int_type_t
- 三、实例操作
- 1、例一——简单的点灯程序
- 2、例二——添加中断
- 2.1 通过 GPIO 读取实现
- 2.2 通过中断函数实现
一、基本介绍
API 参考路径
esp-idf/components/esp_driver_gpio/include/driver/gpio.h
。
ESP-IDF
由多个组件组成,组件中包含专门为 ESP 芯片编写的代码或第三方库(即第三方组件)。对于某些第三方库,ESP-IDF
提供专用的包装器和接口,以简化对第三方库的使用,或提高其与 ESP-IDF
其他功能的兼容性。某些情况下,第三方组件将直接呈现底层库的原始 API。
1、配置结构体
为确保应用程序与未来
ESP-IDF
版本的兼容性,请正确初始化配置结构体。
多数 ESP-IDF
中的初始化、配置和安装函数(通常以 ..._init()
、 ..._config()
和 ..._install()
命名)都需要一个指向配置结构体的指针作为参数。例如:
const esp_timer_create_args_t my_timer_args = {.callback = &my_timer_callback,.arg = callback_arg,.name = "my_timer"
};
esp_timer_handle_t my_timer;
esp_err_t err = esp_timer_create(&my_timer_args, &my_timer);
初始化函数不会存储指向配置结构体的指针,因此在栈上分配结构体是安全的。
下面介绍 GPIO 的配置结构体:
typedef struct {uint64_t pin_bit_mask; /*!< GPIO pin: set with bit mask, each bit maps to a GPIO */gpio_mode_t mode; /*!< GPIO mode: set input/output mode */gpio_pullup_t pull_up_en; /*!< GPIO pull-up */gpio_pulldown_t pull_down_en; /*!< GPIO pull-down */gpio_int_type_t intr_type; /*!< GPIO interrupt type */
#if SOC_GPIO_SUPPORT_PIN_HYS_FILTERgpio_hys_ctrl_mode_t hys_ctrl_mode; /*!< GPIO hysteresis: hysteresis filter on slope input */
#endif
} gpio_config_t;
pin_bit_mask
:GPIO 引脚号。- 比如
GPIO_NUM_2
,则配置为.pin_bit_mask = (1 << GPIO_NUM_2)
,
- 比如
mode
:选择输入/输出模式pull_up_en
:引脚上拉设置pull_down_en
:引脚下拉设置intr_type
:中断模式
有关这几个类型的定义在本文第三小节可以找到
2、API
在使用 GPIO 相关的 API 时,要加上头文件:
#include "driver/gpio.h"
2.1 gpio_config
esp_err_t gpio_config(const gpio_config_t *pGPIOConfig);
- 参数
pGPIOConfig
:GPIO 配置结构体,见第一小节
- 作用:
- 该函数用于初始化 GPIO 的 Mode、pull-up、PullDown、IntrType,
- 返回值
ESP_OK
成功ESP_ERR_INVALID_ARG
参数错误
2.2 gpio_reset_pin
esp_err_t gpio_reset_pin(gpio_num_t gpio_num)
- 参数:
gpio_num
:引脚号
- 作用
- 重置 GPIO 到默认状态(选择 GPIO 功能,启用上拉,禁用输入和输出)。
- 返回值
- 总是返回
ESP_OK
- 总是返回
2.3 gpio_set_intr_type
esp_err_t gpio_set_intr_type(gpio_num_t gpio_num, gpio_int_type_t intr_type)
- 参数
gpio_num
:引脚号intr_type
:中断类型,见第三小节
- 作用
- 设置 GPIO 中断类型
- 返回值
ESP_OK
成功ESP_ERR_INVALID_ARG
参数错误
2.4 gpio_intr_enable
esp_err_t gpio_intr_enable(gpio_num_t gpio_num)
- 参数
gpio_num
:引脚号
- 作用
- 使能 GPIO 中断
- 返回值
ESP_OK
成功ESP_ERR_INVALID_ARG
参数错误
2.5 gpio_intr_disable
esp_err_t gpio_intr_disable(gpio_num_t gpio_num)
- 参数
gpio_num
:引脚号
- 作用
- 禁用 GPIO 中断
- 返回值
ESP_OK
成功ESP_ERR_INVALID_ARG
参数错误
2.6 gpio_set_level
esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level)
- 参数
gpio_num
:引脚号level
:0: 低;1: 高
- 作用
- 设置 GPIO 输出电平
- 返回值
ESP_OK
成功ESP_ERR_INVALID_ARG
参数错误
通过启用
CONFIG_GPIO_CTRL_FUNC_IN_IRAM
,此函数允许在 ISR 上下文中禁用缓存的情况下执行。
2.7 gpio_get_level
int gpio_get_level(gpio_num_t gpio_num)
- 参数
gpio_num
:引脚号
- 作用
- 获取 GPIO 输入电平
- 返回值
- 0:低电平;1:高电平
如果引脚未配置为输入(或输入和输出),返回的值始终为 0。
2.8 gpio_set_direction
esp_err_t gpio_set_direction(gpio_num_t gpio_num, gpio_mode_t mode)
- 参数
gpio_num
:引脚号mode
:要设置的模式,见第三小节
- 作用
- 配置 GPIO 方向,例如仅输出,仅输入,输出和输入
- 返回值
ESP_OK
成功ESP_ERR_INVALID_ARG
参数错误
2.9 gpio_set_pull_mode
esp_err_t gpio_set_pull_mode(gpio_num_t gpio_num, gpio_pull_mode_t pull_mode)
- 参数
gpio_num
:引脚号pull_mode
:GPIO 拉高/拉低模式,见第三小节
- 作用
- 配置 GPIO 上拉/下拉电阻
- 返回值
ESP_OK
成功ESP_ERR_INVALID_ARG
参数错误
2.10 gpio_isr_register
esp_err_t gpio_isr_register(void (*fn)(void*), void *arg, int intr_alloc_flags, gpio_isr_handle_t *handle)
- 参数
fn
:中断处理函数arg
:中断处理函数的参数intr_alloc_flags
:用于分配中断的标志。一个或多个(通过位或运算组合)ESP_INTR_FLAG_*
值。handle
:返回句柄的指针。如果非 NULL,这里将返回中断的句柄。
esp32_idf/esp-idf/components/esp_hw_support/include/esp_intr_alloc.h
:
//Keep the LEVELx values as they are here; they match up with (1<<level)
#define ESP_INTR_FLAG_LEVEL1 (1<<1) ///< Accept a Level 1 interrupt vector (lowest priority)
#define ESP_INTR_FLAG_LEVEL2 (1<<2) ///< Accept a Level 2 interrupt vector
#define ESP_INTR_FLAG_LEVEL3 (1<<3) ///< Accept a Level 3 interrupt vector
#define ESP_INTR_FLAG_LEVEL4 (1<<4) ///< Accept a Level 4 interrupt vector
#define ESP_INTR_FLAG_LEVEL5 (1<<5) ///< Accept a Level 5 interrupt vector
#define ESP_INTR_FLAG_LEVEL6 (1<<6) ///< Accept a Level 6 interrupt vector
#define ESP_INTR_FLAG_NMI (1<<7) ///< Accept a Level 7 interrupt vector (highest priority)
#define ESP_INTR_FLAG_SHARED (1<<8) ///< Interrupt can be shared between ISRs
#define ESP_INTR_FLAG_EDGE (1<<9) ///< Edge-triggered interrupt
#define ESP_INTR_FLAG_IRAM (1<<10) ///< ISR can be called if cache is disabled
#define ESP_INTR_FLAG_INTRDISABLED (1<<11) ///< Return with this interrupt disabled
- 作用
- 注册 GPIO 中断处理程序,该处理程序是一个 ISR。处理程序将被附加到运行此函数的相同 CPU 核心上。每当发生任何 GPIO 中断时,都会调用此 ISR。
- 返回值
ESP_OK
成功ESP_ERR_INVALID_ARG
参数错误ESP_ERR_NOT_FOUND
在指定的标志下未找到可用的中断
2.11 gpio_install_isr_service
esp_err_t gpio_install_isr_service(int intr_alloc_flags)
- 参数
intr_alloc_flags
:分配中断时使用的标志。一个或多个(按 OR 运算)ESP_INTR_FLAG_*
值。见2.10
。
- 作用
- 安装 GPIO 驱动程序的
ETS_GPIO_INTR_SOURCE ISR
处理程序服务,允许为每个引脚配置GPIO中断处理程序。
- 安装 GPIO 驱动程序的
- 返回值
ESP_OK
成功ESP_ERR_INVALID_ARG
参数错误ESP_ERR_NOT_FOUND
没有找到具有指定标志的空中断ESP_ERR_INVALID_STATE
ISR 服务未初始化。
此功能与
gpio_isr_register()
不兼容 - 如果使用该功能,将为所有 GPIO 中断注册一个全局中断服务程序(ISR)。如果使用此功能,中断服务提供了一个全局 GPIO ISR,通过gpio_isr_handler_add()
函数注册单个引脚处理器。
2.12 gpio_uninstall_isr_service
void gpio_uninstall_isr_service(void)
卸载驱动的 GPIO ISR 服务,释放相关资源。
2.13 gpio_isr_handler_add
esp_err_t gpio_isr_handler_add(gpio_num_t gpio_num, gpio_isr_t isr_handler, void* args)
- 参数
gpio_num
:引脚号isr_handler
:中断处理函数args
:中断处理函数的参数
- 作用
- 为相应的 GPIO 引脚添加 ISR 处理器。使用完
gpio_install_isr_service()
后,调用此函数以安装驱动程序的 GPIO ISR 服务。
- 为相应的 GPIO 引脚添加 ISR 处理器。使用完
- 返回值
ESP_OK
成功ESP_ERR_INVALID_ARG
参数错误ESP_ERR_INVALID_STATE
ISR 服务未初始化。
中断服务例行程序(ISR)处理器不再需要使用
IRAM_ATTR
进行声明,除非在为中断服务程序(ISR)分配gpio_install_isr_service()
时传递ESP_INTR_FLAG_IRAM
标志。
此 ISR 处理器将从 ISR 中调用。因此有一个堆栈大小限制(在menuconfig
中可配置为“ISR 堆栈大小”)。与全局 GPIO 中断处理器相比,这个限制较小,因为多了一层间接性。
2.14 gpio_isr_handler_remove
esp_err_t gpio_isr_handler_remove(gpio_num_t gpio_num)
- 参数
gpio_num
:引脚号
- 作用
- 移除对应 GPIO 引脚的 ISR 处理器。
- 返回值
ESP_OK
成功ESP_ERR_INVALID_ARG
参数错误ESP_ERR_INVALID_STATE
ISR 服务未初始化。
3、枚举类型
选自文件:esp32_idf/esp-idf/components/hal/include/hal/gpio_types.h
3.1 gpio_mode_t
typedef enum {GPIO_MODE_DISABLE = GPIO_MODE_DEF_DISABLE, /* 禁用GPIO端口的输入和输出功能 */GPIO_MODE_INPUT = GPIO_MODE_DEF_INPUT, /* 输入模式 */GPIO_MODE_OUTPUT = GPIO_MODE_DEF_OUTPUT, /* 输出模式 */GPIO_MODE_OUTPUT_OD = ((GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)), /* 开漏模式,常用于与其他设备共享信号线的场景 */GPIO_MODE_INPUT_OUTPUT_OD = ((GPIO_MODE_DEF_INPUT) | (GPIO_MODE_DEF_OUTPUT) | (GPIO_MODE_DEF_OD)), /* 同时作为输入和输出,并且具有开漏特性。这种组合模式常用于复杂的需求,如与外部设备双向通信 */GPIO_MODE_INPUT_OUTPUT = ((GPIO_MODE_DEF_INPUT) | (GPIO_MODE_DEF_OUTPUT)), /*同时作为输入和输出 */
} gpio_mode_t;
3.2 gpio_pullup_t
typedef enum {GPIO_PULLUP_DISABLE = 0x0, /* 无上拉 */GPIO_PULLUP_ENABLE = 0x1, /* 设置为上拉 */
} gpio_pullup_t;
3.3 gpio_pulldown_t
typedef enum {GPIO_PULLDOWN_DISABLE = 0x0, /* 无下拉 */GPIO_PULLDOWN_ENABLE = 0x1, /* 设置为下拉 */
} gpio_pulldown_t;
3.4 gpio_pull_mode_t
typedef enum {GPIO_PULLUP_ONLY, /* 仅上拉 */GPIO_PULLDOWN_ONLY, /* 仅下拉 */GPIO_PULLUP_PULLDOWN, /* 同时配置为上拉和下拉 */GPIO_FLOATING, /* 浮动模式,即不施加任何上拉或下拉。引脚的电平状态是不确定的,通常用于测量或读取外部信号 */
} gpio_pull_mode_t;
3.5 gpio_int_type_t
typedef enum {GPIO_INTR_DISABLE = 0, /* 禁用中断 */GPIO_INTR_POSEDGE = 1, /* 上升沿触发 */GPIO_INTR_NEGEDGE = 2, /* 下降沿触发 */GPIO_INTR_ANYEDGE = 3, /* 上升沿和下降沿同时触发中断 */GPIO_INTR_LOW_LEVEL = 4, /* 引脚低电平时触发 */GPIO_INTR_HIGH_LEVEL = 5, /* 引脚高电平时触发 */GPIO_INTR_MAX, /* 通常用于循环或者判断是否超出范围而定义的最大值 */
} gpio_int_type_t;
三、实例操作
1、例一——简单的点灯程序
这一小节,以一个简单的点灯程序为例,来熟悉一下 ESP32-IDF GPIO 的使用。
创建程序相关见前:ESP32-IDF 在 Ubuntu 下的配置
例程代码如下:
#define LED1_GPIO GPIO_NUM_12void led1_run_task(void)
{int gpio_level = 0;while(1){gpio_level = !gpio_level;gpio_set_level(LED1_GPIO, gpio_level);vTaskDelay(pdMS_TO_TICKS(500));}
}void app_main(void)
{gpio_config_t led_conf = {.pin_bit_mask = (1 << LED1_GPIO),.pull_up_en = 1,.pull_down_en = GPIO_PULLDOWN_DISABLE,.mode = GPIO_MODE_OUTPUT,.intr_type = GPIO_INTR_DISABLE,};gpio_config(&led_conf);xTaskCreate((void *)led1_run_task, "led1", 1024 * 2, NULL, 0, NULL);
}
2、例二——添加中断
本例将读取外部按键 KEY 的状态,当按下 KEY 是窗口打印信息。
2.1 通过 GPIO 读取实现
这里通过 GPIO 读取 KEY 引脚来实现“中断”:
#define KEY_GPIO GPIO_NUM_9void app_main(void)
{gpio_config_t key_conf = {.pin_bit_mask = (1ULL << KEY_GPIO),.mode = GPIO_MODE_INPUT,.pull_up_en = GPIO_PULLUP_ENABLE,.pull_down_en = GPIO_PULLDOWN_DISABLE,.intr_type = GPIO_INTR_POSEDGE,};gpio_config(&key_conf);while (1) {if (gpio_get_level(KEY_GPIO) == 0){vTaskDelay(pdMS_TO_TICKS(10));while (gpio_get_level(KEY_GPIO) == 0);printf("KEY PRESSED\n");}}
}
2.2 通过中断函数实现
#define GPIO_INPUT_IO 9
#define GPIO_INPUT_PIN_SEL 1ULL<<GPIO_INPUT_IO
#define ESP_INTR_FLAG_DEFAULT 0static QueueHandle_t gpio_evt_queue = NULL;static void IRAM_ATTR gpio_isr_handler(void* arg)
{uint32_t gpio_num = (uint32_t) arg;xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
}static void gpio_task_example(void* arg)
{uint32_t io_num;for(;;) {if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {printf("GPIO[%ld] intr, val: %d\n", (uint32_t)io_num, gpio_get_level(io_num));}}
}void app_main(void)
{gpio_config_t gpio_conf = {.intr_type = GPIO_INTR_ANYEDGE, // 上升、下降沿都产生中断.pin_bit_mask = GPIO_INPUT_PIN_SEL, // bit mask of the pins, use GPIO0 here.mode = GPIO_MODE_INPUT, // 设置输入模式.pull_up_en = 1, // 使能上拉};gpio_config(&gpio_conf);//create a queue to handle gpio event from isrgpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));//start gpio taskxTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL);//install gpio isr servicegpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);//hook isr handler for specific gpio pingpio_isr_handler_add(GPIO_INPUT_IO, gpio_isr_handler, (void*) GPIO_INPUT_IO);
}
相关文章:

ESP32-IDF GPIO 专题
目录 一、基本介绍1、配置结构体2、API2.1 gpio_config2.2 gpio_reset_pin2.3 gpio_set_intr_type2.4 gpio_intr_enable2.5 gpio_intr_disable2.6 gpio_set_level2.7 gpio_get_level2.8 gpio_set_direction2.9 gpio_set_pull_mode2.10 gpio_isr_register2.11 gpio_install_isr_…...

深度学习代码学习笔记2
1、torch.max correct 0 total 0 for xb,yb in valid_dl:outputs model(xb)_,predicted torch.max(outputs.data,1)total yb.size(0) #yb.size(0) 返回的是张量 yb 在第 0 维的大小,也就是 yb 中的样本数量。correct (predicted yb).sum().item() print(…...

016集——c# 实现CAD类库 与窗体的交互(CAD—C#二次开发入门)
第一步:搭建CAD类库dll开发环境。 第二步:添加窗体 第三步:添加控件 第四步:双击控件,在控件点击方法内输入代码 第五步:在主程序内实例化新建的form类,并弹窗form窗体 第六步:CAD命…...

【亲测可行】最新ubuntu搭建rknn-toolkit2
文章目录 🌕结构图(ONNX->RKNN)🌕下载rknn-toolkit2🌕搭建环境🌙配置镜像源🌙conda搭建python3.8版本的虚拟环境🌙进入packages目录安装依赖库🌕测试安装是否成功🌕其它🌙rknn-toolkit2🌙rknn_model_zoo🌙关于部署的博客发布本文的时间为2024.10.13…...

pico+Unity交互开发——触碰抓取
一、VR交互的类型 Hover(悬停) 定义:发起交互的对象停留在可交互对象的交互区域。例如,当手触摸到物品表面(可交互区域)时,视为触发了Hover。 Grab(抓取) 概念ÿ…...

16年408计算机网络
第一题: 解析: 首先我们要清楚R1,R2,R3是路由器(网络层),Switch是以太网交换机(数据链路层),Hub是集线器(物理层)。 由此可见路由器实现的最高功能层是3层&am…...

PDF 转 CAD 工具:实现文档格式高效转换的利器
如果你从事设计相关PDF和CAD作为两种常见且重要的文件格式,在不同的领域都有着广泛的应用。今天,我们就来介绍几个各具特色的PDF转换成CAD工具。 1.福昕PDF转换大师 链接一下>>https://www.pdf365.cn/pdf2word/ 该工具在跨领域应用中表现出明确…...

基于springboot的画师约稿系统的设计与实现
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的画师约稿系统的设计与实…...

使用Python生成SVG图片
SVG(可缩放矢量图形)是一种基于XML的图像格式,它可以无损缩放且文件大小较小。在本文中,我们将探讨如何使用Python生成SVG图片。 为什么选择SVG? 可缩放:SVG图像可以无限放大而不失真。文件小:SVG文件通常比位图文件小。可编辑:SVG文件可以通过文本编辑器修改。 使用Python…...

hackmyvm-Hundred靶机
主机发现 sudo arp-scan -l 以sudo权限执行arp-scan -l 扫描并列出本地存在的机器,发现靶机ip为192.168.91.153 nmap扫描 端口发现 21/tcp open ftp 22/tcp open ssh 80/tcp open http web信息收集 我们先尝试一下ftp端口的匿名登录 FTP:是文件传输协议的端…...

多场景多任务建模(三): M2M(Multi-Scenario Multi-Task Meta Learning)
多场景建模: STAR(Star Topology Adaptive Recommender) 多场景建模(二): SAR-Net(Scenario-Aware Ranking Network) 前面两篇文章,讲述了关于多场景的建模方案,其中可以看到很多关于多任务学习的影子&…...

Day31 || 122.买卖股票的最佳时机 II、55. 跳跃游戏、 45.跳跃游戏II 、1005.K次取反后最大化的数组和
122.买卖股票的最佳时机 II 题目链接:力扣题目链接 思路:因为是求虽大利润完全可以假设知道第二天涨前一天买入即可,就是求两天只差大于0 的和。 55. 跳跃游戏 题目链接:力扣题目链接 思路:应该从后往前循环判断&…...

【uniapp】打包成H5并发布
目录 1、设置配置mainifest.sjon 1.1 页面标题 1.2 路由模式 1.3 运行的基础路径 2、打包 2.1 打包入口 2.2 打包成功 2.3 依据目录找到web目录 3、 将web目录整体拷贝出来 4、上传 4.1 登录uniapp官网注册免费空间 4.2 上传拷贝的目录 4.3 检查上传是否正确 5、…...

Position Embedding总结和Pytorch实现
文章目录 出现背景PE位置编码公式思路code 出现背景 自注意力机制处理数据,并不是采用类似RNN或者LSTM那种递归的结构,这使得模型虽然能够同时查看输入序列中的所有元素(即并行运算),但是也导致了没办法获取当前word在…...

【AIF-C01认证】亚马逊云科技生成式 AI 认证正式上线啦
文章目录 一、AIF-C01简介二、考试概览三、考试知识点3.1 AI 和 ML 基础知识3.2 生成式人工智能基础3.3 基础模型的应用3.4 负责任 AI 准则3.5 AI 解决方案的安全性、合规性和监管 四、备考课程4.1 「备考训练营」 在线直播课4.2 「SkillBuilder」学习课程 五、常见问题六、参考…...

C++ 素数的筛选法与穷举法
题目:素数大酬宾: 【问题描述】 某商场的仓库中有 n 种商品,每件商品按 1~n 依次编号。现在商场经理突发奇想,决定将编号为素数(质数)的所有商品拿出来搞优惠酬宾活动。请编程帮助仓库管理员将编号为素数的商品选出来…...

Spring Boot异步任务、任务调度与异步请求线程池的使用及原理
Spring Boot异步任务、任务调度与异步请求线程池的使用及原理 在Spring Boot应用程序中,异步任务、任务调度和异步请求线程池是提高系统性能和响应速度的重要工具。本文将详细讲解这些概念的使用及原理。 一、异步任务 异步任务是指可以在后台线程上执行的任务&a…...

Java爬虫之使用Selenium WebDriver 爬取数据
这里写自定义目录标题 Selenium WebDriver简介一、安装部署二、Java项目中使用1.引入依赖2.示例代码 三、WebDriver使用说明1.WebDriver定位器2.常用操作3.使用 cookie4.键盘与鼠标操作 Selenium WebDriver简介 Selenium WebDriver 是一种用于自动化测试 Web 应用程序的工具。…...

MyBatis 中updateByPrimaryKey和updateByPrimaryKeySelective区别
在 MyBatis 中,updateByPrimaryKey和updateByPrimaryKeySelective主要有以下区别: 一、功能 updateByPrimaryKey: 会根据传入的实体对象,将数据库表中对应主键的记录所有字段全部更新为实体对象中的值。即使实体对象中的某些字段…...

JavaScript下载文件(简单模式、跨域问题、文件压缩)
文章目录 简介简单文件下载通过模拟form表单提交通过XMLHttpRequest方式 跨域(oss)下载并压缩文件完整示例文件压缩跨域设置 简介 相信各位开发朋友都遇到过下载的文件的需求,有的非常简单,基本链接的形式就可以。 有的就比较复杂,涉及跨域…...

Django 定义使用模型,并添加数据
教材: Python web企业级项目开发教程(黑马程序员)第三章 模型 实验步骤: 1.创建项目和应用 前置步骤可看前文,进入到指定文件位置后创建 django-admin startproject mysite python manage.py startapp app01 2.注册…...

联名物料常泄漏?一端叠满“安全buff”
前段时间,一则关于爆火影视剧与知名茶饮品牌联名的消息在社交平台上迅速传播,宣传物料的照片也随之曝光——门店尚未上新,“小道消息”便已被疯传。但这种情况并非首次发生,让众多网友不禁猜想:这究竟是一场精心策划的…...

Flutter UI组件库(JUI)
Flutter UI组件库 (JUI) 介绍 您是否正在寻找一种方法来简化Flutter开发过程,并创建美观、一致的用户界面?您的搜索到此为止!我们的Flutter UI组件库(JUI)提供了广泛的预构建、可自定义组件,帮助您快速构建…...

国外电商系统开发-运维系统远程文件
设计初衷是为了让所有人都能方便的打开网页,就能查看Linux系统文件内容,而不再用cat、vim、more等命令去打开文件,这对于我们一个普通的研发或者是财务人员来说,显得太繁琐,因为他们很可能不会这些命令,其次…...

4. Node.js Path模块
2.3Path模块 2.3.1获取js文件的绝对路径 console.log(__dirname) //js文件所在的文件夹的绝对路径 console.log(__filename) //js文件的绝对路径输出: G:\py_project\nodejs_study G:\py_project\nodejs_study\file.js2.3.2拼接规范的绝对路径path.r…...

重构长方法之分解条件表达式
分解条件表达式 是一种重构长方法中常用的技术,它适用于复杂的条件逻辑。在方法中,条件分支(if-else 或 switch)有时会变得条件非常多,非常复杂,难以理解和维护。通过分解条件逻辑,可以让代码更…...

蚁群算法养老服务人员智能调度系统
养老行业近年来越发热门,如何有效调配服务人员成为许多机构的痛点。我们结合智能算法技术,开发出了一款专为养老行业量身打造的“蚁群算法养老服务人员调度系统”,能够精准、高效地为机构分配人员,从此告别人力资源调度难题。 系…...

java使用 IDEA自动补全功能 AI 插件
国内插件: CodeGeeX: 功能特性: 由国内团队开发,是一款智能编程助手插件。它集成了多种人工智能技术,能够在多个编程语言中提供智能代码补全、代码生成、代码优化和注释生成等功能。该插件特别适用于常见的编程任务…...

【ShuQiHere】 AI与自我意识:能否创造真正的自觉机器人?
🤖【ShuQiHere】 📜 目录 引言人类意识的探索机器意识的五大理论 功能主义(Functionalism)信息整合(Information Integration)体现主义(Embodiment)行动主义(Enaction&…...

【Linux 从基础到进阶】CPU性能调优与监控
CPU性能调优与监控 1. 引言 在计算机系统中,CPU是核心组件之一,其性能直接影响系统的整体表现和响应速度。无论是在企业服务器环境、虚拟化环境,还是大数据计算场景,优化和监控CPU性能都至关重要。通过合理的调优策略和监控工具…...