Infineon_TC264智能车代码初探及C语言深度学习(一)
本篇文章记录我在智能车竞赛中,对 Infineon_TC264 这款芯片的底层库函数的学习分析。通过深入地对其库函数进行分析,C语言深入的知识得以再次在编程中呈现和运用。故觉得很有必要在此进行记录一下。
目录
编辑 一、代码段
1、枚举类型
2、结构体
3、看门狗
4、inline关键字
为什么使用inline
inline的限制和注意事项
5、ADC分辨率
6、__attribute__
7、GCC
8、枚举型数组
(1)枚举型数组的定义和初始化
(2)枚举型数组的用法
(3)示例:使用枚举型数组处理LED状态
一、代码段
1、枚举类型
typedef enum //定义了一个名为 IfxCpu_Id 的枚举类型。用户自定义数据类型,增强器可读性
{IfxCpu_Id_0 = 0, /**< \brief CPU 0 ,在枚举类型中,如果没有指定值,则第一个枚举成员默认为0,之后的每一个美剧成员的值依次增加*/IfxCpu_Id_1 = 1, /**< \brief CPU 1 */IfxCpu_Id_none /**< \brief None of the CPU */
} IfxCpu_Id;
这段代码是用C语言编写的,它定义了一个名为
IfxCpu_Id
的枚举类型。枚举(Enumeration)是一种用户定义的数据类型,它允许程序员为整数类型分配更具有可读性的名称,使代码更加清晰易懂。在这个特定的例子中,
IfxCpu_Id
枚举被用来表示不同的 CPU 标识符。让我们逐个看看每个枚举成员及其含义:
IfxCpu_Id_0 = 0
:这个成员代表 CPU 0。它被显式地赋值为 0。在枚举中,如果没有指定值,第一个枚举成员默认值是 0,之后的每个枚举成员的值依次递增。
IfxCpu_Id_1 = 1
:这个成员代表 CPU 1。它被显式地赋值为 1。这里的赋值其实是可选的,因为按照默认规则,如果IfxCpu_Id_0
被赋值为 0,IfxCpu_Id_1
将自动被赋值为 1。但在这里显式指定可以增强代码的可读性和明确性。
IfxCpu_Id_none
:这个成员表示没有任何 CPU 被选中或者指定的操作不涉及特定的 CPU。注意到这个成员没有被显式地赋予一个特定的值。在枚举中,如果前一个成员的值是 1,那么IfxCpu_Id_none
将自动被赋值为 2。这种自动赋值机制使得在枚举中添加新成员变得非常灵活,无需手动调整其他成员的值。
2、结构体
void get_clock (void)
{// 获取时钟频率,便于查看当前系统运行频率g_AppCpu0.info.pllFreq = IfxScuCcu_getPllFrequency();g_AppCpu0.info.cpuFreq = IfxScuCcu_getCpuFrequency(IfxCpu_getCoreIndex());g_AppCpu0.info.sysFreq = IfxScuCcu_getSpbFrequency();g_AppCpu0.info.stmFreq = IfxStm_getFrequency(&MODULE_STM0);
}
代码片段中,
g_AppCpu0.info
是一个全局变量,这里的.info
指示它是一个结构体或者是一个包含结构体的更大结构体的成员。这个结构体至少包含了以下几个成员:
pllFreq
:用于存储PLL(Phase-Locked Loop,锁相环)频率的成员。这个成员的数据类型应该能够存储频率值,通常是一个整数或浮点数。
cpuFreq
:用于存储CPU频率的成员。同样,其数据类型应该是能够表示频率的整数或浮点数。
sysFreq
:用于存储系统外设总线(SPB,System Peripheral Bus)频率的成员。其数据类型很可能与pllFreq
和cpuFreq
相同。
stmFreq
:用于存储系统定时管理器(STM,System Timer Module)频率的成员。与其他频率成员类似,其数据类型应该能够存储频率值。结构体通常用于将逻辑上相关的数据组织在一起,便于管理和访问。在这个例子中,
g_AppCpu0.info
结构体显然用于存储与系统频率相关的信息。这样的设计使得程序的其他部分可以方便地访问这些信息,而不必关心这些信息是如何获取的。虽然代码片段没有直接提供这个结构体的定义,但我们可以根据上下文推断出它的大致结构。一个可能的定义如下(使用C语言):
typedef struct {float pllFreq; // PLL频率float cpuFreq; // CPU频率float sysFreq; // 系统外设总线频率float stmFreq; // 系统定时管理器频率 } SystemInfo;typedef struct {SystemInfo info; // 系统信息// 可能还有其他成员 } AppCpu;AppCpu g_AppCpu0; // 全局变量
3、看门狗
void IfxScuWdt_disableCpuWatchdog(uint16 password)
{/* Select CPU Watchdog based on Core Id */uint32 coreId = (uint32)IfxCpu_getCoreIndex();Ifx_SCU_WDTCPU *wdt = &MODULE_SCU.WDTCPU[coreId];IfxScuWdt_clearCpuEndinitInline(wdt, password);wdt->CON1.B.DR = 1; //Set DR bit in Config_1 registerIfxScuWdt_setCpuEndinitInline(wdt, password);
}void IfxScuWdt_disableSafetyWatchdog(uint16 password)
{IfxScuWdt_clearSafetyEndinitInline(password);SCU_WDTS_CON1.B.DR = 1; //Set DR bit in Config_1 registerIfxScuWdt_setSafetyEndinitInline(password);
}void IfxScuWdt_enableCpuWatchdog(uint16 password)
{/* Select CPU Watchdog based on Core Id */uint32 coreId = (uint32)IfxCpu_getCoreIndex();Ifx_SCU_WDTCPU *wdt = &MODULE_SCU.WDTCPU[coreId];IfxScuWdt_clearCpuEndinitInline(wdt, password);wdt->CON1.B.DR = 0; //Clear DR bit in Config_1 registerIfxScuWdt_setCpuEndinitInline(wdt, password);
}void IfxScuWdt_enableSafetyWatchdog(uint16 password)
{IfxScuWdt_clearSafetyEndinitInline(password);SCU_WDTS_CON1.B.DR = 0; //Clear DR bit in Config_1 registerIfxScuWdt_setSafetyEndinitInline(password);
}
看门狗(Watchdog Timer,简称WDT)是一种在计算机硬件或软件中常见的机制,用于检测和恢复系统挂起(例如,由于软件错误导致的无限循环)的情况。它的基本工作原理是计时器持续倒计时,软件必须定期重置(或“喂狗”)这个计时器,以防止它达到零。如果因为程序错误或其他原因导致软件未能在规定时间内重置看门狗,计时器将到达零,看门狗便会采取措施,通常是重置系统,以恢复正常操作。
看门狗的用途
系统恢复:看门狗最主要的功能是在系统运行出现异常时自动进行系统重启,尝试恢复系统正常运行。这对于需要高可靠性的嵌入式系统尤其重要,例如医疗设备、工业控制系统等。
错误检测:看门狗可以帮助检测系统中的错误状态。一些高级的看门狗定时器还可以提供错误日志或错误位置的记录功能,帮助开发人员定位问题。
防止系统卡死:在没有看门狗的情况下,系统可能因为软件缺陷、硬件故障或外部干扰而卡死。看门狗确保了即使在这种情况下,系统也能够自我恢复。
增强系统安全性:在一些安全敏感的应用中,看门狗可以防止恶意软件长时间控制系统。通过强制系统定期重启,可以减少恶意软件造成持久性损害的机会。
看门狗的类型
硬件看门狗:硬件看门狗是由微控制器或专用看门狗芯片实现的,独立于主程序运行。它们通常更可靠,因为即使主程序完全崩溃,硬件看门狗仍然可以重置系统。
软件看门狗:软件看门狗是在主程序中实现的,通常通过操作系统提供的服务来实现。虽然软件看门狗的灵活性更高,但它们依赖于操作系统的稳定性,如果操作系统崩溃,软件看门狗可能就无法正常工作。
结论
看门狗是提高系统可靠性和安全性的重要工具,尤其在嵌入式系统设计中扮演着关键角色。通过确保系统能够在遇到无法从软件层面恢复的错误时自动重启,看门狗帮助确保系统能够尽可能长时间地正常运行。
这些函数是用于控制Infineon微控制器上CPU看门狗定时器和安全看门狗定时器的启用和禁用的。它们通过修改特定的寄存器来实现对看门狗定时器的控制。下面是对每个函数的详细分析:
IfxScuWdt_disableCpuWatchdog(uint16 password)
此函数的目的是禁用CPU看门狗定时器。它首先获取当前CPU核心的索引,然后根据这个索引选择相应的CPU看门狗定时器实例。接着,使用提供的密码暂时解除
Endinit
保护(这是一种防止关键系统设置被意外或恶意更改的保护机制),修改CON1
寄存器的DR
位为1(这会禁用看门狗定时器),最后重新设置Endinit
保护。
IfxScuWdt_disableSafetyWatchdog(uint16 password)
此函数禁用安全看门狗定时器。与CPU看门狗定时器不同,安全看门狗通常用于整个系统的安全监控。该函数使用提供的密码清除
Endinit
保护,设置SCU_WDTS_CON1
寄存器的DR
位为1以禁用安全看门狗定时器,然后重新设置Endinit
保护。
IfxScuWdt_enableCpuWatchdog(uint16 password)
此函数启用CPU看门狗定时器。它的工作流程与禁用函数类似,但是在修改
CON1
寄存器时,将DR
位清零,这会启用看门狗定时器。
IfxScuWdt_enableSafetyWatchdog(uint16 password)
此函数启用安全看门狗定时器。它清除
Endinit
保护,将SCU_WDTS_CON1
寄存器的DR
位清零以启用看门狗定时器,然后重新设置Endinit
保护。密码和
Endinit
保护所有这些函数都使用了一个名为
password
的参数来处理Endinit
保护。Endinit
保护是Infineon微控制器提供的一种机制,旨在保护关键寄存器不被意外或恶意更改。要修改受保护的寄存器,首先需要使用正确的密码清除Endinit
保护,完成修改后再重新设置保护。这增加了系统的安全性。结构体访问
这些函数通过结构体和位字段访问和修改寄存器。例如,
wdt->CON1.B.DR
语句访问了CON1
寄存器的B
位字段中的DR
位。这种方式使得代码更易于阅读和维护,同时也隐藏了底层硬件的复杂性。总之,这些函数提供了对Infineon微控制器上看门狗定时器的基本控制,允许开发者根据需要启用或禁用这些重要的系统监视工具。
4、inline关键字
inline void ADC_Init(void)
{adc_init(ADC0_CH7_A7, ADC_12BIT); // 初始化对应 ADC 通道为对应精度
}
inline
是C和C++语言中的一个关键字,用于建议编译器对特定的函数进行内联展开,而不是按照常规的函数调用机制进行调用。当一个函数被声明为inline
时,编译器会尝试将该函数的所有调用替换为函数本体的副本。这意味着在每个调用点,编译器会插入整个函数的代码,从而避免了函数调用的开销(如参数传递、栈帧的创建和销毁等)。为什么使用
inline
性能提升:内联函数可以减少函数调用的开销,对于小型且频繁调用的函数,这可能会带来性能上的提升。
避免函数调用开销:由于没有函数调用的额外开销,使用
inline
可能会使得程序运行更快。
inline
的限制和注意事项
编译器的自由度:值得注意的是,
inline
只是一个建议,最终是否将函数内联,以及如何内联,取决于编译器的优化策略。现代编译器通常会对代码进行深入分析,并自动决定哪些函数适合内联,即使它们没有被显式地声明为inline
。代码膨胀:过度使用内联可能会导致代码大小增加,因为函数体的副本会在每个调用点插入。这可能会导致指令缓存命中率降低,从而影响性能,特别是在嵌入式系统或内存受限的环境中。
递归和大函数:递归函数或较大的函数通常不适合内联,因为这可能会导致栈溢出或代码膨胀。
5、ADC分辨率
typedef enum // 枚举ADC通道
{// ADC0可选引脚ADC0_CH0_A0 = 0*16 + 0,ADC0_CH1_A1,ADC0_CH2_A2,ADC0_CH3_A3,ADC0_CH4_A4,ADC0_CH5_A5,ADC0_CH6_A6,ADC0_CH7_A7,ADC0_CH8_A8,ADC0_CH10_A10 = 0*16 + 10,ADC0_CH11_A11,ADC0_CH12_A12,ADC0_CH13_A13,// ADC1可选引脚ADC1_CH0_A16 = 1*16 + 0,ADC1_CH1_A17 = 1*16 + 1,ADC1_CH4_A20 = 1*16 + 4,ADC1_CH5_A21 = 1*16 + 5,ADC1_CH8_A24 = 1*16 + 8,ADC1_CH9_A25 = 1*16 + 9,// ADC2可选引脚ADC2_CH3_A35 = 2*16 + 3,ADC2_CH4_A36,ADC2_CH5_A37,ADC2_CH6_A38,ADC2_CH7_A39,ADC2_CH10_A44 = 2*16 + 10,ADC2_CH11_A45,ADC2_CH12_A46,ADC2_CH13_A47,ADC2_CH14_A48,ADC2_CH15_A49,
}adc_channel_enum;// 此枚举定义不允许用户修改
typedef enum // 枚举ADC通道
{ADC_8BIT, // 8位分辨率ADC_10BIT, // 10位分辨率ADC_12BIT, // 12位分辨率
}adc_resolution_enum;
在电子和信号处理领域中,分辨率是指系统能够区分或表示的最小单位或细节级别。对于模数转换器(ADC)来说,分辨率通常是指数字信号中能够区分的最小幅度或最小变化量。
具体来说,在ADC中,分辨率通常以位数来表示,比如8位、10位或12位等。这些位数表示了ADC输出的数字信号可以代表的离散级别数量。例如:
- 8位ADC:具有(2^8 = 256)个不同的离散级别,即能够将模拟输入信号转换为0到255之间的数字。
- 10位ADC:具有(2^{10} = 1024)个不同的离散级别,即能够将模拟输入信号转换为0到1023之间的数字。
- 12位ADC:具有(2^{12} = 4096)个不同的离散级别,即能够将模拟输入信号转换为0到4095之间的数字。
更高的分辨率意味着ADC能够更准确地表示输入信号的细微变化,因为它可以区分更多的离散级别。通常情况下,更高的分辨率也意味着更高的精度,但同时也会带来更高的数据传输和处理成本。
因此,当谈论ADC的分辨率时,我们通常指的是ADC能够将模拟输入信号转换为数字形式时的精确度和能力,以及数字输出的位数和表示范围。
6、__attribute__
#define IFX_ALIGN(n) __attribute__ ((__align(n)))
__attribute__
是 GCC (GNU Compiler Collection) 提供的一种功能强大的语言扩展,它允许程序员为函数、变量以及类型声明指定特殊的属性。这些属性可以用来控制编译器如何优化代码、如何对齐内存,或者提供关于代码特性的附加信息,从而提高程序的性能或可靠性。上面的代码是一个宏定义,用于简化
__attribute__((__align(n)))
属性的使用。这个属性指示编译器按照指定的字节对齐变量或数据结构。n
应该是2的幂,并且是目标处理器支持的对齐方式。
如果希望某个结构体在内存中按照32字节对齐,可以这样做 :
struct IFX_ALIGN(32) my_struct {int a;char b;// 其他成员 };
这里的
IFX_ALIGN(32)
宏会展开为__attribute__((__align(32)))
,告诉编译器这个结构体的实例需要按照32字节对齐。这种对齐通常用于提高内存访问的效率,尤其是在需要频繁访问大量数据的高性能计算中非常有用。需要注意的是,
__attribute__
是GCC特有的扩展,不是标准C或C++的一部分。因此,如果您的代码需要在不同的编译器上移植,可能需要考虑使用条件编译或其他机制来确保兼容性。
7、GCC
GCC,全称GNU Compiler Collection(GNU编译器套件),是一套由GNU项目开发的编程语言编译器。它是自由软件基金会(Free Software Foundation, FSF)的关键项目之一,最初由理查德·斯托曼(Richard Stallman)在1985年发起,旨在为GNU操作系统提供一个完全自由的编译器。GCC最初仅支持C语言编译,但随着时间的推移,它已经扩展到支持多种编程语言,包括C++、Objective-C、Fortran、Ada、Go和D等。
GCC是跨平台的,可以在多种操作系统上运行,包括Linux、macOS、Windows等,同时支持多种处理器架构。它使用GPL(GNU通用公共许可证)发布,意味着任何人都可以自由地使用、修改和分发GCC,只要他们遵守GPL的条款。
GCC的特点和优势包括:
跨平台和多语言支持:GCC可以在多种操作系统上编译多种编程语言,使其成为开发跨平台应用的强大工具。
优化能力:GCC提供了广泛的优化选项,允许开发者针对不同的应用场景和硬件配置调整代码以提高性能。
可移植性:GCC生成的代码具有良好的可移植性,能够在不同的硬件和操作系统环境中运行。
开源和自由:作为自由软件,GCC的源代码可供任何人查看和修改,这促进了其不断的改进和发展。
广泛的应用:GCC被广泛应用于学术界、工业界和开源社区,是许多操作系统和嵌入式系统开发的首选编译器。
强大的社区支持:由于GCC是开源项目,它拥有一个活跃的社区,社区成员贡献代码、修复bug并提供支持。
8、枚举型数组
枚举(Enumeration)是一种在C语言中用于定义常量的用户自定义数据类型,它使得代码更加易读易潜。枚举型数组是指其元素类型为枚举类型的数组。这种数组可以有效地用于表示一系列固定选项或状态的集合,使得代码的逻辑更清晰,维护更简便。
(1)枚举型数组的定义和初始化
首先,定义一个枚举类型:
typedef enum {RED,GREEN,BLUE,YELLOW
} Color;
然后,你可以定义一个这种枚举类型的数组,并进行初始化
Color colorArray[4] = {RED, GREEN, BLUE, YELLOW};
这里,
colorArray
是一个包含4个元素的数组,每个元素都是Color
枚举类型,分别被初始化为RED
、GREEN
、BLUE
和YELLOW
。
(2)枚举型数组的用法
状态机: 枚举型数组经常用于实现状态机,其中数组的每个元素代表一个可能的状态。
配置选项: 如果你有一组固定的配置选项,可以使用枚举型数组来存储当前配置。
映射值: 在需要将整数值映射到特定的标签或名称时,可以使用枚举型数组。例如,你可以根据枚举值索引数组来获取对应的字符串表示。
(3)示例:使用枚举型数组处理LED状态
假设你正在编写一个程序来控制不同颜色的LED灯,你可以使用枚举型数组来简化这个过程。
首先,定义一个枚举来表示LED的状态:
typedef enum {LED_OFF,LED_ON
} LEDState;
然后,如果你有多个LED灯,可以定义一个枚举型数组来存储每个LED的状态:
LEDState leds[4] = {LED_OFF, LED_OFF, LED_OFF, LED_OFF};
接下来,你可以根据需要更改数组中特定LED的状态:
// 打开第一个LED
leds[0] = LED_ON;// 关闭第三个LED
leds[2] = LED_OFF;
通过使用枚举型数组,你的代码更加清晰和易于理解,同时也减少了错误的可能性。
总之,枚举型数组是处理一组固定选项或状态的强大工具,它提高了代码的可读性和可维护性。
注:上面的代码之所以可以直接设定LED_ON和LED_OF,是因为美剧类型的变量在没有赋初值的时候,默认是从 0开始进行递增的。
相关文章:

Infineon_TC264智能车代码初探及C语言深度学习(一)
本篇文章记录我在智能车竞赛中,对 Infineon_TC264 这款芯片的底层库函数的学习分析。通过深入地对其库函数进行分析,C语言深入的知识得以再次在编程中呈现和运用。故觉得很有必要在此进行记录一下。 目录 编辑 一、代码段 1、枚举类型 2、结构体 …...

[Redis]——初识Redis
一、Redis为非关系型数据库 ❓我们常见的MySQL、SQLServer都是关系型数据库,那他们之间有什么区别与联系呢? 📕关系型数据库与非关系型数据库的区别(面试题) 解释: SQL数据库中的表是有结构的,包…...

YTM32的同步串行通信外设SPI外设详解(Master Part)
YTM32的同步串行通信外设SPI外设详解(Master Part) 文章目录 YTM32的同步串行通信外设SPI外设详解(Master Part)IntroductionFeatures引脚信号时钟源其它不常用功能 Pricinple & Mechinism基于FIFO的命令和数据管理机制锁定配…...

【C语言】三子棋
前言: 三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏规则是双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利。但因棋盘太小,三子棋在很多时候会出现和…...

Web组态可视化编辑器 快速绘制组态
随着工业智能制造的发展,工业企业对设备可视化、远程运维的需求日趋强烈,传统的单机版组态软件已经不能满足越来越复杂的控制需求,那么实现Web组态可视化界面成为了主要的技术路径。 行业痛点 对于软件服务商来说,将单机版软件转变…...

WebServer -- 注册登录
目录 🍉整体内容 🌼流程图 🎂载入数据库表 提取用户名和密码 🚩同步线程登录注册 补充解释 代码 😘页面跳转 补充解释 代码 🍉整体内容 概述 TinyWebServer 中,使用数据库连接池实现…...

C3_W2_Collaborative_RecSys_Assignment_吴恩达_中英_Pytorch
Practice lab: Collaborative Filtering Recommender Systems(实践实验室:协同过滤推荐系统) In this exercise, you will implement collaborative filtering to build a recommender system for movies. 在本次实验中,你将实现协同过滤来构建一个电影推荐系统。 …...
Elasticsearch使用function_score查询酒店和排序
需求 基于用户地理位置,对酒店做简单的排序,非个性化的推荐。酒店评分包含以下: 酒店类型(依赖用户历史订单数据):希望匹配出更加符合用户使用的酒店类型酒店评分:评分高的酒店用户体验感好ge…...

iOS消息发送流程
Objc的方法调用基于消息发送机制。即Objc中的方法调用,在底层实际都是通过调用objc_msgSend方法向对象消息发送消息来实现的。在iOS中, 实例对象的方法主要存储在类的方法列表中,类方法则是主要存储在原类中。 向对象发送消息,核心…...

【接口测试】常见HTTP面试题
目录 HTTP GET 和 POST 的区别 GET 和 POST 方法都是安全和幂等的吗 接口幂等实现方式 说说 post 请求的几种参数格式是什么样的? HTTP特性 HTTP(1.1) 的优点有哪些? HTTP(1.1) 的缺点有哪些&#x…...

服务器硬件基础知识
1. 服务器分类 服务器分类 服务器的分类没有一个统一的标准。 从多个多个维度来看服务器的分类可以加深我们对各种服务器的认识。 N.B. CISC: complex instruction set computing 复杂指令集计算 RISC: reduced instruction set computer 精简指令集计算 EPIC: explicitly p…...

matlab实现层次聚类与k-均值聚类算法
1. 原理 1.层次聚类:通过计算两类数据点间的相似性,对所有数据点中最为相似的两个数据点进行组合,并反复迭代这一过程并生成聚类树 2.k-means聚类:在数据集中根据一定策略选择K个点作为每个簇的初始中心,然后将数据划…...

【机器学习】包裹式特征选择之递归特征消除法
🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…...

【ArcGIS】重采样栅格像元匹配问题:不同空间分辨率栅格数据统一
重采样栅格像元匹配问题:不同空间分辨率栅格数据统一 原始数据数据1:GDP分布数据2.1:人口密度数据2.2:人口总数数据3:土地利用类型 数据处理操作1:将人口密度数据投影至GDP数据(栅格数据的投影变…...

Qt 简约又简单的加载动画 第七季 音量柱风格
今天和大家分享两个音量柱风格的加载动画,这次的加载动画的最大特点就是简单,只有几行代码. 效果如下: 一共三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QGridLayout> int main(int argc…...
【JS】数值精度缺失问题解决方案
方法一: 保留字符串类型,传给后端 方法二: 如果涉及到计算,用以下方法 // 核心思想 在计算前,将数字乘以相同倍数,让他没有小数位,然后再进行计算,然后再除以相同的倍数࿰…...

c++基础知识补充4
单独使用词汇 using std::cout; 隐式类型转换型初始化:如A a1,,此时可以形象地理解为int i1;double ji;,此时1可以认为创建了一个值为1的临时对象,然后对目标对象进行赋值,当对象为多参数时,使用(1…...
leetcode230. 二叉搜索树中第K小的元素
lletcode 230. 二叉搜索树中第K小的元素,链接:https://leetcode.cn/problems/kth-smallest-element-in-a-bst 题目描述 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 …...
医学大数据|文献阅读|有关“肠癌+机器学习”的研究记录
目录 1.机器学习算法识别结直肠癌中的免疫相关lncRNA signature 2.基于机器学习的糖酵解相关分子分类揭示了结直肠癌癌症患者预后、TME和免疫疗法的差异,2区7 3.整合深度学习-病理组学、放射组学和免疫评分预测结直肠癌肺转移患者术后结局 4.最新7.4分纯生信&am…...

Linux信号【systemV】
目录 前言 正文: 1消息队列 1.1什么是消息队列? 1.2消息队列的数据结构 1.3消息队列的相关接口 1.3.1创建 1.3.2释放 1.3.3发送 1.3.4接收 1.4消息队列补充 2.信号量 2.1什么是信号量 2.2互斥相关概念 2.3信号量的数据结构 2.4…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...