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

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,不得而知。

代码关键点解释

  1. 定时器机制

    • 通过app_easy_timer函数设置一个每分钟触发的定时器
    • 每次回调执行时会重新设置定时器,形成循环调用
    • APP_PERIPHERAL_CTRL_TIMER_DELAY_MINUTES应定义为 60000ms(1 分钟)
  2. 时间维护

    • current_unix_time存储当前的 Unix 时间戳(秒)
    • time_offset初始为 60,每次累加后重置,确保每分钟递增 60 秒
    • 这种设计允许系统在无法获取 RTC 时通过软件维护时间
  3. 显示控制

    • do_time_show():更新时间显示
    • display():刷新整个显示内容
    • 使用step变量实现状态机控制,确保某些操作只执行一次
  4. 注释代码分析

    • 被注释的 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;
}

p


其中: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),不同平台语法可能不同。  

 总结 该数组是定时器系统的核心数据结构,通过将回调函数存储在保留内存区域,确保系统在休眠 / 唤醒周期中能持续管理定时任务。这种设计在资源受限的嵌入式系统中尤为重要,既能高效利用内存,又能保证关键状态不丢失。


其中宏定义如下 :

#define APP_EASY_TIMER_HND_TO_MSG_ID(timer_id)    (timer_id - 1 + APP_TIMER_API_MES0)
#define APP_EASY_TIMER_MSG_ID_TO_HND(timer_msg)   (timer_msg - APP_TIMER_API_MES0 + 1)
#define APP_EASY_TIMER_HND_TO_IDX(timer_id)       (timer_id - 1)
#define APP_EASY_TIMER_IDX_TO_HND(timer_id)       (timer_id + 1)
#define APP_EASY_TIMER_HND_IS_VALID(timer_id)     ((timer_id > 0) && (timer_id <= APP_TIMER_MAX_NUM))

相关文章:

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);// …...

Vue基础(8)_监视属性、深度监视、监视的简写形式

监视属性(watch)&#xff1a; 1.当被监视的属性变化时&#xff0c;回调函数(handler)自动调用&#xff0c;进行相关操作。 2.监视的属性必须存在&#xff0c;才能进行监视&#xff01;&#xff01; 3.监视的两种写法&#xff1a; (1).new Vue时传入watch配置 (2).通过vm.$watc…...

计算机网络八股文--day1

从浏览器输入url到显示主页的过程&#xff1f; 1. 浏览器查询域名的IP地址 2. 浏览器和服务器TCP三次握手 3. 浏览器向服务器发送一个HTTP请求 4. 服务器处理请求&#xff0c;返回HTTP响应 5. 浏览器解析并且渲染页面 6. 断开连接 其中使用到的协议有DNS协议&#xff08…...

TCP IP

TCP/IP 通信协议&#xff0c;不是单一协议&#xff0c;是一组协议的集合 TCP IP UDP 1.建立链接 三次握手 第一步&#xff1a;客户端发送一个FIN报文&#xff0c;SEQX,等待服务器回应 第二步&#xff1a;服务器端受到&#xff0c;发送ackx1,seqy, 等待客户端回应 第三步&am…...

CNG汽车加气站操作工岗位职责

CNG&#xff08;压缩天然气&#xff09;汽车加气站操作工是负责天然气加气设备操作、维护及安全管理的重要岗位。以下是该岗位的职责、技能要求、安全注意事项及职业发展方向的详细说明&#xff1a; *主要职责 加气操作 按照规程为车辆加注CNG&#xff0c;检查车辆气瓶合格证…...

(四)毛子整洁架构(Presentation层/Authentiacation/Authorization)

文章目录 项目地址一、Presentation 层1.1 数据库migration1. 添加数据库连接字符串2. 创建自动Migration/Seed3.修改Entity添加private 构造函数4. 执行迁移 1.2 全局错误处理中间件1.3 Controller 添加1. Apartments2. Bookings3. 测试 二、Authentiacation2.1 添加Keycloak服…...

K8S服务的请求访问转发原理

开启 K8s 服务异常排障过程前&#xff0c;须对 K8s 服务的访问路径有一个全面的了解&#xff0c;下面我们先介绍目前常用的 K8s 服务访问方式&#xff08;不同云原生平台实现方式可能基于部署方案、性能优化等情况会存在一些差异&#xff0c;但是如要运维 K8s 服务&#xff0c;…...

5.1 神经网络: 层和块

1 层&#xff08;Layer&#xff09; 1.1 定义 层是深度学习模型中的基本构建单元&#xff0c;它由一组神经元组成&#xff0c;负责对输入数据进行特定的数学运算和变换&#xff0c;以提取数据的某种特征或表示。每一层可以看作是一个函数&#xff0c;它接收输入数据&#xff…...

20250510解决NanoPi NEO core开发板在Ubuntu core22.04.3系统下适配移远的4G模块EC200A-CN的问题

1、h3-eflasher-friendlycore-jammy-4.14-armhf-20250402.img.gz 在WIN10下使用7-ZIP解压缩/ubuntu20.04下使用tar 2、Win32DiskImager.exe 写如32GB的TF卡。【以管理员身份运行】 3、TF卡如果已经做过会有3个磁盘分区&#xff0c;可以使用SD Card Formatter/SDCardFormatterv5…...

Linux系统之----模拟实现shell

在前面一个阶段的学习中&#xff0c;我们已经学习了环境变量、进程控制等等一系列知识&#xff0c;也许有人会问&#xff0c;学这个东西有啥用&#xff1f;那么&#xff0c;今天我就和大家一起综合运用一下这些知识&#xff0c;模拟实现下shell&#xff01; 首先我们来看一看我…...

2025年数维杯赛题C题专家 组委会C题专家疑集锦

1、段前段后距&#xff0c;行间距有要求嘛 C题专家&#xff1a;一般是单倍行距 2、请问参考文献和附录上方也要有图示页眉吗?ai使用报告放在附录里还是附录之后? C题专家:附录 3、第三问的那个三天都在一个城市可以吗?这样我们列两份城市的清明自由行&#xff0c;还是说…...

TCP黏包解决方法

1. 问题描述 TCP客户端每100ms发送一次数据,每次为16006字节的数据长度。由于TCP传输数据时,为了达到最佳传输效能,数据包的最大长度需要由MSS限定(MSS就是TCP数据包每次能够传输的最大数据分段),超过这个长度会进行自动拆包。也就是说虽然客户端一次发送16006字节数据,…...

vue访问后端接口,实现用户注册

文章目录 一、后端接口文档二、前端代码请求响应工具调用后端API接口页面函数绑定单击事件&#xff0c;调用/api/user.js中的函数 三、参考视频 一、后端接口文档 二、前端代码 请求响应工具 /src/utils/request.js //定制请求的实例//导入axios npm install axios import …...

[原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取自身程序的所在的目录?

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...

Nginx性能调优与深度监控

目录 1更改进程数与连接数 &#xff08;1&#xff09;进程数 &#xff08;2&#xff09;连接数 2&#xff0c;静态缓存功能设置 &#xff08;1&#xff09;设置静态资源缓存 &#xff08;2&#xff09;验证静态缓存 3&#xff0c;设置连接超时 4&#xff0c;日志切割 …...

机器学习第四讲:无监督学习 → 给无标签积木自由组合,发现隐藏规律

机器学习第四讲&#xff1a;无监督学习 → 给无标签积木自由组合&#xff0c;发现隐藏规律 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细…...

2025年5月计划(linux+Gpu精粹催眠+UE独立游戏)

终于步入正轨了&#xff0c;4月份为了各种面试&#xff0c;一会学这&#xff0c;一会学那。 现在&#xff0c;有大量的业余时间了&#xff0c;也该干点正事了。 按照规划&#xff0c; 1&#xff0c;ue独立游戏&#xff08;十分钟的视频即可&#xff09; 2&#xff0c;linux-&…...

如何在大型项目中解决 VsCode 语言服务器崩溃的问题

在大型C/C项目中&#xff0c;VS Code的语言服务器&#xff08;如C/C扩展&#xff09;可能因内存不足或配置不当频繁崩溃。本文结合系统资源分析与实战技巧&#xff0c;提供一套完整的解决方案。 一、问题根源诊断 1.1 内存瓶颈分析 通过top命令查看系统资源使用情况&#xff…...

从爬虫到网络---<基石9> 在VPS上没搞好Docker项目,把他卸载干净

1.停止并删除所有正在运行的容器 docker ps -a # 查看所有容器 docker stop $(docker ps -aq) # 停止所有容器 docker rm $(docker ps -aq) # 删除所有容器如果提示没有找到容器&#xff0c;可以忽略这些提示。 2.删除所有镜像 docker images # 查看所有镜像 dock…...

AutoDL实现端口映射与远程连接AutoDL与Pycharm上传文件到远程服务器(李沐老师的环境)

文章目录 以上配置的作用前提AutoDL实现端口映射远程连接AutoDLPycharm上传文件到远程服务器以上配置的作用 使用AutoDL的实例:因本地没有足够强的算力,所以需要使用AutoDL AutoDL端口映射:当在实例上安装深度学习的环境,但因为实例的linux系统问题,无法图形化显示d2l中的文件…...

LeetCode 热题 100 24. 两两交换链表中的节点

LeetCode 热题 100 | 24. 两两交换链表中的节点 大家好&#xff0c;今天我们来解决一道经典的链表问题——两两交换链表中的节点。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求两两交换链表中的相邻节点&#xff0c;并返回交换后链表的头节点。 问题描述 给你一个链…...

13.thinkphp的Session和cookie

一&#xff0e;Session 1. 在使用Session之前&#xff0c;需要开启初始化&#xff0c;在中间件文件middleware.php&#xff1b; // Session 初始化 \think\middleware\SessionInit::class 2. TP6.0不支持原生$_SESSION的获取方式&#xff0c;也不支持session_开头的函数&…...

好用的播放器推荐

以下是一些好用的播放器推荐&#xff0c;按照不同平台和使用场景分类&#xff1a; 电脑端 VLC Media Player 特点&#xff1a;开源、跨平台&#xff0c;支持几乎所有的音视频格式&#xff0c;无需额外安装解码器。具备强大的功能&#xff0c;如播放列表管理、视频和音频滤镜、…...

多线程获取VI模块的YUV数据

一.RV1126 VI模块采集摄像头YUV数据的流程 step1&#xff1a;VI模块初始化 step2&#xff1a;启动VI模块工作 step3&#xff1a;开启多线程采集VI数据并保存 1.1初始化VI模块&#xff1a; VI模块的初始化实际上就是对VI_CHN_ATTR_S的参数进行设置、然后调用RK_MPI_VI_SetC…...

[ctfshow web入门] web68

信息收集 highlight_file被禁用了&#xff0c;使用cinclude("php://filter/convert.base64-encode/resourceindex.php");读取index.php&#xff0c;使用cinclude("php://filter/convert.iconv.utf8.utf16/resourceindex.php");可能有些乱码&#xff0c;不…...

深入浅出 JDBC 与数据库连接池

在Java开发中&#xff0c;与数据库进行交互是几乎每个项目都离不开的功能。JDBC&#xff08;Java DataBase Connectivity&#xff09;作为Java操作数据库的标准规范&#xff0c;为开发者提供了底层的数据库访问支持。而数据库连接池则是提高数据库操作效率和性能的重要工具。本…...

16前端项目----交易页

交易 交易页Trade修改默认地址商品清单reduce计算总数和总价应用 统一引入接口提交订单 交易页Trade 在computed中mapState映射出addressInfo和orderInfo&#xff0c;然后v-for渲染到组件当中 修改默认地址 <div class"address clearFix" v-for"address in …...

Python时间模块

time 和 datetime 是 Python 中处理时间的两个重要模块&#xff0c;它们提供了不同的功能来处理时间相关的操作。 time模块 time 模块主要提供与系统时间相关的基础功能&#xff0c;侧重于时间戳和简单的时间格式处理。 time.time()&#xff1a;返回当前时间的时间戳&#xf…...

2003-2020年高铁线路信息数据

2003-2020年高铁线路信息数据 1、时间&#xff1a;2003-2020年 2、来源&#xff1a;Chinese High-speed Rail and Airline Database&#xff0c;CRAD 3、指标&#xff1a;高铁线路名称、起点名、终点名、开通时间、线路长度(km)、设计速度(km/h&#xff09;、沿途主要车站 …...

mac u盘重装mac10.15Catalina系统

我的电脑提mac2017的air 重装过程 (文件夹中间有空格时为 Install\ macOS\ Catalina 才行) &#xff08;有需要的&#xff0c;最好做一下备份&#xff0c;有些东西可以及时找到配置和文件之类的&#xff0c; u盘制作是在mac电脑上操作的) 一、先下载系统镜像文件或自行到官方…...