DA14585墨水屏学习
一、do_min_word
void do_min_work(void)
{timer_used_min = app_easy_timer(APP_PERIPHERAL_CTRL_TIMER_DELAY_MINUTES, do_min_work);current_unix_time += time_offset;time_offset = 60;// if (isconnected == 1)// {// GPIO_SetActive(GPIO_LED_PORT, GPIO_LED_PIN);// GPIO_SetInactive(GPIO_LED_PORT, GPIO_LED_G_PIN);// DEV_Delay_ms(5);// }arch_printf("current_unix_time:%d\n", current_unix_time);do_time_show();if (step == 0){// do_img_save();step = 1;display();}// time_refresh_count++;// if ((time_refresh_count >= Time_To_Refresh) && (g_tm.tm_min == 0 && g_tm.tm_hour == 0))// {// if (step == 0)// {// // do_img_save();// step = 1;// display();// }// }// GPIO_SetActive(GPIO_LED_PORT, GPIO_LED_G_PIN);// GPIO_SetInactive(GPIO_LED_PORT, GPIO_LED_PIN);
}
这段代码是一个定时器回调函数,用于每分钟执行一次系统时间更新和显示刷新操作。以下是对代码的详细解释:
void do_min_work(void)
{// 1. 重新设置定时器,确保每分钟执行一次timer_used_min = app_easy_timer(APP_PERIPHERAL_CTRL_TIMER_DELAY_MINUTES, do_min_work);// 2. 时间更新逻辑current_unix_time += time_offset; // 累加当前时间(秒)time_offset = 60; // 重置偏移量为60秒(1分钟)// 3. 调试输出当前时间arch_printf("current_unix_time:%d\n", current_unix_time);// 4. 显示时间do_time_show();// 5. 状态机控制(仅在step=0时执行一次)if (step == 0){step = 1; // 切换状态display(); // 更新显示内容}
}
其中:APP_PERIPHERAL_CTRL_TIMER_DELAY_MINUTES是一个宏,其定义如下 :
#define APP_PERIPHERAL_CTRL_TIMER_DELAY_MINUTES 6000,这时是否少了一个0,不得而知。
代码关键点解释
-
定时器机制:
- 通过
app_easy_timer
函数设置一个每分钟触发的定时器 - 每次回调执行时会重新设置定时器,形成循环调用
APP_PERIPHERAL_CTRL_TIMER_DELAY_MINUTES
应定义为 60000ms(1 分钟)
- 通过
-
时间维护:
current_unix_time
存储当前的 Unix 时间戳(秒)time_offset
初始为 60,每次累加后重置,确保每分钟递增 60 秒- 这种设计允许系统在无法获取 RTC 时通过软件维护时间
-
显示控制:
do_time_show()
:更新时间显示display()
:刷新整个显示内容- 使用
step
变量实现状态机控制,确保某些操作只执行一次
-
注释代码分析:
- 被注释的 LED 控制代码表明系统可能通过 LED 指示连接状态
do_img_save()
可能用于保存屏幕截图或图像数据- 时间刷新条件检查(午夜 0 点)被注释,可能用于每日特定操作
二、app_easy_timer
函数
timer_hnd app_easy_timer(const uint32_t delay, timer_callback fn)
{// Sanity checksASSERT_ERROR(delay > 0); // Delay should not be zeroASSERT_ERROR(delay <= KE_TIMER_DELAY_MAX); // Delay should not be more than maximum allowedtimer_hnd timer_id = set_callback(fn);if (timer_id == EASY_TIMER_INVALID_TIMER){return EASY_TIMER_INVALID_TIMER; //No timers available}// Create timercreate_timer(timer_id, delay);return timer_id;
}
其中timer_hnd定义如下 :typedef uint8_t timer_hnd;
app_easy_timer 函数用于创建一个定时器,在指定的延时后执行回调函数。它提供了参数检查、资源分配和定时器初始化的功能。
timer_hnd app_easy_timer(const uint32_t delay, timer_callback fn)
{// 1. 参数有效性检查ASSERT_ERROR(delay > 0); // 延时必须大于0ASSERT_ERROR(delay <= KE_TIMER_DELAY_MAX); // 延时不能超过系统最大限制// 2. 分配定时器资源并注册回调函数timer_hnd timer_id = set_callback(fn);if (timer_id == EASY_TIMER_INVALID_TIMER){return EASY_TIMER_INVALID_TIMER; // 没有可用的定时器资源}// 3. 创建并启动定时器create_timer(timer_id, delay);// 4. 返回定时器句柄供后续操作使用return timer_id;
}
核心功能分析 1. 参数检查:
◦ delay > 0:确保延时时间有效
◦ delay <= KE_TIMER_DELAY_MAX:防止过大的延时值导致系统异常
◦ ASSERT_ERROR 通常是断言宏,参数不合法时会触发错误处理
2. 资源分配:
◦ set_callback(fn) 函数: ◦ 分配一个定时器 ID
◦ 将传入的回调函数 fn 与该 ID 关联
◦ 返回 EASY_TIMER_INVALID_TIMER 表示资源不足
3. 定时器初始化:
◦ create_timer(timer_id, delay) 函数:
◦ 使用分配的 ID 配置硬件 / 软件定时器
◦ 设置延时值 delay(单位通常为毫秒)
◦ 启动定时器开始倒计时
4. 错误处理:
◦ 当无可用定时器资源时,函数会立即返回错误码
◦ 上层应用需要检查返回值以处理错误情况
5.典型使用流程
1. 调用示例:
// 设置一个1000ms后执行的定时器
timer_hnd my_timer = app_easy_timer(1000, my_callback_function);
if (my_timer == EASY_TIMER_INVALID_TIMER) {
// 处理定时器创建失败的情况
}
2. 回调函数定义:
void my_callback_function(void) {
// 定时器到期时执行的代码
// 例如更新状态、触发事件等
}
6.注意事项
1). 定时器资源限制:
◦ 系统通常有最大定时器数量限制
◦ 未释放的定时器会持续占用资源
2). 延时精度:
◦ 实际延时可能受系统负载影响
◦ 依赖底层定时器硬件的精度
3). 回调函数约束:
◦ 避免在回调中执行耗时操作
◦ 确保回调函数可重入(如果支持多定时器并发)
4. ) 资源释放:
◦ 通常需要配套的定时器删除函数(如 delete_timer(timer_hnd))
◦ 不再使用的定时器应及时释放
这个函数提供了嵌入式系统中常用的定时器功能抽象,通过分离资源分配和定时器操作,使上层应用可以更方便地使用定时服务。
7.其中set_callback函数定义如下:
***************************************************************************************** @brief Place a callback in the first available position in the timer callback array.* @param[in] fn The callback to be added* @return The handler of the timer for future reference. EASY_TIMER_INVALID_TIMER if* there is no timer available*****************************************************************************************/
static timer_hnd set_callback(timer_callback fn)
{for (int i = 0; i < APP_TIMER_MAX_NUM; i++){if (timer_callbacks[i] == NULL){timer_callbacks[i] = fn;return APP_EASY_TIMER_IDX_TO_HND(i);}}return EASY_TIMER_INVALID_TIMER;
}
这段代码实现了一个内部函数 set_callback,用于在定时器回调数组中分配一个空闲位置并注册回调函数。以下是对代码的详细解释:set_callback 是一个静态函数,用于从回调数组中分配一个未使用的索引,并将传入的回调函数 fn 存储在该位置。如果找不到空闲位置(即所有定时器都已被占用),则返回错误码。
static timer_hnd set_callback(timer_callback fn)
{
// 遍历定时器回调数组,查找空闲位置
for (int i = 0; i < APP_TIMER_MAX_NUM; i++)
{
// 如果发现某个位置为空(NULL),说明该位置未被使用
if (timer_callbacks[i] == NULL)
{
// 将回调函数存储到该位置
timer_callbacks[i] = fn;
// 将数组索引转换为定时器句柄并返回
return APP_EASY_TIMER_IDX_TO_HND(i);
}
}
// 如果遍历完所有位置都没有找到空闲位置,返回错误码
return EASY_TIMER_INVALID_TIMER;
}
其中:timer_calback 定义如下 :
// Timer callback function type definition
typedef void (* timer_callback)(void);
此代码解析:这段代码定义了一个函数指针类型 timer_callback,用于表示定时器回调函数的原型。
类型定义:
◦ timer_callback 是一个函数指针类型,指向 无参数、无返回值 的函数。
函数原型要求:
◦ 回调函数必须符合 void function_name(void) 的形式。
◦ 例如:
void my_timer_handler(void) {
// 定时器触发时执行的代码
}
用途:
◦ 作为参数传递给定时器 API(如 app_easy_timer),用于注册定时执行的任务。
◦ 系统在定时器到期时,会通过该函数指针调用对应的回调函数。
典型应用场景
// 定义回调函数
void update_led(void) {
// 更新LED状态
}
// 创建定时器,注册回调
timer_hnd timer = app_easy_timer(1000, update_led); // 1秒后执行
技术要点
1. 函数指针语法:
◦ void (*)(void) 表示指向 “无参数、无返回值函数” 的指针。
◦ typedef 将该指针类型命名为 timer_callback,简化后续使用。
2. 与定时器系统的关联:
◦ 结合之前分析的 set_callback 函数,timer_callbacks 数组实际存储的就是 timer_callback 类型的函数指针。
◦ 当定时器到期时,系统会直接调用 timer_callbacks[index]()。
3. 兼容性要求: ◦ 所有注册的回调函数必须严格遵循 void(void) 原型,否则可能导致栈破坏或参数传递异常。
注意事项
1. 回调函数的执行环境:
◦ 回调函数可能在中断上下文或低优先级任务中执行,应避免耗时操作(如阻塞 IO)。
2. 参数传递限制:
◦ 由于函数原型固定为无参数,若需传递上下文,可通过全局变量或闭包技术(如 C++ lambda 捕获)。
3. 错误处理:
◦ 回调函数内部应包含必要的错误检查,避免因异常导致系统崩溃。
其中:timer_callbacks数组定义如下 :
// Array that holds the callback function of the active timers
static timer_callback timer_callbacks[APP_TIMER_MAX_NUM] __SECTION_ZERO("retention_mem_area0");
这段代码声明了一个静态数组 timer_callbacks,用于存储系统中所有活跃定时器的回调函数。以下是详细解释:
数据结构:
◦ timer_callbacks 是一个静态数组,大小为 APP_TIMER_MAX_NUM,表示系统最多支持的并发定时器数量。
◦ 数组元素类型为 timer_callback(即函数指针,指向 void (*)(void) 类型的函数)。
存储属性:
◦ static 关键字确保数组的作用域仅限于当前文件,避免外部访问。
◦ __SECTION_ZERO("retention_mem_area0") 是一个特殊的编译器指令,
用于:
◦ 将数组放置在名为 "retention_mem_area0" 的内存区域。
◦ __SECTION_ZERO 通常表示该区域在系统复位时不会被清零(即 “保留内存”),适用于需要在睡眠 / 唤醒周期中保持状态的场景。
初始化:
◦ 由于位于 __SECTION_ZERO 区域,数组初始值为全零(即所有元素初始化为 NULL),表示无活跃定时器。
关键技术点
1. 回调函数管理:
◦ 数组索引对应定时器 ID,例如 timer_callbacks[0] 对应第一个定时器的回调函数。
◦ set_callback 函数通过线性搜索找到第一个 NULL 位置,将回调函数存入并返回索引。
2. 保留内存的作用:
◦ 在低功耗系统中,部分内存区域可配置为 “保留” 状态,即使系统进入睡眠模式也不会断电。
◦ 定时器回调数组位于保留区,可确保:
◦ 睡眠唤醒后定时器状态不丢失。
◦ 无需重新初始化定时器配置。
3. 与硬件的关联:
◦ 实际硬件定时器可能通过 ID 与数组索引映射,
例如:
// 定时器触发时,通过索引调用对应回调
void hardware_timer_isr(uint8_t timer_idx) {
if (timer_callbacks[timer_idx] != NULL) {
timer_callbacks[timer_idx](); // 执行回调
}
}
应用场景
1. 嵌入式系统中的定时任务:
◦ 周期性数据采集(如传感器读数)。
◦ 状态机超时处理。
◦ 通信协议中的定时响应(如心跳包)。
2. 低功耗设计:
◦ 配合 RTC(实时时钟)实现长时间定时唤醒。
◦ 在休眠模式下保持关键定时器状态。
注意事项
1. 内存限制:
◦ APP_TIMER_MAX_NUM 受保留内存区域大小限制,需根据实际需求调整。
2. 线程安全:
◦ 多任务环境中修改数组需加锁保护,避免竞态条件。
3. 兼容性:
◦ __SECTION_ZERO 是特定编译器的扩展(如 GCC、ARMCC),不同平台语法可能不同。
总结 该数组是定时器系统的核心数据结构,通过将回调函数存储在保留内存区域,确保系统在休眠 / 唤醒周期中能持续管理定时任务。这种设计在资源受限的嵌入式系统中尤为重要,既能高效利用内存,又能保证关键状态不丢失。
相关文章:
DA14585墨水屏学习
一、do_min_word void do_min_work(void) {timer_used_min app_easy_timer(APP_PERIPHERAL_CTRL_TIMER_DELAY_MINUTES, do_min_work);current_unix_time time_offset;time_offset 60;// if (isconnected 1)// {// GPIO_SetActive(GPIO_LED_PORT, GPIO_LED_PIN);// …...
AI日报 · 2025年5月10日|OpenAI“Stargate”超级数据中心项目掀起美国各州争夺战
1、OpenAI“Stargate”超级数据中心项目掀起美国各州争夺战 《华盛顿邮报》披露,OpenAI 与 Oracle、SoftBank 合作推进的“Stargate”项目(首期投资 1000 亿美元,四年内总投资 5000 亿美元)已收到超过 250 份选址提案ÿ…...
浅谈装饰模式
一、前言 hello大家好,本次打算简单聊一下装饰者模式,其实写有关设计模式的内容还是蛮有挑战性的,首先呢就是小永哥实力有限担心说不明白,其次设计模式是为了解决某些问题场景,在当前技术生态圈如此完善的情况下&#…...
《Python星球日记》 第54天:卷积神经网络进阶
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、深度CNN架构解析1. LeNet-5(1998)2. AlexNet&#x…...
R 语言科研绘图 --- 桑基图-汇总
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
JDBC工具类
目录 引言 一、JDBC连接数据库步骤 1. 加载驱动 2. 获取连接(URL 用户名 密码) 3. 编写sql 4. 获取执行sql的stmt的对象 5. 执行sql 拿到结果集 6. 遍历结果集 7. 关闭资源(先开的后关 后开的先关) 二、JDBC工具类 版…...
【深度学习-Day 8】让数据说话:Python 可视化双雄 Matplotlib 与 Seaborn 教程
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
InnoDB结构与表空间文件页的详解
目录 1.InnoDB的概览 表空间文件在哪里? 为什么要设计成内存结构和磁盘结构? 表空间与表空间文件关系? 用户数据如何在表空间文件存储? 2.页 如何设置页的大小? 页的结构及在表空间的位置? 页头包…...
计算机网络基础科普
IP地址是计算机网络中标识设备的唯一地址 IPv4(32位)IPv6(128位) 1.IPv4(32位) 简介:IPv4(Internet Protocol version 4)是互联网协议(IP)的…...
PostgreSQL 的 pg_advisory_lock_shared 函数
PostgreSQL 的 pg_advisory_lock_shared 函数详解 pg_advisory_lock_shared 是 PostgreSQL 提供的共享咨询锁函数,允许多个会话同时获取相同键值的共享锁,但排斥排他锁。 共享咨询锁 vs 排他咨询锁 锁类型共享锁 (pg_advisory_lock_shared)排他锁 (pg…...
Win11安装APK方法详解
1、官方win11系统 预览版 开发版 正式版 都行 2、同时你还需要开启主板 BIOS 虚拟化选项(具体名称不同主板略有不同) 这一步自行百度 开始:先去确定有没有开启虚拟化 任务管理器检查—— 虚拟化是否已经开启,如果没有自己去BIO…...
kafka的安装及简单使用
kafka 1、什么是kafka kafka是一个分布式事件流平台,核心功能有发布/订阅消息系统、实时处理数据流等,Kafka非常适合超大数据量场景。 2、kafka安装 (1)下载 在kafka官网下载二进制压缩包 (2)解压安…...
圆角边框 盒子阴影 文字阴影
一.圆角边框 在css3中,新增了圆角边框样式,这样我们的盒子就可以变成圆角了 1.border-radius border-radius属性用于设置元素的外边框圆角 border-radius:length; radius半径(圆的半径)原理:椭圆与矩形边框的交集形…...
LRU CPP实现
缓存结构: 使用一个双向链表(std::list<int>)保存缓存中的页面编号,越靠前的是最近访问的,越靠后的是最久未访问的。 使用一个哈希表(std::unordered_map<int, list<int>::iterator>&am…...
C/C++复习-- C语言初始基础
C语言初始基础 本文结合代码实例与理论解析,系统讲解C语言的核心知识点,涵盖数据类型、控制结构、函数、指针、结构体等核心内容,并辅以常见错误分析与进阶技巧。通过对比文件一代码与文件二理论,帮助初学者构建完整的C语言知识框…...
小刚说C语言刷题—1078求恰好使s=1+1/2+1/3+…+1/n的值大于X时n的值
1.题目描述 求恰好使 s11/21/3⋯1/n 的值大于 X 时 n 的值。( 2≤x≤10 ) 输入 输入只有一行,包括 1个整数 X 。 输出 输出只有一行(这意味着末尾有一个回车符号),包括 1 个整数。 样例 输入 2 输出 4 2.参考代码(C语言…...
深度学习篇---MediaPipe 及其人体姿态估计模型详解
文章目录 前言一、MediaPipe 核心特点跨平台支持实时性能模块化设计预训练模型 二、MediaPipe 人体姿态估计模型1. MediaPipe Pose (BlazePose)模型特点实时性能两种变体LiteHeavy 关键点定义技术细节检测器关键点预测器支持3D姿态估计 2. MediaPipe Holistic模型特点更全面的检…...
Embedding 的数学特性与可视化解析
一、向量空间的可视化解码 1.1 GloVe 词向量实例 取词向量维度 d 50 d50 d50 的 GloVe 嵌入示例: king_vec [[0.50451, 0.68607, -0.59517, -0.022801, 0.60046, -0.13498, -0.08813, 0.47377, -0.61798, -0.31012, -0.076666, 1.493, -0.034189, -0.98173, 0…...
“睿思 BI” 系统介绍
“睿思 BI” 商业智能系统是由成都睿思商智科技有限公司自主研发的企业数据分析系统,以下是对该系统的详细介绍: 功能模块 : • 数据集成与准备 :支持数据导入、数据填报、数据 ETL 等功能,可抽取企业在经营过程中产生…...
[ctfshow web入门] web69
信息收集 使用cinclude("php://filter/convert.base64-encode/resourceindex.php");读取的index.php if(isset($_POST[c])){$c $_POST[c];eval($c); }else{highlight_file(__FILE__); }解题 查目录 百度了一下有哪些打印函数,var_export能用 var_exp…...
AI赋能研究工作:我的深度学习助手使用体验(DeepResearch)
在过去一年多的时间里,AI工具在国内经历了数次大规模普及与质量波动。作为一名研究工作者,我一直在寻找稳定高效的AI解决方案来辅助日常工作。今天想分享一个让我受益良多的平台——GPTYOU.com 为什么它值得一试? 和市面上众多同类产品相比…...
Vue基础(8)_监视属性、深度监视、监视的简写形式
监视属性(watch): 1.当被监视的属性变化时,回调函数(handler)自动调用,进行相关操作。 2.监视的属性必须存在,才能进行监视!! 3.监视的两种写法: (1).new Vue时传入watch配置 (2).通过vm.$watc…...
STM32硬件I2C驱动OLED屏幕
本文基于STM32硬件I2C驱动SSD1306 OLED屏幕,提供完整的代码实现及关键注意事项,适用于128x32或128x64分辨率屏幕。代码通过模块化设计,支持显示字符、数字、汉字及位图,并优化了显存刷新机制。 零、完整代码 完整代码: 1&#x…...
2021-11-16 C++歌手去掉2最高2最低均分
缘由大学一年级c编程题目-编程语言-CSDN问答 void 歌手去掉2最高2最低均分() {//缘由https://ask.csdn.net/questions/7551893?spm1005.2025.3001.5141int n 0, h 0, j 0, qd[6]{0}, fs[50]{0};scanf_s("%d", &n); j n; qd[2] qd[3] INT_MAX; qd[0] qd[…...
Vue插槽(Slots)详解
文章目录 1. 插槽简介1.1 什么是插槽?1.2 为什么需要插槽?1.3 插槽的基本语法 2. 默认插槽2.1 什么是默认插槽?2.2 默认插槽语法2.3 插槽默认内容2.4 默认插槽实例:创建一个卡片组件2.5 Vue 3中的默认插槽2.6 默认插槽的应用场景 …...
[虚幻官方教程学习笔记]深入理解实时渲染(An In-Depth Look at Real-Time Rendering)
原英文教程地址深入理解实时渲染(An In-Depth Look at Real-Time Rendering) 文章目录 1.Intro to An In-Depth Look at Real-Time RenderingCPU VS GPUDeferred VS Forward 2. Before Rendering and OcclusionCulling计算的步骤使用console command:fre…...
【bibtex4word】在Word中高效转换bib参考文献,Texlive环境安装bibtex4word插件
前言 现已退出科研界,本人水货一个。希望帮到有缘人 本篇关于如何将latex环境中的参考文献bib文件转化为word,和一些踩坑记录。 可以看下面的资料进行配置,后面的文字是这些资料的补充说明。 参考文章:https://blog.csdn.net/g…...
torch.nn 下的常用深度学习函数
1. 层(Layers) 这些函数用于定义神经网络中的各种层,是构建模型的基础模块。 torch.nn.Linear 用途:全连接层(也称为线性层)。用于将输入数据从一个维度映射到另一个维度,常用于神经网络的隐藏…...
(2025)图文解锁RAG从原理到实操
什么是RAG RAG(检索增强生成)是一种将语言模型与可搜索知识库结合的方法,主要包含以下关键步骤: 数据预处理 加载:从不同格式(PDF、Markdown等)中提取文本分块:将长文本分割成短序列(通常100-500个标记),作为检索单元…...
PXE_Kickstart_无人值守自动化安装系统
文章目录 1. PXE2. 配置服务参数2.1 tftp服务配置2.2 dhcp服务配置2.3 http服务配置 3. 配置PXE环境3.1 网络引导文件pxelinux.03.2 挂载镜像文件3.3 创建配置文件default3.4 复制镜像文件和驱动文件3.5 修改default文件3.6 配置ks.cfg文件 4. PXE客户端4.1 创建虚拟机…...
Redis经典面试题
本篇文章简单介绍一些 Redis 常见的面试题。 Redis 是什么? Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&…...
Vite Proxy配置详解:从入门到实战应用
Vite Proxy配置详解:从入门到实战应用 一、什么是Proxy代理? Proxy(代理)是开发中常用的解决跨域问题的方案。Vite内置了基于http-proxy的代理功能,可以轻松配置API请求转发。 二、基础配置 在vite.config.js中配置…...
用AI写简历是否可行?
让AI批量写简历然后投简历是绝对不行的!!! 为什么不行,按照 "招聘经理" 工作经历举例: ai提示词:请帮我写一份招聘经理的工作经历内容: 招聘经理 | XXX科技有限公司 | 2020年…...
投影显示技术全解析:主流方案对比与雷克赛恩 CyberPro1 的核心优势
目录 一、主流投影显示技术深度解析 (一)LCD 投影技术 (二)DP 投影技术 (三)3LCD 技术 (四)FSHD 技术 FSHD 技术优势 二、雷克赛恩 CyberPro1 核心优势对比分析 (…...
Skyvern:用 AI+视觉驱动浏览器自动化
Skyvern:用 AI视觉驱动浏览器自动化 一、前言二、项目概览2.1 Skyvern 项目简介2.2 代码结构与模块划分 三、环境搭建与快速上手3.1 环境准备3.1.1 系统与依赖3.1.2 克隆项目3.1.3 安装 Python 依赖3.1.4 配置环境变量3.1.5 启动服务 3.2 验证安装 四、核心功能与实…...
101alpha第九
alpha ((rank(ts_arg_max((vwap - close), 3)) * rank(ts_delta(volume, 3))) 今天我们来学下这个 这个是两个rank操作符相加,然后和另外一个操作符相乘,我们来看实现了什么 vwap - close:这部分先计算成交量加权平均价(vwap&am…...
蓝牙身份证阅读器使用Uniapp调用二次开发demo
<template> <view class"content"> <view class"search" :loading"searchingstatus" click"searchbluetooth"> {{searchingstatus?"搜索中":"搜索蓝牙阅读器"}} </view> …...
好用的shell终端工具
FinalShell SSH工具,服务器管理 FinalShell SSH工具,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux,版本4.5.12,更新日期2024.10.30 - FinalShell官网...
OSPF不规则区域划分
1、建立一条虚链路 vlink 可以被视为是⻣⼲区域的⼀段延伸。 这⼀条虚拟的链路,只能够跨域⼀个⾮⻣⼲区域。 [r2-ospf-1-area-0.0.0.1]vlink-peer 3.3.3.3 [r3-ospf-1-area-0.0.0.1]vlink-peer 2.2.2.2 在没有建立虚链路之前,r1是不能ping r4的。vlink建⽴的邻居关…...
复习javascript
1.修改元素内的内容 <div>zsgh</div> <script> const box1document.querySelector("div") box1.innerText"ppp" box1.innerHtml<h1>修改</h1> </script> 2.随机点名练习 <!DOCTYPE html> <html lang…...
海盗王64位服务端+32位客户端3.0版本
经过多天的尝试,终于把海盗王3.0的服务端改成了64位的,包括AccountServer GroupServer GameServer GateServer。 客户端则保留了32位。 服务端改成64位的好处是GameServer可以只启动一个就开全部地图,大概6G内存左右,直接将跳…...
【从零实现JsonRpc框架#2】Muduo库介绍
1.基本概念 Muduo 由陈硕大佬开发,是一个基于非阻塞IO和事件驱动的C高并发TCP网络编程库。它是一款基于主从Reactor模型的网络库,其使用的线程模型是 one loop per thread。 1.1 主从 Reactor 模型 主 Reactor(MainReactor,通常…...
如何创建伪服务器,伪接口
创建伪接口一般是用于模拟真实接口的行为,以便在开发和测试过程中进行使用,以下是一些常见的创建伪接口的方法: 使用 Web 框架搭建: Python 和 Flask:Flask 是一个轻量级的 Python Web 框架。示例代码如下:…...
NX949NX952美光科技闪存NX961NX964
NX949NX952美光科技闪存NX961NX964 在半导体存储领域,美光科技始终扮演着技术引领者的角色。其NX系列闪存产品线凭借卓越的性能与创新设计,成为数据中心、人工智能、高端消费电子等场景的核心组件。本文将围绕NX949、NX952、NX961及NX964四款代表性产品…...
vue配置代理解决前端跨域的问题
文章目录 一、概述二、报错现象三、通过配置代理来解决修改request.js中的baseURL为/api在vite.config.js中增加代理配置 四、参考资料 一、概述 跨域是指由于浏览器的同源策略限制,向不同源(不同协议、不同域名、不同端口)发送ajax请求会失败 二、报错现象 三、…...
深入解析Vue3中ref与reactive的区别及源码实现
深入解析Vue3中ref与reactive的区别及源码实现 前言 Vue3带来了全新的响应式系统,其中ref和reactive是最常用的两个API。本文将从基础使用、核心区别到源码实现,由浅入深地分析这两个API。 一、基础使用 1. ref import { ref } from vueconst count…...
Java Bean容器详解:核心功能与最佳使用实践
在Java企业级开发中,Bean容器是框架的核心组件之一,它通过管理对象(Bean)的生命周期、依赖关系等,显著提升了代码的可维护性和扩展性。主流的框架如Spring、Jakarta EE(原Java EE)均提供了成熟的…...
Xilinx Kintex-7 XC7K325T-2FFG676I 赛灵思 FPGA
XC7K325T-2FFG676I 属于 Kintex-7 FPGA ,低功耗与合理成本的应用市场,可提供比前代产品两倍的性价比提升和卓越的系统集成能力。该器件于 28 nm 工艺节点制造,速度等级为 -2,适合对时序要求严格但预算有限的系统设计。 产品架构与…...
AI实战笔记(1)AI 的 6 大核心方向 + 学习阶段路径
一、机器学习(ML) 目标:用数据“训练”模型,完成分类、回归、聚类等任务。 学习阶段: (1)基础数学:线性代数、概率统计、微积分(适度) (2…...
Ceph集群故障处理 - PG不一致修复
Ceph集群故障处理 - PG不一致修复 目录故障现象故障分析故障定位修复过程磁盘状态检查OSD存储结构检查修复分析故障总结问题原因修复方法后续建议经验教训最佳实践 参考资料 # ceph -v ceph version 14.2.22目录 故障现象故障分析故障定位修复过程磁盘状态检查OSD存储结构检查…...