又是一年春节要来到,在考虑自己写挥春、准备除夕夜和伴侣及朋友的聚餐同时,我也在规划着如何打扫自己的居所,希望在各个方面都以干净整洁的姿态,迎接朋友们的来访。

但给一个近 100 平米的三室一厅做大扫除并不容易,尤其是这个家还是个爱喝咖啡的二猫家庭(还是最掉毛的英短)。平时能够用吸尘器和拖把清洁到的地方还好,但那些卫生死角所累积下来的垃圾和灰尘,要处理起来就莫名地棘手。然而,我们已经长大了,不再有一个万能的、不被看见的妈妈来帮我们整理咖啡角的工具,或是替我们处理掉角落的脏污、扫掉沙发上占的毛,最终,家务事还得靠我们自己来解决。

而且,看着工作室、走廊和房间里的东西越来越多,刚好也时候在年前「断舍离」一番,让家里更亮堂一些。

尽管每个人的居住情况和习惯、装修、清洁工具乃至清洁标准都各不相同,而且这篇文章可能也算不上很完整的「指南」,但无论如何确实也是这次大扫除之后我的感受和经验总结,希望它能对想要来一次大扫除的你有些帮助。

你想要打扫得多干净?

每次我妈来家里看我的时候,都会嫌弃我像是住在「垃圾堆」里,但我却觉得我打扫得已经可以了 —— 显然,我和我妈对于「干净」的标准是完全不同的。我自己平时生活并不规律,加上人也习惯邋遢,所以对「干净」的要求并没有到一尘不染的地步,而我妈是连地板上有根头发都忍受不了的。因此,年前的大扫除如果不是只有你一个人,那么提前沟通统一一下大家对于干净的意见就很有必要了。

在这个过程里,总会有人「妥协」。但我想说的是,还是尽可能以最爱干净的那位成员为标准,因为实际上在这个标准之下大家都会觉得舒心。如果按照「短板」来草草了事,扫不干净是其次,可能还会引发争吵。而且,那个最爱干净的家庭成员大概率也会给身后的人「擦屁股」。

但当你实际了解了家务事的辛苦付出之后,其实就很容易理解 ta 的选择。或许某个区域搞完之后,按照自己的标准已经很干净了,可 ta 看到之后还觉得不行,这种时候吵架和抱怨解决不了问题,不如大家一起听听 ta 觉得哪里不干净,然后一起把这些不行的东西处理掉,减轻 ta 负担的同时,还能让让家里的卫生情况更进一步。

目前,我家的卫生标准大致如下:

  • 起居室:地板、沙发套和家具表面没有明显的脏污,允许不打扫的几天内有一些猫毛、头发和灰尘的存在,每天铲屎避免积味;
  • 厨房:灶台、地板和瓷砖 / 抽油烟机表面没有油污,洗手池不能有厨余垃圾,做完饭及时清扫,允许有少量的未清洗碗筷,等同一天攒一波进洗碗机;
  • 卫生间:地板、马桶和洗手台面没有脏污,浴巾挂在淋浴间外,有接触水的地方及时擦干或通过通风及热风浴霸保持干燥,垃圾桶在接近满是就倒掉,保持卫生间内没有异味;
  • 工作室和卧室:地板没有明显脏污,不允许猫进来。卧室需要干脚且脱鞋进入,避免带进污水和猫毛,允许东西凌乱但不能堆脏东西;
  • 阳台:放飞自我,允许地面和栏杆、防盗网积灰(根本扫不过来),想起来的时候扫一次。

你的家里是怎样的?

我现住的小区房位于珠三角,楼层是 27 楼,三房两卫一厅的格局,大约是 98 平方米。其中,阳台、起居室、厨房和客卫是公共区域,其它地方是私人区域。

众所周知,珠三角的天气并不是那么「讨喜」:夏天湿度大热得像蒸笼,冬天如果干冷能把人电麻,如果湿冷就更吓人,多少件大衣都抵不过寒风和水汽的魔法攻击。然而,这些都只是额外赠礼,最棘手的问题其实还是一年四季无处不在的灰尘。虽然开发商预装了新风系统但体验一般,因此平时还是会打开窗通风,导致灰尘偏大。

不过小区环境好、楼层高也有好处。首先,整个小区的装修环境都比较现代化,房型四四方方直来直去,墙边、吊顶和台面这些地方没有过多的硬装修饰,不容易出现天然的清洁死角。其次,小区除了垃圾站周围也基本看不到蟑螂和老鼠,更不用说会跑到家里,相比以前住在 6 楼要舒适得多。

来到家里,家具的颜色、风格和复杂程度也会影像我们对于大扫除的标准和难易度。我购置的家居也都是简约风格,全都是直溜溜的线条和横平竖直的平面,最多就是在边缘加点银色金属点缀,丝毫不吃老广们钟爱的酸枝、红木那一套。这些家具在大扫除时打理起来就要比那些复杂华丽的家居要省心得多,基本上用吸尘器吸一吸抹布抹一抹就完事了,而不必像那些雕刻了各种图案和装饰的家具那样,需要用更细致的工具来清洁缝隙。

所以,如果希望你在大扫除时能更省时省力,如果有条件,不如先从选房子和家具做起。如果已经不能选择了,就需要对自己家的状况有个明确的了解。建议从家里的家装布局、影响卫生的首要问题和打扫的难易度开始整理,明确哪些地方是好打扫的、哪些地方需要多个人一起弄、哪些地方是比较细枝末节的。

工欲善其事,必先利其器

我相信一整年都不打扫一次的人少之又少,是个人住的家里多多少少都有一些清洁工具。但要搞大阵仗了,还是得准备点趁手的工具。这些工具不仅能提高打扫效率,更重要的是它们能帮我们节省不少体力。

但首先要提醒你的是,临近春节,快递和商家该休息的也都休息了,要买啥工具得赶紧。有了上面两步,相信你已经对家里要扫得多干净、要重点解决哪些卫生问题和需要哪些工具有了大致的了解,所以这时候就可以查缺补漏一下你目前有的工具,如果有新的工具需求就赶紧入手,免得扫着扫着突然发现搞不定。

其次是一些好用的工具。当然,好用这些因人而异,我这里分享的是我用过的觉得还不错的一些工具,而我也基本靠它们就完成了这次的大扫除:

有线吸尘器

平时如果只是吸一部分的地面,戴森还算靠谱,但大扫除这种时候戴森真靠不住,甚至可能还比不上几百块的有线吸尘器。对于大扫除来说,再强劲的吸力也没有持续的吸力来得重要。

手持吸尘器

我认为只靠一个吸尘器就想解决问题也是不切实际的。一般来说,吸地板、墙面、吊顶或天花板的吸尘器是不能处理一些家具之间的缝隙区域的,这时候小型的手持吸尘器会排上大用场。例如,对于掉在柜子缝里的咖啡粉和猫毛,手伸进去一吸就能解决,同时对于一些不方便用吸尘器的操作台面,手持吸尘器也是非常好用。不过由于续航原因,建议可以多备一到两个,甚至可以家庭成员人手一个(因为真的特别好用…)。

非常好用,强烈推荐

柠檬酸除垢剂

对于平时经常会因为沾水会留下水渍的地方,比如浴室玻璃、洗手台和水龙头,用醋其实效果不佳,但用柠檬酸除垢剂兑水后一擦可以立竿见影,多擦几次简直光洁如新,平时用来对付烧水壶、洗碗机、咖啡机和制冰机的水垢也非常有效,建议家中常备。不过千万注意的是,在选购的时候一定要买食品级的,我还真的因为室友洗完制冰机后忘了将溶液倒出被制成冰块之后而误食过……

基本上食品级的就够用了,工业级的大都用不上

大麻袋

也可以替换成超大的废弃纸箱或不用的蛇皮袋之类。相信我,在大扫除的过程中你一定会丢掉或者制造一大堆需要丢到楼下的垃圾,如果你一件一件倒真的很费体力和时间,长期折腾下来还可能会影响你们打扫的心情。建议在开始清洁之前准备好几个坚实的大麻袋,有垃圾都往里扔,然后等装满或者一个区域的清洁结束后,几个人一起拎着把它丢到楼下垃圾站;

除此之外,还有一些我觉得可以准备的各类清洁或辅助工具。这里不做具体的产品推荐,你可以根据自己的消费习惯和需求选购:

清洁剂:

  • 油污净:用于擦拭抽油烟机、灶台、厨房台面等;
  • 下水道疏通剂:用于溶解管道中的毛发、纸巾等,避免堵塞;
  • 草酸清洗剂:用于清洗浴室下水口及马桶中的污垢;
  • 除胶剂:用于除去物体避免残留的胶带痕迹,要注意它们能用在哪些表面上。

需要注意的是,这些清洁剂大都用了浓度比较高的化学溶剂,对皮肤有一定刺激,并且大概率会有难闻的气味。操作时请做好防护,如果不慎沾到请及时冲洗,并根据情况看是否需要去医院。

辅助工具:

  • 小刷子:可以用不用的电动牙刷或普通牙刷;
  • 铲子:用来铲除一些角落的污垢或残留的胶印;
  • 梯子:用于擦一些较高物体的表面,如冰箱、橱柜和衣柜等。

防护用品:

  • 手套:普通劳保手套即可;
  • 口罩:减少清洁剂的刺鼻气味,阻挡灰尘吸入鼻腔,让像我一样的过敏性鼻炎患者避免连打 30 个喷嚏(……);
  • 发绳:对于你家留长发的成员非常有用。

常见的清洁工具这里就不表了,当然,你也可以多备一些以防临时需要。现在,你已经有了理论准备和工具助阵,我们正式进入到清理环……再等等 ——

清洁规划

其实,开始行动之前拟定一个规划,要比拎着工具哐哐就干要有条理许多。在我看来,规划是确保清洁高效和全面的关键。如果你是 J 人,制定一个完整的清洁规划或许还能大大激发你的干劲,但当它落到我这个 100% 的 P 人头上的时候,这份规划就不用多么清晰详细,但你总得在心里有个数。

以下是我在大扫除过程中总结出来的规划经验,从房间划分、清洁顺序、晾晒安排和重新整理四个层面入手,帮你整理一份清洁规划的思路。

房间与责任划分

第一步是根据房间和每个人负责的区进行划分。如家里的客厅、卧室、厨房、卫生间和阳台,每个区域需要完成哪些清洁的步骤、需要打扫到什么地步,然后将清洁任务分解到具体的房间和人身上。在这里,你可以对上面谈好的清洁标准作为基础延展:

  • 客厅:主要清理墙面、天花板、灯具、沙发、地毯和家具表面,重点处理灰尘和杂物堆积,对于被重物压住的角落也尽可能搬开进行清洁;
  • 卧室:主要清洁地板和落灰的衣柜顶层,同时完成房间内物品和衣柜内衣服的整理、床品清洁和窗帘洗涤;
  • 厨房:油污重灾区,需重点清洁油烟机、灶台、台面及橱柜内部。同时,对冰箱进行整理,清空过期食品并除去异味。另外,对洗碗机和制冰机进行一次全面清理,解决藏在机器内的水垢及脏污。
  • 卫生间:重点清洁马桶、洗手台、镜面、瓷砖缝隙。淋浴房内用草酸清洁剂进行全面清洗,再用柠檬酸除垢剂对镜面、玻璃表面和水龙头表面进行清洁,确保无异味、无污垢。
  • 阳台:清理洗衣机、晾衣架、栏杆及地板,保持通风和整洁即可。

清洁顺序

虽然不知道是谁提出来的,但我总体还是遵循大家所说的「从上到下、从内到外、从少用到常用」的顺序来清理。一来可以避免家庭成员的重复劳动,二来还能提高效率。

从上到下,一般指的是先集中人力清洁最麻烦的天花板和灯具,毕竟在梯子上举着手劳动真不是一件容易事,大家一起接力完成要比一个人单独负责要快速和安全得多。等啃完了这根最硬的骨头,再逐步清理墙面和家具,等这些地方都清洁完毕了,灰尘都掉到了地板上之后,最后一并和地面的灰尘处理就能搞定。

从内到外,则是指先从家中最深处的房间开始,比如阳台、卧室等,避免将灰尘带回已清洁区域。而我自己的习惯则是把卫生间排在最外(也算是最后吧),毕竟在打扫的过程中大家肯定会进进出出卫生间好多次,如果先把卫生间打扫了,那没一会就又被踩脏了。

从少用到常用,意思是优先清洁使用频率较低的区域,如客房或储物间,最后清洁厨房和客厅等常用区域,原因和上面的从内到外差不多。而且,这些区域很可能你一年也不会进去几次,所累积的灰尘可能也要比想象的多。因此,提前先把它们搞完也是有必要的。

规划晾晒

清洁过程中,必然有许多东西是需要洗洗晒晒的。但阳台只有那么大,哪怕你有烘干机,空间也依旧有限。因此,合理规划晾晒顺序和空间,可以很好地避免待晾晒织物在洗衣机内发臭。

我觉得,如果你家不是有一个大庭院或大露台能给你一下晾晒完所有的床单被套窗帘啥的,那么大扫除其实不必在一天搞完。分批次进行,不仅能保证晾晒的织物更有阳光的味道,也能让你们不那么累。

目前,我自己的习惯是首先清洁常用卧室的窗帘和床品,再接着是次卧和客卧等不常有人区域的窗帘和床品,根据自己的阳台容量,提前拆下清洗,晾晒后即可重新挂会 / 套回原处,不占空间。

随后,就可以来到抱枕、毯子、沙发套等物品。它们有大有小,小物品可以用衣架一次性晾完,大的物品就遵循上面窗帘和床品的原则,晒干就归位原处,避免占据阳台空间。

最后是需要清洗的衣物。总有一些衣物是你一年都没穿过担忧不舍得丢的,这时候也给它们一次焕然一新的机会吧。

重新整理

大扫除的过程,也是重新整理自己物品和断舍离的过程。我们对于卫生的评价除了干净无异味之外,往往还有整洁这一维度。通过重新整理家中大大小小的物品,将它们归位到应该呆着的位置,不仅能让视觉上的空间更显宽阔,更重要的是,一个整齐的家,真的会让人看着赏心悦目。

在我看来,重新整理的过程其实会深入到大扫除的每个时刻,我们在清洁的过程中必然会不自觉地将一些东西「放到他们该呆的地方」。那么首先,分类归位就很重要:按功能将物品进行分类,然后将它们集体收纳到柜子或抽屉中。对于小件物品,则可以使用收纳箱或分隔盒集中存放,避免后续总是出现找不到的情况。

在我们整理的过程中,物品也会在经过一次筛选。实际上,很多物品并没有我们想象地那么有价值,对于这些物品,或许你真的需要狠狠心。一般来说,如果一个物品我已经有三年的时间没有再打开过,以及再见到它时也没有多么情绪的起伏,那么它就可以被归类为不需要的物品被丢弃,例如已经删好友的朋友在大学送的杯子、前任的记事本等等。

而对于已过期的和无法再使用的物品就没什么好说的了,毫不犹豫地丢掉就行。

在整理过程中,大概率也会遇到一个物品不知道放在哪里合适的难题。遇到这个情况时,不妨找找自己还有没有更多的储物空间,或者是搜寻一下家中现有的储物工具,为它开辟一个新区域。我认为,对于大部分人来说,家庭的空间是足够用于收纳的,只是某个物品你还没有想好让它去哪里而已。这时候,放进一个「未分类」的盒子里或许是很好的解决办法 —— 我相信,很多人的家里真的需要一个这样的盒子。

不过,「未分类」的盒子更应该是个中转站,是让你临时逃避问题的选择。当一个物品进了未分类区域后,不是说就丢在那不管不顾了。我的建议是每个月定期到这里来看看,或许经过时间的打磨之后,你就给一些物品找到了新家。

哦对了,重新整理的过程其实也是发现故障的过程。有时候你可能会在整理的过程中发现某些物品出现了故障,比如电器损坏、插座没法用等等。如果能自己解决,就顺带在大扫除里解决掉。实在没法解决,而且又比较着急用的,那就赶紧喊师傅上门,不然人家回家过年了,你也只能对着它们干瞪眼。

正式开工!

其实到了这里就没有理论存在的土壤了,有了上面提到的工具和计划的加持,好好干就行。如果中途遇到了自己解决不了的问题,及时和家庭成员沟通,或是上网找找解决办法,总能有一条路是通的。

不过在这部分,更多问题可能出现在「人」自身。工作都有人摸鱼,这种重体力劳动的大扫除肯定也会有人摸鱼,如果不是太过分,开个玩笑提醒下就好。而对于体力较小的家庭成员,让 ta 负责一些轻松的工作也无可厚非,实在不行,大家一起多休息就好,毕竟这事也不着急。

还有一点就是,我喜欢在大扫除的时候同时开着全屋 6 个 HomePod 放歌或听播客。这样不仅可以转移一点注意力,也能让大扫除的过程有点乐趣,减少过程中的的痛苦。

全都点上

总结

无论这个年和谁过,我相信大扫除都是一种无可替代的仪式感。在大扫除结束之后,哪怕此刻的你已经腰酸背痛,但也肯定会有一种十分轻快愉悦的心情。面对着干净如新的家和与你一起大扫除完瘫坐在家的家人,想必你们已经更加有了共居的实感和过年的氛围。

希望这篇文章能够帮到你,让你也能在大扫除之前找到一些经验和妙招。尽管这里的经验必然没法适用于所有人,但也算是我自己大扫除下来的整理盒和思考,也算是抛砖引玉吧。

最后,祝我们新年快乐,祝我们和自己在意的人在新一年可以平静、舒心、安稳。^ ^

> 关注 少数派小红书,感受精彩数字生活 🍃

> 实用、好用的 正版软件,少数派为你呈现 🚀

    最近在思考一个反人性的操作:与其考验主观耐力,不如从客观上切断退路。
    我想找这样一个工具:

    1. 本地生成一个新的钱包私钥。
    2. 对私钥进行“时间锁加密”( Time-lock Encryption )。设定一个解密难度或者依赖未来的某个时间戳(比如 Drand 信标)才能解密。
    3. 把币转进去,然后彻底删除明文私钥,只保留那个“打不开”的加密文件。
    4. 这样在设定时间到达之前,哪怕比特币涨到 20 万或者跌到 1 万,我也只能干瞪眼,没有任何办法卖出。
      现在的智能合约(如 CLTV )虽然能做到锁定,但往往操作门槛高,而且要把币转到合约里总觉得不放心。我想问问大家:

    ● 这种“加密后丢弃钥匙”的方案,目前有成熟的开源工具吗?

    ● 这种做法最大的风险是不是如果不小心把加密文件也删了,就彻底归零了?

    ● 还有没有比这更绝的“防手贱”方案?

    大家好,我是良许。

    在嵌入式开发中,中断是一个非常重要的概念。

    它允许 MCU 在执行主程序的同时,能够及时响应外部事件,比如按键按下、传感器信号变化等。

    今天我们就来深入学习 STM32 的 EXTI 外部中断事件控制器,这是每个 STM32 开发者都必须掌握的核心知识。

    1. EXTI 外部中断事件控制器概述

    1.1 什么是 EXTI

    EXTI 是 STM32 中用于管理外部中断和事件的控制器。

    它可以检测 GPIO 引脚上的电平变化,并在满足触发条件时产生中断或事件。

    简单来说,EXTI 就像是一个"门卫",时刻监视着外部世界的变化,一旦发现符合条件的信号,就立即通知 CPU 去处理。

    在实际项目中,我曾经用 EXTI 来处理紧急停止按钮。

    当操作人员按下急停按钮时,系统必须在几微秒内做出响应,停止所有运动部件。

    如果用轮询的方式去检测按钮状态,可能会因为主程序正在执行其他任务而延迟响应,但使用 EXTI 中断就能保证最快的响应速度。

    1.2 EXTI 的主要特性

    STM32 的 EXTI 控制器具有以下特性:

    1. 支持多达 23 条外部中断/事件线(具体数量因芯片型号而异)
    2. 每条中断线都可以独立配置触发方式:上升沿、下降沿或双边沿触发
    3. 每个 GPIO 引脚都可以配置为外部中断源
    4. 支持软件触发中断
    5. 具有独立的挂起状态位和屏蔽位
    6. 可以产生中断请求或事件请求

    需要注意的是,STM32 的 EXTI 有一个重要的限制:相同编号的 GPIO 引脚共享同一条 EXTI 线。

    比如 PA0、PB0、PC0 都连接到 EXTI0 线,这意味着你不能同时将 PA0 和 PB0 都配置为外部中断,只能选择其中一个。

    2. EXTI 工作原理

    2.1 EXTI 的内部结构

    EXTI 控制器主要由以下几个部分组成:

    1. 边沿检测电路:负责检测输入信号的上升沿、下降沿或双边沿
    2. 软件中断事件寄存器:允许通过软件触发中断
    3. 挂起请求寄存器:记录哪些中断线有挂起的中断请求
    4. 中断屏蔽寄存器:控制哪些中断线被使能
    5. 事件屏蔽寄存器:控制哪些事件线被使能

    当外部信号满足触发条件时,EXTI 会将对应的挂起位置 1,如果该中断线没有被屏蔽,就会向 NVIC(嵌套向量中断控制器)发送中断请求。

    2.2 中断与事件的区别

    EXTI 可以产生两种类型的输出:中断和事件。

    很多初学者容易混淆这两个概念。

    中断:会触发 CPU 执行中断服务程序(ISR),需要软件介入处理。

    当中断发生时,CPU 会暂停当前任务,跳转到中断服务函数执行,处理完成后再返回主程序。

    事件:不会触发 CPU 中断,而是产生一个脉冲信号,可以触发其他外设的操作,比如启动 ADC 转换、触发 DMA 传输等,整个过程不需要 CPU 参与,实现了硬件级的联动。

    在我做汽车电子项目时,经常使用事件模式来触发 ADC 采样。

    比如每隔固定时间需要采集传感器数据,我会用定时器产生 EXTI 事件,然后这个事件直接触发 ADC 开始转换,整个过程不占用 CPU 资源,效率非常高。

    3. EXTI 配置步骤

    3.1 使用 HAL 库配置 EXTI 的基本流程

    使用 STM32 HAL 库配置 EXTI 外部中断主要包括以下步骤:

    1. 使能 GPIO 时钟
    2. 配置 GPIO 引脚为输入模式
    3. 配置 EXTI 中断线
    4. 配置 NVIC 中断优先级
    5. 编写中断服务函数

    下面我用一个实际的按键中断例子来说明整个配置过程。

    3.2 按键外部中断配置示例

    假设我们使用 PA0 引脚连接一个按键,按键按下时引脚电平为低,松开时为高(上拉输入)。

    我们希望在按键按下(下降沿)时触发中断。

    /* 1. GPIO初始化配置 */
    void MX_GPIO_Init(void)
    {
        GPIO_InitTypeDef GPIO_InitStruct = {0};
        
        /* 使能GPIOA时钟 */
        __HAL_RCC_GPIOA_CLK_ENABLE();
        
        /* 配置PA0为输入模式,上拉,外部中断模式 */
        GPIO_InitStruct.Pin = GPIO_PIN_0;
        GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;  // 下降沿触发中断
        GPIO_InitStruct.Pull = GPIO_PULL_UP;          // 上拉
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
        
        /* 配置NVIC中断优先级 */
        HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);
        
        /* 使能EXTI0中断 */
        HAL_NVIC_EnableIRQ(EXTI0_IRQn);
    }
    ​
    /* 2. 中断服务函数 */
    void EXTI0_IRQHandler(void)
    {
        /* 调用HAL库的中断处理函数 */
        HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
    }
    ​
    /* 3. 中断回调函数 */
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
        if(GPIO_Pin == GPIO_PIN_0)
        {
            /* 按键按下,执行相应操作 */
            // 这里可以添加你的业务逻辑
            // 比如翻转LED状态
            HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
        }
    }

    3.3 配置参数详解

    在上面的代码中,有几个关键的配置参数需要理解:

    GPIO\_MODE\_IT\_FALLING:这个参数指定了中断触发方式。

    HAL 库提供了以下几种选择:

    • GPIO_MODE_IT_RISING:上升沿触发
    • GPIO_MODE_IT_FALLING:下降沿触发
    • GPIO_MODE_IT_RISING_FALLING:双边沿触发

    GPIO\_PULL\_UP:配置 GPIO 的上拉/下拉电阻。

    选项包括:

    • GPIO_NOPULL:无上拉下拉
    • GPIO_PULLUP:上拉
    • GPIO_PULLDOWN:下拉

    HAL\_NVIC\_SetPriority:设置中断优先级。

    第二个参数是抢占优先级,第三个参数是子优先级。

    抢占优先级高的中断可以打断抢占优先级低的中断,而子优先级只在抢占优先级相同时才起作用。

    4. EXTI 中断优先级管理

    4.1 NVIC 中断优先级分组

    STM32 使用 NVIC 来管理所有中断,包括 EXTI 中断。

    NVIC 支持中断优先级分组,通过 HAL_NVIC_SetPriorityGrouping() 函数来配置。

    /* 配置中断优先级分组为组2 */
    HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);

    不同的优先级分组方式决定了抢占优先级和子优先级的位数分配:

    • NVIC_PRIORITYGROUP_0:0 位抢占优先级,4 位子优先级
    • NVIC_PRIORITYGROUP_1:1 位抢占优先级,3 位子优先级
    • NVIC_PRIORITYGROUP_2:2 位抢占优先级,2 位子优先级
    • NVIC_PRIORITYGROUP_3:3 位抢占优先级,1 位子优先级
    • NVIC_PRIORITYGROUP_4:4 位抢占优先级,0 位子优先级

    4.2 合理设置中断优先级

    在实际项目中,合理设置中断优先级非常重要。

    一般遵循以下原则:

    1. 紧急程度高的中断设置高优先级:比如急停按钮、故障检测等
    2. 执行时间短的中断可以设置高优先级:避免长时间占用 CPU
    3. 相关性强的中断设置相近的优先级:便于管理和调试

    在我做的一个电机控制项目中,优先级设置如下:

    /* 急停按钮 - 最高优先级 */
    HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
    ​
    /* 编码器脉冲 - 高优先级 */
    HAL_NVIC_SetPriority(EXTI1_IRQn, 1, 0);
    ​
    /* 普通按键 - 中等优先级 */
    HAL_NVIC_SetPriority(EXTI2_IRQn, 2, 0);
    ​
    /* 通信接收 - 较低优先级 */
    HAL_NVIC_SetPriority(USART1_IRQn, 3, 0);

    5. EXTI 使用注意事项

    5.1 按键消抖处理

    在使用 EXTI 处理按键输入时,必须考虑按键抖动问题。

    机械按键在按下或松开的瞬间,触点会产生多次通断,导致产生多次中断。

    有两种常用的消抖方法:

    方法一:软件延时消抖

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
        if(GPIO_Pin == GPIO_PIN_0)
        {
            /* 简单延时消抖 */
            HAL_Delay(10);  // 延时10ms
            
            /* 再次检测按键状态 */
            if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
            {
                /* 确认按键按下,执行操作 */
                // 你的业务逻辑
            }
        }
    }

    但是这种方法有个问题:在中断服务函数中使用延时会阻塞其他中断,不推荐在实际项目中使用。

    方法二:定时器消抖(推荐)

    uint32_t last_interrupt_time = 0;
    #define DEBOUNCE_TIME 50  // 50ms消抖时间
    ​
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
        if(GPIO_Pin == GPIO_PIN_0)
        {
            uint32_t current_time = HAL_GetTick();
            
            /* 检查距离上次中断的时间间隔 */
            if((current_time - last_interrupt_time) > DEBOUNCE_TIME)
            {
                last_interrupt_time = current_time;
                
                /* 执行按键处理 */
                // 你的业务逻辑
            }
        }
    }

    这种方法利用系统滴答定时器来判断时间间隔,不会阻塞其他中断,是更好的选择。

    5.2 中断服务函数的编写原则

    编写 EXTI 中断服务函数时,需要遵循以下原则:

    1. 尽量简短:中断服务函数应该尽快执行完毕,避免长时间占用 CPU
    2. 避免使用延时函数:不要在中断中使用 HAL_Delay() 等阻塞函数
    3. 避免复杂运算:复杂的计算应该在主程序中完成
    4. 使用标志位:可以在中断中设置标志位,在主程序中检测标志位并处理
    volatile uint8_t button_pressed = 0;  // 按键按下标志
    ​
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
        if(GPIO_Pin == GPIO_PIN_0)
        {
            /* 只设置标志位,不做复杂处理 */
            button_pressed = 1;
        }
    }
    ​
    int main(void)
    {
        /* 系统初始化 */
        HAL_Init();
        SystemClock_Config();
        MX_GPIO_Init();
        
        while(1)
        {
            /* 在主循环中检测标志位 */
            if(button_pressed)
            {
                button_pressed = 0;  // 清除标志
                
                /* 执行复杂的处理逻辑 */
                process_button_event();
            }
            
            /* 其他任务 */
        }
    }

    5.3 多个 EXTI 中断的处理

    当使用多个外部中断时,需要注意中断线的分配。

    STM32 的 EXTI0 到 EXTI4 各有独立的中断向量,而 EXTI5 到 EXTI9 共享一个中断向量(EXTI9\_5\_IRQn),EXTI10 到 EXTI15 共享另一个中断向量(EXTI15\_10\_IRQn)。

    /* EXTI5-9共享中断处理函数 */
    void EXTI9_5_IRQHandler(void)
    {
        /* 检查是哪个引脚触发的中断 */
        if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_5) != RESET)
        {
            HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
        }
        
        if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_6) != RESET)
        {
            HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
        }
        
        // 其他引脚的处理...
    }
    ​
    /* 回调函数中区分不同的引脚 */
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
        switch(GPIO_Pin)
        {
            case GPIO_PIN_5:
                /* 处理PIN5的中断 */
                break;
                
            case GPIO_PIN_6:
                /* 处理PIN6的中断 */
                break;
                
            default:
                break;
        }
    }

    6. EXTI 实战应用案例

    6.1 旋转编码器接口

    旋转编码器是嵌入式系统中常用的输入设备,通常有 A、B 两相输出。

    通过检测 A、B 相的相位关系可以判断旋转方向和速度。

    使用 EXTI 可以很好地实现编码器接口。

    #define ENCODER_A_PIN GPIO_PIN_0
    #define ENCODER_B_PIN GPIO_PIN_1
    #define ENCODER_PORT GPIOA
    ​
    volatile int32_t encoder_count = 0;
    ​
    void Encoder_Init(void)
    {
        GPIO_InitTypeDef GPIO_InitStruct = {0};
        
        __HAL_RCC_GPIOA_CLK_ENABLE();
        
        /* 配置A相为外部中断 */
        GPIO_InitStruct.Pin = ENCODER_A_PIN;
        GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        HAL_GPIO_Init(ENCODER_PORT, &GPIO_InitStruct);
        
        /* 配置B相为普通输入 */
        GPIO_InitStruct.Pin = ENCODER_B_PIN;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        HAL_GPIO_Init(ENCODER_PORT, &GPIO_InitStruct);
        
        HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0);
        HAL_NVIC_EnableIRQ(EXTI0_IRQn);
    }
    ​
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
        if(GPIO_Pin == ENCODER_A_PIN)
        {
            /* 读取A相和B相的状态 */
            uint8_t a_state = HAL_GPIO_ReadPin(ENCODER_PORT, ENCODER_A_PIN);
            uint8_t b_state = HAL_GPIO_ReadPin(ENCODER_PORT, ENCODER_B_PIN);
            
            /* 根据相位关系判断旋转方向 */
            if(a_state == b_state)
            {
                encoder_count++;  // 正转
            }
            else
            {
                encoder_count--;  // 反转
            }
        }
    }

    6.2 红外遥控接收

    红外遥控器发送的是脉宽调制信号,通过测量脉冲宽度可以解码出按键信息。

    使用 EXTI 配合定时器可以实现红外信号的解码。

    #define IR_PIN GPIO_PIN_2
    #define IR_PORT GPIOA
    ​
    volatile uint32_t ir_start_time = 0;
    volatile uint32_t ir_pulse_width = 0;
    volatile uint8_t ir_data_ready = 0;
    ​
    void IR_Init(void)
    {
        GPIO_InitTypeDef GPIO_InitStruct = {0};
        
        __HAL_RCC_GPIOA_CLK_ENABLE();
        
        GPIO_InitStruct.Pin = IR_PIN;
        GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;  // 下降沿触发
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        HAL_GPIO_Init(IR_PORT, &GPIO_InitStruct);
        
        HAL_NVIC_SetPriority(EXTI2_IRQn, 2, 0);
        HAL_NVIC_EnableIRQ(EXTI2_IRQn);
    }
    ​
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
        if(GPIO_Pin == IR_PIN)
        {
            uint32_t current_time = HAL_GetTick();
            
            if(ir_start_time == 0)
            {
                /* 记录起始时间 */
                ir_start_time = current_time;
            }
            else
            {
                /* 计算脉冲宽度 */
                ir_pulse_width = current_time - ir_start_time;
                ir_start_time = current_time;
                ir_data_ready = 1;
                
                /* 根据脉冲宽度解码数据 */
                // 这里添加解码逻辑
            }
        }
    }

    7. 总结

    EXTI 外部中断事件控制器是 STM32 中非常重要的外设,掌握它对于开发响应式的嵌入式系统至关重要。

    通过本文的学习,我们了解了 EXTI 的工作原理、配置方法以及实际应用技巧。

    在实际开发中,使用 EXTI 需要注意以下几点:首先要合理设置中断优先级,确保重要的中断能够及时响应;其次要注意按键消抖等实际问题,避免误触发;最后要遵循中断服务函数简短高效的原则,复杂的处理逻辑应该在主程序中完成。

    我在多年的嵌入式开发经验中,EXTI 几乎是每个项目都会用到的功能。

    从简单的按键检测到复杂的编码器接口、红外遥控接收,EXTI 都能很好地胜任。

    希望这篇文章能帮助大家更好地理解和使用 STM32 的 EXTI 功能,在实际项目中灵活运用。

    更多编程学习资源

    EazyDraw 是 Mac 上专门画矢量图的工具,简单说就是用来做平面图、图标、插画、技术绘图这些,画出来的图放大不会糊,适合需要干净线条和精确尺寸的场景。

    1. 先下载好安装包

    安装包下载:https://pan.quark.cn/s/f42ce6432768 ,把 EazyDraw for Mac v11.4.1.dmg文件下载到你的 Mac(比如放桌面或下载文件夹,别塞太深的子文件夹,一会儿好找)。

    2. 打开 dmg 镜像文件

    找到下载好的 .dmg文件,双击它——屏幕会弹出一个新窗口,里面一般有俩东西:一个是“EazyDraw”的图标(一般是浅色方块,上面有绘图笔或几何图形样式),另一个是“应用程序”文件夹的快捷方式(小文件夹图标)。

    3. 把软件拖进“应用程序”文件夹

    按住“EazyDraw”图标,直接拖到旁边的“应用程序”文件夹里(跟平时拷贝文件一样),等进度条走完,这一步就装好了。

    4. 首次打开要“解锁”(重点!)

    去“应用程序”文件夹找到 EazyDraw,双击打开。第一次运行时,macOS 会弹提示“无法验证开发者”,别慌:

    • 点左上角苹果图标 → 选“系统设置”(旧版叫“系统偏好设置”)→ 左侧点“隐私与安全性”;
    • 右边往下翻,找到“安全性”区域,会看到“已阻止使用‘EazyDraw’,因为来自身份不明的开发者”,下面有个“仍要打开”按钮,点一下,再输开机密码确认就行(如果没看到“仍要打开”,先关掉提示窗口,重新打开软件,提示会再出现)。

    1. 周期依然有效
    2. 耐心等待,永远不要抄底
    3. v 币同样需要经历熊市,项目本身要抓住机会尽量活下来
    4. sol 和生态币还有很大空间,再好的生态币也不可能逆势上涨
    5. 年底到明年一季度看可能是机会

    引言
    在物联网(IoT)的浪潮中,低功耗广域网(LPWAN)技术扮演着至关重要的角色。其中,LoRaWAN作为一种开放标准,以其远距离、低功耗的特性,在智能城市、智慧农业、工业物联网等领域展现出巨大的应用潜力。理解LoRaWAN的网络拓扑结构,是深入掌握其工作原理和应用部署的关键。本文将详细解析LoRaWAN的网络拓扑,并介绍门思科技(Manthink)如何通过其创新的产品和解决方案,助力LoRaWAN生态系统的发展。
    LoRaWAN网络拓扑概述
    LoRaWAN网络采用独特的“星形拓扑(Star-of-Stars Topology)”结构,这与传统的蜂窝网络或Wi-Fi网络有着显著的区别。在这种拓扑中,终端设备(End Devices)不直接与网络服务器通信,而是通过一个或多个网关(Gateway)进行数据中继。这种设计极大地简化了终端设备的复杂性,降低了功耗,延长了电池寿命。
    LoRaWAN网络主要由以下四个核心组成部分构成:

    1. 终端设备(End Devices):也称为节点,是网络的最前端,负责采集数据(如温度、湿度、位置等)或执行控制指令。它们通常是电池供电,通过LoRa无线技术与网关通信。
    2. 网关(Gateways):也称为基站或集中器,是连接终端设备和网络服务器的桥梁。网关接收来自终端设备的LoRa信号,并将其转换为IP数据包,通过标准IP连接(如以太网、Wi-Fi或蜂窝网络)转发到网络服务器。同时,网关也能将网络服务器的下行数据转发给终端设备。
    3. 网络服务器(Network Server, NS):是LoRaWAN网络的核心大脑,负责管理整个网络的运行。它的主要功能包括:数据去重、上行数据路由到正确的应用服务器、下行数据调度、自适应数据速率(ADR)管理、设备激活(OTAA/ABP)等。网络服务器确保了数据在终端设备和应用服务器之间的可靠传输。
    4. 应用服务器(Application Server):负责处理和存储来自终端设备的业务数据,并向下行发送控制指令。它是最终用户或应用程序与LoRaWAN网络交互的接口,通常会提供数据可视化、分析和应用集成等功能。
      这种星形拓扑结构使得LoRaWAN网络具有高扩展性、低功耗和广覆盖的优势。终端设备无需维护复杂的连接,只需将数据发送到任何可接收的网关,由网络服务器进行统一管理和路由。

    LoRaWAN网络拓扑的详细解析
    终端设备(End Devices)
    终端设备是LoRaWAN网络的感知层,它们可以是各种传感器、计量表或执行器。这些设备通常部署在偏远地区或难以供电的环境中,因此低功耗是其设计的核心考量。LoRaWAN协议通过优化通信机制,如Class A、Class B和Class C操作模式,以平衡功耗和通信延迟。
    门思科技(Manthink) 在终端设备领域提供了多样化的解决方案,以满足不同行业的需求。例如,支持EB的模组OMx22S,能够兼容CJ/T 188、DL/T 645、Modbus等多种协议,用户只需进行简单的硬件改动,即可将现有设备快速升级为LoRaWAN设备,大大降低了开发难度和成本。此外,DTU(数据传输单元) 产品,包括防水的DTU RDO21x 和 导轨式DTU RDI22x,能够支持CJ/T 188、DL/T645等物联网设备的接入,为传统设备的LoRaWAN化提供了便捷途径。SE72温湿度表 更是凭借其IP65防护等级和长达8年的电池寿命,成为恶劣环境下数据采集的理想选择。
    网关(Gateways)
    网关是LoRaWAN网络中的关键基础设施,负责接收来自终端设备的LoRa信号并将其转发至网络服务器。一个网关可以覆盖数公里甚至数十公里的范围,并同时处理数千个终端设备的数据。网关通常部署在建筑物顶部或高塔上,以获得最佳的覆盖范围。
    门思科技(Manthink) 的网关产品线提供了企业级的解决方案。室外网关GDO51系列 和 室内网关GDI51系列 均基于Ubuntu操作系统,能够适应复杂的企业内网环境。它们支持多种主流协议,如ChirpStack、Basic Station、TTN、ThinkLink、GWMP等,这意味着门思科技的网关可以无缝接入任何支持这些协议的LoRaWAN系统,为用户提供了极大的灵活性和兼容性。
    网络服务器(Network Server, NS)
    网络服务器是LoRaWAN网络的“大脑”,它管理着所有终端设备的连接、数据路由和安全。网络服务器负责处理上行数据(从设备到应用)和下行数据(从应用到设备),并确保数据的完整性和安全性。自适应数据速率(ADR)功能也是由网络服务器控制,它根据终端设备与网关之间的链路质量动态调整数据速率,以优化网络容量和终端设备电池寿命。
    门思科技(Manthink) 在网络服务器领域拥有强大的自研产品——ThinkLink。ThinkLink云版本 支持全球LoRaWAN标准,用户可以免费注册并免费接入多达1000个LoRaWAN设备,这对于小型项目或个人开发者来说是一个巨大的优势。它支持任何品牌的支持GWMP和ThinkLink协议的网关接入,极大地扩展了其兼容性。此外,ThinkLink-Edge版本 是一款高性能的边缘计算网络服务器,配备8核处理器、8GB DDR内存和64GB eMMC存储,并内嵌了Home Assistant和ThingsBoard。它支持与Home Assistant、ThingsBoard、BACnet的无缝对接,为本地数据处理和智能自动化提供了强大的支持,特别适用于对数据实时性、安全性要求较高的工业和商业应用场景。
    应用服务器(Application Server)
    应用服务器是LoRaWAN网络的最终目的地,它接收来自网络服务器的数据,并将其转换为用户可理解和利用的信息。这些信息可以用于数据分析、可视化、告警通知或与其他业务系统集成。应用服务器通常由最终用户或第三方服务提供商开发和维护。
    门思科技的产品理念是为用户提供一个简单、高效的LoRaWAN解决方案。通过自研的低功耗操作系统(MPOS)和边缘计算虚拟器(Edge-bus),门思科技的产品家族能够支持全球频段的LoRaWAN标准,并具备十三大功能点以适应复杂的应用场景。从2014年开始,门思科技的产品已经在南美、欧洲、日本等全球多个国家和地区有着长期广泛的应用,积累了超过10年的现场稳定运行经验,充分证明了其产品的可靠性和稳定性。
    LoRaWAN网络拓扑图示例
    为了更直观地理解LoRaWAN的网络拓扑,以下是一个典型的LoRaWAN网络架构图:
    [此处插入LoRaWAN网络拓扑图]

    门思科技(Manthink)在LoRaWAN生态中的角色
    门思科技作为LoRaWAN领域的先行者和创新者,致力于提供从模组、终端设备、网关到网络服务器的全栈式解决方案。我们的产品家族基于自研的低功耗操作系统(MPOS)和边缘计算虚拟器(Edge-bus),支持全球频段的LoRaWAN标准,并具有十三大功能点以适应复杂的应用场景。这些产品已经在包括南美、欧洲、日本等全球多个国家和地区有着长期广泛的应用,最早的规模化应用从2014年开始到现在已经超过10年的现场稳定运行,充分证明了门思科技产品的可靠性和稳定性。
    我们的优势:
    ● 全栈式解决方案:提供从硬件到软件,从设备到云端的完整LoRaWAN解决方案。
    ● 技术领先:自研MPOS和Edge-bus,确保产品性能和稳定性。
    ● 全球兼容:支持全球频段的LoRaWAN标准,适应不同国家和地区的需求。
    ● 丰富功能:十三大功能点,满足复杂多样的应用场景。
    ● 长期稳定运行:超过10年的现场稳定运行经验,品质值得信赖。
    总结
    LoRaWAN以其独特的星形拓扑结构,为物联网应用提供了低功耗、远距离的连接能力。理解其网络组成部分——终端设备、网关、网络服务器和应用服务器——对于成功部署和管理LoRaWAN网络至关重要。门思科技(Manthink)凭借其在LoRaWAN领域的深厚积累和创新产品,为全球用户提供了可靠、高效、易于部署的LoRaWAN解决方案,助力各行各业实现数字化转型。
    了解更多门思科技(Manthink)
    ● 门思科技官方网站:https://www.manthink.cn
    ● 门思科技LoRaWAN NS 产品:https://thinklink.manthink.cn (小项目可以免费使用ThinkLink)
    ● 联系邮箱:info@manthink.cn
    关键词: LoRa, LoRaWAN, 网关, Gateway, NS, Manthink, 门思科技, 物联网, LPWAN, 网络拓扑

    IPERFforWindowsTrialSigned是 iperf 网络带宽测试工具的 Windows 安装包,iperf 能在两台电脑或设备之间测网络吞吐量(就是看网速到底能跑多快),运维、网络调试、测 Wi-Fi 或局域网性能时常用。

    一、准备工作

    1. 下载安装包

      安装包下载:https://pan.quark.cn/s/6d027407c943

    二、安装步骤

    1. 双击 IPERFforWindowsTrialSigned.exe运行。
    2. 如果是 Win10/Win11,会弹出“用户账户控制”提示 → 点  “是” (需要管理员权限)。
    3. 进入安装向导,选语言(默认 English,有的版本有中文)→ 点  “Next”
    4. 阅读许可协议 → 选 “I accept…” → 点  “Next”
    5. 选安装位置:

      • 默认是 C:\Program Files\iperf或类似路径,可点 Browse 改到 D 盘。
    6. 附加任务:

      • 建议勾 “Create a desktop shortcut”(创建桌面快捷方式),方便以后打开。
    7. 点  “Install” ​ 开始安装,等进度条走完(很快,几秒到十几秒)。
    8. 安装完会问是否立即启动 → 可先取消,iperf 一般用命令行跑,不会自动弹 GUI。

    三、首次运行与基本使用

    1. 装完后,iperf 其实是个命令行工具,在开始菜单或安装目录能找到 iperf3.exe(或 iperf.exe)。
    2. 按 Win+R输入 cmd回车,打开命令提示符。
    3. 切到安装目录,比如:

      cd "C:\Program Files\iperf\bin"

       title=

    4. 测网速基本流程

      • 一台电脑当服务端:

        iperf3 -s
    -   另一台电脑当客户端(连服务端 IP):
    
        ```
        iperf3 -c 服务端IP
        ```
    
    
    
    -   跑完会显示带宽、丢包、抖动等信息。
    
    1. 常用参数:

      • -t设置测试时长(秒),比如 -t 30测 30 秒。
      • -P设置并发连接数,比如 -P 4用 4 条流同时测。

    🌟 TrendForge 每日精选 - 发现最具潜力的开源项目
    📊 今日共收录 7 个热门项目,涵盖 50 种编程语言

    🌐 智能中文翻译版 - 项目描述已自动翻译,便于理解

    🏆 今日最热项目 Top 10

    🥇 openai/skills

    项目简介: Codex 技能目录

    今日新增: 583 | 总星数: 4842 | 语言: Python

    https://github.com/openai/skills


    🥈 bytedance/UI-TARS-desktop

    项目简介: 开源多模态AI智能体堆栈,连接尖端AI模型与智能体基础设施

    今日新增: 573 | 总星数: 27099 | 语言: TypeScript

    项目截图:

    bytedance/UI-TARS-desktop

    https://github.com/bytedance/UI-TARS-desktop


    🥉 aquasecurity/trivy

    项目简介: 在容器、Kubernetes、代码仓库、云环境等场景中检测漏洞、错误配置、密钥泄露和软件物料清单

    今日新增: 165 | 总星数: 31535 | 语言: Go

    项目截图:

    aquasecurity/trivy

    https://github.com/aquasecurity/trivy


    4. nvm-sh/nvm

    项目简介: Node 版本管理器 - 符合 POSIX 标准的 bash 脚本,用于管理多个活跃的 node.js 版本

    今日新增: 131 | 总星数: 91497 | 语言: Shell

    https://github.com/nvm-sh/nvm


    5. DataExpert-io/data-engineer-handbook

    项目简介: 数据工程全方位学习资源汇总仓库

    今日新增: 71 | 总星数: 39856 | 语言: Jupyter Notebook

    https://github.com/DataExpert-io/data-engineer-handbook


    6. Flowseal/zapret-discord-youtube

    项目简介:

    今日新增: 70 | 总星数: 21967 | 语言: Batchfile

    项目截图:

    Flowseal/zapret-discord-youtube

    https://github.com/Flowseal/zapret-discord-youtube


    7. likec4/likec4

    项目简介: 通过代码生成的实时动态图表,实现软件架构的可视化、协作与持续演进。

    今日新增: 40 | 总星数: 1802 | 语言: TypeScript

    项目截图:

    likec4/likec4

    https://github.com/likec4/likec4


    🌈 分语言热门项目

    ● C 最热项目

    项目名称: tmux/tmux

    项目描述: tmux源代码

    今日新增: 62 | 总数: 41435

    地址: https://github.com/tmux/tmux


    项目名称: timescale/timescaledb

    项目描述: 作为Postgres扩展打包的高性能实时分析时序数据库

    今日新增: 40 | 总数: 21703

    地址: https://github.com/timescale/timescaledb


    项目名称: bol-van/zapret2

    项目描述: 反深度包检测软件

    今日新增: 17 | 总数: 1464

    地址: https://github.com/bol-van/zapret2


    ● C# 最热项目

    项目名称: marticliment/UniGetUI

    项目描述: UniGetUI:您的包管理器图形界面。或可粗略描述为用于管理包管理器的"包管理器管理器"。

    今日新增: 140 | 总数: 20667

    项目截图:

    marticliment/UniGetUI

    地址: https://github.com/marticliment/UniGetUI


    项目名称: wshobson/agents

    项目描述: 面向Claude Code的智能自动化与多智能体编排系统

    今日新增: 101 | 总数: 27973

    项目截图:

    wshobson/agents

    地址: https://github.com/wshobson/agents


    项目名称: Cleanuparr/Cleanuparr

    项目描述: Cleanuparr是一款自动化清理工具,用于清理Sonarr、Radarr及支持的下载客户端(如q...

    今日新增: 55 | 总数: 1902

    地址: https://github.com/Cleanuparr/Cleanuparr


    ● C++ 最热项目

    项目名称: ggml-org/llama.cpp

    项目描述: 使用 C/C++ 实现的大语言模型推理框架

    今日新增: 85 | 总数: 94535

    项目截图:

    ggml-org/llama.cpp

    地址: https://github.com/ggml-org/llama.cpp


    项目名称: godotengine/godot

    项目描述: Godot引擎——跨平台2D与3D游戏引擎

    今日新增: 61 | 总数: 106402

    项目截图:

    godotengine/godot

    地址: https://github.com/godotengine/godot


    项目名称: LadybirdBrowser/ladybird

    项目描述: 真正独立的网页浏览器

    今日新增: 33 | 总数: 58405

    地址: https://github.com/LadybirdBrowser/ladybird


    ● Lua 最热项目

    项目名称: yetone/avante.nvim

    项目描述: 像使用Cursor AI IDE般高效运用您的Neovim

    今日新增: 13 | 总数: 17325

    项目截图:

    yetone/avante.nvim

    地址: https://github.com/yetone/avante.nvim


    项目名称: Kong/kong

    项目描述: 🦍 云原生API网关与AI网关。

    今日新增: 12 | 总数: 42695

    项目截图:

    Kong/kong

    地址: https://github.com/Kong/kong


    项目名称: coder/claudecode.nvim

    项目描述: 🧩 Claude Code Neovim IDE 扩展

    今日新增: 10 | 总数: 1967

    地址: https://github.com/coder/claudecode.nvim


    ● Vue 最热项目

    项目名称: dreamhunter2333/cloudflare_temp_email

    项目描述: CloudFlare 免费临时域名邮箱 支持附件收发 IMAP SMTP TelegramBot

    今日新增: 23 | 总数: 5972

    项目截图:

    dreamhunter2333/cloudflare_temp_email

    地址: https://github.com/dreamhunter2333/cloudflare_temp_email


    项目名称: zyronon/TypeWords

    项目描述: 练习英语 一次敲击 一点进步

    今日新增: 17 | 总数: 7326

    项目截图:

    zyronon/TypeWords

    地址: https://github.com/zyronon/TypeWords


    项目名称: vbenjs/vue-vben-admin

    项目描述: 一个基于Vue3、Shadcn UI、Vite、TypeScript和Monorepo构建的现代化V...

    今日新增: 14 | 总数: 31485

    项目截图:

    vbenjs/vue-vben-admin

    地址: https://github.com/vbenjs/vue-vben-admin


    ● Kotlin 最热项目

    项目名称: RunanywhereAI/runanywhere-sdks

    项目描述: 可在本地运行AI的生产就绪工具包

    今日新增: 165 | 总数: 6291

    项目截图:

    RunanywhereAI/runanywhere-sdks

    地址: https://github.com/RunanywhereAI/runanywhere-sdks


    项目名称: tiann/KernelSU

    项目描述: 基于内核的Android系统root解决方案 (注:根据技术文档惯例,"Kernel based"译...

    今日新增: 15 | 总数: 14915

    地址: https://github.com/tiann/KernelSU


    项目名称: JackEblan/Geto

    项目描述: 为应用配置设备级设置。该项目采用多模块化设计,遵循Bob大叔的整洁架构原则,参考Now in And...

    今日新增: 9 | 总数: 761

    项目截图:

    JackEblan/Geto

    地址: https://github.com/JackEblan/Geto


    📈 今日趋势分析

    最活跃语言: TypeScript(2个)、Python(1个)、Go(1个)

    今日总获星: 1,633 颗星

    平均获星: 233 颗星/项目

    今日之星: openai/skills (583)


    📊 数据总览

    指标数值
    收录项目7
    编程语言50
    今日新增1,633 颗星
    报告日期2026年02月06日
    统计周期日报

    TrendForge 致力于追踪全球开源项目动态,每日为开发者精选最具价值的 GitHub 项目。

    数据来源: https://trendforge.devlive.top/

    数据说明: 基于 GitHub 官方 API 数据统计,每日更新

    翻译声明: 项目描述采用 AI 智能翻译,如有疏漏请以原文为准

    报告生成于: 2026年02月07日

    GitHub #开源项目 #技术趋势 #程序员 #软件开发

    视觉智能的商业临界点已经到来
    2026年,多模态视觉大模型的发展正从技术探索阶段过渡到商业价值兑现期。当技术能够稳定识别图像中的商品并理解用户自然语言描述的偏好时,一个新的商业时代开启了。在东京银座的一家高端百货,一套基于多模态视觉大模型的导购系统正在改变零售体验:顾客用手机拍摄心仪的手提包,系统不仅识别品牌和型号,还能根据顾客过往的购物记录、当前穿着风格,甚至社交媒体上表达的生活态度,推荐相配的鞋履和配饰——这种体验的转化率比传统推荐系统高出三倍。

    这种商业价值的爆发并非偶然,而是多项技术成熟度曲线交汇的必然结果。视觉识别精度突破95%实用门槛、跨模态语义对齐技术让图像与语言理解无缝衔接、边缘计算能力大幅提升使实时分析成为可能——这三个技术拐点在2025-2026年间相继到来,为商业化应用扫清了最后障碍。


    行业级解决方案的差异化竞争策略
    2026年最成功的商业实践表明,通用型多模态视觉模型难以直接创造商业价值,而针对特定行业深度优化的模型却能快速形成竞争壁垒。

    在医疗影像诊断领域,领先企业不再简单标定病灶位置,而是构建了“影像-病理-预后”的全链条理解模型。当系统读取CT扫描时,它不仅识别肿瘤特征,还能关联相似病例的治疗方案和康复轨迹,为医生提供决策支持而非仅仅诊断辅助。这种深度行业理解构建的数据护城河,使后来者难以在短期内追赶。

    制造业的质量检测方案则展现了另一种商业逻辑。传统视觉检测只能识别预设的缺陷类型,而多模态系统通过分析产品图像、生产线传感器数据和维修记录文本,能发现人眼难以察觉的潜在缺陷模式,甚至预测设备故障对产品质量的影响。这种从“检测”到“预防”的价值跃迁,让客户愿意支付十倍于传统系统的价格。


    成本结构的革命与商业模式创新
    多模态视觉大模型的商业普及,关键驱动力之一是成本结构的根本性改变。2025年之前,训练行业级模型需要数百万美元的算力投入,而2026年的模块化训练框架和模型高效微调技术,将这一门槛降低到原来的十分之一。

    成本下降催生了全新的商业模式。在时尚行业,一家初创公司不再销售软件许可,而是提供“视觉智能订阅服务”:中小品牌按月支付费用,即可获得与大牌同等的视觉分析和设计辅助能力。在农业领域,服务商根据农田面积和检测频率收费,为农场主提供作物病虫害的早期预警——这种“效果付费”模式彻底改变了技术采购的逻辑。

    更值得关注的是边缘端部署的经济性突破。2026年,经过优化的多模态模型已能在智能手机和工业边缘设备上流畅运行,这意味着商业应用不再受限于云端连接,可以在网络条件差的工厂车间、偏远农场或应急现场发挥作用。这种部署方式的转变,开辟了数十个此前无法触达的商业场景。


    数据生态构建:从单向采集到价值循环
    传统视觉系统的数据流动是单向的:采集、标注、训练、部署。2026年领先企业的核心竞争优势,在于构建了能够自我增强的数据价值循环。

    零售巨头亚马逊的多模态系统展示了这种生态的威力:当顾客在实体店试穿服装时,视觉系统分析试穿效果;顾客的购买决定与在线评价形成反馈;这些数据不仅优化推荐算法,还反向指导服装设计与库存管理。数据在消费端与生产端之间形成闭环,每一条数据都多次创造价值。

    在自动驾驶领域,特斯拉建立的“影子模式”数据生态更为成熟:数百万辆车的视觉系统持续观察环境,即使在自动驾驶未激活时也在对比人类司机的决策与模型预测的差异。这种持续的对比学习使系统能力呈指数级增长,形成了竞争对手难以复制的数据资产。


    商业落地的隐形挑战与应对策略
    技术成熟度不等于商业成功率。2026年,多模态视觉大模型的商业落地面临三个隐形挑战,而成功企业已找到应对之道。

    首先是“期望值管理”问题。早期客户往往对AI能力抱有不切实际的期待,认为系统应像人类一样理解任何视觉场景。领先供应商通过“能力边界透明化”策略解决这一问题:明确告知系统在哪些场景下准确率超过98%,在哪些边缘情况下可能失效,并提供相应的保障方案。这种坦诚反而建立了更强的客户信任。

    其次是“集成复杂度”挑战。多模态系统需要与企业现有IT架构、数据平台和业务流程深度融合。提供“渐进式集成”方案的供应商更受青睐:先从单一场景试点,验证价值后再逐步扩展,避免“大爆炸式”改造带来的风险。

    最后是“持续进化”需求。商业环境不断变化,今天的模型明天就可能过时。建立“模型即服务”的持续更新机制成为标准配置,确保客户无需频繁投入重训成本即可获得能力升级。


    2026年的商业格局与未来展望
    到2026年末,多模态视觉大模型的市场已形成清晰的层级格局:底层是少数几家提供基础大模型的科技巨头;中间层是专注行业解决方案的垂直领域领导者;上层则是大量利用API构建具体应用场景的创新企业。

    这一格局中最具活力的正是中间层的行业专家。他们既理解技术的可能性,也深谙行业的痛点;既能为客户创造可见的ROI(投资回报率),又能建立长期的竞争壁垒。这些企业的估值逻辑已从传统的“软件毛利率”转变为“数据资产价值”和“行业生态地位”。

    展望2027年,下一轮商业突破将来自多模态系统与物理世界的更深度融合——当视觉理解能力与机器人操作、环境交互、实时决策结合时,将催生真正的“智能体经济”。那些在2026年掌握了多模态视觉模型商业方法论的企业,将在下一轮竞争中占据先发优势。

    商业与技术之间总是存在微妙的时差。2026年的机遇在于:技术刚刚跨越实用门槛,而商业认知还未完全普及——这中间的窗口期,正是先行者建立优势的最佳时机。多模态视觉大模型的发展历程再次证明:最具颠覆性的商业创新,往往发生在技术曲线从陡峭趋于平缓的转折点上,因为此时技术足够可靠,而应用想象刚刚展开。

    EmEditor是 EmEditor 文本编辑器的安装包,这是个主打大文件和代码编辑的工具,打开几百 MB 甚至 GB 的文本不卡,支持各种编程语言高亮、正则查找替换,写代码、改日志、处理数据都挺顺手。

    一、准备工作

    1. 下载安装包

    2. 用管理员身份运行(推荐)

      • 右键 EmEditor.exe→ 选“以管理员身份运行”,防止权限不足导致安装出错。

    二、安装步骤

    1. 双击 EmEditor.exe运行(如果右键过了就直接双击)。
    2. 第一次打开会弹出“用户账户控制”提示 → 点  “是”
    3. 进入安装向导,选语言(默认 English,有的版本有中文)→ 点  “Next”
    4. 阅读许可协议 → 选 “I accept the terms…” → 点  “Next”
    5. 选安装位置:

      • 默认是 C:\Program Files\EmEditor,可点 Browse 改到其他盘。
    6. 附加任务:

      • 建议勾 “Create a desktop shortcut”(创建桌面快捷方式),方便以后打开。
    7. 点  “Install” ​ 开始安装,等进度条走完(几十秒)。
    8. 安装完会问是否立即启动 → 可先取消,等会儿再开。

    三、首次运行与基本使用

    1. 在开始菜单或桌面找到 EmEditor​ → 点开。
    2. 第一次打开就是干净的主界面,类似记事本但功能更多。
    3. 打开大文件:拖文件进来或直接点“打开”,几百 MB 也能秒开。
    4. 代码高亮:打开 .c.py.html等文件,会自动识别并高亮语法。
    5. 查找替换:支持正则表达式,找特殊内容很方便。
    6. 多标签页:可以同时开多个文件,来回切换不用来回找窗口。

    版本 144.0.7559.133(正式版本) (64 位)

    鼠标移动到一些不该可以输入的地方,他也会出现闪动的输入光标
    就比如当前帖子页,我点击自己的用户名他就会出入输入国标
    列表页放回复人数那个 tag 上面,它也是可输入光标
    v2ex 也是,还经常卡死,或者列表页某几个帖子无法点击

    我改用 edge 打开又没有这个问题,最佳 chrome 也没有新装插件
    不知道你们有没有这个问题,我不确定是 chrome 的 BUG,还是我电脑中了什么病毒了

    使用Docker安装Temporal, 使用外部MySQL数据库

    1. 初始化MySQL数据库

    # 创建用户 temporal
    CREATE USER 'temporal'@'%' IDENTIFIED BY 'temporal';
    
    # 创建数据库 temporal
    CREATE DATABASE `temporal` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;
    grant all privileges on `temporal`.* TO 'temporal'@'%';
    
    # 创建数据库 temporal_visibility
    CREATE DATABASE `temporal_visibility` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;
    grant all privileges on `temporal_visibility`.* TO 'temporal'@'%';

    2. 配置文件

    docker-compose.yml

    services:
      temporal-init:
        image: temporalio/auto-setup:1.29.3
        container_name: temporal_init
        environment:
          DB: mysql8
          # 改为正确MySQL配置
          MYSQL_SEEDS: "192.168.2.215"
          DB_PORT: 3306
          MYSQL_USER: "temporal"
          MYSQL_PWD: "temporal"
          MYSQL_DB: "temporal"
          DEFAULT_NAMESPACE: "default"
        command: ["temporal-sql-tool", "create-schema", "-k", "default", "-v", "1.19"]
        restart: "no"
        
      temporal:
        image: temporalio/auto-setup:1.29.3
        container_name: temporal_server
        environment:
          # 使用外部 MySQL
          DB: mysql8
          MYSQL_SEEDS: "192.168.2.215"    # 你的 MySQL 地址
          DB_PORT: 3306
          MYSQL_USER: "temporal"
          MYSQL_PWD: "temporal"
          MYSQL_DB: "temporal"                 # Temporal 数据库
          DEFAULT_NAMESPACE: "default"
          # 这里填127.0.0.1会报错, 需要在ports将7233端口映射到宿主机, 填写宿主机的IP
          TEMPORAL_BROADCAST_ADDRESS: "192.168.2.215"
        ports:
          - "7233:7233"   # gRPC frontend
          - "7234:7234"   # history
          - "7235:7235"   # matching
          - "7239:7239"   # worker
          - "8088:8088"   # Temporal Web API (可选)
        depends_on:
          - temporal-init
        restart: always
    
      temporal-ui:
        image: temporalio/ui:2.45.0
        container_name: temporal_ui
        environment:
          TEMPORAL_ADDRESS: "temporal:7233"  # 指向 Temporal Server 容器名
          TEMPORAL_UI_PORT: "8080"
        ports:
          - "8080:8080"   # 浏览器访问
        depends_on:
          - temporal
        restart: always

    temporal-init: 用于自动初始化数据
    temporal: 启动核心进程
    temporal-ui: 启动UI管理界面
    访问 http://192.168.2.215:8080/ 查看管理后台
    image.png

    3. 启动

    # 启动
    docker compose up -d
    # 查看日志
    docker logs --tail=100 -f temporal_server

    销毁命令:

    docker compose down
    docker container list

    千问 app 昨天崩了,从软件运营、活动营销角度来说肯定是预期非常好的。
    但是站在技术的角度说,这次活动就属于一场“高并发”事件,那这次算不算事故,技术部会不会承担责任。
    还是说之前有预设过这种情况,因为涉及到 ai 算力资源成本高,最优解就是大不了崩了,因为当天是高并发,后面人流量就分散了,也不会有这种事件发生。


    突发奇想:像这类并发,目前技术除了堆配置,有没有其他的优化手段。