【STM32RT-Thread零基础入门】 3. PIN设备(GPIO)的使用
硬件:STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线
文章目录
- 前言
- 一、PIN设备介绍
- 1. 引脚编号获取
- 2. 设置引脚的输入/输出模式
- 3. 设置引脚的电平值
- 4. 读取引脚的电平值
- 5. 绑定引脚中断回调函数
- 6. 脱离引脚中断回调函数
- 7. 使能中断
- 二、任务1:LED灯双闪控制
- 1. 任务描述
- 2. 代码编写
- 三、任务2:蜂鸣器控制(查询法)
- 1. 任务描述
- 2. 代码编写
- 3. 测试
- 四、任务3:蜂鸣器控制(中断回调法)
- 1. 任务描述
- 2. 代码编写
- 3. 测试
- 五、任务4:同时实现LED闪烁和按键控制喇叭
- 1. 任务描述
- 2. 代码编写
- 3. 测试
- 总结
前言
在嵌入式系统中,GPIO是最常用的一种设备,在RT-Thread操作系统中,把GPIO命名为PIN设备。
一、PIN设备介绍
RT-Thread通过PIN设备对芯片的GPIO引脚进行管理,应用程序可以通过其提供的一组PIN设备管理接口来操作GPIO,PIN设备管理接口如表所示
接口 | 描述 |
---|---|
rt_pin_get() | 获取引脚编号 |
rt_pin_mode() | 设置引脚模式 |
rt_pin_write() | 设置引脚电平 |
rt_pin_read() | 读取引脚电平 |
rt_pin_attach_irq() | 绑定引脚中断回调函数 |
rt_pin_irq_enable() | 使能引脚中断 |
rt_pin_detach_irq() | 脱离引脚中断回调函数 |
1. 引脚编号获取
引脚变化和芯片的引脚号不是同一概念。RT-Thread的PIN设备驱动程序把芯片的不同引脚赋予不同的编号,操作PIN设备时,需要使用引脚编号来指定对哪个引脚进行操作。
可通过三种方法获得引脚编号:
(1)API法
利用rt_pin_get() 函数来获取引脚编号,例如获取PD9的引脚编号,则可以使用
pin_number = rt_pin_get("PD.9")
(2)宏定义法
对于STM32芯片,可以使用GET_PIN(PORTx,PIN)获取引脚编号,如硬件的PD9用于驱动LED_R_PIN,则可以把宏LED_R_PIN定义为相应的引脚编号,如下:
#define LED_R_PIN GET_PIN(D, 9)
(3)查看驱动文件
在drivers/drv_gpio.c中,pin[]数组定义了硬件平台的GPIO引脚编号,通过查看该数组,得到引脚PD9的编号为57。
具体数组代码如下:
static const struct pin_index pins[] =
{
#if defined(GPIOA)__STM32_PIN(0 , A, 0 ),__STM32_PIN(1 , A, 1 ),__STM32_PIN(2 , A, 2 ),__STM32_PIN(3 , A, 3 ),__STM32_PIN(4 , A, 4 ),__STM32_PIN(5 , A, 5 ),__STM32_PIN(6 , A, 6 ),__STM32_PIN(7 , A, 7 ),__STM32_PIN(8 , A, 8 ),__STM32_PIN(9 , A, 9 ),__STM32_PIN(10, A, 10),__STM32_PIN(11, A, 11),__STM32_PIN(12, A, 12),__STM32_PIN(13, A, 13),__STM32_PIN(14, A, 14),__STM32_PIN(15, A, 15),
#if defined(GPIOB)__STM32_PIN(16, B, 0),__STM32_PIN(17, B, 1),__STM32_PIN(18, B, 2),__STM32_PIN(19, B, 3),__STM32_PIN(20, B, 4),__STM32_PIN(21, B, 5),__STM32_PIN(22, B, 6),__STM32_PIN(23, B, 7),__STM32_PIN(24, B, 8),__STM32_PIN(25, B, 9),__STM32_PIN(26, B, 10),__STM32_PIN(27, B, 11),__STM32_PIN(28, B, 12),__STM32_PIN(29, B, 13),__STM32_PIN(30, B, 14),__STM32_PIN(31, B, 15),
#if defined(GPIOC)__STM32_PIN(32, C, 0),__STM32_PIN(33, C, 1),__STM32_PIN(34, C, 2),__STM32_PIN(35, C, 3),__STM32_PIN(36, C, 4),__STM32_PIN(37, C, 5),__STM32_PIN(38, C, 6),__STM32_PIN(39, C, 7),__STM32_PIN(40, C, 8),__STM32_PIN(41, C, 9),__STM32_PIN(42, C, 10),__STM32_PIN(43, C, 11),__STM32_PIN(44, C, 12),__STM32_PIN(45, C, 13),__STM32_PIN(46, C, 14),__STM32_PIN(47, C, 15),
#if defined(GPIOD)__STM32_PIN(48, D, 0),__STM32_PIN(49, D, 1),__STM32_PIN(50, D, 2),__STM32_PIN(51, D, 3),__STM32_PIN(52, D, 4),__STM32_PIN(53, D, 5),__STM32_PIN(54, D, 6),__STM32_PIN(55, D, 7),__STM32_PIN(56, D, 8),__STM32_PIN(57, D, 9),__STM32_PIN(58, D, 10),__STM32_PIN(59, D, 11),__STM32_PIN(60, D, 12),__STM32_PIN(61, D, 13),__STM32_PIN(62, D, 14),__STM32_PIN(63, D, 15),
2. 设置引脚的输入/输出模式
宏定义 | 描述 |
---|---|
PIN_MODE_OUTPUT | 推挽输出 |
PIN_MODE_OUTPUT_OD | 开漏输出,硬件需要外接上拉电阻 |
PIN_MODE_INPUT | 输入 |
PIN_MODE_INPUT_PULLUP | 上拉输入,引脚悬空时为高电平 |
PIN_MODE_INPUT_PULLDOWN | 下拉输入,引脚悬空时为低电平 |
引脚可通过以下函数设置输入/输出模式: |
void rt_pin_mode(rt_base_t pin, rt_base_t mode)
pin:引脚编号
mode:输入/输出模式所对应的宏
#define LED_R_PIN GET_PIN(D, 9)
rt_pin_mode(LED_R_PIN, PIN_MODE_OUTPUT);
3. 设置引脚的电平值
设置函数如下:
void rt_pin_write(rt_base_t pin, rt_base_t value)
pin:引脚编号
value:高电平为PIN_HIGH;低电平为PIN_LOW
4. 读取引脚的电平值
设置函数如下:
int rt_pin_read(rt_base_t pin)
pin:引脚编号
返回值:高电平为PIN_HIGH;低电平为PIN_LOW
5. 绑定引脚中断回调函数
引脚作为中断输入时,需要设置引脚的中断触发方式,引脚的中断触发模式有5种,RT-Thread中分别有5个宏与之对应,具体如下:
宏定义 | 描述 |
---|---|
PIN_IQR_MODE_RISING | 上升沿触发 |
PIN_IQR_MODE_FALLING | 下降沿触发 |
PIN_IQR_MODE_RISING_FALLING | 双边沿触发 |
PIN_IQR_MODE_HIGH_LEVEL | 高电平触发 |
PIN_IQR_MODE_LOW_LEVEL | 低电平触发 |
当引脚产生中断时,通过中断回调函数响应中断。绑定中断回调函数到引脚后,引脚有中断发生,就会执行对应的中断回调函数。
具体函数如下:
rt_err_t rt_pin_attach_irq(rt_int32_t pin, rt_uint32_t mode, void (*hdr)(void *args), void *args)
pin:引脚编号
mode:中断触发模式
hdr:中断回调函数指针,用户需要自定义这个函数
args:中断回调函数的参数,不需要设置时为RT_NULL
返回:绑定成功为RT_EOK;失败产生错误码
6. 脱离引脚中断回调函数
如不希望响应中断,或者想更换中断响应函数,则可以使用如下脱离引脚中断回调函数:
rt_err_t rt_pin_detach_irq(rt_int32_t pin)
pin:引脚编号
返回:脱离成功为RT_EOK;失败产生错误码
7. 使能中断
rt_err_t rt_pin_irq_enable(rt_base_t pin, rt_uint32_t enabled)
pin:引脚编号
enable:PIN_IRQ_ENABLE(开启),PIN_IRQ_DISABLE(关闭)
返回:使能成功为RT_EOK;失败产生错误码
二、任务1:LED灯双闪控制
1. 任务描述
控制LED1、LED2轮流闪烁。通过本任务,学习PIN设备输出功能的设置方法。
2. 代码编写
在项目的main.c文件中,编写如下代码:
#include <rtthread.h>
#include <rtdevice.h>
#include "drv_common.h"/* 定义左右转向灯的控制引脚 */
#define LED_L_PIN GET_PIN(D, 8)
#define LED_R_PIN GET_PIN(D, 9)int main(void)
{/* 把引脚设置为推拉输出模式 */rt_pin_mode(LED_L_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LED_R_PIN, PIN_MODE_OUTPUT);while (1){rt_pin_write(LED_L_PIN, PIN_HIGH);//灭左灯rt_pin_write(LED_R_PIN, PIN_LOW);//亮右灯rt_thread_mdelay(500);//延迟500毫秒rt_pin_write(LED_L_PIN, PIN_LOW);//亮左灯rt_pin_write(LED_R_PIN, PIN_HIGH);//灭右灯rt_thread_mdelay(500);}return RT_EOK;
}
三、任务2:蜂鸣器控制(查询法)
1. 任务描述
通过按键控制蜂鸣器的开关。当按键按下时,蜂鸣器响起;当按键松开时,蜂鸣器关闭。通过本任务,学习PIN设备输入功能的使用。
2. 代码编写
#include <rtthread.h>
#include <rtdevice.h>
#include "drv_common.h"/* 定义左右转向灯的控制引脚 */
#define BEEP_PIN GET_PIN(A, 5)
#define KEY1_PIN GET_PIN(A, 0)int main(void)
{/* 把蜂鸣器引脚设置为推拉模式 */rt_pin_mode(BEEP_PIN, PIN_MODE_OUTPUT);/* 把按键引脚设置为上拉输入模式 */rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT_PULLUP);while (1){if(PIN_LOW==rt_pin_read(KEY1_PIN)){//按键按下rt_thread_mdelay(20);//延时去抖if(PIN_LOW==rt_pin_read(KEY1_PIN))rt_pin_write(BEEP_PIN, PIN_LOW);//蜂鸣器响}elsert_pin_write(BEEP_PIN, PIN_HIGH);//否则,蜂鸣器不响rt_thread_mdelay(300);//每0.3秒进行一次按键扫描}return RT_EOK;
}
3. 测试
按下按键,蜂鸣器发声,松开按键,停止发声,但是经过多次尝试发现,按键检测成功率较低,所以需要利用中断进行改进。
四、任务3:蜂鸣器控制(中断回调法)
1. 任务描述
通过按键控制蜂鸣器的开关。当按键按下时,蜂鸣器响起;当按键松开时,蜂鸣器关闭。通过本任务,掌握PIN设备中断回调函数的使用方法。
2. 代码编写
#include <rtthread.h>
#include <rtdevice.h>
#include "drv_common.h"#define BEEP_PIN GET_PIN(A, 5) //定义蜂鸣器的控制引脚
#define KEY1_PIN GET_PIN(A, 0) //定义按键的控制引脚/* 定义中断回调函数实现 */
void beep_on(void *args)
{/* 判断按键是否按下 */if(PIN_LOW==rt_pin_read(KEY1_PIN)){/* 按键按下,驱动蜂鸣器响 */rt_pin_write(BEEP_PIN, PIN_LOW);/* 等待按键台起 */while(PIN_LOW==rt_pin_read(KEY1_PIN));/* 关闭蜂鸣器 */rt_pin_write(BEEP_PIN, PIN_HIGH);}
}
int main(void)
{rt_pin_mode(BEEP_PIN, PIN_MODE_OUTPUT); //把蜂鸣器引脚设置为推拉模式rt_pin_write(BEEP_PIN, PIN_HIGH); //初始化蜂鸣器默认状态为不响/* 把按键引脚设置为上拉输入模式 */rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT_PULLUP);/* 绑定中断,下降沿触发模式,回调函数名为beep_on */rt_pin_attach_irq(KEY1_PIN, PIN_IRQ_MODE_FALLING, beep_on, RT_NULL);rt_pin_irq_enable(KEY1_PIN, PIN_IRQ_ENABLE); //使能中断return RT_EOK;
}
3. 测试
按下按键,蜂鸣器发声,松开按键,停止发声,经过多次尝试发现,按键检测成功率较高,所以中断法比查询法更具优势。
五、任务4:同时实现LED闪烁和按键控制喇叭
1. 任务描述
本任务功能为同时实现LED灯双闪功能和按键控制蜂鸣器的功能,要求两个功能不能相互影响,按键检测灵敏度要高,即每次发生按键按下的事件,程序都能成功检测该事件并开启蜂鸣器。
2. 代码编写
#include <rtthread.h>
#include <rtdevice.h>
#include "drv_common.h"#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>/* 定义左右转向灯的控制引脚 */
#define LED_L_PIN GET_PIN(D, 8)
#define LED_R_PIN GET_PIN(D, 9)
/* 定义蜂鸣器的控制引脚 */
#define BEEP_PIN GET_PIN(A, 5)
/* 定义按键的控制引脚 */
#define KEY1_PIN GET_PIN(A, 0)/* 定义中断回调函数 */
void beep_on(void *args)
{/* 判断按键是否按下 */if(PIN_LOW==rt_pin_read(KEY1_PIN)){rt_pin_write(BEEP_PIN, PIN_LOW); //按按键下,驱动蜂鸣器响 while(PIN_LOW==rt_pin_read(KEY1_PIN)); //等待按键台起rt_pin_write(BEEP_PIN, PIN_HIGH); //关闭蜂鸣器}
}int main(void)
{/* 把LED灯引脚设置为输出模式 */rt_pin_mode(LED_L_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LED_R_PIN, PIN_MODE_OUTPUT);/* 把蜂鸣器引脚设置为推拉模式 */rt_pin_mode(BEEP_PIN, PIN_MODE_OUTPUT);/* 初始化蜂鸣器默认状态为不响 */rt_pin_write(BEEP_PIN, PIN_HIGH);/* 把按键引脚设置为上拉输入模式 */rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT_PULLUP);/* 绑定中断,下降沿触发模式,回调函数名为beep_on */rt_pin_attach_irq(KEY1_PIN, PIN_IRQ_MODE_FALLING, beep_on, RT_NULL);rt_pin_irq_enable(KEY1_PIN, PIN_IRQ_ENABLE); // 使能中断 while(1){rt_pin_write(LED_L_PIN, PIN_HIGH);//亮左灯rt_pin_write(LED_R_PIN, PIN_LOW);//灭右灯rt_thread_mdelay(500);//延迟500毫秒rt_pin_write(LED_L_PIN, PIN_LOW);//灭左灯rt_pin_write(LED_R_PIN, PIN_HIGH);//亮右灯rt_thread_mdelay(500);}return RT_EOK;
}
3. 测试
测试过程如下:
(1)系统启动后,观察左右转向灯是否轮流闪烁;
(2)当按下按键时,喇叭是否发出响声;
(3)当松开按键时,喇叭是否停止发出响声;
(4)一直按住按键不松开,观察灯的闪烁情况。
测试结果:
(1)系统启动后,左右转向灯轮流闪烁;
(2)当按下按键时,喇叭发出响声;
(3)当松开按键时,喇叭停止发出响声;
(4)一直按住按键不松开,喇叭发出响声,灯停止闪烁。
总结
从任务4测试结果中,我们可以发现,按键功能影响了闪灯的功能,说明两个功能还是没有很好地解耦,依然存在相互影响的情况。
出现这种情况,主要是由于中断回调函数中存在需要长时间等待的代码,当按键一直按住不松开的时候,中断回调函数由于一直停留在等待按键松开的地方而无法退出中断处理。而中断的优先级又高于main()线程的优先级,从而导致main()线程无法得到执行。
通常,我们不应该在中断回调函数中进行长时间的处理,中断回调函数应该只做一些必要的快速处理操作,而把长时间的处理操作放到线程中实现。
关于线程和优先级的概念,我们在下一节讲述。
相关文章:

【STM32RT-Thread零基础入门】 3. PIN设备(GPIO)的使用
硬件:STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 文章目录 前言一、PIN设备介绍1. 引脚编号获取2. 设置引脚的输入/输出模式3. 设置引脚的电平值4. 读取引脚的电平值5. 绑定引脚中断回调函数6. 脱离引脚中断…...

fiddler抓包工具的用法以及抓取手机报文定位bug
前言: fiddler抓包工具是日常测试中常用的一种bug定位工具 一 抓取https报文步骤 使用方法: 1 首先打开fiddler工具将证书导出 点击TOOLS------Options------Https-----Actions---选中第二个选项 2 把证书导出到桌面后 打开谷歌浏览器 设置---高级…...
spring中时间格式化的两种方式
方法一:自己格式化 自己写一个格式化的类,把date类型的时间传进去: public class DateUtil {public static String formatDate(Date date){SimpleDateFormat simpleDateFormatnew SimpleDateFormat("yyyy-MM-dd HH:mm:ss");retur…...

【设计模式】原型模式
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接…...

Matlab的Filter Designer工具设计二阶低通滤波器
Matlab版本:2018b 本文要求:设计一个二阶巴特沃斯低通滤波器用于嵌入式软件滤波,传感器采样频率是20KHz,截止频率是333Hz,获取滤波系数,本文不包括二阶滤波推导和代码编写。 打开Matlab->APP->Filt…...

软件测试基础篇——LAMP环境搭建
LAMP 1、Linux系统的其他命令 find命令:在目录下查找文件 格式一:find 路径 参数 文件名 路径:如果没有指定路径,默认是在当前目录下 参数:-name 根据文件名来查找,区分大小写; -…...
使用dom4j将xml转为String并去掉所有格式
文章目录 功能描述实现代码 功能描述 有以下xml内容,需要转成String字符串。同时,要去掉文中所有格式。 <root><student><name>张三</name><sex>男</sex><age>16</age><class>1班</class>…...

wsl2安装docker引擎(Install Docker Engine on Debian)
安装 1.卸载旧版本 在安装 Docker 引擎之前,您必须首先确保卸载任何冲突的软件包。 发行版维护者在他们的存储库。必须先卸载这些软件包,然后才能安装 Docker 引擎的正式版本。 要卸载的非官方软件包是: docker.iodocker-composedocker-…...

百日筑基篇——python爬虫学习(一)
百日筑基篇——python爬虫学习(一) 文章目录 前言一、python爬虫介绍二、URL管理器三、所需基础模块的介绍1. requests2. BeautifulSoup1. HTML介绍2. 网页解析器 四、实操1. 代码展示2. 代码解释1. 将大文件划分为小的文件(根据AA的ID数量划…...

【Spring专题】Spring之底层架构核心概念解析
目录 前言前置知识课程内容一、BeanDefinition:图纸二、BeanDefinitionReader:图纸注册器——Spring工厂基础设施之一2.1 AnnotatedBeanDefinitionReader2.2 XmlBeanDefinitionReader2.3 ClassPathBeanDefinitionScanner基本介绍总结使用示例 三、BeanFa…...
electron 使用node C++插件 node-gyp
node C插件使用,在我们常规使用中,需要使用node-gyp指定对饮的node版本即可 在electron的使用中,我们需要指定的是electron版本要不然会报错使用的v8内核版本不一致导致C扩展无法正常引入 electron官方文档-node原生模块 package.json {&quo…...
学习Vue:使用条件渲染指令(v-if,v-else,v-show)
在 Vue.js 中,条件与循环是实现动态交互界面的关键要素。通过使用条件渲染指令,您可以根据不同的条件决定是否显示或隐藏特定的内容。在本文中,我们将介绍三个常用的条件渲染指令:v-if、v-else 和 v-show,以及它们的用…...

【图像去噪的滤波器】非局部均值滤波器的实现,用于鲁棒的图像去噪研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

Redis辅助功能
一、Redis队列 1.1、订阅 subscribe ch1 ch2 1.2 publish:发布消息 publish channel message 1.3 unsubscribe: 退订 channel 1.4 模式匹配 psubscribe ch* 模糊发布,订阅,退订, p* <channelName> 1.5 发布订阅原理 订阅某个频道或…...

快手商品详情数据API 抓取快手商品价格、销量、库存、sku信息
快手商品详情数据API是用来获取快手商品详情页数据的接口,请求参数为商品ID,这是每个商品唯一性的标识。返回参数有商品标题、商品标题、商品简介、价格、掌柜昵称、库存、宝贝链接、宝贝图片、商品SKU等。 接口名称:item_get 公共参数 名…...

linux系统部署jenkins详细教程
一、Linux环境 1、下载war包 官网下载地址: https://get.jenkins.io/war-stable/2.332.4/jenkins.war 2、将war包上传至服务器 创建目录/home/ubuntu/jenkins 上传war包至该目录 3、将jenkins添加到环境变量 进入环境变量文件 vim /etc/profile # 文件下方追加…...
Arduino驱动BME680环境传感器(环境传感器篇)
目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序...

领航未来!探索开源无人机与5G组网的前沿技术
近年来无人机行业高速发展,无人机被广泛应用于航拍、农业、电力、消防、科研等领域。随着无人机市场不断增长,其对实时超高清图传、远程低时延控制、海量数据处理等需求也在不断扩张,这无疑给通信链路带来了巨大的挑战。 为应对未来的需求变…...
分布式事务CAP与BASE简介
一、CAP理论 CAP理论是由Eric Brewer教授在2000年举⾏的ACM研讨会上提出的⼀个著名猜想:⼀致性(Consistency)、可⽤性(Availability)、分区容错(Partition-tolerance),并且在分布式系…...

Integer中缓存池讲解
文章目录 一、简介二、实现原理三、修改缓存范围 一、简介 Integer缓存池是一种优化技术,用于提高整数对象的重用和性能。在Java中,对于整数值在 -128 到 127 之间的整数对象,会被放入缓存池中,以便重复使用。这是因为在这个范围…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...