【OS】AUTOSAR架构下的Interrupt详解(上篇)
目录
前言
正文
1.中断概念分析
1.1 中断处理API
1.2 中断级别
1.3 中断向量表
1.4 二类中断的嵌套
1.4.1概述
1.4.2激活
1.5一类中断
1.5.1一类中断的实现
1.5.2一类中断的嵌套
1.5.3在StartOS之前的1类ISR
1.5.4使用1类中断时的注意事项
1.6中断源的初始化
1.7未处理的中断
1.8未处理的系统调用
1.9零类中断
1.9.1一类中断的实现
1.9.2一类中断的嵌套
1.9.3在StartOS之前的0类ISR
1.9.4零类isr被锁定的位置
1.9.5使用0类中断时的注意事项
2.中断配置
前言
通过《【TC3xx芯片】TC3xx中断路由IR模块详解》一文我们学习了TC3xx芯片中断的硬件实现,通过《【OS】AUTOSAR架构下的中断和异常向量表》一文中我们知道中断向量表的起始地址标识符在Os生成的链接文件中定义,用户需要在启动代码中初始化BIV寄存器,知道这两点我们就能集成使用Os中断功能,但是关于更多的Os中断的细节知识还需要继续学习,比如,你能回答以下的几个问题吗?
问题1:以下三组OS ISR相关的API有何区别,分别适合在什么场景下使用?
DisableAllInterrupts()
EnableAllInterrupts()
SuspendAllInterrupts()
ResumeAllInterrupts()
SuspendOSInterrupts()
ResumeOSInterrupts()
问题2:以下两个OS ISR相关的API有何区别,分别适合在什么场景下使用?
Os_InitialEnableInterruptSources()
Os_EnableInterruptSource()
问题3:二类中断完全由OS实现,那么该如何使用一类中断了?
问题4:TC3xx芯片是如何处理中断的?
问题5:详细阐述一个中断的配置及其处理过程,以CAN中断为例。
问题6:OS是如何处理中断优先级的?
缩略词
| 简写 | 全称 |
| BTV | Base Trap Vector Table Pointer |
| BIV | Base Interrupt Vector Table Pointer |
| ISR | Interrupt Service Router |
| SRC | Service Request Control Register |
| IR | Interrupt Router |
| ICU | Interrupt Control Unit |
| ICR | ICU Interrupt Control |
AUTOSAR BSW Tool:Vector
AUTOSAR MCAL Tool:EB
Hardware Platform: Infineon Tricore TC387
Build Tool: Tasking
Debug Tool: UDE
注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!
正文
1.中断概念分析
1.1 中断处理API
AUTOSAR标准指定了几个以下API来禁用/启用中断。
| DisableAllInterrupts() EnableAllInterrupts() | 该功能将禁用所有类别1和类别2的中断。 |
| SuspendAllInterrupts() ResumeAllInterrupts() | |
| SuspendOSInterrupts() ResumeOSInterrupts() | 该功能仅禁用类别2的中断 |
1.2 中断级别

l2类中断的优先级必须低于1类中断的优先级。
l1类中断的优先级必须低于时间保护ISR(SC2 / SC4系统)。
l时间保护ISR的优先级必须低于0类ISR(第0类ISRs详见第1.9小结)。
l用户无法设置时间保护锁(TP Lock)级别。每当OS内部在处理时间保护相关的任务时会使用到TP Lock,这个时候中断时都是被禁用的(Disabled)。
l0类 ISRs在内部禁用很短的操作系统,例如在执行堆栈开关时(0类 ISRs被锁定的位置在1.9小结中描述)。
1.3 中断向量表
MICROSAR OS会根据用户的配置、使用的MCU类型、使用的编译器类型生成中断向量表。
在一个多核系统中,可以生成多个向量表。
MICROSAR OS会为每一个可能的中断源生成一个中断向量。
1.4 二类中断的嵌套
1.4.1概述
为了保持中断延迟尽可能低,OS遵守以下中断优先级规则:
l更高优先级的二类中断可以中断正在执行的低优先级的二类中断。
l一类中断的优先级始终高于二类中断的优先级(一类中断始终可以打断二类中断)。
1.4.2激活
设置“OsIsrEnableNesting”参数为TRUE后,2类ISR本身可以被更高优先级的ISR中断。
1.5一类中断
1.5.1一类中断的实现
MICROSAR OS提供了一个宏,用于实现一类ISR。类似AUTOSAR标准定义的2类ISR的宏。MICROSAR OS抽象了所需的编译器关键字。
Implement a category 1 ISROS_ISR1(<MyCategory1ISR>){}
1.5.2一类中断的嵌套
由于1类ISR是直接从中断向量表调用的,没有任何操作系统的支持,因此不支持第1类ISR的自动嵌套。
忽略1类ISR的“OsIsrEnableNesting”配置属性。
然而,可以在1类 ISR期间启用中断以允许中断嵌套,但OS API函数不能用于此目的。应用程序必须使用编译器固有函数或内联汇编语句。
Example
OS_ISR1(<MyCategory1ISR>){__asm(EI); /* enable nesting of this ISR */__asm(DI); /* disable nesting before leaving the function */}
1.5.3在StartOS之前的1类ISR
在操作系统启动之前,可能需要激活1类ISR。
以下动作序列需要被执行:
1.调用Os_InitMemory()
2.调用Call Os_Init(), (在该函数中,基本的中断控制器设置被初始化,例如中断源的优先级))。
3.通过直接操作中断控制器中的控制寄存器,来启用1类ISR的中断源。
4.通过直接操作全局中断标志和/或当前中断优先级来启用中断,以允许1类ISR.
1.5.4使用1类中断时的注意事项
1.在不支持中断请求时栈切换(中断栈和用户栈切换)的芯片平台上,如果发生了1类中断则不会发生栈切换。因此,1类中断的堆栈消耗将应该被添加到所有可以被1类ISR消耗的堆栈中。
2.虽然中断优先级是由MICROSAR OS初始化的,但是没有API来启用1类ISR, 必须直接访问中断控制寄存器来Enable 1类中断。
3.AUTOSAR OS标准不允许在1类ISR中使用OS API(唯一的例外是中断处理API)。如果在1类中断处理函数中调用了不允许使用的OS API,MICROSAR OS就无法检测到这一点,并且调用的API可能不能按预期工作。
4.一类中断始终在Trusted权限或者Supervisor等级下被执行。
5.宏“OS_ISR1”抽象了用于实现中断服务程序的适当编译器关键字。因此,编译器生成保护并恢复通用寄存器子集的代码。在某些用例中,例如使用FPU或嵌套中断,它可能需要应用程序保存和恢复更多的寄存器。
1.6中断源的初始化
通过操作系统配置,MICROSAR操作系统知道中断源的分配和ISR的优先级。在多核系统中,所有isr的核心分配也是已知的。基于这些配置信息,MICROSAR OS生成用于初始化中断控制器的数据结构。它初始化中断优先级及其核心分配。
使能中断源:
操作系统只对操作系统生成的定时器ISR启用中断源。
只有当应用程序启用了相应的中断源时,才能为其他用户ISR提供服务。
这应该通过使用中断源API来完成(详见Os_EnableInterruptSource()函数)。
1.7未处理的中断
没有分配给用户定义ISR的中断源被分配给一个默认的操作系统中断处理程序,该处理程序收集这些中断源。
因此,来自未分配中断源的中断请求由操作系统处理。在OS Hooks(例如ProtectionHook())中,应用程序可以通过OS API获得未处理中断请求的源编号。
如果一个未处理的中断请求发生在操作系统代码中,MICROSAR OS调用PanicHook(),因为一个不一致的内部状态被识别出来,操作系统不知道如何正确地继续执行。
如果一个未处理的中断请求发生在关键用户段,即StartupHook, ErrorHook, PreTaskHook, PostTaskHook, Alarm回调,IOC接收器回调,Timing Hooks, ProtectionHook和ShutdownHook, MICROSAR OS调用PanicHook(),因为一个不一致的内部状态被识别,操作系统不知道如何正确地继续执行。
在所有其他未处理中断请求的情况下,MICROSAR OS调用带有参数E_OS_SYS_PROTECTION_IRQ的ProtectionHook().
1.8未处理的系统调用
未分配给操作系统或用户处理程序的系统调用源被分配给收集这些异常的默认操作系统系统调用处理程序。
因此,来自未分配的系统调用源的系统调用请求由操作系统处理。如果一个未处理的系统调用请求发生在操作系统代码中,MICROSAR操作系统调用PanicHook(),因为一个不一致的内部状态被识别,操作系统不知道如何正确地继续执行。
如果一个未处理的系统调用请求发生在关键用户部分,即StartupHook, ErrorHook, PreTaskHook, PostTaskHook, Alarm回调,IOC接收器回调,Timing Hooks, ProtectionHook和ShutdownHook, MICROSAR OS调用PanicHook(),因为一个不一致的内部状态被识别,操作系统不知道如何正确地继续执行。
在所有未处理的系统调用请求的其他情况下MICROSAR OS调用ProtectionHook()参数E_OS_SYS_PROTECTION_SYSCALL.
1.9零类中断
MICROSAR OS实现了0类ISRs,以具有最小的中断延迟时间,特别是在SC2或SC4系统中。这是对AUTOSAR操作系统标准的一个扩展。
1.9.1一类中断的实现
MICROSAR OS提供了一个宏,用于实现一类ISR。类似AUTOSAR标准定义的2类ISR的宏。MICROSAR OS抽象了所需的编译器关键字。
Implement a category 0 ISR
OS_ISR0(<MyCategory0ISR>){}
1.9.2一类中断的嵌套
由于0类ISR是直接从中断向量表调用的,没有任何操作系统的支持,因此不支持第0类ISR的自动嵌套。
忽略0类ISR的“OsIsrEnableNesting”配置属性。
然而,可以在0类 ISR期间启用中断以允许中断嵌套,但OS API函数不能用于此目的。应用程序必须使用编译器固有函数或内联汇编语句。
Example
OS_ISR0(<MyCategory0ISR>){__asm(EI); /* enable nesting of this ISR */__asm(DI); /* disable nesting before leaving the function */}
1.9.3在StartOS之前的0类ISR
在操作系统启动之前,可能需要激活0类ISR。
以下动作序列需要被执行:
1.调用Os_InitMemory()
2.调用Call Os_Init(), (在该函数中,基本的中断控制器设置被初始化,例如中断源的优先级))。
3.通过直接操作中断控制器中的控制寄存器,来启用0类ISR的中断源。
4.通过直接操作全局中断标志和/或当前中断优先级来启用中断,以允许0类ISR.
1.9.4零类isr被锁定的位置
0类中断只能在很短的时间内在操作系统内部禁用。
以下列表中的操作提到了这些锁的位置(会禁用0类中断):
l导致上下文切换的api内部,例如TerminateTask().
l由ProtectionHook处理的异常导致部分终止。
l中断,异常和陷阱进入和返回。
lOs_Init()和StartOS()中的OS初始化。
1.9.5使用0类中断时的注意事项
1.在不支持中断请求时栈切换(中断栈和用户栈切换)的芯片平台上,如果发生了0类中断则不会发生栈切换。因此,0类中断的堆栈消耗将应该被添加到所有可以被0类ISR消耗的堆栈中。
2.零类ISR正在消耗中断任务或2类ISR的时间保护预算(执行预算和锁定时间)。
3.虽然中断优先级是由MICROSAR OS初始化的,但是没有API来启用0类ISR, 必须直接访问中断控制寄存器来Enable 0类中断。
4.如果发生时间保护中断,执行(时间保护violation handling/protection hook)延迟到0类ISR运行期间,则其0类ISR已经完成。
5.AUTOSAR OS标准不允许在0类ISR中使用OS API(唯一的例外是中断处理API)。如果在0类中断处理函数中调用了不允许使用的OS API,MICROSAR OS就无法检测到这一点,并且调用的API可能不能按预期工作。
6.一类中断始终在Trusted权限或者Supervisor等级下被执行。
7.零类ISR可能永远不会降低CPU或中断的中断优先级。
8.在操作系统关闭的情况下,甚至在操作系统进入Panic Hook的情况下,仍然可能发生0类isr。
9.请注意,0类ISR能中断2类ISR,即使2类ISR被配置为不可嵌套的。
10.如果0类ISR的owner application因任何原因被终止,分配的0类ISR也不会被禁用。
11.宏“OS_ISR0”抽象了用于实现中断服务程序的适当编译器关键字。因此,编译器生成保护并恢复通用寄存器子集的代码。在某些用例中,例如使用FPU或嵌套中断,它可能需要应用程序保存和恢复更多的寄存器。
2.中断配置

Short Name : ISR的名字,如果该ISR所属的模块是Vector SIP包中的模块,则ISR的名字和类别是固定的(不可修改的,比如CanIsr_xxx)。
Isr Category : ISR的类别(0,1,2三种类别的中断),2类中断由OS接管,用户只需要调用OS接口Enable二类中断。0类和1类中断需要用户实现中断处理函数,且需要用户在StartOS之前启用中断。0类中断的时间延迟最小。
Isr Enable Nesting: 中断是否可以被嵌套,仅适用于2类中断。如果2类中断配置为TRUE,则该2类中断可以被更高优先级的中断打断。
Isr Initial Enable Interrupt Source : 配置中断是否会被Os_InitalEnableInterruptSources()函数Enable.
Isr Interrupt Mapping : 如果相关模块的数据搬运交给DMA处理,这需要配置这个参数。

Isr Interrupt Priority : 配置中断优先级,这个地方的中断优先级是个相对值,OS在生成代码的时候会根据这些相对值生成优先级绝对值排序。
Isr Interrupt Source: 配置中断号(中断地址)。
每一个中断请求都和一个SRN一一对应,比如:
对于CAN00,也就是CAN0INT0,对应SRC为SRC_CAN0INT0,对应的SRC地址为:
0x5B0 +0*0x40 + 0*4 = 0x5B0 = 1456

Isr Interrupt Type : 配置ISR是外部中断(External)还是异常(Exception)。注意:中断和异常(.e.g. NMI)其实是两个概念,但是Exception的产生和处理过程和ISR基本一样,所以Davnici中将Exception放在了ISR中配置。
Isr Memory Protection Identifier : 配置ISR所属的内存保护集(MPU Set),如果没有配置,则该ISR和ISR所属的Application的MPU Set配置一样。至于什么是MPU Set清参考《【TC3xx芯片】TC3xx芯片MPU介绍》一文。
Isr Special Function Name : 中断处理函数的名字默认由Short Name参数生成,但是用户也可以通过Isr Special Function Name特别指定。
Isr Stack Size : 指定中断栈大小。Microsar OS的Task和ISR都有独立的栈,
Isr Stack Fpu : 指定ISR是否使用FPU。

由于TriCore Aurix平台没有需要在上下文切换中保存的专用FPU寄存器,因此不需要由于使用浮点数而扩展上下文。
相关文章:
【OS】AUTOSAR架构下的Interrupt详解(上篇)
目录 前言 正文 1.中断概念分析 1.1 中断处理API 1.2 中断级别 1.3 中断向量表 1.4 二类中断的嵌套 1.4.1概述 1.4.2激活 1.5一类中断 1.5.1一类中断的实现 1.5.2一类中断的嵌套 1.5.3在StartOS之前的1类ISR 1.5.4使用1类中断时的注意事项 1.6中断源的初始化 1.…...
大数据挖掘--两个角度理解相似度计算理论
文章目录 0 相似度计算可以转换成什么问题1 集合相似度的应用1.1 集合相似度1.1文档相似度1.2 协同过滤用户-用户协同过滤物品-物品协同过滤 1.2 文档的shingling--将文档表示成集合1.2.1 k-shingling1.2.2 基于停用词的 shingling 1.3 最小哈希签名1.4 局部敏感哈希算法&#…...
Win10微软商店重新安装指南
Win10微软商店重新安装指南 在使用Windows 10操作系统的过程中,微软商店(Microsoft Store)作为官方提供的应用下载平台,一直是用户获取和安装各类应用程序的重要渠道。然而,有时用户可能会遇到微软商店无法找到或误删的情况,这无疑给软件的安装和管理带来了不便。本文将…...
操作系统和中间件的信息收集
在浏览器中收集操作系统与中间件信息时,主要通过客户端JavaScript(用于操作系统/浏览器信息)和服务器端脚本(用于中间件信息)实现。以下是分步指南: 一、客户端操作系统信息收集(JavaScript&am…...
项目集成Spring Security授权部分
一、需求分析 业务背景 当前项目采用前后端分离架构,后端需要对接口访问进行严格控制,防止未授权访问。鉴于系统需要支持高并发与分布式部署,采用无状态认证方式显得尤为重要。 核心需求 无状态认证:使用 JWT 作为令牌࿰…...
5. k8s二进制集群之ETCD集群部署
下载etcd安装包创建etcd配置文件准备证书文件和etcd存储目录ETCD证书文件安装(分别对应指定节点)创建证书服务的配置文件启动etcd集群验证etcd集群状态继续上一篇文章《k8s二进制集群之ETCD集群证书生成》下面介绍一下etcd证书生成配置。 下载etcd安装包 https://github.com…...
MV结构下设置Qt表格的代理
目录 预备知识 模型 关联 刷新 示例 代理 模型 界面 结果 完整资料见: 所谓MV结构,是“model-view”(模型-视图)的简称。也就是说,表格的数据保存在model中,而视图由view实现。在我前面的很多博客…...
二维数组 C++ 蓝桥杯
1.稀疏矩阵 #include<iostream> using namespace std;const int N 1e4 10; int a[N][N];int main() {int n, m; cin >> n >> m;for (int i 1; i < n; i) {for (int j 1; j < m; j) {cin >> a[i][j];}}for (int j m; j > 1; j--) {for (i…...
【Linux】文件描述符
初识文件 之前我们认识到当我们进行创建出一个空文件在磁盘上也是占用一部分空间的,因为文件的组成是由文件内容和文件属性共同构成。 文件内容属性,那我们对文件进行操作无外乎就是对内容和属性两个方面进行操作。 文件在磁盘上进行存储,…...
大语言模型的个性化综述 ——《Personalization of Large Language Models: A Survey》
摘要: 本文深入解读了论文“Personalization of Large Language Models: A Survey”,对大语言模型(LLMs)的个性化领域进行了全面剖析。通过详细阐述个性化的基础概念、分类体系、技术方法、评估指标以及应用实践,揭示了…...
AI 编程工具—Cursor进阶使用 Agent模式
AI 编程工具—Cursor进阶使用 Agent模式 我们在使用Cursor 的是有,在Composer 模式下,提交的是有两种模式 Normal 模式,也就是默认的模式Agent 模式Agent 模式可以帮我们生成代码文件,执行程序,安装依赖,并且完成一些列的工作 这里有个点很重要就是在Agent 模式下,Cur…...
【AI大模型】DeepSeek API大模型接口实现
目录 一、DeepSeek发展历程 2023 年:创立与核心技术突破 2024 年:开源生态与行业落地 2025 年:多模态与全球化布局 性能对齐 OpenAI-o1 正式版 二、API接口调用 1.DeepSeek-V3模型调用 2.DeepSeek-R1模型调用 三、本地化部署接口调…...
Qt展厅播放器/多媒体播放器/中控播放器/帧同步播放器/硬解播放器/监控播放器
一、前言说明 音视频开发除了应用在安防监控、视频网站、各种流媒体app开发之外,还有一个小众的市场,那就是多媒体展厅场景,这个场景目前处于垄断地位的软件是HirenderS3,做的非常早而且非常全面,都是通用的需求&…...
Kafka分区策略实现
引言 Kafka 的分区策略决定了生产者发送的消息会被分配到哪个分区中,合理的分区策略有助于实现负载均衡、提高消息处理效率以及满足特定的业务需求。 轮询策略(默认) 轮询策略是 Kafka 默认的分区策略(当消息没有指定键时&…...
【归属地】批量号码归属地查询按城市高速的分流,基于WPF的解决方案
在现代商业活动中,企业为了提高营销效果和资源利用效率,需要针对不同地区的市场特点开展精准营销。通过批量号码归属地查询并按城市分流,可以为企业的营销决策提供有力支持。 短信营销:一家连锁餐饮企业计划开展促销活动…...
为AI聊天工具添加一个知识系统 之78 详细设计之19 正则表达式 之6
本文要点 要点 本项目设计的正则表达式 是一个 动态正则匹配框架。它是一个谓词系统:谓词 是运动,主语是“维度”,表语是 语言处理。主语的一个 双动结构。 Reg三大功能 语法验证、语义检查和 语用检验,三者 :语义约…...
使用Java操作Redis数据类型的详解指南
SEO Meta Description: 详细介绍如何使用Java操作Redis的各种数据类型,包括字符串、哈希、列表、集合和有序集合,提供代码示例和最佳实践。 介绍 Redis是一种开源的内存数据结构存储,用作数据库、缓存和消息代理。它支持多种数据结构&#…...
一表总结 Java 的3种设计模式与6大设计原则
设计模式通常分为三大类:创建型、结构型和行为型。 创建型模式:主要用于解决对象创建问题结构型模式:主要用于解决对象组合问题行为型模式:主要用于解决对象之间的交互问题 创建型模式 创建型模式关注于对象的创建机制…...
Hive on Spark优化
文章目录 第1章集群环境概述1.1 集群配置概述1.2 集群规划概述 第2章 Yarn配置2.1 Yarn配置说明2.2 Yarn配置实操 第3章 Spark配置3.1 Executor配置说明3.1.1 Executor CPU核数配置3.1.2 Executor内存配置3.1.3 Executor个数配置 3.2 Driver配置说明3.3 Spark配置实操 第4章 Hi…...
Java集合面试总结(题目来源JavaGuide)
问题1:说说 List,Set,Map 三者的区别? 在 Java 中,List、Set 和 Map 是最常用的集合框架(Collection Framework)接口,它们的主要区别如下: 1. List(列表) 特点…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
