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

【1】STM32·FreeRTOS·新建工程模板【一步到位】

目录

一、获取FreeRTOS源码

二、FreeRTOS源码简介

2.1、FreeRTOS源码文件内容

2.2、FreeRTOS内核

2.3、Source文件夹

2.4、portable文件夹

三、FreeRTOS手把手移植

3.1、FreeRTOS移植准备

3.2、FreeRTOS移植步骤

3.2.1、将 FreeRTOS 源码添加至基础工程、头文件路径等

3.2.2、添加 FreeRTOSConfig.h 配置文件

3.2.3、修改 SYSTEM 文件中的 sys.c、delay.c、usart.c

3.2.4、修改 Systick 中断、SVC 中断、PendSV 中断

3.2.5、验证移植是否成功


一、获取FreeRTOS源码

方法一:FreeRTOS 官网:freertos.orgfreertos.orgfreertos.org

方法二:正点原子官网获取,软件资料 —> FreeRTOS 学习资料

二、FreeRTOS源码简介

2.1、FreeRTOS源码文件内容

名称描述
FreeRTOSFreeRTOS 内核
FreeRTOS-PlusFreeRTOS 组件
tools工具
GitHub-FreeRTOS-HomeFreeRTOS 的 GitHub 仓库链接
Quick_Start_Guide快速入门指南官方文档链接
Upgrading to FreeRTOS-xxx升级到指定 FreeRTOS 版本官方文档链接
History.txtFreeRTOS 历史更新记录
其他其他

2.2、FreeRTOS内核

名称描述
DemoFreeRTOS 演示例程
LicenseFreeRTOS 相关许可
SourceFreeRTOS 源码
Test公用以及移植层测试代码

2.3、Source文件夹

名称描述
include包含了 FreeRTOS 的头文件
portable包含了 FreeRTOS 的移植文件
croutine.c协程相关文件
event_groups.c事件相关文件
list.c列表相关文件
queue.c队列相关文件
stream_buffer.c流式缓冲区相关文件
tasks.c任务相关文件
timers.c软件定时器相关文件

2.4、portable文件夹

FreeRTOS 操作系统归根到底是一个软件层面的东西,那 FreeRTOS 是如何跟硬件联系在一起的呢?

portable 文件夹里面的东西就是连接桥梁,由于我们使用 MDK 开发,因此这里只重点介绍其中的部分移植文件

名称描述
Keil指向 RVDS 文件夹
RVDS不同内核芯片的移植文件
MemMang内存管理文件

三、FreeRTOS手把手移植

3.1、FreeRTOS移植准备

有了 FreeRTOS 源码之后,还需要一个 HAL 库版本的实验工程作为基础工程进行 FreeRTOS 的移植

这里以正点原子的 HAL 库版本内存管理实验作为基础工程

3.2、FreeRTOS移植步骤

3.2.1、将 FreeRTOS 源码添加至基础工程、头文件路径等

Middlewares文件夹中新建FreeRTOS文件夹

Source文件夹中的FreeRTOS源码复制进去,并删除非源码文件.gitmodules

打开portable文件夹,保留KeilMemMangRVDS文件夹,其余删除

打开项目工程,点击分组管理图标,新建分组名为Middlewares/FreeRTOS_COREMiddlewares/FreeRTOS_PORT,点击OK

选择Middlewares/FreeRTOS_CORE分组,点击 Add Files,回到FreeRTOS目录,添加当前目录下的所有.c文件,点击 Add

选择Middlewares/FreeRTOS_PORT分组,点击 Add Files,回到FreeRTOS目录,打开portable/MemMang文件夹,选择heap_4.c内存管理算法,点击 Add

回到portable目录,打开RVDS文件夹,根据自己的芯片选择对应的连接桥梁,本人使用的是STM32F407的开发板,对应选择ARM_CM4F文件夹中的port.c文件,点击 Add

开发板芯片port.c 所在文件夹
STM32F1ARM_CM3
STM32F4ARM_CM4F
STM32F7ARM_CM7
STM32H7ARM_CM7

完成设置后的分组

打开魔术棒,点击C/C++,设置头文件包含路径如下图

3.2.2、添加 FreeRTOSConfig.h 配置文件

FreeRTOSConfig.h 是FreeRTOS 操作系统的配置文件,FreeRTOS 操作系统是可裁剪的,用户可以根据需求对 FreeRTOS 进行裁剪,裁剪掉不需要用到的 FreeRTOS 功能,以此来节约 MCU 中寸土寸金的内存资源

FreeRTOSConfig.h 文件的获取途径有三种

1、用户自行编写(不建议新手使用)

2、在 FreeRTOS 内核文件中的 Demo 文件夹包含了 FreeRTOS 官方提供的演示工程,在这些演示工程中就包含了每个演示工程对应的 FreeRTOSConfig.h 文件

3、在正点原子 FreeRTOS 移植实验中复制

将获取到的 FreeRTOSConfig.h 文件放在 User 文件夹下

3.2.3、修改 SYSTEM 文件中的 sys.c、delay.c、usart.c

打开 sys.h 文件,将 SYS_SUPPORT_OS 宏定义修改为 1,支持os

打开 usart.c 文件,在中断服务函数中删除 OSIntEnter()OSIntExit() 函数(在 μC/OS中 会使用到,FreeRTOS 中不会)

删除前

/*** @brief       串口1中断服务函数* @param       无* @retval      无*/
void USART_UX_IRQHandler(void)
{ 
#if SYS_SUPPORT_OS                              /* 使用OS */OSIntEnter();    
#endifHAL_UART_IRQHandler(&g_uart1_handle);       /* 调用HAL库中断处理公用函数 */#if SYS_SUPPORT_OS                              /* 使用OS */OSIntExit();
#endif
}

删除后

/*** @brief       串口1中断服务函数* @param       无* @retval      无*/
void USART_UX_IRQHandler(void)
{ HAL_UART_IRQHandler(&g_uart1_handle);       /* 调用HAL库中断处理公用函数 */
}

删除以下代码(在 μC/OS中 会使用到,FreeRTOS 中不会)

打开 delay.c 文件,删除以下代码(在 μC/OS中 会使用到,FreeRTOS 中不会)

/* 定义g_fac_ms变量, 表示ms延时的倍乘数, 代表每个节拍的ms数, (仅在使能os的时候,需要用到) */
static uint16_t g_fac_ms = 0;/**  当delay_us/delay_ms需要支持OS的时候需要三个与OS相关的宏定义和函数来支持*  首先是3个宏定义:*      delay_osrunning    :用于表示OS当前是否正在运行,以决定是否可以使用相关函数*      delay_ostickspersec:用于表示OS设定的时钟节拍,delay_init将根据这个参数来初始化systick*      delay_osintnesting :用于表示OS中断嵌套级别,因为中断里面不可以调度,delay_ms使用该参数来决定如何运行*  然后是3个函数:*      delay_osschedlock  :用于锁定OS任务调度,禁止调度*      delay_osschedunlock:用于解锁OS任务调度,重新开启调度*      delay_ostimedly    :用于OS延时,可以引起任务调度.**  本例程仅作UCOSII的支持,其他OS,请自行参考着移植*//* 支持UCOSII */
#define delay_osrunning     OSRunning           /* OS是否运行标记,0,不运行;1,在运行 */
#define delay_ostickspersec OS_TICKS_PER_SEC    /* OS时钟节拍,即每秒调度次数 */
#define delay_osintnesting  OSIntNesting        /* 中断嵌套级别,即中断嵌套次数 *//*** @brief     us级延时时,关闭任务调度(防止打断us级延迟)* @param     无* @retval    无*/
void delay_osschedlock(void)
{OSSchedLock();                      /* UCOSII的方式,禁止调度,防止打断us延时 */
}/*** @brief     us级延时时,恢复任务调度* @param     无* @retval    无*/
void delay_osschedunlock(void)
{OSSchedUnlock();                    /* UCOSII的方式,恢复调度 */
}/*** @brief     us级延时时,恢复任务调度* @param     ticks: 延时的节拍数* @retval    无*/
void delay_ostimedly(uint32_t ticks)
{OSTimeDly(ticks);                               /* UCOSII延时 */
}

SysTick_Handler函数前添加extern void xPortSysTickHandler(void);代码,用于处理 FreeRTOS 系统时钟节拍

extern void xPortSysTickHandler(void);/*** @brief     systick中断服务函数,使用OS时用到* @param     ticks : 延时的节拍数  * @retval    无*/  
void SysTick_Handler(void)
{/* OS 开始跑了,才执行正常的调度处理 */if (delay_osrunning == OS_TRUE){/* 调用 uC/OS-II 的 SysTick 中断服务函数 */OS_CPU_SysTickHandler();}HAL_IncTick();
}

修改SysTick_Handler函数如下

/*** @brief     systick中断服务函数,使用OS时用到* @param     ticks : 延时的节拍数  * @retval    无*/  
void SysTick_Handler(void)
{HAL_IncTick();/* OS 开始跑了,才执行正常的调度处理 */if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED){xPortSysTickHandler();}
}

修改delay_init函数

修改前

/*** @brief     初始化延迟函数* @param     sysclk: 系统时钟频率, 即CPU频率(rcc_c_ck), 168MHz* @retval    无*/  
void delay_init(uint16_t sysclk)
{
#if SYS_SUPPORT_OS                                      /* 如果需要支持OS */uint32_t reload;
#endifg_fac_us = sysclk;                                  /* 由于在HAL_Init中已对systick做了配置,所以这里无需重新配置 */
#if SYS_SUPPORT_OS                                      /* 如果需要支持OS. */reload = sysclk;                                    /* 每秒钟的计数次数 单位为M */reload *= 1000000 / delay_ostickspersec;            /* 根据delay_ostickspersec设定溢出时间,reload为24位* 寄存器,最大值:16777216,在168M下,约合0.09986s左右*/g_fac_ms = 1000 / delay_ostickspersec;              /* 代表OS可以延时的最少单位 */SysTick->CTRL |= 1 << 1;                            /* 开启SYSTICK中断 */SysTick->LOAD = reload;                             /* 每1/delay_ostickspersec秒中断一次 */SysTick->CTRL |= 1 << 0;                            /* 开启SYSTICK */
#endif 
}

修改后

/*** @brief     初始化延迟函数* @param     sysclk: 系统时钟频率, 即CPU频率(rcc_c_ck), 168MHz* @retval    无*/  
void delay_init(uint16_t sysclk)
{
#if SYS_SUPPORT_OS                                      /* 如果需要支持OS */uint32_t reload;
#endifg_fac_us = sysclk;                                  /* 由于在HAL_Init中已对systick做了配置,所以这里无需重新配置 */
#if SYS_SUPPORT_OS                                      /* 如果需要支持OS. */reload = sysclk;                                    /* 每秒钟的计数次数 单位为M */reload *= 1000000 / configTICK_RATE_HZ;            /* 根据delay_ostickspersec设定溢出时间,reload为24位* 寄存器,最大值:16777216,在168M下,约合0.09986s左右*/SysTick->CTRL |= 1 << 1;                            /* 开启SYSTICK中断 */SysTick->LOAD = reload;                             /* 每1/delay_ostickspersec秒中断一次 */SysTick->CTRL |= 1 << 0;                            /* 开启SYSTICK */
#endif 
}

修改delay_us函数

修改前

/*** @brief     延时nus* @note      无论是否使用OS, 都是用时钟摘取法来做us延时* @param     nus: 要延时的us数* @note      nus取值范围: 0 ~ (2^32 / fac_us) (fac_us一般等于系统主频, 自行套入计算)* @retval    无*/
void delay_us(uint32_t nus)
{uint32_t ticks;uint32_t told, tnow, tcnt = 0;uint32_t reload = SysTick->LOAD;        /* LOAD的值 */ticks = nus * g_fac_us;                 /* 需要的节拍数 */#if SYS_SUPPORT_OS                          /* 如果需要支持OS */delay_osschedlock();                    /* 锁定 OS 的任务调度器 */
#endiftold = SysTick->VAL;                    /* 刚进入时的计数器值 */while (1){tnow = SysTick->VAL;if (tnow != told){if (tnow < told){tcnt += told - tnow;        /* 这里注意一下SYSTICK是一个递减的计数器就可以了 */}else{tcnt += reload - tnow + told;}told = tnow;if (tcnt >= ticks) {break;                      /* 时间超过/等于要延迟的时间,则退出 */}}}#if SYS_SUPPORT_OS                          /* 如果需要支持OS */delay_osschedunlock();                  /* 恢复 OS 的任务调度器 */
#endif }

修改后

/*** @brief     延时nus* @note      无论是否使用OS, 都是用时钟摘取法来做us延时* @param     nus: 要延时的us数* @note      nus取值范围: 0 ~ (2^32 / fac_us) (fac_us一般等于系统主频, 自行套入计算)* @retval    无*/
void delay_us(uint32_t nus)
{uint32_t ticks;uint32_t told, tnow, tcnt = 0;uint32_t reload = SysTick->LOAD;        /* LOAD的值 */ticks = nus * g_fac_us;                 /* 需要的节拍数 */told = SysTick->VAL;                    /* 刚进入时的计数器值 */while (1){tnow = SysTick->VAL;if (tnow != told){if (tnow < told){tcnt += told - tnow;        /* 这里注意一下SYSTICK是一个递减的计数器就可以了 */}else{tcnt += reload - tnow + told;}told = tnow;if (tcnt >= ticks) {break;                      /* 时间超过/等于要延迟的时间,则退出 */}}}
}

修改delay_ms函数

修改前

/*** @brief     延时nms* @param     nms: 要延时的ms数 (0< nms <= (2^32 / fac_us / 1000))(fac_us一般等于系统主频, 自行套入计算)* @retval    无*/
void delay_ms(uint16_t nms)
{#if SYS_SUPPORT_OS  /* 如果需要支持OS, 则根据情况调用os延时以释放CPU */if (delay_osrunning && delay_osintnesting == 0)     /* 如果OS已经在跑了,并且不是在中断里面(中断里面不能任务调度) */{if (nms >= g_fac_ms)                            /* 延时的时间大于OS的最少时间周期 */{delay_ostimedly(nms / g_fac_ms);            /* OS延时 */}nms %= g_fac_ms;                                /* OS已经无法提供这么小的延时了,采用普通方式延时 */}
#endifdelay_us((uint32_t)(nms * 1000));                   /* 普通方式延时 */
}

修改后

/*** @brief     延时nms* @param     nms: 要延时的ms数 (0< nms <= (2^32 / fac_us / 1000))(fac_us一般等于系统主频, 自行套入计算)* @retval    无*/
void delay_ms(uint16_t nms)
{uint32_t i;for (i = 0; i < nms; ++i){delay_us(1000);}
}

修改公共头文件

修改前

/* 添加公共头文件 ( ucos需要用到) */
#include "os.h"

修改后

/* 添加公共头文件 (FreeRTOS 需要用到) */
#include "FreeRTOS.h"
#include "task.h"

3.2.4、修改 Systick 中断、SVC 中断、PendSV 中断

打开stm32f4xx_it.c文件,引入sys.h头文件

采用宏定义的方式屏蔽SystickSVCPendSV函数的定义

/*** @brief  This function handles SVCall exception.* @param  None* @retval None*/
#if (!SYS_SUPPORT_OS)
void SVC_Handler(void)
{
}
#endif/*** @brief  This function handles Debug Monitor exception.* @param  None* @retval None*/
void DebugMon_Handler(void)
{
}/*** @brief  This function handles PendSVC exception.* @param  None* @retval None*/
#if (!SYS_SUPPORT_OS)
void PendSV_Handler(void)
{
}
#endif/*** @brief  This function handles SysTick Handler.* @param  None* @retval None*/
#if (!SYS_SUPPORT_OS)
void SysTick_Handler(void)
{HAL_IncTick();
}
#endif

编译项目工程(报错不用管),打开 FreeRTOSConfig.h 文件,找到如下宏定义转跳到定义

4U修改成4

3.2.5、验证移植是否成功

点击全编译

编译完成后显示零错误零警告,工程模板创建完毕!!!

相关文章:

【1】STM32·FreeRTOS·新建工程模板【一步到位】

目录 一、获取FreeRTOS源码 二、FreeRTOS源码简介 2.1、FreeRTOS源码文件内容 2.2、FreeRTOS内核 2.3、Source文件夹 2.4、portable文件夹 三、FreeRTOS手把手移植 3.1、FreeRTOS移植准备 3.2、FreeRTOS移植步骤 3.2.1、将 FreeRTOS 源码添加至基础工程、头文件路径等…...

linux下sd卡的备份与还原

在Ubuntu上制作SD卡备份镜像&#xff0c;你可以使用dd命令。以下是一个基本的步骤和示例代码&#xff1a; 插入SD卡到电脑。确定SD卡设备路径&#xff0c;使用lsblk或sudo fdisk -l命令。确定备份镜像文件的路径。使用dd命令制作备份。 示例代码&#xff1a; bash# 查看连接的…...

Spring Boot项目中集成Logback作为日志框架-笔记

在Spring Boot项目中集成Logback作为日志框架是一个标准做法&#xff0c;因为Spring Boot默认就使用Logback作为日志系统。以下是集成Logback的步骤&#xff1a; 1. 默认集成 Spring Boot会自动配置Logback&#xff0c;所以通常情况下&#xff0c;你不需要添加任何额外的依赖或…...

Python_GUI框架 PyQt 与 Pyside6的介绍

Python_GUI框架 PyQt 与 Pyside6的介绍 一、简介 在Python的GUI&#xff08;图形用户界面&#xff09;开发领域&#xff0c;PyQt和PySide6是两个非常重要的工具包。它们都基于Qt库&#xff0c;为Python开发者提供了丰富的GUI组件和强大的功能。当然Python也有一些其他的GUI工…...

Github入门

GitHub 入门指南&#xff1a;从零开始学习使用 GitHub GitHub 是全球最大的代码托管平台之一&#xff0c;不仅是开发者们交流与协作的重要场所&#xff0c;也是学习与分享优秀代码的宝库。无论你是一位新手开发者还是经验丰富的专家&#xff0c;GitHub 都是你必须掌握的利器之…...

【Web漏洞指南】XSS漏洞详细指南

【Web漏洞指南】XSS漏洞详细指南 概述XSS的三种类型执行任意 JS 代码的方式在原始HTML中注入绕过手法在 HTML标记内注入绕过手法在JavaScript代码中注入绕过手法其他绕过手法XSS常见有效载荷检索Cookies窃取页面内容键盘记录器查找内部IP地址端口扫描器自动填充密码捕获窃取 Po…...

Labels and Databases for Mac:强大的标签与数据库管理工具

Labels and Databases for Mac是一款集标签制作与数据库管理于一体的强大工具&#xff0c;专为Mac用户打造&#xff0c;旨在提供高效、便捷的标签制作与数据管理体验。 这款软件拥有丰富的内置标签格式&#xff0c;用户可轻松创建各种标签、信封和卡片&#xff0c;满足个性化需…...

视频降噪算法 Meshflow 介绍

介绍 Meshflow 视频降噪算法来自于 2017 年电子科技大学一篇高质量论文。 该论文提出了一个新的运动模型MeshFlow&#xff0c;它是一个空间平滑的稀疏运动场 (spatially smooth sparse motion field)&#xff0c;其运动矢量 (motion vectors) 仅在网格顶点 (mesh vertexes) 处…...

情感类ppt素材

小清新手绘插画风毕业季毕业相册同学录画册纪念册PPT下载 - 觅知网这是一张关于清新毕业相册的PPT模板&#xff0c;清新风格设计&#xff0c;加上风为装饰元素&#xff0c;包含毕业相册、毕业季、毕业、同学、纪念等主题内容&#xff0c;也可用作毕业相册PPT、毕业季PPT、毕业P…...

专家解读 | NIST网络安全框架(1):框架概览

随 着信息技术的快速发展&#xff0c;组织面临着越来越严峻的网络安全挑战。NIST网络安全框架&#xff08;NIST Cybersecurity Framework&#xff0c;CSF&#xff09;是一个灵活的综合性指南&#xff0c;旨在协助各类组织建立、改进和管理网络安全策略&#xff0c;以加强网络安…...

【NodeMCU实时天气时钟温湿度项目 3】连接SHT30传感器,获取并显示当前环境温湿度数据(I2C)

今天&#xff0c;我们开始第三个专题&#xff1a;连接SHT30温湿度传感器模块&#xff0c;获取当前环境实时温湿度数据&#xff0c;并显示在1.3寸TFT液晶显示屏上。 第一专题内容&#xff0c;请参考 【NodeMCU实时天气时钟温湿度项目 1】连接点亮SPI-TFT屏幕和UI布局设计…...

Unity3D DOTween

简单介绍一下 DOTween 插件的使用。 导入插件 先到 Asset Store 获取 DOTween 插件&#xff0c;然后在 Package Manager 的 My Assets 中搜索&#xff0c;下载并导入插件。 导入后&#xff0c;会自动弹出一个窗口&#xff0c;提示需要先对插件进行配置。 点击上图中的按钮&am…...

罗宾斯《管理学》第13版/教材讲解/考研真题视频课程/网课

本课程是罗宾斯《管理学》&#xff08;第13版&#xff09;精讲班&#xff0c;为了帮助参加研究生招生考试指定考研参考书目为罗宾斯《管理学》&#xff08;第13版&#xff09;的考生复习专业课&#xff0c;我们根据教材和名校考研真题的命题规律精心讲解教材章节内容。 序号名…...

docker-compose启动mysql4.7环境搭建

注意&#xff1a; 下面挂载的目录需要自己创建文件夹比如&#xff1a; /home/dockerInfo/composeInfo/volumes/mysqlVolume/var/log/mysql&#xff08;数据文件&#xff09; /home/dockerInfo/composeInfo/volumes/mysqlVolume/var/lib/mysql&#xff08;日志文件&#xff09;…...

StarryCoding入门教育赛2 题解 C++代码(推荐学习)

比赛地址&#xff1a;https://www.starrycoding.com/contest/6 比赛介绍 系列赛名称&#xff1a;StarryCoding 入门教育赛难度&#xff1a;语法~较低时长&#xff1a; 1.5 1.5 1.5小时比赛时间&#xff1a;约每2-3天一场&#xff0c;一般为晚上18:30~20:00赛后题解&#xff1…...

【JAVA进阶篇教学】第九篇:MyBatis-Plus用法介绍

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第九篇&#xff1a;MyBatis-Plus用法介绍。 在 MyBatis-Plus 3.5.0 中&#xff0c;LambdaQueryWrapper支持多种条件构造方式&#xff0c;除了等于&#xff08;eq&#xff09;、不等于&#xff08;ne&#xff09;、大于&a…...

实时音视频通信的主要矛盾及解决方法

实时音视频通信的主要矛盾及解决方法 实时音视频通信的主要矛盾及解决方法实时音视频通信的主要矛盾矛盾的解决方法增加带宽减少数据量适当增加延时提高网络质量快速准确地评估带宽 总结参考 实时音视频通信的主要矛盾及解决方法 实时音视频通信的主要矛盾 实时音视频通信的主…...

【Delphi 爬虫库 4】使用封装好的 XML 解析库对 XML 数据进行解析

由于官方提供的TXMLDocument组件并不是特别好用&#xff0c;有着体积大&#xff0c;速度慢&#xff0c;调用不方便等缺点。 这里直接利用封装好的XML 解析库来对Xml数据进行解析与生成。 文章目录 1、生成XML文件2、解析XML文件3、生成带注释的XML文件4、删除XML文件节点 1、生…...

Flask简介

Flask简介 安装概述使用PyCharm创建一个Flask程序 Flask程序的基本结构初始化路由和视图函数启动服务器请求-响应循环 安装 概述 Flask算是小型框架&#xff0c;小到可以称为“微框架”。Flask 非常小&#xff0c;因此你一旦能够熟练使用它&#xff0c;很可能就能读懂它所有的…...

神经网络中的归一化

我们今天介绍一下神经网络中的归一化方法~ 之前学到的机器学习中的归一化是将数据缩放到特定范围内&#xff0c;以消除不同特征之间的量纲和取值范围差异。通过将原始数据缩放到一个特定的范围内&#xff0c;比如[0,1]或者[-1,1]&#xff0c;来消除不同特征之间的量纲和取值范围…...

《从Paxos到Zookeeper》——第四、七章:基本概念及原理

目录 第四章 Zookeeper与Paxos 4.1 Zk是什么 4.1.1 Zk特性 4.1.2 Zk基本概念 4.1.2.1 集群角色(Follower, Leader, Observer) 4.1.2.2 数据模型 4.1.2.3 ZNode(数据节点) 4.1.2.4 Session(会话) 4.1.2.5 ACL&#xff08;Access Control Lists&#xff09; 4.1.2.6 Watcher(事件…...

网络演进技术演进:裸纤专线、SDH、MSTP+、OTN、PTN、IP-RAN

前言 文章主要介绍常见名词以及其在各自领域实现的功能价值。 01 裸纤 裸光纤&#xff08;裸光纤&#xff09;由运营商提供&#xff0c;是无中继的光纤线路&#xff0c;仅通过配线架连接。相比传统光纤&#xff0c;裸光纤提供纯粹的物理传输路径&#xff0c;无需额外网…...

MMC设备

MMC&#xff08;MultiMediaCard&#xff09;是一种闪存卡标准&#xff0c;用于作为便携式设备上的存储媒介&#xff0c;例如数码相机、智能手机、平板电脑、个人数字助理&#xff08;PDA&#xff09;以及其他便携式设备。MMC卡最初是由SanDisk和Siemens AG开发的&#xff0c;并…...

图片浏览器-PicView

一、前言 PicView 是一款适用于 Windows 10 或 11 的快速高效的图像查看器&#xff0c;配备了干净简洁的用户界面&#xff0c;可以在不需要时方便地隐藏。 二、支持类型 它支持广泛的图像文件类型&#xff0c;包括&#xff1a;WEBP、GIF、SVG、PNG、JXL、HEIC、PSD 三、软件特…...

一些零碎小知识

函数递归复习 #define 的头文件包含 #define定义标识符常量 等define其他用法 斐波那契数列 函数栈帧 青蛙跳台问题 汉诺塔问题 字符“0”与0的计算 “0”-“0”0&#xff1b; 最后一次作业题一道 素数 随机数 strand timer rand 水仙花数 变种随鲜花 斐波那契数…...

2.2 Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3-基础-Vue基本语法

文本渲染指令 文本渲染指令-v-html与v-text Vue使用了基于HTML的模板语法&#xff0c;允许开发者声明式地将DOM绑定至底层Vue实例的数据。所有Vue的模板都是 合法的HTML&#xff0c;所以能被遵循规范的浏览器和HTML解析器解析。 在前面&#xff0c;我们一直使用的是字符串插…...

(Arxiv,2024)Mind the Modality Gap:通过跨模态对齐建立遥感视觉语言模型

文章目录 相关资料摘要引言相关工作对比语言图像预训练遥感域专用 CLIP 模型遥感中的多模态 CLIP 启发模型 方法模型算法输入阶段&#xff1a;输出阶段&#xff1a;步骤说明&#xff1a; 第一阶段&#xff1a;通过权重插值修补CLIP将遥感图像模态与自然图像和文本对齐 实验 相关…...

区块链 | 一文了解 NFT 的生态系统(上)

&#x1f436;原文&#xff1a; Understanding Security Issues in the NFT Ecosystem &#x1f436;写在前面&#xff1a; 本博客只摘取了原论文的第二、三节。 技术背景知识 在本节中&#xff0c;我们将介绍以太坊生态系统的构建模块&#xff0c;重点关注「NFT&#xff0c;…...

为什么centos官方版不支持arm架构?

为什么centos官方版不支持arm架构&#xff1f; 1、资源限制&#xff1a;CentOS是由社区维护的开源操作系统&#xff0c;其开发和维护需要大量的人力和物力资源。由于ARM架构的设备相对较少&#xff0c;社区资源有限&#xff0c;因此官方版CentOS选择集中精力在x86架构上进行开发…...

awk小尝试2(随手记)

文章目录 需求1解法 需求2解法&#xff08;3种-grep/sed/awk&#xff09; 需求1 使用hostname -I创建文件名 echo hostname -I.txt 10.0.0.124 .txt # 需要注意&#xff0c;这里的.txt前有一个空格&#xff0c;需要去掉&#xff0c;不然就是两个文件名解法 echo hostname -I…...

影视网站怎么做优化/seo高级优化方法

安装版本&#xff1a;5.5.32下载地址&#xff1a;wgethttp://ftp.ntu.edu.tw/pub/MySQL/Downloads/MySQL-5.5/mysql-5.5.32.tar.gz 安装过程&#xff1a;1、安装依赖yuminstall ncurses-devel –y 用于终端操作的开发包2、安装编译工具yum install cmake -y3、添加用户usera…...

用墨刀做视频网站/中国十大热门网站排名

我正在解析一个包含UTF-16编码字符串的文档. 我有一个包含以下内容的字节字符串&#xff1a; my_var b\xc3\xbe\xc3\xbf\x004\x004\x000\x003\x006\x006\x000\x006\x00-\x001\x000\x000\x003\x008\x000\x006\x002\x002\x008\x005 转换为utf-8时,我得到以下输出&#xff1a; pr…...

做海报素材网站/网络营销策划总结

小编在用vs写程序时&#xff0c;经常碰到调试窗口一闪而过的情况&#xff0c;以至于根本无法查看程序输出结果。 为了解决这个问题&#xff0c;可以在程序的末尾加上一个系统调用语句&#xff1a; 1 int main(){ 2 printf("我不会黑屏了哈哈\n"); 3 …...

上海优化网站排名/就在刚刚武汉宣布最新消息

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; >>> 开源堡垒机 Jumpserver v1.4.8 发布了 , 该版本是 Bug 修复版本。 更新内容&#xff1a; 修复command filter 不记录操作日志的问题 LDAP支持无密码 录像上传设置中去掉了ceph&a…...

章丘网站开发培训/培训中心

1.命名关键字参数 格式&#xff1a;在*号后面的都是命名关键字参数。必须用唯一的指定的关键字参数比如name‘egon’ 2.函数的嵌套&#xff1a;在函数内调用其他函数。 函数的嵌套定义&#xff1a;在函数内又定义其他函数 3.名称空间&#xff1a;存放名字与值绑定关系的地方 名…...

asp政府网站源码/天气预报最新天气预报

環境:ubuntu16.04解說:ubuntu使用dnsmasq獲取要解析的網站ip&#xff0c;dnsmasq通過域名服務器獲取網站ip&#xff0c;並將ip緩存起來&#xff0c;那么就可以減少對外網域名服務器的訪問&#xff0c;從而可以使系統迅速地獲取ip今天遇到dns被劫持的情況&#xff0c;在此記錄一…...