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

深入解析uCOSII就绪表:实时操作系统调度核心与优化实践

1. 项目概述从“就绪表”窥探实时操作系统的调度心脏如果你接触过嵌入式实时操作系统尤其是经典的ucOSII那么“就绪表”这个词你一定不陌生。它不像任务创建、信号量、消息队列那样经常被挂在嘴边但却是整个系统任务调度的核心枢纽是决定“下一个该谁运行”的关键数据结构。很多朋友在初学RTOS时会把大量精力花在各种通信机制上却对这个底层调度机制一知半解结果在遇到任务优先级反转、调度效率低下甚至死锁问题时往往无从下手。今天我们就来彻底拆解ucOSII中的就绪表。这不仅仅是一个理论分析我会结合我十多年在工控、车载等对实时性要求苛刻的领域里使用ucOSII的实际经验带你从源码层面理解它的精妙设计并分享如何利用这种理解去优化你的系统、定位那些令人头疼的调度问题。你会发现搞懂这张“表”你对RTOS的理解会从“会用”跃升到“懂其所以然”在设计和调试系统时思路会清晰得多。2. 就绪表的核心设计思想与数据结构拆解2.1 为什么需要就绪表—— 调度效率的生死线在裸机编程中程序执行流是确定的。但在RTOS中多个任务线程共享一个CPU操作系统必须决定在任意时刻哪一个就绪态的任务拥有最高优先级从而获得CPU的使用权。这个决策过程必须极快因为调度本身的开销会直接侵蚀掉CPU用于执行有效任务的时间这在微秒级响应的实时系统中是不可接受的。ucOSII采用固定优先级、抢占式调度。这意味着每个任务创建时都被赋予一个唯一的、固定的优先级0最高通常优先级数字越低优先级越高。调度器的核心职责就是快速从所有处于就绪状态的任务中找出优先级最高的那个。试想一下最朴素的实现用一个链表存放所有就绪任务每次调度时遍历链表找最高优先级。任务少时还行一旦任务数量上去遍历的时间复杂度是O(n)这在高实时性场景下是灾难。ucOSII的就绪表就是为了以O(1)的时间复杂度解决这个问题而生的它本质上是一种位图算法的精妙应用。2.2 三层级就绪表数据结构全景ucOSII的就绪表不是一个简单的列表或数组而是一个三层级的位图索引结构由三个关键变量构成OSRdyGrp就绪组8位字节这是第一级索引。ucOSII最多支持64个任务理论上可配置常见为64。它将64个优先级0-63分成8组每组8个优先级。OSRdyGrp中的每一位bit0-bit7对应一组。如果某一组中至少有一个任务处于就绪态那么该组在OSRdyGrp中对应的位就被置为1。OSRdyTbl[]就绪表8个8位字节的数组这是第二级索引。它是一个大小为8的数组每个元素是一个8位的字节INT8U。OSRdyTbl[0]对应优先级组0优先级0-7OSRdyTbl[1]对应组1优先级8-15以此类推。每个字节中的8个位分别对应该组内的8个优先级。当某个具体优先级的任务就绪时其对应的位被置为1。优先级值0-63这是最终要查找的目标。任务优先级是这张表的“键”。它们之间的关系可以用一个简单的类比想象一栋8层楼OSRdyGrp和OSRdyTbl的索引每层楼有8个房间OSRdyTbl[i]中的位。OSRdyGrp告诉你哪几层楼有人就绪任务OSRdyTbl[i]告诉你某一层楼里具体哪个房间有人。调度器的目标就是找到楼层号组号和房间号组内位号都最小的那个人最高优先级。注意这里有一个关键点ucOSII规定优先级数值越小优先级越高。所以优先级0是最高优先级。在就绪表中bit0代表一个组内的最高优先级如OSRdyTbl[0]的bit0对应优先级0。我们的查找算法始终是从低位bit0向高位bit7查找天然保证了找到的是最高优先级。2.3 核心操作原理解析置位、清零与查找理解了结构我们来看对就绪表的三个核心操作这些操作直接对应任务状态的变化。2.3.1 任务就绪OS_MapTbl的妙用当一个任务从等待态或其他状态变为就绪态时需要将其在就绪表中的对应位置1。我们需要根据任务的优先级prio计算出它属于哪个组y以及在该组中的位置x。ucOSII没有使用乘除法这种耗时的运算而是使用了查表法。它预先定义了两个常量数组OSMapTbl[]: 用于将0-7的索引值转换为对应的位掩码0x01, 0x02, 0x04, ..., 0x80。OSUnMapTbl[]: 一个256字节的逆映射表用于快速查找一个字节中最低位为1的位号。任务就绪的置位操作代码如下概念示意y prio 3; // 优先级右移3位等价于除以8得到组号(0-7) x prio 0x07; // 优先级与0x07得到组内位号(0-7) OSRdyGrp | OSMapTbl[y]; // 设置就绪组中对应的位 OSRdyTbl[y] | OSMapTbl[x]; // 设置就绪表中对应组的对应位这个过程是O(1)的只有几次位运算和或运算极其高效。2.3.2 任务脱离就绪态如进入等待、挂起、删除操作与置位相反需要将对应的位清零。但这里有个关键细节清零后需要检查其所在的组是否还有其他就绪任务。如果没有则需要同时清除OSRdyGrp中对应的位。y prio 3; x prio 0x07; OSRdyTbl[y] ~OSMapTbl[x]; // 清除就绪表中的位 if (OSRdyTbl[y] 0) { // 如果该组全空了 OSRdyGrp ~OSMapTbl[y]; // 清除就绪组中的位 }2.3.3 查找最高优先级就绪任务调度核心这是就绪表最精彩的部分。调度器通常是时钟节拍中断OSTickISR或任务调用OS_Sched()时需要调用OS_SchedNew()函数来找出最高优先级。y OSUnMapTbl[OSRdyGrp]; // 查表找到OSRdyGrp中最低为1的位号即最高优先级所在的组号 x OSUnMapTbl[OSRdyTbl[y]]; // 在找到的组内查表找到最低为1的位号 prio (y 3) x; // 组合组号和位号得到最终的优先级数字看到没有全程没有循环两次查表OSUnMapTbl加上一次移位和加法就完成了最高优先级的查找。OSUnMapTbl这个256字节的查找表是空间换时间的经典实践它使得无论就绪任务如何分布查找时间都是恒定的。实操心得很多初学者对OSUnMapTbl这个表感到困惑。你可以这样理解这个表存放的是对于一个8位数0-255其二进制表示中最低位为1的位索引。例如0x01二进制00000001最低位是bit0所以OSUnMapTbl[0x01]00x0C二进制00001100最低位为1的是bit2所以OSUnMapTbl[0x0C]2。这个表是预先计算好的用一次内存访问代替了循环移位判断是嵌入式系统优化的常见手段。3. 就绪表操作的全流程与调度器联动分析3.1 从任务状态变迁看就绪表更新就绪表不是孤立的它的每一次变化都对应着任务状态机的切换。我们跟踪一个典型场景一个任务因为等待信号量而挂起随后信号量到来任务重新就绪。初始状态任务A优先级10正在运行。任务B优先级15和任务C优先级20处于就绪态。此时就绪表中组1优先级8-15的bit2对应优先级10和bit7对应优先级15为1组2优先级16-23的bit4对应优先级20为1。OSRdyGrp的bit1和bit2为1。任务A等待信号量任务A调用OSSemPend()。在该函数内部会将自己从就绪表中移除调用OS_EventTaskWait最终调用OS_EventTaskRemove其核心就是前述的就绪表清零操作。此时就绪表中任务A的位被清除。由于组1中还有任务B位7为1所以OSRdyGrp中bit1保持不变。系统随后执行调度找出当前最高优先级任务——任务B优先级15并切换过去。信号量释放中断或其他任务调用OSSemPost()释放信号量。该函数会从事件等待列表中找出最高优先级的等待任务假设是任务A并将其重新置入就绪表调用OS_EventTaskRdy内部调用OS_EventTaskRemove和任务就绪操作。此时任务A在就绪表中的位组1bit2被重新置1。触发调度OSSemPost()函数末尾通常会调用OS_Sched()。调度器通过查询就绪表发现当前最高优先级是任务A10高于正在运行的任务B15于是发生任务抢占立即切换到任务A运行。整个流程中就绪表像是一个实时更新的“任务就绪排行榜”调度器只是一个严格按照这个排行榜榜首来指派CPU的“裁判”。3.2 调度点与就绪表查询的时机调度即查询就绪表并可能切换任务主要发生在以下“调度点”任务主动放弃CPU调用OSTimeDly()、OSSemPend()等等待函数。中断服务程序退出时OSIntExit()函数会判断是否需要进行任务切换。这是实现中断内上下文切换的关键。任务释放了内核对象如OSSemPost()、OSQPost()、OSTaskResume()等这些函数可能使更高优先级的任务就绪。任务主动调用OS_Sched()。在每一个调度点系统都会通过OS_SchedNew()或类似的内部函数查询就绪表获取OSPrioHighRdy最高优先级就绪任务优先级然后与OSPrioCur当前运行任务优先级比较。如果OSPrioHighRdy ! OSPrioCur则调用OS_TASK_SW()进行任务切换。注意事项OSIntExit()和OS_Sched()中查询就绪表的逻辑略有不同。因为中断中可能连续触发多个调度点OSIntExit()使用了一个全局变量OSIntNesting来记录中断嵌套层数只有在退出最外层中断时才进行任务调度这保证了中断响应的效率和中途逻辑的完整性。理解这一点对编写可靠的中断服务程序很重要。4. 基于就绪表分析的深度调试与性能优化实践4.1 利用就绪表状态诊断系统问题当系统出现疑似“死锁”、“卡死”或某个低优先级任务异常占用CPU时分析就绪表的状态是强大的调试手段。场景一高优先级任务无法执行现象一个高优先级任务比如优先级5似乎没有被调度。你可以通过调试器或在代码中临时添加日志打印OSRdyGrp和OSRdyTbl的值。如果任务5对应的位组0bit5为1说明任务确实是就绪态。问题可能出在1调度器被锁OSLockNesting 02中断被长时间关闭3有更高优先级0-4的任务始终就绪。如果该位为0说明任务不在就绪表。你需要检查1任务是否在等待某个信号量/消息队列而挂起2任务是否被意外删除(OSTaskDel)或挂起(OSTaskSuspend)。场景二系统响应变慢你可以统计在单位时间内如1秒就绪表中始终为1的位。这些对应着“始终就绪”的任务。如果一个低优先级的计算密集型任务比如优先级50始终就绪它会不断被调度当更高优先级任务都等待时虽然符合规则但可能影响系统整体响应观感。这时你可能需要重新审视任务划分或者引入“合作式”调度点让该任务定期调用OSTimeDly(1)主动让出CPU。实操技巧设计一个就绪表监控任务创建一个低优先级如最低的监控任务定期如每秒一次读取并记录OSRdyGrp和OSRdyTbl的值通过串口输出或存入内存块。当系统出现异常时分析历史记录能清晰看到就绪态任务的变化轨迹对定位间歇性调度问题有奇效。注意读取时最好暂时关闭中断(OS_ENTER_CRITICAL())以避免值在读取过程中变化。4.2 优先级分配策略与就绪表效率就绪表的结构特性直接影响着优先级分配的最佳实践。优先级的稀疏使用就绪表的效率与就绪任务的分布关系不大但与优先级编号的跨度有关。如果你只用了优先级60和61两个任务它们属于组760376137。那么OSRdyGrp中只有bit7为1OSRdyTbl[7]有两位为1。查找效率依然是O(1)完全没有问题。所以ucOSII的优先级分配非常灵活。避免优先级反转的设计启示经典的优先级反转问题一个高优先级任务间接等待一个低优先级任务不能单靠就绪表解决需要“优先级继承”或“优先级天花板”协议ucOSII的互斥信号量OSMutex支持优先级继承。但理解就绪表能帮你更清楚看到反转时的状态中优先级任务就绪位为1而高优先级任务因等待资源位为0导致中优先级任务抢占了低优先级任务持有的CPU从而阻塞了高优先级任务。系统可预测性因为查找最高优先级任务是确定性的O(1)操作所以ucOSII的调度时间是确定且可预测的。这与Linux等通用OS中基于动态优先级和复杂调度算法的非确定性有本质区别。在安全苛求系统如汽车ECU中这种时间确定性是至关重要的。4.3 扩展思考与其它RTOS调度机制的对比ucOSII的这种“两级位图”就绪表并非唯一方案但非常经典。FreeRTOS早期版本也采用类似ucOSII的位图法uxTopReadyPriority和pxReadyTasksLists数组配合查找。新版本引入了更通用的“就绪链表”数组但通过使用汇编指令如CLZ– 计算前导零来加速查找最高优先级任务原理上与查表法异曲同工都是硬件优化的位操作。ThreadX / Azure RTOS同样以高效著称其调度算法也高度优化但具体实现细节不同。对比链表调度有些简单的RTOS或调度器使用链表。链表在任务动态创建删除时更灵活但查找最高优先级需要遍历平均时间复杂度O(n)。在任务数固定或变化不大的嵌入式实时系统中ucOSII的位图法在调度速度上具有绝对优势。我的经验是对于任务数量相对固定几十个以内、对调度延迟要求极其苛刻的场合ucOSII的这种就绪表设计依然是极佳的选择。它的代码简洁、透明所有行为都可预测、可分析这对于需要认证如ISO 26262 ASIL的系统来说是一个巨大优势。5. 常见误区、问题排查与源码阅读指南5.1 初学者常见误区澄清误区就绪表存放任务控制块(TCB)指针。正解就绪表只记录优先级是否就绪的状态是一个纯粹的位图。任务的所有其他信息函数指针、堆栈、状态等存放在对应的OS_TCB结构体中。调度器通过就绪表找到最高优先级prio后需要通过prio作为索引去OSTCBPrioTbl[]这个TCB指针表中找到对应的OS_TCB才能进行上下文切换。误区任务延时(OSTimeDly)后会立刻从就绪表移除。正解是的调用OSTimeDly()的任务会立刻从就绪表移除其对应位即使延时时间设置为0OSTimeDly(0)也会让出CPU。这是进行合作式调度的一种方式。误区中断服务程序中不能进行任务调度。正解在ucOSII中可以且推荐在中断服务程序(ISR)结束时进行任务调度。这是实现快速响应高优先级任务的关键。ISR通过调用OSIntEnter()和OSIntExit()来包裹中断服务。OSIntExit()会在中断嵌套层数为0时调用调度器如果发现有更高优先级任务就绪会直接切换到该任务而不是返回被中断的任务。这被称为“中断级任务切换”。5.2 典型调度问题排查清单当系统出现调度异常时可以按以下清单检查问题现象可能原因检查点某个任务永远得不到执行1. 任务未启动(OSTaskCreate失败或未调用)。2. 任务优先级设置错误存在更高优先级任务始终就绪。3. 任务在等待一个永远不会被释放的信号量/事件。4. 任务被意外挂起(OSTaskSuspend)。1. 检查OSTaskCreate返回值。2. 调试监控就绪表看该任务优先级对应位是否为1。3. 检查该任务等待的内核对象状态。4. 检查任务的OS_TCB中的状态位(OSTCBStat)。系统运行一段时间后卡死1. 堆栈溢出破坏了系统数据包括就绪表。2. 中断关闭时间过长导致时钟节拍中断无法进入调度停滞。3. 优先级反转导致死锁多个任务循环等待资源。4. 就绪表或TCB表等核心数据结构被非法内存访问破坏。1. 使用OSTaskStkChk()检查任务堆栈使用。2. 检查OS_ENTER_CRITICAL()/OS_EXIT_CRITICAL()的配对使用确保中断尽快开启。3. 检查互斥资源的使用考虑使用OSMutex。4. 使用内存保护单元(MPU)或定期进行数据结构完整性校验。任务切换频率异常低1. 所有高优先级任务大部分时间都在等待这是正常设计。2. 时钟节拍频率(OS_TICKS_PER_SEC)设置过低。3. 存在大量中断且中断服务程序执行时间过长挤压了任务执行时间。1. 分析任务设计看是否合理。2. 根据需求提高系统时钟节拍频率。3. 优化ISR将非紧急处理放到任务中释放信号量让任务去做。5.3 如何高效阅读ucOSII中与就绪表相关的源码建议按以下顺序阅读源码文件以V2.92版本为例并重点关注函数OS_CORE.COS_InitMisc(): 初始化OSRdyGrp和OSRdyTbl清零。OS_SchedNew():核心中的核心实现查找最高优先级就绪任务。OS_TaskStat(): 统计任务中有时会间接反映系统负载但主要看调度。OS_TASK.COSTaskCreateHook()/OSTaskDelHook(): 任务创建删除钩子但就绪表操作在更底层。实际上任务就绪/脱离就绪态的底层操作被封装在OS_TCB操作和事件模块中。uCOS_II.H查找OS_ENTER_CRITICAL和OS_EXIT_CRITICAL宏的定义。所有对就绪表OSRdyGrp和OSRdyTbl的修改都必须在这对宏的包裹内进行以保证操作的原子性。这是阅读源码时要留意的关键点。OS_FLAG.C,OS_MBOX.C,OS_MEM.C,OS_MUTEX.C,OS_Q.C,OS_SEM.C这些内核对象释放Post、PendAbort等和使任务就绪OS_EventTaskRdy的函数最终都会调用到就绪表操作。重点关注OS_EventTaskRdy()函数它包含了从事件等待列表移除任务和将任务置入就绪表的过程。阅读技巧在IDE中使用“查找所有引用”功能追踪OSRdyGrp和OSRdyTbl这两个全局变量在哪里被读写。你会清晰地看到一张由核心调度函数、任务状态变更函数、事件模块函数共同编织的操作网络这张网络正是ucOSII实时调度的心脏起搏器。理解它你就掌握了ucOSII最精髓的部分之一。

相关文章:

深入解析uCOSII就绪表:实时操作系统调度核心与优化实践

1. 项目概述:从“就绪表”窥探实时操作系统的调度心脏如果你接触过嵌入式实时操作系统,尤其是经典的ucOSII,那么“就绪表”这个词你一定不陌生。它不像任务创建、信号量、消息队列那样经常被挂在嘴边,但却是整个系统任务调度的核心…...

去水印工具免费版哪个好用?2026免费去水印工具对比与选择指南

在日常工作和创意制作中,我们经常需要处理带有水印的图片和视频。无论是为了素材库积累、内容二次创作,还是个人学习参考,选择一款合适的去水印工具至关重要。市面上众多免费去水印工具各具特色,有的专注速度,有的擅长…...

免费去水印工具哪个好用?2026年免费去水印工具对比与推荐指南

在2026年,随着短视频、直播、自媒体创作的普及,去水印需求越来越多。无论是保存喜欢的视频素材、整理图片资源,还是创意二次加工,选择一款好用的免费去水印工具就成了刚需。市场上去水印工具众多,到底哪个免费版本值得…...

基于PSOC62 CAPSENSE的远程空调遥控器:物联网与红外控制实践

1. 项目概述:当传统遥控器遇上物联网你有没有遇到过这样的场景:大夏天回到家,一身汗,还得在包里翻箱倒柜找空调遥控器;或者冬天窝在被窝里,发现遥控器在客厅茶几上,得鼓起勇气离开温暖的被窝去拿…...

【下载安装教程】仿宋GB2312、楷体GB2312和方正小标宋简体办公字体安装包下载安装教程

常用办公字体安装与使用指南 适用字体及场景 字体名称适用场景仿宋_GB2312正文内容、正式文档楷体_GB2312批注、说明性文字方正小标宋简体标题、封面文字、强调性内容 支持软件 WPSMicrosoft WordPowerPoint其他主流办公软件 使用方法 安装字体 下载字体文件(.…...

智谱ZCube组网架构革新:不动硬件提升15%集群推理吞吐,行业转向“挖效率”

【导语:过去行业在算力军备竞赛中多靠买GPU、建集群堆算力,如今这一路径被重新审视。智谱公开ZCube组网架构,在不增加硬件的情况下提升了集群推理吞吐,同时OpenAI等发布MRC网络协议,行业正从“堆硬件”向“挖效率”转向…...

通过用量看板与成本管理功能实现团队API支出精细化管控

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过用量看板与成本管理功能实现团队API支出精细化管控 对于依赖大模型API进行开发的团队而言,成本控制与资源分配的透…...

丙午年三月三十平镜里

丙午年三月三十平镜里 曾几风流里,皆逝日常中。 莫名春伤寒,妙在岁月功。 儿时不知道,青烟多捉空。 老壮老路上,庭院情境通。 谓花当此季,寻因那刻虹? 虚妄浮云聚,耕种顺序隆。 斯文源村落&…...

我用 DuckDB + Python 搭了个全自动日报系统:68 行代码,7 个踩坑实录

# 我用 DuckDB Python 搭了个全自动日报系统:68 行代码,7 个踩坑实录> 总周期:3 天业余时间(每天下班 2 小时) > 总成本:≈ 服务器 29/月(已有) > 技术栈:Duck…...

昇腾CANN ops-blas:GEMM 在 NPU 上为什么可以快到极致

矩阵乘是所有深度学习计算的根。Attention、全连接、卷积展开——归根到底都是矩阵乘。ops-blas 是 CANN 里专门做高性能 GEMM(General Matrix Multiply)的算子库,核心目标是把昇腾 NPU 的 Cube 单元利用率拉到 90% 以上。 ops-blas 和 ops-n…...

DeepSeek服务网格选型决策树(Istio vs. eBPF轻量方案深度对比:延迟压降42%、资源开销降低68%实测数据)

更多请点击: https://intelliparadigm.com 第一章:DeepSeek微服务架构建议 在构建面向大语言模型推理与训练任务的微服务系统时,DeepSeek系列模型对计算密集型服务、高吞吐API网关及弹性资源编排提出了明确要求。推荐采用分层解耦、异步协同…...

【ElevenLabs云南话语音落地实战】:20年语音AI专家亲授3步适配方言模型,避开92%开发者踩过的声学对齐陷阱

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs云南话语音落地实战导论 云南话作为西南官话的重要分支,具有声调丰富、语流连贯、地域变体多样等特点,为语音合成技术带来独特挑战。ElevenLabs 提供的多语言、高保真…...

用 5 款全栈电商微系统打通你的前后端核心逻辑链路(附级联 Prompt)

各位大前端、全栈开发以及正在寻求技术进阶的同仁们,大家好。在日常的技术社区里,我们经常能看到各种流于表面的前端 UI 静态页或者几行代码拼凑的后端 CRUD 示例。但真正能在一个全栈工程师的履历中起到定海神针作用的,往往是那些功能内敛、…...

恩智浦eIQ Time Series Studio:嵌入式时间序列AI从数据到部署的自动化实践

1. 项目概述与核心价值如果你正在为嵌入式设备开发一个基于传感器数据的智能功能,比如通过振动信号判断电机是否故障,或者通过电流波形识别家电的工作模式,你大概率会面临一个经典困境:算法模型在PC上跑得好好的,一到资…...

端侧AI与嵌入式系统融合:从模型轻量化到5G通信的产业化落地

1. 从展会看趋势:端侧AI与嵌入式系统的深度融合最近在德国纽伦堡举办的国际嵌入式展览会,可以说是全球嵌入式技术发展的风向标。作为从业者,我每年都会关注这个展会,因为它总能揭示未来几年工业和技术应用的核心走向。今年&#x…...

告别键盘连击烦恼:Keyboard Chatter Blocker终极使用指南

告别键盘连击烦恼:Keyboard Chatter Blocker终极使用指南 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 你是否经常在打字时…...

拒绝玩具CRUD:用 5 款全栈离线“仓储管理”微系统精通前后端解耦(附专家级级联 Prompt)

各位全栈同仁、大前端极客以及正在突破技术瓶颈的开发者们,大家好。作为一名每天和分布式架构、数据库事务以及前端复杂状态流打交道的工程师,今天想和大家聊聊全栈工程落地中的“咬合力”。在很多技术社区里,大家往往能看到各种速成的单表 C…...

SPT-AKI存档编辑器:掌控离线塔科夫游戏进度的终极工具

SPT-AKI存档编辑器:掌控离线塔科夫游戏进度的终极工具 【免费下载链接】SPT-AKI-Profile-Editor Программа для редактирования профиля игрока на сервере SPT-AKI 项目地址: https://gitcode.com/gh_mirrors/s…...

终极游戏模组管理指南:Nexus Mods App如何让你轻松玩转模组世界

终极游戏模组管理指南:Nexus Mods App如何让你轻松玩转模组世界 【免费下载链接】NexusMods.App Home of the development of the Nexus Mods App 项目地址: https://gitcode.com/gh_mirrors/ne/NexusMods.App 厌倦了手动安装模组时的各种冲突和兼容性问题&a…...

如何快速搭建个人游戏串流服务器:Sunshine跨平台游戏流媒体完整指南

如何快速搭建个人游戏串流服务器:Sunshine跨平台游戏流媒体完整指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要在任何设备上畅玩PC游戏?Sunshine游…...

3小时变3分钟:用ChanlunX插件让通达信自动绘制缠论结构

3小时变3分钟:用ChanlunX插件让通达信自动绘制缠论结构 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 你是否曾经面对复杂的K线图,试图手工画出缠论中的笔、线段和中枢&#xff0…...

MultiHighlight插件深度解析:JetBrains IDE智能代码高亮实战指南

MultiHighlight插件深度解析:JetBrains IDE智能代码高亮实战指南 【免费下载链接】MultiHighlight Jetbrains IDE plugin: highlight identifiers with custom colors 🎨💡 项目地址: https://gitcode.com/gh_mirrors/mu/MultiHighlight …...

KMS智能激活终极指南:一键永久激活Windows和Office的完整教程

KMS智能激活终极指南:一键永久激活Windows和Office的完整教程 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗?Office文档突然…...

Vanrafia阿曲生坦Atrasentan副作用贫血及头痛严重时如何治疗?

贫血与头痛是Vanrafia阿曲生坦治疗IgA肾病时最受临床关注的两项全身性不良反应。贫血侵蚀着患者的日常功能与运动耐量,头痛则是最常见的神经系统不适主诉。ALIGN三期临床试验及其长期扩展研究的完整安全性数据,为这两项副作用勾勒出了精确且不容回避的风…...

论文重复率过高,应该怎么办?

重复率过高,先别急着全文重写。大多数情况,不是整篇都有问题,而是少数几个章节把总重复率拉爆了。很多人第一反应是“从头改到尾”。这个最累,而且效率最低。正确顺序是这样的。第一步:先看是哪一部分高,不…...

免费卸载软件再推荐!支持多款软件同时卸载、注册表清理、垃圾文件清理、空文件查找、进程管理、启动管理等等功能!强制卸载+系统清理,绝了

前言 电脑里总有那么几个“钉子户”软件!卸载按钮灰色、控制面板里找不到、残留注册表像牛皮癣一样反复出现今天推荐的这款卸载工具,不管程序多顽固、卸载器多残废,都能一键连根拔起,顺带把垃圾文件、空文件夹、无效快捷方式打包带走&#x…...

扫描(SEM)-透射(TEM)-原子力(AFM)的比较

SEM: 扫描电子显微镜扫描电镜成像是利用细聚焦高能电子束在样件表面激发各种物理信号,如二次电子、背散射电子等,通过相应的检测器来检测这些信号,信号的强度与样品表面形貌有一定的对应关系,因此,可将其转…...

扫描电镜(SEM)会产生哪些信号?

当高能电子束与样品相互作用时&#xff0c;会产生多种类型的信号。这些信号提供了有关材料表面形貌、成分和结构的关键信息。1.二次电子&#xff08;SE&#xff09;是入射电子将样品表面附近原子中的低能电子激发出来的。它们携带表面敏感信息&#xff08;深度<10 nm&#x…...

ArcGIS Pro 基础:县级人口图斑分级设色显示

首先确定图斑数据和属性数据&#xff0c;如下&#xff1a;对图层名称进行修改。右键图层属性&#xff0c;对常规里的名称进行修改。右键图层&#xff0c;打开【符号系统】。【主符号系统】选择【分级色彩】&#xff1b;【归一化】选择【无】&#xff1b;【方法】选择【自然间断…...

Jetpack Compose 动画使用指南

Jetpack Compose 动画使用指南 ⚡ 快速上手 Compose 动画&#xff0c;6 大核心 API 结合项目&#xff1a;仓库地址 目录 animate*AsState — 最基础的动画AnimatedVisibility — 显示/隐藏动画updateTransition — 多值协同过渡Crossfade — 页面/内容切换AnimatedContent —…...