From 69ea67e56a8f73a8de508f7f981d720ebfbb909c Mon Sep 17 00:00:00 2001 From: xeonds Date: Sun, 7 Apr 2024 10:25:53 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20web=20from=20=20@=20276c3394eb?= =?UTF-8?q?71bf81c10834226e49675dd0642444=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db.json b/db.json index ea77d8f0..0f8722fb 100644 --- a/db.json +++ b/db.json @@ -1 +1 @@ -{"version":1,"author":[{"name":"神社的储物间","email":"","uri":"https://mxts.jiujiuer.xyz/","description":"*节操消失了*","article":[{"title":"API压测笔记","time":"2024-03-18T14:41:07Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003eAPI的压力测试是业务上线前的重要环节,也是对系统性能的一个量化测量,对实际业务诸方面都有重要的参考价值。\u003c/p\u003e\u003cp\u003e这里主要说说API压测的方法和常用手段。\u003c/p\u003e\u003ch2 id=\"压测方法\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/03/18/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/API%E5%8E%8B%E6%B5%8B%E7%AC%94%E8%AE%B0/#%E5%8E%8B%E6%B5%8B%E6%96%B9%E6%B3%95\" class=\"headerlink\" title=\"压测方法\"\u003e\u003c/a\u003e压测方法\u003c/h2\u003e\u003cul\u003e\u003cli\u003ego benchmark\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e如果是golang后端,可以直接手写测试用例,然后使用go工具链自带的benchmark进行压测。\u003c/p\u003e\u003cul\u003e\u003cli\u003eApacheBench\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。\u003c/p\u003e\u003cp\u003e安装\u003ccode\u003eapache2-utils\u003c/code\u003e即可在系统上使用\u003ccode\u003eab\u003c/code\u003e命令。\u003c/p\u003e\u003cp\u003e作为演示,使用ab测试一个GET接口:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eab -n 2000 -c 1200 \u003cspan class=\"string\"\u003e\u0026#34;http://127.0.0.1:9999/get_result?a=10\u0026amp;b=20\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003en: 测试轮次\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003ec: 客户端数量\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003eT: 内容类型\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003ep: 包含post参数的文件\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e引号是必须的\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003ewrk\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e一个C编写的API压测工具\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003ewrk -t10 -c100 -d10s http://localhost:8080/api/users \u003cspan class=\"comment\"\u003e# 使用10个线程,100并发数,测试持续10s\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"开测\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/03/18/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/API%E5%8E%8B%E6%B5%8B%E7%AC%94%E8%AE%B0/#%E5%BC%80%E6%B5%8B\" class=\"headerlink\" title=\"开测\"\u003e\u003c/a\u003e开测\u003c/h2\u003e\u003cp\u003e我最后还是选了\u003ccode\u003ewrk\u003c/code\u003e做压测\u003cdel\u003e因为ab装不上\u003c/del\u003e\u003c/p\u003e\u003cp\u003e测试接口是\u003ccode\u003ePOST http://localhost:8080/api/calc/mul\u003c/code\u003e,payload是一个2*n的json格式的二维数组。\u003c/p\u003e\u003cp\u003e测试指令:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003ewrk -t 20 -c 10000 -d 180s -s bench.lua --latency \u003cspan class=\"string\"\u003e\u0026#34;http://localhost:8080/api/calc/mul\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e## bench.lua\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewrk.method = \u003cspan class=\"string\"\u003e\u0026#34;POST\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewrk.body = \u003cspan class=\"string\"\u003e\u0026#34;[[1,2,3,1],[4,5,7,8]]\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewrk.headers[\u003cspan class=\"string\"\u003e\u0026#39;Content-Type\u0026#39;\u003c/span\u003e] = \u003cspan class=\"string\"\u003e\u0026#34;application/json\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e测试结果如下:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003exeonds@ark-station:~/code/vec-calculator-server$ make bench \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e build \u0026amp;\u0026amp; ./vec-calc-web-linux-amd64-1.0.0 \u0026amp; \u003cspan class=\"built_in\"\u003esleep\u003c/span\u003e 1 \u0026amp;\u0026amp; \\\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewrk -t 20 -c 10000 -d 180s -s bench.lua --latency \u003cspan class=\"string\"\u003e\u0026#34;http://localhost:8080/api/calc/mul\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eRunning 3m \u003cspan class=\"built_in\"\u003etest\u003c/span\u003e @ http://localhost:8080/api/calc/mul\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 20 threads and 10000 connections\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Thread Stats Avg Stdev Max +/- Stdev\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Latency 61.27ms 62.15ms 1.46s 93.06%\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Req/Sec 9.74k 1.33k 22.11k 71.75%\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Latency Distribution\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 50% 48.47ms\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 75% 66.32ms\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 90% 90.10ms\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 99% 364.05ms\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 34884275 requests \u003cspan class=\"keyword\"\u003ein\u003c/span\u003e 3.00m, 4.35GB \u003cspan class=\"built_in\"\u003eread\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eRequests/sec: 193693.29\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTransfer/sec: 24.75MB\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e测试平台是\u003ccode\u003eIntel Core i7-12700H\u003c/code\u003e,可以看到并发在\u003ccode\u003e1,0000\u003c/code\u003e的时候,Gin的性能还是不错的,TPS保持在了19万的水准。\u003c/p\u003e\u003ch2 id=\"碎碎念\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/03/18/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/API%E5%8E%8B%E6%B5%8B%E7%AC%94%E8%AE%B0/#%E7%A2%8E%E7%A2%8E%E5%BF%B5\" class=\"headerlink\" title=\"碎碎念\"\u003e\u003c/a\u003e碎碎念\u003c/h2\u003e\u003cp\u003e该说不该说呢,以前我认为语言就是由语法和编译器/解释器构成,但是Golang这样从语法上支持一个feature的行为让我疑惑:语言的标准库该不该算是语言特性的一部分?\u003c/p\u003e\u003cp\u003e\u003ccode\u003ego\u003c/code\u003e这个关键字作为一个大大的语法糖,似乎在打破语言的库和语言本身的分界线。我也无从知晓这一方向的尽头是什么。\u003c/p\u003e\u003ch2 id=\"Reference\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/03/18/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/API%E5%8E%8B%E6%B5%8B%E7%AC%94%E8%AE%B0/#Reference\" class=\"headerlink\" title=\"Reference\"\u003e\u003c/a\u003eReference\u003c/h2\u003e\u003cul\u003e\u003cli\u003e\u003ca href=\"https://zhuanlan.zhihu.com/p/609348456\"\u003eAPI性能测试指标以及压测方式 - 最难不过二叉树 - 知乎\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://golang.cx/go/golang%E5%8E%8B%E6%B5%8B.html\"\u003egolang压测\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://www.digitalocean.com/community/tutorials/how-to-benchmark-http-latency-with-wrk-on-ubuntu-14-04\"\u003eHow To Benchmark HTTP Latency with wrk on Ubuntu 14.04 - DigitalOcean\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://stackoverflow.com/questions/15261612/post-request-with-wrk\"\u003ePOST request with wrk? - StackOverflow\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/issues/267\"\u003eCan I disable gin’s stdout? - GitHub Issue\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2024/03/18/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/API%E5%8E%8B%E6%B5%8B%E7%AC%94%E8%AE%B0/"},{"title":"青岛之行","time":"2024-01-18T05:53:51Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"第0天-西安市长安区\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/18/%E6%96%87%E5%AD%A6/%E6%B8%B8%E8%AE%B0/trip-to-tsingdao/#%E7%AC%AC0%E5%A4%A9-%E8%A5%BF%E5%AE%89%E5%B8%82%E9%95%BF%E5%AE%89%E5%8C%BA\" class=\"headerlink\" title=\"第0天-西安市长安区\"\u003e\u003c/a\u003e第0天-西安市长安区\u003c/h2\u003e\u003cp\u003e这个考试月是真能破人的防,所以哥们考完试直接开润,好好抚慰以一下难绷的心智。跟哥们合计了一下,寻思着\u003cdel\u003e去码头整点薯条\u003c/del\u003e然后就有了去青岛溜达一圈的打算。\u003c/p\u003e\u003cp\u003e现在是1.18,早上随便叼个面包,拉着箱子就走了。今天早上西安的雾气挺大的,走的时候大概9点,门口不少拉箱子回家的大学生,看了一眼感觉不少大三老东西,还有一些大一大二一看就没在校门口坐过公交的。\u003c/p\u003e\u003cp\u003e时间过得真快啊,还没多久就只剩一年半了。\u003c/p\u003e\u003cp\u003e抛开有的没的,到站下车转地铁,6倒2到北站等火车。以及再次,西安北站真tm大。\u003c/p\u003e\u003cp\u003e顺利和彦汇合上,俩人就坐下来开始侃大山,路上风景倒是不错。刚开始计划的路线里边是经过郑州的,不过后来换了D1672然后就不走那边了,现在的路线是西安-\u0026gt;太原-\u0026gt;石家庄-\u0026gt;德州-\u0026gt;济南-\u0026gt;青岛。全程从11点到晚上9点,车程比较长。\u003c/p\u003e\u003cp\u003e在动车上跟哥们干了各种事消磨时间:看时间,聊二次元等等等等,\u003cdel\u003e听得我都想入坑ba了\u003c/del\u003e。\u003c/p\u003e\u003cp\u003e下了车之后直接进了地铁站,七拐八拐到了酒店。这边地铁修的比较新,所以装潢还挺新的。\u003c/p\u003e\u003cp\u003e出了站之后走了点路就到了酒店。俩人一进酒店就开始开香槟,30块一晚上是这住宿条件:\u003c/p\u003e\u003cp\u003e更香槟开爆的一集:30多跟哥们恰烧烤外卖恰到撑。老陕震撼.jpg,这边伙食是真不戳。\u003c/p\u003e\u003cp\u003e就是晚上1点多给另一个哥们写代码到早上3点有点难绷\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e彦:熬夜别似我旁边\u003cbr/\u003e我:无所谓我收入高\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"第1天-青岛海军博物馆-amp-杂七杂八\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/18/%E6%96%87%E5%AD%A6/%E6%B8%B8%E8%AE%B0/trip-to-tsingdao/#%E7%AC%AC1%E5%A4%A9-%E9%9D%92%E5%B2%9B%E6%B5%B7%E5%86%9B%E5%8D%9A%E7%89%A9%E9%A6%86-amp-%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB\" class=\"headerlink\" title=\"第1天-青岛海军博物馆\u0026amp;杂七杂八\"\u003e\u003c/a\u003e第1天-青岛海军博物馆\u0026amp;杂七杂八\u003c/h2\u003e\u003cp\u003e第二天\u003cdel\u003e起了个大早\u003c/del\u003e九点准时起床,身体好像已经习惯六小时睡眠了。简单收拾之后就准备出发去看看船了。放6年前彦估计更兴奋,毕竟他玩碧蓝航线。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e哎,泛二刺螈。哦,他现在玩Blue Archive。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e笑死,早起根本没用。俩人还是差点迟了。最骚的操作是我们发现时间可能赶不上然后俩啥必退票准备换时间,然后发现别的时间都满了。\u003c/p\u003e\u003cp\u003etmd吓个半死,赶紧给重新定回那个时间。俩人跟俩萝卜一样,一人一个坑给剩下俩位置占满了。\u003c/p\u003e\u003cp\u003e不管时间是不是来不及,俩人开始往过疯狂冲刺。趁着上车的间隙,算了一下时间,刚好剩了3分钟,所幸最后没迟到。\u003c/p\u003e\u003cp\u003e路上路过一片小区,人建筑风格特别欧式,一度以为是殖民地残留,被哥们吐槽了。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e彦:你这得让青岛人笑话死\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e赶时间所以没想到啥吐槽。穿过博物馆大厅,从扶梯下去,就是海边了。大厅后边就是黄海的海岸线了,码头停了不少待参观的船,潜艇,还有\u003cdel\u003e来码头整点薯条的\u003c/del\u003e海鸥,不过这会的我显然还没有意识到青岛的海风自带湿冷的魔法攻击。\u003c/p\u003e\u003cp\u003e没顾得上拍照,赶紧跟着哥们跑去核潜艇参观区域。俩人兴冲冲跟着引导员走到潜艇入口,准备从入口进去。不过刚进去入口的时候我就觉得不对劲了:被狠狠磕了一下脑袋。然后我才注意到,这潜艇里边的环境是真tm狭小。里边是不允许拍照的,所以这部分没有图图。很震撼,有种纯粹工业风的美感,而且还能看到生产日期跟自己爸妈一个年龄的各种粗扩庞大\u003cdel\u003e不知道能干啥\u003c/del\u003e不可名状的巨大机械/管道,元素相当丰富。整体而言,环境相当压抑。居住区空间极小,而且是两层乃至三层的卧铺,躺床上只能看到压抑的上铺床板。更离谱的是,各个区域之间的连通通道不是门结构,而是环状圆盘盖子结构。想了半天,原因可能是为了进一步保证气密/作为一种空间隔断手段而使用,以至于人过去是要钻过去的——我自己身高1米8多,已经不是脑袋磕的疼不疼的问题了,那是我弯腰过去会被卡在门上的问题。不过也能理解,毕竟从外边看体积本来就小,里边的空间更是寸土寸金。另外还看到唯一一个很大的房子,俺猜测应该是船长/政委的?另外就是这个核动力潜艇很明显属于那种过于落后可以展示的那种,现在的潜艇长啥样子我根本不敢想象。以及这玩意的制造时间也跟我印象里边那会还在为造拖拉机发愁的轻工业为主的年代严重不符——现在回望那会的前辈,相当厉害。快60年前的东西,都能带给我如此巨大的震撼。这种旧时代的堪称疯狂的造物是我非常喜爱的,因为这背后是一个集体倾尽全力所能创造的工程学奇迹。其他宏伟的古早人工造物,比如早些时代的防空洞,那些旧时代的大型工厂,都是我的偏爱。\u003c/p\u003e\u003cp\u003e就是里边一些现代化电子设备比较出戏。我甚至还看到一个生产日期挺新的电风扇。\u003c/p\u003e\u003cp\u003e另外一点我想展开说的就是,重工业风。生活中很难见到特别粗的管道,这边有,而且尺寸范围相当大。但是你放工厂我会欣赏,放正常过道两边甚至头顶,盖得你看不到一个平整的仓壁,那就是幽闭恐惧症级别的地狱绘图了。墙上和地上,不是覆盖着,那几乎是管道和数量巨大的阀门、仪表拼接而成,被挤压的只剩下常人几乎不可能迅速通过的极度不规则的逼仄空间。另外我找了半天愣是没找到一个窗户,在这种暗无天日的地方关上不知道多久,一般人在这种地方肯定会疯。而且,潜艇的战略地位,也昭示着潜艇兵的命运:不存在侥幸,深海出故障的情况下,只有死亡这一既定而缓慢但恒定到来的命运。现代核潜艇更是战略级别的威慑,他们所面对的任何一种情况都是极度恐怖的。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e彦:这地方你待上没几天就幽闭恐惧症了\u003cbr/\u003e我:难怪人补贴空军之下第一档呢,这我是真服\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e最逆天的地方来了。俩人参观完核动力部分,在看主电机的时候,里边照明电路突然断电了。以潜艇的封闭程度,一瞬间里边就陷入一片死黑。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e我:啊?\u003cbr/\u003e彦:啊??\u003cbr/\u003e我:啊???\u003cbr/\u003e彦:啊????\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e所幸,大概十几秒后供电又恢复力。不过这一段时间对我来说长如极夜。那一刻俩啥必都以为自己要被关里头了,怂的跟受惊的兔子似的。应该是拉闸老大爷听到我俩动静了,又上电问里边有人没。俩人赶紧从出口窜出去了。\u003c/p\u003e\u003cp\u003e最哈人的一集。\u003c/p\u003e\u003cp\u003e出去之后俩人缓了会,然后上旁边开始今天的观景了。\u003c/p\u003e\u003cp\u003e首先是济南舰,最后是长江舰。中间回去休息了一下,看到底下一架遮住的飞机,还惊喜了半天。彦不屑一顾,我诧异半天才想起来人是瓜,啊不,三航爷。\u003c/p\u003e\u003cp\u003e下午拍了一组片子,顺便跟他玩了玩胶片机之后,俩人就出来去信号山旁边一个小地方恰了饭。28一份的土豆牛肉盖饭,好贵……不过胜在离景点近。可惜的是那会德国监狱旧址已经关门了,俩人就去爬旁边信号山了。有一说一,上边视野不错,也出了不少很满意的片。\u003c/p\u003e\u003cp\u003e最给力的是这俩老鸽:\u003c/p\u003e\u003cp\u003e亮灯之后拍了不少,遗憾的是树杈子太挡视野了,不太好出片。以及某人痛定思痛决定回头整个脚架。不过那边有不少望远镜,挺稳的,就是要扫码才能用。所以俩人直接用这玩意当脚架平替了。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e彦:纯,太纯了(陶醉\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e之后俩人坐地铁打算去那家甜甜烧烤,可惜让百度地图坑了一回,从台北街道绕了一圈到人旧址了。找到之后发现人就在起点附近。更离谱的是进去只有一个空座,上二楼发现没位置结果下来一楼也满了。红温了.jpg\u003c/p\u003e\u003cp\u003e没办法,刚好也晚了,在旁边步行街吃了点小吃,坐地铁回宾馆旁边那家烧烤。线上挺好吃的,线下也可以,不过人店面似乎主营是外卖。但是实惠和味道上没让我失望,啤酒上没让我哥们失望。\u003c/p\u003e\u003cp\u003e干完饭,回酒店睡觉。替哥们负重前行了一天,倒头就睡。\u003c/p\u003e\u003ch2 id=\"第2天-麦岛,栈桥,海鸥和薯条,以及代码\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/18/%E6%96%87%E5%AD%A6/%E6%B8%B8%E8%AE%B0/trip-to-tsingdao/#%E7%AC%AC2%E5%A4%A9-%E9%BA%A6%E5%B2%9B%EF%BC%8C%E6%A0%88%E6%A1%A5%EF%BC%8C%E6%B5%B7%E9%B8%A5%E5%92%8C%E8%96%AF%E6%9D%A1%EF%BC%8C%E4%BB%A5%E5%8F%8A%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"第2天-麦岛,栈桥,海鸥和薯条,以及代码\"\u003e\u003c/a\u003e第2天-麦岛,栈桥,海鸥和薯条,以及代码\u003c/h2\u003e\u003cp\u003e早上看天气预报,这边要下雪,感觉今天天气可能会有点糟……不过好在出去之后倒是没雪。这边天气这几天是冷锋过境,属于是变天如变脸的程度。\u003c/p\u003e\u003cp\u003e这一天睡到了自然醒。\u003cdel\u003e早上\u003c/del\u003e中午步行麦岛,被海风吹傻了。不过出片很多。早上一早上在宾馆写代码……至于为啥,合作项目快到ddl了。不过好在早上没出去,风大的虾仁。午饭是张亮麻辣烫和古茗,味道确实可以就是挺贵。\u003c/p\u003e\u003cp\u003e2点到麦岛,吹海风到3,4点。打车去栈桥\u003cdel\u003e捉\u003c/del\u003e喂了半天海鸥,哥们的Z50直接ISO爆炸了。6点左右俩人走着上了栈桥溜了个来回,海中间的亭子,别有景致。\u003c/p\u003e\u003cp\u003e步行到教堂,哥特式建筑美感别具一格,感觉薄纱半道的安妮小屋。另,青岛的地名好像真是按照全国省份起名的。\u003c/p\u003e\u003cp\u003e拐下去,在K和M的中门对决中选了M。\u003c/p\u003e\u003cp\u003e然后是1号线,体验了一把6分钟跨海,可惜啥都看不到,就是噪音特大。\u003c/p\u003e\u003cp\u003e看了中石油大学。石油的爷才是爷!\u003c/p\u003e\u003cp\u003e然后1号线回台东,路上为了我和另一个哥们的ddl疯狂写代码。居然在手机上搞定了。他也从他导师的侧目微笑里边解脱了。这期间哥们\u003cdel\u003e遛\u003c/del\u003e牵着我逛了这边一个步行街,规模意外的不太大。尝了下青岛啤酒原浆,苦的,喝不懂。给哥们解决了。\u003c/p\u003e\u003cp\u003e俩人开始乱逛,跑奥体对面五四广场乱逛听涛。\u003c/p\u003e\u003cp\u003e打车回宾馆了。洗漱+计划了下行程:济南/淄博,启动!\u003c/p\u003e\u003cp\u003e算了先别启动了,睡觉了。\u003c/p\u003e\u003ch2 id=\"第3天-海鸽子鸥,栈桥,小鱼山,德国领事馆旧址,以及夕阳\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/18/%E6%96%87%E5%AD%A6/%E6%B8%B8%E8%AE%B0/trip-to-tsingdao/#%E7%AC%AC3%E5%A4%A9-%E6%B5%B7%E9%B8%BD%E5%AD%90%E9%B8%A5%EF%BC%8C%E6%A0%88%E6%A1%A5%EF%BC%8C%E5%B0%8F%E9%B1%BC%E5%B1%B1%EF%BC%8C%E5%BE%B7%E5%9B%BD%E9%A2%86%E4%BA%8B%E9%A6%86%E6%97%A7%E5%9D%80%EF%BC%8C%E4%BB%A5%E5%8F%8A%E5%A4%95%E9%98%B3\" class=\"headerlink\" title=\"第3天-海鸽子鸥,栈桥,小鱼山,德国领事馆旧址,以及夕阳\"\u003e\u003c/a\u003e第3天-海\u003cdel\u003e鸽子\u003c/del\u003e鸥,栈桥,小鱼山,德国领事馆旧址,以及夕阳\u003c/h2\u003e\u003cp\u003e这回来青岛最大的成就,就是薅到了\u003cdel\u003e海鸽子\u003c/del\u003e海鸥。昨天\u003c/p\u003e\u003ch2 id=\"第4天-青岛:最澄澈的空与海·太美丽了淄博\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/18/%E6%96%87%E5%AD%A6/%E6%B8%B8%E8%AE%B0/trip-to-tsingdao/#%E7%AC%AC4%E5%A4%A9-%E9%9D%92%E5%B2%9B%EF%BC%9A%E6%9C%80%E6%BE%84%E6%BE%88%E7%9A%84%E7%A9%BA%E4%B8%8E%E6%B5%B7%C2%B7%E5%A4%AA%E7%BE%8E%E4%B8%BD%E4%BA%86%E6%B7%84%E5%8D%9A\" class=\"headerlink\" title=\"第4天-青岛:最澄澈的空与海·太美丽了淄博\"\u003e\u003c/a\u003e第4天-青岛:最澄澈的空与海·太美丽了淄博\u003c/h2\u003e\u003ch2 id=\"第5天-济南-老舍你最好没骗我\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/18/%E6%96%87%E5%AD%A6/%E6%B8%B8%E8%AE%B0/trip-to-tsingdao/#%E7%AC%AC5%E5%A4%A9-%E6%B5%8E%E5%8D%97-%E8%80%81%E8%88%8D%E4%BD%A0%E6%9C%80%E5%A5%BD%E6%B2%A1%E9%AA%97%E6%88%91\" class=\"headerlink\" title=\"第5天-济南-老舍你最好没骗我\"\u003e\u003c/a\u003e第5天-济南-老舍你最好没骗我\u003c/h2\u003e\u003cp\u003emd,跟老舍爆了,俩人冻的要似。\u003c/p\u003e\u003cp\u003e早上9点坐高铁到济南。10点多坐地铁到了宾馆。彦已经困的不行了,遂让他睡了一觉。这酒店条件确实不错,还有厨房。\u003c/p\u003e\u003cp\u003e另外就是济南这边地铁起码是从19年开始修的,这地方东边倒是还行,西边地铁修建难度简直地狱。地下各种复杂的地下水源,断层等等,能有地铁已经很不错了。能看得出来,济南地铁修的很新,而且也符合济南这边的特色:空间辽阔。\u003c/p\u003e\u003cp\u003e中午出发,先去旁边商超里边吃了一顿午饭。好久没吃米饭,俩人就恰了家石锅拌饭。\u003c/p\u003e\u003cp\u003e完事之后,我提出想去浪潮集团总部看看打个卡。毕竟在你电浪潮社也待了三年了,不太远(感觉比国医到你电西门的距离近一些),俩人就走过去了。\u003c/p\u003e\u003cp\u003e另外就是济南地铁\u003c/p\u003e\u003ch2 id=\"第6天-返航-最背刺的一集\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/18/%E6%96%87%E5%AD%A6/%E6%B8%B8%E8%AE%B0/trip-to-tsingdao/#%E7%AC%AC6%E5%A4%A9-%E8%BF%94%E8%88%AA-%E6%9C%80%E8%83%8C%E5%88%BA%E7%9A%84%E4%B8%80%E9%9B%86\" class=\"headerlink\" title=\"第6天-返航-最背刺的一集\"\u003e\u003c/a\u003e第6天-返航-最背刺的一集\u003c/h2\u003e\u003cp\u003e早上早早起来,洗漱了下,俩人出门进地铁站。济南这边地铁修的相当新,虽然条形地铁线路比较难换乘,但是有地铁这一点已经薄纱某些地方了,而且还是直达济南东站的。赢!\u003c/p\u003e\u003cp\u003e最难绷的一集:俩人买票那会发现难买,进站发现人一大群小学生搁那去西安旅游……算是彻底被背刺了。\u003c/p\u003e\u003cp\u003e路上太原开始这段雪景很绝。白色的斑驳成片覆盖在黄色的平原上,在纯蓝天的映射下格外让人有食欲。\u003c/p\u003e\u003cp\u003e遂恰饭点了一顿15元高铁套餐。评价是感觉不如…海棠一楼食堂,但是好tm贵QAQ。\u003c/p\u003e\u003cp\u003e彦这作息跟那啥考拉一样(哎对\u003cdel\u003e配色\u003c/del\u003e穿搭也差不多)又开始睡了。\u003c/p\u003e\u003cp\u003e路上边看地图边看风景……注意到前边过黄河了,俩人扒窗边看了会,发现了最符合天气的一集:黄河整个冻住了。不过就算是冻住了风光也很不错。\u003c/p\u003e\u003cp\u003e另外就是山西太原附近了,风光很有意思,很多谷地,覆上雪景后别有风味。\u003c/p\u003e\u003cp\u003e路上还路过了香汾,小站没太在意。感知最明显的就是天空从山东沿海地区的澄澈逐渐过渡到熟悉的灰蒙蒙的天空——当然风也小了许多。\u003c/p\u003e\u003cp\u003e西安站倒是下去溜达了一圈,气候温和多了。就是听到一点疑似关门的动静后赶紧钻回去车里边了。车门旁边倒是还有人趁着到站抽烟的,人家就比我淡定多了。\u003c/p\u003e\u003cp\u003e之后不久就到站了。温度比沿海地区温和了很多,饱受折磨的俩人一下子放松下来:\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e彦:这温度谁拉拉链啊\u003cbr/\u003e:笑死,根本不冷\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e不过最后某人还是把拉链拉上了。\u003c/p\u003e\u003cp\u003e俩人混的不错,摇到一个同学开车给我俩接回去了。回去之前几个人一块来搓了一顿\u003cdel\u003emai\u003c/del\u003e麦,已经是穷鬼的我必然是点了一份穷鬼套餐,顺便聊了不少时政\u003cdel\u003e不是怎么每回的保留环节都是政治乐子啊\u003c/del\u003e。另外,宝鸡夜色某种意义上比大明湖强。\u003c/p\u003e\u003chr/\u003e\u003cp\u003e坐着同学的车到了家门口,提下箱子,关门,隔着车门和彦挥了挥手\u003c/p\u003e\u003cp\u003e转身,离去。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2024/01/18/%E6%96%87%E5%AD%A6/%E6%B8%B8%E8%AE%B0/trip-to-tsingdao/"},{"title":"数据库复习笔记","time":"2024-01-15T11:17:19Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e这学期学的数据库主要偏向应用,理论部分相对比较少,重点如下:\u003c/p\u003e\u003ch2 id=\"数据库系统概论-大纲\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/#%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA-%E5%A4%A7%E7%BA%B2\" class=\"headerlink\" title=\"数据库系统概论 大纲\"\u003e\u003c/a\u003e数据库系统概论 大纲\u003c/h2\u003e\u003cul\u003e\u003cli\u003e绪论\u003cul\u003e\u003cli\u003e特点,概念,发展\u003c/li\u003e\u003cli\u003e数据模型:层次,网状,关系\u003c/li\u003e\u003cli\u003e结构:三级模式,二级映像\u003c/li\u003e\u003cli\u003e组成\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e关系数据库\u003cul\u003e\u003cli\u003e关系数据结构\u003c/li\u003e\u003cli\u003e关系操作!\u003c/li\u003e\u003cli\u003e关系完整性:实体完整性,参照完整性,用户定义的完整性\u003c/li\u003e\u003cli\u003e关系代数!\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eSQL\u003cul\u003e\u003cli\u003e定义{模式,表,索引,数据字典} \u003c/li\u003e\u003cli\u003e查询:单表,连接,嵌套,集合,派生表\u003c/li\u003e\u003cli\u003e更新:插入,修改,删除\u003c/li\u003e\u003cli\u003e空值,试图\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e安全性\u003cul\u003e\u003cli\u003e安全性控制:用户身份控制,存取控制,自主存取控制,授权/收回,抢注存取控制方法\u003c/li\u003e\u003cli\u003e视图 - 审计 - 数据加密\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e数据库完整性\u003cul\u003e\u003cli\u003e实体完整性,参照完整性,用户定义的完整性\u003c/li\u003e\u003cli\u003e完整性约束命名子句\u003c/li\u003e\u003cli\u003e断言\u003c/li\u003e\u003cli\u003e触发器\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e关系数据理论\u003cul\u003e\u003cli\u003e规范化\u003cul\u003e\u003cli\u003e函数依赖 - 码 - 范式 - 2NF - 3NF - BCNF - 多值依赖和4NF\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e数据依赖的公理系统 - 模式分解\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e数据库设计\u003cul\u003e\u003cli\u003e数据字典\u003c/li\u003e\u003cli\u003e概念模型\u003c/li\u003e\u003cli\u003eE-R模型及其扩充\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e数据库编程\u003cul\u003e\u003cli\u003e嵌入式SQL:处理过程,通信(游标,动态SQL)\u003c/li\u003e\u003cli\u003e过程化SQL\u003c/li\u003e\u003cli\u003e存储过程和函数\u003c/li\u003e\u003cli\u003eODBC编程\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e关系查询处理和查询优化\u003cul\u003e\u003cli\u003e查询处理步骤,优化\u003c/li\u003e\u003cli\u003e代数优化,物理优化\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e数据库恢复技术\u003cul\u003e\u003cli\u003e事务概念和特点 - 恢复概述 - 故障种类,恢复技术和策略\u003c/li\u003e\u003cli\u003e并发控制\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e整理的不是特别全乎,不过也涵盖不少了。往年大题就那几道,题型相对固定,针对性做题,做会题就算复习完了。\u003c/p\u003e\u003cp\u003e上面的知识点里边特别重要的就那几个:\u003cstrong\u003e关系代数,关系完整性,SQL,关系数据理论和事务与并发,查询优化\u003c/strong\u003e这几个。其他零碎的小知识点有印象就行了。\u003c/p\u003e\u003cp\u003e复习方法一是做题,最好是看答案;二是看例子,例题,然后递归复习知识点,效率最高。三是下策,先看知识点,再做题,适合开始复习比较早,时间充裕的情况,也是最充分的复习,但是问题是容易动力不足。\u003c/p\u003e\u003ch2 id=\"SQL\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/#SQL\" class=\"headerlink\" title=\"SQL\"\u003e\u003c/a\u003eSQL\u003c/h2\u003e\u003ch3 id=\"CREATE-DROP-ALTER\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/#CREATE-DROP-ALTER\" class=\"headerlink\" title=\"CREATE,DROP,ALTER\"\u003e\u003c/a\u003eCREATE,DROP,ALTER\u003c/h3\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eCREATE\u003c/span\u003e SCHEMA \u003cspan class=\"operator\"\u003e\u0026lt;\u003c/span\u003e\u0026#34;name\u0026#34;\u003cspan class=\"operator\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"keyword\"\u003eAUTHORIZATION\u003c/span\u003e \u0026#34;username\u0026#34;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eDROP\u003c/span\u003e SCHEMA \u0026#34;name\u0026#34; [CASCADE\u003cspan class=\"operator\"\u003e/\u003c/span\u003eRESTRICT];\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"keyword\"\u003eTABLE\u003c/span\u003e \u0026#34;name\u0026#34;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e{ Col1 \u003cspan class=\"type\"\u003eVARCHAR\u003c/span\u003e(\u003cspan class=\"number\"\u003e10\u003c/span\u003e) \u003cspan class=\"keyword\"\u003ePRIMARY\u003c/span\u003e KEY,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Col2 NUMBER(\u003cspan class=\"number\"\u003e10\u003c/span\u003e) \u003cspan class=\"keyword\"\u003eNOT\u003c/span\u003e \u003cspan class=\"keyword\"\u003eNULL\u003c/span\u003e \u003cspan class=\"keyword\"\u003eUNIQUE\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Col3 \u003cspan class=\"type\"\u003eINT\u003c/span\u003e \u003cspan class=\"keyword\"\u003eFOREIGN\u003c/span\u003e KEY(Sno) \u003cspan class=\"keyword\"\u003eREFERENCES\u003c/span\u003e TABLE2(Sno),\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eCHECK\u003c/span\u003e(Col1 \u003cspan class=\"operator\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"number\"\u003e1\u003c/span\u003e \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e Col1 \u003cspan class=\"operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"number\"\u003e10\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e};\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"keyword\"\u003eTABLE\u003c/span\u003e schema.tablename{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"operator\"\u003e/\u003c/span\u003e\u003cspan class=\"operator\"\u003e/\u003c/span\u003e 同上\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e};\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eCREATE\u003c/span\u003e SCHEMA \u0026#34;name\u0026#34; \u003cspan class=\"keyword\"\u003eAUTHORIZATION\u003c/span\u003e \u0026#34;user\u0026#34; \u003cspan class=\"keyword\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"keyword\"\u003eTABLE\u003c/span\u003e \u0026#34;table1\u0026#34;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"operator\"\u003e/\u003c/span\u003e\u003cspan class=\"operator\"\u003e/\u003c/span\u003e 同上\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e};\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eALTER\u003c/span\u003e \u003cspan class=\"keyword\"\u003eTABLE\u003c/span\u003e \u0026#34;name\u0026#34; [\u003cspan class=\"keyword\"\u003eADD\u003c/span\u003e \u003cspan class=\"keyword\"\u003eCOLUMN\u003c/span\u003e name \u003cspan class=\"type\"\u003eVARCHAR\u003c/span\u003e(\u003cspan class=\"number\"\u003e10\u003c/span\u003e) \u003cspan class=\"operator\"\u003e|\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eADD\u003c/span\u003e \u003cspan class=\"keyword\"\u003eUNIQUE\u003c/span\u003e(Cname) \u003cspan class=\"operator\"\u003e|\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eADD\u003c/span\u003e \u003cspan class=\"keyword\"\u003eFOREIGN\u003c/span\u003e KEY(Cno) \u003cspan class=\"keyword\"\u003eREFERENCES\u003c/span\u003e Student(Cno) \u003cspan class=\"operator\"\u003e|\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eDROP\u003c/span\u003e Col1 CASCADE\u003cspan class=\"operator\"\u003e|\u003c/span\u003eRESTRICT\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eDROP\u003c/span\u003e \u003cspan class=\"keyword\"\u003eCONSTRAINT\u003c/span\u003e “completeness” CASCADE\u003cspan class=\"operator\"\u003e|\u003c/span\u003eRESTRICT\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eALTER\u003c/span\u003e \u003cspan class=\"keyword\"\u003eCOLUMN\u003c/span\u003e Col1 \u003cspan class=\"type\"\u003eVARCHAR\u003c/span\u003e(\u003cspan class=\"number\"\u003e114514\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e];\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eDROP\u003c/span\u003e \u003cspan class=\"keyword\"\u003eTABLE\u003c/span\u003e \u0026#34;name\u0026#34; CASCADE\u003cspan class=\"operator\"\u003e|\u003c/span\u003eRESTRICT;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"INDEX\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/#INDEX\" class=\"headerlink\" title=\"INDEX\"\u003e\u003c/a\u003eINDEX\u003c/h3\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"keyword\"\u003eUNIQUE\u003c/span\u003e\u003cspan class=\"operator\"\u003e|\u003c/span\u003eCLUSTER INDEX \u0026#34;index_name\u0026#34; \u003cspan class=\"keyword\"\u003eON\u003c/span\u003e tableName(Col1 \u003cspan class=\"keyword\"\u003eDESC\u003c/span\u003e, Col2 \u003cspan class=\"keyword\"\u003eASC\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eALTER\u003c/span\u003e INDX \u0026#34;old_index\u0026#34; RENAME \u003cspan class=\"keyword\"\u003eTO\u003c/span\u003e \u0026#34;new_index\u0026#34;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eDROP\u003c/span\u003e INDEX \u0026#34;index_name\u0026#34;;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"SELECT\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/#SELECT\" class=\"headerlink\" title=\"SELECT\"\u003e\u003c/a\u003eSELECT\u003c/h3\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eSELECT\u003c/span\u003e [\u003cspan class=\"keyword\"\u003eDISTINCT\u003c/span\u003e\u003cspan class=\"operator\"\u003e|\u003c/span\u003e\u003cspan class=\"keyword\"\u003eALL\u003c/span\u003e] \u003cspan class=\"number\"\u003e2022\u003c/span\u003e\u003cspan class=\"operator\"\u003e-\u003c/span\u003etable1.age,table2.Sname\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eFROM\u003c/span\u003e [\u0026#34;table1\u0026#34; \u003cspan class=\"operator\"\u003e|\u003c/span\u003e \u0026#34;view1\u0026#34;]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eWHERE\u003c/span\u003e age\u003cspan class=\"operator\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"number\"\u003e5\u003c/span\u003e \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e\u003cspan class=\"operator\"\u003e|\u003c/span\u003e\u003cspan class=\"keyword\"\u003eOR\u003c/span\u003e age\u003cspan class=\"operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"number\"\u003e7\u003c/span\u003e \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e Sdept\u003cspan class=\"operator\"\u003e=\u003c/span\u003e\u003cspan class=\"string\"\u003e\u0026#39;CS\u0026#39;\u003c/span\u003e \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e age [\u003cspan class=\"keyword\"\u003eNOT\u003c/span\u003e] \u003cspan class=\"keyword\"\u003eBETWEEN\u003c/span\u003e \u003cspan class=\"number\"\u003e20\u003c/span\u003e \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e \u003cspan class=\"number\"\u003e30\u003c/span\u003e \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e Sdept \u003cspan class=\"keyword\"\u003eIN\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;CS\u0026#39;\u003c/span\u003e,\u003cspan class=\"string\"\u003e\u0026#39;MA\u0026#39;\u003c/span\u003e) \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e name \u003cspan class=\"keyword\"\u003eLIKE\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#39;张____\u0026#39;\u003c/span\u003e \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e GRADE \u003cspan class=\"keyword\"\u003eIS\u003c/span\u003e \u003cspan class=\"keyword\"\u003eNULL\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eGROUP\u003c/span\u003e \u003cspan class=\"keyword\"\u003eBY\u003c/span\u003e Col2 \u003cspan class=\"keyword\"\u003eHAVING\u003c/span\u003e \u003cspan class=\"built_in\"\u003eAVG\u003c/span\u003e(Grade)\u003cspan class=\"operator\"\u003e\u0026gt;=\u003c/span\u003e\u003cspan class=\"number\"\u003e90\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eORDER\u003c/span\u003e \u003cspan class=\"keyword\"\u003eBY\u003c/span\u003e Col1 \u003cspan class=\"keyword\"\u003eDESC\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e连接查询时,列举全部属性列,去掉相同的列就是自然连接。\u003c/p\u003e\u003cp\u003e单表连接查询:\u003c/p\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eFROM\u003c/span\u003e Course.FIRST, Course.SECOND\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eSELECT\u003c/span\u003e FIRST.Cno, SECOND.Cpno\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eWHERE\u003c/span\u003e FIRST.Cpno\u003cspan class=\"operator\"\u003e=\u003c/span\u003eSECOND.Cno;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"operator\"\u003e/\u003c/span\u003e\u003cspan class=\"operator\"\u003e/\u003c/span\u003e外连接查询\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eFROM\u003c/span\u003e table1 \u003cspan class=\"keyword\"\u003eLEFT\u003c/span\u003e\u003cspan class=\"operator\"\u003e|\u003c/span\u003e\u003cspan class=\"keyword\"\u003eRIGHT\u003c/span\u003e \u003cspan class=\"keyword\"\u003eOUTER\u003c/span\u003e \u003cspan class=\"keyword\"\u003eJOIN\u003c/span\u003e table2 \u003cspan class=\"keyword\"\u003eON\u003c/span\u003e\u003cspan class=\"operator\"\u003e|\u003c/span\u003e\u003cspan class=\"keyword\"\u003eUSING\u003c/span\u003e(table1.sno\u003cspan class=\"operator\"\u003e=\u003c/span\u003etable2.sno) \u003cspan class=\"operator\"\u003e/\u003c/span\u003e\u003cspan class=\"operator\"\u003e/\u003c/span\u003e \u003cspan class=\"keyword\"\u003eUSING\u003c/span\u003e去重\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e\u003ccode\u003e%_\u003c/code\u003e任意字符、一个字符,汉字\u003cstrong\u003e长两个字符\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e子查询使用\u003ccode\u003eIN\u003c/code\u003e关键字,阅读/构造时从内部构造。下面的例子相当于是将子查询的结果作为父查询的语句的参数了。\u003c/p\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eSELECT\u003c/span\u003e Sno, Sname, Sdept\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eFROM\u003c/span\u003e Student\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eWHERE\u003c/span\u003e Sdept \u003cspan class=\"keyword\"\u003eIN\u003c/span\u003e (\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eSELECT\u003c/span\u003e Sdept\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eFROM\u003c/span\u003e Student\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eWHERE\u003c/span\u003e Sname\u003cspan class=\"operator\"\u003e=\u003c/span\u003e\u003cspan class=\"string\"\u003e\u0026#39;lex\u0026#39;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e) \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e xxx;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e还有\u003ccode\u003eEXISTS\u003c/code\u003e子查询,跟上边\u003ccode\u003eIN\u003c/code\u003e差不多,不过意思是将”至少存在一个查询结果“作为查询选择器的条件。\u003c/p\u003e\u003cp\u003e多个查询可以用\u003ccode\u003eUNION,, INTERSECT, EXCEPT\u003c/code\u003e分别进行并,交,差三个集合运算,目标的数据结构必须相同。\u003c/p\u003e\u003ch3 id=\"INSERT-UPDATE-DELETE\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/#INSERT-UPDATE-DELETE\" class=\"headerlink\" title=\"INSERT,UPDATE,DELETE\"\u003e\u003c/a\u003eINSERT,UPDATE,DELETE\u003c/h3\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eINSERT\u003c/span\u003e \u003cspan class=\"keyword\"\u003eINTO\u003c/span\u003e \u003cspan class=\"keyword\"\u003etable\u003c/span\u003e(Col1, Col2) [\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eVALUES\u003c/span\u003e(\u003cspan class=\"number\"\u003e1\u003c/span\u003e,\u003cspan class=\"number\"\u003e2\u003c/span\u003e,\u003cspan class=\"number\"\u003e3\u003c/span\u003e,\u003cspan class=\"string\"\u003e\u0026#39;4\u0026#39;\u003c/span\u003e) \u003cspan class=\"operator\"\u003e|\u003c/span\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eSELECT\u003c/span\u003e xxx \u003cspan class=\"keyword\"\u003eFROM\u003c/span\u003e xxx \u003cspan class=\"keyword\"\u003eWHERE\u003c/span\u003e xxx \u003cspan class=\"keyword\"\u003eGROUP\u003c/span\u003e \u003cspan class=\"keyword\"\u003eBY\u003c/span\u003e xxx\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e];\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eUPDATE\u003c/span\u003e \u003cspan class=\"keyword\"\u003etable\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eSET\u003c/span\u003e Col1\u003cspan class=\"operator\"\u003e=\u003c/span\u003exxx\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eWHERE\u003c/span\u003e cond;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eDELETE\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eFROM\u003c/span\u003e \u003cspan class=\"keyword\"\u003etable\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eWHERE\u003c/span\u003e cond;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"VIEW\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/#VIEW\" class=\"headerlink\" title=\"VIEW\"\u003e\u003c/a\u003eVIEW\u003c/h3\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"keyword\"\u003eVIEW\u003c/span\u003e vname(Col1,Coln)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eAS\u003c/span\u003e 子查询\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[\u003cspan class=\"keyword\"\u003eWITH\u003c/span\u003e \u003cspan class=\"keyword\"\u003eCHECK\u003c/span\u003e OPTION]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eGROUP\u003c/span\u003e \u003cspan class=\"keyword\"\u003eBY\u003c/span\u003e xxx;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eDROP\u003c/span\u003e \u003cspan class=\"keyword\"\u003eVIEW\u003c/span\u003e vname CASCADE\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"空值\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/#%E7%A9%BA%E5%80%BC\" class=\"headerlink\" title=\"空值\"\u003e\u003c/a\u003e空值\u003c/h3\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003exxx \u003cspan class=\"keyword\"\u003eIS\u003c/span\u003e [\u003cspan class=\"keyword\"\u003eNOT\u003c/span\u003e] \u003cspan class=\"keyword\"\u003eNULL\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/"},{"title":"2023这一年","time":"2023-12-31T12:30:31Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e时间过得真快啊。一转眼已经过去5/8个大学了。\u003c/p\u003e\u003cspan id=\"more\"\u003e\u003c/span\u003e\u003cp\u003e记得去年这个时候,我还是和同学在语音里闲聊着,一起等着跨年。然后,2023,就在我们几个的闲聊中拉开了序幕。比较幸运的是,放开之后,没啥大的折腾,nCov-19终于慢慢销声匿迹了。还好,终于能有个比较正常的大学生活了。\u003c/p\u003e\u003cp\u003e冷清的窗外,忽的传来几声烟花爆裂的声音,提醒着我,这一年确实是过去了。家里只有父母和奶奶,静悄悄的。大人们都早早睡下了,毕竟还要工作。深冬的寒夜里我依旧在思考,但又不知道在想什么。或许只是借助思考打发孤独罢了。\u003c/p\u003e\u003cp\u003e哦对了,去年那会差点喜提新机:跟某同学去完市图书馆之后,回家放东西的时候手没拿稳直接drop it了。还好机器主体没啥问题,就是屏幕漏液痛失360元。不过当时脑子一抽打开2077看了下效果,嗯,更沉浸了。\u003c/p\u003e\u003ch2 id=\"一,二月\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E4%B8%80%EF%BC%8C%E4%BA%8C%E6%9C%88\" class=\"headerlink\" title=\"一,二月\"\u003e\u003c/a\u003e一,二月\u003c/h2\u003e\u003cp\u003e过年前还跟哥们出去浪了一会,顺便被一个南科大的哥们请恰了一顿饭。毕竟帮人家搞定了课程大作业确实挺不容易的,就是不知道这孩子有啥想不开的,一个学金融的非要选Java……反正逛的是挺爽的:顶着刚疫情还没恢复的身子去爬山差点没给我爬入土了。后面几天有一天在发小家里聊到好晚,还带了一袋子自己炸的薯条分而啖之。他很喜欢米家的游戏,\u003cdel\u003e倒是跟我刚好相反\u003c/del\u003e反正跟原切割了。不过这不重要,反正见面的话题永远聊不完:两个天差地别的专业,聊啥都是新鲜的;更重要的是,还好现在远没到拉家常的年纪,我们暂且都还是比较有趣的人。\u003c/p\u003e\u003cp\u003e转眼就是过年。现在春节用春晚作为背景音的都很少了,拜完年串完门,烧纸的烧纸,上坟的上坟。村子里的人是一年比一年少,有些房子变新了,也变冷清了;有些房子门前已经满是杂草,无人打理许久了。偶尔请些亲戚来家里做客才能稍微驱逐些寂寥,有点小孩就更热闹了——可惜,现在他们对于手机更感兴趣。\u003c/p\u003e\u003cp\u003e跟哥们一块看了《流浪地球2》,感觉比1提升不小。导演功力到位,华仔演技在线,剧情不错,就是叙事节奏有改进空间。在这之后,ChatGPT就第一次问世了。\u003c/p\u003e\u003ch2 id=\"三,四月\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E4%B8%89%EF%BC%8C%E5%9B%9B%E6%9C%88\" class=\"headerlink\" title=\"三,四月\"\u003e\u003c/a\u003e三,四月\u003c/h2\u003e\u003cp\u003e机械性的春节后,该上学的上学,该上班的上班,一切照旧。去年没有考的试就放到了开春来考,队友想专心复习,顶不住压力,就放弃了美赛。临阵垮台,于是参加美赛的机会从三次变成了两次。如果想要给考研加点分的话,那就只能指望大三寒假咯。队友不太好意思,遂请我们吃了个\u003cdel\u003e散伙\u003c/del\u003e饭。想说些啥,但是也没啥好说的。那会的大学时间还有不少,机会也是。\u003c/p\u003e\u003cp\u003e到这里,节奏基本还行,但是对于大二下的恶毒我还是始料不及。三月,四月,又是期中考试,实验陆续开始。西电的传统是实验报告大多手写,于是免不了应付这些繁文缛节。加上课内作业,而且最重要的是,我还是选了最累的活法:打了一堆毛毛雨一般的竞赛。最忙的时候,手头同时有6,7个任务得搞定。\u003c/p\u003e\u003cp\u003e我发现我好像那个什么抖m,净喜欢给自己找罪受。\u003c/p\u003e\u003cp\u003e不过这些倒还好,属于是有惊无险地都干完了。真正难绷的事情才刚刚开始。虽然没有rx那么强的开发效率,但是我还是接下了同学拉我去做的烂摊子。那本来是个挺简单的vue+springBoot标准前后端项目,最后做的我怀疑人生,差点放弃前端。那项目我打5月接手的时候看了下需求,感觉多是多,但是能做——然后我就被另一个哥们封装的,小山包一样的屎山代码糊脸了。这个后面说。另外那段时间也把鸽了整一年的OJ拉出来重新写了,刚好能用上新学的东西,这会应该算是真正开始熟悉了Vue和Golang这俩现代开发语言的用法。\u003c/p\u003e\u003cp\u003e不得不提的还有大模型,人类史上用户量最快达到一亿的玩意,没有学术上的美感,有的只是空前庞大的恐怖算力,工业界的暴力美学所创造出的前所未有的奇迹——能力只有文字接龙,但是能力强到让许多人开始担心自己的饭碗,甚至有人认为它的智能快达到临界点了。\u003c/p\u003e\u003cp\u003e以及就是业余无线电能力测试。一晚上速通,拿上A证了。上了两年大学,好在应试能力留了一些。\u003c/p\u003e\u003ch2 id=\"五月\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E4%BA%94%E6%9C%88\" class=\"headerlink\" title=\"五月\"\u003e\u003c/a\u003e五月\u003c/h2\u003e\u003cp\u003e5月是实验的谎言。一个月天天是实验,周周有实验报告要写。好在有几个能直接提交电子打印版的,借助历史的积淀秒了。不过实验本身也够占时间的,导致我错过了半个晒你祭(恼)。5.13早上当了会门口引导的志愿者之后,把俩\u003cdel\u003e二刺螈\u003c/del\u003e同学从隔壁瓜大领进去光了会,拍了几个coser,就被电子线路实验带走了。俩小时速通之后,展子还在,但是不剩啥节目了。事后同学表示,这Live神中神,特别是那个鼓手定得一批。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e我:我tm在做实验没听到啊啊啊啊\u003cbr/\u003e:你这辈子就是让实验给害了\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e不过还好,4月还是3月喜提新哥们,还是意外盒到的酷安群u(甚至刚好还是个潜在越共),5月初有长安THO,就给他拽过去逛车万展子了。好像之后还陪着他娶了个新旧电脑(无误),他的古董电子产品收集喜加一。也是他的影响让我开始怀疑我对算力需求的必要性了。也是月初,发小还去上海逛cp29(还是多少)了,买周边就花了小1k。只能感叹某些二次元的行动力真的强,一个人从西安跑上海还跟特种兵似的,基本所有重要地方都打卡过了。\u003c/p\u003e\u003cp\u003e这个月还跟浪潮的朋友们出去团建了。19级的学长到这个点也基本都未来既定了,值得庆祝的是学长们去向还都相当可以。西电保研清华的老学长还来回来逛了一圈,可惜比较社恐也就没聊几句。感叹一句,浪潮这些学长水平真的都好强啊。\u003c/p\u003e\u003cp\u003e还有一回是得知西安的亲戚住院了,很震惊,顶着大雨跑雁塔去看望了。越发感叹身体的重要性,尤其叔叔他上的班还是长期熬夜那种,很伤身体。于是之后也下定决心少熬夜\u003cdel\u003e但是只有一点点\u003c/del\u003e。巧的是这地方刚好离你电老校区不远,就顺便跑过去逛了一圈。刚开始在家属区里溜达了半天,最后才找着进去学校的路。刚好去听了个EDA公司的校企合作实验室揭榜,顺便第一回线下见到了你电的校长\u003cdel\u003e之一\u003c/del\u003e。可惜的是去晚了,没白嫖到讲座送的礼盒。\u003c/p\u003e\u003cp\u003e后面雨突然特别大,打着伞都给你打一身溅射伤害那种,于是刚好趁这个时间逛了下你电的老图书馆。好像那种老楼都喜欢修得很高,这玩意外边看着还行,里边有足足十一层。看了下都是些研究生学长学姐在自习/看书/写论文,座位倒是比南校区多很多。随机roll到本Hadoop的书看了下,然后就下楼了。\u003c/p\u003e\u003cp\u003e在雨里边看着路边树上挂的一排诗歌的牌子,还有你电老校区的老苏式宿舍楼,感觉有种回到小时候的感觉。\u003c/p\u003e\u003cp\u003e不过雨太大了,于是跑到食堂去了。老校区食堂还不错,便宜大碗。然后也不知道怎么突然想起来,也是去年这几天,袁隆平院士走了。然后出门看着雨都变了个滋味。\u003c/p\u003e\u003ch2 id=\"六月\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E5%85%AD%E6%9C%88\" class=\"headerlink\" title=\"六月\"\u003e\u003c/a\u003e六月\u003c/h2\u003e\u003cp\u003e之后就是复习,考试了。这之间学校里边“报复式”地办了不少活动,比如什么大学生音乐节。完事之后也到六月了,刚好也到19级老东西们爆金币的时候了。说起来去年这会刚送走小梦,现在看电表还在维护,真是感慨万千。当时学原生安卓开发,还是向小梦哥哥请教的很多问题。现在学长已经在字节干了快一年半两年了,希望一切都顺利吧。\u003c/p\u003e\u003cp\u003e另外就是,把原来那个B450的AMD平台板U条套装换成了RD450X的Intel Xeon平台的板U套装了。不过因为电源输出端口不够的原因,买了个电源在路上还没运回来。一直拖到下个月才装好。不过有一说一,双路E5真的爽啊,特别是拿来跑各种数据挖掘算法的时候,那速度真的吊着普通消费级处理器打,12700H要跑十几分钟的k-means聚类,这玩意只要几十秒;编译的时候\u003ccode\u003emake -j56\u003c/code\u003e更是爽的一批。\u003c/p\u003e\u003cp\u003e考试完了之后也算是去逛一逛,光速约了一堆哥们(重大失误,约人的时候尽量少点,特别里边不少都不是特别熟的人)跑去爬华山。上山的过程嘛很爽,跟几个好朋友一路边吐槽边往上走,晚上山上风景倒是也别有风味,尤其是看着一路上一条条光点连成的线条,以及山脚下\u003cdel\u003e万家\u003c/del\u003e灯火,有种说不出来的震撼。几个哥们爬到中峰就爬不动了,我倒是莽上去东峰了,就是半路上两条腿轮流抽筋实在有点酸爽。\u003c/p\u003e\u003cp\u003e最后倒是亲眼看到了完整的日出,太阳从一个小点慢慢变得越来越红火,越来越大,感觉一晚上的努力也值了。\u003c/p\u003e\u003cp\u003e下山实在不想说了,建议是千万别人多的时候爬山,真的够你喝一壶了,氪金都不能速通的那种痛(虽然主要是因为一晚上没睡觉)。乱七八糟的事让这事虎头蛇尾地结束了,也从此对华山这地方有了ptsd。这种景区建议最好先对周边了解清楚之后再去。\u003c/p\u003e\u003cp\u003e然后回了学校,就是为期一周的军训。大学的军训比印象中高中那会红河谷那次水多了,基本就是每天上午8点集合,站一个上午军姿/学走正步/整队之类的。教官和我们同岁,所以也比较仁慈\u003cdel\u003e放水\u003c/del\u003e。最后军训完了之后,也刚好到暑假了。\u003c/p\u003e\u003ch2 id=\"暑假\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E6%9A%91%E5%81%87\" class=\"headerlink\" title=\"暑假\"\u003e\u003c/a\u003e暑假\u003c/h2\u003e\u003cp\u003e跟好哥们去网安大楼天台上溜达了一圈,风景真的不错。夕阳刚好,空无一物的天空让人心情无比平静,很大程度上也排解了之前的糟心事的影响。小赵真的是个很好的人,希望他未来能被世界温柔以待吧。后来也跟他合作整过一个小项目,我写前端,他做硬件。不得不说,这还是我第二次做一个这么贴近硬件的项目。可能以后遇到硬件方面的需求的话,我真的能用一个esp32整出不少活吧。\u003c/p\u003e\u003cp\u003e之后几天,跟隔壁瓜大两个哥们线下联机打了一段时间的MC Java原版生存。这游戏也陪着我走过了起码快十年了吧?小学玩过,初中玩过,高中也跟舍友玩过,大学了还在玩,可能这就是开放世界的魅力吧。当然,我们三个彩笔打了两三天还没通关,光停下来造房子造基地了,末地门都还没找到呢。趁着这段时间,顺便逛了一圈\u003cdel\u003e瓜大\u003c/del\u003e东大村,评价是比你电周边丰富多了。以及西工大校内,虽然学校地方比较偏僻,但是瓜大的校内生活似乎也还行。特别是同学宿舍晚上基本不关门这点薄纱你电,以及瓜大的风景真不是吹的,到处都是好机位,依山傍水,出图书馆就是四时之景。而且瓜大的图书馆真的大,里边甚至有商超那种大电动扶梯,一堆自习位置,靠窗的位置学累了还能看会风景。另外关于这点,彦的自习常用位置是四个书架合围的一个小空间里边。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e:你是不喜欢看风景吗\u003cbr/\u003e彦:学习要讲究一个氛围\u003cbr/\u003e:嗯所以呢\u003cbr/\u003e彦:你想想mc里边附魔台周围都要围一圈书呢\u003cbr/\u003e:合着你给你自个附魔呢是\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e中间有一回回学校拿电脑(mc果然得几个人联机才有意思),顺便带他俩在学校里(再次)溜达了一圈。中间带他俩去部室打了会sdvx差点给主线任务忘了\u003cdel\u003e音批是这样的\u003c/del\u003e。那之后带他们rua了会大鹅,以及在B楼底下不定期出没的黑子,拿上电脑恰了个饭,就打车回瓜大了。然后几个彩笔被循声守卫轮流锤死不知道多少次。之后不知道为啥瓜的\u003cdel\u003e唐\u003c/del\u003e航小天莫名其妙火了,然后莫名其妙跟你电的\u003cdel\u003e唐\u003c/del\u003e西小电联动了(?)\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003cdel\u003e唐\u003c/del\u003e航小天可爱捏\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e另外就是另一个鸽子精那会也从哈尔滨回来了。摇了几个朋友出去小聚了一下。后面基本就只剩下天天写代码肝外包项目了。哦对,还有偶尔去学校游泳池游个泳啥的。顺带还带着一个同学大概学会了怎么在水里扑腾(\u003c/p\u003e\u003cp\u003e这个假期最主要的就是俩外包项目,硬是把github commits从不到300刷到了600+。接了俩外包,在学校干了俩月。靠着外包挣的一点钱给整了个平板,升级了服务器,整了个便携屏,给笔记本升级到32+8的抽象内存组合了。8月份,同学来打电赛省赛,还迎带同学溜达了一圈。那阵子雨天挺多的,一阵秋雨一阵凉,感觉西安这地方只有夏天跟冬天俩季节。中间回家了一趟,好在家里没啥大问题。在宝鸡拉着同学出去溜达了一圈,比较离谱的是他们见到了个核酸检测点之后集体发电,不存在的记忆增加了.jpg\u003c/p\u003e\u003cp\u003e后面回了西安之后,还遇到高中同学来西安逛。俩人聊天聊了一个通宵。回去之后不知道咋想的突然就想给电脑换个Arch\u003cdel\u003e然后就找到目前最理想的系统了\u003c/del\u003e。\u003c/p\u003e\u003ch2 id=\"九月\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E4%B9%9D%E6%9C%88\" class=\"headerlink\" title=\"九月\"\u003e\u003c/a\u003e九月\u003c/h2\u003e\u003cp\u003eISC招新,感受到自己已经确实是个大三老东西了。趁着开学听了好多校招会,虽然本科大概率没有直接就业的想法。比较幸运的一点是,小米的校招会上还抽到个Xiaomi Sounds Pro。可惜不是声学发烧友,倒是让几个好哥们爽了一回。\u003c/p\u003e\u003cp\u003e月中跟哥们去看了奥本海默,确实是好片,没别人说的那么难懂,就是太过沉迷剧情,两个人三回标题都没拍下来打卡,最后只拍下来个龙标,笑死。后来跟他速通了下西安理工金花校区,苏联老楼给我留下了极其深刻的印象\u003cdel\u003e有种回家的错觉\u003c/del\u003e。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e回来没两天就是湖人哥一战成名的时刻了。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e后面就是第一回参加开源社区活动,壮着胆子讲了回Linux,起码没翻车。顺便线下了好多酷安/OSC群的群u\u003cdel\u003e当然最后也是没逃过来自群u的盒打击\u003c/del\u003e。后一天去车万组活现场瞅了一眼,在放漫才,确实很有节目效果。\u003c/p\u003e\u003cp\u003e之后就是星铁/崩坏的啥活动,俩哥们跑去线下打卡来着,顺便又聚了一回,又三个人速通了回西安理工新校区。一个崩批一个铁批行动力是真强,晚上嗯走七个打卡点打卡,我在干啥,我那会好像在边走边在给电脑装Arch\u003cdel\u003eArch To Go\u003c/del\u003e。顺便几个人吐槽了一波西安依托的地面交通。\u003c/p\u003e\u003cp\u003e月底,那个外包项目也因为各种问题凉了。说实话心里很不是滋味,并且对于这种任务之后心里都没了底。说不上来是好是坏。\u003c/p\u003e\u003cp\u003e25号,一个20级研究生学姐跳了,在此之前西电好像已经十几年都没跳的了。不知道是什么让她做出了这样的选择。对她的行为我不应也不想做出评价,对于这个结果还是希望逝者安息吧。\u003c/p\u003e\u003ch2 id=\"十月\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E5%8D%81%E6%9C%88\" class=\"headerlink\" title=\"十月\"\u003e\u003c/a\u003e十月\u003c/h2\u003e\u003cp\u003e国庆+中秋调休,回去家里参加了邻家姐姐的婚礼。后面又和几个同学在宝鸡的小地方到处乱逛了一回,作为国庆的收尾。\u003c/p\u003e\u003cp\u003e这个月后面的就是音乐会,迎新歌会之类的。活动确实不少,还跟高中来打比赛的学弟们见了回面,时间真快啊。\u003c/p\u003e\u003cp\u003e后面14号是浪潮的迎新晚会,15号还有你电的百团大战。现场特别热闹,酷安群的抽象海报和那张顶针专辑的关注度挺高的。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e早知道,还是原道.jpg\u003cdel\u003e触发悔恨之泪\u003c/del\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e后面跟着彦和辰出去溜达,没处去的时候\u003cdel\u003e骗\u003c/del\u003e带他俩来打maimai,俩人打得倒是不亦乐乎。后面看到一个用币随机抽天子手办的机器之后就走不动道了,把白嫖的币用完也没拿到qaq\u003c/p\u003e\u003cp\u003e这个月也发布了不少手机平板之类的。米14发布那天同学还拉着我去线下摸了真机器,还有华子那个特别大的平板冲击力也不小。\u003c/p\u003e\u003ch2 id=\"十一月\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E5%8D%81%E4%B8%80%E6%9C%88\" class=\"headerlink\" title=\"十一月\"\u003e\u003c/a\u003e十一月\u003c/h2\u003e\u003cp\u003e这个月也挺魔幻的,以一个重大删库事件为开端。不过实际影响并没有那么大,毕竟开源什么时候死过。\u003c/p\u003e\u003cp\u003e中间去电信的陕西主干IDC机房参观过。现代化的工业美学,真的帅的顶天。包括垂直化冗余能源设计,应急热交换塔(真的是个塔),特大号的备用发电机组机房和热交换机组机房,帅惨了。反倒是核心的业务机房,特别规整,\u003cdel\u003e环境优美\u003c/del\u003e倒是没啥特别突出的,不过单就这一间机房的装机量以及那个密堆叠,加上天花板走线,真的帅。这机房的数据吞吐量更是恐怖,出口时延\u0026lt;2ms,出口带宽16.4T(没见标注的单位是啥,应该是bps吧)。,\u003c/p\u003e\u003cp\u003e比较难绷的是介绍企业文化的时候,听到那个半部电台起家还以为在讲你电校史呢。另外比较惊喜的就是展示产品的时候,一个陈列墙上挂了很多相当大时间跨度的移动通信终端,甚至还有大哥大。回了学校之后刚好赶上各种国企的校招,就去凑了个热闹。\u003c/p\u003e\u003cp\u003e之后就是贴吧高校头像异变事件了。隔壁瓜大唐小天火遍全网,你电唐小电也一触即发。最后俩cp学校吧头官宣联动了。\u003c/p\u003e\u003cp\u003e月中,籽岷的工作站组装好了,然后子建就顺道来西安送东西+装机/溜达了。刚好有人电脑有问题,子建就把家伙拿上了。来都来了不拿个电脑顺带清清灰说不过去,但是因为服务器全塔实在背不动就只拿了俩笔记本。先给兆廷把液金换成了7958sp,然后某人就得液金ptsd了。更难绷的是兆廷电脑的热管因为玄学的剪切力弯了,不过无伤大雅,某人也没时间倒腾这问题了。\u003c/p\u003e\u003cp\u003e当天晚上我们几个还是继续推主线任务,给籽岷把他的工作站部署好顺带给一群人的电脑清灰+换硅脂\u003cdel\u003e反正7958sp又放不住不用白不用\u003c/del\u003e。但是离谱的是遇到玄学问题,明明子建拿来的时候已经给系统+专业软件都装好了,结果突然不能开机了。没办法,我跟子建就轮流干清灰/debug的活。最后整了半天没找出来问题,灰倒是都清完了。更离谱的是我俩一堆WinPE一个都进不去,然后我脑子一抽打算进我U盘上自带的Arch LiveCD试试。感谢Linux启动日志,我很快就把问题锁定到那个蓝盘上了。果然,替换法试了下,那个蓝盘莫名其妙挂了。\u003c/p\u003e\u003cp\u003e完事之后已经快早上五六点了,本来说完事打打mc呢也没时间了,睡吧。好在我们仨在东大村找了个宾馆住了一晚上,休息的也还行。第二天起来让籽岷换个固态,另一个哥们则是完全被整麻了。不过好在之后换了盘之后,远程指导同学分区装系统打驱动,一遍过。\u003c/p\u003e\u003cp\u003e事后彦看着我们当晚的工作场面照,评价说我们跟一群准备攻打瓜大的黑客一样。没绷住。另外就是被霓虹的场子做工震撼到了,那个松下的机子我第一回见到那么分体式的主板,而且也是我继G15之后见到的第二个风扇装主办背面的笔记本。换硅脂的时候我如履薄冰战战兢兢生怕抠的太用力给晶圆一块带走了,因为这东西硅脂已经彻底硬化了,估计是从16年到现在就没换过硅脂。好在有惊无险地清理完了。下午带子建在瓜大逛了一下午,以及中间难绷的是彦差点被他们点名拿下一血,好在没事。刚好这回来的时候他们在修飞机展示区,虽然不太了解军事但是这堆真货是真的帅。\u003c/p\u003e\u003cp\u003e以及后面清完灰之后发现手上这个松下的本子安静过头了,本来想赞扬下子建清灰手法高超,直到我拆开机器之后发现:\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e哥们忘插风扇电源了,那能不安静吗.jpg\u003cbr/\u003e狠狠拷打.jpg\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e之后就是各种上机/实验了,给我时间全占完了基本,导致瓜大的车万展子咱都没去成。哦月底还感冒了一回,不过还好是普通感冒,来得快去得也快,可能也是因为这学期报的散打强度比较大提升了免疫力?月末的电子线路课设差点给我带走,不过还好有惊无险过了。\u003c/p\u003e\u003cp\u003e29号酷安群线下k70发布会,印象最深的不是手机而是chi哥的发型。\u003c/p\u003e\u003ch2 id=\"十二月\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E5%8D%81%E4%BA%8C%E6%9C%88\" class=\"headerlink\" title=\"十二月\"\u003e\u003c/a\u003e十二月\u003c/h2\u003e\u003cp\u003eISC这个月开了几次讲座,有我提议的Linux基础,还有AI那边发起的机器学习概论。质量都不错,场面也挺热闹的。\u003c/p\u003e\u003cp\u003e顺便几次差一点线下了Dimole,不过这孩子好像挺多灾多难的,希望人没事.jpg\u003c/p\u003e\u003cp\u003e然后月初带家里人来学校里逛了回,月中\u003cdel\u003e被大一学弟带\u003c/del\u003e带大一学弟打了星火杯。\u003c/p\u003e\u003cp\u003e12.15 今年的第一场雪。\u003c/p\u003e\u003cp\u003e12.16 三刷六级,微原实验,以及生日。\u003c/p\u003e\u003cp\u003e12.18 23:59 第一次被地震警报吵醒,希望甘肃同胞平安。\u003c/p\u003e\u003cp\u003e12.19 和好朋友去设了台,算是半个HAM了。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e没想到的是西电湖人的落幕带来的是西电冰人的出现,电专学子永远是会整活的。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e月底出去跟朋友溜达了一次,圣诞节跟一个未知的朋友交换了礼物,忙了一个月的各种ddl,\u003c/p\u003e\u003cp\u003e12.30 跟同学出去溜达就当提前跨年了。先是和彦在香积寺里边做了一下午的光影猎手,然后和兆廷在师大万科恰了顿饭,时间真快。\u003c/p\u003e\u003cp\u003e月初很忙,月末也忙,忙忙碌碌的一个月。\u003c/p\u003e\u003chr/\u003e\u003cp\u003e这篇流水账从28号开始写,到现在也刚好3天了,再过几个小时,人类又要庆祝自己小小的行星绕着恒星走过了一圈。年年如此,未来也将如此。\u003c/p\u003e\u003cp\u003e这个敲了半天的薄膜键盘,是我在高考完那个暑假买的,一个普通的键盘。它连上过我的老台式机,笔记本,以及现在这个松下笔记本,快三年了,它也老了:大部分按键因为写代码的摧残,已经被磨成了白色。左Shift也因为频繁使用,已经卡的吱吱嘎嘎的响。\u003c/p\u003e\u003cp\u003e看着键盘,想想我自己,好像也差不多。本科排课问题的摧残,jwc烂活的摧残,跟甲方搏斗的摧残,在某些方面我也逐渐迟钝起来,行动力也不如从前。似乎高考前那阵子是我行动力最强的时候,一个人凭着兴趣就写了快四千行代码,给自己和朋友们做了个小玩具。或许这也是一种磨损?\u003c/p\u003e\u003cp\u003e有时候真觉得自己老了,写不动了。不过这两年写的其实也并不少,甚至就那个因为各种原因烂尾的项目,我提交的代码可能都有几万行。相比于几年前,我确实进步了不少:纯粹依靠自己一个人做到的东西,上限越来越高了。特别是视野开拓了不少,现在能用很多学科的知识去解决实际问题了。不过最重要的还是热情,这几年挖过不少坑,甚至还在酷安发过自己编写的应用,给开源社区贡献了一个博客聚合系统的实现,也被收到了水表里边,作为博客星球的后端,在讲座上讲过两次技术相关的内容。竞赛也打了不少,奖也是。\u003c/p\u003e\u003cp\u003e不过,即使面对天堑我也不想停下,因为我就是想做到我想做的事。和自己和解能解决很多问题,但是我不想,只因为我不服这个自己。所以我一次次挑战自己。即使陷入迷惘,也不想停下步伐,因为这比找不到路更可怕。\u003c/p\u003e\u003cp\u003e现在已经是晚上了,冬天的太阳落山早,天已经黑了。舍友一个回家了,一个出去跨年了。宿舍只剩我一个,宿舍空荡荡的,也没开灯。对着空荡荡的Vim敲了半天,心里有种说不上来的孤独。这算不算是一种孤独编程?(笑)\u003c/p\u003e\u003cp\u003e还没感叹完呢,那几个哥们已经在商量着连麦跨年了。白孤独了(x\u003c/p\u003e\u003cp\u003e变的倒是很多,不变的也挺多。至少在外边,还有这些狐朋狗友陪着我,不是吗?\u003c/p\u003e\u003chr/\u003e\u003cp\u003e你好,2024。有什么展望的话,希望明年写流水账的时候,能来点更精彩的。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/"},{"title":"云原生架构的现状和未来","time":"2023-12-29T00:27:36Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"云原生架构的现状和未来\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5\" class=\"headerlink\" title=\"云原生架构的现状和未来\"\u003e\u003c/a\u003e云原生架构的现状和未来\u003c/h1\u003e\u003ch2 id=\"云原生的定义\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%BA%91%E5%8E%9F%E7%94%9F%E7%9A%84%E5%AE%9A%E4%B9%89\" class=\"headerlink\" title=\"云原生的定义\"\u003e\u003c/a\u003e云原生的定义\u003c/h2\u003e\u003cp\u003e云原生是一个很新的概念,笔者并没有搜集到这一概念的原始文献。不过目前最认可的定义通常如下:\u003c/p\u003e\u003cp\u003e云原生(Cloud Native)是一种软件开发和部署的方法,它利用云计算的特性,如弹性、自动化、可扩展性和微服务。云原生的应用程序可以在不同的云平台上运行,无需修改代码或配置。云原生的目标是提高软件的质量、效率和安全性,以适应快速变化的市场需求。\u003c/p\u003e\u003cp\u003e因此这种开发和部署模式相当适合如今对于业务需求繁复,且对于开发效率的要求很高的现状。举个例子,比如一个云原生应用的开发流程可以是这样:先根据需求设计系统架构,随后根据云原生应用的设计准则将应用划分为一系列无状态的微服务并将状态统一管理。完成代码编写后,通过Docker Images的形式发布,最后通过Kubernetes等部署在云服务器上,交付给客户。之后的测试环节也可以使用云原生平台的基础设施来完成后续的运维。\u003c/p\u003e\u003cp\u003e要更好地理解云原生,就得知道原来的开发模式是什么样的。传统的开发模式下,开发者通常得自己考虑数据库的配置和部署,软件发布后需要自己部署到目标计算机上,并且大部分的运维工作都需要手动完成,而这其中大部分的运维工作往往都是重复的,比如数据库的备份恢复,扩容,服务的扩容等等。传统架构下,需要开发者/运维根据文档手动添加系统的各部分,并修改系统的配置,甚至修改系统本身的部分实现。可以说,传统的架构就是直接在裸服务器环境下手动管理服务进程和系统的各部分软件。\u003c/p\u003e\u003ch3 id=\"云原生的发展历史\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%BA%91%E5%8E%9F%E7%94%9F%E7%9A%84%E5%8F%91%E5%B1%95%E5%8E%86%E5%8F%B2\" class=\"headerlink\" title=\"云原生的发展历史\"\u003e\u003c/a\u003e云原生的发展历史\u003c/h3\u003e\u003cp\u003e从全球云计算技术发展历程来看,大致经历了三个阶段:1.0是云计算培育期,以资源虚拟化和集中管理为核心技术特点;2.0是云计算成熟期,以云原生和资源编排为核心技术特点,大数据和人工智能成为热点;3.0是云计算发展深化期,进入算力时代,政府和企业应用加速上云,应用领域触及到政府和中大型企业核心系统,以云网融合、云边端协同为核心技术特点。\u003c/p\u003e\u003cp\u003e云的本质是对算力的妥协,以及对于用户体验的平衡,进而演进出的一种解决方案。当信息行业服务提供者的业务复杂到一定程度后,就必然会面对运维,也就是Ops的复杂度急剧上升的问题。云计算的诞生就是为了借助云将Ops的负担转移,让企业专注于业务本身,免于花费精力于服务端的维护上。\u003c/p\u003e\u003cp\u003e云计算、5G、AI、大数据、区块链等新技术的应用和数字化进程的加速,带来了丰富业务的同时也对网络功能提出了极高的挑战,传统网络仅提供纯粹的管道功能,已不能满足云上业务应用对网络资源的调度需求,因此催生了网络功能虚拟化和资源化的架构模式,以满足云业务对网络的调度需求。云原生技术的提出和发展,带来应用敏捷交付、快速弹性、平滑迁移、无损容灾等特点,被越来越多的企业用户所接受,企业关注点已经从以资源为中心转移到以应用为中心,网络需要同步演进,通过构筑敏捷、安全、开放、弹性、灵活的云原生网络更好地支持业务应用,推进数字时代的发展。\u003c/p\u003e\u003cp\u003e云原生作为网络演进的一个阶段,它的前两个阶段分别是单机互联时代和上云时代。这二者中,前者只是将各个机器使用网络连接起来,上云时代则将一部分资源从网络中抽离出来,以接口的形式暴露在网络中供网络使用。而云原生和网络的结合,也就是云原生网络,是利用云原生技术构建与云能够天然融合的新型网络架构。\u003c/p\u003e\u003ch3 id=\"为何需要云原生\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%B8%BA%E4%BD%95%E9%9C%80%E8%A6%81%E4%BA%91%E5%8E%9F%E7%94%9F\" class=\"headerlink\" title=\"为何需要云原生\"\u003e\u003c/a\u003e为何需要云原生\u003c/h3\u003e\u003cp\u003e传统的可变基础设施是指应用服务基于物理机或虚拟服务器进行部署,运行环境的构建依赖很多变量,诸如一些服务器上的配置、基础软件等,在不同环境之间可以通过动态配置下发或实时访问外部服务更新应用的状态,整个应用服务所依赖的基础设施一直处于变化之中,当出现需要进行应急回滚的场景时,运维人员处理流程往往会比较复杂,容易出错。\u003c/p\u003e\u003cp\u003e而云原生的通常做法是将应用依赖的基础设施(如安全插件、日志组件、JDK 基础软件等)打包成不可变的镜像,实现了多环境统一镜像,在应用发布时,只需对容器镜像进行变更即可,极大地降低了应用多环境的部署成本,同时对自动轮转替换、自动回滚等运维动作更友好,提升了基础设施运维的自动化水平。\u003c/p\u003e\u003ch2 id=\"云原生的现状分析\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%BA%91%E5%8E%9F%E7%94%9F%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%88%86%E6%9E%90\" class=\"headerlink\" title=\"云原生的现状分析\"\u003e\u003c/a\u003e云原生的现状分析\u003c/h2\u003e\u003ch3 id=\"云原生发展的三大关系\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%BA%91%E5%8E%9F%E7%94%9F%E5%8F%91%E5%B1%95%E7%9A%84%E4%B8%89%E5%A4%A7%E5%85%B3%E7%B3%BB\" class=\"headerlink\" title=\"云原生发展的三大关系\"\u003e\u003c/a\u003e云原生发展的三大关系\u003c/h3\u003e\u003cp\u003e软件和硬件的关系,服务器和终端的关系,算力和网络的关系。这几个对象在技术上互相融合,市场上互相补充,互相竞争。\u003c/p\u003e\u003cp\u003e服务器高算力,但是终端数量巨大,二者之间可以说是在进行着算力的博弈。云计算希望承载更多的算力并将终端变成瘦终端,终端希望承载更多的智能算力以进一步提升用户体验,边缘计算实际上是云计算和终端算力竞争下出现的一种阶段性产物。这样的竞争本质上是围绕需求和体验,保证算力无缝流转的问题。\u003c/p\u003e\u003cp\u003e也就是因为边缘设备的数量占比巨大,所以出现了边缘计算这个从端侧入手的算力利用方法,如何通过云的方式来结合二者的优势是一个问题。\u003c/p\u003e\u003ch3 id=\"云计算需要解决的四个问题\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%BA%91%E8%AE%A1%E7%AE%97%E9%9C%80%E8%A6%81%E8%A7%A3%E5%86%B3%E7%9A%84%E5%9B%9B%E4%B8%AA%E9%97%AE%E9%A2%98\" class=\"headerlink\" title=\"云计算需要解决的四个问题\"\u003e\u003c/a\u003e云计算需要解决的四个问题\u003c/h3\u003e\u003cp\u003e云原生本质还是一种服务交付和运维方式,它的底座还是云计算。而想要发展云计算,现阶段就必须面对这几个问题:\u003c/p\u003e\u003col\u003e\u003cli\u003e基础设施技术积累不足的问题:核心技术有供应链危险。现阶段在云服务器领域采用X86、ARM指令集的芯片占比超9成,自主指令集芯片占比低且与主流芯片存在较大代际差;操作系统国产化市场接受度不高,指令集和操作系统技术掌控不够是关系云计算产业供应链安全的根本问题。\u003c/li\u003e\u003cli\u003e软硬件协同处理问题:硬件层面摩尔定律失效,需要借助软硬件架构继续进步,本质是硬件和软件的关系。\u003c/li\u003e\u003cli\u003e云边缘资源调度问题:充分利用端侧算力,和云端算力统一调度的问题,本质是处理云计算和终端的关系。\u003c/li\u003e\u003cli\u003e网络云化的问题:现阶段网络成本高调度不灵活,需要”云化“来提升效率,本质是处理计算和网络的关系。\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"云原生的相关技术\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%BA%91%E5%8E%9F%E7%94%9F%E7%9A%84%E7%9B%B8%E5%85%B3%E6%8A%80%E6%9C%AF\" class=\"headerlink\" title=\"云原生的相关技术\"\u003e\u003c/a\u003e云原生的相关技术\u003c/h2\u003e\u003cp\u003e云原生虽然是一个比较新的概念,但是它的技术底座不少都是复用了已经相对成熟的解决方案,因此概念虽然新,但是借助着架构的合理抽象设计,云原生却有着很高的可用性和可靠性。\u003c/p\u003e\u003ch3 id=\"微服务\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E5%BE%AE%E6%9C%8D%E5%8A%A1\" class=\"headerlink\" title=\"微服务\"\u003e\u003c/a\u003e微服务\u003c/h3\u003e\u003cp\u003e随着互联网技术的发展,大型 IT 系统一般采用分布式计算模式,以优化资源配置并提高系统可靠性、可用性和灵活性等。为了便于分布式信息系统的设计、开发与集成,以及提高系统架构的灵活性、复用性和可增长性,面向服务的体系结构 SOA 因此产生。SOA 体系结构将定义良好的,具有开放接口并独立于软硬件平台以及实现技术的单个服务组件关联起来,以构造整体应用并采用松耦合的方式保护既有 IT 基础设施。实际上,SOA 只是一种架构思想,而 Web 服务及其相关标准和 SOAP、WSDL、UDDI 等协议的出现,则为 SOA 的具体 实 践 提 供 了 技 术 支 撑 和 处 理 方 案 。 Web 服 务 基 于SOA 架构理念,采用一套标准技术实现了对企业间服务资源的共享和复用。SOA 体系结构及 Web 服务等相关标准和技术的产生,为构造松耦合的大型分布式应用指明了较好的方向,并做了开拓性工作。\u003c/p\u003e\u003cp\u003e尽管 Web 服务为跨平台的企业开发提供了方便,但是在开发模式上,仍然采用的是单体架构。单体架构由于自身特点较适合小型应用的开发,并不适用于业务复杂度较高、业务需求量较大的中、大型企业。微服务体系结构思想的出现,则较好地解决了上述难题。其核心要义在于基于面向服务的思想,对传统大型应用系统进行 功 能 分 解 ,推 动 细 粒 度 服 务 的 使 用 。 微 服 务 架 构(MicroServices Architecture,MSA)则指根据应用系统的业务需求,通过对预定义的微服务进行重组而形成企业级应用的分布式体系结构。它主要将传统概念上的单体应用在功能、数据等方面进行分解,划分为多个具有明确边界并可被自由重组的小规模子服务。这些子服务间采用轻量级通信方式实现交互、协作,每个服务都有自己的数据库并可在独立进程中被部署、运行等,服务之间保持技术异构性,可由不同的团队选择合适的工具、语言进行开发。与单体架构相比,微服务架构的优势在于:(1)微服务按业务功能划分,每个服务都具备特定的功能,易于开发、维护等;(2)每个独立的微服务可以由不同的语言基于不同的平台开发,灵活性较好;(3)子服务可独立部署,能够实现可持续集成及交付;(4)容错能力强大,单个微服务出现问题不会影响系统其他服务的运行;(5)可实现动态按需实时扩展等。目前,微服务体系结构的思想已被应用于很多大型公司的分布式应用系统中。\u003c/p\u003e\u003ch3 id=\"容器\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E5%AE%B9%E5%99%A8\" class=\"headerlink\" title=\"容器\"\u003e\u003c/a\u003e容器\u003c/h3\u003e\u003cp\u003e如果要指出云原生的一个代表性技术的话,那就是以Docker为代表的轻量级虚拟化技术了。容器是一种新的软件分发方式,同时也是一种新的虚拟化运行时环境技术。近几年以Docker等为代表的轻量级虚拟化容器技术迅速兴起。作为一种新的软件交付方式,它给出了一种高可用的,十分简单的一体化部署和运维方案。\u003c/p\u003e\u003cp\u003e容器 (container) 技术作为一种轻量级的操作系统层面的虚拟化技术, 能够为软件应用及其依赖组件提供一个资源独立的运行环境 . 在容器化过程中, 应用程序及其所有必要的依赖关系 (代码、运行时、系统工具和系统库等) 会被打包成一个可重用的镜像 (image), 镜像内容可以通过配置文件 (例如 Dockerfile 和 docker-compose.yml)中的指令定义 , 镜像运行环境不与主操作系统共享内存、CPU 和硬盘空间, 由此也保证了容器内部进程与容器外部进程的独立关系 . 与传统虚拟机相比, 容器技术具有快速启动、运行环境可移植、弹性伸缩、快速部署以及低系统资源消耗等优点 . 随着云原生 、DevOps、CI/CD等愈发流行与普及, 容器技术在软件开发和运维方面有着广阔的应用前景 , 已经引起了业内的广泛关注 . 许多云服务提供商已经开始提供基于容器的云服务, 以满足其不断增长的需求, 例如谷歌容器引擎 (Google GKE)、亚马逊弹性容器服务 (Amazon ECS) 和 Azure容器服务 (Azure ACS).\u003c/p\u003e\u003cp\u003e在众多容器技术中, Docker 无疑是最受欢迎的容器化技术, 已成为工业界的行业标准. Docker 本身是一个基于 LXC (Linux 容器)、操作系统虚拟化 等技术实现的开源项目, 通过提供标准化的运行时环境, 可以将同一个软件构建版本用于开发、测试、预发布、生产等任何环境, 并且与底层操作系统解耦, 从而实现“构建一次, 随处运行”的目标. Docker 容器技术有希望将开发人员从繁重的开发运维负担中解脱出来, 其主要原因有 3 个:(1) Docker 可以很好地解决代码运行环境变更问题, 从而降低依赖时的复杂度; (2) Docker 可以通过定义环境, 很好地解决环境不一致的问题; (3) Docker 可以帮助开发者精简部署流程, 使代码部署更加透明、高效.\u003c/p\u003e\u003cp\u003e自 2013 年诞生至今, Docker 容器镜像已经被下载超过 1 300 亿次 (\u003ca href=\"https://www.docker.com/company\"\u003ehttps://www.docker.com/company\u003c/a\u003e). 《Flexera 2021 年云计算报告》发现, 76% 的公司受访者表示正在或计划使用 Docker 容器技术. 目前 Docker 受到越来越多的公司和开发者欢迎, 被广泛地应用于软件开发和运维过程 , 也在各种实际应用中部署, 例如智能汽车、物联网和雾/边缘计算 (fog/edge computing). 近年来, Docker 容器技术也逐渐成为学术界一个热门的研究领域, 相关论文发表在软件工程领域的高质量会议和期刊上, 如 ICSE、FSE 和 ESE 等. 此外, 在并行与分布计算 (如 TPDS) 以及存储系统 (如 FAST) 等领域的高质量会议上也有相关论文发表。\u003c/p\u003e\u003cp\u003e轻量级虚拟化技术可以应用在边缘和泛智能终端上,解决云边端协同场景下边缘和终端侧资源和性能有限的问题。在一些算力协同调度场景下,如视频识别场景下,可以将智能识别的算力从中心到边缘到终端进行卸载,如图像渲染场景下,可以将算力从终端迁移到边缘或者云端上。通过轻量级虚拟化技术实现一致的运行环境,配合云边端资源调度技术,保证算力自由流动提升云边端算力的整体使用效率。\u003c/p\u003e\u003cp\u003e虚拟化技术本质上是一种资源隔离技术,现阶段轻量级虚拟化有三条技术路线,一是针对传统虚拟化的裁剪和硬件卸载方案,适用于公有云场景,解决公有云高虚拟化损耗、网络和存储性能瓶颈等问题;二是轻量化容器技术,针对容器虚拟化进行裁剪,可以解决云边端协同场景下边缘和终端侧部署容器引擎占用资源过高的问题,前期研究测试表明,基于Containerd裁剪和结构优化后的轻量级容器引擎部署在树莓派开发板上进行测试,可使flash使用量减少80%,内存平均占用减少45%,可解决容器运行在边缘或终端上的储存空间和内存空间的不足问题;三是WASM(WebAssembly)技术,是一种新型代码运行隔离技术,基于web引擎运行C/C++、Java等多语言程序,具有性能好、占用资源少、多语言兼容的特点,可解决边缘和终端场景下资源隔离性能和效率问题,近期CNCF社区也出现基于WebAssembly标准的开源项目,可以基于云原生生态和工具,在容器环境下实现WASM技术和Kubernetes的集成,经过对比测试,资源占用量减少一个数量级,其性能对比传统容器技术有较大提升,执行效率提升20%,冷启动时间大幅缩短。以上三条技术路线不是替代的关系,而是场景有侧重、技术补充和协同的关系。\u003c/p\u003e\u003cp\u003e截至2023年底,业界已经有许多大型商业公司借助诸如Kubernetes等容器化方式来构建大规模的互联网服务了。比如滴滴出行等。“上云”因为其自身的高可用等优势,已经成为了一种必然的技术趋势。不过现阶段轻量级虚拟化的生态仍然在发展中,需要云计算产业界的继续推进才能达到更大规模的落地应用。\u003c/p\u003e\u003ch3 id=\"无服务(Serverless)\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E6%97%A0%E6%9C%8D%E5%8A%A1%EF%BC%88Serverless%EF%BC%89\" class=\"headerlink\" title=\"无服务(Serverless)\"\u003e\u003c/a\u003e无服务(Serverless)\u003c/h3\u003e\u003cp\u003e无服务器架构并不是说,未来不再需要服务器,而是不再着重关注底层的基础架构,更多的注意力可以放在和业务更相关的一些逻辑实现上,例如一些函数的代码片段,平台自动根据负载按需部署和启动,以及自动伸缩代码逻辑来满足业务处理的需求。\u003c/p\u003e\u003cp\u003e这项新兴计算模式专注于基础设施透明化,减轻服务器管理负担,解耦应用程序,节省云服务成本,让开发者更关注自身业务创新。“Serverless”常与“Serverful”一词相对,用于描述具有服务器透明化特性的技术与应用。2014年Serverless首次以云服务概念被提出,它实现了应用开发者与服务器的分离,减轻了开发者在服务器管理、安全等方面的负担;另一方面,云提供商托管所有基础设施,消除了底层设备差异对上层应用造成的不良影响。Serverless服务主要指函数即服务FaaS(Function as a Service),通常还包括了为FaaS配套的后端即服务BaaS(Backend as a Service)。FaaS提供函数管理平台和运行平台,前者包含函数代码托管与调度工具,兼容多种主流编程语言与开发库;后者本质是改进的PaaS,维持一批函数专用容器,支持事件驱动、自动伸缩等能力。与传统中心化单体应用相比,FaaS函数应用由互相独立的函数显式编排组成,能直观地表现应用的业务逻辑控制流和数据流。\u003cbr/\u003eBaaS本质是后端服务(认证鉴权、安全控制和云存储等)的集成库,可适应多种应用场景,如支持移动应用的M-BaaS(Mobile BaaS)。\u003c/p\u003e\u003ch3 id=\"DevOps\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#DevOps\" class=\"headerlink\" title=\"DevOps\"\u003e\u003c/a\u003eDevOps\u003c/h3\u003e\u003cp\u003eDevOps是个组合词,DevOps,就是开发和运维合体,不像开发和产品,经常刀刃相见,实际上DevOps应该还包括测试,DevOps是一个敏捷思维,是一个沟通文化,也是组织形式,为云原生提供持续交付能力。\u003c/p\u003e\u003ch3 id=\"持续交付\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E6%8C%81%E7%BB%AD%E4%BA%A4%E4%BB%98\" class=\"headerlink\" title=\"持续交付\"\u003e\u003c/a\u003e持续交付\u003c/h3\u003e\u003cp\u003e持续交付是不误时开发,不停机更新,小步快跑,反传统瀑布式开发模型,这要求开发版本和稳定版本并存,其实需要很多流程和工具支撑。\u003c/p\u003e\u003ch3 id=\"服务网格\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E6%9C%8D%E5%8A%A1%E7%BD%91%E6%A0%BC\" class=\"headerlink\" title=\"服务网格\"\u003e\u003c/a\u003e服务网格\u003c/h3\u003e\u003cp\u003e服务网格是近年兴起的一个话题,在容器微服务的基础上,通过服务网格可以让用户更精细、更智能的去管理服务之间的通讯。Service Mesh社区的旗舰项目Istio,当前的热度正在迅速的飙升。\u003c/p\u003e\u003ch3 id=\"面向网路的云原生技术\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E9%9D%A2%E5%90%91%E7%BD%91%E8%B7%AF%E7%9A%84%E4%BA%91%E5%8E%9F%E7%94%9F%E6%8A%80%E6%9C%AF\" class=\"headerlink\" title=\"面向网路的云原生技术\"\u003e\u003c/a\u003e面向网路的云原生技术\u003c/h3\u003e\u003cp\u003e作为云计算的最新技术成果,云原生技术可以为通信运营商网络提供更加经济、便捷的部署和运营方法,随着运营商云网融合工作推进,云原生成为运营商网络云化的核心技术和关键抓手。基于云原生技术实现云网融合成为业界共识,现阶段云网融合最迫切的问题就是网络上云,目前正处于5G网络规模部署和5G专网大力发展阶段,网络云原生当前的抓手就是5GC的云原生化。需要深入研究5GC系统架构、组网、高可靠、转发加速等CT属性,研究云原生承载5GC的技术要求,为各专业网元云原生化改造提供技术指引及范例。进一步结合技术要求,聚焦网元微服务化、高性能多网络平面、承载网络感知、资源编排等关键技术进行重点攻关,提供满足网络云化需求的云原生底座。后续依托云原生底座,实现5GC上公有云,为公有云全面解耦承接各专业网络上云打造良好开端。\u003c/p\u003e\u003cp\u003e目前中国电信依托自研高性能虚拟化平台,已经完成全面的5GC异厂家三层解耦测试并正在开展现网实验,即将在全网有序开展全云化5GC商用部署,并且正在积极推进5GC云原生化改造和轻量级5GC上天翼云的工作。云原生技术从本质上来说是软件技术,网络运营商一定要用IT软件的视角来看待未来的网络研发、建设和运维,积极拥抱这一变化,才可能在未来国家新基建领域中承担主力军的角色。\u003c/p\u003e\u003ch2 id=\"云原生的研究方向\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%BA%91%E5%8E%9F%E7%94%9F%E7%9A%84%E7%A0%94%E7%A9%B6%E6%96%B9%E5%90%91\" class=\"headerlink\" title=\"云原生的研究方向\"\u003e\u003c/a\u003e云原生的研究方向\u003c/h2\u003e\u003cp\u003e作为一个新兴技术,首先的研究方向就是它自身的基线技术。这方面有上面提到的容器化和虚拟化技术,微服务架构,服务网格(Service Mesh),无服务架构,DevOps和持续集成/持续部署(CI/CD)等。\u003c/p\u003e\u003cp\u003e除去这些作为云原生基座的技术之外,剩下的研究方向就是着眼于云原生自身的优势,问题和需求了。比如有如下这几点:\u003c/p\u003e\u003col\u003e\u003cli\u003e云原生安全\u003c/li\u003e\u003cli\u003e多模型数据库和存储\u003c/li\u003e\u003cli\u003e中间件技术\u003c/li\u003e\u003cli\u003e云原生应用架构设计模式\u003c/li\u003e\u003cli\u003e云原生生态系统的集成和互操作性\u003c/li\u003e\u003cli\u003e云原生技术标准化和规范\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e这些是目前几个比较流行的研究方向,总结起来,他们在研究的就是如何提高架构的可靠性,提高云原生架构本身的性能和资源利用率,如何让新的软件能最大化利用云原生架构的优势,如何设计云原生架构的规范,以及云原生的最佳实践这几点。当然,新的领域不可能全部套用老一套的方法论,一定还会有新的问题使得新的研究方向出现。\u003c/p\u003e\u003ch2 id=\"未来展望\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E6%9C%AA%E6%9D%A5%E5%B1%95%E6%9C%9B\" class=\"headerlink\" title=\"未来展望\"\u003e\u003c/a\u003e未来展望\u003c/h2\u003e\u003cp\u003e从历史来看,云原生的发展是随着软件工程的发展而出现的一种必然产物。在软件工业中,当人们面对过高的复杂度时,往往会借助新的抽象和设计去消除或者是转化、统一复杂度。云原生的出现,就是为了更好地解耦大规模软件系统,降低运维和部署的复杂度,让容器和集群等技术充当解决这些复杂度的工具来降低开发者的心智负担,以及运维的成本和难度。\u003c/p\u003e\u003cp\u003e放眼未来,受限于摩尔定律在物理上的失效,以及边缘计算的发展,同时网络基座进一步降低成本,提升质量,单体集群的算力达到顶峰,必然会导致算力走向分布式,并走向基数庞大的边缘设备集群。因此,云原生架构所要解决的问题还会长期存在,并且必然会随着未来的云拓展向边缘设备集群而变得更加复杂。届时,对于云原生架构的中间件必然会提出更高的要求,同时,云的定义发生扩展也会导致软件架构的设计出现新的,能更充分利用边缘设备集群算力等资源的软件架构设计范式的出现。所以,未来很长一段时间之内,云原生架构应该会成为软件工业体系内的一套最佳实践,对应的基础设施和中间件研发,以及对应软件生命周期在云原生上的实践也会在长期的实践中得到沉淀。但是,一旦云原生架构无法适应未来出现的平台/系统,或者安全性难以保障,亦或者是云原生也无法解决未来的软件工业的架构复杂性,那时可能就是云原生架构的谢幕之时吧。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/"},{"title":"函数式编程范式","time":"2023-12-11T14:00:41Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e对于大部分场合而言,优化不需要过早,到了需要优化的时候自然会意识到必要性。过早的优化只会带来负担。\u003c/p\u003e\u003cp\u003e最近JS写多了,都快不会写算法题了。其实不怪JS,只是绝大多数具体业务的实现一般很少需要用到什么重要算法。不过我遇到的问题是代码写烦了:这里写一坨那里写一坨,写一些忘一些,最后就成了一大坨,看着多但是实际功能并没多少。这让我想到了代码表达力的问题,于是我开始寻找方法去提高代码的表达力:写更少的代码,实现更多的功能。代码变得紧凑对于检查和维护来说也能降低一部分负担。\u003c/p\u003e\u003cp\u003e于是,我自然而然地正式接触到了函数式编程。对于当前的需求,这似乎就是答案。\u003c/p\u003e\u003ch2 id=\"介绍\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/functional-thinking/#%E4%BB%8B%E7%BB%8D\" class=\"headerlink\" title=\"介绍\"\u003e\u003c/a\u003e介绍\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e下面这段是我和LLM一块写的\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e函数式编程(Functional Programming)是一种编程范式,区别于命令式编程关注指令和操作,函数式编程更加关注函数本身,函数的组合、副作用,流程和代码可读性。函数作为一等公民,基本上可以在任何位置上出现。它关注函数的施用,而非具体操作的实现。这种编程风格强调将数据抽象为函数,将函数作为基本构建块来构建复杂的计算。函数式编程的优势包括:可读性、可维护性、可重用性等。\u003c/p\u003e\u003cp\u003e首先为啥叫函数式,因为函数就是核心,一切围绕函数展开。刚上手时,我对它的印象就是\u003c/p\u003e\u003cfigure class=\"highlight js\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003edata.\u003cspan class=\"title function_\"\u003emap\u003c/span\u003e(...).\u003cspan class=\"title function_\"\u003efilter\u003c/span\u003e(...).\u003cspan class=\"title function_\"\u003ereduce\u003c/span\u003e(...)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003edata.\u003cspan class=\"title function_\"\u003eforEach\u003c/span\u003e(...)\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e这样的。只用这几个函数对数据进行操作就能完成大部分数据操作,这对于处理各种返回值得到裁剪/过滤过的目标数据而言,十分高效简洁。在这两个例子里边,代码将数据处理作为一个流程对待,我们只需要描述\u003cstrong\u003e如何\u003c/strong\u003e处理这个数据源,以及处理的规则,其他的都无需我们参与。同样的需求,使用命令式编程,我们需要:\u003c/p\u003e\u003cfigure class=\"highlight js\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003elet\u003c/span\u003e processed=[]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efor\u003c/span\u003e(\u003cspan class=\"keyword\"\u003elet\u003c/span\u003e i=\u003cspan class=\"number\"\u003e0\u003c/span\u003e;i\u0026lt;data.\u003cspan class=\"property\"\u003elength\u003c/span\u003e;i++){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e (\u003cspan class=\"variable constant_\"\u003eMATCHING_COND\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e processed.\u003cspan class=\"title function_\"\u003epush\u003c/span\u003e(data[i])\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e为什么?因为上面的\u003ccode\u003emap\u003c/code\u003e,\u003ccode\u003ereduce\u003c/code\u003e,\u003ccode\u003efilter\u003c/code\u003e和\u003ccode\u003eforEach\u003c/code\u003e等都是高阶函数,它们可以被应用于数据源,接受一个函数作为参数,并使用函数处理数据。它们封装了常用的处理数据的流程,比如\u003ccode\u003emap\u003c/code\u003e会将数据的每一项使用传入的函数进行变换,并将它输出到新的数组中;\u003ccode\u003efilter\u003c/code\u003e会使用传入函数处理每一项,根据返回值是否为真将数据放入一个新的数组中并返回,等等。每一个高阶函数都是对于一个具体的数据处理流程的抽象描述,而这部分就是传统的命令式编程难以解决的问题——它们关注具体指令,你需要依靠具体的指令来解决你面对的问题,并自己编写具体的处理过程。\u003c/p\u003e\u003cp\u003e在上面传统的解决方法中,我们创建了变量\u003ccode\u003eprocessed\u003c/code\u003e,创建了用于循环的变量\u003ccode\u003ei\u003c/code\u003e,还使用了循环并规定了循环的结束条件,在循环体中规定了将结果加入循环的条件和流程。这些操作都在函数式操作中被抽象成了若干个高阶函数,我们无需再关心具体如何实现\u003ccode\u003emap\u003c/code\u003e和\u003ccode\u003efilter\u003c/code\u003e等操作,更不用自己去管理其中的状态(比如循环变量和用于保存中间处理结果的变量),实现了\u003cdel\u003e降本增效\u003c/del\u003e用少量代码完成常见需求,并减少了我们花费在状态管理(循环变量的创建,自增,临时变量的创建和改变等)和具体实现上的细节,而让我们只专注于和任务本身相关的部分。\u003c/p\u003e\u003cp\u003e并且,我们使用传递参数的方式将它们\u003cstrong\u003e组合\u003c/strong\u003e在一起,而非通过继承将它们\u003cstrong\u003e耦合\u003c/strong\u003e在一起。这一点意味着函数式编程降低了代码的耦合度,并且提高了代码的复用率:比起来面向对象按照类,通过继承进行复用,函数式编程将复用粒度降低到函数的级别,这也显著减少了无用代码。不过继承除了复用,还有规范和约束实现的作用。函数式编程如何解决这个问题我暂时还不太清楚。不过函数式编程,面向对象编程以及元编程,这三者属于是几乎正交的关系,所以完全可以交叉使用没啥问题。\u003c/p\u003e\u003cp\u003e另外还有一点上面的例子并没有表现出来,那就是关于副作用这一点。这个说法应该和不可变这一点放在一起来讲:上面的循环变量\u003ccode\u003ei\u003c/code\u003e就是一个可变的变量,循环的副作用就是改变了这个变量的值。再比如C指针的经典例子:通过\u003ccode\u003eswap\u003c/code\u003e交换两个变量的值,这就是一个典型的有副作用的函数,它改变了传入参数的值。函数式编程之所以排斥这样做,就是因为它在尽量避免函数的副作用,试图将所有函数变为纯函数:函数的执行结果只依赖于输入的值,而和外部状态无关,并且不改变外部的状态。它借此消除副作用带来的不确定性。而数据的不可变是它消除不确定性的另一个方法,这里就是函数式编程的精髓了:没有可变变量要怎么迭代/处理数据?不用迭代了,用递归就行。使用递归也提供了另一个观察问题的方式,比如对上面的迭代筛选例子,我们就可以用递归来改写,从而避免使用循环变量\u003ccode\u003ei\u003c/code\u003e:\u003c/p\u003e\u003cfigure class=\"highlight js\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003elet\u003c/span\u003e processed=[]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003econst\u003c/span\u003e \u003cspan class=\"title function_\"\u003eiter\u003c/span\u003e=(\u003cspan class=\"params\"\u003edata\u003c/span\u003e) =\u0026gt; {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(data.\u003cspan class=\"property\"\u003elength\u003c/span\u003e==\u003cspan class=\"number\"\u003e0\u003c/span\u003e) \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eelse\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(data[\u003cspan class=\"number\"\u003e0\u003c/span\u003e] \u003cspan class=\"variable constant_\"\u003eMATCHES_COND\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e data[\u003cspan class=\"number\"\u003e0\u003c/span\u003e] + \u003cspan class=\"title function_\"\u003eiter\u003c/span\u003e(data[\u003cspan class=\"number\"\u003e1\u003c/span\u003e:]);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"title function_\"\u003eiter\u003c/span\u003e(data[\u003cspan class=\"number\"\u003e1\u003c/span\u003e:])\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e }\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面的代码没用任何可变变量,也完成了数据源的筛选。虽然初次接触不太好想,但是解决大部分问题时,另一种视角确实有时会有意想不到的便利。以及不可变变量的好处也挺多的,比如天然没有竞争和并发问题。\u003c/p\u003e\u003cp\u003e另外关于递归的性能问题,用尾递归可以在受到递归优化的编程语言中得到不输迭代的性能。比如经典的斐波那契数列计算函数,就可以通过尾递归的写法结合语言的优化,达到和迭代写法基本一致的性能。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e下边这例子是LLM写的,暂时没验证\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure class=\"highlight javascript\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e27\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 定义一个高阶函数,用于计算两个数的和\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"title function_\"\u003esum\u003c/span\u003e(\u003cspan class=\"params\"\u003ea, b\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e a + b;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 使用高阶函数组合两个函数,用于计算两个数的和\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"title function_\"\u003ecalculator\u003c/span\u003e(\u003cspan class=\"params\"\u003e\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e sum;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 调用高阶函数组合器,并传入两个数字作为参数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003econst\u003c/span\u003e add = \u003cspan class=\"title function_\"\u003ecalculator\u003c/span\u003e();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 调用高阶函数组合器,并传入两个数字作为参数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003econst\u003c/span\u003e subtract = \u003cspan class=\"title function_\"\u003ecalculator\u003c/span\u003e(\u003cspan class=\"function\"\u003e\u003cspan class=\"params\"\u003ea\u003c/span\u003e =\u0026gt;\u003c/span\u003e a - b);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 调用高阶函数组合器,并传入两个数字作为参数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003econst\u003c/span\u003e multiply = \u003cspan class=\"title function_\"\u003ecalculator\u003c/span\u003e(\u003cspan class=\"function\"\u003e\u003cspan class=\"params\"\u003ea\u003c/span\u003e =\u0026gt;\u003c/span\u003e a * b);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 调用高阶函数组合器,并传入两个数字作为参数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003econst\u003c/span\u003e divide = \u003cspan class=\"title function_\"\u003ecalculator\u003c/span\u003e(\u003cspan class=\"function\"\u003e\u003cspan class=\"params\"\u003ea\u003c/span\u003e =\u0026gt;\u003c/span\u003e a / b);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 测试计算器函数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"variable language_\"\u003econsole\u003c/span\u003e.\u003cspan class=\"title function_\"\u003elog\u003c/span\u003e(\u003cspan class=\"title function_\"\u003eadd\u003c/span\u003e(\u003cspan class=\"number\"\u003e2\u003c/span\u003e, \u003cspan class=\"number\"\u003e3\u003c/span\u003e)); \u003cspan class=\"comment\"\u003e// 输出 5\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"variable language_\"\u003econsole\u003c/span\u003e.\u003cspan class=\"title function_\"\u003elog\u003c/span\u003e(\u003cspan class=\"title function_\"\u003esubtract\u003c/span\u003e(\u003cspan class=\"number\"\u003e5\u003c/span\u003e, \u003cspan class=\"number\"\u003e2\u003c/span\u003e)); \u003cspan class=\"comment\"\u003e// 输出 3\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"variable language_\"\u003econsole\u003c/span\u003e.\u003cspan class=\"title function_\"\u003elog\u003c/span\u003e(\u003cspan class=\"title function_\"\u003emultiply\u003c/span\u003e(\u003cspan class=\"number\"\u003e2\u003c/span\u003e, \u003cspan class=\"number\"\u003e3\u003c/span\u003e)); \u003cspan class=\"comment\"\u003e// 输出 6\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"variable language_\"\u003econsole\u003c/span\u003e.\u003cspan class=\"title function_\"\u003elog\u003c/span\u003e(\u003cspan class=\"title function_\"\u003edivide\u003c/span\u003e(\u003cspan class=\"number\"\u003e10\u003c/span\u003e, \u003cspan class=\"number\"\u003e2\u003c/span\u003e)); \u003cspan class=\"comment\"\u003e// 输出 5\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"组合\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/functional-thinking/#%E7%BB%84%E5%90%88\" class=\"headerlink\" title=\"组合\"\u003e\u003c/a\u003e组合\u003c/h2\u003e\u003cp\u003e组合和继承,都是复用代码的重要手段。组合简洁,继承稍微冗杂一些。\u003c/p\u003e\u003cp\u003e组合的概念就是将一些现有的单元组合到一起,形成新的工具去解决具体问题,而组合这个动作的适用对象就不止是函数那么简单了。它可以是函数的组合,可以是类型的组合,也可以是状态和函数的组合。\u003c/p\u003e\u003cp\u003e借\u003cdel\u003e从某大佬那里偷来的\u003c/del\u003e一个说法,大多数新的语法结构就是让人们更合理地去使用固定范式的GOTO,而Algebraic Effect就是其中最合理\u003cdel\u003e那个佬最推崇\u003c/del\u003e的一个。从我的视角看来,主流编程语言的演进都是朝着可读可写且尽可能兼顾效率的方向发展的。在这个过程中,损失的一部分就是语言的”Tricks”,或者说是语言的灵活性/可能性等。比如GOTO受到的接连削弱,它从一个十分灵活的结构变成了一堆固定但是更理智的语法结构,以一部分灵活性为代价换取了语言的可读性,以此提升可维护性。\u003c/p\u003e\u003cp\u003e组合呢?组合也是一种对于GOTO的封装。甚至更底层的,汇编中的GOTO,(部分)也就是jmp,它在汇编中也有对应的封装:子程序。而这些说法,对于指针这个原始的内存模型中的概念同样适用。封装提高了可读性,限制GOTO的直接使用限制了代码的可写性。二者的矛盾在足够优秀的语法结构出现前基本上是一对难以调和的矛盾。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/12/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/functional-thinking/"},{"title":"winget换源","time":"2023-12-09T12:35:48Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e\u003ca href=\"https://unicom.mirrors.ustc.edu.cn/help/winget-source.html\"\u003ewinget 是 Windows 的一个包管理器,可以用来安装、卸载、更新和搜索软件。winget 默认使用的是 Microsoft Store 的源,但是也可以换成其他的源,比如中科大的源。\u003c/a\u003e\u003ca href=\"https://unicom.mirrors.ustc.edu.cn/help/winget-source.html\"\u003e1\u003c/a\u003e\u003ca href=\"https://www.zhihu.com/question/509903409\"\u003e2\u003c/a\u003e\u003c/p\u003e\u003cp\u003e如果您想换源,您需要以管理员身份运行终端,然后使用以下命令:\u003c/p\u003e\u003cul\u003e\u003cli\u003e删除默认的源:\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003ewinget \u003cspan class=\"built_in\"\u003esource\u003c/span\u003e remove winget\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e添加中科大的源:\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003ewinget \u003cspan class=\"built_in\"\u003esource\u003c/span\u003e add winget https://mirrors.ustc.edu.cn/winget-source\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e重置为官方的源:\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003ewinget \u003cspan class=\"built_in\"\u003esource\u003c/span\u003e reset winget\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e\u003ca href=\"https://unicom.mirrors.ustc.edu.cn/help/winget-source.html\"\u003e\u003c/a\u003e\u003ca href=\"https://unicom.mirrors.ustc.edu.cn/help/winget-source.html\"\u003e1\u003c/a\u003e\u003ca href=\"https://unicom.mirrors.ustc.edu.cn/help/winget-source.html\"\u003e: WinGet 源使用帮助 — USTC Mirror Help 文档\u003c/a\u003e \u003ca href=\"https://www.zhihu.com/question/509903409\"\u003e2\u003c/a\u003e: winget是否可以用国内镜像? - 知乎\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/12/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/winget/"},{"title":"pandoc初窥","time":"2023-12-09T12:10:50Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003epandoc 是一个使用 Haskell 语言编写的一款跨平台、自由开源及命令行界面的标记语言转换工具,可实现不同标记语言间的格式转换,堪称该领域中的“瑞士军刀。pandoc 支持的输入和输出格式范围广泛,包括但不限于 Markdown、HTML、DOCX、PDF、LaTeX、EPUB 等。\u003c/p\u003e\u003cp\u003epandoc 不是 python 的库,但是有一个 python 的封装,叫做 pypandoc,可以在 python 代码中调用 pandoc 的功能。pypandoc 可以使用 pip 命令安装,例如:\u003c/p\u003e\u003cfigure class=\"highlight python\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003epip install pypandoc\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003epandoc 的日常用法主要是通过命令行来转换文档,例如:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003epandoc input.md -o output.html\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e这个命令就是将 input.md 这个 Markdown 文件转换为 output.html 这个 HTML 文件。pandoc 还有很多其他的选项和参数,可以参考 pandoc 的文档。\u003c/p\u003e\u003cp\u003epandoc 也可以在 python 代码中使用 pypandoc 来转换文档,例如:\u003c/p\u003e\u003cfigure class=\"highlight python\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eimport\u003c/span\u003e pypandoc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eoutput = pypandoc.convert_file(\u003cspan class=\"string\"\u003e\u0026#39;input.md\u0026#39;\u003c/span\u003e, \u003cspan class=\"string\"\u003e\u0026#39;html\u0026#39;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eprint\u003c/span\u003e(output)\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e这段代码就是将 input.md 这个 Markdown 文件转换为 HTML 字符串,并打印出来。pypandoc 还有其他的方法和参数,可以参考 pypandoc 的\u003ca href=\"https://blog.csdn.net/VN520/article/details/129120364\"\u003e文档\u003c/a\u003e。\u003c/p\u003e\u003cp\u003epandoc 是一个非常强大和灵活的文档转换工具,可以帮助你在不同的文档格式之间进行转换,特别是对于 Markdown 这种简洁易用的标记语言,可以轻松地生成 PDF、电子书、幻灯片等多种形式的文档。\u003c/p\u003e\u003ch2 id=\"格式转换\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/pandoc_note/#%E6%A0%BC%E5%BC%8F%E8%BD%AC%E6%8D%A2\" class=\"headerlink\" title=\"格式转换\"\u003e\u003c/a\u003e格式转换\u003c/h2\u003e\u003cp\u003e刚好今天得提交个Word报告,但是写东西我还是喜欢Vim,于是就打算写完转换成Word。正打算手动转换/网页在线转换的时候想起来了这个玩意——\u003c/p\u003e\u003cp\u003e然后就一行秒了。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003epandoc -o $(OUTPUT) -f markdown -t docx $(MARKDOWN) \u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e我直接从Makefile里摘出来的。用Makefile的话,写完敲个make就行。\u003c/p\u003e\u003cp\u003e最让我吃惊的是这玩意速度奇快,转换个快4000字的Markdown到Word,几乎跟我echo个字符串一样快,这还是我在7代intel移动端平台上测试的(?A?)\u003c/p\u003e\u003cul\u003e\u003cli\u003eMarkdown转Tex,速度也很快\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003epandoc -w latex ./test.md -o test.tex\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/12/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/pandoc_note/"},{"title":"计算机视觉学习笔记","time":"2023-11-06T12:02:29Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e之前导论课程上学的基本都是思想和原理,到这里就开始接触真正数学和工程的方法了。\u003c/p\u003e\u003ch2 id=\"序\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%BA%8F\" class=\"headerlink\" title=\"序\"\u003e\u003c/a\u003e序\u003c/h2\u003e\u003cp\u003e这门课的研究思路很清晰,就是围绕标题,自底向上,借助数学工具,一步一步实现各种复杂的功能以及算法,最终一步步接近让计算机拥有“视觉”的目标。\u003c/p\u003e\u003cp\u003e首先是数据的表示,概念的抽象,如何用离散的数据去近似抽象的视觉这个概念。这个过程通过直观理解和数学工具,以及建模方法,为计算机视觉提供了一种可行的数学上的表示和运算方法:像素,以及基于像素的一系列运算,比如滤波,仿射变换,更高自由度的变换,基于像素颜色值的变换等等,以及由这一系列变换得到的图像特征。\u003c/p\u003e\u003cp\u003e其次,是研究在图像的像素模型下,利用数学方法去研究分析以及利用图像特征的方法。这其中,就有诸如角点检测,边缘检测,全景图拼接以及处理等命题。\u003c/p\u003e\u003ch2 id=\"生成对抗网络GAN\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%94%9F%E6%88%90%E5%AF%B9%E6%8A%97%E7%BD%91%E7%BB%9CGAN\" class=\"headerlink\" title=\"生成对抗网络GAN\"\u003e\u003c/a\u003e生成对抗网络GAN\u003c/h2\u003e\u003cp\u003e通俗来说就是让两个网络作为对抗组,比如说生成图片的NN和鉴别图片的NN,两方轮流作为输入输出(也就是交替训练),在循环中不断提升两个网络的效果,最终达到生成内容以假乱真的效果。NN炼丹的关键是其中的loss函数设计,不过他们的做法是直接用另一个NN作为这个NN的loss函数来回馈训练效果。\u003c/p\u003e\u003cp\u003e目前比较突出的成果一个就是近几年的Stable Diffusion,算是这里边比较突出的一个了。这东西在图像的有损压缩里边用的也多,至于有损压缩的应用嘛,一般在一些需要使用算力去换带宽的场合很适用,比如卫星数据传输。其他应用就是图像的填充和补全,比如合理推测图像的缺失部分内容。另外就是,网络的输入不一定是噪声,输出也不一定是真假。改变其输入和输出的类型,可以赋予NN以不少是实用场景。\u003c/p\u003e\u003cp\u003eGAN的优点是效果好,比以前用的高斯模糊的效果都很好。但是问题也很突出,就是GAN很难训练。GAN的两方是生成器和判别器,训练的结果很大程度上与两方的能力是否足够接近有很大关系。\u003c/p\u003e\u003cp\u003e另外就是GAN的思想重点在对抗,并没有要求其他的条件。所以比如说可以有多个判别方,有多个生成方等。\u003c/p\u003e\u003ch2 id=\"Attention-Is-All-You-Need\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#Attention-Is-All-You-Need\" class=\"headerlink\" title=\"Attention Is All You Need\"\u003e\u003c/a\u003eAttention Is All You Need\u003c/h2\u003e\u003cp\u003e注意力机制一开始是应用于机器翻译领域,通过一个合适的重点词语权重标注机制,让算法更有重点地提取概要。如今的GPT也很大程度上受到注意力机制的启发才产生了不断预测下一个词向量概率的朴素思想。\u003c/p\u003e\u003cp\u003e注意力机制可以理解成给分词加上权重。将一个句子进行分词作为一个向量,将这个词语向量通过Softmax这样的激活函数进行处理之后,再借助矩阵进行变换,从而得到处理后的,带有权重的词向量。处理后的词向量,权重总和为1。加权后的句子,再进行翻译,效果就会好很多了。\u003c/p\u003e\u003cp\u003e至于将Attention思想迁移到CV领域进行应用的方法,关键是将图像”语义化“。一个常用的方法是将图像分割,分割成小块,对每个小块采用相同的思想。这就是VIT(Vision Transformer)的思想。\u003c/p\u003e\u003ch2 id=\"激活函数\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E6%BF%80%E6%B4%BB%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"激活函数\"\u003e\u003c/a\u003e激活函数\u003c/h2\u003e\u003ch3 id=\"Softmax\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#Softmax\" class=\"headerlink\" title=\"Softmax\"\u003e\u003c/a\u003eSoftmax\u003c/h3\u003e\u003cp\u003eSoftmax函数是一种常用的激活函数,主要用于将多分类问题中的输出值转换为概率分布。在神经网络中,输出层通常使用softmax函数,将输出值转换为每个类别概率。\u003c/p\u003e\u003cp\u003eSoftmax函数的定义如下:\u003cbr/\u003e$$\u003cbr/\u003eSoftmax(x) = e^(x_i) / (e^(x_1) + e^(x_2) + … + e^(x_n))\u003cbr/\u003e$$\u003cbr/\u003e其中,x是一个K维向量,Softmax函数的输出也是一个K维向量,并且每个元素的范围都在0到1之间,并且所有元素的和为1。\u003c/p\u003e\u003cp\u003e在多分类问题中,假设输出层有K个神经元,每个神经元代表一个类别。Softmax函数的作用是将输出层的输出转换为每个类别对应的概率。例如,如果输出层输出为[1.2, 2.3, 3.1],则对应的概率为[0.21, 0.34, 0.45]。\u003c/p\u003e\u003cp\u003eSoftmax函数可以解决输出值非常大的问题,因为它可以防止输出值过大而导致的梯度消失或梯度爆炸。此外,Softmax函数还可以进行归一化,使得概率和为1,使得概率分布更加合理。\u003c/p\u003e\u003ch2 id=\"期末划重点咯\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E6%9C%9F%E6%9C%AB%E5%88%92%E9%87%8D%E7%82%B9%E5%92%AF\" class=\"headerlink\" title=\"期末划重点咯\"\u003e\u003c/a\u003e期末划重点咯\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e\u003ccode\u003esudo 老师给我分\u003c/code\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e有个压缩包,里边画红钩的都是重点\u003c/p\u003e\u003cp\u003e占比大概NN和传统方法4-6开\u003c/p\u003e\u003cul\u003e\u003cli\u003eChap 1 没啥重点\u003cul\u003e\u003cli\u003e什么是光, 可见光谱的范围这些的\u003c/li\u003e\u003cli\u003e人的视觉系统这些概念啥的\u003c/li\u003e\u003cli\u003e三色光的相关内容\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 3 重点\u003cul\u003e\u003cli\u003e灰度图(取值范围),RGB\u003c/li\u003e\u003cli\u003e图像两种基本运算\u003c/li\u003e\u003cli\u003e矩阵的运算\u003c/li\u003e\u003cli\u003e滤波概念,高斯滤波\u003c/li\u003e\u003cli\u003e卷积,点乘积,性质,计算过程strike, padding计算结果图像尺寸这些的\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 4 边缘检测\u003cul\u003e\u003cli\u003e边缘定义,为啥是边缘\u003c/li\u003e\u003cli\u003e图像的梯度\u003c/li\u003e\u003cli\u003e噪声\u003c/li\u003e\u003cli\u003e边缘检测器:sobel算子,roberts算子,prewwit算子等\u003c/li\u003e\u003cli\u003e边缘存在的问题:噪声,拟合等\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 6 图像插值\u003cul\u003e\u003cli\u003e线性插值,上下采样等,高斯金字塔\u003c/li\u003e\u003cli\u003e图像放大的插值算法(超分)\u003cul\u003e\u003cli\u003e最近邻,双线性,三次插值。不过现在都用GNN做超分了\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap ? 特征匹配\u003cul\u003e\u003cli\u003e典型特征匹配计算方法\u003c/li\u003e\u003cli\u003e特征和特真不变性:啥特征的啥不变性 SIFT特征\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 7 图像变换\u003cul\u003e\u003cli\u003e几种变换方式\u003c/li\u003e\u003cli\u003e线性变换:变灰度,变尺度等\u003c/li\u003e\u003cli\u003e按照变换剧烈程度递增:平移,旋转,仿射,投影\u003c/li\u003e\u003cli\u003e得记得变换矩阵的特征,大概得看明白\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 8 图像配准 没啥讲的\u003c/li\u003e\u003cli\u003eChap 11 单视图建模\u003cul\u003e\u003cli\u003e消失线和消失点等 得会计算\u003c/li\u003e\u003c/ul\u003e\u003cul\u003e\u003cli\u003e双试图立体视觉:视差和深度计算\u003c/li\u003e\u003cli\u003e窗口配准\u003c/li\u003e\u003cli\u003e极点极线极面\u003c/li\u003e\u003cli\u003e本质矩阵,基本矩阵是谁到谁的映射\u003c/li\u003e\u003cli\u003e深度估计\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 14 图像三维重建\u003cul\u003e\u003cli\u003e一个相机转着拍 内参矩阵不变,为了配窗\u003c/li\u003e\u003cli\u003e重复的问题\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 16 机器视觉\u003cul\u003e\u003cli\u003e激活函数和矩阵计算\u003c/li\u003e\u003cli\u003e神经网络结构\u003c/li\u003e\u003cli\u003e卷积网络的池化操作\u003c/li\u003e\u003c/ul\u003e\u003cul\u003e\u003cli\u003e反向传播:对w求导而非对x求导,而且得会算反向传播函数\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 18 图像分割\u003cul\u003e\u003cli\u003e语义分割和实例分割\u003c/li\u003e\u003cli\u003e分割手段:边缘检测,聚类等方法\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 19 目标检测与分类\u003cul\u003e\u003cli\u003e输出:中心型,边界型\u003c/li\u003e\u003cli\u003e两个方法:两步法,一步法(Yolo)\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 21 实操\u003cul\u003e\u003cli\u003e玩玩pytorch\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 23 神经网络前沿\u003cul\u003e\u003cli\u003eGAN\u003c/li\u003e\u003cli\u003eAttention(q,k,v)\u003cul\u003e\u003cli\u003eSoftmax\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"计算机视觉复习\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%A4%8D%E4%B9%A0\" class=\"headerlink\" title=\"计算机视觉复习\"\u003e\u003c/a\u003e计算机视觉复习\u003c/h2\u003e\u003cp\u003e找到一个学长的复习笔记如下\u003c/p\u003e\u003ch3 id=\"图像和图像滤波\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%9B%BE%E5%83%8F%E5%92%8C%E5%9B%BE%E5%83%8F%E6%BB%A4%E6%B3%A2\" class=\"headerlink\" title=\"图像和图像滤波\"\u003e\u003c/a\u003e图像和图像滤波\u003c/h3\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e什么是滤波\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e形成一个新的图像,其像素是原始像素的组合\u003c/p\u003e\u003c/blockquote\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e什么时候利用滤波\u003c/p\u003e\u003cul\u003e\u003cli\u003e==\u003cstrong\u003e增强图像:\u003c/strong\u003e== 降噪、锐化\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e==提取信息:==\u003c/strong\u003e 提取边缘或轮廓\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e滤波的种类:\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e线性滤波:用相邻的线性组合 (加权和)替换每个像素\u003c/p\u003e\u003cul\u003e\u003cli\u003e线性组合的系数称为权重核\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e卷积:\u003c/strong\u003e(权重核反转(水平和垂直))\u003cbr/\u003e$$\u003cbr/\u003eG [ i , j ] = \\sum _ { u = - k } ^ { k } \\sum _ { v = - k } ^ { k } H [ u , v ] F [ i - u , j - v ]\u003cbr/\u003e$$\u003cbr/\u003e记为\u003cbr/\u003e$$\u003cbr/\u003eG=H*F\u003cbr/\u003e$$\u003cbr/\u003e\u003cstrong\u003e相关:\u003c/strong\u003e\u003cbr/\u003e$$\u003cbr/\u003eG [ i , j ] = \\sum _ { u = - k } ^ { k } \\sum _ { v = - k } ^ { k } H [ u , v ] F [ i + u , j + v ]\u003cbr/\u003e$$\u003cbr/\u003e记为:\u003cbr/\u003e$$\u003cbr/\u003eG = H \\otimes F\u003cbr/\u003e$$\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e高斯滤波\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e==从图像中删除 「高频」分量 (低通滤波器)==\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e==高斯核函数==:\u003cbr/\u003e$$\u003cbr/\u003eG _ { \\sigma } = \\frac { 1 } { 2 \\pi \\sigma ^ { 2 } } e ^ { - \\frac { \\left( x ^ { 2 } + y ^ { 2 } \\right) } { 2 \\sigma ^ { 2 } } }\u003cbr/\u003e$$\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e滤波的应用\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e锐化滤波器:\u003cbr/\u003e$$\u003cbr/\u003eF + \\alpha (F-F*H)\u003cbr/\u003e$$\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e阈值滤波器\u003cbr/\u003e$$\u003cbr/\u003eg ( m , n ) = \\left{ \\begin{array} { c c } { 255 , } \u0026amp; { f ( m , n ) \u0026gt; A } \\ { 0 } \u0026amp; { \\text { otherwise } } \\end{array} \\right.\u003cbr/\u003e$$\u003cbr/\u003e==阈值滤波器不是线性滤波==\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e相关和卷积的定义和关系\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e高斯核\u003c/p\u003e\u003cul\u003e\u003cli\u003e调节哪个参数\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e什么是线性滤波器\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e去燥使用什么滤波\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"边缘检测\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%BE%B9%E7%BC%98%E6%A3%80%E6%B5%8B\" class=\"headerlink\" title=\"边缘检测\"\u003e\u003c/a\u003e边缘检测\u003c/h3\u003e\u003ch4 id=\"边缘的特征\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%BE%B9%E7%BC%98%E7%9A%84%E7%89%B9%E5%BE%81\" class=\"headerlink\" title=\"边缘的特征\"\u003e\u003c/a\u003e边缘的特征\u003c/h4\u003e\u003cblockquote\u003e\u003cp\u003e怎样通过导数来反映边缘\u003c/p\u003e\u003c/blockquote\u003e\u003cul\u003e\u003cli\u003e==对于图像强度的一阶导数,边缘对应于导数的极值==\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e如何计算数字图像的导数?\u003c/strong\u003e\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e重建连续图像,然后计算导数\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e采用离散导数(有限差分): ==图像的梯度相当于两个相邻像素之间的差值==\u003cbr/\u003e$$\u003cbr/\u003e\\frac { \\partial f } { \\partial x } [ x , y ] \\approx F [ x + 1 , y ] - F [ x , y ]\u003cbr/\u003e$$\u003cbr/\u003e可以使用线性滤波器实现\u003c/p\u003e\u003cp\u003e==梯度的方向 \u003cstrong\u003e垂直于边缘的方向\u003c/strong\u003e==,梯度的方向是 图像函数 f(x,y) 变化最快的方向,当图像中存在边缘时,一定有较大的梯度\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"图像梯度\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%9B%BE%E5%83%8F%E6%A2%AF%E5%BA%A6\" class=\"headerlink\" title=\"图像梯度\"\u003e\u003c/a\u003e图像梯度\u003c/h4\u003e\u003cp\u003e图像梯度是图像函数在 x ,y 两个方向的导数,\u003c/p\u003e\u003cp\u003e幅值:\u003cbr/\u003e$$\u003cbr/\u003e| \\nabla f | = \\sqrt { \\left( \\frac { \\partial f } { \\partial x } \\right) ^ { 2 } + \\left( \\frac { \\partial f } { \\partial y } \\right) ^ { 2 } }\u003cbr/\u003e$$\u003cbr/\u003e方向:\u003cbr/\u003e$$\u003cbr/\u003e\\theta = \\tan ^ { - 1 } \\left( \\frac { \\partial f } { \\partial y } / \\frac { \\partial f } { \\partial x } \\right)\u003cbr/\u003e$$\u003cbr/\u003e\u003cstrong\u003e==要计算图像梯度,首先要图像去噪,使用高斯核在图像上卷积,平滑图像==\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e可以将两次滤波 (高斯滤波、差分滤波)合成一步实现\u003c/p\u003e\u003cp\u003e\u003cimg src=\"http://media.sumblog.cn/blog/20190102/XhVYP5it42Yb.png?imageslim\" alt=\"mark\"/\u003e\u003c/p\u003e\u003ch5 id=\"二维边缘检测使用的图像算子:\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E4%BA%8C%E7%BB%B4%E8%BE%B9%E7%BC%98%E6%A3%80%E6%B5%8B%E4%BD%BF%E7%94%A8%E7%9A%84%E5%9B%BE%E5%83%8F%E7%AE%97%E5%AD%90%EF%BC%9A\" class=\"headerlink\" title=\"二维边缘检测使用的图像算子:\"\u003e\u003c/a\u003e二维边缘检测使用的图像算子:\u003c/h5\u003e\u003col\u003e\u003cli\u003e\u003cp\u003eSobel 算子\u003c/p\u003e\u003cp\u003e\u003cimg src=\"http://media.sumblog.cn/blog/20190102/PIUiMGyShLVT.png?imageslim\" alt=\"mark\"/\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"非最大抑制\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E9%9D%9E%E6%9C%80%E5%A4%A7%E6%8A%91%E5%88%B6\" class=\"headerlink\" title=\"非最大抑制\"\u003e\u003c/a\u003e非最大抑制\u003c/h4\u003e\u003cp\u003e检查像素是否为\u003cstrong\u003e沿梯度方向的局部最大值\u003c/strong\u003e (需要进行像素差值?)\u003c/p\u003e\u003col start=\"2\"\u003e\u003cli\u003e\u003cp\u003e==Canny 边缘检测器==\u003c/p\u003e\u003col\u003e\u003cli\u003e用高斯导数滤波\u003c/li\u003e\u003cli\u003e获得梯度的幅值和方向\u003c/li\u003e\u003cli\u003e非最大抑制\u003c/li\u003e\u003cli\u003e连接与滞后阈值化:\u003cul\u003e\u003cli\u003e定义高低两个阈值\u003c/li\u003e\u003cli\u003e用==高阈值来寻找边缘曲线的起点,用低阈值来确定后继点==,进行连接\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cstrong\u003eCanny 边缘检测器的参数:\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e$\\sigma:$ 高斯模糊的宽度:大的 $\\sigma$ 可以检测大尺度边缘,$\\sigma$ ==越小,能检测到的细微边缘就越多==\u003c/li\u003e\u003cli\u003e高阈值\u003c/li\u003e\u003cli\u003e低阈值\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e图像的导数\u003c/li\u003e\u003cli\u003e图像的梯度是什么 (两个方向的导数)(复制和方向)\u003c/li\u003e\u003cli\u003e去噪\u003c/li\u003e\u003cli\u003e二维边缘检测\u003cul\u003e\u003cli\u003e列举几个图像算子\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e费最大值抑制\u003c/li\u003e\u003cli\u003e边缘检测器\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"图像的插值和重采样\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%9B%BE%E5%83%8F%E7%9A%84%E6%8F%92%E5%80%BC%E5%92%8C%E9%87%8D%E9%87%87%E6%A0%B7\" class=\"headerlink\" title=\"图像的插值和重采样\"\u003e\u003c/a\u003e图像的插值和重采样\u003c/h3\u003e\u003ch4 id=\"图像采样\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%9B%BE%E5%83%8F%E9%87%87%E6%A0%B7\" class=\"headerlink\" title=\"图像采样\"\u003e\u003c/a\u003e图像采样\u003c/h4\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e采样率\u003c/p\u003e\u003cp\u003e==\u003cstrong\u003e奈奎斯特采样率:\u003c/strong\u003e 采样率 \u0026gt;= 2*图像中的最大频率==\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e若原始图像的频率过高,先对图像滤波,然后子采样\u003c/strong\u003e,构建高斯金字塔\u003c/p\u003e\u003ch4 id=\"图像插值\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%9B%BE%E5%83%8F%E6%8F%92%E5%80%BC\" class=\"headerlink\" title=\"图像插值\"\u003e\u003c/a\u003e图像插值\u003c/h4\u003e\u003cul\u003e\u003cli\u003e最近邻差值:重复 n 次\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e双线性插值\u003c/strong\u003e: 利用输入图像中与输出图像像素点映射位置最邻近的4个像素点的颜色值(或灰度值)计算输出图像中像素点的颜色值(或灰度值)\u003c/li\u003e\u003cli\u003e双三次插值:为了得到更精确的(x’,y’)的颜色值(或灰度值)g(x’,y’),就不仅需要考虑与(x’,y’)点最邻近的四个点对它的影响,还要考虑到该点周围16个相邻点的颜色值(或灰度值)对它的影响。\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"角点检测\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%A7%92%E7%82%B9%E6%A3%80%E6%B5%8B\" class=\"headerlink\" title=\"角点检测\"\u003e\u003c/a\u003e角点检测\u003c/h3\u003e\u003cp\u003eHarris 角点检测:将窗口平移,比较平移前后 w 内每个像素的差异平方和(SSD)\u003cbr/\u003e$$\u003cbr/\u003eE ( u , v ) = \\sum _ { ( x , y ) \\in W } [ I ( x + u , y + v ) - I ( x , y ) ] ^ { 2 }\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003e\\begin{aligned} E ( u , v ) = \u0026amp; \\sum _ { ( x , y ) \\in W } [ I ( x + u , y + v ) - I ( x , y ) ] ^ { 2 } \\ \\approx \u0026amp; \\sum _ { ( x , y ) \\in W } \\left[ I ( x , y ) + I _ { x } u + I _ { y } v - I ( x , y ) \\right] ^ { 2 } \\ \\approx \u0026amp; \\sum _ { ( x , y ) \\in W } \\left[ I _ { x } u + I _ { y } v \\right] ^ { 2 }\\ \\approx Au^2+2Buv +Cv^2\\ \\end{aligned}\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003eA = \\sum _ { ( x , y ) \\in W } I _ { x } ^ { 2 } \\quad B = \\sum _ { ( x , y ) \\in W } I _ { x } I _ { y } \\quad C = \\sum _ { ( x , y ) \\in W } I _ { y } ^ { 2 }\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e算法实现:\u003c/strong\u003e\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e计算图像在 X, Y 两个方向的梯度\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e计算两个方向上梯度的乘积\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e使用高斯函数对 $I_x^2,I_y^2,I_xI_y$ 进行高斯加权,生成矩阵的元素 A,B,C\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e计算每个像素的 Harris 响应值 R, 并对小于某个阈值的 R 置 0\u003cbr/\u003e$$\u003cbr/\u003eR = \\left{ R : \\operatorname { det } M - \\alpha ( \\operatorname { trace } M ) ^ { 2 } \u0026lt; t \\right}\u003cbr/\u003e$$\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e在邻域内进行非最大抑制,局部最大值即为图像的角点\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"特征不变性\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%89%B9%E5%BE%81%E4%B8%8D%E5%8F%98%E6%80%A7\" class=\"headerlink\" title=\"特征不变性\"\u003e\u003c/a\u003e特征不变性\u003c/h3\u003e\u003cp\u003e我们希望角点的位置对光度变换具有不变性 (图像变换之后,角点位置不变),对几何变换具有协变性 (相应位置检测到同一特征)\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e不变性:\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e对平移、旋转协变\u003c/li\u003e\u003cli\u003e对强度平移具有不变性,对强度缩放不具有不变性\u003c/li\u003e\u003cli\u003e对缩放不具有不变性\u003cul\u003e\u003cli\u003e需要同时在位置和尺度上查找:自动尺度选择\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e自动尺度选择:\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e在高斯金字塔中使用固定大小的窗口,寻找具有局部最大值的尺度\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e斑点检测:\u003c/strong\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e斑点是指二维图像中和周围颜色有颜色差异和灰度差异的区域,因为斑点代表的是一个区域,所以其相对于单纯的角点,具有更好的稳定性和更好的抗干扰能力.\u003c/p\u003e\u003c/blockquote\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e核函数:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e高斯拉普拉斯:\u003cbr/\u003e$$\u003cbr/\u003e\\nabla ^ { 2 } g = \\frac { \\partial ^ { 2 } g } { \\partial x ^ { 2 } } + \\frac { \\partial ^ { 2 } g } { \\partial y ^ { 2 } }\u003cbr/\u003e$$\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e高斯差分函数\u003cbr/\u003e$$\u003cbr/\u003eD o G = G ( x , y , k \\sigma ) - G ( x , y , \\sigma )\u003cbr/\u003e$$\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e当 $$\\sigma = r/\\sqrt{2}$$ 时,响应最大,图像黑白反向时,响应最小,因此将高斯拉普拉斯算子响应达到峰值的 $\\sigma$ 值,称为特征尺度\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e怎么实现特征的不变\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003eHarris 检测的步骤\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"特征描述与匹配\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%89%B9%E5%BE%81%E6%8F%8F%E8%BF%B0%E4%B8%8E%E5%8C%B9%E9%85%8D\" class=\"headerlink\" title=\"特征描述与匹配\"\u003e\u003c/a\u003e特征描述与匹配\u003c/h3\u003e\u003ch4 id=\"特征描述符\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%89%B9%E5%BE%81%E6%8F%8F%E8%BF%B0%E7%AC%A6\" class=\"headerlink\" title=\"特征描述符\"\u003e\u003c/a\u003e特征描述符\u003c/h4\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e\u003cstrong\u003eMOPS\u003c/strong\u003e:\u003c/p\u003e\u003col\u003e\u003cli\u003e选取特征点周围 40*40 的方形窗口\u003c/li\u003e\u003cli\u003e缩放到 1/5 大小\u003c/li\u003e\u003cli\u003e旋转特征向量方向到水平\u003c/li\u003e\u003cli\u003e在以特征为中心的 8*8 方形窗口内采样\u003c/li\u003e\u003cli\u003e规格化 (强度减去平均值,除以标准差,均值为0,方差为1)\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003cstrong\u003eSIFT:\u003c/strong\u003e尺度不变特征转换\u003c/p\u003e\u003cp\u003e\u003cimg src=\"http://media.sumblog.cn/blog/20190102/52PLX111WYbj.png?imageslim\" alt=\"mark\"/\u003e\u003c/p\u003e\u003col\u003e\u003cli\u003e在所检测的特征周围取 16*16 的窗口\u003c/li\u003e\u003cli\u003e为每个像素计算边缘方向\u003c/li\u003e\u003cli\u003e去除弱的边缘方向(设定阈值)\u003c/li\u003e\u003cli\u003e为剩余边缘方向建立直方图\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"特征匹配\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%89%B9%E5%BE%81%E5%8C%B9%E9%85%8D\" class=\"headerlink\" title=\"特征匹配\"\u003e\u003c/a\u003e特征匹配\u003c/h4\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e特征距离\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e更好的方法:距离比\u003c/p\u003e\u003cp\u003e$f_2$ 是 $f_1$ 在 $I_2$ 中最好的 SSD 匹配,$f_2^\\prime$ 次之\u003cbr/\u003e$$\u003cbr/\u003e距离比 = \\frac{||f_1-f_2||}{||f_1-f_2^\\prime||}\u003cbr/\u003e$$\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e测量特征匹配的性能\u003c/p\u003e\u003cul\u003e\u003cli\u003e真正例率(TPR) (召回率) = 匹配到的真正例数 / 所有真正例数\u003c/li\u003e\u003cli\u003e假正例率 (FPR) = 匹配到的假正例数/所有真正例数\u003c/li\u003e\u003cli\u003eROC 曲线:以 FPR 为横轴,TPR 为纵轴\u003c/li\u003e\u003cli\u003eAUC:曲线下的面积,越大越好\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"变换与卷绕\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%8F%98%E6%8D%A2%E4%B8%8E%E5%8D%B7%E7%BB%95\" class=\"headerlink\" title=\"变换与卷绕\"\u003e\u003c/a\u003e变换与卷绕\u003c/h3\u003e\u003cp\u003e什么是图像卷绕:\u003cstrong\u003e更改图像的定义域\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e常见的变换\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e平移\u003c/li\u003e\u003cli\u003e欧式变换:平移+旋转\u003c/li\u003e\u003cli\u003e相似变换:平移+旋转+等比放缩\u003c/li\u003e\u003cli\u003e仿射变换:平移+旋转+等比放缩+剪切\u003c/li\u003e\u003cli\u003e投影变换:原来平行的线不再平行,但还是保持直线性\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"线性变换\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%BA%BF%E6%80%A7%E5%8F%98%E6%8D%A2\" class=\"headerlink\" title=\"线性变换\"\u003e\u003c/a\u003e线性变换\u003c/h4\u003e\u003cul\u003e\u003cli\u003e等比缩放: 比例S\u003c/li\u003e\u003cli\u003e旋转角度 \u003c/li\u003e\u003cli\u003e剪切\u003c/li\u003e\u003cli\u003e镜像\u003c/li\u003e\u003c/ul\u003e\u003cblockquote\u003e\u003cp\u003e\u003cstrong\u003e线性变换的性质\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e原点到原点\u003c/p\u003e\u003cp\u003e直线到直线\u003c/p\u003e\u003cp\u003e平行线保持平行\u003c/p\u003e\u003cp\u003e比率被保持\u003c/p\u003e\u003cp\u003e线性变换的组合是线性变换\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e平移不是 2D 坐标上的线性变换,我们需要 \u003cstrong\u003e添加一个坐标\u003c/strong\u003e -\u0026gt; \u003cstrong\u003e齐次坐标\u003c/strong\u003e\u003c/p\u003e\u003ch3 id=\"仿射变换\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E4%BB%BF%E5%B0%84%E5%8F%98%E6%8D%A2\" class=\"headerlink\" title=\"仿射变换\"\u003e\u003c/a\u003e仿射变换\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003e任何最后一行 为 [0,0,1] 的 3·3 矩阵表示的转换称为仿射变换\u003c/strong\u003e,\u003cstrong\u003e仿射变换是线性变换和平移的组合\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e变换完成后,平面位置不变\u003c/p\u003e\u003cp\u003e基本的仿射变换:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e\u003cstrong\u003e平移、缩放、2D 平面旋转、剪切\u003c/strong\u003e \u003c/p\u003e\u003cp\u003e\u003cimg src=\"http://media.sumblog.cn/blog/20190105/Je0CygVwaYrM.png?imageslim\" alt=\"mark\"/\u003e\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003cstrong\u003e仿射变换是线性变换 + 平移\u003c/strong\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e性质\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e原点不一定到原点\u003c/li\u003e\u003cli\u003e直线到直线\u003c/li\u003e\u003cli\u003e平行还平行\u003c/li\u003e\u003cli\u003e保持比率\u003c/li\u003e\u003cli\u003e闭包\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"透视变换、投影变换、同态映射\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E9%80%8F%E8%A7%86%E5%8F%98%E6%8D%A2%E3%80%81%E6%8A%95%E5%BD%B1%E5%8F%98%E6%8D%A2%E3%80%81%E5%90%8C%E6%80%81%E6%98%A0%E5%B0%84\" class=\"headerlink\" title=\"透视变换、投影变换、同态映射\"\u003e\u003c/a\u003e透视变换、投影变换、同态映射\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e最后一元素固定为1 ,共有8个参数, \u003cstrong\u003e是成像平面的变换\u003c/strong\u003e,仿射变换是特例\u003c/p\u003e\u003c/blockquote\u003e\u003cul\u003e\u003cli\u003e原点不一定映射到原点\u003c/li\u003e\u003cli\u003e平行线不一定保持平行\u003c/li\u003e\u003cli\u003e不保持比率\u003c/li\u003e\u003cli\u003e闭包\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"卷绕\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%8D%B7%E7%BB%95\" class=\"headerlink\" title=\"卷绕\"\u003e\u003c/a\u003e卷绕\u003c/h4\u003e\u003cp\u003e卷绕有两种:\u003c/p\u003e\u003col\u003e\u003cli\u003e前向卷绕\u003c/li\u003e\u003cli\u003e反向卷绕\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e变换后的像素位置如果不是整数: \u003cstrong\u003e将像素值分配给四个最近邻,记录每个点的权重并在最后归一化\u003c/strong\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e效果:混叠与模糊\u003c/p\u003e\u003c/blockquote\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e\u003cstrong\u003e反向卷绕\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e先获取每个像素在原图像中对应的位置处的像素值 (逆变换)\u003c/p\u003e\u003cp\u003e如果像素位置不是整数,利用原来相邻像素值插值\u003c/p\u003e\u003cul\u003e\u003cli\u003e可能的插值滤波器\u003cul\u003e\u003cli\u003e最近邻\u003c/li\u003e\u003cli\u003e双线性\u003c/li\u003e\u003cli\u003e双三次\u003c/li\u003e\u003cli\u003e窗 sinc\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e需要防止锯齿和混叠(需要预先滤波)\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e变换有哪几种\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e卷绕有两种\u003c/p\u003e\u003cp\u003e卷绕之后产生了非整数值怎么办\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e常见的变换\u003c/p\u003e\u003cul\u003e\u003cli\u003e旋转\u003c/li\u003e\u003cli\u003e平移\u003c/li\u003e\u003cli\u003e基本仿射变换\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e仿射变换的含义是什么\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"图像配准\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%9B%BE%E5%83%8F%E9%85%8D%E5%87%86\" class=\"headerlink\" title=\"图像配准\"\u003e\u003c/a\u003e图像配准\u003c/h3\u003e\u003cp\u003e配准算法的流程,怎么实现\u003c/p\u003e\u003cul\u003e\u003cli\u003e特征提取\u003c/li\u003e\u003cli\u003e匹配\u003c/li\u003e\u003cli\u003e反向变换\u003c/li\u003e\u003cli\u003e插值\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e优化方式\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e最小二乘法\u003c/strong\u003e\u003c/p\u003e\u003ch4 id=\"图像配准算法\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%9B%BE%E5%83%8F%E9%85%8D%E5%87%86%E7%AE%97%E6%B3%95\" class=\"headerlink\" title=\"图像配准算法\"\u003e\u003c/a\u003e图像配准算法\u003c/h4\u003e\u003cp\u003e\u003cstrong\u003e给定图像 A 和 B\u003c/strong\u003e\u003c/p\u003e\u003col\u003e\u003cli\u003e计算 A、B 的图像特征\u003c/li\u003e\u003cli\u003e匹配 A、B 之间的特征\u003c/li\u003e\u003cli\u003e使用匹配集计算 A 到 B 的单应映射矩阵的最小二乘解\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"最小化残差平方和\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E6%9C%80%E5%B0%8F%E5%8C%96%E6%AE%8B%E5%B7%AE%E5%B9%B3%E6%96%B9%E5%92%8C\" class=\"headerlink\" title=\"最小化残差平方和\"\u003e\u003c/a\u003e最小化残差平方和\u003c/h4\u003e\u003cp\u003e定义残差:\u003cbr/\u003e$$\u003cbr/\u003e\\begin{array} { l } { r _ { \\mathbf { x } _ { i } } \\left( \\mathbf { x } _ { t } \\right) = \\left( \\mathbf { x } _ { i } + \\mathbf { x } _ { t } \\right) - \\mathbf { x } _ { i } ^ { \\prime } } \\ { r _ { \\mathbf { y } _ { i } } \\left( \\mathbf { y } _ { t } \\right) = \\left( \\mathbf { y } _ { i } + \\mathbf { y } _ { t } \\right) - \\mathbf { y } _ { i } ^ { \\prime } } \\end{array}\u003cbr/\u003e$$\u003cbr/\u003e将 n 个点形成的 2n 个方程写成矩阵方程:\u003cbr/\u003e$$\u003cbr/\u003e\\left[ \\begin{array} { l l } { 1 } \u0026amp; { 0 } \\ { 0 } \u0026amp; { 1 } \\ { 1 } \u0026amp; { 0 } \\ { 0 } \u0026amp; { 1 } \\ { 0 } \u0026amp; { 1 } \\ { \\vdots } \\ { 1 } \u0026amp; { 0 } \\ { 0 } \u0026amp; { 1 } \\end{array} \\right] \\left[ \\begin{array} { l } { x _ { t } } \\ { y _ { t } } \\end{array} \\right] = \\left[ \\begin{array} { c } { x _ { 1 } ^ { \\prime } - x _ { 1 } } \\ { y _ { 1 } ^ { \\prime } - y _ { 1 } } \\ { x _ { 1 } ^ { \\prime } - x _ { 2 } } \\ { y _ { 2 } ^ { \\prime } - y _ { 2 } } \\ { \\vdots } \\ { x _ { n } ^ { \\prime } - x _ { n } } \\ { y _ { n } ^ { \\prime } - y _ { n } } \\end{array} \\right]\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003eAt =b\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e找到 t ,最大限度的减少\u003cbr/\u003e$$\u003cbr/\u003e| \\mathbf { A } \\mathbf { t } - \\mathbf { b } | ^ { 2 }\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003e\\begin{array} { c } { \\mathbf { A } ^ { \\mathrm { T } } \\mathbf { A } \\mathbf { t } = \\mathbf { A } ^ { \\mathrm { T } } \\mathbf { b } } \\ { \\mathbf { t } = \\left( \\mathbf { A } ^ { \\mathrm { T } } \\mathbf { A } \\right) ^ { - 1 } \\mathbf { A } ^ { \\mathrm { T } } \\mathbf { b } } \\end{array}\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e对于仿射变换:\u003cbr/\u003e$$\u003cbr/\u003e\\left[ \\begin{array} { l } { x ^ { \\prime } } \\ { y ^ { \\prime } } \\ { 1 } \\end{array} \\right] = \\left[ \\begin{array} { l l l } { a } \u0026amp; { b } \u0026amp; { c } \\ { d } \u0026amp; { e } \u0026amp; { f } \\ { 0 } \u0026amp; { 0 } \u0026amp; { 1 } \\end{array} \\right] \\left[ \\begin{array} { l } { x } \\ { y } \\ { 1 } \\end{array} \\right]\u003cbr/\u003e$$\u003cbr/\u003e有六个未知数,每个匹配有两个方程,我们需要三个匹配\u003c/p\u003e\u003cp\u003e残差:\u003cbr/\u003e$$\u003cbr/\u003e\\begin{aligned} r _ { x _ { i } } ( a , b , c , d , e , f ) \u0026amp; = \\left( a x _ { i } + b y _ { i } + c \\right) - x _ { i } ^ { \\prime } \\ r _ { y _ { i } } ( a , b , c , d , e , f ) \u0026amp; = \\left( d x _ { i } + e y _ { i } + f \\right) - y _ { i } ^ { \\prime } \\end{aligned}\u003cbr/\u003e$$\u003cbr/\u003e对于同态映射(透视变换)\u003cbr/\u003e$$\u003cbr/\u003e\\left[ \\begin{array} { c } { x _ { i } ^ { \\prime } } \\ { y _ { i } ^ { \\prime } } \\ { 1 } \\end{array} \\right] \\cong \\left[ \\begin{array} { l l l } { h _ { 00 } } \u0026amp; { h _ { 01 } } \u0026amp; { h _ { 02 } } \\ { h _ { 10 } } \u0026amp; { h _ { 11 } } \u0026amp; { h _ { 12 } } \\ { h _ { 20 } } \u0026amp; { h _ { 21 } } \u0026amp; { h _ { 22 } } \\end{array} \\right] \\left[ \\begin{array} { c } { x _ { i } } \\ { y _ { i } } \\ { 1 } \\end{array} \\right]\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003e\\begin{aligned} x _ { i } ^ { \\prime } \\left( h _ { 20 } x _ { i } + h _ { 21 } y _ { i } + h _ { 22 } \\right) \u0026amp; = h _ { 00 } x _ { i } + h _ { 01 } y _ { i } + h _ { 02 } \\ y _ { i } ^ { \\prime } \\left( h _ { 20 } x _ { i } + h _ { 21 } y _ { i } + h _ { 22 } \\right) \u0026amp; = h _ { 10 } x _ { i } + h _ { 11 } y _ { i } + h _ { 12 } \\end{aligned}\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e\u003cimg src=\"http://media.sumblog.cn/blog/20190105/LyDbpPwVzvUz.png?imageslim\" alt=\"mark\"/\u003e\u003c/p\u003e\u003cp\u003eAh = 0 的非平凡最小二乘解,即为 $A^TA$ 具有最小特征值的特征向量\u003c/p\u003e\u003ch3 id=\"RANSAC-随机抽样一致\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#RANSAC-%E9%9A%8F%E6%9C%BA%E6%8A%BD%E6%A0%B7%E4%B8%80%E8%87%B4\" class=\"headerlink\" title=\"RANSAC 随机抽样一致\"\u003e\u003c/a\u003eRANSAC 随机抽样一致\u003c/h3\u003e\u003cp\u003e如何计算\u003c/p\u003e\u003cul\u003e\u003cli\u003e随机抽取\u003c/li\u003e\u003cli\u003e计算匹配误差\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"Ransac-算法\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#Ransac-%E7%AE%97%E6%B3%95\" class=\"headerlink\" title=\"Ransac 算法\"\u003e\u003c/a\u003eRansac 算法\u003c/h4\u003e\u003col\u003e\u003cli\u003e随机选择 S 个样本\u003cul\u003e\u003cli\u003e通常 s 等于可以求解模型的最少样本数量\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e使用这 s 个样本求得一个解\u003c/li\u003e\u003cli\u003e计数符合模型的 inliers 数\u003c/li\u003e\u003cli\u003e重复 N 次\u003c/li\u003e\u003cli\u003e选择具有最多 inliers 数的模型\u003c/li\u003e\u003cli\u003e使用所有的 inliers 点,采用最小平方拟合\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"实验轮数的确定\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%AE%9E%E9%AA%8C%E8%BD%AE%E6%95%B0%E7%9A%84%E7%A1%AE%E5%AE%9A\" class=\"headerlink\" title=\"实验轮数的确定\"\u003e\u003c/a\u003e实验轮数的确定\u003c/h4\u003e\u003cul\u003e\u003cli\u003e$p$ 数内点的概率\u003c/li\u003e\u003cli\u003e$s$ 是每次实验使用样本点的数目\u003c/li\u003e\u003cli\u003e$P$ 为实验最终成功找到正确解的概率\u003c/li\u003e\u003cli\u003e$R$ 为实验轮数\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e$$\u003cbr/\u003e\\begin{array} { l } \u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"},{"title":"如何搭建一个本地镜像源","time":"2023-10-16T15:23:51Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e最近好哥们沉迷pocketchip,但是苦于架构比较古老(ARM-V7a但是能跑Linux Mainline),所以镜像站特别稀少,只有个国外的站点还开着。所以嘛,闲着也是闲着,就打算自己搭建一个镜像站咯。\u003c/p\u003e\u003cp\u003e顺便还能好好玩玩那个ESXi服务器。毕竟现在就只跑了一个OpenWRT和一个Ubuntu Server,实在没利用起来(\u003c/p\u003e\u003cp\u003e或许回头整个本地镜像源还能试试刷新一下Arch安装速度记录(逃\u003c/p\u003e\u003ch2 id=\"准备\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/16/setup-local-linux-mirror/#%E5%87%86%E5%A4%87\" class=\"headerlink\" title=\"准备\"\u003e\u003c/a\u003e准备\u003c/h2\u003e\u003cp\u003e首先需要足够的硬盘空间和一个Linux计算机,以及差不多的网络环境。\u003c/p\u003e\u003cp\u003e然后是一些\u003cdel\u003e神秘妙妙\u003c/del\u003e工具:\u003ccode\u003eapache2, debmirror, gnupg, xz-utils, rsync(recommend)\u003c/code\u003e\u003c/p\u003e\u003ch2 id=\"开始\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/16/setup-local-linux-mirror/#%E5%BC%80%E5%A7%8B\" class=\"headerlink\" title=\"开始\"\u003e\u003c/a\u003e开始\u003c/h2\u003e\u003cp\u003e首先,因为同步的数据量会比较大,所以建议使用一块单独的硬盘或者看具体情况分个区都行。硬盘处理好后,可以将它挂载到\u003ccode\u003e/mount/\u003c/code\u003e下,随后创建我们的镜像站仓库目录们。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emkdir\u003c/span\u003e -p /mirror/debmirror/{amd64,keyring}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emkdir\u003c/span\u003e -p /mirror/scripts \u003cspan class=\"comment\"\u003e# 各种镜像站工具脚本\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e随后安装GPG keyrnig:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003egpg --no-default-keyring --keyring /mirror/debmirror/mirrorkeyring/trustedkeys.gpg --import /usr/share/keyrings/ubuntu-archive-keyring.gpg\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e安装完成后,在Web服务器站点根目录创建符号链接:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e /var/www/html\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eln\u003c/span\u003e -s /mirror/debmirror/amd64 ubuntu\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e在这之后,我们还需要配置debmirror才能实现自动同步upstream等功能。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e /mirror/scripts\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewget https://louwrentius.com/files/debmirroramd64.sh.txt -O debmirroramd64.sh \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003echmod\u003c/span\u003e +x debmirroramd64.sh\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e接着修改脚本设置:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eexport\u003c/span\u003e GNUPGHOME=/mirror/debmirror/mirrorkeyring\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003erelease=focal,focal-security,focal-updates,focal-backports,jammy,jammy-security,jammy-updates,jammy-backports\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eserver=nl.archive.ubuntu.com\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eproto=rsync\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eoutPath=/mirror/debmirror/amd64\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e#bwlimit=1000 # 设置rsync的带宽限速为1000KB/s,如果要启用这个限制,还需要取消注释下面的行:\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e--rsync-options \u003cspan class=\"string\"\u003e\u0026#34;-aIL --partial --bwlimit=\u003cspan class=\"variable\"\u003e$bwlimit\u003c/span\u003e\u0026#34;\u003c/span\u003e \\\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e完成后,你可以先运行一次脚本来完成第一次同步。\u003cstrong\u003e同步完成后\u003c/strong\u003e,再在crontab里边加上自动任务(不然你的同步进程时间过长,可能会干扰cron任务):\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e0 1 * * * /mirror/scripts/debmirroramd64.sh\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"References\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/16/setup-local-linux-mirror/#References\" class=\"headerlink\" title=\"References\"\u003e\u003c/a\u003eReferences\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://louwrentius.com/how-to-setup-a-local-or-private-ubuntu-mirror.html\"\u003eLouwrentius - How to Setup a Local or Private Ubuntu Mirror\u003c/a\u003e\u003cbr/\u003e\u003ca href=\"https://www.debian.org/mirror/ftpmirror\"\u003eDebian - Setting up a Debian archive mirror\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/10/16/setup-local-linux-mirror/"},{"title":"CSDN复制解禁","time":"2023-10-12T06:18:34Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e省流不看:F12开发者工具终端执行\u003ccode\u003edocument.designMode=\u0026#39;on\u0026#39;\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e原理嘛,就是利用浏览器的DOM启用设计模式来允许选择元素。关于DOM的详细介绍在下边:\u003c/p\u003e\u003ch2 id=\"DOM简介\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/12/csdn-copy/#DOM%E7%AE%80%E4%BB%8B\" class=\"headerlink\" title=\"DOM简介\"\u003e\u003c/a\u003eDOM简介\u003c/h2\u003e\u003cp\u003e在浏览器中,\u003ccode\u003edocument\u003c/code\u003e对象是一个非常重要的对象,它代表了当前页面的文档。\u003ccode\u003edocument.DesignMode\u003c/code\u003e属性是\u003ccode\u003edocument\u003c/code\u003e对象的一个属性,它用于指定页面的设计模式。\u003c/p\u003e\u003cp\u003e设计模式主要有两种:\u003c/p\u003e\u003col\u003e\u003cli\u003e模式(常态):页面在正常模式下运行,用户可以正常查看和操作页面元素。 \u003c/li\u003e\u003cli\u003elayouter 模式(布局模式):页面在 layouter 模式下运行,用户无法正常查看和操作页面元素,只能查看页面的布局和结构。\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e这两种设计模式主要用于开发者调试和测试网页布局。通常,开发者会在开发过程中将页面切换到 layouter 模式,以便更好地查看和调整页面布局。当开发完成后,页面会自动切换回正常模式。\u003c/p\u003e\u003cp\u003e在页面加载时,浏览器会自动设置\u003ccode\u003edocument.DesignMode\u003c/code\u003e属性的值。开发者也可以通过 JavaScript 代码来修改这个属性的值,从而实现在不同设计模式之间的切换。\u003c/p\u003e\u003cp\u003e除了\u003ccode\u003eDesignMode\u003c/code\u003e属性之外,\u003ccode\u003edocument\u003c/code\u003e对象还有许多其他的属性和方法,它们可以用来完成各种网页开发任务。例如:\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003ccode\u003edocument.body\u003c/code\u003e:表示页面的主体部分,包含了所有的 HTML 元素。 \u003c/li\u003e\u003cli\u003e\u003ccode\u003edocument.title\u003c/code\u003e:表示页面的标题,通常显示在浏览器的标签页上。 \u003c/li\u003e\u003cli\u003e\u003ccode\u003edocument.getElementById()\u003c/code\u003e:通过元素的 ID 获取指定元素。 \u003c/li\u003e\u003cli\u003e\u003ccode\u003edocument.getElementsByClassName()\u003c/code\u003e:通过元素的类名获取指定元素集合。 \u003c/li\u003e\u003cli\u003e\u003ccode\u003edocument.getElementsByTagName()\u003c/code\u003e:通过元素的标签名获取指定元素集合。 \u003c/li\u003e\u003cli\u003e\u003ccode\u003edocument.querySelector()\u003c/code\u003e:通过 CSS 选择器获取指定元素。 \u003c/li\u003e\u003cli\u003e\u003ccode\u003edocument.querySelectorAll()\u003c/code\u003e:通过 CSS 选择器获取指定元素集合。\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e此外,\u003ccode\u003edocument\u003c/code\u003e对象还提供了许多用于操作 DOM 的方法,如\u003ccode\u003ecreateElement()\u003c/code\u003e、\u003ccode\u003eappendChild()\u003c/code\u003e、\u003ccode\u003eremoveChild()\u003c/code\u003e、\u003ccode\u003einsertBefore()\u003c/code\u003e等,以及用于处理事件的方法,如\u003ccode\u003eaddEventListener()\u003c/code\u003e、\u003ccode\u003eremoveEventListener()\u003c/code\u003e等。\u003c/p\u003e\u003cp\u003e总之,\u003ccode\u003edocument\u003c/code\u003e对象是浏览器中最重要的对象之一,它为网页开发者提供了丰富的属性和方法,使得开发者可以更加方便地完成各种网页开发任务。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/10/12/csdn-copy/"},{"title":"联邦学习的投毒和攻防方法","time":"2023-10-11T10:59:46Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e十分的交叉学科。具体而言就是机器学习领域的数据安全问题。\u003c/p\u003e\u003cp\u003e首先是标题 说的大概是一种新的人工智能学习范式。在这种防方式里也有攻击方式和相应的防御方式。\u003c/p\u003e\u003ch2 id=\"联邦学习简介\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%8A%95%E6%AF%92%E5%92%8C%E6%94%BB%E9%98%B2%E6%96%B9%E6%B3%95/#%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%AE%80%E4%BB%8B\" class=\"headerlink\" title=\"联邦学习简介\"\u003e\u003c/a\u003e联邦学习简介\u003c/h2\u003e\u003cul\u003e\u003cli\u003edefinition 联邦学习:一种分布式学习方法。解决的问题主要针对数据量不够/数据获取途径(成本问题),数据难以集中(法律问题和隐私问题)。一种时间方法是在本地进行小规模训练,然后将训练得到的模型参数上传汇总。不但规避了隐私版权问题,也保证了训练效果。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e根据以样本和特征分别作为基准,联邦学习又分为横向/纵向:同特征不同样本/同样本不同特征。它们各自有着相当不同的模型参数聚合方法。后者通常发生在大型企业之间,而前者通常发生在用户/公司之间,双方并非信任关系。\u003c/p\u003e\u003cp\u003e前者的聚合方法有简单的加权平均FedAvg,有离群点修复FedProx,还有SCAFFOLD等。而后者则利用隐私求交集PSI来完成加密实体对齐。典型的纵向联邦学习框架有SecureBoost。\u003c/p\u003e\u003cp\u003e但是数据特征仍然是反映在梯度参数中的,通过深度梯度泄漏方法DLG,可以恢复训练数据,这样就间接泄漏了训练数据的隐私。\u003c/p\u003e\u003ch2 id=\"隐私数据保护方法\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%8A%95%E6%AF%92%E5%92%8C%E6%94%BB%E9%98%B2%E6%96%B9%E6%B3%95/#%E9%9A%90%E7%A7%81%E6%95%B0%E6%8D%AE%E4%BF%9D%E6%8A%A4%E6%96%B9%E6%B3%95\" class=\"headerlink\" title=\"隐私数据保护方法\"\u003e\u003c/a\u003e隐私数据保护方法\u003c/h2\u003e\u003cp\u003e防止梯度泄露的方法主要是两类:密码学方法和差分隐私(Differential Privacy).前者有MPC和HE等,通信开销和计算量较大,但是精度较高。后者则有噪声问题的困扰。\u003c/p\u003e\u003ch2 id=\"联邦学习的攻击方法\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%8A%95%E6%AF%92%E5%92%8C%E6%94%BB%E9%98%B2%E6%96%B9%E6%B3%95/#%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%94%BB%E5%87%BB%E6%96%B9%E6%B3%95\" class=\"headerlink\" title=\"联邦学习的攻击方法\"\u003e\u003c/a\u003e联邦学习的攻击方法\u003c/h2\u003e\u003cp\u003e目的就是使训练模型很难收敛,破坏联邦学习模型的性能和可信度。\u003c/p\u003e\u003cul\u003e\u003cli\u003e投毒攻击,给本地数据添加错误,来弱化学习效果;或者更改分布式训练的模型参数。攻击者的知识、能力越强则攻击能力越强\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e但是太离谱的数据会被数据清洗过滤掉,太小的数据又没啥效果。\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e目标/非目标攻击:针对特定/随即目标进行数据编造投毒攻击。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e数据打乱:比如对于不同群体的用户数据,互换他们attribute的结果,最终使得结果在不同群体上相反。\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"投毒攻击的检测\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%8A%95%E6%AF%92%E5%92%8C%E6%94%BB%E9%98%B2%E6%96%B9%E6%B3%95/#%E6%8A%95%E6%AF%92%E6%94%BB%E5%87%BB%E7%9A%84%E6%A3%80%E6%B5%8B\" class=\"headerlink\" title=\"投毒攻击的检测\"\u003e\u003c/a\u003e投毒攻击的检测\u003c/h2\u003e\u003cp\u003e这种检测难度不小:投毒攻击检测和隐私保护间的矛盾、数据非独立分布、攻击隐蔽性。\u003c/p\u003e\u003cp\u003e比较朴素的思路就是使用数据挖掘的清洗方法,对离群点等进行清洗。比如说有一些聚合方法:Krum, Bulyan, Trimmed mean(修整均值), Medium(中位数)等,都是一些经典的鲁棒性聚合规则。\u003c/p\u003e\u003ch2 id=\"防御方法\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%8A%95%E6%AF%92%E5%92%8C%E6%94%BB%E9%98%B2%E6%96%B9%E6%B3%95/#%E9%98%B2%E5%BE%A1%E6%96%B9%E6%B3%95\" class=\"headerlink\" title=\"防御方法\"\u003e\u003c/a\u003e防御方法\u003c/h2\u003e\u003cp\u003e首先是基于统计学的方法。但是它的局限性是只有少部分客户端被控制。\u003c/p\u003e\u003cp\u003e其次是用验证用数据集进行验证。不过这样纯粹的数据集很难找。\u003c/p\u003e\u003cp\u003e再者就是用机器学习方法1-AE进行检验。它首先在本地预训练一个自编码器模型,然后正式训练过程中基于自编码器计算各节点模型更新的重构误差。\u003c/p\u003e\u003cp\u003e2-GAN:可以用GAN尝试恢复出来训练样本来生成本地训练集,从而验证模型参数是否正常。但是缺陷是,无法应对在训练初期就发动攻击的方式。\u003c/p\u003e\u003cp\u003e区块链1-FLChain:由部分节点进行数据检测再进行上传,从而保证参数的正确性。问题是这部分节点如何选择,以及是否正常。解决方法可以是动态更新这部分成员结点,通过一系列置信度去更新这部分节点。\u003c/p\u003e\u003ch2 id=\"研究成果:神经网络模型水印\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%8A%95%E6%AF%92%E5%92%8C%E6%94%BB%E9%98%B2%E6%96%B9%E6%B3%95/#%E7%A0%94%E7%A9%B6%E6%88%90%E6%9E%9C%EF%BC%9A%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B%E6%B0%B4%E5%8D%B0\" class=\"headerlink\" title=\"研究成果:神经网络模型水印\"\u003e\u003c/a\u003e研究成果:神经网络模型水印\u003c/h2\u003e\u003cp\u003e初始模型嵌入水印,并对水印进行检测。缺点是上传的模型不能加密。当然也可以允许加密,不过可以聚合模型,用聚合后的模型检验上传者。或者,可以比对上传者的历史行为数据,以此检测上传节点是否异常。\u003c/p\u003e\u003cp\u003e时间有限,基本就到这里了。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/10/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%8A%95%E6%AF%92%E5%92%8C%E6%94%BB%E9%98%B2%E6%96%B9%E6%B3%95/"},{"title":"Golang代码复用-分页最佳实践","time":"2023-10-07T13:59:46Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e分页是查询的一个基本要求之一。这部分代码大多重复,适合复用。下面是一种最佳实践:\u003c/p\u003e\u003cp\u003e这是一个传有分页数据的Gin Handler,它需要对数据库进行分页查询:\u003c/p\u003e\u003cfigure class=\"highlight go\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003e\u003cspan class=\"keyword\"\u003efunc\u003c/span\u003e \u003cspan class=\"params\"\u003e(p propertyRepository)\u003c/span\u003e\u003c/span\u003e GetPagedAndFiltered (limit, page \u003cspan class=\"type\"\u003eint\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e随后我们定义一个\u003ccode\u003egorm\u003c/code\u003e中间件去对数据库进行分页:\u003c/p\u003e\u003cfigure class=\"highlight go\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eimport\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;gorm.io/gorm\u0026#34;\u003c/span\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003etype\u003c/span\u003e paginate \u003cspan class=\"keyword\"\u003estruct\u003c/span\u003e { \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003elimit \u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epage \u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e} \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003e\u003cspan class=\"keyword\"\u003efunc\u003c/span\u003e \u003cspan class=\"title\"\u003enewPaginate\u003c/span\u003e\u003cspan class=\"params\"\u003e(limit \u003cspan class=\"type\"\u003eint\u003c/span\u003e, page \u003cspan class=\"type\"\u003eint\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e *paginate { \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e \u0026amp;paginate{limit: limit,page: page} \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e} \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003e\u003cspan class=\"keyword\"\u003efunc\u003c/span\u003e \u003cspan class=\"params\"\u003e(p *paginate)\u003c/span\u003e\u003c/span\u003e paginatedResult(db *gorm.DB) *gorm.DB { \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eoffset := (p.page - \u003cspan class=\"number\"\u003e1\u003c/span\u003e) * p.limit \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e db.Offset(offset). \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eLimit(p.limit) \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e随后,就可以在数据库中使用分页了:\u003c/p\u003e\u003cfigure class=\"highlight go\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003e\u003cspan class=\"keyword\"\u003efunc\u003c/span\u003e \u003cspan class=\"params\"\u003e(p propertyRepository)\u003c/span\u003e\u003c/span\u003e GetPagedAndFiltered(limit, page \u003cspan class=\"type\"\u003eint\u003c/span\u003e) ([]Property, \u003cspan class=\"type\"\u003eerror\u003c/span\u003e) { \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003evar\u003c/span\u003e properties []Property \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eerr := p.db.Scopes(newPaginate(limit,page).paginatedResult).Find(\u0026amp;properties).Error \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e properties, err \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e当然,我对上面的代码进行了进一步的集成。虽然损失了低耦合性质,但是只是在Gin使用的话体验拉满:\u003c/p\u003e\u003cfigure class=\"highlight go\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003etype\u003c/span\u003e Pagination \u003cspan class=\"keyword\"\u003estruct\u003c/span\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ePageSize \u003cspan class=\"type\"\u003eint\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ePageNum \u003cspan class=\"type\"\u003eint\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// GetPagination Get pagination info\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003e\u003cspan class=\"keyword\"\u003efunc\u003c/span\u003e \u003cspan class=\"title\"\u003eGetPagination\u003c/span\u003e\u003cspan class=\"params\"\u003e(c *gin.Context)\u003c/span\u003e\u003c/span\u003e Pagination {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003evar\u003c/span\u003e data Pagination\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epageSize, _ := strconv.Atoi(c.Query(\u003cspan class=\"string\"\u003e\u0026#34;pagesize\u0026#34;\u003c/span\u003e))\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epageNum, _ := strconv.Atoi(c.Query(\u003cspan class=\"string\"\u003e\u0026#34;pagenum\u0026#34;\u003c/span\u003e))\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eswitch\u003c/span\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ecase\u003c/span\u003e pageSize \u0026gt;= \u003cspan class=\"number\"\u003e100\u003c/span\u003e:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003edata.PageSize = \u003cspan class=\"number\"\u003e100\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ecase\u003c/span\u003e pageSize \u0026lt;= \u003cspan class=\"number\"\u003e0\u003c/span\u003e:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003edata.PageSize = \u003cspan class=\"number\"\u003e10\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e pageNum \u0026lt;= \u003cspan class=\"number\"\u003e0\u003c/span\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003edata.PageNum = \u003cspan class=\"number\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e data\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003e\u003cspan class=\"keyword\"\u003efunc\u003c/span\u003e \u003cspan class=\"params\"\u003e(p *Pagination)\u003c/span\u003e\u003c/span\u003e PaginatedResults(db *gorm.DB) *gorm.DB {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eoffset := (p.PageNum - \u003cspan class=\"number\"\u003e1\u003c/span\u003e) * p.PageSize\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e db.Offset(offset).Limit(p.PageSize)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e使用方法就是在Gin Handler中用\u003ccode\u003eGetPagination\u003c/code\u003e获取分页参数,然后在\u003ccode\u003emodel\u003c/code\u003e的具体数据库实现操作中使用\u003ccode\u003edb.Scopes(page.PaginatedResult).xxx\u003c/code\u003e直接分页。\u003c/p\u003e\u003cp\u003e应该是一种最佳实践。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/10/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/Golang/Golang%E4%BB%A3%E7%A0%81%E5%A4%8D%E7%94%A8-%E5%88%86%E9%A1%B5%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5/"},{"title":"Vim备忘录","time":"2023-09-29T21:30:53Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"How-to-Exit\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#How-to-Exit\" class=\"headerlink\" title=\"How to Exit\"\u003e\u003c/a\u003eHow to Exit\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e:q[uit]\u003c/td\u003e\u003ctd\u003eQuit Vim. This fails when changes have been made.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:q[uit]!\u003c/td\u003e\u003ctd\u003eQuit without writing.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:cq[uit]\u003c/td\u003e\u003ctd\u003eQuit always, without writing.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:wq\u003c/td\u003e\u003ctd\u003eWrite the current file and exit.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:wq!\u003c/td\u003e\u003ctd\u003eWrite the current file and exit always.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:wq {file}\u003c/td\u003e\u003ctd\u003eWrite to {file}. Exit if not editing the last\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:wq! {file}\u003c/td\u003e\u003ctd\u003eWrite to {file} and exit always.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[range]wq[!]\u003c/td\u003e\u003ctd\u003e[file] Same as above, but only write the lines in [range].\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eZZ\u003c/td\u003e\u003ctd\u003eWrite current file, if modified, and exit.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eZQ\u003c/td\u003e\u003ctd\u003eQuit current file and exit (same as “:q!”).\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch2 id=\"Editing-a-File\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Editing-a-File\" class=\"headerlink\" title=\"Editing a File\"\u003e\u003c/a\u003eEditing a File\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e:e[dit]\u003c/td\u003e\u003ctd\u003eEdit the current file. This is useful to re-edit the current file, when it has been changed outside of Vim.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:e[dit]!\u003c/td\u003e\u003ctd\u003eEdit the current file always. Discard any changes to the current buffer. This is useful if you want to start all over again.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:e[dit] {file}\u003c/td\u003e\u003ctd\u003eEdit {file}.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:e[dit]! {file}\u003c/td\u003e\u003ctd\u003eEdit {file} always. Discard any changes to the current buffer.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003egf\u003c/td\u003e\u003ctd\u003eEdit the file whose name is under or after the cursor. Mnemonic: “goto file”.\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch2 id=\"Inserting-Text\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Inserting-Text\" class=\"headerlink\" title=\"Inserting Text\"\u003e\u003c/a\u003eInserting Text\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003ea\u003c/td\u003e\u003ctd\u003eAppend text after the cursor [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eA\u003c/td\u003e\u003ctd\u003eAppend text at the end of the line [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ei\u003c/td\u003e\u003ctd\u003eInsert text before the cursor [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eI\u003c/td\u003e\u003ctd\u003eInsert text before the first non-blank in the line [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003egI\u003c/td\u003e\u003ctd\u003eInsert text in column 1 [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eo\u003c/td\u003e\u003ctd\u003eBegin a new line below the cursor and insert text, repeat [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eO\u003c/td\u003e\u003ctd\u003eBegin a new line above the cursor and insert text, repeat [count] times.\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch2 id=\"Inserting-a-file\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Inserting-a-file\" class=\"headerlink\" title=\"Inserting a file\"\u003e\u003c/a\u003eInserting a file\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e:r[ead] [name]\u003c/td\u003e\u003ctd\u003eInsert the file [name] below the cursor.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:r[ead] !{cmd}\u003c/td\u003e\u003ctd\u003eExecute {cmd} and insert its standard output below the cursor.\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch2 id=\"Deleting-Text\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Deleting-Text\" class=\"headerlink\" title=\"Deleting Text\"\u003e\u003c/a\u003eDeleting Text\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\u0026lt;Del\u0026gt; or x\u003c/td\u003e\u003ctd\u003eDelete [count] characters under and after the cursor\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eX\u003c/td\u003e\u003ctd\u003eDelete [count] characters before the cursor\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ed{motion}\u003c/td\u003e\u003ctd\u003eDelete text that {motion} moves over\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003edd\u003c/td\u003e\u003ctd\u003eDelete [count] lines\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eD\u003c/td\u003e\u003ctd\u003eDelete the characters under the cursor until the end of the line\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e{Visual}x or \u003cbr/\u003e{Visual}d\u003c/td\u003e\u003ctd\u003eDelete the highlighted text (for {Visual} see \u003ca href=\"http://fprintf.net/vimCheatSheet.html#select\"\u003eSelecting Text\u003c/a\u003e).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e{Visual}CTRL-H or \u003cbr/\u003e{Visual}\u003c/td\u003e\u003ctd\u003eWhen in Select mode: Delete the highlighted text\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e{Visual}X or \u003cbr/\u003e{Visual}D\u003c/td\u003e\u003ctd\u003eDelete the highlighted lines\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[range]d[elete]\u003c/td\u003e\u003ctd\u003eDelete [range] lines (default: current line)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[range]d[elete] {count}\u003c/td\u003e\u003ctd\u003eDelete {count} lines, starting with [range]\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003ch2 id=\"Changing-or-Replacing-Text\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Changing-or-Replacing-Text\" class=\"headerlink\" title=\"Changing (or Replacing) Text\"\u003e\u003c/a\u003eChanging (or Replacing) Text\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003er{char}\u003c/td\u003e\u003ctd\u003ereplace the character under the cursor with {char}.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eR\u003c/td\u003e\u003ctd\u003eEnter Insert mode, replacing characters rather than inserting\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e~\u003c/td\u003e\u003ctd\u003eSwitch case of the character under the cursor and move the cursor to the right. If a [count] is given, do that many characters.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e~{motion}\u003c/td\u003e\u003ctd\u003eswitch case of {motion} text.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e{Visual}~\u003c/td\u003e\u003ctd\u003eSwitch case of highlighted text\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003ch2 id=\"Substituting\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Substituting\" class=\"headerlink\" title=\"Substituting\"\u003e\u003c/a\u003eSubstituting\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e:[range]s[ubstitute]/{pattern}/{string}/[c][e][g][p][r][i][I] [count]\u003c/td\u003e\u003ctd\u003eFor each line in [range] replace a match of {pattern} with {string}.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[range]s[ubstitute] [c][e][g][r][i][I] [count] :[range]\u0026amp;[c][e][g][r][i][I] [count]\u003c/td\u003e\u003ctd\u003eRepeat last :substitute with same search pattern and substitute string, but without the same flags. You may add extra flags\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003eThe arguments that you can use for the substitute commands:\u003cbr/\u003e[c] Confirm each substitution. Vim positions the cursor on the matching\u003cbr/\u003e string. You can type:\u003cbr/\u003e ‘y’ to substitute this match\u003cbr/\u003e ‘n’ to skip this match\u003cbr/\u003e to skip this match\u003cbr/\u003e ‘a’ to substitute this and all remaining matches {not in Vi}\u003cbr/\u003e ‘q’ to quit substituting {not in Vi}\u003cbr/\u003e CTRL-E to scroll the screen up {not in Vi}\u003cbr/\u003e CTRL-Y to scroll the screen down {not in Vi}.\u003cbr/\u003e[e] When the search pattern fails, do not issue an error message and, in\u003cbr/\u003e particular, continue in maps as if no error occurred.\u003cbr/\u003e[g] Replace all occurrences in the line. Without this argument,\u003cbr/\u003e replacement occurs only for the first occurrence in each line.\u003cbr/\u003e[i] Ignore case for the pattern.\u003cbr/\u003e[I] Don’t ignore case for the pattern.\u003cbr/\u003e[p] Print the line containing the last substitute.\u003c/p\u003e\u003chr/\u003e\u003ch2 id=\"Copying-and-Moving-Text\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Copying-and-Moving-Text\" class=\"headerlink\" title=\"Copying and Moving Text\"\u003e\u003c/a\u003eCopying and Moving Text\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e“{a-zA-Z0-9.%#:-“}\u003c/td\u003e\u003ctd\u003eUse register {a-zA-Z0-9.%#:-“} for next delete, yank or put (use uppercase character to append with delete and yank) ({.%#:} only work with put).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:reg[isters]\u003c/td\u003e\u003ctd\u003eDisplay the contents of all numbered and named registers.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:reg[isters] {arg}\u003c/td\u003e\u003ctd\u003eDisplay the contents of the numbered and named registers that are mentioned in {arg}.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:di[splay] [arg]\u003c/td\u003e\u003ctd\u003eSame as :registers.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[“x]y{motion}\u003c/td\u003e\u003ctd\u003eYank {motion} text [into register x].\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[“x]yy\u003c/td\u003e\u003ctd\u003eYank [count] lines [into register x]\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[“x]Y\u003c/td\u003e\u003ctd\u003eyank [count] lines [into register x] (synonym for yy).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e{Visual}[“x]y\u003c/td\u003e\u003ctd\u003eYank the highlighted text [into register x] (for {Visual} see \u003ca href=\"http://fprintf.net/vimCheatSheet.html#select\"\u003eSelecting Text\u003c/a\u003e).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e{Visual}[“x]Y\u003c/td\u003e\u003ctd\u003eYank the highlighted lines [into register x]\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[range]y[ank] [x]\u003c/td\u003e\u003ctd\u003eYank [range] lines [into register x].\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[range]y[ank] [x] {count}\u003c/td\u003e\u003ctd\u003eYank {count} lines, starting with last line number in [range] (default: current line), [into register x].\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[“x]p\u003c/td\u003e\u003ctd\u003ePut the text [from register x] after the cursor [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[“x]P\u003c/td\u003e\u003ctd\u003ePut the text [from register x] before the cursor [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[“x]gp\u003c/td\u003e\u003ctd\u003eJust like “p”, but leave the cursor just after the new text.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[“x]gP\u003c/td\u003e\u003ctd\u003eJust like “P”, but leave the cursor just after the new text.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[line]pu[t] [x]\u003c/td\u003e\u003ctd\u003ePut the text [from register x] after [line] (default current line).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[line]pu[t]! [x]\u003c/td\u003e\u003ctd\u003ePut the text [from register x] before [line] (default current line).\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003ch2 id=\"Undo-x2F-Redo-x2F-Repeat\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Undo-x2F-Redo-x2F-Repeat\" class=\"headerlink\" title=\"Undo/Redo/Repeat\"\u003e\u003c/a\u003eUndo/Redo/Repeat\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003eu\u003c/td\u003e\u003ctd\u003eUndo [count] changes.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:u[ndo]\u003c/td\u003e\u003ctd\u003eUndo one change.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eCTRL-R\u003c/td\u003e\u003ctd\u003eRedo [count] changes which were undone.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:red[o]\u003c/td\u003e\u003ctd\u003eRedo one change which was undone.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eU\u003c/td\u003e\u003ctd\u003eUndo all latest changes on one line. {Vi: while not moved off of it}\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e.\u003c/td\u003e\u003ctd\u003eRepeat last change, with count replaced with [count].\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003ch2 id=\"Moving-Around\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Moving-Around\" class=\"headerlink\" title=\"Moving Around\"\u003e\u003c/a\u003eMoving Around\u003c/h2\u003e\u003cp\u003eBasic motion commands:\u003c/p\u003e\u003cpre\u003e\u003ccode\u003e k h l j \u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003eh or\u003c/td\u003e\u003ctd\u003e[count] characters to the left (exclusive).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003el or \u003cbr/\u003eor\u003c/td\u003e\u003ctd\u003e[count] characters to the right (exclusive).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ek or \u003cbr/\u003eor \u003cbr/\u003eCTRL-P\u003c/td\u003e\u003ctd\u003e[count] lines upward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ej or \u003cbr/\u003eor \u003cbr/\u003eCTRL-J or \u003cbr/\u003eor \u003cbr/\u003eCTRL-N\u003c/td\u003e\u003ctd\u003e[count] lines downward (linewise).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003eTo the first character of the line (exclusive).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003chome\u003e\u003c/home\u003e\u003c/td\u003e\u003ctd\u003eTo the first character of the line (exclusive).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e^\u003c/td\u003e\u003ctd\u003eTo the first non-blank character of the line\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e$ or \u003cbr/\u003e\u003cend\u003e\u003c/end\u003e\u003c/td\u003e\u003ctd\u003eTo the end of the line and [count - 1] lines downward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eg0 or \u003cbr/\u003eg\u003chome\u003e\u003c/home\u003e\u003c/td\u003e\u003ctd\u003eWhen lines wrap (‘wrap on): To the first character of the screen line (exclusive). Differs from “0” when a line is wider than the screen. When lines don’t wrap (‘wrap’ off): To the leftmost character of the current line that is on the screen. Differs from “0” when the first character of the line is not on the screen.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eg^\u003c/td\u003e\u003ctd\u003eWhen lines wrap (‘wrap’ on): To the first non-blank character of the screen line (exclusive). Differs from “^” when a line is wider than the screen. When lines don’t wrap (‘wrap’ off): To the leftmost non-blank character of the current line that is on the screen. Differs from “^” when the first non-blank character of the line is not on the screen.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eg$ or \u003cbr/\u003eg\u0026lt;End\u0026amp;gr;\u003c/td\u003e\u003ctd\u003eWhen lines wrap (‘wrap’ on): To the last character of the screen line and [count - 1] screen lines downward (inclusive). Differs from “$” when a line is wider than the screen. When lines don’t wrap (‘wrap’ off): To the rightmost character of the current line that is visible on the screen. Differs from “$” when the last character of the line is not on the screen or when a count is used.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ef{char}\u003c/td\u003e\u003ctd\u003eTo [count]’th occurrence of {char} to the right. The cursor is placed on {char} (inclusive).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eF{char}\u003c/td\u003e\u003ctd\u003eTo the [count]’th occurrence of {char} to the left. The cursor is placed on {char} (inclusive).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003et{char}\u003c/td\u003e\u003ctd\u003eTill before [count]’th occurrence of {char} to the right. The cursor is placed on the character left of {char} (inclusive).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eT{char}\u003c/td\u003e\u003ctd\u003eTill after [count]’th occurrence of {char} to the left. The cursor is placed on the character right of {char} (inclusive).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e;\u003c/td\u003e\u003ctd\u003eRepeat latest f, t, F or T [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e,\u003c/td\u003e\u003ctd\u003eRepeat latest f, t, F or T in opposite direction [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e- \u003cminus\u003e\u003c/minus\u003e\u003c/td\u003e\u003ctd\u003e[count] lines upward, on the first non-blank character (linewise).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e+ or \u003cbr/\u003eCTRL-M or \u003cbr/\u003e\u003ccr\u003e\u003c/cr\u003e\u003c/td\u003e\u003ctd\u003e[count] lines downward, on the first non-blank character (linewise).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e_ \u003cunderscore\u003e\u003c/underscore\u003e\u003c/td\u003e\u003ctd\u003e[count] - 1 lines downward, on the first non-blank character (linewise).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cc-end\u003e or \u003cbr/\u003eG\u003c/c-end\u003e\u003c/td\u003e\u003ctd\u003eGoto line [count], default last line, on the first non-blank character.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cc-home\u003e or \u003cbr/\u003egg\u003c/c-home\u003e\u003c/td\u003e\u003ctd\u003eGoto line [count], default first line, on the first non-blank character.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cs-right\u003e or \u003cbr/\u003ew\u003c/s-right\u003e\u003c/td\u003e\u003ctd\u003e[count] words forward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cc-right\u003e or \u003cbr/\u003eW\u003c/c-right\u003e\u003c/td\u003e\u003ctd\u003e[count] WORDS forward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ee\u003c/td\u003e\u003ctd\u003eForward to the end of word [count]\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eE\u003c/td\u003e\u003ctd\u003eForward to the end of WORD [count]\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cs-left\u003e or \u003cbr/\u003eb\u003c/s-left\u003e\u003c/td\u003e\u003ctd\u003e[count] words backward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cc-left\u003e or \u003cbr/\u003eB\u003c/c-left\u003e\u003c/td\u003e\u003ctd\u003e[count] WORDS backward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ege\u003c/td\u003e\u003ctd\u003eBackward to the end of word [count]\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003egE\u003c/td\u003e\u003ctd\u003eBackward to the end of WORD [count]\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003eThese commands move over words or WORDS.\u003c/p\u003e\u003cp\u003eA word consists of a sequence of letters, digits and underscores, or a sequence of other non-blank characters, separated with white space (spaces, tabs, ). This can be changed with the ‘iskeyword’ option.\u003c/p\u003e\u003cp\u003eA WORD consists of a sequence of non-blank characters, separated with white space. An empty line is also considered to be a word and a WORD.\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e(\u003c/td\u003e\u003ctd\u003e[count] sentences backward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e)\u003c/td\u003e\u003ctd\u003e[count] sentences forward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e{\u003c/td\u003e\u003ctd\u003e[count] paragraphs backward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e}\u003c/td\u003e\u003ctd\u003e[count] paragraphs forward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e]]\u003c/td\u003e\u003ctd\u003e[count] sections forward or to the next ‘{‘ in the first column. When used after an operator, then the ‘}’ in the first column.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e][\u003c/td\u003e\u003ctd\u003e[count] sections forward or to the next ‘}’ in the first column\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[[\u003c/td\u003e\u003ctd\u003e[count] sections backward or to the previous ‘{‘ in the first column\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[]\u003c/td\u003e\u003ctd\u003e[count] sections backward or to the previous ‘}’ in the first column\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003eScreen movement commands\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003ez.\u003c/td\u003e\u003ctd\u003eCenter the screen on the cursor\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ezt\u003c/td\u003e\u003ctd\u003eScroll the screen so the cursor is at the top\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ezb\u003c/td\u003e\u003ctd\u003eScroll the screen so the cursor is at the bottom\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003ch2 id=\"Marks\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Marks\" class=\"headerlink\" title=\"Marks\"\u003e\u003c/a\u003eMarks\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003em{a-zA-Z}\u003c/td\u003e\u003ctd\u003eSet mark {a-zA-Z} at cursor position (does not move the cursor, this is not a motion command).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003em’ or \u003cbr/\u003em`\u003c/td\u003e\u003ctd\u003eSet the previous context mark. This can be jumped to with the “‘’” or “``” command (does not move the cursor, this is not a motion command).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[range]ma[rk] {a-zA-Z}\u003c/td\u003e\u003ctd\u003eSet mark {a-zA-Z} at last line number in [range], column 0. Default is cursor line.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[range]k{a-zA-Z}\u003c/td\u003e\u003ctd\u003eSame as :mark, but the space before the mark name can be omitted.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e‘{a-z}\u003c/td\u003e\u003ctd\u003eTo the first non-blank character on the line with mark {a-z} (linewise).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e‘{A-Z0-9}\u003c/td\u003e\u003ctd\u003eTo the first non-blank character on the line with mark {A-Z0-9} in the correct file\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e`{a-z}\u003c/td\u003e\u003ctd\u003eTo the mark {a-z}\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e`{A-Z0-9}\u003c/td\u003e\u003ctd\u003eTo the mark {A-Z0-9} in the correct file\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:marks\u003c/td\u003e\u003ctd\u003eList all the current marks (not a motion command).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:marks {arg}\u003c/td\u003e\u003ctd\u003eList the marks that are mentioned in {arg} (not a motion command). For example:\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003ch2 id=\"Searching\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Searching\" class=\"headerlink\" title=\"Searching\"\u003e\u003c/a\u003eSearching\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e/{pattern}[/]\u003c/td\u003e\u003ctd\u003eSearch forward for the [count]’th occurrence of {pattern}\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e/{pattern}/{offset}\u003c/td\u003e\u003ctd\u003eSearch forward for the [count]’th occurrence of {pattern} and go {offset} lines up or down.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e/\u003ccr\u003e\u003c/cr\u003e\u003c/td\u003e\u003ctd\u003eSearch forward for the [count]’th latest used pattern\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e//{offset}\u003ccr\u003e\u003c/cr\u003e\u003c/td\u003e\u003ctd\u003eSearch forward for the [count]’th latest used pattern with new. If {offset} is empty no offset is used.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e?{pattern}[?]\u003ccr\u003e\u003c/cr\u003e\u003c/td\u003e\u003ctd\u003eSearch backward for the [count]’th previous occurrence of {pattern}\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e?{pattern}?{offset}\u003ccr\u003e\u003c/cr\u003e\u003c/td\u003e\u003ctd\u003eSearch backward for the [count]’th previous occurrence of {pattern} and go {offset} lines up or down\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e?\u003ccr\u003e\u003c/cr\u003e\u003c/td\u003e\u003ctd\u003eSearch backward for the [count]’th latest used pattern\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e??{offset}\u003ccr\u003e\u003c/cr\u003e\u003c/td\u003e\u003ctd\u003eSearch backward for the [count]’th latest used pattern with new {offset}. If {offset} is empty no offset is used.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003en\u003c/td\u003e\u003ctd\u003eRepeat the latest “/“ or “?” [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eN\u003c/td\u003e\u003ctd\u003eRepeat the latest “/“ or “?” [count] times in opposite direction.\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003ch2 id=\"Selecting-Text-Visual-Mode\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Selecting-Text-Visual-Mode\" class=\"headerlink\" title=\"Selecting Text (Visual Mode)\"\u003e\u003c/a\u003eSelecting Text (Visual Mode)\u003c/h2\u003e\u003cp\u003eTo select text, enter visual mode with one of the commands below, and use \u003ca href=\"http://fprintf.net/vimCheatSheet.html#motion\"\u003emotion commands\u003c/a\u003e to highlight the text you are interested in. Then, use some command on the text.\u003c/p\u003e\u003cp\u003eThe operators that can be used are:\u003cbr/\u003e ~ switch case\u003cbr/\u003e d delete\u003cbr/\u003e c change\u003cbr/\u003e y yank\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e shift right\u003cbr/\u003e \u0026lt; shift left\u003cbr/\u003e ! filter through external command\u003cbr/\u003e = filter through ‘equalprg’ option command\u003cbr/\u003e gq format lines to ‘textwidth’ length \u003c/p\u003e\u003c/blockquote\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003ev\u003c/td\u003e\u003ctd\u003estart Visual mode per character.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eV\u003c/td\u003e\u003ctd\u003estart Visual mode linewise.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cesc\u003e\u003c/esc\u003e\u003c/td\u003e\u003ctd\u003eexit Visual mode without making any changes\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003ch2 id=\"How-to-Suspend\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#How-to-Suspend\" class=\"headerlink\" title=\"How to Suspend\"\u003e\u003c/a\u003eHow to Suspend\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003eCTRL-Z\u003c/td\u003e\u003ctd\u003eSuspend Vim, like “:stop”. Works in Normal and in Visual mode. In Insert and Command-line mode, the CTRL-Z is inserted as a normal character.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:sus[pend][!] or \u003cbr/\u003e:st[op][!]\u003c/td\u003e\u003ctd\u003eSuspend Vim. If the ‘!’ is not given and ‘autowrite’ is set, every buffer with changes and a file name is written out. If the ‘!’ is given or ‘autowrite’ is not set, changed buffers are not written, don’t forget to bring Vim back to the foreground later!\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003cp\u003e\u003ca href=\"http://www.catb.org/hacker-emblem/\"\u003e\u003cimg src=\"http://www.catb.org/hacker-emblem/glider.png\"/\u003e\u003c/a\u003e\u003c/p\u003e\u003cp\u003eDaniel Gryniewicz / \u003ca href=\"mailto:dang@fprintf.net\"\u003edang@fprintf.net\u003c/a\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/"},{"title":"基于Bash的目录级环境配置工具","time":"2023-09-26T15:46:55Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e最近对于Bash愈发迷恋,几乎任何会花费我超过30秒时间的任务,我都会考虑\u003cdel\u003e打个脚先\u003c/del\u003e写个脚本搞定。再比如说写博客,这种纯输出流就很适合Vim啊,作为一个Vim\u003cdel\u003e批\u003c/del\u003e必然是原教旨主义最好啊:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://mxts.jiujiuer.xyz/img/Pasted%20image%2020230926235753.png\" alt=\"算了截图还是用Obsidian粘吧\"/\u003e\u003c/p\u003e\u003cp\u003e但是除了截图粘贴不方便外,还有一些比较难受的地方。在Obsidian里边我是能直接用插件的各种功能快速编写博客的,虽然在Bash终端环境下编写脚本确实更方便了,但是脚本一多,目录就乱的不能看力:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 强迫症是病,得治\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── about\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── _archive\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── deploy.sh\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── _draft\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── how-much-did-i-write.sh\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── img\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── img-uri-process.sh\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── _inbox\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── links\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── new-post.sh\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── _posts\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e└── _scaffolds\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9 directories, 4 files\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e三个脚本,一个是统计字数的,一个是用\u003ccode\u003esed\u003c/code\u003e处理图片链接的,还有一个是从模板新建博客的。每次打开目录看到这仨在中间总觉得很别扭。\u003c/p\u003e\u003cp\u003e除了这,还有就是用起来也不方便:前面要是不加\u003ccode\u003e./\u003c/code\u003e就能直接用就好了\u003cdel\u003e懒也是病得治\u003c/del\u003e\u003c/p\u003e\u003cp\u003e所以,需求大概就是这样:目录级别的环境变量配置,并且支持还得够完善,不能离开目录了配置还在生效,不然脚本在其他目录跑飞了想想就恐怖。\u003c/p\u003e\u003ch2 id=\"Basic-Implementation\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/26/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/%E5%9F%BA%E4%BA%8EBash%E7%9A%84%E7%9B%AE%E5%BD%95%E7%BA%A7%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E5%B7%A5%E5%85%B7/#Basic-Implementation\" class=\"headerlink\" title=\"Basic Implementation\"\u003e\u003c/a\u003eBasic Implementation\u003c/h2\u003e\u003cp\u003e首先定位清楚,这个对\u003ccode\u003ecd\u003c/code\u003e的Hook只是在指令完成后,加载或者取消配置局部环境变量。因此大概实现方式和结构都有合适的选择。\u003c/p\u003e\u003cul\u003e\u003cli\u003e程序扔\u003ccode\u003e~/.bashrc\u003c/code\u003e里,或者\u003ccode\u003e/etc/profile\u003c/code\u003e里。不过我一般在GUI用konsole比较多,所以就放\u003ccode\u003e.bashrc\u003c/code\u003e里了,也方便dotfile管理。\u003c/li\u003e\u003cli\u003e把具体实现用\u003ccode\u003ealias\u003c/code\u003e赋别名为\u003ccode\u003ecd\u003c/code\u003e达到重载(或者说Hook)\u003ccode\u003ecd\u003c/code\u003e的目的。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e基于上面这两条,这是我写一个粗略实现(没干掉bash基本使用就是能用\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"function\"\u003e\u003cspan class=\"title\"\u003ecd_hook\u003c/span\u003e\u003c/span\u003e() {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"comment\"\u003e# The normal cd\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e [ \u003cspan class=\"variable\"\u003e$#\u003c/span\u003e == 0 ]; \u003cspan class=\"keyword\"\u003ethen\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eelse\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$1\u003c/span\u003e\u0026#34;\u003c/span\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efi\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"comment\"\u003e# If the dir contains bashrc, launch the sub shell and load it\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e [ -f \u003cspan class=\"string\"\u003e\u0026#34;.bashrc\u0026#34;\u003c/span\u003e ] \u0026amp;\u0026amp; [ \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"subst\"\u003e$(pwd)\u003c/span\u003e\u0026#34;\u003c/span\u003e != \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"subst\"\u003e$(getent passwd $USER | awk -F \u0026#39;:\u0026#39; \u0026#39;{print $6}\u0026#39;)\u003c/span\u003e\u0026#34;\u003c/span\u003e ]; \u003cspan class=\"keyword\"\u003ethen\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003epushd\u003c/span\u003e . \u0026gt; /dev/null\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e bash --init-file \u0026lt;(\u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e /etc/profile ~/.bashrc .bashrc)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003efi\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ealias\u003c/span\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#39;cd_hook\u0026#39;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面有依托用来检测是否是家目录的指令来避免套娃(虽然理论上充重复加载家目录配置应该没啥),然后是检测当前目录下(因为是先\u003ccode\u003ecd\u003c/code\u003e过去的嘛,所以\u003ccode\u003epwd\u003c/code\u003e已经变了)是否有\u003ccode\u003e.bashrc\u003c/code\u003e,有的话就把它作为子参数,和家目录下的bashrc一起传给子bash,然后启动它。\u003c/p\u003e\u003cp\u003e这样就能实现cd后自动加载目录下的配置了。赶紧试试:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# My blog\u0026#39;s utiilties and aliases\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eset\u003c/span\u003e -e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTMPL=$(find ./_scaffolds | grep .md)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"function\"\u003e\u003cspan class=\"title\"\u003edeploy\u003c/span\u003e\u003c/span\u003e() {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e ..\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e (\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003erm\u003c/span\u003e -rf deploy \u0026amp;\u0026amp; \u003cspan class=\"built_in\"\u003ecp\u003c/span\u003e -r blog deploy\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e deploy \u0026amp;\u0026amp; git checkout deploy\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ecp\u003c/span\u003e -r blog deploy/source\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e deploy \u0026amp;\u0026amp; pnpm i \u0026amp;\u0026amp; pnpm run server\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e )\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"function\"\u003e\u003cspan class=\"title\"\u003eimage_url_proc\u003c/span\u003e\u003c/span\u003e() {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e find . -\u003cspan class=\"built_in\"\u003etype\u003c/span\u003e f -name \u003cspan class=\"string\"\u003e\u0026#34;*.md\u0026#34;\u003c/span\u003e -\u003cspan class=\"built_in\"\u003eexec\u003c/span\u003e sed -i \u003cspan class=\"string\"\u003e\u0026#39;s/\\!\\[\\[\\(.*\\)\\/\\(.*\\)\\]\\]/\\!\\[\\2\\]\\(\\/img\\/\\2\\)/gi\u0026#39;\u003c/span\u003e {}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"function\"\u003e\u003cspan class=\"title\"\u003enew_post\u003c/span\u003e\u003c/span\u003e() {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sed -e \u003cspan class=\"string\"\u003e\u0026#34;s/{{title}}/\u003cspan class=\"variable\"\u003e$1\u003c/span\u003e/\u0026#34;\u003c/span\u003e -e \u003cspan class=\"string\"\u003e\u0026#34;s/{{date}} {{time}}/\u003cspan class=\"subst\"\u003e$(date \u0026#39;+%Y-%m-%d %H:%M:%S\u0026#39;)\u003c/span\u003e/\u0026#34;\u003c/span\u003e \u003cspan class=\"variable\"\u003e$TMPL\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"function\"\u003e\u003cspan class=\"title\"\u003eline_count\u003c/span\u003e\u003c/span\u003e() {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;You have wrote \u003cspan class=\"subst\"\u003e$(find _* -name *.md | xargs cat 2\u0026gt;/dev/null | wc -l)\u003c/span\u003e lines in total!\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003ecd到目录里边试试\u003ccode\u003eline_count\u003c/code\u003e:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003exeonds@ark-station-breeze:~/Documents/blog$ line_count\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eYou have wrote 36570 lines \u003cspan class=\"keyword\"\u003ein\u003c/span\u003e total!\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003exeonds@ark-station-breeze:~/Documents/blog$ \u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e好好好,再看看目录结构:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── .bashrc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── about\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── _archive\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── _draft\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── img\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── _inbox\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── links\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── _posts\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e└── _scaffolds\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 9 directories, 1 files\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e爽死。\u003c/p\u003e\u003cp\u003e慢着,里边还有一行\u003ccode\u003epushd\u003c/code\u003e呢。嗯,这是后面用来实现自动退出子Shell的关键。具体实现等到下一部分再说吧,先睡了。\u003c/p\u003e\u003cp\u003e后来感觉这样有点太麻烦了,于是就把脚本简化了一下:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"function\"\u003e\u003cspan class=\"title\"\u003ecd\u003c/span\u003e\u003c/span\u003e() {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ebuiltin\u003c/span\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$@\u003c/span\u003e\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e [[ -f \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$PWD\u003c/span\u003e/.bashrc\u0026#34;\u003c/span\u003e ]]; \u003cspan class=\"keyword\"\u003ethen\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexec\u003c/span\u003e bash --rcfile \u0026lt;(\u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e ~/.bashrc \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$PWD\u003c/span\u003e/.bashrc\u0026#34;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eelse\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexec\u003c/span\u003e bash --rcfile \u0026lt;(\u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e ~/.bashrc)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003efi\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e逻辑很简单,先直通参数执行完内置\u003ccode\u003ecd\u003c/code\u003e,然后判断目的目录底下有没有\u003ccode\u003e.bashrc\u003c/code\u003e,有的话直接\u003ccode\u003eexec\u003c/code\u003e一个新的bash来加载这个配置文件和\u003ccode\u003e~/\u003c/code\u003e下的默认配置;如果没有的话,也\u003ccode\u003eexec\u003c/code\u003e一个新的bash替换当前进程。\u003c/p\u003e\u003cp\u003e之所以到一个新目录都要开一个新的进程替换当前进程,是为了使得只有在当前目录底下才可以使用当前文件夹的环境变量。不过这也带来了新的问题:那就是执行一些包含\u003ccode\u003ecd\u003c/code\u003e的脚本时,会因为\u003ccode\u003eexec\u003c/code\u003e用新的进程覆盖了当前进程的原因,导致脚本执行终止。\u003c/p\u003e\u003cp\u003e最后想了下,Makefile不也挺好用的(笑)。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/09/26/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/%E5%9F%BA%E4%BA%8EBash%E7%9A%84%E7%9B%AE%E5%BD%95%E7%BA%A7%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E5%B7%A5%E5%85%B7/"},{"title":"SSH学习笔记","time":"2023-09-25T06:16:18Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e文章是我和GPT一块写的,回头再慢慢丰富润色。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003eOpenSSH是一种强大的远程登录和数据传输工具,也是SSH协议目前最流行的实现。它提供了许多安全功能,如数据加密、身份验证和会话完整性。安全性上,SSH能吊着明文传输的Telnet打。并且SSH的配置也相对容易,目前基本所有主流Linux发行版都默认安装了OpenSSH,Win10/11也自带了OpenSSH Cilent。\u003c/p\u003e\u003cp\u003e追求效率提升,首先需要看看日常重复次数最多的操作,然后试着优化——比如SSH,虽然每次只有1,2秒,但累积起来节省的时间也不少。配置好了基本能实现无感登陆那种程度,让你几乎忘掉这个环节,还是挺爽的。除了效率,提升点安全性也是挺好的:公网服务器改用密钥登陆,又无感又安全——只要密钥别丢。\u003c/p\u003e\u003ch2 id=\"基本用法\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/25/ssh-usage/#%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95\" class=\"headerlink\" title=\"基本用法\"\u003e\u003c/a\u003e基本用法\u003c/h2\u003e\u003ch3 id=\"远程登录\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/25/ssh-usage/#%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95\" class=\"headerlink\" title=\"远程登录\"\u003e\u003c/a\u003e远程登录\u003c/h3\u003e\u003cp\u003e基本格式:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh [options] [username]@[hostname] \u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e\u003ccode\u003e[username]\u003c/code\u003e 是远程主机的用户名,\u003ccode\u003e[hostname]\u003c/code\u003e 是远程主机的主机名或 IP 地址。\u003c/p\u003e\u003cp\u003e\u003ccode\u003e[options]\u003c/code\u003e 是可选的参数,例如 \u003ccode\u003e-i\u003c/code\u003e 指定要使用的私钥文件,\u003ccode\u003e-L\u003c/code\u003e 指定要使用的本地端口转发,\u003ccode\u003e-R\u003c/code\u003e 指定要使用的远程端口转发等。\u003c/p\u003e\u003cp\u003e一般用的最多的是默认端口密码登陆:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh username@hostname \u0026lt;-p 22\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e后面的\u003ccode\u003e-p 22\u003c/code\u003e是缺省参数,可以不加。\u003c/p\u003e\u003cp\u003e不过密码登陆安全性并不太高,建议重要场合上密钥登陆。例如,用密钥文件 \u003ccode\u003eid_rsa\u003c/code\u003e 以用户 \u003ccode\u003eusername\u003c/code\u003e 登录远程主机 \u003ccode\u003eexample.com\u003c/code\u003e:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh -i id-rsa username@example.com\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e密钥和公钥就像锁和钥匙一一对应,你可以用同一对公钥密钥登陆多个主机,不过显然不太安全。建议一对公密钥只用于一个服务器的登陆。\u003c/p\u003e\u003cp\u003e它们的创建很简单,使用 \u003ccode\u003eOpenSSH\u003c/code\u003e 自带的 \u003ccode\u003essh-keygen\u003c/code\u003e 命令即可:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003exeonds@ark-station:~$ ssh-keygen \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eGenerating public/private ed25519 key pair.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eEnter file \u003cspan class=\"keyword\"\u003ein\u003c/span\u003e \u003cspan class=\"built_in\"\u003ewhich\u003c/span\u003e to save the key (/home/xeonds/.ssh/id_ed25519): example-key \u003cspan class=\"comment\"\u003e# 指定公钥私钥保存在哪\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eEnter passphrase (empty \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e no passphrase): \u003cspan class=\"comment\"\u003e# 指定私钥使用密码\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eEnter same passphrase again: \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eYour identification has been saved \u003cspan class=\"keyword\"\u003ein\u003c/span\u003e example-key\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eYour public key has been saved \u003cspan class=\"keyword\"\u003ein\u003c/span\u003e example-key.pub\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eThe key fingerprint is:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSHA256:tFoZLdZFg3HDMqGG6rC5jq+zysxClfBCUvffMYgS5GY xeonds@ark-station\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eThe key\u003cspan class=\"string\"\u003e\u0026#39;s randomart image is:\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e+--[ED25519 256]--+\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e| ...+ o** |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e|.o o o o =+o.o |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e|o o E + O =o |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e| . * o = * o |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e| + . S . |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e| . = o |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e|. o . . |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e|*. . |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e|BX+ |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e+----[SHA256]-----+\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003exeonds@ark-station:~$ ls | grep example\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eexample-key\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eexample-key.pub\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面带\u003ccode\u003e.pub\u003c/code\u003e后缀的就是公钥,私钥是不带后缀的那个。创建完成之后,可以用 \u003ccode\u003essh-copy-id\u003c/code\u003e 把公钥传给你要登陆的服务器,把私钥妥善保管好:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh-copy-id -i example-key.pub username@example.com\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e还可以用\u003ccode\u003e-p xxxx\u003c/code\u003e指定端口。传完之后就能用前面的指令登陆服务器了。但是这样也挺麻烦的对吧。你别急,还有办法:把下面的内容保存到你的\u003ccode\u003e~/.ssh/config\u003c/code\u003e文件中:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eHost my-server\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e HostName example.com\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e User username\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Port 22 # 端口默认22的话可以不写\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e IdentityFile ~/.ssh/example-key # 指向你的密钥路径\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e PreferredAuthentications publickey # 指定优先使用公钥\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e现在就可以直接用下面的指令登陆了:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh my-server\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e直接登陆,几乎无感。当然要是你给私钥设置密码了就得在登陆的时候再输入一遍密码。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e不过跟现代计算机系统比起来,还是人参与的环节更加脆弱,最终还是得小心社工手段。\u003c/p\u003e\u003c/blockquote\u003e\u003ch3 id=\"断开连接\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/25/ssh-usage/#%E6%96%AD%E5%BC%80%E8%BF%9E%E6%8E%A5\" class=\"headerlink\" title=\"断开连接\"\u003e\u003c/a\u003e断开连接\u003c/h3\u003e\u003cp\u003e因为忘了断开另一个开发机的ssh连接导致我有几个端口一直被占用着,所以得想办法断开另一台机器的连接:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003ew \u003cspan class=\"comment\"\u003e# 查看所有连接\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epkill -\u003cspan class=\"built_in\"\u003ekill\u003c/span\u003e -t pts/x \u003cspan class=\"comment\"\u003e# 断开编号为x的连接\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epkill -9 -t pts/x \u003cspan class=\"comment\"\u003e# 和上边一样,不过是强制断联\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e不过不知道为啥好像远程shell的服务还活着,只能手动杀掉了。下次建议用tmux,省事省心。\u003c/p\u003e\u003ch3 id=\"传输文件\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/25/ssh-usage/#%E4%BC%A0%E8%BE%93%E6%96%87%E4%BB%B6\" class=\"headerlink\" title=\"传输文件\"\u003e\u003c/a\u003e传输文件\u003c/h3\u003e\u003cp\u003eOpenSSH 还提供了一种安全传输文件的方法,称为 SFTP(SSH 文件传输协议)。要使用 SFTP 传输文件,您需要使用以下命令:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esftp [options] [username]@[hostname] \u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e其中,\u003ccode\u003e[options]\u003c/code\u003e 是可选的参数,例如 \u003ccode\u003e-i\u003c/code\u003e 指定要使用的私钥文件,\u003ccode\u003e-L\u003c/code\u003e 指定要使用的本地端口转发,\u003ccode\u003e-R\u003c/code\u003e 指定要使用的远程端口转发等。\u003ccode\u003e[username]\u003c/code\u003e 是远程主机的用户名,\u003ccode\u003e[hostname]\u003c/code\u003e 是远程主机的主机名或 IP 地址。\u003cbr/\u003e例如,如果您要使用密钥文件 \u003ccode\u003eid_rsa\u003c/code\u003e 将本地文件 \u003ccode\u003efile.txt\u003c/code\u003e 传输到远程主机 \u003ccode\u003eexample.com\u003c/code\u003e,可以使用以下命令:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esftp -i id_rsa example.com \u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"高级用法\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/25/ssh-usage/#%E9%AB%98%E7%BA%A7%E7%94%A8%E6%B3%95\" class=\"headerlink\" title=\"高级用法\"\u003e\u003c/a\u003e高级用法\u003c/h2\u003e\u003ch3 id=\"1-端口转发\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/25/ssh-usage/#1-%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91\" class=\"headerlink\" title=\"1. 端口转发\"\u003e\u003c/a\u003e1. 端口转发\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003eref:\u003ca href=\"https://zhuanlan.zhihu.com/p/57630633\"\u003eSSH命令的三种代理功能 - 韦易笑\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003eOpenSSH 提供了一种称为端口转发的功能,允许您将本地端口与远程端口进行映射。这使得您可以在本地网络上使用远程服务,而无需将服务暴露给外部网络。要使用端口转发,您需要使用以下命令:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh -L [local_port:]local_host [username]@[hostname] \u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e其中,\u003ccode\u003e[local_port]\u003c/code\u003e 是本地端口的名称,\u003ccode\u003elocal_host\u003c/code\u003e 是本地主机的名称或 IP 地址,\u003ccode\u003e[username]\u003c/code\u003e 是远程主机的用户名,\u003ccode\u003e[hostname]\u003c/code\u003e 是远程主机的主机名或 IP 地址。\u003cbr/\u003e例如,如果您要将本地端口 8080 映射到远程主机的 SSH 服务(端口 22),可以使用以下命令:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh -L 8080:localhost username@example.com \u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面的指令就能很轻易实现基于\u003ccode\u003exxx over SSH\u003c/code\u003e的内网穿透。举个例子,前面我配置好了我的服务器的\u003ccode\u003essh config\u003c/code\u003e,假设我的服务器配置项名为\u003ccode\u003eserver\u003c/code\u003e,在局域网中有一台地址为\u003ccode\u003e1.14.5.14\u003c/code\u003e的Windows服务器,那么我就可以使用一行指令通过SSH跳转连接到这台Windows服务器的远程桌面:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh -L 3389:1.14.5.14:3389 server -N \u0026amp; rdesktop localhost\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e假设我的这台服务器\u003ccode\u003eserver\u003c/code\u003e在层层内网中,需要经过多重跳板才能从公网进行访问,一般的远程桌面面对这种网络环境可能比较困难,但是对于上面的\u003ccode\u003eRDP over SSH\u003c/code\u003e,这种方法既能享受\u003ccode\u003eSSH\u003c/code\u003e的安全性,又能相对便利地进行访问——只要配置好这台\u003ccode\u003eserver\u003c/code\u003e服务器的\u003ccode\u003eProxyJump\u003c/code\u003e路径和登陆就行。\u003c/p\u003e\u003cp\u003e端口转发有三种方式,上边的\u003ccode\u003e-L\u003c/code\u003e是正向代理,也就是在本地启动端口,把本地的数据转发到远端。上面转发桌面的例子就是这样,把本地3389端口的RDP请求转发到了远端的3389端口,从而实现了从本地访问远程服务器所在局域网的计算机的需求。另外两种分别是反向代理\u003ccode\u003e-R\u003c/code\u003e和socks5代理\u003ccode\u003e-D\u003c/code\u003e。这个一般可以作为兜底方案,长期需求建议上服务器。\u003c/p\u003e\u003cp\u003e按照正向代理的思路,反向代理就是把远端端口的访问请求转发到本地的计算机上。比如访问一个公网计算机的1234端口,就可以通过\u003ccode\u003e-R\u003c/code\u003e启动反向代理将这个端口的请求转发到本地的任意端口(比如4514)从而将内网的某个服务映射到公网中。这一点特别适合临时给某个服务搭建一个预览平台。\u003c/p\u003e\u003cp\u003e另外就是socks5转发,可以直接点上边链接看原文,这种我还没用过就不做阐述了。\u003c/p\u003e\u003cp\u003e下面用指令总结下这几种代理方式:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 转发本地请求到远端,例如访问远程局域网的远程桌面\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003essh -L [本地主机所在局域网任意主机:端口]:[目标主机所在局域网任意主机:端口] 要连接的主机\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 转发远端请求到本地,例如穿透本机某端口的服务到公网\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003essh -R [远端主机:端口]:[本地主机局域网任意主机:端口] 远端主机\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 本地socks5代理,效果大概就是让远端主机成为自己1080端口的上网代理?\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 完成之后,在浏览器代理设置里边设置代理为socks5,地址为localhost:1080就行\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003essh -D localhost:1080 远端主机\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003col start=\"2\"\u003e\u003cli\u003e连接后执行一条指令后断开\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e直接在连接命令后边跟上要执行的指令就行。\u003c/p\u003e\u003col start=\"3\"\u003e\u003cli\u003e在远程主机运行X程序\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e连接命令加上\u003ccode\u003e-X\u003c/code\u003e参数,然后主机就会开启X转发。用\u003ccode\u003e-x\u003c/code\u003e则是关闭X转发。没用过,不过看起来像是服务器上跑进程,本地跑GUI的做法?\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/09/25/ssh-usage/"},{"title":"Flutter速通指南","time":"2023-09-16T08:34:35Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e2023 XDU-OSC Community - Presented with love by BenderBlog/SuperBart\u003c/p\u003e\u003cp\u003e借助Flutter,他重新实现了校内十分流行的工具软件电表,使得用iOS的同学也有了自己的电表可用。开源和Flutter带来的,对于开发工作的简化\u003cdel\u003e以及SuperBart的超级肝力\u003c/del\u003e都成为了它能迅速上架iOS并迅速迭代的原因。\u003c/p\u003e\u003cp\u003e原生的电表iOS版本使用了iOS Native开发,在开发效率上略低于先天统一了不同平台实现的Flutter。在运行效率上的提升在业务都相对比较简单的情况下并没有很显著的优势。\u003c/p\u003e\u003cp\u003e其实上面这点也是现在原生客户端开发面对的问题。原生带来了更细致入微的操作粒度,带来更极致的原生性能利用率的同时,对于开发者心智的负担要求很高,也对开发者的能力深入性和熟练度提出了很高的要求;应对这一点的解决方案,有使用Web技术统一全端(就是性能问题和资源利用率一直饱受诟病),也有使用像Flutter这样的混合跨平台框架。后者性能损失相对没那么严重,跨平台能力也相对不错,但是动态程序的本质让它对于低性能设备的友好度较低(比如现在的百度贴吧客户端就是Flutter客户端,面对长列表的加载等场景偶尔会出现崩溃等问题)。\u003c/p\u003e\u003cp\u003e开发效率和程序运行表现基本是一对负相关的参数,其中的取舍就是开发者需要考虑的问题。在程序开发领域,没有银弹。\u003c/p\u003e\u003ch2 id=\"SuperBart的讲座\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#SuperBart%E7%9A%84%E8%AE%B2%E5%BA%A7\" class=\"headerlink\" title=\"SuperBart的讲座\"\u003e\u003c/a\u003eSuperBart的讲座\u003c/h2\u003e\u003ch3 id=\"Flutter概要\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#Flutter%E6%A6%82%E8%A6%81\" class=\"headerlink\" title=\"Flutter概要\"\u003e\u003c/a\u003eFlutter概要\u003c/h3\u003e\u003cp\u003e一套代码 (\u003ccode\u003e./lib\u003c/code\u003e), 多平台运行.\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eandroid, windows, linux, ios等.\u003c/p\u003e\u003c/blockquote\u003e\u003cul\u003e\u003cli\u003e面向客户端\u003c/li\u003e\u003cli\u003e平台无关\u003c/li\u003e\u003cli\u003e上手简单\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eFlutter的开发语言是Dart,初见印象:Dart= JS/C++(语言友好度和性能上) + Java(代码风格上) + Dart VM\u003c/p\u003e\u003ch3 id=\"Basic-code-format\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#Basic-code-format\" class=\"headerlink\" title=\"Basic code format\"\u003e\u003c/a\u003eBasic code format\u003c/h3\u003e\u003cp\u003etldr\u003c/p\u003e\u003cul\u003e\u003cli\u003eEmpty safety: \u003ccode\u003etype?\u003c/code\u003e means var is nullable\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eThis will trigger empty check, avoid npe\u003c/p\u003e\u003cul\u003e\u003cli\u003elate init\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eJust like Kotlin\u003c/p\u003e\u003cul\u003e\u003cli\u003eAsync\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"Basic-layouts\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#Basic-layouts\" class=\"headerlink\" title=\"Basic layouts\"\u003e\u003c/a\u003eBasic layouts\u003c/h3\u003e\u003cul\u003e\u003cli\u003eWidget\u003c/li\u003e\u003cli\u003eText\u003c/li\u003e\u003cli\u003eWarp\u003c/li\u003e\u003cli\u003eRow-Column\u003c/li\u003e\u003cli\u003eContainer\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"Basic-scaffolds\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#Basic-scaffolds\" class=\"headerlink\" title=\"Basic scaffolds\"\u003e\u003c/a\u003eBasic scaffolds\u003c/h3\u003e\u003cul\u003e\u003cli\u003eAppBar\u003c/li\u003e\u003cli\u003eAction\u003c/li\u003e\u003cli\u003eTItle\u003c/li\u003e\u003cli\u003eTabBar\u003c/li\u003e\u003cli\u003eBody\u003c/li\u003e\u003cli\u003eBottomBar\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"Network\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#Network\" class=\"headerlink\" title=\"Network\"\u003e\u003c/a\u003eNetwork\u003c/h3\u003e\u003cp\u003e主要使用\u003ccode\u003eFlutter\u003c/code\u003e的\u003ccode\u003eDio\u003c/code\u003e。不过我用\u003ccode\u003ehttp/http.dart\u003c/code\u003e更多。\u003c/p\u003e\u003ch2 id=\"开发笔记\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#%E5%BC%80%E5%8F%91%E7%AC%94%E8%AE%B0\" class=\"headerlink\" title=\"开发笔记\"\u003e\u003c/a\u003e开发笔记\u003c/h2\u003e\u003cp\u003e评价是Flutter这玩意搓东西真的快。\u003c/p\u003e\u003cp\u003eFlutter使用的dart语言,强类型和可写性平衡的挺舒服的。语法上,Dart算是JavaScript的继承,语法大差不差,改进了JavaScript混乱的类型系统,还封装了不少挺不错的语法特性,比如那个Future,用着还行。还有内置的高级数据结构之类的,用着挺省心。\u003c/p\u003e\u003cp\u003e不过写这东西,我好像很少单独注意语法层面的东西,一般都是定义个返回Widget的build函数完事。另外这语言比较像DSL,没见过别处有用这玩意的。\u003c/p\u003e\u003ch3 id=\"关于WebViewWidget\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#%E5%85%B3%E4%BA%8EWebViewWidget\" class=\"headerlink\" title=\"关于WebViewWidget\"\u003e\u003c/a\u003e关于WebViewWidget\u003c/h3\u003e\u003cp\u003e这玩意比较坑的一点是它只支持Android和iOS平台,对于Windows/Linux/Web平台,这玩意都是不支持的。。\u003c/p\u003e\u003cp\u003e所以review同学的代码的时候,发现在我用Linux平台跑的时候报错了。搜了下才发现这问题。\u003c/p\u003e\u003cp\u003e不过也无所谓了,反正这玩意本来就只是在Android/iOS上跑的。\u003c/p\u003e\u003ch3 id=\"关于TextEditController\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#%E5%85%B3%E4%BA%8ETextEditController\" class=\"headerlink\" title=\"关于TextEditController\"\u003e\u003c/a\u003e关于TextEditController\u003c/h3\u003e\u003cp\u003e声明一个文本框时,它会默认初始化一个TextEditController。如果你传递给它你定义的Controller,它就会使用你提供的而不是自己创建。另外特别注意,给TextField赋值这一项的行为不是常量表达式,不能在它和它的父结构中使用\u003ccode\u003econst\u003c/code\u003e关键字。\u003c/p\u003e\u003ch3 id=\"关于sqflite\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#%E5%85%B3%E4%BA%8Esqflite\" class=\"headerlink\" title=\"关于sqflite\"\u003e\u003c/a\u003e关于sqflite\u003c/h3\u003e\u003cp\u003e这玩意有大坑(关于平台兼容性上的)。反正我目前尝试之后发现要么支持Windows/Linux/Mac等桌面端,要么支持Android/iOS等移动端的SQLite使用。\u003c/p\u003e\u003ch3 id=\"关于ListView\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#%E5%85%B3%E4%BA%8EListView\" class=\"headerlink\" title=\"关于ListView\"\u003e\u003c/a\u003e关于ListView\u003c/h3\u003e\u003cp\u003e关于这个东西,得注意的就是嵌套使用。嵌套的子\u003ccode\u003eListView\u003c/code\u003e,需要设置如下两个属性来避免滚定判定失效:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eshrinkWrap: true,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ephysics: const NeverScrollableScrollPhysics(),\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"关于项目结构\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#%E5%85%B3%E4%BA%8E%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84\" class=\"headerlink\" title=\"关于项目结构\"\u003e\u003c/a\u003e关于项目结构\u003c/h3\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003elib/\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- models/ // Define your data entities here\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- entity1.dart\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- entity2.dart\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- services/ // Implement background service here\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- background_service.dart\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- screens/ // Screens of your app\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- screen1/ // Screen 1 related files\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- screen1.dart\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- screen1_bloc.dart // If you\u0026#39;re using BLoC pattern\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- screen2/ // Screen 2 related files\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- screen2.dart\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- screen2_bloc.dart // If you\u0026#39;re using BLoC pattern\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- settings/ // Settings related pages\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- settings.dart\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- sub_setting1.dart\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- sub_setting2.dart\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- widgets/ // Reusable widgets\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- providers/ // Provider setup and providers for data and services\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- app_provider.dart // Main provider setup\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- data_provider.dart // Provider for CRUD actions on data entities\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- service_provider.dart // Provider for background service\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- main.dart // Entry point of the app\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e功能划分基本就这几块:UI,状态管理服务,数据实体,后台服务。代码嘛,能简洁点最好。\u003c/p\u003e\u003cp\u003e另外就我的开发经验而言,最好不要过早规范化工程化。早期过于强调规范和过程的收益是负的。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/"},{"title":"C++-STL速通","time":"2023-09-14T14:09:12Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003eC++用的比较少,最近准备试试CSP。于是就得赶紧学学STL。以前是用过,但是没咋记下来。\u003c/p\u003e\u003cp\u003e想查看所有std实体的话,使用下面的指令:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eapropos -r \u003cspan class=\"string\"\u003e\u0026#39;^std\u0026#39;\u003c/span\u003e | vim -\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e关于\u003ccode\u003eapropos\u003c/code\u003e,它是LINUX系统中的一个命令,用来通过关键字查找定位手册页的名字和描述。 它相当于使用带有-k选项的man命令。 每个手册页里都有一个简短的描述。 apropos在这个描述中查找keyword。这是使用\u003ccode\u003eman\u003c/code\u003e 帮助文档的一个好工具。\u003c/p\u003e\u003ch2 id=\"分类\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#%E5%88%86%E7%B1%BB\" class=\"headerlink\" title=\"分类\"\u003e\u003c/a\u003e分类\u003c/h2\u003e\u003cul\u003e\u003cli\u003e顺序式:\u003ccode\u003evector, list, deque\u003c/code\u003e\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ebegin\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eend\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003erbegin\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003erend\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003efront\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eback\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eerase\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eclear\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003epush_back\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003epop_back\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003einsert\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"Vector\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#Vector\" class=\"headerlink\" title=\"Vector\"\u003e\u003c/a\u003eVector\u003c/h3\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;vector\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e简而言之就是数组,但是优化过,缝合了诸如队列、栈一类的特性。\u003c/p\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003evector\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; vec; \u003cspan class=\"comment\"\u003e// 声明一个空的vector\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003evector\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003evec\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"number\"\u003e5\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003evector\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003evec\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"number\"\u003e10\u003c/span\u003e, \u003cspan class=\"number\"\u003e1\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// 大小为10, 初始值为1\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003evector\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003evec\u003c/span\u003e\u003cspan class=\"params\"\u003e(oldVec)\u003c/span\u003e\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003evector\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003evec\u003c/span\u003e\u003cspan class=\"params\"\u003e(oldVec.begin(), dolVec.begin()+\u003cspan class=\"number\"\u003e3\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e arr[\u003cspan class=\"number\"\u003e5\u003c/span\u003e] = {\u003cspan class=\"number\"\u003e1\u003c/span\u003e, \u003cspan class=\"number\"\u003e2\u003c/span\u003e, \u003cspan class=\"number\"\u003e3\u003c/span\u003e, \u003cspan class=\"number\"\u003e4\u003c/span\u003e, \u003cspan class=\"number\"\u003e5\u003c/span\u003e};\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003evector\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003evec\u003c/span\u003e\u003cspan class=\"params\"\u003e(arr, arr+\u003cspan class=\"number\"\u003e5\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// 用数组初始化vec\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003evector\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003evec\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u0026amp;arr[\u003cspan class=\"number\"\u003e0\u003c/span\u003e], \u0026amp;arr[\u003cspan class=\"number\"\u003e5\u003c/span\u003e])\u003c/span\u003e\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// 用数组初始化vec, 注意这里是超尾, 与end相对应\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e那么如果我希望直接在下标为5的位置直接放入这个3呢,那不是需要先往里塞入5个0才可以么?这种情况,我们就可以定义一下vector的长度,然后就可以当做数组一样用了\u003c/p\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003evector\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003ea\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"number\"\u003e10\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ea[\u003cspan class=\"number\"\u003e5\u003c/span\u003e] = \u003cspan class=\"number\"\u003e3\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"List\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#List\" class=\"headerlink\" title=\"List\"\u003e\u003c/a\u003eList\u003c/h3\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;list\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e双向链表。因此并不支持随机访问。尾部插入元素效率很高。\u003c/p\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003elist\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; l;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003elist\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003el\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"number\"\u003e5\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// 含有5个元素的list, 初始值为0\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003elist\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003el\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"number\"\u003e10\u003c/span\u003e, \u003cspan class=\"number\"\u003e1\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// 含有10个元素的list, 初始值为1\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003elist\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003el\u003c/span\u003e\u003cspan class=\"params\"\u003e(oldL)\u003c/span\u003e\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// 复制构造\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003elist\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003el\u003c/span\u003e\u003cspan class=\"params\"\u003e(oldL.begin(), oldL.end())\u003c/span\u003e\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e arr[\u003cspan class=\"number\"\u003e5\u003c/span\u003e] = {\u003cspan class=\"number\"\u003e1\u003c/span\u003e, \u003cspan class=\"number\"\u003e2\u003c/span\u003e, \u003cspan class=\"number\"\u003e3\u003c/span\u003e, \u003cspan class=\"number\"\u003e4\u003c/span\u003e, \u003cspan class=\"number\"\u003e5\u003c/span\u003e};\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003elist\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003el\u003c/span\u003e\u003cspan class=\"params\"\u003e(arr, arr+\u003cspan class=\"number\"\u003e5\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// 用数组初始化list\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003elist\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003el\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u0026amp;arr[\u003cspan class=\"number\"\u003e1\u003c/span\u003e], \u0026amp;arr[\u003cspan class=\"number\"\u003e5\u003c/span\u003e])\u003c/span\u003e\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// 用数组初始化list\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003elist.\u003cspan class=\"built_in\"\u003emerge\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 合并两个list\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003elist.\u003cspan class=\"built_in\"\u003eremove\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003elist.\u003cspan class=\"built_in\"\u003eremove_if\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 按指定条件删除元素\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003elist.\u003cspan class=\"built_in\"\u003ereverse\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 逆置list元素\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003elist.\u003cspan class=\"built_in\"\u003esort\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 排序\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003elist.\u003cspan class=\"built_in\"\u003eunique\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 删除重复元素\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003elist.\u003cspan class=\"built_in\"\u003esplice\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 从另一个 list 中移动元素\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// Most used functions\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003epush_front\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// vector 没有该函数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003epop_front\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// vector 没有该函数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"Deque\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#Deque\" class=\"headerlink\" title=\"Deque\"\u003e\u003c/a\u003eDeque\u003c/h3\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;deque\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e双端队列。每个元素在内存上是连续的,类似vector,是它的升级版。它有高效的首尾插入/删除操作。实现方法相当于list和vector的折衷。\u003c/p\u003e\u003cp\u003e它支持随机访问和\u003ccode\u003eat()\u003c/code\u003e。\u003c/p\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003epush_back\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003epop_back\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003epush_front\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// vector 没有该函数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003epop_front\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// vector 没有该函数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e关联式容器: \u003ccode\u003emap, unordered_map, multimap, unordered_multimap, set, unordered_set, multiset, unordered_multiset\u003c/code\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"Map\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#Map\" class=\"headerlink\" title=\"Map\"\u003e\u003c/a\u003eMap\u003c/h3\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;map\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e一种基于红黑树的键值对数据结构。\u003c/p\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 数据插入, 复杂度为 logn\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003einsert\u003c/span\u003e({key, value});\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap[key] = value;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 移除, 复杂度为 logn\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003eerase\u003c/span\u003e(key)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 搜索, 复杂度为 logn\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003efind\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap[key]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003ecount\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 返回匹配特定键的元素数量, 对数复杂度\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003econtains\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003eequal_range\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003elower_bound\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003eupper_bound\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"Unordered-Map\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#Unordered-Map\" class=\"headerlink\" title=\"Unordered-Map\"\u003e\u003c/a\u003eUnordered-Map\u003c/h3\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;unordered_map\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e区别于前者使用红黑树实现,它使用哈希函数实现,因此元素无序。\u003c/p\u003e\u003cp\u003e注意,默认情况下,它只支持使用\u003ccode\u003eint\u003c/code\u003e作为键,其他类型是不合法的。\u003c/p\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 数据插入, 复杂度为 logn\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003einsert\u003c/span\u003e({key, value});\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap[key] = value;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 移除, 复杂度为 logn\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003eerase\u003c/span\u003e(key)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 搜索, 复杂度为 logn\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003efind\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap[key]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003ecount\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 返回匹配特定键的元素数量, 对数复杂度\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003econtains\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003eequal_range\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003elower_bound\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003eupper_bound\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"Set\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#Set\" class=\"headerlink\" title=\"Set\"\u003e\u003c/a\u003eSet\u003c/h3\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;set\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003eset 是一个关键字集合, 其中的关键字 不可重复, 其底层采用红黑树实现, 因此集合中的元素是 有序 的, 在 set 容器上进行的搜索, 插入和移除等操作都是\u003cstrong\u003e对数复杂度\u003c/strong\u003e的.\u003c/p\u003e\u003cp\u003e特有操作:\u003c/p\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003elower_bound\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 返回指向首个不小于给定键的元素的迭代器\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eupper_bound\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 返回指向首个大于给定键的元素的迭代器\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eerase_if\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"Stack\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#Stack\" class=\"headerlink\" title=\"Stack\"\u003e\u003c/a\u003eStack\u003c/h3\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stack\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003estack\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; s;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003es.\u003cspan class=\"built_in\"\u003epush\u003c/span\u003e(data);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003es.\u003cspan class=\"built_in\"\u003epop\u003c/span\u003e();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003es.\u003cspan class=\"built_in\"\u003etop\u003c/span\u003e(); \u003cspan class=\"comment\"\u003e// get value of top\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003es.\u003cspan class=\"built_in\"\u003eempty\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// judge whether stack is empty\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"Reference\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#Reference\" class=\"headerlink\" title=\"Reference\"\u003e\u003c/a\u003eReference\u003c/h2\u003e\u003cul\u003e\u003cli\u003e\u003ca href=\"https://stackoverflow.com/questions/5293737/where-are-the-man-pages-for-c\"\u003eStackOverflow - Where are the man pages for C++? [closed]\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://forever97.top/2020/10/21/Re0-2/\"\u003eforever97\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://baike.baidu.com/item/apropos/15852795\"\u003e百度百科 - apropos\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/"},{"title":"Arch Linux折腾笔记","time":"2023-09-05T13:39:57Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"安装\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%AE%89%E8%A3%85\" class=\"headerlink\" title=\"安装\"\u003e\u003c/a\u003e安装\u003c/h2\u003e\u003cp\u003e参考 Arch Wiki 或者参考这个简化版教程:\u003ca href=\"https://arch.icekylin.online/\"\u003ehttps://arch.icekylin.online/\u003c/a\u003e。过程按照教程一步步折腾就ok,只要注意区分清楚各个分区,别不小心把数据分区给格式化了就行。联网是安装Arch的必须项,所以请保持网络畅通。另外,建议\u003cstrong\u003e安装镜像最好在安装完成后继续保留着\u003c/strong\u003e,应急情况下(比如滚挂了)可以用\u003ccode\u003earch-chroot\u003c/code\u003e来应急重装内核之类的。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e至于Arch经常被吐槽滚挂了的原因,主要是源自Arch的更新策略比较激进,更新完成后,会直接删除老内核,比起一般的更新策略更容易出现依赖问题造成“滚挂了“。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e桌面环境、cn源、透明代理之类的配置,也可以参考上面的教程。关于透明代理,也可以参考\u003ca href=\"https://blog.linioi.com/posts/clash-on-arch/\"\u003e这篇文章\u003c/a\u003e。\u003c/p\u003e\u003ch2 id=\"美化\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E7%BE%8E%E5%8C%96\" class=\"headerlink\" title=\"美化\"\u003e\u003c/a\u003e美化\u003c/h2\u003e\u003cp\u003e这点上因人而异。我装了layan主题之后,再换个壁纸,装个latte就差不多了。我的原则是,美化差不多就行,但是前提是别影响到系统性能。\u003c/p\u003e\u003ch2 id=\"显示适配\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E6%98%BE%E7%A4%BA%E9%80%82%E9%85%8D\" class=\"headerlink\" title=\"显示适配\"\u003e\u003c/a\u003e显示适配\u003c/h2\u003e\u003cp\u003e单显示器的配置很简单,改下dpi缩放就基本ok。如果是多显示器的话,就会复杂一些。参考下面的公式:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 假设HiDPI显示器的分辨率是AxB,普通分辨率显示器的分辨率是CxD \u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 并且外置显示器的缩放比率是ExF\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003exrandr --output eDP-1 --auto --output HDMI-1 --auto --panning [C*E]x[D*F]+[A]+0 --scale [E]x[F] --right-of eDP-1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e根据上面的公式来设置,基本上能搞定。当然,如果想调整的是内置HiDPI显示器分辨率,就得调整最后\u003ccode\u003epanning\u003c/code\u003e的A为Ax[A的缩放比率]。\u003c/p\u003e\u003ch2 id=\"参考链接\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\" class=\"headerlink\" title=\"参考链接\"\u003e\u003c/a\u003e参考链接\u003c/h2\u003e\u003cul\u003e\u003cli\u003e[1] \u003ca href=\"https://nmgit.net/2020/139/\"\u003eBarry的笔记\u003c/a\u003e\u003c/li\u003e\u003cli\u003e[2] \u003ca href=\"https://harttle.land/2019/12/24/auto-xrandr.html\"\u003eX11 多显示器配置:玩转 XRandR\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"pacman入门\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#pacman%E5%85%A5%E9%97%A8\" class=\"headerlink\" title=\"pacman入门\"\u003e\u003c/a\u003epacman入门\u003c/h2\u003e\u003cp\u003e问了问GPT,大概做了下笔记如下:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo pacman -Sy \u003cspan class=\"comment\"\u003e# 更新软件包数据库\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -S package_name \u003cspan class=\"comment\"\u003e# 安装软件包,可批量安装\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -R package_name \u003cspan class=\"comment\"\u003e# 删除软件包但保留配置\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -Rn package_name \u003cspan class=\"comment\"\u003e# 删除包和配置\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -Syu \u003cspan class=\"comment\"\u003e# 升级所有已安装的包\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -Sc \u003cspan class=\"comment\"\u003e# 清理pacman缓存的旧包\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -Ss search_term \u003cspan class=\"comment\"\u003e# 查找软件包\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -Si package_name \u003cspan class=\"comment\"\u003e# 查找软件包信息\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -Rns $(pacman -Qdtq) \u003cspan class=\"comment\"\u003e# 删除未使用依赖包\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e另外,\u003ccode\u003eSyu\u003c/code\u003e和\u003ccode\u003eSyyu\u003c/code\u003e的区别在于后者强制刷新了软件仓库缓存。后者虽然更新比较及时,但是用得多对于软件源仓库并不友好,而且浪费资源,不宜过于频繁使用。\u003c/p\u003e\u003cp\u003e最底下那个移除孤儿包的操作少用,用的时候手动确认是否包括重要依赖。\u003c/p\u003e\u003cp\u003e另外还有个操作,就是完整备份安装过的包列表,然后在新的系统上重新安装,这个用\u003ccode\u003epacman\u003c/code\u003e可以做到。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003epacman -Qqe \u0026gt; installed_packages.txt \u003cspan class=\"comment\"\u003e# 备份当前系统上所有已经明确安装的包\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -S --needed - \u0026lt; installed_packages.txt \u003cspan class=\"comment\"\u003e# 只安装其中没有安装过的包\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e不过使用这个操作的时候,记得得保证清单的实时性,因为arch滚动更新,系统一直是新的,备份列表太久没更新的话在新系统上安装会有依赖,兼容等等问题。\u003c/p\u003e\u003ch2 id=\"启用外部ssh连接\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%90%AF%E7%94%A8%E5%A4%96%E9%83%A8ssh%E8%BF%9E%E6%8E%A5\" class=\"headerlink\" title=\"启用外部ssh连接\"\u003e\u003c/a\u003e启用外部ssh连接\u003c/h2\u003e\u003cp\u003e如果想从外部连接到Arch的电脑上,只要安装了openssh就行。Arch默认不会启动\u003ccode\u003esshd\u003c/code\u003e,所以我们得手动开启:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esystemctl start sshd\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"在命令行连接Wi-Fi\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%9C%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%BF%9E%E6%8E%A5Wi-Fi\" class=\"headerlink\" title=\"在命令行连接Wi-Fi\"\u003e\u003c/a\u003e在命令行连接Wi-Fi\u003c/h2\u003e\u003cp\u003e在完成安装后,启动NetworkManager:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo systemctl \u003cspan class=\"built_in\"\u003eenable\u003c/span\u003e --now NetworkManager\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后使用\u003ccode\u003enmcli\u003c/code\u003e来连接Wi-Fi:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003enmcli dev wifi list\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 后面的password部分不指定的话,会自动要求输入\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003enmcli dev wifi connect \u003cspan class=\"string\"\u003e\u0026#34;SSID\u0026#34;\u003c/span\u003e password \u003cspan class=\"string\"\u003e\u0026#34;password\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"使用TimeShift备份系统\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E4%BD%BF%E7%94%A8TimeShift%E5%A4%87%E4%BB%BD%E7%B3%BB%E7%BB%9F\" class=\"headerlink\" title=\"使用TimeShift备份系统\"\u003e\u003c/a\u003e使用TimeShift备份系统\u003c/h2\u003e\u003cp\u003eTimeShift是一个很好用的系统备份软件,特别是结合了btrfs之后,备份的体积比借助\u003ccode\u003ersync\u003c/code\u003e时更小。\u003c/p\u003e\u003cp\u003e折腾系统时不时可能滚挂,这种时候有个定期创建的映像就很有用了。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo timeshift --list \u003cspan class=\"comment\"\u003e# 获取快照列表\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo timeshift --restore --snapshot \u003cspan class=\"string\"\u003e\u0026#39;20XX-XX-XX_XX-XX-XX\u0026#39;\u003c/span\u003e --skip-grub \u003cspan class=\"comment\"\u003e# 选择一个快照进行还原,并跳过 GRUB 安装,一般来说 GRUB 不需要重新安装\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e如果恢复后无法使用,用安装盘通过\u003ccode\u003earch-chroot\u003c/code\u003e进去系统,然后手动更改\u003ccode\u003esubvolid\u003c/code\u003e来手动修复,或者直接删除\u003ccode\u003esubvolid\u003c/code\u003e:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 获取subvolid\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo btrfs sub list -u /\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 编辑,根据自己情况,修复\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evim /etc/fstab\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"重启显示管理器(Xorg-x2F-Wayland)\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E9%87%8D%E5%90%AF%E6%98%BE%E7%A4%BA%E7%AE%A1%E7%90%86%E5%99%A8%EF%BC%88Xorg-x2F-Wayland%EF%BC%89\" class=\"headerlink\" title=\"重启显示管理器(Xorg/Wayland)\"\u003e\u003c/a\u003e重启显示管理器(Xorg/Wayland)\u003c/h2\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo systemctl restart display-manager\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"Vim\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#Vim\" class=\"headerlink\" title=\"Vim\"\u003e\u003c/a\u003eVim\u003c/h2\u003e\u003cp\u003e装上Arch之后我很快就把Vim装上了。结果发现没法和系统剪贴板联动。在Vim里边检查\u003ccode\u003ehas(clipboard)\u003c/code\u003e之后发现,好像这个Vim不支持剪贴板。\u003c/p\u003e\u003cp\u003e解决方法:装\u003ccode\u003egvim\u003c/code\u003e:\u003ccode\u003esudo pacman -S gvim\u003c/code\u003e。会提示你是否卸载Vim,选是,配置不会删除所以放心删。安装完了之后你就会发现Vim还能用,而且剪贴板功能好了:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://mxts.jiujiuer.xyz/img/Pasted%20image%2020230926210217.png\"/\u003e\u003c/p\u003e\u003ch2 id=\"桌面目录映射\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E6%A1%8C%E9%9D%A2%E7%9B%AE%E5%BD%95%E6%98%A0%E5%B0%84\" class=\"headerlink\" title=\"桌面目录映射\"\u003e\u003c/a\u003e桌面目录映射\u003c/h2\u003e\u003cp\u003e今天看到群里一个老哥家目录下的文件都堆到桌面了,顺便了解了一下关于桌面目录映射的问题。因为有时候中文模式创建的家目录下的文件夹都是中文,那个老哥就是改成英文目录的时候遇到了这个问题。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eXDG_DESKTOP_DIR\u003c/code\u003e这个环境变量的介绍,在archWiki上也能翻到。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://wiki.archlinux.org/title/XDG_Base_Directory\"\u003eXDG_DESKTOP_DIR是一个环境变量,用于指定用户的桌面文件夹的位置。它是XDG Base Directory规范\u003c/a\u003e\u003ca href=\"https://wiki.archlinux.org/title/XDG_Base_Directory\"\u003e1\u003c/a\u003e\u003ca href=\"https://wiki.archlinux.org/title/XDG_user_directories\"\u003e的一部分,该规范定义了一些标准的用户目录,如音乐、图片、下载等,以及一些用于存储配置、缓存、数据和状态的目录。XDG_DESKTOP_DIR的默认值是$HOME/Desktop,但用户可以通过编辑~/.config/user-dirs.dirs文件或使用xdg-user-dirs-update命令来修改它\u003c/a\u003e\u003ca href=\"https://wiki.archlinux.org/title/XDG_user_directories\"\u003e2\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://wiki.archlinux.org/title/Desktop_entries\"\u003eKDE桌面环境遵循XDG Base Directory规范,并使用XDG_DESKTOP_DIR变量来确定桌面文件夹的位置。如果用户更改了XDG_DESKTOP_DIR的值,KDE会自动更新桌面设置,并将桌面文件夹更改为新的位置。这样,用户可以灵活地管理自己的桌面文件夹,而不影响其他应用程序或桌面环境\u003c/a\u003e\u003ca href=\"https://wiki.archlinux.org/title/Desktop_entries\"\u003e3\u003c/a\u003e。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e所以出问题的话看看\u003ccode\u003e.config\u003c/code\u003e底下配置炸没炸就行。\u003c/p\u003e\u003ch2 id=\"添加多系统启动项\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E6%B7%BB%E5%8A%A0%E5%A4%9A%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8%E9%A1%B9\" class=\"headerlink\" title=\"添加多系统启动项\"\u003e\u003c/a\u003e添加多系统启动项\u003c/h2\u003e\u003cp\u003e在安装Arch的时候,会发现中间有一步是\u003ccode\u003esudo vim /etc/default/grub\u003c/code\u003e然后\u003ccode\u003egrub-mkconfig -o /boot/grub/grub.cfg\u003c/code\u003e。这一步就是先编辑grub的配置,然后生成grub文件到\u003ccode\u003e/boot/grub/\u003c/code\u003e下的配置文件中。因此,我们如果突然心血来潮想装个Windows玩玩\u003cdel\u003e谁装啊\u003c/del\u003e,就可以改改grub配置让它为我们添加启动项。\u003c/p\u003e\u003cp\u003e因为最终的配置项是由\u003ccode\u003egrub-mkconfig\u003c/code\u003e生成的,所以并不推荐直接修改这个文件。更好的做法是安装\u003ccode\u003eos-prober\u003c/code\u003e,然后挂载其他系统的分区,并编辑grub配置文件启用os探测,最后再用\u003ccode\u003egrub-mkconfig\u003c/code\u003e生成新的grub启动项文件。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e至于为啥grub现在默认禁用掉了os-prober,注释里边说的是因为安全问题所以禁用掉了。\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"代理配置\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE\" class=\"headerlink\" title=\"代理配置\"\u003e\u003c/a\u003e代理配置\u003c/h2\u003e\u003cp\u003e既然都上Arch了,那代理软件不得整个自由点的?直接扔了cfw,拥抱clash-core。具体配置教程参考\u003ca href=\"https://blog.linioi.com/posts/clash-on-arch/\"\u003e这篇\u003c/a\u003e,我给个简洁版的:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e27\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e28\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e29\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e30\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e31\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e32\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e33\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e34\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e35\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e36\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e37\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e38\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e39\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e40\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 实在懒得sudo了\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 不过记得看清命令再回车\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo su\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epacman -S clash\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emkdir\u003c/span\u003e -p /etc/clash\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 然后从provider那里下载yaml配置文件\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 假设文件名为config.yaml\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emv\u003c/span\u003e ./config.yaml /etc/clash/\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 设置控制面板路径\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 我这里的控制面板路径在/etc/clash/clash-dashboard\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#39;external-ui: clash-dashboard\u0026#39;\u003c/span\u003e \u0026gt;\u0026gt; /etc/clash/config.yaml\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 配置环境变量,配完了记得重启/重新登陆一下\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e \u0026lt;\u0026lt; \u003cspan class=\"string\"\u003eEOF \u0026gt;\u0026gt; /etc/environment\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003ehttps_proxy=http://127.0.0.1:7890\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003ehttp_proxy=http://127.0.0.1:7890\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eall_proxy=http://127.0.0.1:7890\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 配置systemd服务项\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 配完了就能开机自启动了哦\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e \u0026lt;\u0026lt; \u003cspan class=\"string\"\u003eEOF \u0026gt; /etc/systemd/system/clash.service\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e[Unit]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDescription=Clash daemon, A rule-based proxy in Go.\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eAfter=network.target\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e[Service]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eType=simple\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eRestart=always\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eExecStart=/usr/bin/clash -d /etc/clash # /usr/bin/clash 为绝对路径,请根据你实际情况修改\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e[Install]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eWantedBy=multi-user.target\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e###############\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# clash,启动!\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e###############\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esystemctl \u003cspan class=\"built_in\"\u003eenable\u003c/span\u003e --now clash.service\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e里边比较重要的一步是配置环境变量env,上回配置的时候忘了加\u003ccode\u003ehttp\u003c/code\u003e前缀,结果系统里边啥玩意都不认我的代理设置。\u003c/p\u003e\u003cp\u003e哦对,配置完成之后还得在系统里边设置好代理:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://mxts.jiujiuer.xyz/img/Pasted%20image%2020231023164736.png\"/\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e悲:cfw跑路之后clash-core也跑路了\u003cbr/\u003e然后所有client都跑路了\u003cbr/\u003e为clash家族 + 1s\u003cbr/\u003e以及我的评价是:\u003cbr/\u003e\u003cimg src=\"https://mxts.jiujiuer.xyz/img/Pasted%20image%2020231103203831.png\"/\u003e\u003cbr/\u003e以及某作者的睿频:\u003cbr/\u003e最适合这个民族的其实是一群小\u003cbr/\u003e白围着大大转,大大通过小白的夸奖获得自我满足,然后小白的吃喝拉撒都包给大大解决的模式。通过这个项目我感觉我已经彻底认识到这个民族的前面为什么会有一堵墙了。没有墙哪来的大大。所以到处都是什么附件回帖可见,等级多少用户组可见,一个论坛一个大大供小白跪舔,不需要政府造墙,网民也会自发造墙。这尼玛连做个翻墙软件都要造墙,真是令人叹为观止。这是一个造了几干年墙的保守的农耕民族,缺乏对别人的基本尊重,不愿意分享,喜欢遮遮掩掩,喜欢小圈子抱团,大概这些传统是改不掉了吧。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e另外还有一个,就是切换节点必须得使用clash的控制端口(在\u003ccode\u003econfig.yaml\u003c/code\u003e中给出,一般是\u003ccode\u003e9090\u003c/code\u003e),所以还必须得有个控制面板。一般Windows平台都是用\u003cdel\u003e已经似了的\u003c/del\u003eClash For Windows作为控制面板的,而Linux这边使用\u003ca href=\"https://clash.razord.top/\"\u003ehttps://clash.razord.top/\u003c/a\u003e也就是\u003cdel\u003e也已经似了的\u003c/del\u003e\u003ca href=\"https://github.com/Dreamacro/clash-dashboard/\"\u003eClash的官方控制面板\u003c/a\u003e作为控制面板的。实在不行了可以用命令行下的TUI工具\u003ccode\u003eclashctl\u003c/code\u003e来手动切换节点,应该也能用。\u003c/p\u003e\u003ch2 id=\"RDP连接Windows\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#RDP%E8%BF%9E%E6%8E%A5Windows\" class=\"headerlink\" title=\"RDP连接Windows\"\u003e\u003c/a\u003eRDP连接Windows\u003c/h2\u003e\u003cp\u003e用Arch多了,有时候得偶尔远程一下Windows。配置了半天\u003ccode\u003eRemmina\u003c/code\u003e+\u003ccode\u003efreerdp\u003c/code\u003e,可能这玩意和我风水不合吧,半天跑不起来。遂尝试了下\u003ccode\u003erdesktop\u003c/code\u003e,秒连(也不知道为啥):\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo pacman -S rdesktop\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003erdesktop 114.5.1.4\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后输账号密码登陆就行了。因为暂时这样就够用所以就没咋折腾。\u003c/p\u003e\u003ch2 id=\"X11迁移Wayland\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#X11%E8%BF%81%E7%A7%BBWayland\" class=\"headerlink\" title=\"X11迁移Wayland\"\u003e\u003c/a\u003eX11迁移Wayland\u003c/h2\u003e\u003cp\u003e主要动机:支持一下双屏不同缩放的功能,不然一个高分屏+一个普通1080p的组合太痛苦了。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003epacman -Qi wayland \u003cspan class=\"comment\"\u003e# 已安装则继续,否则安装\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -S --needed wayland\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eyay -S sddm-git \u003cspan class=\"comment\"\u003e# 必须得是sddm-git,其他版本好像没完善的Wayland支持\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epacman -S --needed xorg-xwayland xorg-xlsclients qt5-wayland glfw-wayland\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epacman -S --needed plasma kde-applications\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epacman -S --needed plasma-wayland-session\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e按照\u003ca href=\"https://linux.cn/article-16171-1.html\"\u003e这里\u003c/a\u003e给出的流程,装完上面的包之后,Logout之后应该就能在左下角看到登陆\u003ccode\u003ePlasma(Wayland)\u003c/code\u003e的提示了。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e你还能通过查看 \u003ccode\u003e$XDG_SESSION_TYPE\u003c/code\u003e 变量来 核实你是否在运行 \u003ccode\u003eWayland\u003c/code\u003e。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e先去装了,一会回来记录。\u003c/p\u003e\u003cp\u003e装完了,兼容性没啥大问题,我甚至没重启,只是重新登陆了下。就是\u003ccode\u003elatte-dock\u003c/code\u003e的图标缩放看着怪怪的,而且桌面小组件也乱飞了。以及,输入法好像不太对劲,在firefox以外的地方皮肤会丢失。\u003c/p\u003e\u003cp\u003e刚重新设置了下屏幕排列,现在能单独设置两块屏幕的缩放了,爽。就是高分屏看着有点糊,以及字体缩放问题,还有这个fcitx也不太对劲。\u003c/p\u003e\u003cp\u003e关于fcitx,系统给了一段报错:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eFcitx should be launched by KWin under KDE Wayland in order to use Wayland input method frontend. This can improve the experience when using Fcitx on Wayland. To configure this, you need to go to \u0026#34;System Settings\u0026#34; -\u0026gt; \u0026#34;Virtual keyboard\u0026#34; and select \u0026#34;Fcitx 5\u0026#34; from it. You may also need to disable tools that launches input method, such as imsettings on Fedora, or im-config on Debian/Ubuntu. For more details see https://fcitx-im.org/wiki/Using_Fcitx_5_on_Wayland#KDE_Plasma \u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e先重启下看看吧。\u003c/p\u003e\u003cp\u003e草了,重启回来变回x11 seession了。找找默认值在哪保存着吧。\u003c/p\u003e\u003cp\u003e找到了,在\u003ccode\u003e/usr/lib/sddm/sddm.conf.d/default.conf\u003c/code\u003e里边,有一个\u003ccode\u003eDisplayServer=x11\u003c/code\u003e的项,把\u003ccode\u003ex11\u003c/code\u003e改为\u003ccode\u003ewayland\u003c/code\u003e应该就行了。重启看看。\u003c/p\u003e\u003cp\u003e好像不太行,而且现在切不过去Wayland了,坏。\u003c/p\u003e\u003cp\u003e把设置都改回去了,现在好像能进去了。但是还是默认进入x11的plasma桌面。\u003c/p\u003e\u003cp\u003e哎,把用户空间的那个sddm configuration改了一下,删了里边的[Autologin]底下的session=的值,重启下试试。以及又得到了一段关于fcitx的建议:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eDetect GTK_IM_MODULE and QT_IM_MODULE being set and Wayland Input method frontend is working. It is recommended to unset GTK_IM_MODULE and QT_IM_MODULE and use Wayland input method frontend instead. For more details see https://fcitx-im.org/wiki/Using_Fcitx_5_on_Wayland#KDE_Plasma\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e好好好搞定了。按照上面的设置先屏蔽了俩环境变量,然后删除了默认值,现在系统已经处于完全可用的状态。回头有时间了整理整理过程。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eFri 22 Dec 2023 05:14:55 PM CST\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e编辑:这个选项不用在命令行里修改,直接去系统设置里边的\u003ccode\u003eStartup nad shutdown-\u0026gt;Login Screen-\u0026gt;Behavior\u003c/code\u003e里边修改\u003ccode\u003e...with session = \u003c/code\u003e的选项就行了。\u003c/p\u003e\u003ch2 id=\"又出问题了\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%8F%88%E5%87%BA%E9%97%AE%E9%A2%98%E4%BA%86\" class=\"headerlink\" title=\"又出问题了\"\u003e\u003c/a\u003e又出问题了\u003c/h2\u003e\u003cp\u003e小笔记本上的arch的kde以至于其中的所有程序突然都变得特别卡。最奇怪的是这会的系统资源专用状况完全没有多高,CPU%,MEM37.4%的占用率应该很健康了吧。\u003c/p\u003e\u003cp\u003e觉得的卡顿是因为我发现就连tmux里边开个vim写文档都卡得不行了才觉得不对劲。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e27\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e28\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e29\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e30\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e31\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e32\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e33\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e34\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e35\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e36\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e37\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e38\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e39\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e41\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e42\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e43\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e44\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e45\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e46\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e47\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e48\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e49\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e50\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e51\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e52\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e53\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e54\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e55\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e56\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e57\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e58\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esystemd-+-NetworkManager\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-bluetoothd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-clash\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-dbus-daemon\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-polkitd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-rtkit-daemon\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-sddm-+-Xorg\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | `-sddm-helper---startplasma-x11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-systemd-+-(sd-pam)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-adb\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-agent\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-at-spi-bus-laun---dbus-daemon\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-at-spi2-registr\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-chrome_crashpad\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-dbus-daemon\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-dconf-service\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-fcitx5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-gmenudbusmenupr\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-gvfs-udisks2-vo\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-gvfsd-+-gvfsd-dnssd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | | |-gvfsd-network\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | | `-gvfsd-trash\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-gvfsd-fuse\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-gvfsd-metadata\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-kaccess\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-kactivitymanage\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-kded5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-kglobalaccel5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-konsole---bash---tmux: client\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-krunner---qq-+-qq---qq\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | | |-qq---2*[qq]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | | `-qq\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-kscreen_backend\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-ksmserver---DiscoverNotifie\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-ksystemstats\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-kwalletd5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-kwin_x11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-latte-dock\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-linuxqq\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-obexd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-org_kde_powerde\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-pipewire\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-pipewire-media-\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-plasmashell---crow\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-polkit-kde-auth\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-pulseaudio---gsettings-helpe\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-tmux: server-+-2*[bash---vim]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | | `-bash---sudo---sudo---pstree\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-2*[xdg-desktop-por]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-xdg-document-po---fusermount3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-xdg-permission-\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | `-xembedsniproxy\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-systemd-journal\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-systemd-logind\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-systemd-udevd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-udisksd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-upowerd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e `-wpa_supplicant\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面是\u003ccode\u003esudo pstree -T\u003c/code\u003e的输出,感觉这种卡顿可能就是de内存溢出了。理论上我感觉只要重启一下sddm马上就能变流畅。但是在这之前我想知道更详细的信息。\u003c/p\u003e\u003cp\u003e先把qq关了试试。不出所料还是很卡。上google搜一下吧。\u003c/p\u003e\u003cp\u003e草了,看到一个哥们系统偶尔卡顿最后发现是SSD挂掉的前兆。想起来这个本子用的是三星的老固态,系统盘的文件系统是btrfs;前几天还看群里某群u吐槽说btrfs在他那边对于固态寿命损伤挺严重的。也不知道是不是btrfs的问题。不过好在重要数据都有备份,丢了也不心疼,全从服务器上sync下来就行了。\u003c/p\u003e\u003cp\u003e不过应该这次不是固态的问题,应该还是sddm本身的问题,不然很难解释怎么所有gui里边的东西都开始卡顿了\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e27\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e28\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e29\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e30\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e31\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e32\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e33\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e34\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e35\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e36\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e37\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e38\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e39\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e41\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e42\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e43\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e44\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e45\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e46\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e47\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e48\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e49\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e50\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e51\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e52\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e53\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e54\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e55\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e56\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e57\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e58\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e59\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e60\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e61\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e62\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e63\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e64\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e65\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e66\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e67\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e68\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e69\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e70\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e71\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e72\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e73\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e74\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e75\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e76\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e77\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e78\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e79\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e80\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e81\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e82\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e83\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e84\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e85\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e86\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e87\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e88\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e89\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e90\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e91\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eTIME PID UID GID SIG COREFILE EXE SIZE\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-10-29 23:52:21 CST 2030 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eThu 2023-11-02 13:07:56 CST 3084 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eThu 2023-11-02 17:15:49 CST 36261 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eThu 2023-11-02 23:44:53 CST 1795 1000 1000 SIGTRAP missing /tmp/.mount_linuxqFrCYKS/qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-04 18:43:36 CST 1640 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-04 18:45:41 CST 2255 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-04 18:46:34 CST 2300 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-11-05 18:16:28 CST 19274 1000 1000 SIGABRT missing /opt/vscodium-bin/codium -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-11-05 18:16:30 CST 19330 1000 1000 SIGABRT missing /opt/vscodium-bin/codium -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-11-05 22:13:13 CST 14279 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eThu 2023-11-09 23:30:51 CST 14724 1000 1000 SIGTRAP missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eThu 2023-11-09 23:38:16 CST 15804 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eFri 2023-11-10 01:08:53 CST 14773 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-14 09:04:45 CST 5996 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-14 09:47:58 CST 10033 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-14 10:15:41 CST 75599 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-14 10:30:25 CST 13990 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-14 17:47:23 CST 575 1000 1000 SIGABRT missing /usr/bin/plasmashell -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-14 21:00:24 CST 18347 1000 1000 SIGABRT missing /usr/bin/plasmashell -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-11-15 00:34:08 CST 26489 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-11-15 01:14:11 CST 28479 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-11-15 11:34:37 CST 19955 1000 1000 SIGSEGV missing /usr/bin/plasmashell -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-11-15 23:54:02 CST 36282 1000 1000 SIGSEGV missing /opt/visual-studio-code/code -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eFri 2023-11-17 00:45:55 CST 16467 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eFri 2023-11-17 00:45:56 CST 40168 1000 1000 SIGTRAP missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:06 CST 17969 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:06 CST 15257 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:06 CST 17286 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:56 CST 19088 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:56 CST 19770 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:56 CST 18906 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:56 CST 19731 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:56 CST 19689 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:57 CST 19591 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:13:10 CST 25066 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:13:11 CST 25053 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:13:11 CST 20320 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:13:11 CST 24308 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:13:13 CST 25240 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:13:13 CST 25205 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:13:14 CST 25646 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 22:14:12 CST 576 1000 1000 SIGABRT missing /usr/bin/plasmashell -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 23:37:15 CST 2175 1000 1000 SIGABRT missing /usr/bin/plasmashell -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-11-19 12:59:47 CST 4430 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-11-19 13:00:33 CST 4459 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-11-19 13:00:34 CST 4469 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-11-19 13:06:05 CST 5821 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-11-20 20:53:13 CST 588 1000 1000 SIGSEGV missing /usr/bin/plasmashell -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-11-20 20:56:33 CST 6077 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-11-20 22:56:05 CST 5427 1000 1000 SIGABRT missing /usr/bin/plasmashell -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-11-20 22:59:54 CST 18385 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-21 23:30:23 CST 12137 1000 1000 SIGBUS missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-21 23:30:25 CST 12093 1000 1000 SIGBUS missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-21 23:30:26 CST 17572 1000 1000 SIGBUS missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-21 23:30:26 CST 12015 1000 1000 SIGBUS missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-21 23:30:26 CST 12016 1000 1000 SIGBUS missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-21 23:30:27 CST 12459 1000 1000 SIGBUS missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-21 23:30:27 CST 12003 1000 1000 SIGBUS missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-21 23:30:28 CST 12043 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eFri 2023-11-24 00:01:53 CST 14600 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-25 02:40:58 CST 32138 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-28 23:33:11 CST 41077 1000 1000 SIGTRAP missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-11-29 11:43:44 CST 43973 1000 1000 SIGABRT missing /usr/bin/adb -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-11-29 11:44:06 CST 45189 1000 1000 SIGABRT missing /usr/bin/adb -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-11-29 23:29:56 CST 53151 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-11-29 23:45:58 CST 55228 1000 1000 SIGSEGV missing /opt/visual-studio-code/code -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eThu 2023-11-30 00:13:43 CST 42637 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-12-02 01:12:16 CST 56991 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 10:28:09 CST 77126 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 15:18:23 CST 99034 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 15:19:05 CST 99068 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 15:20:45 CST 99231 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 15:54:13 CST 104472 1000 1000 SIGSEGV missing /home/xeonds/code/pizip/pi -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 15:54:45 CST 104495 1000 1000 SIGSEGV missing /home/xeonds/code/pizip/pi -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 15:55:06 CST 104521 1000 1000 SIGSEGV missing /home/xeonds/code/pizip/pi -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 15:55:36 CST 104541 1000 1000 SIGSEGV missing /home/xeonds/code/pizip/pi -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 17:28:20 CST 104920 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 23:36:35 CST 119295 1000 1000 SIGSEGV missing /opt/visual-studio-code/code -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-12-06 11:18:53 CST 16426 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-11 19:56:40 CST 97572 1000 1000 SIGTRAP missing /tmp/.mount_linuxqSV6RFp/qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-12-12 01:01:33 CST 123670 1000 1000 SIGTRAP missing /opt/visual-studio-code/code -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eFri 2023-12-15 14:50:41 CST 17039 1000 1000 SIGTRAP missing /tmp/.mount_linuxqkQn53G/qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-12-16 23:55:13 CST 19892 1000 1000 SIGTRAP missing /opt/visual-studio-code/code -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-18 13:16:16 CST 28074 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-18 15:08:22 CST 41701 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-12-19 21:37:06 CST 17530 1000 1000 SIGFPE missing /home/xeonds/code/c4/a.out -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-12-19 23:39:47 CST 20684 1000 1000 SIGTRAP missing /tmp/.mount_linuxqllS3Xz/qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-12-20 12:31:27 CST 23806 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-12-24 19:26:26 CST 5873 1000 1000 SIGTRAP present /qq 1.6M\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-25 01:59:52 CST 5951 1000 1000 SIGBUS present /chrome_crashpad_handler 42.5K\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面是\u003ccode\u003ecoredumpctl\u003c/code\u003e的输出。好像sddm还没崩溃呢。再看看journal:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e27\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e28\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e29\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e30\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e31\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e32\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e33\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e34\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e35\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e36\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e37\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e38\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e39\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e40\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze systemd[1]: Started Simple Desktop Display Manager.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e░░ Subject: A start job \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e unit sddm.service has finished successfully\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e░░ Defined-By: systemd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e░░ \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e░░ A start job \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e unit sddm.service has finished successfully.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e░░ \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e░░ The job identifier is 108.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Initializing...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Starting...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Logind interface found\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Adding new display...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Loaded empty theme configuration\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Xauthority path: \u003cspan class=\"string\"\u003e\u0026#34;/run/sddm/xauth_bDCTVn\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Using VT 2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Display server starting...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Writing cookie to \u003cspan class=\"string\"\u003e\u0026#34;/run/sddm/xauth_bDCTVn\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Running: /usr/bin/X -dpi 120 -background none -seat seat0 vt2 -auth /run/sddm/xauth_bDCTVn -noreset -displayfd 16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm[407]: Setting default cursor\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm[407]: Running display setup script \u003cspan class=\"string\"\u003e\u0026#34;/usr/share/sddm/scripts/Xsetup\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm[407]: Display server started.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm[407]: Reading from \u003cspan class=\"string\"\u003e\u0026#34;/usr/local/share/xsessions/plasma.desktop\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm[407]: Reading from \u003cspan class=\"string\"\u003e\u0026#34;/usr/share/xsessions/plasma.desktop\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm[407]: Session \u003cspan class=\"string\"\u003e\u0026#34;/usr/share/xsessions/plasma.desktop\u0026#34;\u003c/span\u003e selected, \u003cspan class=\"built_in\"\u003ecommand\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#34;/usr/bin/startplasma-x11\u0026#34;\u003c/span\u003e \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e VT 2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: [PAM] Starting...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: [PAM] Authenticating...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: pam_kwallet5(sddm-autologin:auth): pam_kwallet5: pam_sm_authenticate\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: [PAM] Preparing to converse...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: pam_kwallet5(sddm-autologin:auth): pam_kwallet5: Couldn\u003cspan class=\"string\"\u003e\u0026#39;t get password (it is empty)\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: [PAM] Conversation with 1 messages\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: pam_kwallet5(sddm-autologin:auth): pam_kwallet5: Empty or missing password, doing nothing\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: [PAM] returning.\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:09 ark-station-breeze sddm[407]: Authentication for user \u0026#34;xeonds\u0026#34; successful\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: pam_kwallet5(sddm-autologin:setcred): pam_kwallet5: pam_sm_setcred\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: pam_unix(sddm-autologin:session): session opened for user xeonds(uid=1000) by xeonds(uid=0)\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:10 ark-station-breeze sddm-helper[433]: pam_kwallet5(sddm-autologin:session): pam_kwallet5: pam_sm_open_session\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:10 ark-station-breeze sddm-helper[433]: pam_kwallet5(sddm-autologin:session): pam_kwallet5: open_session called without kwallet5_key\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:10 ark-station-breeze sddm-helper[433]: Writing cookie to \u0026#34;/tmp/xauth_XpVcsc\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:10 ark-station-breeze sddm-helper[433]: Starting X11 session: \u0026#34;\u0026#34; \u0026#34;/usr/share/sddm/scripts/Xsession \\\u0026#34;/usr/bin/startplasma-x11\\\u0026#34;\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:10 ark-station-breeze sddm[407]: Session started true\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e哦还有xorg的:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e-- No entries --\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e好吧空的。那看看top\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[?1h=[?25l[H[J[mtop - 15:10:25 up 1 day, 12:42, 1 user, load average: 1.40, 1.33, 1.29[m[39;49m[m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e任务:[m[39;49m[1m 204 [m[39;49mtotal,[m[39;49m[1m 3 [m[39;49mrunning,[m[39;49m[1m 201 [m[39;49msleeping,[m[39;49m[1m 0 [m[39;49mstopped,[m[39;49m[1m 0 [m[39;49mzombie[m[39;49m[m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e%Cpu(s):[m[39;49m[1m 28.6 [m[39;49mus,[m[39;49m[1m 0.0 [m[39;49msy,[m[39;49m[1m 0.0 [m[39;49mni,[m[39;49m[1m 71.4 [m[39;49mid,[m[39;49m[1m 0.0 [m[39;49mwa,[m[39;49m[1m 0.0 [m[39;49mhi,[m[39;49m[1m 0.0 [m[39;49msi,[m[39;49m[1m 0.0 [m[39;49mst[m[39;49m[m [m[39;49m[m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMiB Mem :[m[39;49m[1m 7835.3 [m[39;49mtotal,[m[39;49m[1m 584.1 [m[39;49mfree,[m[39;49m[1m 3807.3 [m[39;49mused,[m[39;49m[1m 4760.9 [m[39;49mbuff/cache[m[39;49m[m [m[39;49m[m [m[39;49m[m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMiB Swap:[m[39;49m[1m 0.0 [m[39;49mtotal,[m[39;49m[1m 0.0 [m[39;49mfree,[m[39;49m[1m 0.0 [m[39;49mused.[m[39;49m[1m 4028.0 [m[39;49mavail Mem [m[39;49m[m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[7m 进程号 USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m[1m 411 root 20 0 859280 87628 30916 R 90.9 1.1 248:56.68 Xorg [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m[1m 19316 xeonds 20 0 4028616 892492 271492 R 72.7 11.1 0:17.50 firefox [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 19461 xeonds 20 0 2713128 171852 88252 S 18.2 2.1 0:06.27 WebExte+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m[1m 19901 xeonds 20 0 15440 5760 3584 R 9.1 0.1 0:00.01 top [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 1 root 20 0 22220 10228 7028 S 0.0 0.1 0:02.61 systemd [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pool_wo+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 5 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 7 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 9 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 12 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 14 root 20 0 0 0 0 I 0.0 0.0 0:00.00 rcu_tas+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 15 root 20 0 0 0 0 I 0.0 0.0 0:00.00 rcu_tas+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 16 root 20 0 0 0 0 I 0.0 0.0 0:00.00 rcu_tas+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 17 root 20 0 0 0 0 S 0.0 0.0 0:30.95 ksoftir+ [m[39;49m[K[?1l\u0026gt;[25;1H\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[34h[?25h[K\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e抽象是抽象了点,但是能看出来好像是Xorg在发电,试试去tty重启xorg看看。\u003c/p\u003e\u003cp\u003e最后发现Xorg是sddm启动的,没办法直接重启了下sddm,问题解决,但是最不爽的是不知道问题到底是咋解决的。\u003c/p\u003e\u003cp\u003e找到一个博客,发现好像不是xorg的问题,而是kwin的问题:暂停恢复合成时,会导致kwin卡顿,这时候重启一下kwin_x11就行了。\u003c/p\u003e\u003cp\u003e这就好说了:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esystemctl --user restart plasma-kwin_x11\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e或者这个\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esetsid kwin_x11 --replace \u0026amp;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cblockquote\u003e\u003cp\u003eref:\u003ca href=\"https://www.glowmem.com/archives/archlinux-note#toc-head-7\"\u003e律回彼境\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e试了试,问题完美解决,CPU占用也正常了。\u003c/p\u003e\u003cp\u003e 参考:\u003ca href=\"https://blog.mynook.info/post/kde-gui-sluggish-workaround/\"\u003eKDE解决GUI界面卡顿的问题\u003c/a\u003e\u003c/p\u003e\u003ch2 id=\"组合键\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E7%BB%84%E5%90%88%E9%94%AE\" class=\"headerlink\" title=\"组合键\"\u003e\u003c/a\u003e组合键\u003c/h2\u003e\u003cp\u003e其实主要是KDE Plasma的相关组合键。偶尔会意外发现一些组合键,就记录在这里了。\u003c/p\u003e\u003cul\u003e\u003cli\u003e切换桌面:\u003ccode\u003ectrl+F*\u003c/code\u003e\u003c/li\u003e\u003cli\u003e无极缩放:\u003ccode\u003ewin+ctrl\u003c/code\u003e+鼠标滚轮,真的好丝滑QAQ\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"莫得休眠Hibernate选项\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E8%8E%AB%E5%BE%97%E4%BC%91%E7%9C%A0Hibernate%E9%80%89%E9%A1%B9\" class=\"headerlink\" title=\"莫得休眠Hibernate选项\"\u003e\u003c/a\u003e莫得休眠Hibernate选项\u003c/h2\u003e\u003cp\u003e找了半天发现是系统安装的时候没设置swap交换分区。不过暂时默认的睡眠也够用了,之后再考虑吧。\u003c/p\u003e\u003ch2 id=\"备份\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%A4%87%E4%BB%BD\" class=\"headerlink\" title=\"备份\"\u003e\u003c/a\u003e备份\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003eref:\u003ca href=\"https://sspai.com/post/78916\"\u003e现代化的 Archlinux 安装,Btrfs、快照、休眠以及更多。\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e其一就是软件列表备份。\u003ccode\u003epacman -Qe \u0026gt;\u0026gt; installed.txt\u003c/code\u003e就可以备份已安装软件列表\u003c/p\u003e\u003cp\u003e其二就是备份根目录数据。其中的\u003ccode\u003e-avrh\u003c/code\u003e用于保留文件权限。以及似乎必须得注意路径末尾的斜杠问题,rsync好像会区分这两个路径。\u003ccode\u003esudo rsync -avrh --progress /home/ /mnt/backup/\u003c/code\u003e\u003c/p\u003e\u003ch2 id=\"关机等待时间\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%85%B3%E6%9C%BA%E7%AD%89%E5%BE%85%E6%97%B6%E9%97%B4\" class=\"headerlink\" title=\"关机等待时间\"\u003e\u003c/a\u003e关机等待时间\u003c/h2\u003e\u003cp\u003e一直忘了改这个东西了。有时候等待一些服务停止的时候等到倒计时结束才会停止。可以适当减少倒计时的时长环节这个问题。\u003c/p\u003e\u003cp\u003e对应的参数在\u003ccode\u003e/etc/systemd/system.conf\u003c/code\u003e,更改\u003ccode\u003eDefaultTimeoutStopSec=90s\u003c/code\u003e为你想要的等待时间,我改成10s了。\u003c/p\u003e\u003ch2 id=\"记一次内核卡死\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E8%AE%B0%E4%B8%80%E6%AC%A1%E5%86%85%E6%A0%B8%E5%8D%A1%E6%AD%BB\" class=\"headerlink\" title=\"记一次内核卡死\"\u003e\u003c/a\u003e记一次内核卡死\u003c/h2\u003e\u003cp\u003e挺草的说起来。征兆是先是firefox崩了,然后把kwin也爆了。第二次是kwin自己爆炸了,然后玩mc java的时候就OOM+CPU 100%了。问了下群里老哥,发现没开SysRq,不然的话就能在内核卡死的时候使用一些组合键来让内核执行一些有限操作。\u003c/p\u003e\u003cp\u003e等待了大概40min,无果,只能以\u0026gt;2min的不规律时间响应键盘中断,老哥推测可能是活锁,而且OOM也没来得及出动。所以就含泪重启,跟自己tmux里边一堆窗口告别了。\u003c/p\u003e\u003cp\u003e重启,看看内核日志:\u003ccode\u003esudo journalctl -k -b-1\u003c/code\u003e查看上次启动的日志:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e27\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e28\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e29\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e30\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e31\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e32\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e33\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e34\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e35\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e36\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e37\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e38\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e39\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e41\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e42\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e43\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e44\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e45\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e46\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e47\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e48\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e49\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e50\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e51\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e52\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e53\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e54\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e55\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e56\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e57\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e58\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e59\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e60\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e61\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e62\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e63\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e64\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e65\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e66\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e67\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e68\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e69\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e70\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e71\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e72\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e73\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e74\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e75\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e76\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e77\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e78\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e79\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e80\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e81\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e82\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e83\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e84\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e85\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e86\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e87\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e88\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e89\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e90\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e91\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e92\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e93\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e94\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e95\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e96\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e97\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e98\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e99\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e100\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e101\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e102\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e103\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e104\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e105\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e106\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e107\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e108\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e109\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e110\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e111\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e112\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e113\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e114\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e115\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e116\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e117\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e118\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e119\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e120\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e121\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e122\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e123\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e124\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e125\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e126\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e127\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e128\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e129\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e130\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e131\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e132\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e133\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e134\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e135\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e136\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e137\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e138\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e139\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e140\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e141\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e142\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e143\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e144\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e145\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e146\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e147\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e148\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e149\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e150\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e151\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e152\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e153\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e154\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e155\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e156\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e157\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e158\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e159\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e160\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e161\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e162\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e163\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e164\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e165\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e166\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e167\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e168\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e169\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e170\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e171\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e172\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e173\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e174\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e175\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e176\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e177\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e178\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e179\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e180\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e181\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e182\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e183\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e184\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e185\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e186\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e187\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e188\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e189\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e190\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e191\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e192\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e193\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e194\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e195\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e196\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e197\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e198\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e199\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e200\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: Bluetooth: hci0: Malformed MSFT vendor event: 0x02\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: Bluetooth: hci0: Found Intel DDC parameters: intel/ibt-0040-4150.ddc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: Bluetooth: hci0: Applying Intel DDC parameters completed\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: Bluetooth: hci0: Firmware timestamp 2023.42 buildtype 1 build 73111\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: Microcode SW error detected. Restarting 0x0.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: Start IWL Error Log Dump:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: Transport status: 0x0000004A, valid: 6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: Loaded firmware version: 83.e8f84e98.0 so-a0-hr-b0-83.ucode\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000071 | NMI_INTERRUPT_UMAC_FATAL \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x000002F0 | trm_hw_status0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | trm_hw_status1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x004D9024 | branchlink2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x004CF2F2 | interruptlink1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x004CF2F2 | interruptlink2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00015346 | data1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000010 | data2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | data3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x0022F89E | beacon time\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x001E1C6F | tsf low\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | tsf hi\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | time gp1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x001ED6DD | time gp2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000001 | uCode revision type\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000053 | uCode version major\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0xE8F84E98 | uCode version minor\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000370 | hw version\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00C80002 | board version\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x80DDFC04 | hcmd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00020000 | isr0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | isr1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x48F00002 | isr2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00C3000C | isr3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | isr4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x001C0103 | last cmd Id\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00015346 | wait_event\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000010 | l2p_control\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000020 | l2p_duration\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x0000003F | l2p_mhvalid\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | l2p_addr_match\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000009 | lmpm_pmg_sel\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | timestamp\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00004870 | flow_handler\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: Start IWL Error Log Dump:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: Transport status: 0x0000004A, valid: 7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x2010190E | ADVANCED_SYSASSERT\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | umac branchlink1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x804703E0 | umac branchlink2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0xC0081500 | umac interruptlink1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | umac interruptlink2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x0101971C | umac data1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0xDEADBEEF | umac data2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0xDEADBEEF | umac data3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000053 | umac major\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0xE8F84E98 | umac minor\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x001ED6D7 | frame pointer\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0xC0886BE0 | stack pointer\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x0024010D | last host cmd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | isr status reg\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: IML/ROM dump:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000B03 | IML/ROM error/state\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x0000518C | IML/ROM data1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000090 | IML/ROM WFPM_AUTH_KEY_0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: Fseq Registers:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x60000000 | FSEQ_ERROR_CODE\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00350002 | FSEQ_TOP_INIT_VERSION\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00150001 | FSEQ_CNVIO_INIT_VERSION\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x0000A482 | FSEQ_OTP_VERSION\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000003 | FSEQ_TOP_CONTENT_VERSION\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x4552414E | FSEQ_ALIVE_TOKEN\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00080400 | FSEQ_CNVI_ID\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x01300504 | FSEQ_CNVR_ID\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00080400 | CNVI_AUX_MISC_CHIP\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x01300504 | CNVR_AUX_MISC_CHIP\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x05B0905B | CNVR_SCU_SD_REGS_SD_REG_DIG_DCDC_VTRIM\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x0000025B | CNVR_SCU_SD_REGS_SD_REG_ACTIVE_VDIG_MIRROR\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00150001 | FSEQ_PREV_CNVIO_INIT_VERSION\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00350002 | FSEQ_WIFI_FSEQ_VERSION\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00350002 | FSEQ_BT_FSEQ_VERSION\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x000000DC | FSEQ_CLASS_TP_VERSION\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: UMAC CURRENT PC: 0x8048f214\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: LMAC1 CURRENT PC: 0xd0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: WRT: Collecting data: ini trigger 4 fired (delay=0ms).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: ieee80211 phy0: Hardware restart was requested\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:34 ark-station kernel: iwlwifi 0000:00:14.3: WRT: Invalid buffer destination\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:34 ark-station kernel: Bluetooth: MGMT ver 1.22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:34 ark-station kernel: Bluetooth: hci0: Bad flag given (0x1) vs supported (0x0)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:34 ark-station kernel: iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION: 0x20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:34 ark-station kernel: iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION: 0x1f\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:34 ark-station kernel: iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:34 ark-station kernel: iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:34 ark-station kernel: iwlwifi 0000:00:14.3: RFIm is deactivated, reason = 5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:38 ark-station kernel: wlan0: authenticate with e2:cb:4f:01:72:a7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:38 ark-station kernel: wlan0: send auth to e2:cb:4f:01:72:a7 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:38 ark-station kernel: wlan0: authenticated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:38 ark-station kernel: wlan0: associate with e2:cb:4f:01:72:a7 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:38 ark-station kernel: wlan0: RX AssocResp from e2:cb:4f:01:72:a7 (capab=0x1511 status=0 aid=1)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:38 ark-station kernel: wlan0: associated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:47:20 ark-station kernel: kwin_wayland[901]: segfault at 0 ip 0000561fd234c33f sp 00007fff916f35c0 error 4 in kwin_wayland[561fd2348000+110000] likely on CPU 13 (core 25, socket 0)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:47:20 ark-station kernel: Code: 8b 47 58 48 8b 58 10 48 01 c3 48 63 40 04 4c 8d 24 c3 49 39 dc 75 0d eb 2a 66 90 48 83 c3 08 49 39 dc 74 1f 48 8b 3b 48 89 ee \u0026lt;48\u0026gt; 8b 07 ff 50 60 84 c0 74 e7 48 83 c4 08 5b 5d 41 5c 41 5d c3 0f\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:49:41 ark-station systemd-fstab-generator[2389003]: Failed to create unit file \u0026#39;/run/systemd/generator/-.mount\u0026#39;, as it already exists. Duplicate entry in \u0026#39;/etc/fstab\u0026#39;?\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: deauthenticating from e2:cb:4f:01:72:a7 by local choice (Reason: 3=DEAUTH_LEAVING)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: authenticate with f0:9b:b8:16:62:30\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: 80 MHz not supported, disabling VHT\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: send auth to f0:9b:b8:16:62:30 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: authenticated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: associate with f0:9b:b8:16:62:30 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: RX AssocResp from f0:9b:b8:16:62:30 (capab=0x1421 status=0 aid=2)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: associated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: Limiting TX power to 20 (20 - 0) dBm as advertised by f0:9b:b8:16:62:30\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:21:36 ark-station kernel: wlan0: disconnect from AP f0:9b:b8:16:62:30 for new auth to f0:9b:b8:16:62:40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:21:36 ark-station kernel: wlan0: authenticate with f0:9b:b8:16:62:40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:21:36 ark-station kernel: wlan0: send auth to f0:9b:b8:16:62:40 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:21:36 ark-station kernel: wlan0: authenticated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:21:36 ark-station kernel: wlan0: associate with f0:9b:b8:16:62:40 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:21:36 ark-station kernel: wlan0: RX ReassocResp from f0:9b:b8:16:62:40 (capab=0x1501 status=0 aid=4)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:21:36 ark-station kernel: wlan0: associated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:21:36 ark-station kernel: wlan0: Limiting TX power to 30 (30 - 0) dBm as advertised by f0:9b:b8:16:62:40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:22:44 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* Atomic update failure on pipe A (start=282494 end=282495) time 187 us, min 1579, max 1599, scanline start 1564, end 1602\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:41:50 ark-station kernel: wlan0: disconnect from AP f0:9b:b8:16:62:40 for new auth to f0:9b:b8:16:5c:40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:41:50 ark-station kernel: wlan0: authenticate with f0:9b:b8:16:5c:40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:41:50 ark-station kernel: wlan0: send auth to f0:9b:b8:16:5c:40 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:41:50 ark-station kernel: wlan0: authenticated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:41:50 ark-station kernel: wlan0: associate with f0:9b:b8:16:5c:40 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:41:50 ark-station kernel: wlan0: RX ReassocResp from f0:9b:b8:16:5c:40 (capab=0x1501 status=0 aid=2)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:41:50 ark-station kernel: wlan0: associated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:41:50 ark-station kernel: wlan0: Limiting TX power to 23 (23 - 0) dBm as advertised by f0:9b:b8:16:5c:40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 18:00:05 ark-station kernel: wlan0: deauthenticating from f0:9b:b8:16:5c:40 by local choice (Reason: 3=DEAUTH_LEAVING)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 18:00:05 ark-station kernel: wlan0: authenticate with e2:cb:4f:01:72:a7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 18:00:05 ark-station kernel: wlan0: send auth to e2:cb:4f:01:72:a7 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 18:00:05 ark-station kernel: wlan0: authenticated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 18:00:05 ark-station kernel: wlan0: associate with e2:cb:4f:01:72:a7 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 18:00:05 ark-station kernel: wlan0: RX AssocResp from e2:cb:4f:01:72:a7 (capab=0x1511 status=0 aid=3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 18:00:05 ark-station kernel: wlan0: associated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 18:41:38 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* Atomic update failure on pipe A (start=2487239 end=2487240) time 230 us, min 1579, max 1599, scanline start 1566, end 1613\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 19:34:40 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* Atomic update failure on pipe A (start=2869004 end=2869005) time 158 us, min 1579, max 1599, scanline start 1570, end 1602\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:01:05 ark-station kernel: atkbd serio0: Unknown key pressed (translated set 2, code 0x8b on isa0060/serio0).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:01:05 ark-station kernel: atkbd serio0: Use \u0026#39;setkeycodes e00b \u0026lt;keycode\u0026gt;\u0026#39; to make it known.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:01:05 ark-station kernel: atkbd serio0: Unknown key released (translated set 2, code 0x8b on isa0060/serio0).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:01:05 ark-station kernel: atkbd serio0: Use \u0026#39;setkeycodes e00b \u0026lt;keycode\u0026gt;\u0026#39; to make it known.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:01:07 ark-station kernel: atkbd serio0: Unknown key pressed (translated set 2, code 0x8a on isa0060/serio0).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:01:07 ark-station kernel: atkbd serio0: Use \u0026#39;setkeycodes e00a \u0026lt;keycode\u0026gt;\u0026#39; to make it known.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:01:07 ark-station kernel: atkbd serio0: Unknown key released (translated set 2, code 0x8a on isa0060/serio0).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:01:07 ark-station kernel: atkbd serio0: Use \u0026#39;setkeycodes e00a \u0026lt;keycode\u0026gt;\u0026#39; to make it known.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:02:39 ark-station kernel: atkbd serio0: Unknown key pressed (translated set 2, code 0x8b on isa0060/serio0).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:02:39 ark-station kernel: atkbd serio0: Use \u0026#39;setkeycodes e00b \u0026lt;keycode\u0026gt;\u0026#39; to make it known.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:02:39 ark-station kernel: atkbd serio0: Unknown key released (translated set 2, code 0x8b on isa0060/serio0).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:02:39 ark-station kernel: atkbd serio0: Use \u0026#39;setkeycodes e00b \u0026lt;keycode\u0026gt;\u0026#39; to make it known.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:02:51 ark-station kernel: atkbd serio0: Unknown key pressed (translated set 2, code 0x8a on isa0060/serio0).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:02:51 ark-station kernel: atkbd serio0: Use \u0026#39;setkeycodes e00a \u0026lt;keycode\u0026gt;\u0026#39; to make it known.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:02:51 ark-station kernel: atkbd serio0: Unknown key released (translated set 2, code 0x8a on isa0060/serio0).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:02:51 ark-station kernel: atkbd serio0: Use \u0026#39;setkeycodes e00a \u0026lt;keycode\u0026gt;\u0026#39; to make it known.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* GT0: GUC: Engine reset failed on 0:0 (rcs0) because 0x00000000\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] GPU HANG: ecode 12:1:84dffffb, in Render thread [3009924]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] Resetting chip for GuC failed to reset engine mask=0x1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* rcs0 reset request timed out: {request: 00000001, RESET_CTL: 00000001}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* rcs0 reset request timed out: {request: 00000001, RESET_CTL: 00000001}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] Render thread[3009924] context reset due to GPU hang\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] GT0: GuC firmware i915/adlp_guc_70.bin version 70.13.1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] GT0: HuC firmware i915/tgl_huc.bin version 7.9.3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] GT0: HuC: authenticated for all workloads\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] GT0: GUC: submission enabled\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] GT0: GUC: SLPC enabled\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* GT0: GUC: Engine reset failed on 0:0 (rcs0) because 0x00000000\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] GPU HANG: ecode 12:1:84dffffb, in Render thread [3009924]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] Resetting chip for GuC failed to reset engine mask=0x1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* rcs0 reset request timed out: {request: 00000001, RESET_CTL: 00000001}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* rcs0 reset request timed out: {request: 00000001, RESET_CTL: 00000001}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] Render thread[3009924] context reset due to GPU hang\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] GT0: GuC firmware i915/adlp_guc_70.bin version 70.13.1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] GT0: HuC firmware i915/tgl_huc.bin version 7.9.3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] GT0: HuC: authenticated for all workloads\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] GT0: GUC: submission enabled\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] GT0: GUC: SLPC enabled\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:49:08 ark-station kernel: INFO: task IPC Launch:2387456 blocked for more than 122 seconds.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:49:16 ark-station kernel: Not tainted 6.6.10-arch1-1 #1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:49:27 ark-station kernel: \u0026#34;echo 0 \u0026gt; /proc/sys/kernel/hung_task_timeout_secs\u0026#34; disables this message.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:49:32 ark-station kernel: task:IPC Launch state:D stack:0 pid:2387456 ppid:870 flags:0x00004002\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:49:38 ark-station kernel: Call Trace:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:49:48 ark-station kernel: \u0026lt;TASK\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:50:00 ark-station kernel: __schedule+0x3e7/0x1410\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:50:16 ark-station kernel: schedule+0x5e/0xd0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:50:28 ark-station kernel: schedule_preempt_disabled+0x15/0x30\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:50:36 ark-station kernel: rwsem_down_write_slowpath+0x203/0x690\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:50:43 ark-station kernel: ? prealloc_shrinker+0x6a/0xd0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:50:51 ark-station kernel: ? __pfx_set_anon_super_fc+0x10/0x10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:50:57 ark-station kernel: down_write+0x5b/0x60\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:51:04 ark-station kernel: __prealloc_shrinker+0x70/0x350\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:51:11 ark-station kernel: ? kvasprintf+0x82/0xd0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:51:17 ark-station kernel: ? __pfx_set_anon_super_fc+0x10/0x10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:51:23 ark-station kernel: prealloc_shrinker+0x7b/0xd0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:51:28 ark-station kernel: alloc_super+0x272/0x2e0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:51:35 ark-station kernel: sget_fc+0x63/0x330\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:51:41 ark-station kernel: ? __pfx_mqueue_fill_super+0x10/0x10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:51:55 ark-station kernel: get_tree_nodev+0x27/0x90\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:52:02 ark-station kernel: vfs_get_tree+0x26/0xf0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:52:07 ark-station kernel: ? refcount_dec_and_lock+0x11/0x70\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:52:12 ark-station kernel: fc_mount+0x12/0x40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:52:17 ark-station kernel: mq_init_ns+0x10f/0x1b0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:52:21 ark-station kernel: copy_ipcs+0x134/0x270\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:52:26 ark-station kernel: create_new_namespaces+0xa1/0x2e0\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e看了一圈最后找到个issue,看样子我应该是drm/i195受害者咯。\u003c/p\u003e\u003ch3 id=\"SysRq-Keyboard-Shortcuts\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#SysRq-Keyboard-Shortcuts\" class=\"headerlink\" title=\"SysRq: Keyboard Shortcuts\"\u003e\u003c/a\u003eSysRq: Keyboard Shortcuts\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003esystemd has the SysRq permissions bitmask set to 0x10 by default, which does not allow process signalling or rebooting, among other things. To allow full use of the SysRq key on your system, add kernel.sysrq = 1 to your sysctl configuration. Values greater than 1 can be used to selectively enable SysRq functions; see the Linux kernel documentation for details. If you want to make sure it will be enabled even before the partitions are mounted and in the initrd, then add sysrq_always_enabled=1 to your kernel parameters.\u003c/p\u003e\u003cp\u003eNote that changing the setting through these methods will cause the changes to persist across reboots. If you want to try changing the SysRq settings for just your current session, you can run either sysctl kernel.sysrq=1 or echo “1” \u0026gt; /proc/sys/kernel/sysrq.\u003c/p\u003e\u003cp\u003eThere are some obvious security risks involved in fully enabling the SysRq key. In addition to forcing reboots and the like, it can be used to dump the contents of the CPU registers, which could theoretically reveal sensitive information. Since using it requires physical access to the system (unless you go out of your way), most desktop users will probably consider the level of risk acceptable. That said, make sure you fully understand the implications of enabling it and the dynamics of the larger context in which your system is operating before you turn SysRq all the way on. \u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e上边是\u003ca href=\"https://wiki.archlinux.org/title/keyboard_shortcuts\"\u003earch wiki\u003c/a\u003e的资料链接,可以参考下开开这玩意。这玩意的快捷键可以这么记:\u003cem\u003eReboot Even If System Utterly Broken\u003c/em\u003e。用法就是\u003ccode\u003eAlt+SysRq+这六个单词首字母缩写\u003c/code\u003e,功能分别是\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003eUnraw\u003c/code\u003e:切换键盘输入到ASCII模式,\u003c/li\u003e\u003cli\u003e\u003ccode\u003eTerminate\u003c/code\u003e:给所有进程发送\u003ccode\u003eSIGTERM\u003c/code\u003e,\u003c/li\u003e\u003cli\u003e\u003ccode\u003eKill\u003c/code\u003e:发送\u003ccode\u003eSIGKILL\u003c/code\u003e给所有进程,\u003c/li\u003e\u003cli\u003e\u003ccode\u003eSync\u003c/code\u003e:写入数据到磁盘,\u003c/li\u003e\u003cli\u003e\u003ccode\u003eUnmount\u003c/code\u003e:卸载然后挂载所有文件系统为只读模式,\u003c/li\u003e\u003cli\u003e\u003ccode\u003eReboot\u003c/code\u003e:重启。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e另外还可以用\u003ccode\u003ef\u003c/code\u003e来触发\u003ccode\u003eOOM Killer\u003c/code\u003e。\u003c/p\u003e\u003ch2 id=\"开机时间优化\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%BC%80%E6%9C%BA%E6%97%B6%E9%97%B4%E4%BC%98%E5%8C%96\" class=\"headerlink\" title=\"开机时间优化\"\u003e\u003c/a\u003e开机时间优化\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003eref: \u003ca href=\"https://www.glowmem.com/archives/archlinux-note#toc-head-7\"\u003e律回彼境\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e使用\u003ccode\u003esudo systemd-analyze blame\u003c/code\u003e可以查看系统开机时间详情。\u003c/p\u003e\u003cp\u003e自动mount分区(也就是直接在\u003ccode\u003e/etc/fstab\u003c/code\u003e里边进行配置)会导致启动时间增大,所以更推荐写成一个脚本,在用户登录后自动执行挂载。脚本放置在 ~/.config/autostart/ 即可在用户登录后执行。\u003c/p\u003e\u003ch2 id=\"又被Firefox爆了\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%8F%88%E8%A2%ABFirefox%E7%88%86%E4%BA%86\" class=\"headerlink\" title=\"又被Firefox爆了\"\u003e\u003c/a\u003e又被Firefox爆了\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e虽然后来看日志发现是Firefox被kwin爆了\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e这几天频繁出现桌面所有进程炸掉的情况,恢复后Firefox的Crash Report自己会跳出来。。不知道为啥,但是根据群u从\u003ccode\u003eabout:crashes\u003c/code\u003e里边提交的崩溃报告来看,应该是kwin把Firefox爆了。\u003c/p\u003e\u003cp\u003e根据老哥的建议,关闭了系统的自适应同步(Adaptive Sync)选项,按照他的惊叹,问题可能会少一些。\u003c/p\u003e\u003ch2 id=\"传文件的姿势\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E4%BC%A0%E6%96%87%E4%BB%B6%E7%9A%84%E5%A7%BF%E5%8A%BF\" class=\"headerlink\" title=\"传文件的姿势\"\u003e\u003c/a\u003e传文件的姿势\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e什么姿势,还真没见过\u003cbr/\u003e-转自archlinux-cn-依云\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003etar C -c ~tmp/makepkg/wayfire-lily-git/src/build/src wayfire | ssh root@kvm-archkde tar xvU -C /usr/bin/\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"文件系统迁移\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E8%BF%81%E7%A7%BB\" class=\"headerlink\" title=\"文件系统迁移\"\u003e\u003c/a\u003e文件系统迁移\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e有条件的话,建议还是全新安装最好。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003eReference:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ca href=\"https://zhuanlan.zhihu.com/p/512761420\"\u003e如何将你的文件系统转换为 Btrfs | Linux 中国\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://github.com/BarryWanghyw/Linux_Personal_Note/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B9%8Brsync%20%E5%A4%87%E4%BB%BD%E4%B8%8E%E8%BF%98%E5%8E%9F.md\"\u003eLinux_Personal_Note/Linux系统之rsync 备份与还原 - github.com\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"http://blog.imlk.top/posts/migrating-to-btrfs/\"\u003e从ext4迁移到btrfs - imlk’s blog\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://superuser.com/questions/524186/grub-broken-after-conversion-to-btrfs\"\u003eGRUB broken after conversion to btrfs - Superuser.com\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://forum.manjaro.org/t/boot-on-btrfs-subvolume-error-mount-new-root-unknown-filesystem-type-btrfs/152116\"\u003eBoot on btrfs subvolume error: “mount: /new_root: unknown filesystem type ‘btrfs’ ”\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e参考了几个博客,跟着感觉走最后总算是有惊无险整好了。\u003c/p\u003e\u003cp\u003e本来是想用\u003ccode\u003ebtrfs-convert\u003c/code\u003e给直接原地转换的,但是奈何superblock大小太小,转换失败。没办法,自己动手丰衣足食。\u003c/p\u003e\u003cp\u003e首先先是把原来的系统备份好:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003edd\u003c/span\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e=/dev/nvme0n1p5 of=/path/to/another/disk/backup.img bs=4M status=progress\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e有备份了,开整。\u003c/p\u003e\u003cp\u003e发现手边没有U盘,但是有个root的手机。于是就用DriveDroid+一个Arch的LiveISO让它发挥余热了。\u003c/p\u003e\u003cp\u003e启动挺顺利,记得把ArchISO挂载为只读USB存储设备。进去之后\u003cstrong\u003e确保确实备份了之后格式化设备\u003c/strong\u003e(一定要多确认几遍,):\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003emkfs.btrfs -L arch-driver /dev/nvme0n1p5 \u003cspan class=\"comment\"\u003e# 这里务必多确认几遍\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后创建子卷,布局我用的适合\u003ccode\u003etimeshift\u003c/code\u003e的默认方案:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003emount -t btrfs -o compress=zstd /dev/nvme0n1p5 /mnt\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ebtrfs subvolume create /mnt/@ \u003cspan class=\"comment\"\u003e# 创建 / 目录子卷\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ebtrfs subvolume create /mnt/@home \u003cspan class=\"comment\"\u003e# 创建 /home 目录子卷\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eumount /mnt\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emount -t btrfs -o subvol=/@,compress=zstd /dev/nvme0n1p5 /mnt\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emkdir\u003c/span\u003e /mnt/home\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emount -t btrfs -o subvol=/@home,compress=zstd /dev/nvme0n1p5 /mnt/home\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emkdir\u003c/span\u003e -p /mnt/boot\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emount /dev/nvme0n1p2 /mnt/boot\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e创建完成之后,准备迁移数据:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emkdir\u003c/span\u003e ~/old-fs\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emonut /path/to/your/backup/backup.img ~/old-fs\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ersync -av ~/old-fs/home/ /mnt/home/\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ersync -av --exclude={\u003cspan class=\"string\"\u003e\u0026#34;/proc\u0026#34;\u003c/span\u003e,\u003cspan class=\"string\"\u003e\u0026#34;/dev\u0026#34;\u003c/span\u003e} ~/old-fs/ /mnt/\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e等复制完成之后,就可以着手修复系统引导了。这里先用\u003ccode\u003eiwctl\u003c/code\u003e连上网。之后就该开始修复GRUB了:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003egenfstab -U /mnt \u0026gt; /mnt/etc/fstab\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 此时手动检查下结果是否正确\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 可以cat /mnt/etc/fstab看看\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003earch-chroot /mnt\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epacman -S grub-btrfs \u003cspan class=\"comment\"\u003e# 安装支持btrfs版本的GRUB\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003egrub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=ARCH\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esed -i \u003cspan class=\"string\"\u003e\u0026#39;s/loglevel=3 quiet/loglevel=5 nowatchdog/g\u0026#39;\u003c/span\u003e /etc/default/grub\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;GRUB_DISABLE_OS_PROBER=false\u0026#34;\u003c/span\u003e \u0026gt;\u0026gt; /etc/default/grub\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后理论上就OK了。此时\u003ccode\u003ectrl+d\u003c/code\u003e退出\u003ccode\u003echroot\u003c/code\u003e然后\u003ccode\u003eumount -R /mnt \u0026amp;\u0026amp; reboot\u003c/code\u003e,重启,进入新系统看看吧。\u003c/p\u003e\u003cp\u003e反正解决完一堆问题,成功进系统之后,我惊悚地发现,磁盘可用空间从8G变成了30G\u003cdel\u003e而且\u003ccode\u003ebtrfs balance /\u003c/code\u003e之后还又多出来1G\u003c/del\u003e。根据rx所说,btrfs对于文本的压缩效果特别好。那指不定是给我一堆\u003ccode\u003enode_modules\u003c/code\u003e压缩干净了?\u003c/p\u003e\u003cp\u003e谁知道,大概是透明压缩确实顶吧。经过测试,timeshift和其他的btrfs特性都能正常使用。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/"},{"title":"Linux误删文件恢复","time":"2023-08-29T18:52:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e删了私有云上几百个文件,不过好在最后发现只是删除了数据库里边的记录。万幸万幸。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e注意,\u003cstrong\u003e下面的操作只适用于删文件的进程已经挂了的情况,请根据自己情况选择合适的方法\u003c/strong\u003e。\u003c/p\u003e\u003ch2 id=\"首先要做的\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/08/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/linux-undelete/#%E9%A6%96%E5%85%88%E8%A6%81%E5%81%9A%E7%9A%84\" class=\"headerlink\" title=\"首先要做的\"\u003e\u003c/a\u003e首先要做的\u003c/h2\u003e\u003cp\u003e赶紧杀掉所有进程,防止数据写入到磁盘覆盖\u003ccode\u003einode\u003c/code\u003e,如果被覆盖基本就凉了。比如说,停止当前分区的服务,赶紧卸载当前分区设备,甚至直接断网都是有必要的。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eunmount /dev/sda1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 如果设备忙的话,用下面的命令强制卸载\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003efuser -m -v -i -k /dir\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后用\u003ccode\u003edd\u003c/code\u003e备份分区,防止恢复失败。比如可以用下面的指令:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003edd\u003c/span\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e=/dev/sda1 of=/tmp/sda1.img\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"工具准备\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/08/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/linux-undelete/#%E5%B7%A5%E5%85%B7%E5%87%86%E5%A4%87\" class=\"headerlink\" title=\"工具准备\"\u003e\u003c/a\u003e工具准备\u003c/h2\u003e\u003cp\u003e根据分区类型使用\u003ccode\u003eextundelete\u003c/code\u003e或者\u003ccode\u003entfsundelete\u003c/code\u003e。后者直接安装\u003ccode\u003entfs-3g\u003c/code\u003e即可,前者使用apt安装\u003ccode\u003eextundelete\u003c/code\u003e。\u003c/p\u003e\u003ch2 id=\"恢复\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/08/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/linux-undelete/#%E6%81%A2%E5%A4%8D\" class=\"headerlink\" title=\"恢复\"\u003e\u003c/a\u003e恢复\u003c/h2\u003e\u003cp\u003e\u003ca href=\"https://manpages.ubuntu.com/manpages/focal/en/man8/ntfsundelete.8.html\"\u003e官方文档\u003c/a\u003e\u003c/p\u003e\u003cp\u003e如果是ntfs分区的话,用这个命令得到文件列表:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 这个-f是因为我懒得卸载卷了\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 正常情况下还是先unmount了再操作,比较安全\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 这样就不用加-f了\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo ntfsundelete -s /dev/sdc2 -f \u0026gt; rec-list.txt\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 或者还有下面这些指令\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# Look for deleted files on /dev/hda1.\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003entfsundelete /dev/hda1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# Look for deleted documents on /dev/hda1.\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003entfsundelete /dev/hda1 -s -m \u003cspan class=\"string\"\u003e\u0026#39;*.doc\u0026#39;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# Look for deleted files between 5000 and 6000000 bytes, with at least 90% of the data\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# recoverable, on /dev/hda1.\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003entfsundelete /dev/hda1 -S 5k-6m -p 90\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# Look for deleted files altered in the last two days\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003entfsundelete /dev/hda1 -t 2d\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后可以按删除日期来筛查文件:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e rec-list.txt | grep 2023-08-30 \u0026gt; res-filtered.txt\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e最后恢复文件:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# Undelete inodes 2, 5 and 100 to 131 of device /dev/sda1\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003entfsundelete /dev/sda1 -u -i 2,5,100-131\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# Undelete inode number 3689, call the file \u0026#39;work.doc\u0026#39;, set it to recovered size and put it\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# in the user\u0026#39;s home directory.\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003entfsundelete /dev/hda1 -u -T -i 3689 -o work.doc -d ~\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# Save MFT Records 3689 to 3690 to a file \u0026#39;debug\u0026#39;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003entfsundelete /dev/hda1 -c 3689-3690 -o debug\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/08/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/linux-undelete/"},{"title":"ChatGLM部署手记","time":"2023-08-22T17:20:56Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e这次部署了一次量化后的模型,大概记录一下部署过程和遇到的问题。\u003c/p\u003e\u003cp\u003e因为显卡显存只有8G,所以部署的是6b的int4量化模型。\u003c/p\u003e\u003ch2 id=\"部署\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/08/22/ChatGLM%E9%83%A8%E7%BD%B2%E6%89%8B%E8%AE%B0/#%E9%83%A8%E7%BD%B2\" class=\"headerlink\" title=\"部署\"\u003e\u003c/a\u003e部署\u003c/h2\u003e\u003cp\u003e一般是直接从Hugging Face克隆仓库下来。我当时担心速度不够从清华云盘下载的,不过后来克隆发现速度很快,一般应该是不用担心下载速度的。\u003c/p\u003e\u003cp\u003e首先克隆6b的仓库,然后进入仓库安装依赖:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003egit \u003cspan class=\"built_in\"\u003eclone\u003c/span\u003e https://github.com/THUDM/ChatGLM-6B \u0026amp;\u0026amp; \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e ChatGLM-6B\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epip install -r requirements.txt\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后下载ChatGLM-6B的模型的量化版本。注意,\u003cstrong\u003e一定要下载所有的文件\u003c/strong\u003e。如果clone不下来,就先把其他小文件下下来,然后在清华网盘下载模型本体:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003egit \u003cspan class=\"built_in\"\u003eclone\u003c/span\u003e https://huggingface.co/THUDM/chatglm-6b-int4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 量化版本地址:https://cloud.tsinghua.edu.cn/d/674208019e314311ab5c/\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e完成后,更改cli-demo.py和webui-demo.py中的\u003ccode\u003eTHUDM/chatglm-6b-int4\u003c/code\u003e为你本地的路径:\u003ccode\u003e/path/to/chatglm-6b-int4\u003c/code\u003e即可。\u003c/p\u003e\u003cp\u003e最后,使用python运行即可:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003epython3 webui-demo.py\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"问题\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/08/22/ChatGLM%E9%83%A8%E7%BD%B2%E6%89%8B%E8%AE%B0/#%E9%97%AE%E9%A2%98\" class=\"headerlink\" title=\"问题\"\u003e\u003c/a\u003e问题\u003c/h2\u003e\u003cp\u003e如果报错的话,可能是缺少 tokenizer 的相关文件:tokenizer_config.json、special_tokens_map.json、tokenization_chatglm.py 和 ice_text.model。将这些文件(位于你下载的模型的目录中)补全即可解决。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/08/22/ChatGLM%E9%83%A8%E7%BD%B2%E6%89%8B%E8%AE%B0/"},{"title":"ESXi折腾小记","time":"2023-07-21T12:32:36Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"序\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E5%BA%8F\" class=\"headerlink\" title=\"序\"\u003e\u003c/a\u003e序\u003c/h2\u003e\u003cp\u003e其实理论上这玩意早都折腾好了。\u003c/p\u003e\u003cp\u003e只不过不满意于当时的家用板子(B450MK+1500X)对于ESXi兼容性太差,后来又换回了Windows+VMWare的组合。这组合咋用咋不爽,所以最后攒了点钱,整了一套服务器平台(联想的X99板子+E5 2680V4 x2+16G DDR4 ECC,一共大概600大洋),不过因为一些原因拖到最近才空出时间调试好。\u003c/p\u003e\u003ch2 id=\"硬件\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E7%A1%AC%E4%BB%B6\" class=\"headerlink\" title=\"硬件\"\u003e\u003c/a\u003e硬件\u003c/h2\u003e\u003cp\u003e本来机子6月已经装好了,但是一直处于开机不亮屏的状态。昨个跟卖家唠嗑了老久,调试了半天才发现这板子好像只知道集成显卡输出,就好像它不知道自己上边还插着个1080一样。\u003c/p\u003e\u003cp\u003e没办法,集显就集显吧,反正确实能用,还能省点电呢(=。=)\u003c/p\u003e\u003cp\u003e进了U盘,启动ESXi镜像,直接开装。因为是服务器板子,所以不用担心网卡支持之类的问题,反正很顺利地装完了。旁边的弱电柜看着挺好,里边还有个交换机来着,但是看到那密密麻麻的走线,折腾了一下就放弃了(而且这玩意要管理还得插串口线,笑死,根本找不到)。\u003c/p\u003e\u003cp\u003e于是直接把机器插到路由器上了。千兆网,爽死。\u003c/p\u003e\u003cp\u003e整好网络配置之后已经很晚了,遂直接回宿舍,来日再整。\u003c/p\u003e\u003ch2 id=\"系统\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E7%B3%BB%E7%BB%9F\" class=\"headerlink\" title=\"系统\"\u003e\u003c/a\u003e系统\u003c/h2\u003e\u003cp\u003e昨天才装好ESXi,今天下午急冲冲跑到实验室装好了Ubuntu,然后想整个OpenWRT当旁路由,但是发现目前还没啥必要,于是作罢,就用Ubuntu直接开始吧(反正比Windows好\u003c/p\u003e\u003cp\u003e随便装了装软件啥的。先是试着用刚学的sed给apt换了个源,然后装了docker,zip啥的。有了docker之后,直接把笔记本上的mc服务器扔了上去+docker run光速部署。真香。\u003c/p\u003e\u003cp\u003e然后慢慢折腾回以前的服务。首先是gitea,1.20居然都支持ci/cd了,这不狠狠部署?但是我以前的数据还在硬盘上扔着,于是先整了下物理硬盘的vhd映射。下面记录一下:\u003c/p\u003e\u003cp\u003e打开ESXi的SecureSHell(ssh)服务之后,用它的管理账户密码登录上去,然后运行\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003els\u003c/span\u003e /vmfs/devices/disks/\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e查看系统挂载的硬盘信息:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e27\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e28\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e29\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e30\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003et10.ATA_____ST2000DM0052D2CW102__________________________________WFL1DE7T\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.ATA_____ST2000DM0052D2CW102__________________________________WFL1DE7T:1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.ATA_____ST2000DM0052D2CW102__________________________________WFL1DE7T:5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.ATA_____ST4000VX0002D2AG166__________________________________ZDHA1DHG\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.ATA_____ST4000VX0002D2AG166__________________________________ZDHA1DHG:1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.ATA_____ST4000VX0002D2AG166__________________________________ZDHA1DHG:2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001:1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001:2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001:3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001:5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001:6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001:7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001:8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001:9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.010000000020202020202020202020202057464c3144453754535432303030\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.010000000020202020202020202020202057464c3144453754535432303030:1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.010000000020202020202020202020202057464c3144453754535432303030:5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.01000000002020202020202020202020205a44484131444847535434303030\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.01000000002020202020202020202020205a44484131444847535434303030:1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.01000000002020202020202020202020205a44484131444847535434303030:2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20:1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20:2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20:3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20:5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20:6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20:7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20:8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20:9\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后找到硬盘对应的编号,然后用\u003ccode\u003evmkfstools\u003c/code\u003e把硬盘映射到vhd文件里:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003evmkfstools -z /vmfs/devices/disks/[target disk] /vmfs/voluems/datastore1/[target vhd \u003cspan class=\"built_in\"\u003elink\u003c/span\u003e name].vmdk\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e完成之后,在虚拟机编辑里添加硬盘,选择现有硬盘,在里边找到刚才新建的两个硬盘映射vhd文件。\u003c/p\u003e\u003cp\u003e挂载到虚拟机上之后,开机,我们还得把硬盘挂载到系统上。\u003c/p\u003e\u003cp\u003e硬盘加到虚拟机上之后,一般会以\u003ccode\u003e/dev/sd[a-z]\u003c/code\u003e的形式出现,这种时候只需要用\u003ccode\u003efdisk\u003c/code\u003e康康磁盘上有什么好康的分区就行啦。不过我这盘好像被Windows的快速启动污染了,得先在Windows里挂载一下,正常关机才能挂载到Linux底下。\u003c/p\u003e\u003cp\u003e所以,现在本来要装Windows来着,但是突然发现Vmware里边有个叫上载虚拟机的东东:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://mxts.jiujiuer.xyz/img/Pasted%20image%2020230721220805.png\"/\u003e\u003c/p\u003e\u003cp\u003e然后就懒得装了,直接把以前的老虚拟机传上去了。开机前设置下硬盘挂载,然后直接开机再关机,搞定。\u003c/p\u003e\u003cp\u003e配置完成之后,发现果然还是另外整个系统当frp的客户端比较稳定。挑了半天发现还是OpenWRT最方便,于是在\u003ca href=\"https://supes.top/?target=x86/64\u0026amp;id=generic\"\u003eOpenWrt软路由固件下载与在线定制编译\u003c/a\u003e这里下了个x86架构的编译版本装上了。启动之后应该就能正常访问了,就是得先配置下网络的配置文件(我这边为了网络环境方便访问,配置的是bridge桥接模式,所以得手动重新设置网关、地址之类的)。配置相关的内容,恩山有不少内容可以参考。\u003c/p\u003e\u003cp\u003e总之一番折腾下来配好旁路由和内网穿透\u003cdel\u003e以及基本不咋用的局域网代理\u003c/del\u003e之后,折腾就基本结束了\u003c/p\u003e\u003cp\u003e直到我发现安装系统选项底下有个MacOS。装都装了,不试试怎么行呢(不过据了解,黑果在ESXi虚拟化环境下体验不行,更建议物理机\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eTODO:等啥时候加个ssd扩容系统盘再说吧。。空间居然不够用了\u003c/p\u003e\u003c/blockquote\u003e\u003ch3 id=\"自动启动\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8\" class=\"headerlink\" title=\"自动启动\"\u003e\u003c/a\u003e自动启动\u003c/h3\u003e\u003cp\u003e装完机器之后想配置宿主机启动后,子主机跟着自动启动。但是在机器的虚拟机设置里边开开了自动启动之后,却没有按照预期开机自动启动VM。排查一番之后发现原来还有个设置没开。\u003c/p\u003e\u003cp\u003e从左侧导航栏到\u003ccode\u003e主机-\u0026gt;管理-\u0026gt;系统-\u0026gt;自动启动\u003c/code\u003e,点编辑设置,把自动启动打开就行。\u003c/p\u003e\u003cp\u003e这边的两个延时,指的是ESXi启动/关闭所有虚拟机的间隔时间,全局设置会被主机的设置覆盖。而等待检测信号(Wait for heartbeat)指的是,在VM中安装VMWare工具后,系统启动完成后会告知宿主机。此时,如果这个设置为真,则ESXi会跳过启动等待时间,去启动下一个系统。\u003c/p\u003e\u003ch3 id=\"磁盘缩容\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E7%A3%81%E7%9B%98%E7%BC%A9%E5%AE%B9\" class=\"headerlink\" title=\"磁盘缩容\"\u003e\u003c/a\u003e磁盘缩容\u003c/h3\u003e\u003cp\u003e为啥缩小容量呢?因为ESXi系统盘大小不够用了,新系统塞不进去(挠头\u003c/p\u003e\u003cp\u003e装了个Windows Server 2012 R2 Datacenter尝尝鲜,在本子上配置好之后觉得还挺香,遂打算扔服务器上,然后因为上面的原因卡住。\u003c/p\u003e\u003cp\u003e解决方法分两步。先声明一下,我是单磁盘系统,如果是多磁盘还得自己探索探索(\u003c/p\u003e\u003cp\u003e首先用Disk Genius(其实系统自带的磁盘管理也行)打开\u003ccode\u003evmdk\u003c/code\u003e磁盘,然后把系统分区缩小到目标容量,剩下的空间留空就行。完成后保存退出Disk Genuis。\u003c/p\u003e\u003cp\u003e然后用随便一个文本编辑器打开\u003ccode\u003evmdk\u003c/code\u003e文件,最上面几行有一行表示磁盘簇大小的,大小是磁盘容量(KB)的二倍,修改它到合适的大小就行。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://mxts.jiujiuer.xyz/img/Pasted%20image%2020231030214637.png\" alt=\"随便找了个图图\"/\u003e\u003c/p\u003e\u003cp\u003e就是RW一行,改成合适的大小就行。\u003c/p\u003e\u003cp\u003e编辑完成之后直接用VMWare Workstation传到ESXi主机上就OK了。这一点不得不夸下,配套的东西确实挺好用。\u003c/p\u003e\u003ch2 id=\"服务\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E6%9C%8D%E5%8A%A1\" class=\"headerlink\" title=\"服务\"\u003e\u003c/a\u003e服务\u003c/h2\u003e\u003cp\u003e折腾好服务器了,就得想想作何用途了。整理出来的大概有这些:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003eService\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003egitea\u003c/td\u003e\u003ctd\u003e代码托管和CI/CD\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ecloudreve\u003c/td\u003e\u003ctd\u003e私有云,数据管理以及WebDAV数据备份同步\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eminecraft\u003c/td\u003e\u003ctd\u003e这肯定必装啊,大型开放世界游戏(无误\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ejupyter\u003c/td\u003e\u003ctd\u003e都装N卡了,不玩玩深度学习?\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003edatabase\u003c/td\u003e\u003ctd\u003e当Web服务后端,香就一个字\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ecompile\u003c/td\u003e\u003ctd\u003e这可是56线程啊,我以后写个helloworld都要\u003ccode\u003emake -j56\u003c/code\u003e(大声\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ecalculate\u003c/td\u003e\u003ctd\u003e渲染和其他计算任务倒是可以试试丢上来跑\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003evm server\u003c/td\u003e\u003ctd\u003e给别人也整几个虚拟机用用\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eweb services\u003c/td\u003e\u003ctd\u003e挂点WEB服务上去,岂不美哉\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003emirror site\u003c/td\u003e\u003ctd\u003e整个镜像站,功德无量啊功德无量\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eothers\u003c/td\u003e\u003ctd\u003e后面再想\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cblockquote\u003e\u003cp\u003e先配服务器再想应用场景,有一种先射击再瞄准的美\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e目前搭建的基本就是\u003ccode\u003egitea, mc, cloudreve, jupyter, mysql\u003c/code\u003e这几个,后台还跑着一些运维脚本,目前这些已吃完我的内存了QAQ。总之简述下搭建流程吧。毕竟是个blog不是manual,就不贴太详细的步骤了。如果给出了指令,请确保在理解的情况下,按照真实系统环境执行。\u003c/p\u003e\u003ch3 id=\"gitea\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#gitea\" class=\"headerlink\" title=\"gitea\"\u003e\u003c/a\u003egitea\u003c/h3\u003e\u003cp\u003e这个搭建起来很简单,直接wget最新的build到你要安装的目录,然后把官方的service配置cat到\u003ccode\u003e/etc/systemd/system/gitea.service\u003c/code\u003e,再\u003ccode\u003esudo systemctl enable --now gitea.service\u003c/code\u003e,之后再在给出的Web链接里配置好服务,最后修改好\u003ccode\u003econfig.ini\u003c/code\u003e再重启服务就好了。\u003c/p\u003e\u003cp\u003e很好用的客户端\u003c/p\u003e\u003ch3 id=\"cloudreve\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#cloudreve\" class=\"headerlink\" title=\"cloudreve\"\u003e\u003c/a\u003ecloudreve\u003c/h3\u003e\u003cp\u003e跟上面基本一样,先wget下来,再运行一下产生配置文件并修改好设置,并配置好systemd的服务管理,最后启动就行。不过,安装完成后,还得配置下\u003cstrong\u003e存储策略\u003c/strong\u003e来确定文件存储的物理位置,并在用户组中修改每种用户的空间限额大小和权限等。\u003c/p\u003e\u003cp\u003e这东西我最喜欢的点是支持WebDAV,所以配合上AutoSync之类的客户端,就能实现数据增量备份和同步。\u003c/p\u003e\u003ch3 id=\"Minecraft\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#Minecraft\" class=\"headerlink\" title=\"Minecraft\"\u003e\u003c/a\u003eMinecraft\u003c/h3\u003e\u003cp\u003e喜闻乐见的MC时间。这边我是用Docker开服的,环境最干净,并且最方便于管理。具体参考以前写过的Docker-MC开服的博文。\u003c/p\u003e\u003cp\u003e这次为了运维简单,使用了某docker镜像来开服。官方服的唯一优点估计只剩下官方俩字了,实际表现可以说是一般环境一般,弱网环境逆天。据说原因是因为官方服务器只要丢包发生,无论几个都给你踢了。\u003c/p\u003e\u003cp\u003e所以建议用\u003ccode\u003ePaper\u003c/code\u003e之类的第三方服务端,性能好的多。\u003c/p\u003e\u003ch3 id=\"JupyterLab\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#JupyterLab\" class=\"headerlink\" title=\"JupyterLab\"\u003e\u003c/a\u003eJupyterLab\u003c/h3\u003e\u003cp\u003e直接\u003ccode\u003epython3 -m pip install jupyterlab\u003c/code\u003e或者用\u003ccode\u003eapt, pacman\u003c/code\u003e之类的包管理器安装就行。装完了照着上面的在systemd把它添加为服务就行。装好之后,直接浏览器访问端口使用就行了。\u003c/p\u003e\u003cp\u003e唯一要注意的就是安全性了,注意设个复杂点的密码,小心暴力破解。\u003c/p\u003e\u003ch3 id=\"database\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#database\" class=\"headerlink\" title=\"database\"\u003e\u003c/a\u003edatabase\u003c/h3\u003e\u003cp\u003e刚好这边有个项目得用数据库,所以就用docker开了个mysql的daemon当数据库。不得不说是真的方便\u003c/p\u003e\u003ch3 id=\"Compiling-Service\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#Compiling-Service\" class=\"headerlink\" title=\"Compiling Service\"\u003e\u003c/a\u003eCompiling Service\u003c/h3\u003e\u003cp\u003e这部分我是用gitea-action搞定的。其他时候,我一般直接ssh到服务器上手动编译。不过注意,\u003cstrong\u003e服务器的稳定性至关重要\u003c/strong\u003e,别随便跑啥若治脚本把服务器玩炸了。数据可靠性很关键。特别是当你的服务器还挂了一堆存着重要数据的硬盘,要是真手欠\u003ccode\u003erm -rf\u003c/code\u003e了你哭都没地方去。所以建议这种任务通通扔docker,反正没啥性能损失。\u003c/p\u003e\u003ch3 id=\"Calculation\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#Calculation\" class=\"headerlink\" title=\"Calculation\"\u003e\u003c/a\u003eCalculation\u003c/h3\u003e\u003cp\u003e用JupyterLab能搞定一部分\u003cdel\u003e反正他们数据科学的基本全是python\u003c/del\u003e,另一部分相对需求较小的,就直接跑专门的计算进程算了。\u003c/p\u003e\u003cp\u003e由于计算任务的强性能需求和性能抢占特性,务必设置守护进程等手段,防止一个计算任务炸了整个服务器。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e实在不行在ESXi再开个机器专门跑计算。(\u003c/p\u003e\u003c/blockquote\u003e\u003ch3 id=\"VM-Servers\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#VM-Servers\" class=\"headerlink\" title=\"VM Servers\"\u003e\u003c/a\u003eVM Servers\u003c/h3\u003e\u003cp\u003e打算先搓个轮子,然后基于这个轮子整个自动new container并绑定账号和tty的web service。安全性问题后面再说,这些机器可以用来租借或者提供给其他人学习使用。\u003c/p\u003e\u003ch3 id=\"Web-Services\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#Web-Services\" class=\"headerlink\" title=\"Web Services\"\u003e\u003c/a\u003eWeb Services\u003c/h3\u003e\u003cp\u003e比如可以把\u003ccode\u003eXDU-ISC\u003c/code\u003e的主页/blog挂上去,或者挂点其他Web服务,比如自动打卡之类的。\u003c/p\u003e\u003ch3 id=\"Mirror-Site\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#Mirror-Site\" class=\"headerlink\" title=\"Mirror Site\"\u003e\u003c/a\u003eMirror Site\u003c/h3\u003e\u003cp\u003e给各种大型镜像源整个分流,分担下压力造福开源——不过我这点硬盘容量就算了罢。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e2023.11.03 昨天\u003ccode\u003eClash For Windows\u003c/code\u003e删库,今天\u003ccode\u003eclash core\u003c/code\u003e和其他\u003ccode\u003eClash\u003c/code\u003e系的全部删库\u003cbr/\u003e哎 常用软件还是得整份源码小心删库\u003cbr/\u003e实在不行也能自己维护。\u003c/p\u003e\u003c/blockquote\u003e\u003ch3 id=\"Samba\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#Samba\" class=\"headerlink\" title=\"Samba\"\u003e\u003c/a\u003eSamba\u003c/h3\u003e\u003cp\u003e开个Samba给Windows共享用还是挺爽的。Win的Native WebDAV好像有点问题,不然就省事了。\u003c/p\u003e\u003cp\u003e详细配置教程可以参考\u003ca href=\"https://ubuntu.com/tutorials/install-and-configure-samba#1-overview\"\u003eUbuntu tutorials - Install and configure samba\u003c/a\u003e。我搬个简略版的下来:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo apt update \u0026amp;\u0026amp; sudo apt install samba\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 创建你要共享的目录\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emkdir\u003c/span\u003e ~/sambashare\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 编辑samba配置文件\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 为了以命令形式展示这边用了古法编辑\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 建议用Vim/sed/nano之类的搞定\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo \u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e \u0026lt;\u0026lt; \u003cspan class=\"string\"\u003eEOF \u0026gt;\u0026gt; /etc/samba/smb.conf\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e[sambashare]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e comment = Samba on Ubuntu\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e path = /home/username/sambashare\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e read only = no\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e browsable = yes\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo systemctl \u003cspan class=\"built_in\"\u003eenable\u003c/span\u003e --now smbd \u0026amp;\u0026amp; sudo service start samba\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 更改samba共享账户和密码\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 这个用户账户得是系统中现存的账户\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo smbpasswd -a [username]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 然后根据指引设定共享密码,完成\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e完成后,从其他机器上以\u003ccode\u003e\\\\ip-address\\sambashare\u003c/code\u003e就能访问共享的目录。\u003c/p\u003e\u003ch3 id=\"其他服务\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1\" class=\"headerlink\" title=\"其他服务\"\u003e\u003c/a\u003e其他服务\u003c/h3\u003e\u003cp\u003e其他服务的话,比如我写的\u003ccode\u003eNanoOJ\u003c/code\u003e就可以挂上去给搞算法竞赛的\u003cdel\u003e小东西\u003c/del\u003e们训练用,也可以把我写那个\u003ccode\u003eXDU-Planet\u003c/code\u003e挂上去,聚合大家的博客\u003cdel\u003e黑历史\u003c/del\u003e博文,还能整点其他的花活。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e最近把\u003ccode\u003eXDU-Planet\u003c/code\u003e贡献给\u003ccode\u003eXDOSC\u003c/code\u003e社区了,目前挂了很多人的\u003cdel\u003e黑\u003c/del\u003e历史,可以来\u003ca href=\"https://xdlinux.github.io/planet/\"\u003ePlanet\u003c/a\u003e看看。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e总之,充分利用嘛。\u003c/p\u003e\u003cp\u003e哦对,这两天还搭建了个Overleaf用来写LaTex。把编译阶段的任务甩给服务器做挺爽的。部署指南参考了\u003ca href=\"https://zhuanlan.zhihu.com/p/656444021\"\u003e这篇\u003c/a\u003e步骤记录如下:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emkdir\u003c/span\u003e -p overleaf \u0026amp;\u0026amp; \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e overleaf\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewget https://github.com/overleaf/overleaf/blob/main/docker-compose.yml\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 上边下下来compose配置之后得先改点地方,比如overleaf的端口,volume的存放路径等\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003edocker-compose up -d\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 配置完整的TexLive以支持完整编译\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003edocker \u003cspan class=\"built_in\"\u003eexec\u003c/span\u003e -it sharelatex bash\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e /usr/local/texlive\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewget http://mirror.ctan.org/systems/texlive/tlnet/update-tlmgr-latest.sh --no-check-certificate\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esh update-tlmgr-latest.sh -- --upgrade\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003etlmgr option repository https://mirrors.ustc.edu.cn/CTAN/systems/texlive/tlnet\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003etlmgr update --self --all \u003cspan class=\"comment\"\u003e# luaotfload-tool -fu\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003etlmgr install scheme-full\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e最下边的\u003ccode\u003etlmgr install\u003c/code\u003e就是用来安装各种CTAN包的工具。以后有缺失的包时可以按需安装。\u003c/p\u003e\u003ch2 id=\"运维\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E8%BF%90%E7%BB%B4\" class=\"headerlink\" title=\"运维\"\u003e\u003c/a\u003e运维\u003c/h2\u003e\u003cp\u003e服务器的躯体是硬件,灵魂是数据。物理上的安全备份这里先不论,这里主要说说数据上的安全和管理。\u003c/p\u003e\u003ch3 id=\"数据安全\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8\" class=\"headerlink\" title=\"数据安全\"\u003e\u003c/a\u003e数据安全\u003c/h3\u003e\u003cp\u003e磁盘上的数据无非就程序,配置和存储的重要数据文件这三类,下面分开说。\u003c/p\u003e\u003ch4 id=\"程序\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E7%A8%8B%E5%BA%8F\" class=\"headerlink\" title=\"程序\"\u003e\u003c/a\u003e程序\u003c/h4\u003e\u003cp\u003e大部分程序只是一份可以重新安装下载的数据文件,所以我们只需要备份它的程序列表即可。在迁移系统或者出现重大损失时,我们只需要拿到程序列表,然后用你最喜欢的包管理器批量安装这些程序即可。假设你使用\u003ccode\u003eapt\u003c/code\u003e作为包管理器:前者可以通过\u003ccode\u003edpkg --get-selections \u0026gt; backup.txt\u003c/code\u003e做到,后者可以通过\u003ccode\u003esudo apt-get update \u0026amp;\u0026amp; sudo apt-get install $(awk \u0026#39;{print $1}\u0026#39; backup.txt)\u003c/code\u003e做到。\u003c/p\u003e\u003cp\u003e当然,上面的实现只是最基础的。我们可以使用\u003ccode\u003eawk, git\u003c/code\u003e等工具把这件事做的更好。以上面两行脚本为基础原理,我们可以编写一个借助\u003ccode\u003egit\u003c/code\u003e进行备份记录的版本控制和备份,借助\u003ccode\u003eawk\u003c/code\u003e让备份的程序列表更加可读和强大,借助\u003ccode\u003ealias\u003c/code\u003e和\u003ccode\u003ebashrc\u003c/code\u003e为安装增加一个更新应用列表的hook,利用\u003ccode\u003ecrontab\u003c/code\u003e实现备份的无人值守和自动化,并且可以增加应用的版本信息以及特定版本安装等等。\u003c/p\u003e\u003cp\u003e甚至,对于不在apt的软件,也可以手动记录,甚至是直接保存ELF到备份仓库中。\u003c/p\u003e\u003cp\u003e借助这个工具,灾难恢复也会变得相对简单。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eTODO:后边实现这个脚本,先插个flag在这\u003c/p\u003e\u003c/blockquote\u003e\u003ch4 id=\"配置\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E9%85%8D%E7%BD%AE\" class=\"headerlink\" title=\"配置\"\u003e\u003c/a\u003e配置\u003c/h4\u003e\u003cp\u003eLinux下的大多数配置文件因为都以一个点(dot)开头,所以也叫dotfile。我总结的最佳实践应该是利用Git和Hard-Link去进行管理。比较麻烦的是dotfiles的恢复,这个工作也可以写一个脚本完成,自动根据记录的配置文件路径(存储于csv文件中)去自动创建硬链接来管理。这个方法基本没啥问题,就是容易遇到各种莫名其妙的失效问题,以及在termux里边由于没有root权限不能创建符号链接就很难受。\u003c/p\u003e\u003cp\u003e这里有篇文章,讲解的更加详细:\u003ca href=\"https://medium.com/@simontoth/best-way-to-manage-your-dotfiles-2c45bb280049\"\u003eBest way to manage your dotfiles\u003c/a\u003e,也比较接近我的观念。还有这篇也值得参考:\u003ca href=\"https://medium.com/@simontoth/best-way-to-manage-your-dotfiles-2c45bb280049\"\u003eBest way to manage your dotfiles\u003c/a\u003e\u003c/p\u003e\u003cp\u003e参考上面的思路,对dotfiles的管理可以帮你\u003cdel\u003e在你电脑炸了的时候\u003c/del\u003e快速重建你的环境配置,以及回溯以前的配置文件,又或者是同步你的环境到其他机器上。舒适度拉满.jpg\u003c/p\u003e\u003ch4 id=\"数据\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E6%95%B0%E6%8D%AE\" class=\"headerlink\" title=\"数据\"\u003e\u003c/a\u003e数据\u003c/h4\u003e\u003cp\u003e这部分我做的最早。不过方案嘛,主打一个能用就行。\u003c/p\u003e\u003cp\u003e具体而言,首先在各个需要备份的目录下写一个\u003ccode\u003ebackup.sh\u003c/code\u003e来生成要备份的文件,比如这个:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#!/bin/bash\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eFNAME=\u003cspan class=\"string\"\u003e\u0026#34;[backup]mc-server-\u003cspan class=\"variable\"\u003e$NAME\u003c/span\u003e-\u003cspan class=\"subst\"\u003e$(date +%Y%m%d%H%M%S)\u003c/span\u003e.zip\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eNAME=\u003cspan class=\"string\"\u003e\u0026#34;my-server\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ezip -qr \u003cspan class=\"variable\"\u003e$FNAME\u003c/span\u003e \u003cspan class=\"variable\"\u003e$NAME\u003c/span\u003e/\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"variable\"\u003e$FNAME\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e注意,必须输出生成的文件名称,后面有用。\u003c/p\u003e\u003cp\u003e然后随便找个地方写个脚本:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#!/bin/bash\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 使用Bash实现的自动备份工具\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 注意,绝对不能备份当前目录,不然会产生无限递归\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eBACKUP_DIR=$(\u003cspan class=\"built_in\"\u003edirname\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$0\u003c/span\u003e\u0026#34;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eset\u003c/span\u003e -e \u003cspan class=\"comment\"\u003e# 在出现错误时自动退出\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eset\u003c/span\u003e -u \u003cspan class=\"comment\"\u003e# 在使用未定义的变量时自动退出\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eset\u003c/span\u003e -o pipefail \u003cspan class=\"comment\"\u003e# 在管道中的任何一个命令出错时自动退出\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e IFS= \u003cspan class=\"built_in\"\u003eread\u003c/span\u003e -r line; \u003cspan class=\"keyword\"\u003edo\u003c/span\u003e \u003cspan class=\"comment\"\u003e# 循环处理每一个备份任务\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e [[ -z \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$line\u003c/span\u003e\u0026#34;\u003c/span\u003e || \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$line\u003c/span\u003e\u0026#34;\u003c/span\u003e =~ ^\u003cspan class=\"comment\"\u003e# ]]; then # 不执行注释和空行\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003econtinue\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003efi\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"comment\"\u003e# 使用awk得到任务参数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e SOURCE=$(awk -F, \u003cspan class=\"string\"\u003e\u0026#39;{print $1}\u0026#39;\u003c/span\u003e \u0026lt;\u0026lt;\u0026lt; \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$line\u003c/span\u003e\u0026#34;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e TARGET=$(awk -F, \u003cspan class=\"string\"\u003e\u0026#39;{print $2}\u0026#39;\u003c/span\u003e \u0026lt;\u0026lt;\u0026lt; \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$line\u003c/span\u003e\u0026#34;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e MAX=$(awk -F, \u003cspan class=\"string\"\u003e\u0026#39;{print $3}\u0026#39;\u003c/span\u003e \u0026lt;\u0026lt;\u0026lt; \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$line\u003c/span\u003e\u0026#34;\u003c/span\u003e) \u003cspan class=\"comment\"\u003e# 最大保留备份数量\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;[\u003cspan class=\"subst\"\u003e$(date)\u003c/span\u003e] Backing up \u003cspan class=\"variable\"\u003e$SOURCE\u003c/span\u003e to \u003cspan class=\"variable\"\u003e$TARGET\u003c/span\u003e with max \u003cspan class=\"variable\"\u003e$MAX\u003c/span\u003e items\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$SOURCE\u003c/span\u003e\u0026#34;\u003c/span\u003e \u0026amp;\u0026amp; ./backup.sh | xargs \u003cspan class=\"built_in\"\u003emv\u003c/span\u003e -t \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$TARGET\u003c/span\u003e\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;[\u003cspan class=\"subst\"\u003e$(date)\u003c/span\u003e] Backup source \u003cspan class=\"variable\"\u003e$SOURCE\u003c/span\u003e completed\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$TARGET\u003c/span\u003e\u0026#34;\u003c/span\u003e \u0026amp;\u0026amp; \u003cspan class=\"built_in\"\u003els\u003c/span\u003e -t | \u003cspan class=\"built_in\"\u003etail\u003c/span\u003e -n +$((MAX+\u003cspan class=\"number\"\u003e1\u003c/span\u003e)) | xargs \u003cspan class=\"built_in\"\u003erm\u003c/span\u003e -f\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003edone\u003c/span\u003e \u0026lt; \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$BACKUP_DIR\u003c/span\u003e/config.csv\u0026#34;\u003c/span\u003e \u003cspan class=\"comment\"\u003e# 备份任务配置数据位于脚本所在目录\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e注释比较详细就不细说了。接下来在同级目录下\u003ccode\u003etouch config.csv\u003c/code\u003e来保存备份条目信息,举个例子:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e# src,target,max-items\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e/home/xeonds/mc-server,/mnt/c/backup/mc-server-backup/atelier-of-zimin,4\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后把上面的脚本加入\u003ccode\u003ecrontab\u003c/code\u003e中定时运行:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e0 4 * * * output=$(/home/xeonds/backup/backup.sh); pushplus \u003cspan class=\"string\"\u003e\u0026#34;自动备份任务完成\u0026#34;\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$output\u003c/span\u003e\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面的就是我正在用的的自动备份方案,\u003ccode\u003epushplus\u003c/code\u003e参考我写的Bash学习笔记。\u003c/p\u003e\u003cp\u003e总体就突出一个刚好能用。\u003c/p\u003e\u003cp\u003e另外我记得好像推荐\u003ccode\u003ersync\u003c/code\u003e做增量备份的来着,不过我的这些数据可能不太适合增量备份所以没用。如果是照片一类的文件,倒是很适合rsync来处理。回头可以抽空升级下这个脚本。\u003c/p\u003e\u003ch4 id=\"备份服务器\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E5%A4%87%E4%BB%BD%E6%9C%8D%E5%8A%A1%E5%99%A8\" class=\"headerlink\" title=\"备份服务器\"\u003e\u003c/a\u003e备份服务器\u003c/h4\u003e\u003cp\u003e在继续阅读之前,\u003cstrong\u003e永远保证数据安全,root的无上权限永远意味着使用者的责任,按下回车之前一定再三检查指令!!!\u003c/strong\u003e\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh username@server_ip \u003cspan class=\"string\"\u003e\u0026#34;sudo dd if=/dev/sdX bs=4M status=progress\u0026#34;\u003c/span\u003e | \u003cspan class=\"built_in\"\u003edd\u003c/span\u003e of=/path/to/local/backup/server_root.img bs=4M\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面的指令,将远端服务器的一个分区直接备份到本地的一个文件中,块级别拷贝,安全可靠,就是\u003ccode\u003edd\u003c/code\u003e指令特别危险,得谨慎使用。\u003c/p\u003e\u003cp\u003e还原的时候,在目标计算机上启动Live CD进入一个临时系统,挂载磁盘然后用合适的指令还原数据:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003edd\u003c/span\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e=/path/to/local/backup/server_root.img bs=4M status=progress | ssh username@new_server_ip \u003cspan class=\"string\"\u003e\u0026#34;sudo dd of=/dev/sdY bs=4M status=progress\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e如果是同一服务器备份还原,那还原之后直接用就行了。但是如果服务器硬件不一致的话,那就得重新配置一些东西了。\u003c/p\u003e\u003col\u003e\u003cli\u003e保证启动配置正确\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e我用的是GRUB,解决方案如下。基本就是重新安装然后更新引导项。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# Assuming /mnt is the mount point of the restored system\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo mount /dev/sdY1 /mnt \u003cspan class=\"comment\"\u003e# Mount the root partition\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo mount --\u003cspan class=\"built_in\"\u003ebind\u003c/span\u003e /dev /mnt/dev\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo mount --\u003cspan class=\"built_in\"\u003ebind\u003c/span\u003e /proc /mnt/proc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo mount --\u003cspan class=\"built_in\"\u003ebind\u003c/span\u003e /sys /mnt/sys\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo \u003cspan class=\"built_in\"\u003echroot\u003c/span\u003e /mnt /bin/bash\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003egrub-install /dev/sdY\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eupdate-grub\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003col start=\"2\"\u003e\u003cli\u003e磁盘大小恢复\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e使用\u003ccode\u003edd\u003c/code\u003e恢复有一个问题,就是如果新的系统盘变大了,那还原之后系统可能还以为大小和以前一样。这种情况就需要:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo resize2fs /dev/sdY1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003edf\u003c/span\u003e -h \u003cspan class=\"comment\"\u003e# check whether the disk size covers the entire partition\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e完事之后可能还需要用\u003ccode\u003egparted\u003c/code\u003e之类的东西变一下磁盘大小。\u003c/p\u003e\u003col start=\"3\"\u003e\u003cli\u003e更新磁盘UUID\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e这玩意其实其他地方也会需要,比如硬盘\u003ccode\u003eUUID\u003c/code\u003e因为各种玄学原因变化了。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo blkid /dev/sdY1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo vi /etc/fstab \u003cspan class=\"comment\"\u003e# 更新其中对应设备的UUID\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e另外就是如果在\u003ccode\u003e/etc/default/grub\u003c/code\u003e里边的\u003ccode\u003eGRUB_CMDLINE_LINUX\u003c/code\u003e里边也指定了,那也得改成对应的。改完之后\u003ccode\u003esudo update-grub\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e完事重启,应该就能正常使用了。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e如果服务器是全新安装,并且采用UEFI启动的话,那必须手动重建EFI分区,而且它得是硬盘的第一个分区。详细参考这里:\u003ca href=\"https://arch.icekylin.online/guide/rookie/basic-install-detail.html#%F0%9F%86%95-%E5%85%A8%E6%96%B0%E5%AE%89%E8%A3%85\"\u003e全新安装 - archlinux简明指南\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e不过我自己迁移的时候因为几块硬盘倒来倒去太麻烦,索性就直接重装系统了。迁移之后,对于之前的数据恢复,找到那个备份生成的.img文件,用下面的指令挂载然后恢复数据就行:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo mount -o ro,noload server-old.img ./old/\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面的镜像和要挂载的目录改成你自己需要的就行。要迁移的项目就下面几个:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e名称\u003c/th\u003e\u003cth\u003e路径\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003ecrontab\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e/etc/cron.*/\u003c/code\u003e和\u003ccode\u003ecrontab -l\u003c/code\u003e的内容\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ehome下的各种服务\u003c/td\u003e\u003ctd\u003e~/\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e各种自定义脚本\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e/usr/local/bin\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch3 id=\"硬件安全\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E7%A1%AC%E4%BB%B6%E5%AE%89%E5%85%A8\" class=\"headerlink\" title=\"硬件安全\"\u003e\u003c/a\u003e硬件安全\u003c/h3\u003e\u003cp\u003e首当其冲就是硬盘安全。这方面可以用\u003ccode\u003esmartctl\u003c/code\u003e来定期监测SMART信息确认磁盘状态。我试了下,好像ESXi里边我映射的硬盘也支持检测SMART信息。这里也可以写个脚本定期监测并发送监测报告\u003cdel\u003e此处可本\u003c/del\u003e。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e天天脚本脚本,那么\u003cdel\u003e你们程序员移一定都是足控吧.jpg\u003c/del\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e其他的嘛……暂时莫得啥需求。\u003c/p\u003e\u003ch3 id=\"数据管理\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E6%95%B0%E6%8D%AE%E7%AE%A1%E7%90%86\" class=\"headerlink\" title=\"数据管理\"\u003e\u003c/a\u003e数据管理\u003c/h3\u003e\u003cp\u003e很喜欢Bash的一句话:\u003ccode\u003eman bash\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e如何整理磁盘上的文件?问问\u003ccode\u003emv, cp, ls, rm, cat, grep, sed, awk, xargs\u003c/code\u003e;然后,用bash把它们拼起来就行。只要你想,你可以编写出任何脚本来整理你的所有文件。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eTODO:具体的脚本太多了,这里地方小,写不下(溜\u003c/p\u003e\u003c/blockquote\u003e\u003chr/\u003e\u003cblockquote\u003e\u003cp\u003e2024.1.4:update\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e很早之前就整上这个Windows Server 2012 R2数据中心版本了,之前一直纯当Windows用的,今天发现Windows Server Datacenter确实是有一些很便利数据中心管理的feature,其中最让我心动的无疑是它的Deduplication功能。这个部分作为服务器的可选功能,需要在服务器管理面板手动添加,而且微软的东西的一个好处就是文档有中文而且相对比较完善,参考\u003ca href=\"https://learn.microsoft.com/zh-cn/windows-server/storage/data-deduplication/install-enable\"\u003e安装和启用数据删除\u003c/a\u003e。虽然上边标注的适用版本里边好像没有Windows Server 2012 R2 Datacenter,但是我自己实测是支持这个版本的。\u003c/p\u003e\u003cp\u003e具体的开启步骤上面的参考链接里边有,这里说下我的踩坑经历。首先就是这玩意的文件系统只支持NTFS和ReFS两种,并且必须是本地的磁盘(但是我主力Linux,而且文件比较乱,还没把磁盘重新分配给Windows),也就是说必须在ESXi里边把磁盘分配给Windows才能享受数据压缩。其次就是这个压缩是以块为粒度的,根据微软官方的说法而言,能够节省的空间确实不少,适合文件服务器和给Hyper-V服务器用,能显著节省空间。另外这个玩意是个定期运行的服务,服务的注意事项它也得注意。\u003c/p\u003e\u003cp\u003e以及除了这个本体之外,还有一个\u003ccode\u003eddpeval.exe\u003c/code\u003e是用来评估数据压缩效果的。可以先跑一次这个然后再根据实际情况决策是否启用数据压缩。还有就是这东西作为重型I/O操作,很吃内存和CPU,所以启用数据去重服务的时候得注意根据实际情况限制它可以使用的资源量。\u003c/p\u003e\u003cp\u003e哎,要是这玩意有开源实现就好了,直接挂Linux底下定期执行。\u003c/p\u003e\u003ch3 id=\"自动运维\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E8%87%AA%E5%8A%A8%E8%BF%90%E7%BB%B4\" class=\"headerlink\" title=\"自动运维\"\u003e\u003c/a\u003e自动运维\u003c/h3\u003e\u003cp\u003e都Linux了不得写个脚本帮自己干活?而且还有其他好用的工具呢,首当其冲的还得是\u003ccode\u003esystemctl\u003c/code\u003e,\u003ccode\u003ecrontab\u003c/code\u003e,一个自动管理后台服务,一个自动运行任务,堪称运维两大法器。\u003ccode\u003esystemctl\u003c/code\u003e多用来自动启动和重启后台服务,\u003ccode\u003ecrontab\u003c/code\u003e作为一个定时器,基本跟时间相关的任务都能干,比如\u003cdel\u003e自动报时\u003c/del\u003e,定时清理,定时重启,定时更新,定时打卡,定时发送状态简报,定时发送邮件,\u003cdel\u003e定时煮饭\u003c/del\u003e等等你能想到想不到的。\u003c/p\u003e\u003cp\u003e另外,还有\u003ccode\u003ebash\u003c/code\u003e和\u003ccode\u003ealias\u003c/code\u003e,前者不光能跟你\u003cdel\u003e打\u003c/del\u003e交互,还能连接很多强大的工具;后者不光是个别名,还能帮你hook各种命令,给它们加点小功能。这部分建议多读读命令行的艺术,以及\u003ccode\u003eman bash\u003c/code\u003e的内容,更重要的是得多用。\u003c/p\u003e\u003cp\u003e我整完这些之后,感觉还是不太过瘾。毕竟这些功能全能点的面板估计也能做到,而且我也不可能到处因为一点小事就ssh到服务器上吧)\u003c/p\u003e\u003cp\u003e在接触了低代码表单的思想之后,我就又想造轮子了:搓个工具,借助低代码系统,写出自己的运维管理面板,最好是实现一个页面一个配置文件,改配置文件就更新对应页面和后面调用的命令的程度。\u003c/p\u003e\u003cp\u003e借助这个工具倒是可以实现很轻量,而且完全自由的服务器控制面板,而且无需依赖,可定制度拉满那种。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eTODO:这里也挖个坑立个flag\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e上面那段倒是偏离自动运维这个话题了。说回正题:除了上面提到的\u003ccode\u003esystemd\u003c/code\u003e和\u003ccode\u003ecrontab\u003c/code\u003e之外,还可以让系统监听一些事件,并做出即时响应。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e这里先放个UNIX哲学()\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e比如让系统读取某进程的日志输出,如果输出带有ERROR等字样,就发送警告给运维,或者执行其他的动作。,我们可以将触发的部分和执行的部分分离,让系统对不同的问题做出响应。比如收到了内存不足的警报,那就自动执行\u003ccode\u003esudo echo 3 \u0026gt; /proc/sys/vm/drop_caches\u003c/code\u003e来释放内存,还是过高的话就报警\u003cdel\u003e并随机kill一个幸运进程\u003c/del\u003e;比如有个\u003cdel\u003e若治\u003c/del\u003e同事又把你数据库炸了给你发邮件求助,那系统就直接roll back数据库;再比如监测到系统设备panic了,直接发送警报并紧急关机系统防止进一步损失;还可以接收UPS的断电信号,发送警报并迅速关机来避免更大的损失;有什么登录失败的/疑似端口爆破的,直接自动ban了它的IP;再比如系统流量激增,直接报警;再比如ban了\u003ccode\u003esudo rm -rf /\u003c/code\u003e这种敏感操作;甚至自动审核各种请求等等。只有想不到,没有做不到\u003cdel\u003e除了生孩子\u003c/del\u003e。\u003c/p\u003e\u003cp\u003e这里重点介绍下\u003ccode\u003eSystemd\u003c/code\u003e。其中的工具对于自动化运维来说很常用。大多是现代linux都内置了systemd的相关组件,并使用systemd-init替换了原来的sysv-init作为系统引导服务。\u003c/p\u003e\u003cp\u003eSystemd是一组工具合集,其中包含了70多个常用的系统基础工具,覆盖系统服务管理,系统启动管理,网络管理,计划任务等等。\u003c/p\u003e\u003cp\u003e首先值得注意的是systemd对待\u003ccode\u003e$()\u003c/code\u003e的行为。在bash中,这个符号表示执行括号中的命令,并将这个命令原地替换为执行的结果;但是在systemd中,它的行为和makefile中一致:表示变量引用。因此,在编写systemd服务时注意含义区别。\u003c/p\u003e\u003cp\u003e另外就是单元文件存储的位置。单元可以分为三类,一类是系统级单元,一类是本地管理员管理的系统级单元,一类是用户级单元。三类单元分别是系统启动时使用的单元,以系统权限运行的单元,以及非特权用户级别运行的单元,路径分别位于:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e/lib/systemd/system/\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003e/etc/systemd/system/\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003e/etc/systemd/user/\u003c/code\u003e 或 \u003ccode\u003e~/.config/systemd/user/\u003c/code\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"systemd-timer\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#systemd-timer\" class=\"headerlink\" title=\"systemd-timer\"\u003e\u003c/a\u003esystemd-timer\u003c/h4\u003e\u003cp\u003e\u003ccode\u003esystemd-timer\u003c/code\u003e 是 systemd 中的一个重要组件。它允许用户定义和管理定时任务,使得系统能够在预定时间执行特定的操作。作为crontab的替代品比较不错,有完善的日志支持,统一的服务管理,依赖管理等。\u003c/p\u003e\u003col\u003e\u003cli\u003e定时器单元(Timer Units)\u003cbr/\u003e\u003ccode\u003esystemd-timer\u003c/code\u003e 使用单元文件(unit files)来描述要执行的定时任务。定时器单元文件的命名规则为 \u003ccode\u003e.timer\u003c/code\u003e,通常位于 \u003ccode\u003e/etc/systemd/system/\u003c/code\u003e 目录下。\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e以下是一个简单的定时器单元文件的示例,用于每天执行一个备份任务:\u003c/p\u003e\u003cfigure class=\"highlight ini\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Unit]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eDescription\u003c/span\u003e=Backup Timer\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Timer]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eOnCalendar\u003c/span\u003e=daily\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003ePersistent\u003c/span\u003e=\u003cspan class=\"literal\"\u003etrue\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Install]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eWantedBy\u003c/span\u003e=timers.target\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e[Unit]\u003c/code\u003e 部分描述了定时器的基本信息。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e[Timer]\u003c/code\u003e 部分定义了定时器的执行计划。在这个示例中,\u003ccode\u003eOnCalendar=daily\u003c/code\u003e 表示每天执行一次任务。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e[Install]\u003c/code\u003e 部分定义了单元文件的安装信息。\u003c/li\u003e\u003c/ul\u003e\u003col start=\"2\"\u003e\u003cli\u003e常用的 systemctl 命令\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e启动一个定时器:\u003ccode\u003esudo systemctl start mytimer.timer\u003c/code\u003e\u003c/li\u003e\u003cli\u003e停止一个定时器:\u003ccode\u003esudo systemctl stop mytimer.timer\u003c/code\u003e\u003c/li\u003e\u003cli\u003e查看定时器状态:\u003ccode\u003esudo systemctl status mytimer.timer\u003c/code\u003e\u003c/li\u003e\u003cli\u003e查看定时器日志:\u003ccode\u003ejournalctl -u mytimer.timer\u003c/code\u003e\u003c/li\u003e\u003c/ul\u003e\u003col start=\"3\"\u003e\u003cli\u003e\u003cp\u003e持久性定时器\u003cbr/\u003e通过设置 \u003ccode\u003ePersistent=true\u003c/code\u003e,可以使定时器在错过预定执行时间后立即触发任务执行。这对于保证任务的执行是非常有用的。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e使用 OnCalendar 属性\u003cbr/\u003e\u003ccode\u003eOnCalendar\u003c/code\u003e 属性允许您以灵活的方式定义定时器的执行时间。您可以指定特定的日期、每周、每月甚至每小时执行任务的时间。\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"systemd-service\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#systemd-service\" class=\"headerlink\" title=\"systemd-service\"\u003e\u003c/a\u003esystemd-service\u003c/h4\u003e\u003cp\u003e服务管理器是systemd中最核心的部分之一。systemd 的服务管理器允许用户管理系统上运行的服务,这些服务可以是系统进程、网络服务、后台任务等等。\u003c/p\u003e\u003col\u003e\u003cli\u003e服务单元(Service Units)\u003cbr/\u003esystemd 使用单元文件(unit files)来描述要管理的各种资源,其中最常见的就是服务单元。服务单元文件以 \u003ccode\u003e.service\u003c/code\u003e 扩展名结尾,其中包含了服务的配置信息以及其行为。服务单元文件通常位于 \u003ccode\u003e/etc/systemd/system/\u003c/code\u003e 目录下,但也可以位于其他位置。\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e下面是一个简单的示例服务单元文件,用于启动一个假设的 Web 服务器:\u003c/p\u003e\u003cfigure class=\"highlight ini\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Unit]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eDescription\u003c/span\u003e=My Web Server\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eAfter\u003c/span\u003e=network.target\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Service]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eExecStart\u003c/span\u003e=/usr/bin/my_web_server\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eRestart\u003c/span\u003e=always\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Install]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eWantedBy\u003c/span\u003e=multi-user.target\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e[Unit]\u003c/code\u003e 部分描述了单元的基本信息,如描述和依赖关系。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e[Service]\u003c/code\u003e 部分定义了服务的执行方式和行为。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e[Install]\u003c/code\u003e 部分定义了单元文件如何被安装。\u003c/li\u003e\u003c/ul\u003e\u003col start=\"2\"\u003e\u003cli\u003e常用命令\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e启动一个服务:\u003ccode\u003esudo systemctl start servicename\u003c/code\u003e\u003c/li\u003e\u003cli\u003e停止一个服务:\u003ccode\u003esudo systemctl stop servicename\u003c/code\u003e\u003c/li\u003e\u003cli\u003e重启一个服务:\u003ccode\u003esudo systemctl restart servicename\u003c/code\u003e\u003c/li\u003e\u003cli\u003e查看服务状态:\u003ccode\u003esudo systemctl status servicename\u003c/code\u003e\u003c/li\u003e\u003cli\u003e启用一个服务(开机启动):\u003ccode\u003esudo systemctl enable servicename\u003c/code\u003e\u003c/li\u003e\u003cli\u003e禁用一个服务(开机不启动):\u003ccode\u003esudo systemctl disable servicename\u003c/code\u003e\u003c/li\u003e\u003c/ul\u003e\u003col start=\"3\"\u003e\u003cli\u003e\u003cp\u003e日志和故障排除\u003cbr/\u003e可以使用 \u003ccode\u003ejournalctl\u003c/code\u003e 命令来查看 systemd 的日志信息,例如:\u003ccode\u003ejournalctl -u servicename\u003c/code\u003e 将显示特定服务的日志。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e高级功能\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e定义服务间的依赖关系\u003cbr/\u003e在服务单元文件中,可以使用 \u003ccode\u003eRequires\u003c/code\u003e 和 \u003ccode\u003eAfter\u003c/code\u003e 来定义服务之间的依赖关系。\u003ccode\u003eRequires\u003c/code\u003e 指定了其他单元,表示该服务依赖于指定的单元;\u003ccode\u003eAfter\u003c/code\u003e 则指定了在何时启动该服务。\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight ini\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Unit]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eDescription\u003c/span\u003e=My Service\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eRequires\u003c/span\u003e=network.target\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eAfter\u003c/span\u003e=network.target\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e设置资源限制\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e通过在服务单元文件中使用 \u003ccode\u003eLimitCPU\u003c/code\u003e, \u003ccode\u003eLimitMEM\u003c/code\u003e, \u003ccode\u003eLimitNOFILE\u003c/code\u003e 等参数,可以限制服务的资源使用。这有助于防止某个服务占用过多的系统资源。\u003c/p\u003e\u003cfigure class=\"highlight ini\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Service]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eLimitCPU\u003c/span\u003e=\u003cspan class=\"number\"\u003e50\u003c/span\u003e%\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eLimitMEM\u003c/span\u003e=\u003cspan class=\"number\"\u003e512\u003c/span\u003eM\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eLimitNOFILE\u003c/span\u003e=\u003cspan class=\"number\"\u003e10000\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e设置环境变量\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e有时,服务需要使用特定的环境变量才能正常运行。您可以在服务单元文件的 \u003ccode\u003e[Service]\u003c/code\u003e 部分中使用 \u003ccode\u003eEnvironment\u003c/code\u003e 参数来设置这些环境变量。\u003c/p\u003e\u003cfigure class=\"highlight ini\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Service]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eEnvironment\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;VAR1=value1\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eEnvironment\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;VAR2=value2\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"性能\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E6%80%A7%E8%83%BD\" class=\"headerlink\" title=\"性能\"\u003e\u003c/a\u003e性能\u003c/h3\u003e\u003cp\u003e最近升级成32G DDR4 ECC内存了,所以想着也不用swap了于是就关了:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo swapoff /swap.img \u003cspan class=\"comment\"\u003e# 这里需要改成你的swap文件\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# sudo rm /swap.img # 可选\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e至于关不关,区别似乎不大,但是确实节省了我一些磁盘空间,理论上能延缓磁盘使用寿命。具体还是得看服务器日常内存占用情况而决定。\u003c/p\u003e\u003ch3 id=\"权限管理\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86\" class=\"headerlink\" title=\"权限管理\"\u003e\u003c/a\u003e权限管理\u003c/h3\u003e\u003cp\u003e服务器平时总是空着的,所以打算把服务器给几个哥们也分配个号。想来想去虚拟化的话性能损耗比较大,不如上用户组来进行权限管理,刚好也多一个深入学习Linux系统的机会。\u003c/p\u003e\u003cp\u003e首先是创建用户组:\u003ccode\u003esudo groupadd dim0\u003c/code\u003e,创建完成后再更改用户组权限即可。\u003c/p\u003e\u003cp\u003e然后是创建所有用户:\u003ccode\u003efor user in {tesla,zimin,holynia,ray}; do sudo useradd -m -G dim0 $user; done\u003c/code\u003e,创建用户的同时,将他们加入\u003ccode\u003edim0\u003c/code\u003e用户组,并且自动为他们创建用户目录。\u003c/p\u003e\u003cp\u003e完成之后就是修改用户组的权限了。他们创建的时候就不在\u003ccode\u003ewheel\u003c/code\u003e用户组中,所以没有\u003ccode\u003esudo\u003c/code\u003e权限。\u003c/p\u003e\u003cp\u003e对于需要禁止访问的目录,更改权限和所有权就行:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo chown xeonds:wheel /path/2/dir\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo chmod go-x /path/2/dir\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"尾声\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E5%B0%BE%E5%A3%B0\" class=\"headerlink\" title=\"尾声\"\u003e\u003c/a\u003e尾声\u003c/h2\u003e\u003cp\u003e到这里,我的服务器就基本折腾好了。我现在拥有一个数据安全性相对较高的NAS,一个日常开发可用的自动化编译/部署服务,一个代码托管和备份系统,一个7x24可用的mc服务器,一个可用于数据科学/AI学习的在线算力,一个可以随时启动的,一个可以租借给他人的docker vm实例集群,甚至是一个会自己维护自己,会帮我处理各种浪费时间的重复任务,并且易于灾难恢复和迁移的系统,以及一个Linux新手应该具备的系统管理心得经验。\u003c/p\u003e\u003cp\u003e可以说,这些投入,物超所值。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/"},{"title":"关于前端Blob下载那点事","time":"2023-07-11T14:16:38Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"背景\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%85%B3%E4%BA%8E%E5%89%8D%E7%AB%AFBlob%E4%B8%8B%E8%BD%BD%E9%82%A3%E7%82%B9%E4%BA%8B/#%E8%83%8C%E6%99%AF\" class=\"headerlink\" title=\"背景\"\u003e\u003c/a\u003e背景\u003c/h2\u003e\u003cp\u003e最近做一个项目,后端返回一个Excel表格给前端下载,前端应该使用Blob将文件保存并下载下来。可是前端这里试了半天,数据大小没问题,就是一直下不下来。后来解决了好几个问题之后才成功解决了这个下载问题。\u003c/p\u003e\u003ch2 id=\"问题1-请求头\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%85%B3%E4%BA%8E%E5%89%8D%E7%AB%AFBlob%E4%B8%8B%E8%BD%BD%E9%82%A3%E7%82%B9%E4%BA%8B/#%E9%97%AE%E9%A2%981-%E8%AF%B7%E6%B1%82%E5%A4%B4\" class=\"headerlink\" title=\"问题1-请求头\"\u003e\u003c/a\u003e问题1-请求头\u003c/h2\u003e\u003cp\u003e查找相关资料后,发现似乎错误的请求头是引发这个问题的一个原因。随后就改了请求部分的代码,加上了请求头的配置:\u003c/p\u003e\u003cfigure class=\"highlight js\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title function_\"\u003eserviceAxios\u003c/span\u003e({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003emethod\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;POST\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003eurl\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;xxx\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003eheaders\u003c/span\u003e: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"string\"\u003e\u0026#39;Content-Type\u0026#39;\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;application/vnd.ms-excel\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eToken\u003c/span\u003e: \u003cspan class=\"variable language_\"\u003elocalStorage\u003c/span\u003e.\u003cspan class=\"title function_\"\u003egetItem\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;token\u0026#39;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e },\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003edata\u003c/span\u003e: \u003cspan class=\"variable language_\"\u003ethis\u003c/span\u003e.\u003cspan class=\"property\"\u003eform_data\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e })\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e .\u003cspan class=\"title function_\"\u003ethen\u003c/span\u003e(\u003cspan class=\"function\"\u003e(\u003cspan class=\"params\"\u003eres\u003c/span\u003e) =\u0026gt;\u003c/span\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"variable language_\"\u003ethis\u003c/span\u003e.\u003cspan class=\"property\"\u003eisShow\u003c/span\u003e = \u003cspan class=\"literal\"\u003efalse\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title function_\"\u003edownload\u003c/span\u003e(\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e res,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"string\"\u003e\u0026#39;application/vnd.ms-excel\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"variable language_\"\u003ethis\u003c/span\u003e.\u003cspan class=\"property\"\u003eform_data\u003c/span\u003e.\u003cspan class=\"property\"\u003ename\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e )\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eElMessage\u003c/span\u003e.\u003cspan class=\"title function_\"\u003esuccess\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;下载成功\u0026#39;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e })\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e .\u003cspan class=\"title function_\"\u003ecatch\u003c/span\u003e(\u003cspan class=\"function\"\u003e(\u003cspan class=\"params\"\u003eerr\u003c/span\u003e) =\u0026gt;\u003c/span\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eElMessage\u003c/span\u003e.\u003cspan class=\"title function_\"\u003eerror\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;下载失败:\u0026#39;\u003c/span\u003e + err)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e })\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e但是这样不仅下载的内容打不开,而且下载本身还报错了:\u003cstrong\u003eHTTP 415:Unsupported Media Type\u003c/strong\u003e。它的简介如下:\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e415 Unsupported Media Type\u003c/code\u003e\u003c/strong\u003e 是一种 HTTP 协议的错误状态代码,表示服务器由于不支持其有效载荷的格式,从而拒绝接受客户端的请求。\u003c/p\u003e\u003cp\u003e格式问题的出现有可能源于客户端在 \u003ca href=\"https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Type\"\u003e\u003ccode\u003eContent-Type\u003c/code\u003e\u003c/a\u003e 或 \u003ca href=\"https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Encoding\"\u003e\u003ccode\u003eContent-Encoding\u003c/code\u003e\u003c/a\u003e 首部中指定的格式,也可能源于直接对负载数据进行检测的结果。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e因此很明显,我应该是设置错了HTTP请求标头。于是查阅了HTTP请求标头的几个字段,发现我应该是搞反了\u003ccode\u003eContent-Type\u003c/code\u003e和\u003ccode\u003eAccept\u003c/code\u003e的意思。\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003eContent-Type\u003c/strong\u003e:自己发送给对方的内容的MIME类型\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eAccept\u003c/strong\u003e:自己能接受的内容的MIME类型\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e常见的MIME类型( \u003cstrong\u003eMultipurpose Internet Mail Extensions,媒体类型\u003c/strong\u003e)如下:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e扩展名\u003c/th\u003e\u003cth\u003e文档类型\u003c/th\u003e\u003cth\u003eMIME 类型\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.aac\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eAAC audio\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eaudio/aac\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.abw\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://en.wikipedia.org/wiki/AbiWord\"\u003eAbiWord\u003c/a\u003e document\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-abiword\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.arc\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eArchive document (multiple files embedded)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-freearc\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.avi\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eAVI: Audio Video Interleave\u003c/td\u003e\u003ctd\u003e\u003ccode\u003evideo/x-msvideo\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.azw\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eAmazon Kindle eBook format\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.amazon.ebook\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.bin\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eAny kind of binary data\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/octet-stream\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.bmp\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eWindows OS/2 Bitmap Graphics\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eimage/bmp\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.bz\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eBZip archive\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-bzip\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.bz2\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eBZip2 archive\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-bzip2\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.csh\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eC-Shell script\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-csh\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.css\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eCascading Style Sheets (CSS)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003etext/css\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.csv\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eComma-separated values (CSV)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003etext/csv\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.doc\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMicrosoft Word\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/msword\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.docx\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMicrosoft Word (OpenXML)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.openxmlformats-officedocument.wordprocessingml.document\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.eot\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMS Embedded OpenType fonts\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.ms-fontobject\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.epub\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eElectronic publication (EPUB)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/epub+zip\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.gif\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eGraphics Interchange Format (GIF)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eimage/gif\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.htm .html\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eHyperText Markup Language (HTML)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003etext/html\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.ico\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eIcon format\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eimage/vnd.microsoft.icon\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.ics\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eiCalendar format\u003c/td\u003e\u003ctd\u003e\u003ccode\u003etext/calendar\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.jar\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eJava Archive (JAR)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/java-archive\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.jpeg\u003c/code\u003e \u003ccode\u003e.jpg\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eJPEG images\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eimage/jpeg\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.js\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eJavaScript\u003c/td\u003e\u003ctd\u003e\u003ccode\u003etext/javascript\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.json\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eJSON format\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/json\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.jsonld\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eJSON-LD format\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/ld+json\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.mid\u003c/code\u003e \u003ccode\u003e.midi\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMusical Instrument Digital Interface (MIDI)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eaudio/midi\u003c/code\u003e \u003ccode\u003eaudio/x-midi\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.mjs\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eJavaScript module\u003c/td\u003e\u003ctd\u003e\u003ccode\u003etext/javascript\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.mp3\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMP3 audio\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eaudio/mpeg\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.mpeg\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMPEG Video\u003c/td\u003e\u003ctd\u003e\u003ccode\u003evideo/mpeg\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.mpkg\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eApple Installer Package\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.apple.installer+xml\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.odp\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eOpenDocument presentation document\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.oasis.opendocument.presentation\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.ods\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eOpenDocument spreadsheet document\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.oasis.opendocument.spreadsheet\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.odt\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eOpenDocument text document\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.oasis.opendocument.text\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.oga\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eOGG audio\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eaudio/ogg\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.ogv\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eOGG video\u003c/td\u003e\u003ctd\u003e\u003ccode\u003evideo/ogg\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.ogx\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eOGG\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/ogg\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.otf\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eOpenType font\u003c/td\u003e\u003ctd\u003e\u003ccode\u003efont/otf\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.png\u003c/code\u003e\u003c/td\u003e\u003ctd\u003ePortable Network Graphics\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eimage/png\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.pdf\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eAdobe \u003ca href=\"https://acrobat.adobe.com/us/en/why-adobe/about-adobe-pdf.html\"\u003ePortable Document Format\u003c/a\u003e (PDF)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/pdf\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.ppt\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMicrosoft PowerPoint\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.ms-powerpoint\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.pptx\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMicrosoft PowerPoint (OpenXML)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.openxmlformats-officedocument.presentationml.presentation\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.rar\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eRAR archive\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-rar-compressed\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.rtf\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eRich Text Format (RTF)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/rtf\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.sh\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eBourne shell script\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-sh\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.svg\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eScalable Vector Graphics (SVG)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eimage/svg+xml\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.swf\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://en.wikipedia.org/wiki/SWF\"\u003eSmall web format\u003c/a\u003e (SWF) or Adobe Flash document\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-shockwave-flash\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.tar\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eTape Archive (TAR)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-tar\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.tif .tiff\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eTagged Image File Format (TIFF)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eimage/tiff\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.ttf\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eTrueType Font\u003c/td\u003e\u003ctd\u003e\u003ccode\u003efont/ttf\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.txt\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eText, (generally ASCII or ISO 8859-\u003cem\u003en\u003c/em\u003e)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003etext/plain\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.vsd\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMicrosoft Visio\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.visio\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.wav\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eWaveform Audio Format\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eaudio/wav\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.weba\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eWEBM audio\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eaudio/webm\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.webm\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eWEBM video\u003c/td\u003e\u003ctd\u003e\u003ccode\u003evideo/webm\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.webp\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eWEBP image\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eimage/webp\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.woff\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eWeb Open Font Format (WOFF)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003efont/woff\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.woff2\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eWeb Open Font Format (WOFF)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003efont/woff2\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.xhtml\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eXHTML\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/xhtml+xml\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.xls\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMicrosoft Excel\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.ms-excel\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.xlsx\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMicrosoft Excel (OpenXML)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.xml\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eXML\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/xml\u003c/code\u003e 代码对普通用户来说不可读 (\u003ca href=\"https://tools.ietf.org/html/rfc3023#section-3\"\u003eRFC 3023\u003c/a\u003e, section 3) \u003ccode\u003etext/xml\u003c/code\u003e 代码对普通用户来说可读 (\u003ca href=\"https://tools.ietf.org/html/rfc3023#section-3\"\u003eRFC 3023\u003c/a\u003e, section 3)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.xul\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eXUL\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.mozilla.xul+xml\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.zip\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eZIP archive\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/zip\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.3gp\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://en.wikipedia.org/wiki/3GP_and_3G2\"\u003e3GPP\u003c/a\u003e audio/video container\u003c/td\u003e\u003ctd\u003e\u003ccode\u003evideo/3gpp\u003c/code\u003e \u003ccode\u003eaudio/3gpp\u003c/code\u003e(若不含视频)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.3g2\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://en.wikipedia.org/wiki/3GP_and_3G2\"\u003e3GPP2\u003c/a\u003e audio/video container\u003c/td\u003e\u003ctd\u003e\u003ccode\u003evideo/3gpp2\u003c/code\u003e \u003ccode\u003eaudio/3gpp2\u003c/code\u003e(若不含视频)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.7z\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://en.wikipedia.org/wiki/7-Zip\"\u003e7-zip\u003c/a\u003e archive\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-7z-compressed\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e上面的MIME类型就是Content-Type和Accept两个字段的内容。因此,我们应该将请求头改为如下的形式:\u003c/p\u003e\u003cfigure class=\"highlight js\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eheaders\u003c/span\u003e: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eAccept\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;application/vnd.ms-excel\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"string\"\u003e\u0026#39;Content-Type\u0026#39;\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;application/json\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eToken\u003c/span\u003e: \u003cspan class=\"variable language_\"\u003elocalStorage\u003c/span\u003e.\u003cspan class=\"title function_\"\u003egetItem\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;token\u0026#39;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e},\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后还是出现HTTP 415错误,不过是后端返回的数据的请求头。让后端排查了下,发现是Spring的代理把请求头改成\u003ccode\u003eapplication/json\u003c/code\u003e了,所以前端这才会出现415的错误。\u003c/p\u003e\u003cp\u003e但是,还有一个小问题没解决,所以下载还是用不了。\u003c/p\u003e\u003ch2 id=\"问题2-Blob\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%85%B3%E4%BA%8E%E5%89%8D%E7%AB%AFBlob%E4%B8%8B%E8%BD%BD%E9%82%A3%E7%82%B9%E4%BA%8B/#%E9%97%AE%E9%A2%982-Blob\" class=\"headerlink\" title=\"问题2-Blob\"\u003e\u003c/a\u003e问题2-Blob\u003c/h2\u003e\u003cp\u003e改了两边的请求头并确定都没问题后,发现虽然能正常下载了,但是下载的内容Execl还是不能打开。但是最奇怪的是,APIfox下载的Excel是可以打开的。遂对比了下APIfox和我的代码下载下来的Excel文件,发现我的好像大了一点。\u003c/p\u003e\u003cp\u003e于是在搜索后,又给axios加上了\u003ccode\u003eresponseType: \u0026#39;blob\u0026#39;\u003c/code\u003e的参数,并且给生成Blob的地方也加上了\u003ccode\u003eapplication/vnd.ms-execl\u003c/code\u003e的参数。再次尝试时,下载已经能正常工作了。\u003c/p\u003e\u003cp\u003e于是我猜测,可能是下载时没有将后端返回的数据转换成Blob数据而直接存入Blob对象,引发了数据错位的问题,导致文件大了一点,并且不能正常打开。\u003c/p\u003e\u003cp\u003e修改后的代码:\u003c/p\u003e\u003cfigure class=\"highlight js\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"title function_\"\u003eserviceAxios\u003c/span\u003e({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003emethod\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;POST\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eurl\u003c/span\u003e: \u003cspan class=\"string\"\u003e`/template/export/\u003cspan class=\"subst\"\u003e${\u003cspan class=\"variable language_\"\u003ethis\u003c/span\u003e.form_data.id}\u003c/span\u003e`\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eheaders\u003c/span\u003e: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eAccept\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;application/vnd.ms-excel\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"string\"\u003e\u0026#39;Content-Type\u0026#39;\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;application/json\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eToken\u003c/span\u003e: \u003cspan class=\"variable language_\"\u003elocalStorage\u003c/span\u003e.\u003cspan class=\"title function_\"\u003egetItem\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;token\u0026#39;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e},\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003edata\u003c/span\u003e: \u003cspan class=\"variable language_\"\u003ethis\u003c/span\u003e.\u003cspan class=\"property\"\u003eform_data\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eresponseType\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;blob\u0026#39;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e})\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e.\u003cspan class=\"title function_\"\u003ethen\u003c/span\u003e(\u003cspan class=\"function\"\u003e(\u003cspan class=\"params\"\u003eres\u003c/span\u003e) =\u0026gt;\u003c/span\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"variable language_\"\u003ethis\u003c/span\u003e.\u003cspan class=\"property\"\u003eisShow\u003c/span\u003e = \u003cspan class=\"literal\"\u003efalse\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title function_\"\u003edownload\u003c/span\u003e(\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eres,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e\u0026#39;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"variable language_\"\u003ethis\u003c/span\u003e.\u003cspan class=\"property\"\u003eform_data\u003c/span\u003e.\u003cspan class=\"property\"\u003ename\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e )\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eElMessage\u003c/span\u003e.\u003cspan class=\"title function_\"\u003esuccess\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;下载成功\u0026#39;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e})\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e.\u003cspan class=\"title function_\"\u003ecatch\u003c/span\u003e(\u003cspan class=\"function\"\u003e(\u003cspan class=\"params\"\u003eerr\u003c/span\u003e) =\u0026gt;\u003c/span\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eElMessage\u003c/span\u003e.\u003cspan class=\"title function_\"\u003eerror\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;下载失败:\u0026#39;\u003c/span\u003e + err)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e})\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e这样就行了。里面的\u003ccode\u003edownload()\u003c/code\u003e是随便封装的一个下载Blob文件的工具函数,参数分别是blob数据,MIME类型和文件名。\u003c/p\u003e\u003cp\u003e关于这个\u003ccode\u003edownload\u003c/code\u003e函数的实现:\u003c/p\u003e\u003cfigure class=\"highlight javascript\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eexport\u003c/span\u003e \u003cspan class=\"keyword\"\u003edefault\u003c/span\u003e (\u003cspan class=\"attr\"\u003edata\u003c/span\u003e: any, \u003cspan class=\"attr\"\u003econtentType\u003c/span\u003e: string, \u003cspan class=\"attr\"\u003efileName\u003c/span\u003e: string) =\u0026gt; {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003econst\u003c/span\u003e downloadLink = \u003cspan class=\"variable language_\"\u003ewindow\u003c/span\u003e.\u003cspan class=\"property\"\u003edocument\u003c/span\u003e.\u003cspan class=\"title function_\"\u003ecreateElement\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e downloadLink.\u003cspan class=\"property\"\u003ehref\u003c/span\u003e = \u003cspan class=\"variable language_\"\u003ewindow\u003c/span\u003e.\u003cspan class=\"property\"\u003eURL\u003c/span\u003e.\u003cspan class=\"title function_\"\u003ecreateObjectURL\u003c/span\u003e(\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003enew\u003c/span\u003e \u003cspan class=\"title class_\"\u003eBlob\u003c/span\u003e([data], { \u003cspan class=\"attr\"\u003etype\u003c/span\u003e: contentType })\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e )\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e downloadLink.\u003cspan class=\"property\"\u003edownload\u003c/span\u003e = fileName\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"variable language_\"\u003edocument\u003c/span\u003e.\u003cspan class=\"property\"\u003ebody\u003c/span\u003e.\u003cspan class=\"title function_\"\u003eappendChild\u003c/span\u003e(downloadLink)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e downloadLink.\u003cspan class=\"title function_\"\u003eclick\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"variable language_\"\u003edocument\u003c/span\u003e.\u003cspan class=\"property\"\u003ebody\u003c/span\u003e.\u003cspan class=\"title function_\"\u003eremoveChild\u003c/span\u003e(downloadLink)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"反思\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%85%B3%E4%BA%8E%E5%89%8D%E7%AB%AFBlob%E4%B8%8B%E8%BD%BD%E9%82%A3%E7%82%B9%E4%BA%8B/#%E5%8F%8D%E6%80%9D\" class=\"headerlink\" title=\"反思\"\u003e\u003c/a\u003e反思\u003c/h2\u003e\u003cp\u003e这学期学计网的时候,重点学的部分是物理层,数据链路层,网络层以及传输层。唯一剩下的一层应用层则因为课时压缩直接压没了(但是期末大题还是考了SMTP协议)。但是恰恰是应用层这一部分在日常前端开发中使用最多。\u003c/p\u003e\u003cp\u003e这侧面反映出来了大学教育体系的一些问题,也提醒我们,书不能看一半,趁着大学有时间,尽量让自己的知识面更加全面一些,这是绝对值得的。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/07/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%85%B3%E4%BA%8E%E5%89%8D%E7%AB%AFBlob%E4%B8%8B%E8%BD%BD%E9%82%A3%E7%82%B9%E4%BA%8B/"},{"title":"sed,awk与grep","time":"2023-07-10T08:17:33Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"前言\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/sed%EF%BC%8Cawk%E4%B8%8Egrep/#%E5%89%8D%E8%A8%80\" class=\"headerlink\" title=\"前言\"\u003e\u003c/a\u003e前言\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e关于标题:实际上,sed,awk和grep有一个共同的爹叫\u003cstrong\u003eed\u003c/strong\u003e。sed和awk的区别是控制指令不太一样,而grep是起源于ed的一个指令:\u003ccode\u003eg/re/p\u003c/code\u003e,即\u003cstrong\u003e全局-正则表达式匹配-打印\u003c/strong\u003e,相当于把这个ed指令提取出来专门用于编辑。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e之前学了Vim,不过Vim不太容易和其他命令行工具结合实现一些自动化任务。随后我将目光投向了sed和awk,它们二者都满足这个条件:\u003cstrong\u003e可以将一个源的数据经过一些预定义的变换,输出到另一个源中\u003c/strong\u003e。这其中,我对\u003ccode\u003esed\u003c/code\u003e相对更加熟悉一些,awk我感觉可能更复杂一些,而sed只需要正则表达式就行。比如我之前接触到的第一个sed表达式:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esed -i \u003cspan class=\"string\"\u003e\u0026#39;s@^\\(deb.*stable main\\)$@#\\1\\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/apt/termux-main stable main@\u0026#39;\u003c/span\u003e \u003cspan class=\"variable\"\u003e$PREFIX\u003c/span\u003e/etc/apt/sources.list\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面那段是termux清华源的换源指令。单就命令格式上来看,我觉得和Vim的\u003ccode\u003e%s\u003c/code\u003e替换表达式比较接近。\u003c/p\u003e\u003cp\u003e没接触之前,一直觉得这玩意很神奇;接触后更感觉这东西的设计太棒了,只需要指令,就能完成大段内容的编辑。\u003c/p\u003e\u003cp\u003e后来接触了正则和Vim之后觉得似曾相识,才发现sed的用法很像Vim的替换指令+正则。而且这一套下来,效率提升真不小。以前做一些爬虫都编辑麻烦,现在直接写个脚本就完事了。比如,我最近为了尝试这三个流编辑器,写了一个爬新闻的脚本:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#!/bin/bash\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e -e \u003cspan class=\"string\"\u003e\u0026#34;# IT news Today\\n\\n\u003cspan class=\"subst\"\u003e$(wget -qO- https://www.ithome.com/block/rank.html | grep -oP \u0026#39;\u0026lt;li\u0026gt;\\s*\u0026lt;a\\K[^\u0026gt;]+\u0026#39; | awk -F \u0026#39;\u003cspan class=\"string\"\u003e\u0026#34;\u0026#39; \u0026#39;{print \u0026#34;\u003c/span\u003e[\u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$2\u003c/span\u003e\u0026#34;\u003c/span\u003e](\u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$6\u003c/span\u003e\u0026#34;\u003c/span\u003e)\u003c/span\u003e\u0026#34;\u003c/span\u003e}\u003cspan class=\"string\"\u003e\u0026#39; | sed \u0026#39;\u003c/span\u003es/^/- /g\u003cspan class=\"string\"\u003e\u0026#39;)\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e这是一个简单的单行脚本:借助管道,将wget抓取到的网页直接交由grep,让它使用Perl正则表达式将新闻标题和链接匹配出来,再交由awk将具体的字段分离出来并按照markdown的标准进行加工,最后交由sed使用行编辑模式在每一行前面加上一个\u003ccode\u003e- \u003c/code\u003e变换为markdown的列表。最后,将输出返回给\u003ccode\u003eecho -e\u003c/code\u003e,得到加上标题的、完整的输出。\u003c/p\u003e\u003cp\u003e其实,上面的例子只用grep+sed/awk就行,但是为了表现三个编辑器各自的特点,还是安排它们共同完成了这个变换工作。希望这个例子能给你带来一个粗浅的印象。\u003c/p\u003e\u003cp\u003e那么,现在就开始正篇吧。\u003c/p\u003e\u003ch2 id=\"sed\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/sed%EF%BC%8Cawk%E4%B8%8Egrep/#sed\" class=\"headerlink\" title=\"sed\"\u003e\u003c/a\u003esed\u003c/h2\u003e\u003cp\u003e首先说说sed它爹ed,这玩意是个很经典的行编辑器。不光可以交互编辑(类似于Vim,不过只能通过交互式指令输出操作结果,比如p输出当前行内容之类的),而且还能把操作指令存储下来\u003c/p\u003e\u003ch3 id=\"基本介绍\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/sed%EF%BC%8Cawk%E4%B8%8Egrep/#%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%BB%8D\" class=\"headerlink\" title=\"基本介绍\"\u003e\u003c/a\u003e基本介绍\u003c/h3\u003e\u003cp\u003esed是一个流编辑器,它可以对文本文件或标准输入进行处理和编辑。sed的基本用法是:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esed [options] \u003cspan class=\"string\"\u003e\u0026#39;script\u0026#39;\u003c/span\u003e file\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e其中,options是一些可选的参数,script是一些sed命令,file是要处理的文本文件。下面是一些常用的options:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e-n\u003c/code\u003e:只打印匹配到的行,不打印所有行。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e-e\u003c/code\u003e:可以指定多个script,按顺序执行。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e-f\u003c/code\u003e:可以从一个文件中读取script。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e-i\u003c/code\u003e:可以直接修改原文件,而不是输出到标准输出。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e-r\u003c/code\u003e:可以使用扩展正则表达式。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003esed的script由一些地址和命令组成,地址可以指定要处理的行,命令可以指定要执行的操作。下面是一些常用的地址和命令:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e地址可以是一个数字,表示行号,如\u003ccode\u003e3\u003c/code\u003e表示第三行。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e地址可以是一个范围,表示行号之间的区间,如\u003ccode\u003e3,5\u003c/code\u003e表示第三行到第五行。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e地址可以是一个正则表达式,表示匹配该模式的行,如\u003ccode\u003e/^abc/\u003c/code\u003e表示以abc开头的行。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e地址可以是\u003ccode\u003e$\u003c/code\u003e,表示最后一行。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e如果不指定地址,默认对所有行进行处理。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e命令可以是\u003ccode\u003ea\u003c/code\u003e,表示在当前行后面添加一些内容,如\u003ccode\u003ea\\newline\u003c/code\u003e表示在当前行后面添加一行newline。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e命令可以是\u003ccode\u003ec\u003c/code\u003e,表示用新的内容替换当前行,如\u003ccode\u003ec\\newtext\u003c/code\u003e表示用newtext替换当前行。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e命令可以是\u003ccode\u003ed\u003c/code\u003e,表示删除当前行,如\u003ccode\u003ed\u003c/code\u003e表示删除当前行。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e命令可以是\u003ccode\u003ep\u003c/code\u003e,表示打印当前行,如\u003ccode\u003ep\u003c/code\u003e表示打印当前行。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e命令可以是\u003ccode\u003es\u003c/code\u003e,表示用新的内容替换匹配到的内容,如\u003ccode\u003es/old/new/g\u003c/code\u003e表示将old替换为new,g表示全局替换。\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"示例:\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/sed%EF%BC%8Cawk%E4%B8%8Egrep/#%E7%A4%BA%E4%BE%8B%EF%BC%9A\" class=\"headerlink\" title=\"示例:\"\u003e\u003c/a\u003e示例:\u003c/h3\u003e\u003cul\u003e\u003cli\u003e打印1-3行:\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esed -n \u003cspan class=\"string\"\u003e\u0026#39;1,3p\u0026#39;\u003c/span\u003e file.txt\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e删除1-3行:\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esed \u003cspan class=\"string\"\u003e\u0026#39;1,3d\u0026#39;\u003c/span\u003e file.txt\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e在所有行前加#:\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esed \u003cspan class=\"string\"\u003e\u0026#39;s/^/#/g\u0026#39;\u003c/span\u003e file.txt\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e将所有字母大写:\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esed \u003cspan class=\"string\"\u003e\u0026#39;s/.*/\\U\u0026amp;/g\u0026#39;\u003c/span\u003e file.txt\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"参考资料\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/sed%EF%BC%8Cawk%E4%B8%8Egrep/#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99\" class=\"headerlink\" title=\"参考资料\"\u003e\u003c/a\u003e参考资料\u003c/h3\u003e\u003cp\u003e¹: \u003ca href=\"https://www.runoob.com/linux/linux-comm-sed.html\"\u003eLinux sed 命令 | 菜鸟教程\u003c/a\u003e\u003cbr/\u003e²: \u003ca href=\"https://zhuanlan.zhihu.com/p/181734158\"\u003esed 命令快速入门 - 知乎\u003c/a\u003e\u003cbr/\u003e³: \u003ca href=\"https://zhuanlan.zhihu.com/p/145661854\"\u003esed完全教程 - 知乎\u003c/a\u003e\u003c/p\u003e\u003ch2 id=\"awk\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/sed%EF%BC%8Cawk%E4%B8%8Egrep/#awk\" class=\"headerlink\" title=\"awk\"\u003e\u003c/a\u003eawk\u003c/h2\u003e\u003ch2 id=\"grep\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/sed%EF%BC%8Cawk%E4%B8%8Egrep/#grep\" class=\"headerlink\" title=\"grep\"\u003e\u003c/a\u003egrep\u003c/h2\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/07/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/sed%EF%BC%8Cawk%E4%B8%8Egrep/"}]},{"name":"lby's blog site","email":"","uri":"http://lby.github.io/","description":"","article":[{"title":"记——毕业旅行","time":"2024-02-08T16:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e当故事的最后以“毕业旅行”平静谢幕,以至于玩家心中所设想的永别式结局和生离死别的场景都未曾出现,其实是相当出人意料的决定。六年来,这个故事始终在生死一线间完成角色的蜕变,旅途的波澜壮阔从未停息,然抵至终章的最后一个句号竟真如同句号般完整和圆满。我们亲眼见证着琪亚娜从懵懂幼稚成长为坚定合格的战士,逐渐忘记了她的年少和那份年龄理应有的天真;而如今尘埃落定,战士也即将卸下盔甲与使命,渺小的愿望最终并未湮灭在末世的沙尘里,而是等来了能够容纳它的时代的来临。故事走向平淡的收场,角色终于有资格拥抱和平光景下的生活,她们从过往命运的桎梏中毕业,向着未来发起旅行,从画面走进现实里。\u003c/p\u003e\u003c/blockquote\u003e\u003cblockquote\u003e\u003cp\u003e这样的结局不该令人诧异。如同御三家六年来的一步步成长,编剧对于故事主题轮廓的勾勒也愈发清晰。从一开始战胜命运、坚守人性的空洞呐喊,到爱莉希雅\u0026lt;真我\u0026gt;之铭的显现与告白,故事最终的精神内核已经得到了概括性的凝练。在此先不论\u0026lt;真我\u0026gt;在道德和哲学层面上的意义,爱莉希雅活过一生的方式、追寻乐园的旅程,已经足以让她成为后继者最好的“偶像”,于是,纵观乐土之后的剧情,我们似乎总能在御三家身上找到爱莉希雅的影子。这种强烈的既视感无疑是刻意为之,编剧以这种高超的人物塑造技巧将不同的角色形象加以链接,从而将\u0026lt;真我\u0026gt;背后的人性之光反反复复凸显。于是乎,观众得以看见一种精神传承的过程的全貌——相似的话语和理念被不同的角色所表达,但绝非鹦鹉学舌式的拙劣模仿,也不是他者意志的强加,而是在不同情景和抉择下发自真心的宣言。观众绝不会将角色混同,相反,我们始终保有一种清醒——旧世代的人与物皆已消散,而新世代的角色正在真真切切地活于自己的生命轨迹里。正因如此,当代表过去的往事乐土凝翠出崩坏三的故事内核,代表未来的御三家所需做的,必然是坚定自我所选择的道路,以人的姿态抵达终点,把这个不完美的世界,变成她们期望的形态。旧日企盼新生,我们又何尝不企盼这个故事迎来美好的结局。而历经的诸多苦难、离别和悲伤,也不必被视为末日的征兆,而可以是文明成长的阵痛。所以在这一层面上,崩坏三的终章不必再有悲剧性的眼泪和苦楚,与其在故事内穷尽情节设计将情感推向高潮,不如以这令人“难以置信”的美好结局和平淡日常收场,将观众无处安放的情感留给“弦外之音”。\u003c/p\u003e\u003c/blockquote\u003e\u003cblockquote\u003e\u003cp\u003e在此,无论是终焉的形象,还是“毕业旅行”这一概念的使用,都彻底打破了故事结局一锤定音式的永恒,转而赋予它流动性和延续性。琪亚娜的结局不同于奥托和符华,因为崩坏三的故事正是在回忆和当下两种叙事中不断跳跃行进。对于后两者,是“过去的人,就让他过去吧”,或是历历浮生,不断与过去告别,完成一次次“毕业旅行”。琪亚娜的故事也不同于爱莉希雅,爱莉希雅是人性光辉的具象化,但并非那个时代的救世者。爱莉的诞生很像耶稣降临于世,二者又皆为至善的代表,编剧有意借鉴部分宗教要素,为爱莉的身上引入神性的色彩。这种引入从一开始便暗示着爱莉会如殉道者般死去,却并不代表爱莉是某种理念的信徒,通过死亡实现某种超越,最终与观众拉开距离。反观故事尾声,无暇之人选择了牺牲,这是身处悲剧必然导向的结局,也唯有死亡才能成就她的永恒。爱莉希雅的故事,十三英桀的故事,必须到此为止,也只能到此为止。在这里,宗教的观念、悲剧性文学的主题,二者合力让故事走到了结尾。但它们能操纵角色的命运,却无法操纵角色的精神与对既定命运的反抗。爱莉希雅并非耶稣式的布道者,也不是死后升入天堂受世人敬仰的神明,相反,她是一个反宗教式的人物。人性的诸多美好特质与粉色妖精小姐形象并未出现割裂,无论是芽衣还是玩家都未曾在她的身上感受到距离感,无论是芽衣还是玩家都喜爱她的全部。她真实地活在每一个人心中,并没有因死亡的结局而离我们远去。呼唤她的方式也并非祷告,而是将过往铭记珍藏,并践行她身上那些独属于人性的美德。这一次的崩坏三并非去创造神明,而是给予了一位人类“偶像”以生命。也正因如此,当爱莉希雅,当十三英桀走向注定的死亡,我们回顾过往,看着她们馈赠的传承,她们曾骄傲活过的痕迹,方才领悟到“悲剧并非终结,而是希望的起始”。偶像的气质和于绝望中抗争的勇气,原来从未泯灭。\u003c/p\u003e\u003c/blockquote\u003e\u003cblockquote\u003e\u003cp\u003e琪亚娜代表的是现世代文明战胜崩坏的可能,更代表崩坏三六年间的起始,承载着观众对故事、对自身六年来经历的回忆与感情。琪亚娜的故事从一开始并不存在,是她一步步向前迈进,开辟属于自己的未来,并不断回应观众的期待。我们见证着角色的成长,见证着由爱出发的故事兜兜转转最终回到爱,见证着故事的主题染上不同角色的颜色而愈发清晰、浓墨重彩;我们更见证着自己六年来的成长和改变,在与角色共情中试图相信着什么,寻找着最初的自我。而此刻,过往化作回忆,序章写至终章,我们随琪亚娜一起,告别一段经历,告别过去的自己。这也是崩坏三最后的结尾选用“毕业旅行”的原因。当一个故事走向终末,编剧没有选择将它推向幻想的高峰,而是将故事拉回现实,甚至与现实接轨。角色没有付出惨重的代价去拯救世界,观众也无需用悲情的结局铭记角色,我们看着琪亚娜向过往挥手告别,竟突然间看到了自己。“毕业旅行”的高明之处,在于它跨越了死亡这一空虚意象(不仅是角色死亡的空虚,更是故事结束带来的失落与空虚),让故事形成了一种轮回,让观众走进走出故事,最终仍能回归自我;它与现实形成了一种互动,打破了“第四面墙”,让观众主动告别过往,而非等待幕布落下后被动离场,正如纪录片的结尾所言:“在这个故事的最后,我们希望玩家喜欢的不仅仅是这个故事,而是陪伴这个故事一直走到现在的自己”。于是,她们的故事已经结束了,她们的故事就在那里,如果想念,就像书一样再次遍历一章章;她们的故事又不止在那里静静的放,那些话语、那些声音那些图像,与我们的情感交织在一起,故事的根基延伸到现实,在我们身上流淌。\u003c/p\u003e\u003c/blockquote\u003e\u003cblockquote\u003e\u003cp\u003e结语:\u003cbr/\u003e这篇文章其实去年就已经写完了,只是一种咕咕咕到现在才出了电子稿,但其实电子稿和原版相差很大,这几天修改的过程可谓是艰难无比,各种逻辑混乱、语无伦次、不知所云,很想知道我当时是怎样的写作状态(笑)。所以这篇杂谈真的不能细看,漏洞百出,但是多少还寄托着我个人对崩坏三的一些感情,所以便放上来自娱自乐一下。只能说下笔的时候才知道写作尤其是这种议论文?的写作难度,大量的逻辑论证都要反复考量,你事前觉得这个观点绝妙,但随后看来很多地方都经不起推敲,也许我只是想情感输出?(笑),或者叫浪漫主义者有此类写作障碍?(其实就是菜)。加之崩坏三本就文本量巨大,一般回想着文本,一边寻找灵感,很容易抓着一个点一路自嗨狂飙,缺乏统领文本的能力,更别说能深发本质,整饬地排列观点、梳理逻辑,总之莫名感觉像是在编程,可能我两边都学不会吧。最终就是说不清自己想说的话。以后尽量多写,随笔就像是空中的落叶,抓住了一些,埋在赛博空间里,不知道能护出怎样的花。\u003c/p\u003e\u003c/blockquote\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://lby.github.io/2024/02/09/%E8%AE%B0%E2%80%94%E2%80%94%E6%AF%95%E4%B8%9A%E6%97%85%E8%A1%8C/"},{"title":"天气之子——那场熙攘的雨","time":"2023-03-31T07:35:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e序章\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e说起来这竟是如此戏谑又巧合。初逢《天气之子》,我意外迎到了久别难以谋面的知己,虽不至推杯换盏之态,然语心诉情,盛着清风淡月彼肩散漫,是我们对彼此最奢华的礼待。于是乎,莫明而缠绵的秋雨,便让这座城清冷了一周。而再临影院重看《天气之子》这一程,着一袭黑色风衣的我竟显得与这街景格格不入——久违的日光与日影,渲染着本就斑斓的枯叶、草木,让色彩蕴出的世间,令人难以确信虚实。只惜,身形侧尽秋风过,既日别去,我们都已成顾影的离人。\u003c/p\u003e\u003cp\u003e在大雨磅礴中相遇,在丽日和风中相离,这种自以为里的浪漫与伤感,恰与帆高和阳菜的命运相映。本就执着于新海诚的风格,如此一遭,分明又添了几分好感。还是要感谢《天气之子》,正如新海域在B站的采访中谈到,作为被动画救赎的自己,如今也希望用自己的创作触动、救赎当下的年青人,于我,能从纷扰的尘世被拉出,重新去相信,执着那些因适应生存而“退化”的思与情,这定是一种救赎且宛若新生。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eあめ,あめ\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e似乎除了阳菜身边罕见般足以称为奇迹的晴天,东京的雨,浸透了《天气之子》整部影片,雨落地疯狂,以致于常人脑中锋面气旋的基本原理,已很难与这场超乎寻常的雨相奏泊。而帆高最初流落街头,收养的那只名为小雨的猫,在不断地向一只橘猫的体形转变。从某种意义上而言,这又何尝不是对东京雨势变化的暗示?\u003c/p\u003e\u003cp\u003e新海城营造的雨,在《言叶之庭》中已经淅淅沥沥的下了几场。不过《言叶之庭》的雨,更多是作为背景环境和表现手法,为这场彼此缄默难料结果的爱情交织出朦胧而又忧伤的氛围,《天气之子》的雨,则已成为主要的剧情线索,承担着诸多情感的映射,深层次的象征。在此过程中,雨被赋予了一种灵性,在意象与意境二者中游走自如。\u003c/p\u003e\u003cp\u003e何以言之?《天气之子》中的雨,已从朦胧化走向真实化。东京这场不停歇的雨,让晴女的有在有了合理性和价值,人们面对天气,尤显这场惊骇又显无力的雨,内心情感的曲折变化;对于停雨而牺牲晴女的争讨,并由此上升至个体对世界的挣扎反抗……雨在此被新海诚作为更为全面的载体,也是诸多表达上的媒介,而非仅仅具有渲染效果。这样的雨就必须要求多样性。在《天气之子》中,镜头的把控起到了至关的作用,雨被不同镜头分出了层次。磅礴地雨落如柱,一方水洼泛起雨露的轻鸢剪影,东京街头细密如织已融成灰白的强降水,还有阳菜伞顶的惊鸿一暼……雨的多层次化使其可以被模仿现实地细致描摹,值得画师用手绘去一点点刻画,精妙到雨的溅落方向都以水滴为分异,也会被采用印象派的手法,仅用简单的线条,概括般的色块以及光影变幻来表达雨势。\u003c/p\u003e\u003cp\u003e如此多元化的雨,却正是对现实雨的高度拟合,也由此更具有现实意义。雨的变化多端并非率性,而是对人物内心的同步反映。就像阳菜,帆高和凪前辈被迫逃亡途中,雨势随之愈演愈烈,正是对三者内心的孤苦、迷茫和愤怒的读取和直观表现,为加强效果,甚至设定阳菜能招来来闪电。 新海诚在此最精妙的手法,便是利用雨声的表现性。雨声的骤然暂停烘托出放情的天气效果;雨声的变化结合雨势变化共同反映情感变化;雨声持续地击打传递出压抑;以及将雨声做为伴奏之一更好表现插曲。雨被全面的激活,构架出《天气之子》,成为其核心、也最具灵魂的艺术效果。由此看来,用雨进行表述,反过来也赋予了雨灵性,雨共享了其自身应表现的情感,却因此不再呆板。寓情于景,景往往活过来抒情。不仅于此,《天气之子》中的雨,既充当了固定的意象,也成为了特殊的意境,雨的身份在二者中游自如。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://lby.github.io/2023/03/31/%E5%A4%A9%E6%B0%94%E4%B9%8B%E5%AD%90%E2%80%94%E2%80%94%E9%82%A3%E5%9C%BA%E7%86%99%E6%94%98%E7%9A%84%E9%9B%A8/"},{"title":"毕业旅行镜头语言浅析","time":"2023-03-31T07:22:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e我惊讶于这一次的动画短片没有以一场华丽的终焉之战收结,而是用“毕业旅行”这样的概念收束全片。也正因如此,整部短片充满回忆与现实的交错,在时间的倒带中用具象化的场景呈现出琪亚娜的内心世界(月台、列车)。近八分钟的时长里有诸多回忆片段的闪回,但配合着高超的叙述手法和多段式的节奏风格,竟没有丝毫的强行感动而因此落入俗套。\u003c/p\u003e\u003c/blockquote\u003e\u003cblockquote\u003e\u003cp\u003e毕业是与过往的人与事告别,而动画短片精巧地为告别编排了层次——苦难与敌人(奥托、千律、侵蚀)、携手同行的挚友(芽衣,布洛尼娅)、与其一同度过的回忆片段(闪回部分)、回忆出发的原点(姬子与圣芙蕾雅),最终落脚到过去的那个小小的却步伐坚定的自己。毕业典礼临近尾声,琪亚娜看着过去的自己走向偌大的地球,她知晓她的命运,知晓她最终要去承担将整个地球扛在肩上的责任,但时间交错的自己还是再一次做出了相同的选择,用前行作为无声的承诺。过往回溯到了最初的起点,与过去毕业的旅行也到了终点站,情感基调充斥着不舍与伤感,但画面一转,琪亚娜走向月球的身影,与过去的自己形成对照,又无比相似。或许,寻回初心并不意味着结束;或许,成为英雄并非意味着终点;或许,另一层面上的毕业旅行才将要启程。\u003c/p\u003e\u003c/blockquote\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://lby.github.io/2023/03/31/%E6%AF%95%E4%B8%9A%E6%97%85%E8%A1%8C%E9%95%9C%E5%A4%B4%E8%AF%AD%E8%A8%80%E6%B5%85%E6%9E%90/"},{"title":"幻想家与夏","time":"2022-01-12T09:03:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e“接下来要讲述的,是幻想家的故事” \u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e幻想家在桌前,望着这句老套的开场白出神。 \u003c/p\u003e\u003cp\u003e已经许久未曾运笔,至于原因,幻想家心中有一个模糊的答案。但他却不愿承认——被生活的烦忙与琐碎打倒,撕扯,扔进漩涡中心,行动交由早已既定、当下先行的最高指令,意识则一点点被消磨殆尽——这是他矢口否认的,不愿看到的,却又被迫选择的,将一切激情与宝贵岁月心甘情愿交付的,孕育着他的宝石般的未来的——他甚至认为自己理当是个好蚌,可被撬开后,那颗珠的尺寸与光泽却又令他大失所望,夏的火种也随之熄灭了,他空空举着未燃的火把,带不给他一点光与热,呆伫于路上,任由他人的火光将内心刺痛——他的夏,似已结束。 \u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e“我的夏,竟已结束了……” \u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e幻想家喃喃道,那种熟悉的空无感又趁虚而入,将他的内心一点点蚕食,曾经高举过头顶的双臂已垂弱无力,对生命与生活的热情正在被从他身体抽离。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://lby.github.io/2022/01/12/%E5%B9%BB%E6%83%B3%E5%AE%B6%E4%B8%8E%E5%A4%8F/"}]},{"name":"Ri的手账本","email":"","uri":"https://ray.al","description":"","article":[{"title":"如果有你在","time":"2023-12-18T19:13:26Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e你低垂着背脊,雨点敲打着你让我心痛,我怀着祈祷的心情一直关注着你,如果这个世界上,只有一把伞,我定要找到送给你 […]\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/247"},{"title":"Spirits","time":"2023-11-07T16:38:23Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e世界将从微不足道的我启程,这平凡的每一天,总有人在默默守护,我也想要为了谁做些什么,直到此刻和你相遇,我想和你 […]\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/242"},{"title":"狼与驯化的野性","time":"2023-11-07T16:07:46Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e时间在八月到九月间,还远不到下雪的时节,而眼前的风景却令人诧异。一条小径从雪地里穿过,伴着哒哒的马蹄声,一架马 […]\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/239"},{"title":"真正的痛苦","time":"2023-07-16T17:50:50Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e仰头望天,这又是何等的痛苦\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/230"},{"title":"今天的天气,知道的?","time":"2023-07-15T18:16:15Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e连遗忘本身都忘记,那才是真正的束手无策。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/227"},{"title":"好玩的Kalman滤波器(仅样例)","time":"2023-07-14T17:05:02Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e然而Kalman滤波器不是滤波器(\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/221"},{"title":"好玩的传感器和Arduino开发板","time":"2023-07-13T13:38:09Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e算是自己做的一些微小的工作\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/215"},{"title":"剃须与味噌汤","time":"2021-12-02T18:39:16Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e莎优的脑海里又浮现起了那时吉田找到自己时涨得通红的脸,那种担心而大汗淋漓的表情……不知道为什么,她觉得有些心酸,却又有些高兴。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/99"},{"title":"再次相遇","time":"2021-12-02T18:31:35Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e吉田感受到了一种力场,就好像是一根细线,把他和少女的命运系在一起。有只有今天才能遇见的人,也只有今天才能遇见的事。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/122"},{"title":"Buffalo Nas的简单评测","time":"2021-11-02T12:15:59Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e在上课,所以先不放图 这次评测的主人公是Buffalo ls-wxl (LinkStation) 闲鱼上某个老 […]\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/85"}]},{"name":"Reverier's Blog","email":"","uri":"https://blog.woooo.tech/","description":"Creating reality with idealism.","article":[{"title":"音乐与时间与蓝色星球#04 梦境","time":"2024-04-07T01:24:17+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\n\u003cp\u003e持续更新…\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"20240402-世界向我坠落\"\u003e2024.04.02. 世界向我坠落\u003c/h2\u003e\n\u003cp\u003e回过神来,我站在一部电梯面前。旁边的楼层牌子指示着我正在一层,高算中心。楼层牌子以一种倒过来的方式排布着,一楼在最上面,高层在下面。\u003c/p\u003e\n\u003cp\u003e我习惯性的按下了上行的按钮,然后看着电梯从十楼开始缓缓下降————要不今天走楼梯吧,就一层楼坐个什么劲啊。\u003c/p\u003e\n\u003cp\u003e但是身体还是很诚实的等在了原地。牙白,今天没带耳机。\u003c/p\u003e\n\u003cp\u003e门开了,里面空无一人。我走进去,按了一下二楼,然后向后退去,以一种颓废的姿势依靠在电梯墙上。一股失重的感觉袭来,电梯动了,好像有哪里怪怪的,但是我想不起来。\u003c/p\u003e\n\u003cp\u003e电梯门打开,一股白炽的灯光照的人睁不开眼睛。我走出电梯。\u003c/p\u003e\n\u003cp\u003e走廊里异常的安静,甚至连灯都没有开,只有电梯对面墙上的 LED 大字亮着,“陕西省网络空间与信息安全应用技术实验室”,比以往任何时候都要刺眼。\u003c/p\u003e\n\u003cp\u003e这是哪里?\u003c/p\u003e\n\u003cp\u003e一股眩晕感袭来。我走到实验室门口,掏出学生卡刷了一下。\u003c/p\u003e\n\u003cp\u003e“验证失败”,门说。\u003c/p\u003e\n\u003cp\u003e我给卡翻了个面,又刷了一次。\u003c/p\u003e\n\u003cp\u003e“验证失败”,门又说,这次换了一个低沉的语调。\u003c/p\u003e\n\u003cp\u003e怎么回事?我给卡放在手掌中心摩擦了一下,然后仔细看了看卡片确认我没有拿错成身份证,又刷了一次。\u003c/p\u003e\n\u003cp\u003e“验证失败,多次验证失败警告”,门这次换了一个细长尖锐的音调,仿佛在嘲讽我一般,吓了我一跳。\u003c/p\u003e\n\u003cp\u003e嘈杂的声音在门后响起,原来有人啊。我敲了敲门,门里安静下来,我听见有人轻轻地说了一句,“我去开门”,然后门开了。\u003c/p\u003e\n\u003cp\u003e实验室里还是那些熟悉的面孔,但是我却一时忘了都是谁。我走进去,看着他们,他们也看着我。\u003c/p\u003e\n\u003cp\u003e经过一段很短又很长沉默,他们把脸转开,开始埋头做自己的事情,实验室里异常的安静,让我一时以为在门口听见的嘈杂都是错觉。\u003c/p\u003e\n\u003cp\u003e我坐到自己的座位上,旁边的人轻轻说了一句:“生日快乐,神。”\u003c/p\u003e\n\u003cp\u003e我诧异,“可今天不是我的生日。”\u003c/p\u003e\n\u003cp\u003e“今天可以是。”他笑了笑,然后不再言语。\u003c/p\u003e\n\u003cp\u003e我看向我的电脑屏幕,还是熟悉的森林与篝火。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_004/fires@1k.jpg\" srcset=\"fires@1k.jpg?size=small, fires@1k.jpg?size=medium 1.5x, fires@1k.jpg?size=large 2x\" sizes=\"auto\" data-title=\"fires@1k.jpg\" data-alt=\"fires@1k.jpg\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e我输入密码解锁,连着三次都是错误。那股尖锐的声音再次响起:“验证失败,多次验证失败警告”,我正奇怪,却察觉到几股视线。\u003c/p\u003e\n\u003cp\u003e我突然浑身冷汗,我看向旁边的人,他们都在看着我,眼神里闪动着诡异的光。\u003c/p\u003e\n\u003cp\u003e“生日快乐,神。”\u003c/p\u003e\n\u003cp\u003e我感觉大脑似乎被撞了一般,晕眩的感觉让我向后倒去。想象中的硬着陆并没有到来,我睁开眼睛,看见天空离我越来越近,世界在向我坠落。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/night_talk_004/"},{"title":"色彩系统与视觉设计","time":"2024-02-29T08:12:00+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"起源\"\u003e起源\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e光\u003c/strong\u003e,\u003cdel\u003e一种用来拯救世界的信仰\u003c/del\u003e 通常指的是人类眼睛可见的电磁波,\u003cstrong\u003e视知觉\u003c/strong\u003e 就是对于可见光的知觉。\u003c/p\u003e\n\u003cp\u003e可见光只是电磁波谱上介于 400nm - 700nm 之间的部分(也有一些资料定义不同,较窄的定义在 420nm - 680nm 之间,较宽的定义在 380nm - 800nm 之间),在教材上通常以这样一张\u003ca href=\"https://zh.wikipedia.org/wiki/File:EM_spectrum_zh-hans.svg\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e频谱图\u003c/a\u003e来表示:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/EM_spectrum_zh-hans.png\" srcset=\"EM_spectrum_zh-hans.png?size=small, EM_spectrum_zh-hans.png?size=medium 1.5x, EM_spectrum_zh-hans.png?size=large 2x\" sizes=\"auto\" data-title=\"可见光-电磁波谱\" data-alt=\"可见光-电磁波谱\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e每种不同的波长对应的颜色各不相同,因此我们可以根据这个原理制作显示设备,只要找到一种在可控条件下发射不同波长的光的方法就可以了。但是这个想法不现实,首先是设备大小问题。想要制造出任意波长的光需要比较复杂的设备和条件,而这样制造出来的光线还只能显示单个像素。想象一下用这样的技术制造出一个标准1080p显示器,设备本身的大小会十分感人。\u003c/p\u003e\n\u003cp\u003e在进一步探索后,20世纪30年代,国际照明委员会(英文:International Commission on Illumination,法文:Commission internationale de l’éclairage,采用法文缩写:CIE)设计了一套色彩系统,用于描述人眼所能感受到的色彩,并对其进行量化。\u003c/p\u003e\n\u003ch2 id=\"cie-1931-色彩空间\"\u003eCIE 1931 色彩空间\u003c/h2\u003e\n\u003cp\u003e经过医学研究,人眼感知色彩主要依靠三种色锥细胞,分别对应红、绿、蓝三种颜色,后来将其称为光的三原色。所以,使用三种原色的光线就可以混合出五彩斑斓的颜色。在此基础上,CIE设计了一个实验,使用四个光源来量化颜色,并招募志愿者通过人眼感知对色彩进行匹配,称之为颜色匹配实验。从这个试验中,CIE最终构建出了一套色彩模型,称为CIE 1931 xyz色彩空间,也可以直接称为CIE 1931色彩空间。\u003c/p\u003e\n\u003ch3 id=\"色彩实验\"\u003e色彩实验\u003c/h3\u003e\n\u003cp\u003e实验过程大致如下:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e通过三个单色光源(红、绿、蓝)发射出三种光线,照射到一个白色的试验板上,汇聚成一个色彩光斑;\u003c/li\u003e\n\u003cli\u003e通过另一个单色光源调整出待测光线,照射在刚刚光斑的附近形成另一个光斑;\u003c/li\u003e\n\u003cli\u003e使用黑色的不透光材料作为两个光斑的分界线,并移动光源使两个光斑靠在一起;\u003c/li\u003e\n\u003cli\u003e实验者通过同时观察左右光斑,并根据观测结果不断调整三个单色光源的强度,使得两个光斑看起来显示出同一种颜色;\u003c/li\u003e\n\u003cli\u003e记录三个单色光源的强度,这样就得到了一个颜色的RGB值,被称为三刺激值。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e更加直观的视频描述可以\u003ca href=\"https://www.bilibili.com/video/BV1E2421c7NM/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e参考这里\u003c/a\u003e,以下实验图像也来自于此。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/color_lab1.png\" srcset=\"color_lab1.png?size=small, color_lab1.png?size=medium 1.5x, color_lab1.png?size=large 2x\" sizes=\"auto\" data-title=\"色彩实验\" data-alt=\"色彩实验\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e在这个实验中,实验者们发现了一个问题:一些待测光线的色彩是无法通过三原色混合出来的,例如下面的例子,想要混合出这种绿色,似乎需要继续降低红光,但是红色光源已经完全关闭了:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/color_lab2.png\" srcset=\"color_lab2.png?size=small, color_lab2.png?size=medium 1.5x, color_lab2.png?size=large 2x\" sizes=\"auto\" data-title=\"待测光线的色彩是无法通过三原色混合出来\" data-alt=\"待测光线的色彩是无法通过三原色混合出来\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e于是实验者通过将红色光源移到右边进行混色,并通过调整使得两边色彩一致:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/color_lab3.png\" srcset=\"color_lab3.png?size=small, color_lab3.png?size=medium 1.5x, color_lab3.png?size=large 2x\" sizes=\"auto\" data-title=\"通过将红色光源移到右边进行混色\" data-alt=\"通过将红色光源移到右边进行混色\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e最终就可以确定出这个颜色的三刺激值了,只不过红色是负的。\u003c/p\u003e\n\u003cp\u003e在获取了大量的实验数据后,CIE在亮度-波长坐标系中绘制出了这样3条曲线:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/color_lab_result1.png\" srcset=\"color_lab_result1.png?size=small, color_lab_result1.png?size=medium 1.5x, color_lab_result1.png?size=large 2x\" sizes=\"auto\" data-title=\"色彩混合结果\" data-alt=\"色彩混合结果\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e在这个曲线图中,λ轴代表波长,y轴代表亮度,而三条色彩曲线则代表了要混合出视觉上与此波长光线同等时,红、绿、蓝三种光线的强度。\u003c/p\u003e\n\u003ch3 id=\"cie-1931-rgb-色彩空间\"\u003eCIE 1931 RGB 色彩空间\u003c/h3\u003e\n\u003cp\u003e我们发现了一个问题,在这个坐标系中表示颜色很不直观。于是,CIE又在以RGB亮度为轴的三维坐标系中绘制出了这些点:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/color_space_rgb.png\" srcset=\"color_space_rgb.png?size=small, color_space_rgb.png?size=medium 1.5x, color_space_rgb.png?size=large 2x\" sizes=\"auto\" data-title=\"color_space_rgb.png\" data-alt=\"color_space_rgb.png\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e这样,我们就得到了一个色彩空间定义,称为 CIE 1931 RGB色彩空间。\u003c/p\u003e\n\u003ch3 id=\"格拉斯曼定律\"\u003e格拉斯曼定律\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://zh.wikipedia.org/wiki/%E6%A0%BC%E6%8B%89%E6%96%AF%E6%9B%BC%E5%AE%9A%E5%BE%8B_%28%E8%89%B2%E5%BD%A9%29\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e\u003cstrong\u003e格拉斯曼定律\u003c/strong\u003e\u003c/a\u003e是一个关于光学理论的经验法则,它说明了人类对色彩的感知(大约)是\u003cstrong\u003e线性\u003c/strong\u003e的。\u003c/p\u003e\n\u003cp\u003e简单来说,取两个单色可见光,那么这两个可见光在RGB色彩空间里可以用两个坐标 $Color_1 = (R_1, G_1, B_1)$,$Color_2 = (R_2, G_2, B_2)$ 来表示,那么这两个色彩混合一起得到的色彩就可以依照以下的简单加法公式计算出来:\u003c/p\u003e\n\u003cp\u003e$$\nColor_1 + Color_2 = (R_1 + R_2, G_1 + G_2, B_1 + B_2)\n$$\u003c/p\u003e\n\u003cp\u003e这个公式就是格拉斯曼定律的简单表达。但是请注意格拉斯曼定律是由实验总结得出的,由于现代医学技术的限制,我们无法直接严格证明色彩空间就是一个线性空间。\u003c/p\u003e\n\u003cp\u003e格拉斯曼定律的更一般形式可以表达为:\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\n\u0026amp;R = \\int_{0}^{\\infty}I(\\lambda)\\bar{r}(\\lambda)d\\lambda \\\\\n\u0026amp;G = \\int_{0}^{\\infty}I(\\lambda)\\bar{g}(\\lambda)d\\lambda \\\\\n\u0026amp;B = \\int_{0}^{\\infty}I(\\lambda)\\bar{b}(\\lambda)d\\lambda\n\\end{align}\n$$\u003c/p\u003e\n\u003cp\u003e其中,$ I(\\lambda ) $ 为该光束对波长的强度分布;${\\displaystyle {\\bar {r}}(\\lambda )}$,${\\displaystyle {\\bar {g}}(\\lambda )}$,${\\displaystyle {\\bar {b}}(\\lambda )}$ 则分别为人眼中三种锥状细胞对不同波长的反应强度。\u003c/p\u003e\n\u003ch3 id=\"cie-1931-xyz-色彩空间\"\u003eCIE 1931 XYZ 色彩空间\u003c/h3\u003e\n\u003cp\u003e在构建了人类视觉的 RGB 模型之后,CIE 特别委员会的成员希望开发出与 CIE RGB 色彩空间有关的另一个色彩空间,它假定格拉斯曼定律是成立的,这意味着新的色彩空间能够通过线性变换有关于 CIE RGB 色彩空间。\u003c/p\u003e\n\u003cp\u003e于是,CIE 1931 XYZ 色彩空间诞生了。在这个色彩空间中,X、Y、Z 三个坐标轴的定义是:\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\n\u0026amp;X = \\int_{0}^{\\infty}I(\\lambda)\\bar{x}(\\lambda)d\\lambda \\\\\n\u0026amp;Y = \\int_{0}^{\\infty}I(\\lambda)\\bar{y}(\\lambda)d\\lambda \\\\\n\u0026amp;Z = \\int_{0}^{\\infty}I(\\lambda)\\bar{z}(\\lambda)d\\lambda\n\\end{align}\n$$\u003c/p\u003e\n\u003cp\u003e在这个新的色彩空间中,大部分定义与 RGB 色彩空间是相同的,但 XYZ 坐标轴则是歪过来的,这套坐标轴相对于 RGB 坐标轴的大致图例如下:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/color_space_xyz.png\" srcset=\"color_space_xyz.png?size=small, color_space_xyz.png?size=medium 1.5x, color_space_xyz.png?size=large 2x\" sizes=\"auto\" data-title=\"color_space_xyz.png\" data-alt=\"color_space_xyz.png\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e在这个色彩空间中,所有的点都在第一卦限中,因此避免了负值。不过如果仅仅只是为了将所有的点都放在第一卦限中,那其实可以有很多种选择。而 XYZ 色彩空间如此选择的一个重要原因是 Y 轴精确满足了“CIE标准适应光观察者”(CIE 1926)的\u003ca href=\"https://zh.wikipedia.org/wiki/%E5%85%89%E5%BA%A6%E5%87%BD%E6%95%B0\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e适应光发光效率函数(光度函数)\u003c/a\u003e $V(\\lambda)$。\u003c/p\u003e\n\u003cp\u003e光度函数描述了人眼对于不同波长光的平均视觉灵敏度,可用于将辐射能量转化为可见光的计算。\u003c/p\u003e\n\u003cp\u003e从 XYZ 色彩空间中,我们可以通过以下的变换得到 RGB 色彩空间:\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\n\u0026amp;\\left[\\begin{array}{c}\nX\\\\ Y\\\\ Z\\\\\n\\end{array}\\right]=\\frac{1}{b_{21}}\n\\left[\\begin{array}{ccc}\nb_{11}\u0026amp;b_{12}\u0026amp;b_{13}\\\\\nb_{21}\u0026amp;b_{22}\u0026amp;b_{23}\\\\\nb_{31}\u0026amp;b_{32}\u0026amp;b_{33}\n\\end{array}\\right]\n\\left[\\begin{array}{c}R \\\\ G\\\\ B\\end{array}\\right]\n\\\\\n\u0026amp;\\left[\\begin{array}{c}\nX\\\\ Y\\\\ Z\\\\\n\\end{array}\\right]=\\frac{1}{0.17697}\n\\left[\\begin{array}{lll}\n0.49\u0026amp;0.31\u0026amp;0.20\\\\\n0.17697\u0026amp;0.81240\u0026amp;0.01063\\\\\n0.00\u0026amp;0.01\u0026amp;0.99\n\\end{array}\\right]\n\\left[\\begin{array}{c}R\\\\ G \\\\ B\\end{array}\\right]\n\\end{align}\n$$\u003c/p\u003e\n\u003ch3 id=\"插话绝对色彩空间\"\u003e插话:绝对色彩空间\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://zh.wikipedia.org/wiki/%E7%BB%9D%E5%AF%B9%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e\u003cstrong\u003e绝对色彩空间\u003c/strong\u003e\u003c/a\u003e就是不依赖任何外部因素就可以准确表示颜色的色彩空间。\u003c/p\u003e\n\u003cp\u003eRGB 色彩模型(这里指的不是 CIE 1931 RGB 色彩空间)就是一个非绝对色彩空间,因为它的三个坐标轴并没有量化意义,一种颜色是通过RGB三种颜色通过调整亮度混合出来的,而这些颜色并不是标准、精确的定义。在两个不同计算机显示器上,同一个RGB颜色可能看起来大不相同。为了表示 RGB 色彩在绝对色彩中的位置,其中一种方法是定义一个 International Color Consortium(ICC) 色彩配置文件,目前这种方法是业界标准,广泛采用的RGB配置文件有 \u003ca href=\"https://zh.wikipedia.org/wiki/SRGB%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003esRGB\u003c/a\u003e、\u003ca href=\"https://zh.wikipedia.org/wiki/Adobe_RGB_%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eAdobe RGB\u003c/a\u003e 等。\u003c/p\u003e\n\u003ch3 id=\"插话白点\"\u003e插话:白点\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://zh.wikipedia.org/wiki/%E7%99%BD%E7%82%B9\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e\u003cstrong\u003e白点(white point)\u003c/strong\u003e\u003c/a\u003e,在技术文档中常被称作参考白色(reference white)或目标白色(target white),用来在处理颜色时定义 \u003cstrong\u003e白色\u003c/strong\u003e。白点通常是在色彩空间中的一个点,它定义了色彩空间中的\u003cstrong\u003e中性白色\u003c/strong\u003e,并且也定义了色彩空间中的\u003cstrong\u003e亮度\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e白点不是一个绝对的概念,比如说在午后日光的照射下,色彩整体会偏向暖色;而在阴天或者室内冷色 LED 灯的环境下,色彩整体会偏向冷色。但是白点在视觉中的感知是不变的,因此在不同的光照环境下,白点的色彩定义也会有所不同。\u003c/p\u003e\n\u003cp\u003e在 \u003ca href=\"https://zh.wikipedia.org/wiki/SRGB%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003esRGB\u003c/a\u003e 色彩空间中,白点的定义模拟了平均北方天空的日光条件,是以地球上不同地点对日光进行光谱辐射的大量数据为基础,总结出的一组相对光谱功率分布数据,色温为 6500K,近似平均昼光。我们把这个白点称为 \u003cstrong\u003eD65 白点(Daylight Neutral)\u003c/strong\u003e。\u003c/p\u003e\n\u003ch2 id=\"hsl-和-hsv-色彩空间\"\u003eHSL 和 HSV 色彩空间\u003c/h2\u003e\n\u003cp\u003eHSL(Hue 色相;Saturation 饱和度;Lightness 亮度) 和 HSV(Hue 色相;Saturation 饱和度;Value 明度) 都是将 RGB 色彩模型中的点表示在圆柱坐标系中的方法。这两种表示法试图做到比基于笛卡尔坐标系几何结构的 RGB 模型更加直观。\u003c/p\u003e\n\u003cp\u003e其中,Lightness 和 Value 都是表示颜色的亮度,但是它们的含义有所不同,参考下图:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/hsl_hsv_models.webp\" srcset=\"hsl_hsv_models.webp?size=small, hsl_hsv_models.webp?size=medium 1.5x, hsl_hsv_models.webp?size=large 2x\" sizes=\"auto\" data-title=\"hsl_hsv_models.webp\" data-alt=\"hsl_hsv_models.webp\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003eHSV以人类更熟悉的方式封装了关于颜色的信息:“这是什么颜色?深浅如何?明暗如何?”,因此在早期被广泛应用于设计行业与计算机设计中。但是HSV仍旧是RGB色彩空间的线性变换,RGB模型的缺点HSV也并没有解决,对于亮度/明度相同的颜色来说,人眼感受到的视觉亮度不一定相同。\u003c/p\u003e\n\u003ch2 id=\"cie-lab-色彩空间\"\u003eCIE L*a*b* 色彩空间\u003c/h2\u003e\n\u003cp\u003e显然,RGB色彩空间很适合机器实现,只需要使用三个单色灯泡即可。但是对于需要量化色彩的设计行业而言,RGB色彩空间却显得不那么直观。在RGB色彩空间里,人眼对于红色的感知程度相对较低,而对绿色的感知程度则相对较高,这导致了使用RGB色彩空间进行色彩搭配的时候,很难保证所选择的色彩能够带给用户“匹配”的感觉,例如很亮的绿色 \u003ccode\u003e#00FF00\u003c/code\u003e 和很亮的红色 \u003ccode\u003e#FF0000\u003c/code\u003e 放在一起时,人类倾向于感知到绿色的亮度更高。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/red_green_comp.png\" srcset=\"red_green_comp.png?size=small, red_green_comp.png?size=medium 1.5x, red_green_comp.png?size=large 2x\" sizes=\"auto\" data-title=\"red_green_comp.png\" data-alt=\"red_green_comp.png\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e如上图,显然红色背景下的白色字体可读性更好,而绿色背景下可读性差多了。这是因为红色的视觉亮度更低,与白色的对比度更高。\u003c/p\u003e\n\u003cp\u003e如果想要得到一套对于人眼而言亮度更加均匀的颜色,那么使用RGB色彩空间是没有办法直观进行计算的,只能通过设计师的直觉慢慢进行调整,最终得到一个近似的结果。这么做导致调色的过程费事费力,而且最终的效果和设计师本身的经验和水平有很大关系。\u003c/p\u003e\n\u003cp\u003eCIE 1931 色彩空间的另一个问题是,它并没有给出估量颜色差别的直接方式。\u003c/p\u003e\n\u003cp\u003e测量两个颜色之间的差别的想法是 D.L. MacAdam 开发的并总结于 \u003ca href=\"https://en.wikipedia.org/wiki/MacAdam_ellipse\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eMacAdam 椭圆\u003c/a\u003e 的概念中,而在 XYZ 色彩空间中,两个颜色之间的欧氏距离并不能很好地表示人类视觉系统对于两个颜色之间的\u003cstrong\u003e差异\u003c/strong\u003e的感知。基于 MacAdam 的工作,在1960年开发了 CIE L*u*v* 色彩空间,并经过改良后得到了 CIE L*a*b* 色彩空间。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCIELAB 色彩空间(英语:CIELAB color space)\u003c/strong\u003e 又写为 L*a*b*,是 CIE 在 1976 年定义的色彩空间,是惯常用来描述人眼可见的所有颜色的最完备的色彩模型。\u003c/p\u003e\n\u003cp\u003e在这个模型中,L* 代表颜色的\u003cstrong\u003e亮度\u003c/strong\u003e(Lightness)( L* = 0 指示黑色而 L* = 100 指示白色),a* 和 b* 代表颜色的\u003cstrong\u003e色度偏移\u003c/strong\u003e(a* 指示颜色在红色/品红到绿色之间的位置,负值指示绿色,正值指示品红;b* 指示颜色在黄色和蓝色之间的位置,负值指示蓝色,正值指示黄色)。这个色彩模型用于充当做参照的设备无关的模型,用于描述颜色的感知。\u003c/p\u003e\n\u003cp\u003eL*a*b* 色彩空间也可以表达为 L*c*h*,其中 L* 的含义不变,而 c* 代表颜色的\u003cstrong\u003e色度\u003c/strong\u003e(Chroma),色度的含义与灰度类似,取值越高颜色越鲜艳;而 h* 代表颜色的\u003cstrong\u003e色相\u003c/strong\u003e(Hue),色相的含义与角度类似,更改色相就可以遍历色彩。下图展示了 L*a*b* 色彩空间在 L* 取不同值的色彩分布,只展示可充入 \u003ca href=\"https://zh.wikipedia.org/wiki/SRGB%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003esRGB\u003c/a\u003e 色域的颜色(因此可以显示在典型的计算机显示器上)。每个正方形的每个轴取值于 -128 到 127。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/Lab_color_space.png\" srcset=\"Lab_color_space.png?size=small, Lab_color_space.png?size=medium 1.5x, Lab_color_space.png?size=large 2x\" sizes=\"auto\" data-title=\"Lab_color_space.png\" data-alt=\"Lab_color_space.png\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003ch3 id=\"颜色距离\"\u003e颜色距离\u003c/h3\u003e\n\u003cp\u003e在 L*a*b* 色彩空间中,两个颜色之间的欧氏距离可以很好地表示人类视觉系统对于两个颜色之间的\u003cstrong\u003e差异\u003c/strong\u003e的感知。在 L*a*b* 中的均匀改变对应在感知颜色中的均匀改变。我们定义两个颜色的欧氏距离为$\\Delta E*_{ab}$,那么两个颜色$(L_1^*, a_1^*, b_1^*)$和$(L_2^*, a_2^*, b_2^*)$之间的距离就是:\u003c/p\u003e\n\u003cp\u003e$$\n\\Delta E*_{ab} = \\sqrt{(L_2^* - L_1^*)^2 + (a_2^* - a_1^*)^2 + (b_2^* - b_1^*)^2}\n$$\u003c/p\u003e\n\u003ch3 id=\"rgb--cmyk-与-lab-的转换\"\u003eRGB / CMYK 与 L*a*b* 的转换\u003c/h3\u003e\n\u003cp\u003e从 L*a*b* 色彩空间到 RGB / CMYK 等设备相关色彩的转换是一个复杂的过程,我们需要借助 XYZ 色彩空间作为中间桥梁。\u003c/p\u003e\n\u003ch3 id=\"xyz-与-lab-的转换\"\u003eXYZ 与 L*a*b* 的转换\u003c/h3\u003e\n\u003cp\u003e正向变换:\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\n\u0026amp;L* = 116 f(\\frac{Y}{Y_n}) - 16\\\\\n\u0026amp;a* = 500(f(\\frac{X}{X_n}) - f(\\frac{Y}{Y_n}))\\\\\n\u0026amp;b* = 200(f(\\frac{Y}{Y_n}) - f(\\frac{Z}{Z_n}))\\\\\n\\end{align}\n$$\u003c/p\u003e\n\u003cp\u003e其中 $(X_n, Y_n, Z_n)$ 是参照白点的三刺激值(下标 n 的含义是 \u003cem\u003eNormalized\u003c/em\u003e);其中 $f$ 函数的定义为:\u003c/p\u003e\n\u003cp\u003e$$\nf(t) = \\begin{cases}\nt^{\\frac{1}{3}} \u0026amp; t \u0026gt; (\\frac{6}{29})^3 \\\\\n\\frac{1}{3}(\\frac{29}{6})^2t + \\frac{16}{116} \u0026amp; t \\leq (\\frac{6}{29})^3\n\\end{cases}\n$$\u003c/p\u003e\n\u003cp\u003e这里 $f$ 函数被分开定义是为了防止在 $t = 0$ 时的无限斜率,在某个 $t = t_0$ 之下,$f(t)$ 被假定是线性的,并且被假定为匹配函数的 $t^{1/3}$部分在 $t_0$ 处的值和斜率。\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\nt_0^{1/3} \u0026amp;= at_0 + b\\\\\na \u0026amp;= \\frac{1}{3t_0^{2/3}}\n\\end{align}\n$$\u003c/p\u003e\n\u003cp\u003e我们指定一个 $\\delta = \\frac{6}{29}$,并令 $b = \\frac{2}{3}\\delta = \\frac{16}{116}$,上述两个方程对 $a$ 和 $t_0$ 有解:\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\na \u0026amp;= \\frac{1}{3\\delta^2} \u0026amp;= 7.787037…\\\\\nt_0 \u0026amp;= \\delta^3 \u0026amp;= 0.008856…\n\\end{align}\n$$\u003c/p\u003e\n\u003cp\u003e逆向变换:\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\n\u0026amp;f_Y \u0026amp;= \\frac{L^* + 16}{116}\\\\\n\u0026amp;f_X \u0026amp;= f_Y + \\frac{a^*}{500}\\\\\n\u0026amp;f_Z \u0026amp;= f_Y - \\frac{b^*}{200}\\\\\n\\end{align}\n$$\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\nY \u0026amp;= \\begin{cases}\nY_n(f_Y)^3 \u0026amp; f_Y \u0026gt; \\delta \\\\\nY_n(f_Y - \\frac{16}{116}) 3\\delta^2Y_n \u0026amp; f_Y \\leq \\delta\n\\end{cases}\\\\\nX \u0026amp;= \\begin{cases}\nX_n(f_X)^3 \u0026amp; f_X \u0026gt; \\delta \\\\\nX_n(f_X - \\frac{16}{116}) 3\\delta^2X_n \u0026amp; f_X \\leq \\delta\n\\end{cases}\\\\\nZ \u0026amp;= \\begin{cases}\nZ_n(f_Z)^3 \u0026amp; f_Z \u0026gt; \\delta \\\\\nZ_n(f_Z - \\frac{16}{116}) 3\\delta^2Z_n \u0026amp; f_Z \\leq \\delta\n\\end{cases}\n\\end{align}\n$$\u003c/p\u003e\n\u003ch2 id=\"oklab-色彩空间\"\u003eOKLAB 色彩空间\u003c/h2\u003e\n\u003cp\u003eCIELAB 色彩空间已经基本完备,但是它存在一个小问题:它的\u003cem\u003e色彩预测\u003c/em\u003e是不准确的。这里的色彩预测指的是给定色相和饱和度,预测颜色的亮度。但是在 CIELAB 中我们发现,亮度的预测并不是很准确,尤其是对蓝色来说,随着亮度的提高,整体颜色会往紫色偏移。\u003c/p\u003e\n\u003cp\u003e而 \u003ca href=\"https://bottosson.github.io/posts/oklab/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eOKLAB\u003c/a\u003e 通过重新设计色彩空间,解决了这个问题。如下对比图可以看出两者区别:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/lch_blue_hue_difference.avif\" srcset=\"lch_blue_hue_difference.avif?size=small, lch_blue_hue_difference.avif?size=medium 1.5x, lch_blue_hue_difference.avif?size=large 2x\" sizes=\"auto\" data-title=\"lch_blue_hue_difference.avif\" data-alt=\"lch_blue_hue_difference.avif\" class=\"suffix-invalid suffix-invalid__small suffix-invalid__large\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e另外我们还可以对比 HSL/HSV(RGB)色彩空间通过固定亮度和色度颜色渐变:\u003c/p\u003e\n\u003cp\u003eHSV:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/hue_hsv.png\" srcset=\"hue_hsv.png?size=small, hue_hsv.png?size=medium 1.5x, hue_hsv.png?size=large 2x\" sizes=\"auto\" data-title=\"HSV\" data-alt=\"HSV\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003eOKLAB:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/hue_oklab.png\" srcset=\"hue_oklab.png?size=small, hue_oklab.png?size=medium 1.5x, hue_oklab.png?size=large 2x\" sizes=\"auto\" data-title=\"OKLAB\" data-alt=\"OKLAB\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e由于没有一种比较好的办法来比较视觉亮度,这里以灰度做一个简单代替,需要注意的是灰度并不能等同于视觉亮度,只能大致描述。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e可以很明显的感知出两者的区别,OKLAB产生的渐变色彩在亮度上更加统一,而且色相的变化更加平滑。\u003c/p\u003e\n\u003cp\u003eOKLAB 色彩空间的定义如下:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eL\u003c/strong\u003e:视觉亮度;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ea\u003c/strong\u003e:颜色有多绿/红;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eb\u003c/strong\u003e:颜色有多蓝/黄;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e更常用的是极坐标形式的 $LCh^∘$ 色彩空间,其中\u003c/p\u003e\n\u003cp\u003e$$\nC = \\sqrt{a^2 + b^2}, h^∘ = \\arctan2(b, a)\n$$\u003c/p\u003e\n\u003cp\u003e而在实用意义上,$C$ 代表 Chroma,即颜色的饱和度,而 $h^∘$ 代表 Hue,即颜色的色相。\u003c/p\u003e\n\u003cp\u003e在\u003ca href=\"https://lch.oklch.com/#48.934546402228335,57.11239581426788,269.670268110566,100\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eLCH Color Picker \u0026amp; Converter\u003c/a\u003e中我们可以直观的调整 OKLAB 色彩的参数,以便更好地理解这个色彩空间:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/oklch_color_picker.webp\" srcset=\"oklch_color_picker.webp?size=small, oklch_color_picker.webp?size=medium 1.5x, oklch_color_picker.webp?size=large 2x\" sizes=\"auto\" data-title=\"oklch_color_picker.webp\" data-alt=\"oklch_color_picker.webp\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003ch3 id=\"推导\"\u003e推导\u003c/h3\u003e\n\u003cp\u003e为了定义 OKLAB,作者使用了三个数据集:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e使用 CAM16 和正常观看条件生成的具有相同亮度但随机色调和色度的颜色对的生成数据集。颜色仅限于指针色域(即一组可能的表面颜色)内;\u003c/li\u003e\n\u003cli\u003e使用 CAM16 和正常观看条件生成的具有相同色度但随机色调和亮度的颜色对的生成数据集。颜色仅限于指针色域(即一组可能的表面颜色)内;\u003c/li\u003e\n\u003cli\u003e用于导出 \u003ca href=\"https://scholarworks.rit.edu/theses/2858/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eIPT\u003c/a\u003e 的\u003ca href=\"https://doi.org/10.1117/12.298269\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e统一感知色相数据\u003c/a\u003e。在这些数据中,颜色被组合成具有相同感知色调的颜色对。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e这些数据集可用于分别测试亮度、色度和色调的\u003cem\u003e预测\u003c/em\u003e。如果颜色空间准确地模拟 $L$、$C$ 和 $h$,则亮度数据集中的颜色对应该具有相同的 $L$,色度数据集中的颜色对应该具有相同的 $C$,而色调数据集中的颜色对应该具有相同的 $h$。\u003c/p\u003e\n\u003ch3 id=\"rgb--cmyk-与-oklab-的转换\"\u003eRGB / CMYK 与 OKLAB 的转换\u003c/h3\u003e\n\u003cp\u003eRGB / CMYK 与 OKLAB 的转换同样需要借助 XYZ 色彩空间作为中间桥梁。\u003c/p\u003e\n\u003ch3 id=\"xyz-与-oklab-的转换\"\u003eXYZ 与 OKLAB 的转换\u003c/h3\u003e\n\u003cp\u003e给定 XYZ 坐标中的颜色,D65 白点 和 白色值 Y=1,我们可以通过以下过程计算出 OKLAB 色彩空间中的颜色:\u003c/p\u003e\n\u003cp\u003e首先,我们将 XYZ 坐标转换为近似的圆锥响应:\u003c/p\u003e\n\u003cp\u003e$$\n\\left[\n\\begin{array}{c}\nl\\\\ m\\\\ s\n\\end{array}\n\\right] = M_1 \\times\n\\left[\n\\begin{array}{c}\nX\\\\ Y\\\\ Z\n\\end{array}\n\\right]\n$$\u003c/p\u003e\n\u003cp\u003e再应用一轮非线性变换:\u003c/p\u003e\n\u003cp\u003e$$\n\\left[\n\\begin{array}{c}\nl’\\\\ m’\\\\ s\u0026#39;\n\\end{array}\n\\right] = \\left[\n\\begin{array}{c}\nl^{1/3}\\\\ m^{1/3}\\\\ s^{1/3}\n\\end{array}\n\\right]\n$$\u003c/p\u003e\n\u003cp\u003e最后将其转换为 $Lab$ 坐标:\u003c/p\u003e\n\u003cp\u003e$$\n\\left[\n\\begin{array}{c}\nL\\\\ a\\\\ b\n\\end{array}\n\\right] = M_2 \\times\n\\left[\n\\begin{array}{c}\nl’\\\\ m’\\\\ s\u0026#39;\n\\end{array}\n\\right]\n$$\u003c/p\u003e\n\u003cp\u003e$M_1$ 和 $M_2$ 是两个矩阵,定义如下:\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\nM_1 = \\left[\n\\begin{array}{ccc}\n+0.8189330101 ​\u0026amp;+0.3618667424 \u0026amp;−0.1288597137\\\\\n+0.0329845436 ​\u0026amp;+0.9293118715 \u0026amp;+0.0361456387\\\\\n+0.0482003018 ​\u0026amp;+0.2643662691 \u0026amp;+0.6338517070\n\\end{array}\n\\right]\n\\\\\nM_2 = \\left[\n\\begin{array}{ccc}\n+0.2104542553 \u0026amp;+0.7936177850 \u0026amp;-0.0040720468\\\\\n+1.9779984951 \u0026amp;−2.4285922050 \u0026amp;+0.4505937099\\\\\n+0.0259040371 \u0026amp;+0.7827717662 \u0026amp;-0.8086757660\n\\end{array}\n\\right]\n\\end{align}\n$$\u003c/p\u003e\n\u003cp\u003eOKLAB 色彩空间目前已经在现代浏览器中普及,可以通过 CSS 的 \u003ccode\u003eoklch()\u003c/code\u003e 函数直接使用。\u003c/p\u003e\n\u003cp\u003e利用 OKLAB 色彩空间,我们终于能够从人类感官的层面来定义一个颜色,并通过色彩空间模型对整个设计色彩体系进行预测与计算。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/overview_with_colors/"},{"title":"音乐与时间与蓝色星球#03 拍星星","time":"2024-02-04T21:00:11+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e有人想不开要学双拼输入法.jpg\u003c/p\u003e\n\u003cp\u003e这篇博客打算全部用双拼写,看看我能坚持多久,要是中途放弃了,我会标出来在哪里放弃的。\u003c/p\u003e\n\u003ch2 id=\"摄影\"\u003e摄影\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://blog.woooo.tech/posts/night_talk_001/#%E6%B6%88%E8%B4%B9\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e接上文\u003c/a\u003e,最后还是没忍住,花了9999大洋买回了人生中第一台相机,Nikon Zfc。镜头配了两个,一个是 Nikkor 18-140mm f/3.5-6.3 的变焦镜头,后来带出去拍星星发现光圈小的离谱,曝光时间需要很长很长,星轨都出来了,于是又整了个 25mm f/2 的定焦手动镜头。这两个镜头加起来差不多跟相机本体一样贵了。\u003c/p\u003e\n\u003cp\u003e要是有时间,我就写篇有关摄影的文章,讲点烂大街的摄影基础知识,这篇就算了。\u003c/p\u003e\n\u003ch2 id=\"拍星星\"\u003e拍星星\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003e人类从未停止过对星空的渴望\u003c/code\u003e —— 这是谁的台词来着。\u003c/p\u003e\n\u003cp\u003e不过确实,我经常半夜两三点出门去便利店整点吃的,有时候难得天气好,路过礼仪广场,抬头就能看到比较亮的星星,比如木星火星天狼星牛郎织女星,如果多驻足一会儿,等眼睛适应了黑暗,还能看见更多一点。不过西电光污染有点过分,即使在半夜三四点,地上的路灯和建筑灯光也能打亮半个天穹。\u003c/p\u003e\n\u003cp\u003e有时候觉得这样的景不拍下来可惜了,然后打开手机摄像头,手机表示它什么也看不见,然后开始使劲上调软件曝光,给你生产一张噪点比星星大的照片,就很。。。\u003c/p\u003e\n\u003cp\u003e买相机的想法就是那个时候萌生的。\u003c/p\u003e\n\u003cp\u003e买回来之后拍了很多张很多张,最开始以为跟手机拍摄应该没什么区别,瞎拍了几十张之后发现没有一张清楚的,于是去请教棒子和以太,看了一些摄影基础知识,然后才拍得像那么回事,堪堪赶上手机拍摄。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:拍了个什么玩意儿\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e不过西电的光污染还是太严重了,最后拍出来一张差不多能看的。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_003/DSC_0051.jpg\" srcset=\"DSC_0051.jpg?size=small, DSC_0051.jpg?size=medium 1.5x, DSC_0051.jpg?size=large 2x\" sizes=\"auto\" data-title=\"星星\" data-alt=\"星星\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e尽力了,真的尽力了。\u003c/p\u003e\n\u003cp\u003e此后又过了大概一个月,迎来了美好的寒假,于是想在村里完成拍星星的夙愿,结果发现三脚架没带,哦嚯,完蛋。\u003c/p\u003e\n\u003cp\u003e还好瓦楞屋顶救了我一命。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_003/old_woof.jpg\" srcset=\"old_woof.jpg?size=small, old_woof.jpg?size=medium 1.5x, old_woof.jpg?size=large 2x\" sizes=\"auto\" data-title=\"古典三脚架.jpg\" data-alt=\"古典三脚架.jpg\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e农村光污染情况确实好了很多,最后修出来的照片比我肉眼看到的星星数量还多:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_003/DSC_0474.jpg\" srcset=\"DSC_0474.jpg?size=small, DSC_0474.jpg?size=medium 1.5x, DSC_0474.jpg?size=large 2x\" sizes=\"auto\" data-title=\"肉眼都没看到过这么多\" data-alt=\"肉眼都没看到过这么多\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_003/DSC_0476.jpg\" srcset=\"DSC_0476.jpg?size=small, DSC_0476.jpg?size=medium 1.5x, DSC_0476.jpg?size=large 2x\" sizes=\"auto\" data-title=\"旁边的树效果意外的不错\" data-alt=\"旁边的树效果意外的不错\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/night_talk_003/"},{"title":"CTF 题目存储结构与类型插件化","time":"2024-01-20T02:34:01+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"起因\"\u003e起因\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cdel\u003e:哎这个 CTF 设计怎么这么抽象啊,又要有静态 flag 又要有动态 flag 还***要上 OJ 搞程序评测\u003c/del\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"现有方案\"\u003e现有方案(?)\u003c/h2\u003e\n\u003cp\u003e这个故事应该要从 CTFd 开始讲。 CTFd 本身设计为一个可以全方位扩展的解题平台,其 Flag 验证、平台功能都是采用插件化的结构来实现的。但是很不巧的是,这个插件化做的有一些问题,太过自由的结构导致给插件开发者带来了很大的心理负担和维护压力,仅仅实现功能还不够,还要附带实现前端,而一些逻辑还耦合在 Controller 中,导致遇到某些特殊的需求还得去改 CTFd 的源码。\u003c/p\u003e\n\u003cp\u003e原因之一是,CTFd 的文件管理功能是自带的,出题人上传一个题目文件,这个文件计算完hash之后会存入哈希路径,并在数据库中留下一条记录关联到对应的题目,然后按照原样提供给选手。在这个过程中,插件是无法进行侵入的,也就是说,文件管理本身是完全受限制的。而动态容器就不同了,CTFd 从设计之初就没有考虑过容器的问题,就导致整个容器管理都需要插件进行实现。于是,文件管理这个功能与容器管理是完全割裂开的。\u003c/p\u003e\n\u003cp\u003e再后来,GZ::CTF 逐渐占领了国内 CTF 赛事的市场。GZ::CTF 各方面用户体验做的很好,不过开发者为了整体用户体验舍弃了很多架构上的设计,其中包括自定义题目分类、题目插件化等等等。在题目文件的存储上 GZ::CTF 并没有做和 CTFd 区别很大的设计,加入了外链文件、根据队伍id动态分发题目文件等支持,但本地文件依旧是按照类似逻辑存储并关联到题目的。\u003c/p\u003e\n\u003cp\u003e这就导致一些需求在这种文件存储设计中实现起来很抽象,逻辑基本是耦合的:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e动态题目文件分发\u003c/strong\u003e:给每个队伍分发不同的题目文件,并映射到不同的flag,以此实现一些反作弊功能;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e动态环境挂载\u003c/strong\u003e:无法将题目文件挂载进选手使用的动态容器中。这个需求有一个固定的场景:OJ评测,我们有现成的评测容器,容器中会对选手的程序进行编译,并重定向输入输出文件,最终进行对比。如果仅使用容器机制进行测评的话,意味着我们每一道评测题目都需要将完整的输入输出评测文件打包进容器镜像之中;如果能够在启动容器时将文件动态挂载进去,那绝大部分评测题目只需要一个容器镜像就可以了;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e基于自定义规则的flag验证机制\u003c/strong\u003e:之前 @koito 提出过一个需求,希望能够自定义flag验证脚本,这样就可以提供一些更加复杂的题目类型和flag验证方式了。emmm虽然在Ruast中实现一个自定义验证脚本可能不是很容易,不过也不是不彳亍。问题在于,在传统模型下,flag验证只能拿到用户信息、题目信息以及用户提交的内容,过少的上下文导致了这个“自定义flag验证脚本”显得很鸡肋,你用吧,其实没比regex提供多少灵活性。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e以上这三个需求只是举个例子,他们都反映了一个共同的特点:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e选手下载文件、做题、提交flag到完成答案验证这个流程是强耦合的\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e一旦有一些新的需求,就需要在这个流程中进行修改,而插件系统一定是无法面面具到的,开发体验和使用体验总要扔一个。\u003c/p\u003e\n\u003cp\u003e那有没有什么二者兼顾而又不那么抽象的方案呢?没准有,看下面。\u003c/p\u003e\n\u003ch2 id=\"基于xxxx竞标一个nb的技术词汇的挑战应答题目机制\"\u003e基于XXXX(竞标一个NB的技术词汇)的挑战应答题目机制\u003c/h2\u003e\n\u003ch3 id=\"题目存储结构\"\u003e题目存储结构\u003c/h3\u003e\n\u003cp\u003e在创建题目时,平台会自动给题目分配一个专属存储目录,这里称之为 \u003ccode\u003eBucket\u003c/code\u003e。在 \u003ccode\u003eBucket\u003c/code\u003e 中,按照用途分为4个部分:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eprovided\u003c/code\u003e\u003c/strong\u003e:存放静态题目文件,上传到这里的文件会被直接提供给选手下载,不会进行任何处理;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003emapped\u003c/code\u003e\u003c/strong\u003e:存放动态题目文件,上传到这里的文件会被动态分发给选手,这里的设计其实是一个妥协,动态分发的特殊性导致这里的文件永远只能给选手分发\u003cstrong\u003e1个\u003c/strong\u003e对应文件,如果需要动态分发多个文件,就只能提前打包成tar/zip来解决了;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003epreserved\u003c/code\u003e\u003c/strong\u003e:存放额外的评测文件,这里的文件对选手是不可见的,但是会在选手提交flag时传递给flag验证器作为额外的上下文。在用途上其实可以很多样,例如把真正的flag验证逻辑作为脚本放在这个区域,然后实现一个flag验证器,在验证时启用某个脚本引擎运行这个脚本,配合相关文件和题目信息上下文进行验证,可以给到很高的自由度;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003emounted\u003c/code\u003e\u003c/strong\u003e:存放需要被挂载进容器中的文件,这里的文件会按照指定路径挂载进选手做题用的环境容器中。这里在某种程度上也许可以减小出题压力。例如制作各个版本带有xinetd的ubuntu镜像,出题人只需要设置好挂载路径并给出题目二进制文件本身即可作为一道完整的pwn题使用,不再需要自己写Dockerfile进行构建,可以很有效的复用现有的镜像资源。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"组件化题目验证机制\"\u003e组件化题目验证机制\u003c/h3\u003e\n\u003cp\u003e有了上述题目存储结构,接下来要实现一个能够利用这套存储结构的题目验证机制,同时,这套机制还应该能够很方便的进行扩展,以满足各种各样的需求。\u003c/p\u003e\n\u003cp\u003e首先,我们分析一下选手做题的流程,这里选了三种常见的题目类型:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e选手打开题目,下载题目附件,解出flag,提交flag并进行静态验证;\u003c/li\u003e\n\u003cli\u003e选手打开题目,下载动态附件,解出flag,提交flag并进行动态映射验证;\u003c/li\u003e\n\u003cli\u003e选手打开题目,启动题目环境,解出flag,提交flag并与环境中的flag对比验证;\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e接下来是管理员的操作流程:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e上传静态附件,设置flag;\u003c/li\u003e\n\u003cli\u003e上传动态附件,设置flag;\u003c/li\u003e\n\u003cli\u003e上传附件,不设置flag,配置题目镜像;\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e在这套流程中,题目验证机制总共有以下两个侵入点:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eflag验证:验证选手提交的flag是否正确;\u003c/li\u003e\n\u003cli\u003e动态容器:在选手启动容器时,动态设置容器的环境变量;\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e这两个侵入点都是可以通过插件进行扩展的,而且这两个侵入点的逻辑都是可以完全自定义的,这样就可以实现各种各样的题目类型了。\u003c/p\u003e\n\u003cdiv class=\"highlight\" id=\"id-1\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003epub\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003etrait\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eFlagChecker\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003easync\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efn\u003c/span\u003e \u003cspan class=\"nf\"\u003echeck\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003euser\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eUser\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echallenge\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eChallenge\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eflag\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"kt\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e-\u0026gt; \u003cspan class=\"nb\"\u003eResult\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eCheckerError\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003easync\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efn\u003c/span\u003e \u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003euser\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eUser\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echallenge\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eChallenge\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e-\u0026gt; \u003cspan class=\"nb\"\u003eResult\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nb\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eCheckerError\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003easync\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efn\u003c/span\u003e \u003cspan class=\"nf\"\u003eenv_vars\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003euser\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eUser\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echallenge\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eChallenge\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e-\u0026gt; \u003cspan class=\"nb\"\u003eResult\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eHashMap\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nb\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eString\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eCheckerError\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"o\"\u003e..\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003epub\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eStaticAttachmentChecker\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003epub\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eDynamicAttachmentChecker\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecache\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eRedisPool\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003epub\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eEnvironmentChecker\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecache\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eRedisPool\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/challenge_storage/"},{"title":"katzekit 2 - FUSE 文件系统","time":"2024-01-08T12:31:38+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e文件系统是一种用来存储和组织计算机文件的\u003cstrong\u003e软件\u003c/strong\u003e。我们日常所说的硬盘只是一种存储介质,可以理解为一张白纸,但是这张纸并不能对上面的数据进行分块管理,也不能保证每一个bit在过了一段时间之后还是正确的。而文件系统就是用来管理这张纸的,除了存储文件的元数据信息之外,大部分文件系统还会提供校验码之类的数据安全保障,保证用户的数据不会因为存储介质的问题发生改变。\u003c/p\u003e\n\u003cp\u003e文件系统本身作为软件,还可以提供一些额外的功能,例如权限控制、加密、压缩、快照等等。这些功能都是在文件系统层面实现的,所以用户不需要关心具体的实现细节,只需要在使用的时候调用相应的接口就可以了。文件系统甚至还可以建立在另一个文件系统之上,例如 \u003ccode\u003ecvsfs-fuse\u003c/code\u003e 等等。\u003c/p\u003e\n\u003cp\u003e在用户空间文件系统(User-space Filesystems)出现之前,文件系统开发一直是操作系统内核开发人员的工作。创建一个新的文件系统需要了解内核编程和一些内核技术(例如vfs),但是移动存储设备的新兴和数据管理的需求使得这种文件系统开发方式显得很麻烦,应当有一种更加简洁好使的方案来开发文件系统,并能够在不同的操作系统中与原有API相互配合,于是便有了 \u003cstrong\u003eFUSE(Filesystem in Userspace)\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e本文的目的是简单探索 FUSE 的 API 接口与设计方式,在后续 katze 的开发中可以借鉴这一套方案进行设计。\u003c/p\u003e\n\u003ch2 id=\"fuse-简介\"\u003eFUSE 简介\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eFUSE(Filesystem in Userspace)\u003c/strong\u003e 即 用户空间文件系统,定义了一套简单的 API 接口用于文件系统与内核进行交互。FUSE 本身被设计为一个内核模块,用户空间文件系统通过实现 FUSE API 与 FUSE 模块配合,最终实现了在用户空间中对文件系统的访问。\u003c/p\u003e\n\u003cp\u003e使用 FUSE 开发的文件系统可以直接链接到 FUSE 库,也就是说使用这套文件系统框架不需要了解内核技术也不需要进行内核编程,极大地方便了文件系统开发工作。\u003c/p\u003e\n\u003ch3 id=\"历史--前身\"\u003e历史 \u0026amp; 前身\u003c/h3\u003e\n\u003cp\u003e用户空间文件系统并不是一个新的设计,在 FUSE 出现之前已经有了一些方案:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Linux_Userland_Filesystem\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eLUFS\u003c/a\u003e 是一种混合用户空间文件系统框架,可为任何应用程序透明地支持无限数量的文件系统,由内核模块和用户空间守护进程组成;\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://dl.acm.org/doi/pdf/10.1145/290409.290410\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eUfo\u003c/a\u003e 项目是 Solaris 的一个全局文件系统,允许用户像对待本地文件一样对待远程文件。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eFUSE 的主要目的是将这种文件系统实现引入 Linux。\u003c/p\u003e\n\u003ch2 id=\"fuse-operations\"\u003eFUSE Operations\u003c/h2\u003e\n\u003cp\u003e要在 FUSE 中创建文件系统,需要安装 FUSE 内核模块,然后使用 FUSE 库和 API 集来创建文件系统。\u003c/p\u003e\n\u003cp\u003e一般来说现代 Linux 发行版仓库里都会有 FUSE,并且作为默认内核模块提供。\u003c/p\u003e\n\u003cp\u003efuse_operation 结构体中的必要函数:\u003c/p\u003e\n\u003cdiv class=\"highlight\" id=\"id-1\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003efuse_operations\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egetattr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003estat\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ereadlink\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003esize_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egetdir\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efuse_dirh_t\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efuse_dirfil_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emknod\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003emode_t\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003edev_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emkdir\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003emode_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eunlink\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ermdir\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esymlink\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erename\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elink\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003echmod\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003emode_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003echown\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003euid_t\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003egid_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etruncate\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eoff_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eutime\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003eutimbuf\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003efuse_file_info\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eread\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003esize_t\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eoff_t\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003efuse_file_info\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ewrite\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003esize_t\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eoff_t\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003efuse_file_info\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estatfs\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003estatfs\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eflush\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003efuse_file_info\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erelease\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003efuse_file_info\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efsync\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003efuse_file_info\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esetxattr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003esize_t\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egetxattr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003esize_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elistxattr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003esize_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eremovexattr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egetattr\u003c/code\u003e:获取文件属性。这类似于 \u003ccode\u003estat()\u003c/code\u003e ,\u003ccode\u003est_dev\u003c/code\u003e 和 \u003ccode\u003est_blksize\u003c/code\u003e 将被忽略。除非给出 \u003ccode\u003euse_ino\u003c/code\u003e,否则 \u003ccode\u003est_ino\u003c/code\u003e 也会被忽略;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ereadlink\u003c/code\u003e:读取符号链接;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egetdir\u003c/code\u003e:读取目录的内容,此操作是 \u003ccode\u003eopendir()\u003c/code\u003e 、 \u003ccode\u003ereaddir()\u003c/code\u003e 、…、 \u003ccode\u003eclosedir()\u003c/code\u003e 操作序列组合成的。对于每个目录条目,应调用 \u003ccode\u003efilldir()\u003c/code\u003e 函数;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emknod\u003c/code\u003e:将创建一个文件节点;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emkdir\u003c/code\u003e:创建一个目录;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eunlink\u003c/code\u003e:删除一个文件;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ermdir\u003c/code\u003e:删除一个目录;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esymlink\u003c/code\u003e:创建一个符号链接;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erename\u003c/code\u003e:重命名一个文件;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elink\u003c/code\u003e:创建一个硬链接;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003echmod\u003c/code\u003e:更改文件权限;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003echown\u003c/code\u003e:更改文件所有者和组;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etruncate\u003c/code\u003e:更改文件大小;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eutime\u003c/code\u003e:更改文件访问和修改时间;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopen\u003c/code\u003e:打开文件;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eread\u003c/code\u003e:读取文件。\u003ccode\u003eread()\u003c/code\u003e 应准确返回请求的字节数,\u003ccode\u003eEOF\u003c/code\u003e 或错误除外。一个例外是当指定了 \u003ccode\u003edirect_io\u003c/code\u003e 时,\u003ccode\u003eread()\u003c/code\u003e 系统调用的返回值就是 \u003ccode\u003edirect_io\u003c/code\u003e 的返回值;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ewrite\u003c/code\u003e:写入文件;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatfs\u003c/code\u003e:获取文件系统状态;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eflush\u003c/code\u003e:刷新缓冲区;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erelease\u003c/code\u003e:释放打开的文件;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efsync\u003c/code\u003e:同步文件;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esetxattr\u003c/code\u003e:设置扩展属性;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egetxattr\u003c/code\u003e:获取扩展属性;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elistxattr\u003c/code\u003e:列出扩展属性;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e这些操作并不都是绝对必要的,仅实现其中一部分也可以构建一个完整的文件系统。\u003c/p\u003e\n\u003cp\u003e对于 katze 来说,我们只需要读取操作,所以实现的 API 可以简化不少:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egetattr\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egetdir\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eread\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatfs\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egetprops\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e实际实现中还会加一些内部方法。在这些方法中,我主要简化了文件读取操作为单个read,read会返回指定范围的文件内容,不会一次性读取整个文件。在实际实现中这种操作可能需要优化,对于根文件来说应当保留fd,否则每次调用read的时候都要走系统调用重新打开fd再关上,很浪费IO性能。但是对于镜像文件内的文件就没必要这么做了,因为所有的数据都是通过 relay 对象逐步定位到镜像文件上的。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/fuse_api/"},{"title":"跨平台 Native UI 开发:The Elm Structure for GUI","time":"2024-01-05T16:55:42+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\n\u003cp\u003e某 ZeroAurora: 你再搁这儿追求跨平台我就要说 transplatform 了\u003c/p\u003e\n\u003cp\u003e: 那tm是 crossplatform,cross!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"缘由\"\u003e缘由\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://elm-lang.org/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eElm\u003c/a\u003e 是一种函数式编程语言,这个项目在2012年才开始,对编程语言界这群动辄上个世纪的老东西们来说,挺新的。这个语言承诺不会出现运行时异常,并且声称有很出色的性能和“令人愉快的开发人员体验”(虽然每个语言都这么说,但是个人感觉着实没几门语言在大型项目里写起来真的令人愉快)。\u003c/p\u003e\n\u003cp\u003e实际上我也没有看见过有什么网站/开源项目是使用Elm写的——至少比较有名的开源项目里没怎么见过,但是 Elm Structure 却很经常出现在各种新兴的 UI 框架里,无论是 Web 端还是 Native GUI,比如 \u003ca href=\"https://redux.js.org/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eRedux\u003c/a\u003e,\u003ca href=\"https://github.com/iced-rs/iced\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eiced-rs\u003c/a\u003e,\u003ca href=\"https://github.com/Relm4/Relm4\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eRelm4\u003c/a\u003e,\u003ca href=\"https://raphlinus.github.io/rust/gui/2022/05/07/ui-architecture.html\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eXilem\u003c/a\u003e…等等等。\u003c/p\u003e\n\u003ch2 id=\"the-elm-architecture\"\u003eThe Elm Architecture\u003c/h2\u003e\n\u003cp\u003eElm 是一种用于构建交互式程序的模式。\u003c/p\u003e\n\u003cp\u003e按照他们自己的介绍,这种架构是写着写着自己变成这样的:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis architecture seems to emerge naturally in Elm. Rather than someone inventing it, early Elm programmers kept discovering the same basic patterns in their code. It was kind of spooky to see people ending up with well-architected code without planning ahead!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"basic-pattern\"\u003eBasic Pattern\u003c/h3\u003e\n\u003cp\u003e在 Elm 的 UI 模型中,人机交互主要分为了三个部分:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eModel:用来表示应用程序的状态;\u003c/li\u003e\n\u003cli\u003eView:一种将状态转换为用户界面的方法;\u003c/li\u003e\n\u003cli\u003eUpdate:一种根据消息更新状态的方法;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e因此整个消息循环实际上呈现出下面这样的结构:\u003c/p\u003e\n\u003cdiv class=\"highlight\" id=\"id-1\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-plaintext\" data-lang=\"plaintext\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e +-----\u0026gt; View -------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e | |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e | v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Model \u0026lt;----------- Update\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e看起来有些像以前进化过的 \u003ca href=\"https://developer.mozilla.org/en-US/docs/Glossary/MVC\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eMVC(Model-View-Controller)\u003c/a\u003e 模型?但实际上不太一样,Elm 的架构要更加简单一些。在传统 MVC 架构中,View 的行为是通过 Controller 直接控制的,但是 View 的更改会直接影响 Model,然后 Controller 通过监听 Model 的变化来进行响应(也有的 MVC 模型是 Controller -\u0026gt; Model -\u0026gt; View 的,然后 View 与 Controller 进行双向交互响应);而 Elm 的架构中,View 操作会直接调用 Update 方法,Update 方法会采取措施更新 Model,最终 View 根据 Model 重新构建出用户界面达到一次响应。\u003c/p\u003e\n\u003cp\u003e我们可以发现 MVC 和 Elm 架构最大的区别是 Elm 保证了数据的单向流动。\u003c/p\u003e\n\u003ch3 id=\"relm4\"\u003eRelm4\u003c/h3\u003e\n\u003cp\u003eRelm4 是一个基于 gtk-rs 的 Native UI 框架。我以前一直对 gtk 抱有很大的偏见(\u003cdel\u003e一个经典的形容就是,GNOME/GTK就是巧克力味的屎,KDE/Qt是屎味的巧克力\u003c/del\u003e),但是不得不承认与其他 UI 框架相比,GTK 的可用性一直都是在线的。尝试了几个基于 GTK4 的应用之后,除了 Windows 下的字体渲染有点问题之外,其他的体验都还不错。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e欸 woc,copilot 都知道 Windows 下面各大框架都有啥问题,微软你能不能改改啊.jpg\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/elm_structure/1.png\" srcset=\"1.png?size=small, 1.png?size=medium 1.5x, 1.png?size=large 2x\" sizes=\"auto\" data-title=\"1.png\" data-alt=\"1.png\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"基本单元\"\u003e基本单元\u003c/h2\u003e\n\u003cp\u003e在 Elm Structure 中,\u003cstrong\u003e组件\u003c/strong\u003e 是整套UI系统的基本单元。一个 \u003cstrong\u003e组件\u003c/strong\u003e 被描述为构造用户界面的基本块,一个组件可以由多个组件组合而成。\u003c/p\u003e\n\u003ch3 id=\"状态和消息\"\u003e状态和消息\u003c/h3\u003e\n\u003cp\u003e每个组件都有以下三种数据结构:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003eModel\u003c/code\u003e:组件的状态;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eInput\u003c/code\u003e:组件从外部接收的消息;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eOutput\u003c/code\u003e:组件向外部发送的消息;\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e其中 \u003ccode\u003eModel\u003c/code\u003e 一般是一个结构体,里面存储着组件的持久化状态信息,而 \u003ccode\u003eInput\u003c/code\u003e 和 \u003ccode\u003eOutput\u003c/code\u003e 是枚举(Enum)类型,用来指示消息类型,并携带消息的内容。\u003c/p\u003e\n\u003cp\u003e在 Relm4 的设计中,组件依靠 \u003ccode\u003einit\u003c/code\u003e 和 \u003ccode\u003eupdate\u003c/code\u003e 函数进行消息的处理。当组件接收到消息时,\u003ccode\u003eupdate\u003c/code\u003e 函数就会被调用,然后函数根据枚举类型进行消息的分发处理,例如更新 \u003ccode\u003eModel\u003c/code\u003e,将消息转码之后转发 \u003ccode\u003eOutput\u003c/code\u003e 等等。\u003c/p\u003e\n\u003ch3 id=\"组件\"\u003e组件\u003c/h3\u003e\n\u003cp\u003e组件是状态、消息、处理逻辑和界面描述的组合,一个组件就表示了一个完整的具有响应性和对应行为的用户界面,例如一个会发送点击信号的按钮、能以编程方式和用户点击方式更改选中状态的单选框等等。\u003c/p\u003e\n\u003cp\u003e在 Relm4 中,组件是通过 \u003ccode\u003eSimpleComponent trait\u003c/code\u003e 来定义的,这个 \u003ccode\u003etrait\u003c/code\u003e 会要求开发者实现 \u003ccode\u003eModel\u003c/code\u003e、\u003ccode\u003eInput\u003c/code\u003e、\u003ccode\u003eOutput\u003c/code\u003e 的定义以及 \u003ccode\u003einit\u003c/code\u003e 和 \u003ccode\u003eupdate\u003c/code\u003e 函数,并提供了 \u003ccode\u003eview!\u003c/code\u003e 宏用来生成用户界面。\u003c/p\u003e\n\u003ch2 id=\"例子\"\u003e例子\u003c/h2\u003e\n\u003cp\u003e这里以一个简单的计数器作为例子。\u003c/p\u003e\n\u003cp\u003e首先我们要定义组件的状态,在这个例子中组件的状态就是计数器的值,所以我们定义一个 \u003ccode\u003eModel\u003c/code\u003e 结构体:\u003c/p\u003e\n\u003cdiv class=\"highlight\" id=\"id-2\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eAppModel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecounter\u003c/span\u003e: \u003cspan class=\"kt\"\u003eu8\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e接下来定义组件的消息,这里我们只需要一个 \u003ccode\u003eInput\u003c/code\u003e 类型的消息,用来表示用户点击了哪个按钮:\u003c/p\u003e\n\u003cdiv class=\"highlight\" id=\"id-3\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#[derive(Debug)]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003eenum\u003c/span\u003e \u003cspan class=\"nc\"\u003eAppInput\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eIncrement\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eDecrement\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e最后是界面定义和 \u003ccode\u003eSimpleComponent\u003c/code\u003e 的实现:\u003c/p\u003e\n\u003cdiv class=\"highlight\" id=\"id-4\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#[relm4::component]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003eimpl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eSimpleComponent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eAppModel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003etype\u003c/span\u003e \u003cspan class=\"nc\"\u003eInit\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eu8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003etype\u003c/span\u003e \u003cspan class=\"nc\"\u003eInput\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eAppMsg\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003etype\u003c/span\u003e \u003cspan class=\"nc\"\u003eOutput\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"fm\"\u003eview!\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003egtk\u003c/span\u003e::\u003cspan class=\"n\"\u003eWindow\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_title\u003c/span\u003e: \u003cspan class=\"nb\"\u003eSome\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Simple app\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_default_width\u003c/span\u003e: \u003cspan class=\"mi\"\u003e300\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_default_height\u003c/span\u003e: \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003egtk\u003c/span\u003e::\u003cspan class=\"nb\"\u003eBox\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_orientation\u003c/span\u003e: \u003cspan class=\"nc\"\u003egtk\u003c/span\u003e::\u003cspan class=\"n\"\u003eOrientation\u003c/span\u003e::\u003cspan class=\"n\"\u003eVertical\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_spacing\u003c/span\u003e: \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_margin_all\u003c/span\u003e: \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003egtk\u003c/span\u003e::\u003cspan class=\"n\"\u003eButton\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_label\u003c/span\u003e: \u003cspan class=\"s\"\u003e\u0026#34;Increment\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econnect_clicked\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003esender\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003emove\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003e_\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003esender\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einput\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eAppMsg\u003c/span\u003e::\u003cspan class=\"n\"\u003eIncrement\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003egtk\u003c/span\u003e::\u003cspan class=\"n\"\u003eButton\u003c/span\u003e::\u003cspan class=\"n\"\u003ewith_label\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Decrement\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econnect_clicked\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003esender\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003emove\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003e_\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003esender\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einput\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eAppMsg\u003c/span\u003e::\u003cspan class=\"n\"\u003eDecrement\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003egtk\u003c/span\u003e::\u003cspan class=\"n\"\u003eLabel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e#[watch]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_label\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eformat\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Counter: {}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecounter\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_margin_all\u003c/span\u003e: \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Initialize the UI.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efn\u003c/span\u003e \u003cspan class=\"nf\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecounter\u003c/span\u003e: \u003cspan class=\"nc\"\u003eSelf\u003c/span\u003e::\u003cspan class=\"n\"\u003eInit\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eSelf\u003c/span\u003e::\u003cspan class=\"n\"\u003eRoot\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003esender\u003c/span\u003e: \u003cspan class=\"nc\"\u003eComponentSender\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"bp\"\u003eSelf\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e-\u0026gt; \u003cspan class=\"nc\"\u003eComponentParts\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"bp\"\u003eSelf\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eAppModel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecounter\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Insert the macro code generation here\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ewidgets\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"fm\"\u003eview_output!\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eComponentParts\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ewidgets\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efn\u003c/span\u003e \u003cspan class=\"nf\"\u003eupdate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"k\"\u003emut\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e: \u003cspan class=\"nc\"\u003eSelf\u003c/span\u003e::\u003cspan class=\"n\"\u003eInput\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003e_sender\u003c/span\u003e: \u003cspan class=\"nc\"\u003eComponentSender\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"bp\"\u003eSelf\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ematch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eAppMsg\u003c/span\u003e::\u003cspan class=\"n\"\u003eIncrement\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecounter\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecounter\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewrapping_add\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eAppMsg\u003c/span\u003e::\u003cspan class=\"n\"\u003eDecrement\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecounter\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecounter\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewrapping_sub\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eview!\u003c/code\u003e 宏中以一种类似于 QML 的声明式界面写法构造了用户界面,并将 \u003ccode\u003eButton\u003c/code\u003e 的点击事件连接到组件上,通过 \u003ccode\u003esender\u003c/code\u003e 方法通知 \u003ccode\u003eupdate\u003c/code\u003e 函数进行消息处理。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/elm_structure/"},{"title":"音乐与时间与蓝色星球#02 绿皮车","time":"2024-01-01T23:24:25+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"哐当\"\u003e哐当\u003c/h2\u003e\n\u003cp\u003e小时候家里为了省钱,过年经常会坐几个小时的绿皮车晃悠到老家。印象里那时候坐火车是件很大的事,父母提前好几天就会开始操心。等火车的时候不准玩手机,不准打开行李,生怕东西被扒手偷走了,也生怕看忘了时间错过了火车。上车之后就自由好多了,绿皮车经典3+2式座位,两列座位面对面,还有一张小桌子。印象中每次坐车都能碰到一些很有趣的人,坐车坐到一半总能和对面的乘客搭上几句话,然后聊上一整路。等到火车开到中途了,就会有一个推着各色特产的推销员到车厢里四处分发样品,然后开始一次长篇大论的推销 —— 大家都很感兴趣的样子,经常能跟推销员聊上一整路,但是最后下单购买的寥寥无几。大概是大家都知道是个什么套路,但是坐车途中实在无聊,于是都当乐子对待了。\u003c/p\u003e\n\u003ch2 id=\"呜\"\u003e呜——\u003c/h2\u003e\n\u003cp\u003e上大学之后就很少坐绿皮火车了。虽然学校离家倒也不算太远,绿皮车大概要坐11个小时,高铁4个半小时,跟一些偏远地区的同学回个家要坐两天一夜相比好多了。不过可能是全面小康卓有成效,除了第一次上大学和大学毕业最后一次从学校回家之外,坐的都是高铁了。高铁的椅子很舒服,车厢很干净,每个座位都有小桌板,路途上也很安静,但总感觉少了点什么。\u003c/p\u003e\n\u003ch2 id=\"故事从这里开始\"\u003e故事从这里开始\u003c/h2\u003e\n\u003cp\u003e刚上大学的时候就是坐绿皮车从家里晃悠到西安的,和父母一起。父母第一次来西安,坐火车在他们看来依旧是一件大事,来西安送我上学也是一件大事,张罗了好几箱行李。在火车上偶尔和其他乘客聊两句,说到是送孩子上大学的,对面也很惊讶,欸好巧啊我们也是。而具体的路上见闻已经太过久远,细节记不清楚了。后来到西安了学校组织了新生接送大巴统一给我们拉到学校,只记得大巴开了一个多小时才看到学校大门。我开玩笑说这学校这么偏,也不是啥好大学啊。我妈说没事,我看网上报道说2019年底地铁就修到西电了,到时候你们肯定去哪儿都方便。我说彳亍。\u003c/p\u003e\n\u003cp\u003e然后2023年底都过去了,地铁还是没修到西电。\u003c/p\u003e\n\u003ch2 id=\"怎么来的怎么回去\"\u003e怎么来的,怎么回去\u003c/h2\u003e\n\u003cp\u003e去年大学毕业,我跟棒子和银羽一起坐绿皮车回家。我们要去的地方都不一样,但是都在东边。于是买了卧铺,打算晃悠回去。想着四年前拿着一个红本本通知书坐绿皮车过来,四年后拿着一个红本本毕业证坐同一车次的绿皮车回去,大概也算有始有终。我上车的时候要困死了,找到床铺就失去意识了。感受到铁轨在背后一节一节过去,睡起来无比舒服。不过心里好像总有什么事一般,一个小时就醒一次。第一次醒,看见银羽和棒子正聊着;第二次醒,看见棒子在往上铺爬;第三次醒,看见银羽在对面的床上睡得正香;第四次醒,好像和上次醒没啥不同,不过天蒙蒙亮了。于是我没有继续睡,给电脑掏出来打开笔记打算写点什么,但是想了好大一会儿啥也没写出来。最后打开了VSCode,在手头的几个项目里漫无目的地改了一些无关紧要的东西,然后打开手机热点 \u003ccode\u003egit push\u003c/code\u003e 了一下。我也不知道我在干什么。\u003c/p\u003e\n\u003cp\u003e然后大概五点多快六点了,听到隔壁的隔壁床传来打电话的声音,似乎是一个正在上大学的男孩。我探出头瞄了一眼,烫着黄毛,在上铺趴着似乎是跟某个妹子打电话。电话里不乏 “我赚了不少钱,但我觉得钱不重要” 之类的话。大概是打激动了,声音越来越大,吐字还挺清晰,我听的一字不落,听起来似乎是妹子被人坑了,他正在试图劝导妹子,然后展现自己的实力balabala的,感觉挺有意思,但是五六点在这么小的车厢里讲相声属实有点不太合适,我打开群聊看了一眼,棒子正在群里骂这是个傻逼。然后看见棒子一脸没睡醒的样子从上铺爬下来,坐在银羽的床脚,银羽也醒了,我们几个一边听那哥们打电话一边小声吐槽。我甚至不知道他什么时候打完的电话,总之后面的记忆就只有这个插曲了。\u003c/p\u003e\n\u003ch2 id=\"虚假的幸福也是一瞬的幸福\"\u003e虚假的幸福也是一瞬的幸福\u003c/h2\u003e\n\u003cp\u003e上个个月吧,我正跟队友一起在杭州打比赛。然后导师突然发消息说打完比赛直接去兰州,做横向科研项目。我说彳亍,拉跟我一起去。然后打开订票软件一看,杭州飞兰州那几张票时间都很不合适。后来打电话跟我说,要不咱先坐火车去上海,然后从上海飞。缺点是要熬一宿,好处是上海到兰州的机票一大堆,而且还贼便宜,150就能飞过去。我说彳亍,肘!然后就有了这一段绿皮车记忆。\u003c/p\u003e\n\u003cp\u003e绿皮车和高铁飞机不一样,高铁飞机是按排编数字编号,然后每一排用字母编号,一眼就知道买了什么位置的座位。但是绿皮车座位是从1开始按顺序往下走的,第一个座位有时候还会从中间开始编,另一边放一个乘务员专座,所以就很难预测自己到底买了个什么座位。很不幸的是我跟刚好买了错开的两排,不过好在路途比较近,也就凑合着坐了。\u003c/p\u003e\n\u003cp\u003e上车以后,我对面是一个穿着蓝色衣服,扎着两根麻花辫,很符合电视剧里乡村女孩形象的妹子,目测大概接近30岁的样子。上车之后她就一直在说话,同时还掏出纸笔在小桌子上写写画画,我最开始以为她是带着无线耳机在和谁打电话,于是我也戴上耳机听了一会儿歌。这样大概过了一个小时,她还在自言自语个不停。这个时候我觉得好像有点蹊跷,没看见带耳机啊,甚至没看见她掏出来过手机。打电话的话,也没有单方面说个不停的。但是我带着耳机在听歌,也不太想摘下耳机听听她在说啥。过了一会儿她大概是说累了,于是趴在小桌子上,然后突然指了指桌子上的半块面包,抬头跟我说,你把面包往那边收收,我想趴在这儿。我摘下耳机,这面包不是我的,大概是上个人吃剩下的。她笑笑,然后说,如果这个是你的,我想吃一块儿。然后问我,你是去上海吗?我说是。她又问,我身边的人都跟我说,上海有人一个月能赚两三万,你觉得可能不,我迟疑了一下没有搭话。然后她又开始说,我觉得不可能,我上一份工作一个月才两三千,哪有人能拿那么高工资呀。\u003c/p\u003e\n\u003cp\u003e过了一会儿,她又问我,你喜欢上海吗?没等我回答,她接上自己的话茬,我就不喜欢上海,我觉得人太多了,为什么人有钱了就要往一个地方地方挤。我说,大城市各种资源可能都好一些吧。她又说,真的吗,我怎么没感觉呢。然后她又问我,如果你突然变得很有钱,你最想干什么?我说,我也不知道啊,没体验过有钱的生活,真有钱的话,大概会去找一个清静的地方过过日子吧。她说她也不知道。\u003c/p\u003e\n\u003cp\u003e她说她上一份工作没做好,现在手里欠了两万块钱,工作也辞职了。她看到她的朋友炒股,于是她自己也试了试,结果发现她好像有什么天赋,她投的股票100%中!于是她就给自己的工作全辞了,打算好好投资一笔。然后她又拿起纸笔开始算账,她说她发现自己投资纯利率有24%,但是巴菲特才只有8%,那她不出五年就能赚大钱。有钱以后的生活想想就美好啊。她说这句话的时候眼睛里全是光。我听她说了好久好久,有对未来的规划,有对过去不太好经历的讲述,甚至还说到了她身边的朋友,她朋友曾经跟她说你有这能力去证券所找个年薪三四百万的工作轻而易举。她说她再也不想工作了,还是投资更赚钱,就算年薪几百万,她这24%利率往上翻一翻没几年就会超过这个数。然后她又拿起纸笔一顿算。\u003c/p\u003e\n\u003cp\u003e我全程没说话。\u003c/p\u003e\n\u003cp\u003e我下车的时候,跟她说,祝愿你能过上好日子。她还沉浸在纸上那一个个利率和数字里,没有回答我。\u003c/p\u003e\n\u003cp\u003e我无数次想跟她说,投资是有风险的;你被骗了之类的话,但是每次看到她眼睛里的希望,我又憋了回去。我只是火车上的一个路人,我不知道她以前经历了什么,我也不知道她现状如何,只有一点我能确定,我说的话她肯定一句也听不进去。不仅听不进去,可能还会觉得我很煞风景。虚假的幸福也是一瞬的幸福,希望她在某个世界线真的能变成中国的巴菲特吧。\u003c/p\u003e\n\u003ch2 id=\"pending\"\u003epending……\u003c/h2\u003e\n\u003cp\u003e再偷偷放一下 \u003ccode\u003e834548135\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e这问题应该不难罢……\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/night_talk_002/"},{"title":"音乐与时间与蓝色星球#01 夜话","time":"2023-12-27T20:54:48+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\n\u003cp\u003enote1: 随便写写。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003enote2: 标题 neta 自 \u003ca href=\"https://www.bilibili.com/bangumi/play/ep703036\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eギターと孤独と蒼い惑星\u003c/a\u003e。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003enote3: 啊这篇不是写音乐的,只会点管乐,也对音乐没什么深入理解。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"夜话\"\u003e夜话\u003c/h2\u003e\n\u003cp\u003e最早看到“夜话”这个词是在读了 马南邨 先生写的\u003ca href=\"https://zh.wikipedia.org/wiki/%E7%87%95%E5%B1%B1%E5%A4%9C%E8%AF%9D\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e《燕山夜话》\u003c/a\u003e杂文专栏,看起来可有意思,文章很杂很多,什么都讲,就好像大半夜找了个兄弟出去梭哈大排档,或者无聊的时候陪某个有趣的长辈解闷,什么话题都能说上一段,聊着聊着天就亮了。但我当时并不太明白夜话是个什么意思,只是觉得能和其他人聊一晚上人生经历很有趣(也不完全是,在绿皮车上听贩子大吹特吹成功秘诀的时候我只想给他一)。现在想想,感觉夜话应该代表着一种友好的信息交流。《燕山夜话》朴实得几乎说不上有什么文采,读来却有一种难得的舒畅和愉悦。最浅近的字词,最直白的话语,就把事情说得清楚明白,决不故作高深,故弄玄虚。可惜那本很老的书不知道被扔在哪个充满灰尘的角落了,现在想重温还得满世界找找PDF看。\u003c/p\u003e\n\u003cp\u003e所以这篇文章(没准能多写几篇?)也不会有什么重点,也没有什么想要讨论的中心,想到啥就写点啥,不想写了就停,带伙看个乐呵就好。\u003c/p\u003e\n\u003cp\u003e今天考完了信安数基,昨天晚上为了应付这门考试复习了一个通宵,现在脑子还是晕晕乎乎的。事实证明通宵复习并不是什么好主意(虽然我本科期间都是这么过来的),上考场第一道题就给公式忘了,明明前一天晚上还拿着草稿纸演算了两遍。后半夜复习的时候我感觉自己就像是一个 K\u0026amp;R C 时代的 C 语言编译器,面对着一个 C++ 23 标准的一大堆模板声明不知所措。PPT上的每个中国字我都认识,连起来就解析不出来了。最后我只能借鉴现代编译技术的先进经验,把看不懂的当成字符串往脑子里塞,理解不了没关系,先背下来,上考场了再跑JIT。结果上考场了发现我这算力不如8086内存速度跟不上SDRAM的脑子根本跑不动JIT,只能装模作样的在草稿纸上留下一地鸡毛。\u003c/p\u003e\n\u003ch2 id=\"消费\"\u003e消费\u003c/h2\u003e\n\u003cp\u003e上半年天天emo的一大原因就是感觉自己干了一大堆一大堆活,然后全都被画饼行为搪塞过去了。然后这下半年竟然兑现了一些饼,手里有了点钱。\u003c/p\u003e\n\u003cp\u003e关于想买的东西我其实没什么特别的念想 —— 一般都是手里有点钱,然后在某个契机突然想到了某个东西,脑子一热就买了。比如两个月前还在天天熬夜肝代码的时候,经常在实验室通宵,半夜三四点出门去711便利店整点 女子 口乞 的,然后抬头看星星,天气好的时候能看到不少星星。突然有一天很想给星星拍下来,于是打开了手机相机往天上一咔嚓 —— 得到了一张黑乎乎的全是噪点的玩意儿。于是很想买一台单反。但是我当时没钱,我全身上下的钱加起来就够吃一个星期的,于是作罢。然后等到西电发血汗钱了,为数不多的自信心又回来了,让我康康!\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_001/IMG_6579.jpeg\" srcset=\"IMG_6579.jpeg?size=small, IMG_6579.jpeg?size=medium 1.5x, IMG_6579.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"WTF\" data-alt=\"WTF\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_001/IMG_6578.jpeg\" srcset=\"IMG_6578.jpeg?size=small, IMG_6578.jpeg?size=medium 1.5x, IMG_6578.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"你给我卖了吧要不\" data-alt=\"你给我卖了吧要不\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e不过星星还是好看的。那怎么拍呢,我想起来很久以前看过一个Google Daydream团队发的帖子,原帖找不着了,贴个\u003ca href=\"https://www.theverge.com/2017/4/27/15447130/google-post-processing-nighttime-mobile-photography\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e新闻\u003c/a\u003e。大意是给曝光时间调长,然后光圈调小,使劲儿曝光,然后在同一地点拍上64张照片,最后用算法合成,感觉彳亍,那试试。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_001/stars.jpg\" srcset=\"stars.jpg?size=small, stars.jpg?size=medium 1.5x, stars.jpg?size=large 2x\" sizes=\"auto\" data-title=\"星星\" data-alt=\"星星\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_001/stars-loc.jpg\" srcset=\"stars-loc.jpg?size=small, stars-loc.jpg?size=medium 1.5x, stars-loc.jpg?size=large 2x\" sizes=\"auto\" data-title=\"星图\" data-alt=\"星图\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e第二章是在 star walk 上找到了对应的星座位置图。\u003c/p\u003e\n\u003cp\u003e群友锐评:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_001/star-comment.jpg\" srcset=\"star-comment.jpg?size=small, star-comment.jpg?size=medium 1.5x, star-comment.jpg?size=large 2x\" sizes=\"auto\" data-title=\"star-comment.jpg\" data-alt=\"star-comment.jpg\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e看来是大失败,于是发了个空间,让带伙图一乐。但是还是忍不住,于是这几天又旁敲侧击问了问周围有相机的朋友,他们给设备一拿出来,如数家珍:这个机型几k,那个镜头几k,这一包大概四五万,你要入坑的话我先借你玩玩?给我吓得,不用了不用了,万一磕着碰着你给我卖去缅甸没准才能赔得起。最后看了半天看到尼康那个复古的zfc,金属机身贼帅,就发给朋友看了一眼,朋友说你又不咋拍,纯纯暴殄天物。然后我脑子里飘过了一些不好的回忆,也是,不暴殄天物了,下辈子再说。朋友好像意识到了什么不对,急忙改口,那你想买就买呗。但是心情已经没了,算了。\u003c/p\u003e\n\u003ch2 id=\"自我绑架\"\u003e自我绑架\u003c/h2\u003e\n\u003cp\u003e依稀记得上次因为 \u003ccode\u003e钱\u003c/code\u003e 闹矛盾还是在初中的时候,正值暑假,某个亲戚去我家玩,我爸妈上班去了,她就在我家跟我一起看店。然后来了个大学生模样的人,说想借电脑下载一个文档,我说彳亍,你来下,就给电脑让给她操作。然后那个亲戚就说你得付钱啊,下个文件付两块钱。然后顾客不乐意了,说刚刚说借的时候还没说付钱呢。亲戚:小孩子不懂事,你用我们的东西肯定是要付钱的。最后还是收了两块钱。我就跟她吵,我说就借五分钟电脑下个文件怎么还收钱啊,要那么多钱干什么。亲戚很激动,给我训了一顿,说我这么小一点金钱意识都没有,还拿了张纸条,工工整整的把“要那么多钱干什么”写了下来,说等我爸妈回来一定要给他们看看我说的什么话。后来我爸妈回来了,亲戚说了两句,走了,我跟我爸妈看着那个纸条都乐了。\u003c/p\u003e\n\u003cp\u003e所以钱到底意味着什么呢?从我受过的一贯教育来看,钱是表示价值的,用来交换同等使用价值的生活资料/生产资料。所以,赚更多的钱意味着可以更好的活着。是这样吗?钱确实重要,由于家里也穷,于是大三开始给社团和竞赛基地干活有一点稳定劳务费收入之后就没再要过生活费了。这两年尝试经济独立之后,经常会遇到意外消费然后给我手里那点钱烧空,下一笔劳务费/奖金还得等半个月于是得饿肚子的情况,不过总的来说能活下去。\u003c/p\u003e\n\u003cp\u003e跟钱比起来,我其实更怕的是麻烦人和麻烦事。既然钱是交换生存资料的媒介,那我能活着就够了,日常遇到跟钱有关的事情,我一般都会主动让别人来决定怎么分/怎么付,我亏点就亏点,图个少事清静。有时候点外卖点久了算不清钱了我就大致估算一下然后向上取整,一次性给别人。这么多年过来,我也没觉得自己吃亏了什么,反而觉得自己省了不少心,也再也没因为钱的事跟别人发生争执。\u003c/p\u003e\n\u003cp\u003e唯一不爽的是群友们天天在群里哭穷,但一个比一个有钱,于是有时候开玩笑就互相说你好有钱你好富,富哥v50。带伙都知道各自是在开玩笑也都不放在心上,不过有时候学校发点钱,一激动就分享到群里了,于是就要遭受群友的一通轰炸,最后说你发了这么大一笔钱不得请客?我说彳亍,吃啥,然后一个星期饭钱就出去了。过了几天其他群友的奖金也到帐了,我就很想在群里at ta,说ta是富哥,问ta什么时候请客吃饭,但是按照我这语言组织能力,话说出去颇有种在记恨别人终于能报仇了的感觉,有点逆天,也不是我原意,万一别人理解错了我又得难受半天,最后还得主动给别人道个歉,代价太高了,于是还是不说了,又憋回去。\u003c/p\u003e\n\u003cp\u003e有时候想消费一波也是的,明明自己的血汗钱,想买点什么还得藏着掖着有点奇怪,但是不藏着掖着被群友看见了开玩笑了我又得难受半天,有时候群友来一句你买这个没必要之类的话我就更难受了,主打一个自我绑架。大家也确实都没有恶意,但是听了就是受不了,如果以一种很严肃的语气说自己不喜欢这种开玩笑什么的又觉得很别扭,觉得自己在煞风景,于是就一直别扭地过着。\u003c/p\u003e\n\u003ch2 id=\"糖葫芦\"\u003e糖葫芦\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_001/haochi.jpg\" srcset=\"haochi.jpg?size=small, haochi.jpg?size=medium 1.5x, haochi.jpg?size=large 2x\" sizes=\"auto\" data-title=\"haochi.jpg\" data-alt=\"haochi.jpg\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003ch2 id=\"音乐\"\u003e音乐\u003c/h2\u003e\n\u003cp\u003e来点\u003ca href=\"http://163cn.tv/EFOgF2\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eDaydaydream\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e突然很想去充满生活气息的夜市里开一瓶菠萝啤,点几串烤肉再点一碗石凉粉。可惜西安没有石凉粉,信阳也没有好吃的路边烤肉。\u003c/p\u003e\n\u003cp\u003e想那只傻猫了。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_001/gouzi.jpg\" srcset=\"gouzi.jpg?size=small, gouzi.jpg?size=medium 1.5x, gouzi.jpg?size=large 2x\" sizes=\"auto\" data-title=\"gouzi.jpg\" data-alt=\"gouzi.jpg\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003ch2 id=\"heading\"\u003e……\u003c/h2\u003e\n\u003cp\u003e真有人看的话,834548135.\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/night_talk_001/"},{"title":"2023 年度小结","time":"2023-12-24T22:11:49+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\n\u003cp\u003e不是刚写完2022的年度小结.jpg\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e写的时候回过头看了看2022的年度小结,感觉时间过的是真快啊。想想今年可能是我这辈子最有意思的一年,但是似乎写2022年度小结就在昨天,但今年发生的事好像已经过去一个世纪了,这是为什么呢.jpg\u003c/p\u003e\n\u003ch2 id=\"今年做了什么\"\u003e今年做了什么\u003c/h2\u003e\n\u003cp\u003e上了个研,\u003ca href=\"https://blog.woooo.tech/posts/travel_jpn\"\u003e然后真的去二次元的世界看了看\u003c/a\u003e。\u003c/p\u003e\n\u003ch2 id=\"迁移迁移迁移\"\u003e迁移,迁移,迁移\u003c/h2\u003e\n\u003cp\u003e要说起今年的开发工作,就俩字,\u003cstrong\u003e迁移\u003c/strong\u003e。每天打开电脑跑一下 \u003ccode\u003epnpm up --latest \u0026amp;\u0026amp; cargo upgrade --incompatible\u003c/code\u003e,总能给我带来点惊喜。因为 Vue 更新给 tsconfig 炸了,整个平台从 Vue 迁移到了 Svelte,年末 rust hyper 发布了 1.0 又是一阵鸡飞狗跳。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/2023_summary/fuck-pnpm.png\" srcset=\"fuck-pnpm.png?size=small, fuck-pnpm.png?size=medium 1.5x, fuck-pnpm.png?size=large 2x\" sizes=\"auto\" data-title=\"fuck-pnpm.png\" data-alt=\"fuck-pnpm.png\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/2023_summary/fuck-vite.png\" srcset=\"fuck-vite.png?size=small, fuck-vite.png?size=medium 1.5x, fuck-vite.png?size=large 2x\" sizes=\"auto\" data-title=\"fuck-vite.png\" data-alt=\"fuck-vite.png\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e然后是去西北师大部署了 Cyber Terminal 并通过了验收,算是给人生中的第一个商业项目告一段落。\u003c/p\u003e\n\u003ch2 id=\"上研\"\u003e上研\u003c/h2\u003e\n\u003cp\u003e本以为保研了就能轻松度过美好的大四时光,但是就后来的遭遇来看\u003ca href=\"https://blog.woooo.tech/posts/20230514\"\u003e大概是寄了\u003c/a\u003e。不过的人生主打一个魔幻,所以倒也合理。\u003c/p\u003e\n\u003cp\u003e上半年接着给学校干活,给毕设写完,然后总算是成功毕业了。心心念念的毕业旅行也去了几个地方,和董叔一起去了汉中,跟果果去苏州打了比赛,跟阳哥去霓虹到处打卡。虽然旅行主打一个穷游,能走路绝不坐车,倒也在路上看了不少风景,\u003cdel\u003e遗憾是手里没几个钱,所以没吃到什么好吃的\u003c/del\u003e。\u003c/p\u003e\n\u003cp\u003e下半年回到西电,一卡通上的年级已经从2019变成2023硕了,但学校还是那么个学校,人还是那一批人,没感觉有什么不同。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e换了个新宿舍,有了自己选的室友,电梯和24h热水,大成功\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e哦不同还是有的,教务处搞了个新签到系统,我这一学期去的课比我过去四年去的课加一起还多。课上老师要求也变了,以前本科都是能过就彳亍,这学期几门课上来就是要求读论文,做汇报(\u003cdel\u003e我又不是你组的 我又不搞你那方向,我读什么读,读得懂\u003c/del\u003e)。\u003c/p\u003e\n\u003ch2 id=\"看番\"\u003e看番\u003c/h2\u003e\n\u003cp\u003e看了不少,但如果要说比较想推的,是下面这三个:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.bilibili.com/bangumi/play/ss1560/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e灵感!\u003c/a\u003e,\u003ca href=\"https://www.bilibili.com/bangumi/play/ss4996/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e地狱少女\u003c/a\u003e,\u003ca href=\"https://www.bilibili.com/bangumi/play/ss6463/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e少女终末旅行\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e一个校园日常,一个经典老番,一个公路片。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e上面这几个只是今年比较对胃口的,如果真要说主推番的话还得是\u003ca href=\"https://www.netflix.com/hk/title/81054853\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e边缘行者\u003c/a\u003e,\u003ca href=\"https://www.bilibili.com/bangumi/play/ss43164/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e孤独摇滚\u003c/a\u003e,邦邦的MyGO。\n\u003cdel\u003e不想在博客上放奇怪的第三方动漫网站链接\u003c/del\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"明年\"\u003e明年?\u003c/h2\u003e\n\u003cp\u003e年末给博客翻新了一下,加了一些新东西,修了修样式,换了个评论系统,明年希望能多写点东西。\u003c/p\u003e\n\u003cp\u003e有点想写个架空世界观的公路片小说。\u003c/p\u003e\n\u003cp\u003e先活着吧。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/2023_summary/"},{"title":"二次元是怎么旅游的.jpg","time":"2023-11-18T08:09:06+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\n\u003cp\u003e小小记录一下。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e因为人已经回来很久了,博客里的照片都是带GPS等exif信息的,方便以后看地方;\u003c/li\u003e\n\u003cli\u003e这里放了很多很多图,小心流量;\u003c/li\u003e\n\u003cli\u003e由于博客不方便上传太大的图片,这儿都是压缩处理过一遍的jpg,有看中哪张图想要原图的戳我;\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"序曲\"\u003e序曲\u003c/h2\u003e\n\u003cp\u003e本科毕业的时候(就上半年),我攒了一点钱,打算毕业的时候多去几个地方玩一玩,好好来场毕业旅行。但是毕设加上一堆乱七八糟的事,还有填坑的原因,这笔钱没花出去,也没玩几个地方,就和董叔去汉中逛了两天。然后是浑浑噩噩的暑假,去苏州参加了一场比赛,然后开始每天按部就班的练科二。直到暑假的尾巴,才想起来这本科都毕业了,还没玩呢。\u003c/p\u003e\n\u003cp\u003e早在五月的时候,有个玩的很好的高中同学(下文称他阳哥)问我,要不要去日本玩一圈,他存了一笔钱,带我。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:有这好事?马上就去办护照签证。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e然后就真去办了护照,到暑假过了1/4才想起来。然后我俩开始折腾签证的事,最后找了家晦气旅行社,来回机票加签证坑了我俩一人5k,给这事定下来了。\u003c/p\u003e\n\u003cp\u003e走之前,我问他,咋走,\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e阳哥:别急,咱先去西安住几天。\u003c/p\u003e\n\u003cp\u003e:❓\u003c/p\u003e\n\u003cp\u003e阳哥:我有个玩伴之前找我借了点钱,咱去给钱要到就去日本。\u003c/p\u003e\n\u003cp\u003e:还有这事?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e然后我俩就跑到西安,定了五天酒店,刷完了双人成行,开了一个MC整合包,通关了森林之子。\u003c/p\u003e\n\u003cp\u003e然后临走了,我问他:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:要到帐了?\u003c/p\u003e\n\u003cp\u003e阳哥:借了2w,要回来2k。\u003c/p\u003e\n\u003cp\u003e:?\u003c/p\u003e\n\u003cp\u003e:你身上多少钱?\u003c/p\u003e\n\u003cp\u003e阳哥翻出钱包,掏出里面的10w日元(5k rmb)\u003c/p\u003e\n\u003cp\u003e:身上就1w rmb,还去不去?\u003c/p\u003e\n\u003cp\u003e阳哥:走。\u003c/p\u003e\n\u003cp\u003e:走,大不了学杀酱0元城市生存15天。\u003c/p\u003e\n\u003cp\u003e阳哥:?\u003c/p\u003e\n\u003cp\u003e阳哥:我觉得我把你肾卖了比较好。\u003c/p\u003e\n\u003cp\u003e:\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"北京--关西--大阪\"\u003e北京 ✈️ 关西 大阪\u003c/h2\u003e\n\u003ch3 id=\"08-22-到达\"\u003e08-22 到达\u003c/h3\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/IMG_4612-20231113021932-ztwapbe.jpeg\" srcset=\"IMG_4612-20231113021932-ztwapbe.jpeg?size=small, IMG_4612-20231113021932-ztwapbe.jpeg?size=medium 1.5x, IMG_4612-20231113021932-ztwapbe.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"IMG_4612\" data-alt=\"IMG_4612\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e阳哥是第一次坐飞机,但是他刚熬了一宿,上飞机就睡死了,连起飞的推背感都没叫醒他。\u003c/p\u003e\n\u003cp\u003e​​​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/IMG_4615-20231113022009-rmhtel6.jpeg\" srcset=\"IMG_4615-20231113022009-rmhtel6.jpeg?size=small, IMG_4615-20231113022009-rmhtel6.jpeg?size=medium 1.5x, IMG_4615-20231113022009-rmhtel6.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"IMG_4615\" data-alt=\"IMG_4615\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/IMG_4628-20231113022048-h9befn8.jpeg\" srcset=\"IMG_4628-20231113022048-h9befn8.jpeg?size=small, IMG_4628-20231113022048-h9befn8.jpeg?size=medium 1.5x, IMG_4628-20231113022048-h9befn8.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"IMG_4628\" data-alt=\"IMG_4628\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/IMG_4632-20231113022113-9uxkac7.jpeg\" srcset=\"IMG_4632-20231113022113-9uxkac7.jpeg?size=small, IMG_4632-20231113022113-9uxkac7.jpeg?size=medium 1.5x, IMG_4632-20231113022113-9uxkac7.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"IMG_4632\" data-alt=\"IMG_4632\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e到了关西。\u003c/p\u003e\n\u003cp\u003e接下来去大阪,先买票。阳哥不会讲洋文,自认为洋文还不错,就操着一口Chinglish上了。对着售票员比划了半天,她问我:Chinese?:yes yes。然后售票员操着一口比我还标准的普通话给我讲怎么买,给我把业务办完了。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e在外面等的阳哥:搞好了咩?\u003c/p\u003e\n\u003cp\u003e:得现金付,搞好了,但是是七天通票,没买今天的,今天还得买单程票。\u003c/p\u003e\n\u003cp\u003e阳哥:草,那你再去跟她交涉交涉?\u003c/p\u003e\n\u003cp\u003e:她中国话讲得比你好。\u003c/p\u003e\n\u003cp\u003e阳哥:?\u003c/p\u003e\n\u003cp\u003e阳哥:那剩下的钱呢?\u003c/p\u003e\n\u003cp\u003e:?什么钱?\u003c/p\u003e\n\u003cp\u003e阳哥:我给了你7w日元啊\u003c/p\u003e\n\u003cp\u003e挥了挥手里两张日本铁路全国通票:都在这儿了\u003c/p\u003e\n\u003cp\u003e阳哥:草\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/IMG_4637-20231113022903-i0ijl2c.jpeg\" srcset=\"IMG_4637-20231113022903-i0ijl2c.jpeg?size=small, IMG_4637-20231113022903-i0ijl2c.jpeg?size=medium 1.5x, IMG_4637-20231113022903-i0ijl2c.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"IMG_4637\" data-alt=\"IMG_4637\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e买了票,进了站,迷茫了,坐哪个车?\u003c/p\u003e\n\u003cp\u003e可惜站内的保安不会中国话,用英语问他怎么去Osaka,他叽里呱啦说了一堆明显听起来不是日语但是又不像是英语的东西,见我愣住了,于是开始张牙舞爪的比划,然后嘴里说you take 哈鲁卡 哈鲁卡,还是一脸懵b,直到看到了他指着一辆列车:哈鲁卡!\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/IMG_5186-20231113023310-o2jktc0.jpeg\" srcset=\"IMG_5186-20231113023310-o2jktc0.jpeg?size=small, IMG_5186-20231113023310-o2jktc0.jpeg?size=medium 1.5x, IMG_5186-20231113023310-o2jktc0.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"IMG_5186\" data-alt=\"IMG_5186\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e草。\u003c/p\u003e\n\u003cp\u003e后来道谢的时候我本来脱口而出的thank you又憋了回去,换成了阿里嘎多阔赛伊马斯。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/IMG_5188-20231113023513-a1c77u4.jpeg\" srcset=\"IMG_5188-20231113023513-a1c77u4.jpeg?size=small, IMG_5188-20231113023513-a1c77u4.jpeg?size=medium 1.5x, IMG_5188-20231113023513-a1c77u4.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"IMG_5188\" data-alt=\"IMG_5188\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e于是坐着关西空港特急希望(Haruka)号到了大阪。\u003c/p\u003e\n\u003cp\u003e​​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230822_085104026_iOS.heic-20231117092740-kooe1m4.jpg\" srcset=\"20230822_085104026_iOS.heic-20231117092740-kooe1m4.jpg?size=small, 20230822_085104026_iOS.heic-20231117092740-kooe1m4.jpg?size=medium 1.5x, 20230822_085104026_iOS.heic-20231117092740-kooe1m4.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230822_085104026_iOS.heic\" data-alt=\"20230822_085104026_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​\u003c/p\u003e\n\u003cp\u003e坐JR坐到大阪天王寺,然后俩人又迷失在霓虹的奇妙交通里了。在地铁站里兜兜转转走了一圈又一圈还没弄明白这地铁咋坐的,这JR、Metro、近铁、单营、电车轨道都是什么玩意儿?转了一圈又一圈,还上错一趟车,最后总算是到了Airbnb订的民宿。\u003c/p\u003e\n\u003cp\u003e​ ​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_141507242_iOS.heic-20231117092755-1sit3mg.jpg\" srcset=\"20230823_141507242_iOS.heic-20231117092755-1sit3mg.jpg?size=small, 20230823_141507242_iOS.heic-20231117092755-1sit3mg.jpg?size=medium 1.5x, 20230823_141507242_iOS.heic-20231117092755-1sit3mg.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_141507242_iOS.heic\" data-alt=\"20230823_141507242_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e再便宜的日本民宿都必备的微波炉和浴缸。\u003c/p\u003e\n\u003cp\u003e放了行李,简单休息了一下,该吃晚饭了。外卖不知道怎么点,大众点评翻了一下附近4000円起步,想着拉倒吧不如出去找找小馆子钻一钻。这么想着,我俩就去街上晃悠了。晃了一圈没找到啥好吃的,于是挑了一家人还挺多的店进去,\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230822_120740359_iOS.heic-20231117092809-damm36m.jpg\" srcset=\"20230822_120740359_iOS.heic-20231117092809-damm36m.jpg?size=small, 20230822_120740359_iOS.heic-20231117092809-damm36m.jpg?size=medium 1.5x, 20230822_120740359_iOS.heic-20231117092809-damm36m.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230822_120740359_iOS.heic\" data-alt=\"20230822_120740359_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​​\u003c/p\u003e\n\u003cp\u003e一看菜单东北料理:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230822_112509159_iOS.heic-20231117092815-7rpupub.jpg\" srcset=\"20230822_112509159_iOS.heic-20231117092815-7rpupub.jpg?size=small, 20230822_112509159_iOS.heic-20231117092815-7rpupub.jpg?size=medium 1.5x, 20230822_112509159_iOS.heic-20231117092815-7rpupub.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230822_112509159_iOS.heic\" data-alt=\"20230822_112509159_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​​\u003c/p\u003e\n\u003cp\u003e番茄酱炒番茄,谁想出来的玩意儿。\u003c/p\u003e\n\u003cp\u003e​​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230822_115953637_iOS.heic-20231117092906-s3fnoew.jpg\" srcset=\"20230822_115953637_iOS.heic-20231117092906-s3fnoew.jpg?size=small, 20230822_115953637_iOS.heic-20231117092906-s3fnoew.jpg?size=medium 1.5x, 20230822_115953637_iOS.heic-20231117092906-s3fnoew.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230822_115953637_iOS.heic\" data-alt=\"20230822_115953637_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​​​\u003c/p\u003e\n\u003cp\u003e这抄馓子味道还不错其实。(阳哥:你来日本吃中餐❓ :那你来想吃啥。 阳哥:我觉得中餐也不错)\u003c/p\u003e\n\u003cp\u003e吃完饭,逛了逛附近,找着好几家711,进去一看一只卡芙卡坐在货架上。\u003c/p\u003e\n\u003cp\u003e​​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230822_110458148_iOS.heic.2-20231117092838-97hs6ko.jpg\" srcset=\"20230822_110458148_iOS.heic.2-20231117092838-97hs6ko.jpg?size=small, 20230822_110458148_iOS.heic.2-20231117092838-97hs6ko.jpg?size=medium 1.5x, 20230822_110458148_iOS.heic.2-20231117092838-97hs6ko.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230822_110458148_iOS.heic.2\" data-alt=\"20230822_110458148_iOS.heic.2\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230822_121208126_iOS.heic-20231117092853-cs25xxr.jpg\" srcset=\"20230822_121208126_iOS.heic-20231117092853-cs25xxr.jpg?size=small, 20230822_121208126_iOS.heic-20231117092853-cs25xxr.jpg?size=medium 1.5x, 20230822_121208126_iOS.heic-20231117092853-cs25xxr.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230822_121208126_iOS.heic\" data-alt=\"20230822_121208126_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​​\u003c/p\u003e\n\u003cp\u003e晚上回去想起来人都在日本了,啤酒烧烤启动!\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230822_123158000_iOS-20231117092912-7f88ohg.jpg\" srcset=\"20230822_123158000_iOS-20231117092912-7f88ohg.jpg?size=small, 20230822_123158000_iOS-20231117092912-7f88ohg.jpg?size=medium 1.5x, 20230822_123158000_iOS-20231117092912-7f88ohg.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230822_123158000_iOS\" data-alt=\"20230822_123158000_iOS\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e算了,打不了一点。\u003c/p\u003e\n\u003cp\u003e收拾收拾泡个澡差不多凌晨一两点了,刚说完睡觉,就听见阳哥的鼾声已经起来了。于是倒头就睡,睡到第二天上午十一点,一睁眼就是窗外整整齐齐一排垃圾。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_041207403_iOS.heic-20231117093057-zfrxq1q.jpg\" srcset=\"20230823_041207403_iOS.heic-20231117093057-zfrxq1q.jpg?size=small, 20230823_041207403_iOS.heic-20231117093057-zfrxq1q.jpg?size=medium 1.5x, 20230823_041207403_iOS.heic-20231117093057-zfrxq1q.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_041207403_iOS.heic\" data-alt=\"20230823_041207403_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e阳哥:你也去下面趴着\u003c/p\u003e\n\u003cp\u003e:❓\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"08-23-天守阁和鳗鱼饭\"\u003e08-23 天守阁和鳗鱼饭\u003c/h3\u003e\n\u003cp\u003e霓虹是靠左通行的,过马路时人不让车,司机大老远看见你有过马路的意向就会直接停下来等你过去,如果跟国内一样站着等司机开车过去的话,会尬住很长一段时间,最后还得是你先过马路,不然司机会按喇叭催你。头几天还不太习惯,后面几天看到路口我都是直接走的。(后遗症是回国了之后在北京这么走差点被京爷创死)\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_051338389_iOS.heic-20231117094017-ry16gld.jpg\" srcset=\"20230823_051338389_iOS.heic-20231117094017-ry16gld.jpg?size=small, 20230823_051338389_iOS.heic-20231117094017-ry16gld.jpg?size=medium 1.5x, 20230823_051338389_iOS.heic-20231117094017-ry16gld.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_051338389_iOS.heic\" data-alt=\"20230823_051338389_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_052049246_iOS.heic-20231117094024-pik1b3k.jpg\" srcset=\"20230823_052049246_iOS.heic-20231117094024-pik1b3k.jpg?size=small, 20230823_052049246_iOS.heic-20231117094024-pik1b3k.jpg?size=medium 1.5x, 20230823_052049246_iOS.heic-20231117094024-pik1b3k.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_052049246_iOS.heic\" data-alt=\"20230823_052049246_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e天守阁所在的大阪城公园离我们住的地方非常近,不到一公里。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_052617434_iOS.heic-20231117094717-dkv1j7w.jpg\" srcset=\"20230823_052617434_iOS.heic-20231117094717-dkv1j7w.jpg?size=small, 20230823_052617434_iOS.heic-20231117094717-dkv1j7w.jpg?size=medium 1.5x, 20230823_052617434_iOS.heic-20231117094717-dkv1j7w.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_052617434_iOS.heic\" data-alt=\"20230823_052617434_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_055147470_iOS.heic-20231117094818-1fwa9ga.jpg\" srcset=\"20230823_055147470_iOS.heic-20231117094818-1fwa9ga.jpg?size=small, 20230823_055147470_iOS.heic-20231117094818-1fwa9ga.jpg?size=medium 1.5x, 20230823_055147470_iOS.heic-20231117094818-1fwa9ga.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_055147470_iOS.heic\" data-alt=\"20230823_055147470_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​\u003c/p\u003e\n\u003cp\u003e满地的咕咕咕也不怎么怕人,买了个热狗卷被鸽子啄了一半。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_060349525_iOS.heic-20231117094915-1qw3xui.jpg\" srcset=\"20230823_060349525_iOS.heic-20231117094915-1qw3xui.jpg?size=small, 20230823_060349525_iOS.heic-20231117094915-1qw3xui.jpg?size=medium 1.5x, 20230823_060349525_iOS.heic-20231117094915-1qw3xui.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_060349525_iOS.heic\" data-alt=\"20230823_060349525_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_060613397_iOS.heic-20231117094925-8yqubsv.jpg\" srcset=\"20230823_060613397_iOS.heic-20231117094925-8yqubsv.jpg?size=small, 20230823_060613397_iOS.heic-20231117094925-8yqubsv.jpg?size=medium 1.5x, 20230823_060613397_iOS.heic-20231117094925-8yqubsv.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_060613397_iOS.heic\" data-alt=\"20230823_060613397_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_061557030_iOS.heic-20231117095008-4zsq81d.jpg\" srcset=\"20230823_061557030_iOS.heic-20231117095008-4zsq81d.jpg?size=small, 20230823_061557030_iOS.heic-20231117095008-4zsq81d.jpg?size=medium 1.5x, 20230823_061557030_iOS.heic-20231117095008-4zsq81d.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_061557030_iOS.heic\" data-alt=\"20230823_061557030_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e阳哥:天守阁怎么都装电梯了\u003c/p\u003e\n\u003cp\u003e:方便你上去捡雷神瞳\u003c/p\u003e\n\u003cp\u003e阳哥:❓\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e塔尖好像少了点什么,这样才河里:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_092204100_iOS-20231117095106-idax7of.jpg\" srcset=\"20230823_092204100_iOS-20231117095106-idax7of.jpg?size=small, 20230823_092204100_iOS-20231117095106-idax7of.jpg?size=medium 1.5x, 20230823_092204100_iOS-20231117095106-idax7of.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_092204100_iOS\" data-alt=\"20230823_092204100_iOS\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:你上去跟她对一刀?没事,我给你护照带回去,多少给你封个烈士\u003c/p\u003e\n\u003cp\u003e阳哥:你咋不去\u003c/p\u003e\n\u003cp\u003e:你看我这风神之眼还没亮呢,得先给你献祭了才行\u003c/p\u003e\n\u003cp\u003e阳哥:❓\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e转完回去想起来我带着电脑,刚准备打开发现霓虹插座标准跟国内不一样,看了眼时间还早,阳哥不想动弹,我就自己出去在大阪街上乱晃悠,到处找店问有没有卖转接线的。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_074955629_iOS.heic-20231117095617-gwuck53.jpg\" srcset=\"20230823_074955629_iOS.heic-20231117095617-gwuck53.jpg?size=small, 20230823_074955629_iOS.heic-20231117095617-gwuck53.jpg?size=medium 1.5x, 20230823_074955629_iOS.heic-20231117095617-gwuck53.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_074955629_iOS.heic\" data-alt=\"20230823_074955629_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e发现一个商店街,很有玉子市场既视感。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_081720936_iOS.heic-20231117095635-ldou74i.jpg\" srcset=\"20230823_081720936_iOS.heic-20231117095635-ldou74i.jpg?size=small, 20230823_081720936_iOS.heic-20231117095635-ldou74i.jpg?size=medium 1.5x, 20230823_081720936_iOS.heic-20231117095635-ldou74i.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_081720936_iOS.heic\" data-alt=\"20230823_081720936_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_081948704_iOS.heic-20231117095649-izbxerz.jpg\" srcset=\"20230823_081948704_iOS.heic-20231117095649-izbxerz.jpg?size=small, 20230823_081948704_iOS.heic-20231117095649-izbxerz.jpg?size=medium 1.5x, 20230823_081948704_iOS.heic-20231117095649-izbxerz.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_081948704_iOS.heic\" data-alt=\"20230823_081948704_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e兜兜转转从谷町-4转到了谷町-6,终于找到一家电工商店,花了1400円买了一根破破旧旧还没有接地的线。\u003c/p\u003e\n\u003cp\u003e回去之后,我俩合计着出去吃鳗鱼饭。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_114420645_iOS.heic-20231117095905-km73vvv.jpg\" srcset=\"20230823_114420645_iOS.heic-20231117095905-km73vvv.jpg?size=small, 20230823_114420645_iOS.heic-20231117095905-km73vvv.jpg?size=medium 1.5x, 20230823_114420645_iOS.heic-20231117095905-km73vvv.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_114420645_iOS.heic\" data-alt=\"20230823_114420645_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e挺好吃,就是量太少了。\u003c/p\u003e\n\u003cp\u003e晚上回去路过711,进去买了一瓶这个:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_120414970_iOS.heic-20231117100125-m6jdqn8.jpg\" srcset=\"20230823_120414970_iOS.heic-20231117100125-m6jdqn8.jpg?size=small, 20230823_120414970_iOS.heic-20231117100125-m6jdqn8.jpg?size=medium 1.5x, 20230823_120414970_iOS.heic-20231117100125-m6jdqn8.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_120414970_iOS.heic\" data-alt=\"20230823_120414970_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e说是改善睡眠质量,实际上就是酸奶,喝了感觉没啥用,但睡的还是不错。\u003c/p\u003e\n\u003ch2 id=\"大阪--东京\"\u003e大阪 东京\u003c/h2\u003e\n\u003ch3 id=\"08-24-东京和深夜动画\"\u003e08-24 东京和深夜动画\u003c/h3\u003e\n\u003cp\u003e在大阪只有天守阁一个打卡点,环球影城因为太远了就算了,我们两个啥b二次元就是来打卡的。于是24号JR全国通票生效的时候,我俩就打算去东京了。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_023131831_iOS.heic-20231117100315-1usumt9.jpg\" srcset=\"20230824_023131831_iOS.heic-20231117100315-1usumt9.jpg?size=small, 20230824_023131831_iOS.heic-20231117100315-1usumt9.jpg?size=medium 1.5x, 20230824_023131831_iOS.heic-20231117100315-1usumt9.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_023131831_iOS.heic\" data-alt=\"20230824_023131831_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e走的时候赶上了早高峰末潮,地铁上人不少,但是安静得可怕。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:……\u003c/p\u003e\n\u003cp\u003e阳哥:……\u003c/p\u003e\n\u003cp\u003e:你怎么这么有素质了\u003c/p\u003e\n\u003cp\u003e阳哥:❓\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_031726355_iOS.heic-20231117100436-5beoyls.jpg\" srcset=\"20230824_031726355_iOS.heic-20231117100436-5beoyls.jpg?size=small, 20230824_031726355_iOS.heic-20231117100436-5beoyls.jpg?size=medium 1.5x, 20230824_031726355_iOS.heic-20231117100436-5beoyls.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_031726355_iOS.heic\" data-alt=\"20230824_031726355_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_032639394_iOS.heic-20231117100445-o2c4sle.jpg\" srcset=\"20230824_032639394_iOS.heic-20231117100445-o2c4sle.jpg?size=small, 20230824_032639394_iOS.heic-20231117100445-o2c4sle.jpg?size=medium 1.5x, 20230824_032639394_iOS.heic-20231117100445-o2c4sle.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_032639394_iOS.heic\" data-alt=\"20230824_032639394_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_033835691_iOS.heic-20231117100509-lq6jstl.jpg\" srcset=\"20230824_033835691_iOS.heic-20231117100509-lq6jstl.jpg?size=small, 20230824_033835691_iOS.heic-20231117100509-lq6jstl.jpg?size=medium 1.5x, 20230824_033835691_iOS.heic-20231117100509-lq6jstl.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_033835691_iOS.heic\" data-alt=\"20230824_033835691_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_062458945_iOS.heic-20231117100521-8kpc2yu.jpg\" srcset=\"20230824_062458945_iOS.heic-20231117100521-8kpc2yu.jpg?size=small, 20230824_062458945_iOS.heic-20231117100521-8kpc2yu.jpg?size=medium 1.5x, 20230824_062458945_iOS.heic-20231117100521-8kpc2yu.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_062458945_iOS.heic\" data-alt=\"20230824_062458945_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e日本的云是真的好看,一块儿天空上各种类型的云都齐活了,看起来真的感觉云上还有一片陆地,还有一个国家。\u003c/p\u003e\n\u003cp\u003e然后到了东京:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_072450273_iOS.heic-20231117100645-gzxnjwv.jpg\" srcset=\"20230824_072450273_iOS.heic-20231117100645-gzxnjwv.jpg?size=small, 20230824_072450273_iOS.heic-20231117100645-gzxnjwv.jpg?size=medium 1.5x, 20230824_072450273_iOS.heic-20231117100645-gzxnjwv.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_072450273_iOS.heic\" data-alt=\"20230824_072450273_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_073026087_iOS.heic-20231117100733-s3eedha.jpg\" srcset=\"20230824_073026087_iOS.heic-20231117100733-s3eedha.jpg?size=small, 20230824_073026087_iOS.heic-20231117100733-s3eedha.jpg?size=medium 1.5x, 20230824_073026087_iOS.heic-20231117100733-s3eedha.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_073026087_iOS.heic\" data-alt=\"20230824_073026087_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e在东京民宿的电视上翻到了MyGO!和赛马娘,\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_084829970_iOS.heic-20231117100931-atwfyea.jpg\" srcset=\"20230824_084829970_iOS.heic-20231117100931-atwfyea.jpg?size=small, 20230824_084829970_iOS.heic-20231117100931-atwfyea.jpg?size=medium 1.5x, 20230824_084829970_iOS.heic-20231117100931-atwfyea.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_084829970_iOS.heic\" data-alt=\"20230824_084829970_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e果断点了个预约。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_105527536_iOS.heic-20231117101401-4vd5kfv.jpg\" srcset=\"20230824_105527536_iOS.heic-20231117101401-4vd5kfv.jpg?size=small, 20230824_105527536_iOS.heic-20231117101401-4vd5kfv.jpg?size=medium 1.5x, 20230824_105527536_iOS.heic-20231117101401-4vd5kfv.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_105527536_iOS.heic\" data-alt=\"20230824_105527536_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_132658919_iOS.heic-20231117101020-4fsdpzr.jpg\" srcset=\"20230824_132658919_iOS.heic-20231117101020-4fsdpzr.jpg?size=small, 20230824_132658919_iOS.heic-20231117101020-4fsdpzr.jpg?size=medium 1.5x, 20230824_132658919_iOS.heic-20231117101020-4fsdpzr.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_132658919_iOS.heic\" data-alt=\"20230824_132658919_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_132850673_iOS.heic-20231117101036-6lce6oa.jpg\" srcset=\"20230824_132850673_iOS.heic-20231117101036-6lce6oa.jpg?size=small, 20230824_132850673_iOS.heic-20231117101036-6lce6oa.jpg?size=medium 1.5x, 20230824_132850673_iOS.heic-20231117101036-6lce6oa.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_132850673_iOS.heic\" data-alt=\"20230824_132850673_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_141459503_iOS.heic-20231117101045-ddq7mvo.jpg\" srcset=\"20230824_141459503_iOS.heic-20231117101045-ddq7mvo.jpg?size=small, 20230824_141459503_iOS.heic-20231117101045-ddq7mvo.jpg?size=medium 1.5x, 20230824_141459503_iOS.heic-20231117101045-ddq7mvo.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_141459503_iOS.heic\" data-alt=\"20230824_141459503_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e晚上想着出去吃点啥,一出门就看见了天空树,作为地标建筑真的好看:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_101026254_iOS.heic-20231117100956-6sju6fm.jpg\" srcset=\"20230824_101026254_iOS.heic-20231117100956-6sju6fm.jpg?size=small, 20230824_101026254_iOS.heic-20231117100956-6sju6fm.jpg?size=medium 1.5x, 20230824_101026254_iOS.heic-20231117100956-6sju6fm.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_101026254_iOS.heic\" data-alt=\"20230824_101026254_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e在大众点评上找了家和牛,想着奢侈一把,结果店家可能知道我俩没几个钱,今天不开业:\u003c/p\u003e\n\u003cp\u003e​​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_101009379_iOS.heic-20231117101240-x5ivdl6.jpg\" srcset=\"20230824_101009379_iOS.heic-20231117101240-x5ivdl6.jpg?size=small, 20230824_101009379_iOS.heic-20231117101240-x5ivdl6.jpg?size=medium 1.5x, 20230824_101009379_iOS.heic-20231117101240-x5ivdl6.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_101009379_iOS.heic\" data-alt=\"20230824_101009379_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​\u003c/p\u003e\n\u003cp\u003e最后去吃拉面了。吃前忘记拍了,吃完了拍一张:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_103718227_iOS.heic-20231117101519-8lqbd45.jpg\" srcset=\"20230824_103718227_iOS.heic-20231117101519-8lqbd45.jpg?size=small, 20230824_103718227_iOS.heic-20231117101519-8lqbd45.jpg?size=medium 1.5x, 20230824_103718227_iOS.heic-20231117101519-8lqbd45.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_103718227_iOS.heic\" data-alt=\"20230824_103718227_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:你觉得这面正宗\u003c/p\u003e\n\u003cp\u003e阳哥:我又不是本地人,我咋知道\u003c/p\u003e\n\u003cp\u003e:你不是本地人❓\u003c/p\u003e\n\u003cp\u003e阳哥:❓\u003c/p\u003e\n\u003cp\u003e:我不好说,这面跟西电那家日式豚骨拉面一个味儿\u003c/p\u003e\n\u003cp\u003e阳哥:西电东京分校是吧\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e晚上啤酒烧烤时间。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_021336138_iOS.heic-20231117102045-515jw2e.jpg\" srcset=\"20230825_021336138_iOS.heic-20231117102045-515jw2e.jpg?size=small, 20230825_021336138_iOS.heic-20231117102045-515jw2e.jpg?size=medium 1.5x, 20230825_021336138_iOS.heic-20231117102045-515jw2e.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_021336138_iOS.heic\" data-alt=\"20230825_021336138_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e主打一个全靠带。\u003c/p\u003e\n\u003ch3 id=\"08-25-浅草寺---秋叶原---天空树\"\u003e08-25 浅草寺 - 秋叶原 - 天空树\u003c/h3\u003e\n\u003cp\u003e浅草寺人挺多,有不少求御守的。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:求一个?\u003c/p\u003e\n\u003cp\u003e阳哥:不如回去拜孙悟空\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_024846800_iOS.heic-20231117102210-mf8h64z.jpg\" srcset=\"20230825_024846800_iOS.heic-20231117102210-mf8h64z.jpg?size=small, 20230825_024846800_iOS.heic-20231117102210-mf8h64z.jpg?size=medium 1.5x, 20230825_024846800_iOS.heic-20231117102210-mf8h64z.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_024846800_iOS.heic\" data-alt=\"20230825_024846800_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:中午吃啥\u003c/p\u003e\n\u003cp\u003e阳哥:我不到啊\u003c/p\u003e\n\u003cp\u003e:我也不到啊\u003c/p\u003e\n\u003cp\u003e阳哥:mcd吃不吃\u003c/p\u003e\n\u003cp\u003e:你来日本就吃mcd❓\u003c/p\u003e\n\u003cp\u003e阳哥:你来日本还吃中餐呢\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_030152527_iOS.heic-20231117103015-ajk2ac7.jpg\" srcset=\"20230825_030152527_iOS.heic-20231117103015-ajk2ac7.jpg?size=small, 20230825_030152527_iOS.heic-20231117103015-ajk2ac7.jpg?size=medium 1.5x, 20230825_030152527_iOS.heic-20231117103015-ajk2ac7.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_030152527_iOS.heic\" data-alt=\"20230825_030152527_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e吃完午饭就该去秋叶原了,二次元天堂!\u003c/p\u003e\n\u003cp\u003e结果还没到秋叶原呢,路边看到了个二次元牌子,以为是什么展览,凑近一看:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_035329595_iOS.heic-20231117103208-69di5tl.jpg\" srcset=\"20230825_035329595_iOS.heic-20231117103208-69di5tl.jpg?size=small, 20230825_035329595_iOS.heic-20231117103208-69di5tl.jpg?size=medium 1.5x, 20230825_035329595_iOS.heic-20231117103208-69di5tl.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_035329595_iOS.heic\" data-alt=\"20230825_035329595_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_035340181_iOS.heic-20231117103320-fqm4182.jpg\" srcset=\"20230825_035340181_iOS.heic-20231117103320-fqm4182.jpg?size=small, 20230825_035340181_iOS.heic-20231117103320-fqm4182.jpg?size=medium 1.5x, 20230825_035340181_iOS.heic-20231117103320-fqm4182.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_035340181_iOS.heic\" data-alt=\"20230825_035340181_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e好家伙,消防队。\u003c/p\u003e\n\u003cp\u003e路上看到不少很二次元的店,这个好像是女仆咖啡厅:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_035158978_iOS.heic-20231117103121-4x65ux3.jpg\" srcset=\"20230825_035158978_iOS.heic-20231117103121-4x65ux3.jpg?size=small, 20230825_035158978_iOS.heic-20231117103121-4x65ux3.jpg?size=medium 1.5x, 20230825_035158978_iOS.heic-20231117103121-4x65ux3.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_035158978_iOS.heic\" data-alt=\"20230825_035158978_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e悄悄Google了一下价格,没敢进去。\u003c/p\u003e\n\u003cp\u003e然后到了秋叶原。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_035721161_iOS.heic-20231117103429-nmts54u.jpg\" srcset=\"20230825_035721161_iOS.heic-20231117103429-nmts54u.jpg?size=small, 20230825_035721161_iOS.heic-20231117103429-nmts54u.jpg?size=medium 1.5x, 20230825_035721161_iOS.heic-20231117103429-nmts54u.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_035721161_iOS.heic\" data-alt=\"20230825_035721161_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:怎么全是原神方舟星穹铁道\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e让bocchi酱站这儿属实太难为社恐了\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_041859475_iOS.heic-20231117103533-hw4cg29.jpg\" srcset=\"20230825_041859475_iOS.heic-20231117103533-hw4cg29.jpg?size=small, 20230825_041859475_iOS.heic-20231117103533-hw4cg29.jpg?size=medium 1.5x, 20230825_041859475_iOS.heic-20231117103533-hw4cg29.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_041859475_iOS.heic\" data-alt=\"20230825_041859475_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e整点专辑带回去:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_042932099_iOS.heic-20231117103544-f8rat5y.jpg\" srcset=\"20230825_042932099_iOS.heic-20231117103544-f8rat5y.jpg?size=small, 20230825_042932099_iOS.heic-20231117103544-f8rat5y.jpg?size=medium 1.5x, 20230825_042932099_iOS.heic-20231117103544-f8rat5y.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_042932099_iOS.heic\" data-alt=\"20230825_042932099_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_064047798_iOS.heic-20231117103738-q61x750.jpg\" srcset=\"20230825_064047798_iOS.heic-20231117103738-q61x750.jpg?size=small, 20230825_064047798_iOS.heic-20231117103738-q61x750.jpg?size=medium 1.5x, 20230825_064047798_iOS.heic-20231117103738-q61x750.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_064047798_iOS.heic\" data-alt=\"20230825_064047798_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_044630196_iOS.heic-20231117103623-4hhvq4x.jpg\" srcset=\"20230825_044630196_iOS.heic-20231117103623-4hhvq4x.jpg?size=small, 20230825_044630196_iOS.heic-20231117103623-4hhvq4x.jpg?size=medium 1.5x, 20230825_044630196_iOS.heic-20231117103623-4hhvq4x.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_044630196_iOS.heic\" data-alt=\"20230825_044630196_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e我超,________!\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_044400389_iOS.heic-20231117103608-q8e28bm.jpg\" srcset=\"20230825_044400389_iOS.heic-20231117103608-q8e28bm.jpg?size=small, 20230825_044400389_iOS.heic-20231117103608-q8e28bm.jpg?size=medium 1.5x, 20230825_044400389_iOS.heic-20231117103608-q8e28bm.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_044400389_iOS.heic\" data-alt=\"20230825_044400389_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e来霓虹不进机厅的人生是失败的:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_064656215_iOS.heic-20231117103805-95ra8o8.jpg\" srcset=\"20230825_064656215_iOS.heic-20231117103805-95ra8o8.jpg?size=small, 20230825_064656215_iOS.heic-20231117103805-95ra8o8.jpg?size=medium 1.5x, 20230825_064656215_iOS.heic-20231117103805-95ra8o8.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_064656215_iOS.heic\" data-alt=\"20230825_064656215_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e没带手套,手搓疼了。\u003c/p\u003e\n\u003cp\u003e一天的战利品:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_085442657_iOS.heic-20231117103901-81mcah2.jpg\" srcset=\"20230825_085442657_iOS.heic-20231117103901-81mcah2.jpg?size=small, 20230825_085442657_iOS.heic-20231117103901-81mcah2.jpg?size=medium 1.5x, 20230825_085442657_iOS.heic-20231117103901-81mcah2.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_085442657_iOS.heic\" data-alt=\"20230825_085442657_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e阳哥:你在日本买国内游戏周边❓\u003c/p\u003e\n\u003cp\u003e:可这是 Sweets Paradise 联名欸,国内又不卖\u003c/p\u003e\n\u003cp\u003e阳哥:sb二次元\u003c/p\u003e\n\u003cp\u003e:你给你手办扔了再说话\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e晚上随便对付了两口,打算去天空树。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e阳哥:看看地图咋走\u003c/p\u003e\n\u003cp\u003e:还用看地图?你看天上那个一直发光的是啥\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_103517144_iOS.heic-20231117104136-2407d96.jpg\" srcset=\"20230825_103517144_iOS.heic-20231117104136-2407d96.jpg?size=small, 20230825_103517144_iOS.heic-20231117104136-2407d96.jpg?size=medium 1.5x, 20230825_103517144_iOS.heic-20231117104136-2407d96.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_103517144_iOS.heic\" data-alt=\"20230825_103517144_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e看着好像挺近的,给我俩腿都快走断了。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_104025118_iOS.heic-20231117104221-p8hbk3c.jpg\" srcset=\"20230825_104025118_iOS.heic-20231117104221-p8hbk3c.jpg?size=small, 20230825_104025118_iOS.heic-20231117104221-p8hbk3c.jpg?size=medium 1.5x, 20230825_104025118_iOS.heic-20231117104221-p8hbk3c.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_104025118_iOS.heic\" data-alt=\"20230825_104025118_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_105710747_iOS.heic-20231117104225-m7l87lv.jpg\" srcset=\"20230825_105710747_iOS.heic-20231117104225-m7l87lv.jpg?size=small, 20230825_105710747_iOS.heic-20231117104225-m7l87lv.jpg?size=medium 1.5x, 20230825_105710747_iOS.heic-20231117104225-m7l87lv.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_105710747_iOS.heic\" data-alt=\"20230825_105710747_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e登塔要1200円的门票,由于在大晚上顶层不开放,只能坐到350m高的中层。\u003c/p\u003e\n\u003cp\u003e一眼望不到边际的城市,太震撼了。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_112233616_iOS.heic-20231117104353-h7yg0jh.jpg\" srcset=\"20230825_112233616_iOS.heic-20231117104353-h7yg0jh.jpg?size=small, 20230825_112233616_iOS.heic-20231117104353-h7yg0jh.jpg?size=medium 1.5x, 20230825_112233616_iOS.heic-20231117104353-h7yg0jh.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_112233616_iOS.heic\" data-alt=\"20230825_112233616_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e上面还设了一个许愿台\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_112348069_iOS.heic-20231117104438-sjegazz.jpg\" srcset=\"20230825_112348069_iOS.heic-20231117104438-sjegazz.jpg?size=small, 20230825_112348069_iOS.heic-20231117104438-sjegazz.jpg?size=medium 1.5x, 20230825_112348069_iOS.heic-20231117104438-sjegazz.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_112348069_iOS.heic\" data-alt=\"20230825_112348069_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e买了根带子,这布条上写字太难写了。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_113037714_iOS.heic-20231118105301-hwbjvgf.jpg\" srcset=\"20230825_113037714_iOS.heic-20231118105301-hwbjvgf.jpg?size=small, 20230825_113037714_iOS.heic-20231118105301-hwbjvgf.jpg?size=medium 1.5x, 20230825_113037714_iOS.heic-20231118105301-hwbjvgf.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_113037714_iOS.heic\" data-alt=\"20230825_113037714_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003ch3 id=\"08-26-明治神宫---涩谷---新宿---下北泽\"\u003e08-26 明治神宫 - 涩谷 - 新宿 - 下北泽\u003c/h3\u003e\n\u003cp\u003e今天约了一个在日本留学的高中同学一起,大概早上十点左右出发的,接近中午的时候到了明治神宫站。\u003c/p\u003e\n\u003cp\u003e去明治神宫的路上,坐地铁看到了一堆熟悉的番,似乎是卡牌游戏联动:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_025717934_iOS.heic-20231118105358-zn22dsf.jpg\" srcset=\"20230826_025717934_iOS.heic-20231118105358-zn22dsf.jpg?size=small, 20230826_025717934_iOS.heic-20231118105358-zn22dsf.jpg?size=medium 1.5x, 20230826_025717934_iOS.heic-20231118105358-zn22dsf.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_025717934_iOS.heic\" data-alt=\"20230826_025717934_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e看到了很有钱的二次元(羡慕死了)\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_031841179_iOS.heic-20231118105627-cxe6vzz.jpg\" srcset=\"20230826_031841179_iOS.heic-20231118105627-cxe6vzz.jpg?size=small, 20230826_031841179_iOS.heic-20231118105627-cxe6vzz.jpg?size=medium 1.5x, 20230826_031841179_iOS.heic-20231118105627-cxe6vzz.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_031841179_iOS.heic\" data-alt=\"20230826_031841179_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e刚出地铁站,就听见外面震天响,原来是有露天表演:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_032103969_iOS.heic-20231118105805-16bnpt2.jpg\" srcset=\"20230826_032103969_iOS.heic-20231118105805-16bnpt2.jpg?size=small, 20230826_032103969_iOS.heic-20231118105805-16bnpt2.jpg?size=medium 1.5x, 20230826_032103969_iOS.heic-20231118105805-16bnpt2.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_032103969_iOS.heic\" data-alt=\"20230826_032103969_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e本来应该先去明治神宫打个卡的,但是饿了,于是去了一个很二次元的街道\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_033550616_iOS.heic-20231118105853-ljjbsmv.jpg\" srcset=\"20230826_033550616_iOS.heic-20231118105853-ljjbsmv.jpg?size=small, 20230826_033550616_iOS.heic-20231118105853-ljjbsmv.jpg?size=medium 1.5x, 20230826_033550616_iOS.heic-20231118105853-ljjbsmv.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_033550616_iOS.heic\" data-alt=\"20230826_033550616_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_034209909_iOS.heic-20231118105858-i3x0ktf.jpg\" srcset=\"20230826_034209909_iOS.heic-20231118105858-i3x0ktf.jpg?size=small, 20230826_034209909_iOS.heic-20231118105858-i3x0ktf.jpg?size=medium 1.5x, 20230826_034209909_iOS.heic-20231118105858-i3x0ktf.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_034209909_iOS.heic\" data-alt=\"20230826_034209909_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e然后找到了一家和牛店。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_040355893_iOS.heic-20231118110030-5wgrrxu.jpg\" srcset=\"20230826_040355893_iOS.heic-20231118110030-5wgrrxu.jpg?size=small, 20230826_040355893_iOS.heic-20231118110030-5wgrrxu.jpg?size=medium 1.5x, 20230826_040355893_iOS.heic-20231118110030-5wgrrxu.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_040355893_iOS.heic\" data-alt=\"20230826_040355893_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:我测,时薪65RMB,不要工作经验不要简历,会笑就行?\u003c/p\u003e\n\u003cp\u003e阳哥:我测\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_042005449_iOS.heic-20231118110139-0obx67z.jpg\" srcset=\"20230826_042005449_iOS.heic-20231118110139-0obx67z.jpg?size=small, 20230826_042005449_iOS.heic-20231118110139-0obx67z.jpg?size=medium 1.5x, 20230826_042005449_iOS.heic-20231118110139-0obx67z.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_042005449_iOS.heic\" data-alt=\"20230826_042005449_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_042245018_iOS.heic-20231118110144-2z2mb3v.jpg\" srcset=\"20230826_042245018_iOS.heic-20231118110144-2z2mb3v.jpg?size=small, 20230826_042245018_iOS.heic-20231118110144-2z2mb3v.jpg?size=medium 1.5x, 20230826_042245018_iOS.heic-20231118110144-2z2mb3v.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_042245018_iOS.heic\" data-alt=\"20230826_042245018_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e我跟牛聊两句都比这个熟.jpg\u003c/p\u003e\n\u003cp\u003e吃了正宗的日本和牛感觉其实也就那样,也可能是我山猪吃不了细糠。生肉口感怪怪的,希望第二天不会拉肚子(确实没拉)。\u003c/p\u003e\n\u003cp\u003e然后是明治神宫:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_045619018_iOS.heic-20231118110324-76ypsjs.jpg\" srcset=\"20230826_045619018_iOS.heic-20231118110324-76ypsjs.jpg?size=small, 20230826_045619018_iOS.heic-20231118110324-76ypsjs.jpg?size=medium 1.5x, 20230826_045619018_iOS.heic-20231118110324-76ypsjs.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_045619018_iOS.heic\" data-alt=\"20230826_045619018_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_050145216_iOS.heic-20231118110319-djbl2qf.jpg\" srcset=\"20230826_050145216_iOS.heic-20231118110319-djbl2qf.jpg?size=small, 20230826_050145216_iOS.heic-20231118110319-djbl2qf.jpg?size=medium 1.5x, 20230826_050145216_iOS.heic-20231118110319-djbl2qf.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_050145216_iOS.heic\" data-alt=\"20230826_050145216_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e路上见到了一只巨大的乌鸦,而且不怕人:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_050626686_iOS.heic-20231118110350-vpeq6rx.jpg\" srcset=\"20230826_050626686_iOS.heic-20231118110350-vpeq6rx.jpg?size=small, 20230826_050626686_iOS.heic-20231118110350-vpeq6rx.jpg?size=medium 1.5x, 20230826_050626686_iOS.heic-20231118110350-vpeq6rx.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_050626686_iOS.heic\" data-alt=\"20230826_050626686_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e本来想摸摸来着,但是它好像很有敌意,就没敢碰它。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e阳哥:乌鸦又不是啥好东西\u003c/p\u003e\n\u003cp\u003e:乌鸦在日本的含义好像是翻过来的,代表好运\u003c/p\u003e\n\u003cp\u003e阳哥:你小心它跟你屁股后面飞回国,就不是好运了\u003c/p\u003e\n\u003cp\u003e:❓\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_052045118_iOS.heic-20231118110525-us3y18q.jpg\" srcset=\"20230826_052045118_iOS.heic-20231118110525-us3y18q.jpg?size=small, 20230826_052045118_iOS.heic-20231118110525-us3y18q.jpg?size=medium 1.5x, 20230826_052045118_iOS.heic-20231118110525-us3y18q.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_052045118_iOS.heic\" data-alt=\"20230826_052045118_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e从明治神宫出来往北,到了一个很著名的高档餐厅 \u003ca href=\"https://www.robuchon.jp/en/shop-list/latable\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eLA TABLE de Joël Robuchon\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_060226211_iOS.heic-20231118110733-gtttaek.jpg\" srcset=\"20230826_060226211_iOS.heic-20231118110733-gtttaek.jpg?size=small, 20230826_060226211_iOS.heic-20231118110733-gtttaek.jpg?size=medium 1.5x, 20230826_060226211_iOS.heic-20231118110733-gtttaek.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_060226211_iOS.heic\" data-alt=\"20230826_060226211_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_060458670_iOS.heic-20231118110738-05xd78z.jpg\" srcset=\"20230826_060458670_iOS.heic-20231118110738-05xd78z.jpg?size=small, 20230826_060458670_iOS.heic-20231118110738-05xd78z.jpg?size=medium 1.5x, 20230826_060458670_iOS.heic-20231118110738-05xd78z.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_060458670_iOS.heic\" data-alt=\"20230826_060458670_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e在外面拍了两张照就跑了。\u003c/p\u003e\n\u003cp\u003e听说这餐厅得提前好久预约,花销不是一般人能负担的。\u003c/p\u003e\n\u003cp\u003e很繁华的涩谷:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_065539443_iOS.heic-20231118110850-ilr4mfz.jpg\" srcset=\"20230826_065539443_iOS.heic-20231118110850-ilr4mfz.jpg?size=small, 20230826_065539443_iOS.heic-20231118110850-ilr4mfz.jpg?size=medium 1.5x, 20230826_065539443_iOS.heic-20231118110850-ilr4mfz.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_065539443_iOS.heic\" data-alt=\"20230826_065539443_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e本来想去最高的那层楼看看,但是今天不开放,于是作罢,直接奔着下北泽去了。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_075026654_iOS.heic-20231118110926-2qvp58a.jpg\" srcset=\"20230826_075026654_iOS.heic-20231118110926-2qvp58a.jpg?size=small, 20230826_075026654_iOS.heic-20231118110926-2qvp58a.jpg?size=medium 1.5x, 20230826_075026654_iOS.heic-20231118110926-2qvp58a.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_075026654_iOS.heic\" data-alt=\"20230826_075026654_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e下北泽!\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_075033042_iOS.heic-20231118110935-6xyuulj.jpg\" srcset=\"20230826_075033042_iOS.heic-20231118110935-6xyuulj.jpg?size=small, 20230826_075033042_iOS.heic-20231118110935-6xyuulj.jpg?size=medium 1.5x, 20230826_075033042_iOS.heic-20231118110935-6xyuulj.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_075033042_iOS.heic\" data-alt=\"20230826_075033042_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e本多剧场!\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_075434668_iOS.heic-20231118110952-jjiez34.jpg\" srcset=\"20230826_075434668_iOS.heic-20231118110952-jjiez34.jpg?size=small, 20230826_075434668_iOS.heic-20231118110952-jjiez34.jpg?size=medium 1.5x, 20230826_075434668_iOS.heic-20231118110952-jjiez34.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_075434668_iOS.heic\" data-alt=\"20230826_075434668_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_075542515_iOS.heic-20231118111001-auak4jf.jpg\" srcset=\"20230826_075542515_iOS.heic-20231118111001-auak4jf.jpg?size=small, 20230826_075542515_iOS.heic-20231118111001-auak4jf.jpg?size=medium 1.5x, 20230826_075542515_iOS.heic-20231118111001-auak4jf.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_075542515_iOS.heic\" data-alt=\"20230826_075542515_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_075618796_iOS.heic-20231118111005-3d5mq1j.jpg\" srcset=\"20230826_075618796_iOS.heic-20231118111005-3d5mq1j.jpg?size=small, 20230826_075618796_iOS.heic-20231118111005-3d5mq1j.jpg?size=medium 1.5x, 20230826_075618796_iOS.heic-20231118111005-3d5mq1j.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_075618796_iOS.heic\" data-alt=\"20230826_075618796_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e‍\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_080430491_iOS.heic-20231118111024-fb3zj5h.jpg\" srcset=\"20230826_080430491_iOS.heic-20231118111024-fb3zj5h.jpg?size=small, 20230826_080430491_iOS.heic-20231118111024-fb3zj5h.jpg?size=medium 1.5x, 20230826_080430491_iOS.heic-20231118111024-fb3zj5h.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_080430491_iOS.heic\" data-alt=\"20230826_080430491_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_081159763_iOS.heic-20231118111044-7j7r0es.jpg\" srcset=\"20230826_081159763_iOS.heic-20231118111044-7j7r0es.jpg?size=small, 20230826_081159763_iOS.heic-20231118111044-7j7r0es.jpg?size=medium 1.5x, 20230826_081159763_iOS.heic-20231118111044-7j7r0es.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_081159763_iOS.heic\" data-alt=\"20230826_081159763_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e晚上去了歌舞伎厅一番街:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_091904664_iOS.heic-20231118111222-ta2w9li.jpg\" srcset=\"20230826_091904664_iOS.heic-20231118111222-ta2w9li.jpg?size=small, 20230826_091904664_iOS.heic-20231118111222-ta2w9li.jpg?size=medium 1.5x, 20230826_091904664_iOS.heic-20231118111222-ta2w9li.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_091904664_iOS.heic\" data-alt=\"20230826_091904664_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e腿都要逛断了。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e阳哥:腿快断了\u003c/p\u003e\n\u003cp\u003e:别啊,明天还要去七里浜呢\u003c/p\u003e\n\u003cp\u003e阳哥:你自己去,我动不了了\u003c/p\u003e\n\u003cp\u003e:❓麻衣学姐你都不去看看❓\u003c/p\u003e\n\u003cp\u003e阳哥:我又没看过那番\u003c/p\u003e\n\u003cp\u003e:❓你是不是二次元啊\u003c/p\u003e\n\u003cp\u003e阳哥:啥B二次元\u003c/p\u003e\n\u003cp\u003e:\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_133638812_iOS.heic-20231118111443-zu7fwqe.jpg\" srcset=\"20230826_133638812_iOS.heic-20231118111443-zu7fwqe.jpg?size=small, 20230826_133638812_iOS.heic-20231118111443-zu7fwqe.jpg?size=medium 1.5x, 20230826_133638812_iOS.heic-20231118111443-zu7fwqe.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_133638812_iOS.heic\" data-alt=\"20230826_133638812_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003ch3 id=\"08-27-镰仓---七里浜---踢你的肾不是\"\u003e08-27 镰仓 - 七里浜 - 踢你的肾(不是\u003c/h3\u003e\n\u003cp\u003e因为阳哥实在不想动,我就一个人出发了。坐中央-总武线到镰仓,然后再坐江之岛电铁去七里浜。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_023916507_iOS.heic-20231118114752-8zt2svh.jpg\" srcset=\"20230827_023916507_iOS.heic-20231118114752-8zt2svh.jpg?size=small, 20230827_023916507_iOS.heic-20231118114752-8zt2svh.jpg?size=medium 1.5x, 20230827_023916507_iOS.heic-20231118114752-8zt2svh.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_023916507_iOS.heic\" data-alt=\"20230827_023916507_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e我是从新日本桥上的车,然后听见车到东京了,觉得自己没坐错方向。结果坐了几站之后发现自己到了一个什么什么町站?草,这趟车到东京之后又掉头开回去了!\u003c/p\u003e\n\u003cp\u003e最终折腾了几趟,终于坐对了车,来到了镰仓。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_044705139_iOS.heic-20231118115101-bsj22pf.jpg\" srcset=\"20230827_044705139_iOS.heic-20231118115101-bsj22pf.jpg?size=small, 20230827_044705139_iOS.heic-20231118115101-bsj22pf.jpg?size=medium 1.5x, 20230827_044705139_iOS.heic-20231118115101-bsj22pf.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_044705139_iOS.heic\" data-alt=\"20230827_044705139_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e江之岛电铁上人挤人,排了两趟车才挤上去。\u003c/p\u003e\n\u003cp\u003e然后到了七里浜\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_051750732_iOS.heic-20231118115317-dukwmql.jpg\" srcset=\"20230827_051750732_iOS.heic-20231118115317-dukwmql.jpg?size=small, 20230827_051750732_iOS.heic-20231118115317-dukwmql.jpg?size=medium 1.5x, 20230827_051750732_iOS.heic-20231118115317-dukwmql.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_051750732_iOS.heic\" data-alt=\"20230827_051750732_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_052232001_iOS.heic-20231118115308-jwb5u60.jpg\" srcset=\"20230827_052232001_iOS.heic-20231118115308-jwb5u60.jpg?size=small, 20230827_052232001_iOS.heic-20231118115308-jwb5u60.jpg?size=medium 1.5x, 20230827_052232001_iOS.heic-20231118115308-jwb5u60.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_052232001_iOS.heic\" data-alt=\"20230827_052232001_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​\u003c/p\u003e\n\u003cp\u003e七里浜站出来,旁边就是学姐的学校\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_052031568_iOS.heic-20231118115224-ptxtkcg.jpg\" srcset=\"20230827_052031568_iOS.heic-20231118115224-ptxtkcg.jpg?size=small, 20230827_052031568_iOS.heic-20231118115224-ptxtkcg.jpg?size=medium 1.5x, 20230827_052031568_iOS.heic-20231118115224-ptxtkcg.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_052031568_iOS.heic\" data-alt=\"20230827_052031568_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e可惜不让进,不过还是能看到一点教学楼和操场。\u003c/p\u003e\n\u003cp\u003e从七里浜站往前走,就是那个沙滩:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_062917601_iOS.heic-20231118115353-zjauvvo.jpg\" srcset=\"20230827_062917601_iOS.heic-20231118115353-zjauvvo.jpg?size=small, 20230827_062917601_iOS.heic-20231118115353-zjauvvo.jpg?size=medium 1.5x, 20230827_062917601_iOS.heic-20231118115353-zjauvvo.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_062917601_iOS.heic\" data-alt=\"20230827_062917601_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e内陆孩子这辈子第一次实际意义上的见大海,没想到是在这里。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_054929938_iOS.heic-20231118115409-krfcay5.jpg\" srcset=\"20230827_054929938_iOS.heic-20231118115409-krfcay5.jpg?size=small, 20230827_054929938_iOS.heic-20231118115409-krfcay5.jpg?size=medium 1.5x, 20230827_054929938_iOS.heic-20231118115409-krfcay5.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_054929938_iOS.heic\" data-alt=\"20230827_054929938_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e远处的江之岛:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_055450377_iOS.heic-20231118115609-4z2av2d.jpg\" srcset=\"20230827_055450377_iOS.heic-20231118115609-4z2av2d.jpg?size=small, 20230827_055450377_iOS.heic-20231118115609-4z2av2d.jpg?size=medium 1.5x, 20230827_055450377_iOS.heic-20231118115609-4z2av2d.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_055450377_iOS.heic\" data-alt=\"20230827_055450377_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e我从七里浜下车,沿着电铁线和海边慢慢往藤泽方向走,一路上打卡了很多经典场景。\u003c/p\u003e\n\u003cp\u003e学姐拍广告的地方:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_054027049_iOS.heic-20231118115504-te6grlw.jpg\" srcset=\"20230827_054027049_iOS.heic-20231118115504-te6grlw.jpg?size=small, 20230827_054027049_iOS.heic-20231118115504-te6grlw.jpg?size=medium 1.5x, 20230827_054027049_iOS.heic-20231118115504-te6grlw.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_054027049_iOS.heic\" data-alt=\"20230827_054027049_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_064931733_iOS.heic-20231118115706-fo9m2ja.jpg\" srcset=\"20230827_064931733_iOS.heic-20231118115706-fo9m2ja.jpg?size=small, 20230827_064931733_iOS.heic-20231118115706-fo9m2ja.jpg?size=medium 1.5x, 20230827_064931733_iOS.heic-20231118115706-fo9m2ja.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_064931733_iOS.heic\" data-alt=\"20230827_064931733_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e踢你的肾(不是\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_065855717_iOS.heic-20231118115747-lpbxx35.jpg\" srcset=\"20230827_065855717_iOS.heic-20231118115747-lpbxx35.jpg?size=small, 20230827_065855717_iOS.heic-20231118115747-lpbxx35.jpg?size=medium 1.5x, 20230827_065855717_iOS.heic-20231118115747-lpbxx35.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_065855717_iOS.heic\" data-alt=\"20230827_065855717_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e电铁在马路中央开:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_070615407_iOS.heic-20231118115840-6uwegmh.jpg\" srcset=\"20230827_070615407_iOS.heic-20231118115840-6uwegmh.jpg?size=small, 20230827_070615407_iOS.heic-20231118115840-6uwegmh.jpg?size=medium 1.5x, 20230827_070615407_iOS.heic-20231118115840-6uwegmh.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_070615407_iOS.heic\" data-alt=\"20230827_070615407_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e藤泽站:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_073113085_iOS.heic-20231118115858-rl2snkx.jpg\" srcset=\"20230827_073113085_iOS.heic-20231118115858-rl2snkx.jpg?size=small, 20230827_073113085_iOS.heic-20231118115858-rl2snkx.jpg?size=medium 1.5x, 20230827_073113085_iOS.heic-20231118115858-rl2snkx.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_073113085_iOS.heic\" data-alt=\"20230827_073113085_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e想在藤泽市找找学姐住的地方和那个“击股之交”的健身器材场,可惜对着番剧和地图找了一大圈,没找到。\u003c/p\u003e\n\u003cp\u003e于是回去了。\u003c/p\u003e\n\u003cp\u003e路上看到了天空树在云层上面发出的光。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_123107618_iOS.heic-20231118120040-t54zkj5.jpg\" srcset=\"20230827_123107618_iOS.heic-20231118120040-t54zkj5.jpg?size=small, 20230827_123107618_iOS.heic-20231118120040-t54zkj5.jpg?size=medium 1.5x, 20230827_123107618_iOS.heic-20231118120040-t54zkj5.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_123107618_iOS.heic\" data-alt=\"20230827_123107618_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e公园里有很多人在聚团玩烟花。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_123701992_iOS.heic-20231118120115-w23hqxz.jpg\" srcset=\"20230827_123701992_iOS.heic-20231118120115-w23hqxz.jpg?size=small, 20230827_123701992_iOS.heic-20231118120115-w23hqxz.jpg?size=medium 1.5x, 20230827_123701992_iOS.heic-20231118120115-w23hqxz.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_123701992_iOS.heic\" data-alt=\"20230827_123701992_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003ch2 id=\"东京--京都\"\u003e东京 京都\u003c/h2\u003e\n\u003ch3 id=\"08-28-京都---清水寺\"\u003e08-28 京都 - 清水寺\u003c/h3\u003e\n\u003cp\u003e一早就收拾东西退房去京都了。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230828_080148066_iOS.heic-20231118120802-nvq1q55.jpg\" srcset=\"20230828_080148066_iOS.heic-20231118120802-nvq1q55.jpg?size=small, 20230828_080148066_iOS.heic-20231118120802-nvq1q55.jpg?size=medium 1.5x, 20230828_080148066_iOS.heic-20231118120802-nvq1q55.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230828_080148066_iOS.heic\" data-alt=\"20230828_080148066_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230828_081002052_iOS.heic-20231118120810-kw70kfm.jpg\" srcset=\"20230828_081002052_iOS.heic-20231118120810-kw70kfm.jpg?size=small, 20230828_081002052_iOS.heic-20231118120810-kw70kfm.jpg?size=medium 1.5x, 20230828_081002052_iOS.heic-20231118120810-kw70kfm.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230828_081002052_iOS.heic\" data-alt=\"20230828_081002052_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e还有马厩:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230828_081201910_iOS.heic-20231118120819-7pb6kgv.jpg\" srcset=\"20230828_081201910_iOS.heic-20231118120819-7pb6kgv.jpg?size=small, 20230828_081201910_iOS.heic-20231118120819-7pb6kgv.jpg?size=medium 1.5x, 20230828_081201910_iOS.heic-20231118120819-7pb6kgv.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230828_081201910_iOS.heic\" data-alt=\"20230828_081201910_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e给父母买了点纪念品\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230828_085145101_iOS.heic-20231118120837-4l7ywhn.jpg\" srcset=\"20230828_085145101_iOS.heic-20231118120837-4l7ywhn.jpg?size=small, 20230828_085145101_iOS.heic-20231118120837-4l7ywhn.jpg?size=medium 1.5x, 20230828_085145101_iOS.heic-20231118120837-4l7ywhn.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230828_085145101_iOS.heic\" data-alt=\"20230828_085145101_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e还尝了尝抹茶\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230828_090353212_iOS.heic-20231118120847-8cj9k3b.jpg\" srcset=\"20230828_090353212_iOS.heic-20231118120847-8cj9k3b.jpg?size=small, 20230828_090353212_iOS.heic-20231118120847-8cj9k3b.jpg?size=medium 1.5x, 20230828_090353212_iOS.heic-20231118120847-8cj9k3b.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230828_090353212_iOS.heic\" data-alt=\"20230828_090353212_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e感觉……不好喝。\u003c/p\u003e\n\u003cp\u003e很像天气之子,立体感很强的云:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230828_093404251_iOS.heic-20231118120921-hdlidhd.jpg\" srcset=\"20230828_093404251_iOS.heic-20231118120921-hdlidhd.jpg?size=small, 20230828_093404251_iOS.heic-20231118120921-hdlidhd.jpg?size=medium 1.5x, 20230828_093404251_iOS.heic-20231118120921-hdlidhd.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230828_093404251_iOS.heic\" data-alt=\"20230828_093404251_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e叫蒟蒻的糖:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230828_153228342_iOS.heic-20231118120936-fkk5hay.jpg\" srcset=\"20230828_153228342_iOS.heic-20231118120936-fkk5hay.jpg?size=small, 20230828_153228342_iOS.heic-20231118120936-fkk5hay.jpg?size=medium 1.5x, 20230828_153228342_iOS.heic-20231118120936-fkk5hay.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230828_153228342_iOS.heic\" data-alt=\"20230828_153228342_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e可惜去的时候太晚了,御守并没有求到,打算第二天再去。\u003c/p\u003e\n\u003ch3 id=\"08-29-还是清水寺\"\u003e08-29 还是清水寺\u003c/h3\u003e\n\u003cp\u003e先去吃了个午饭,好像是什么什么面:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230829_053952209_iOS.heic-20231118121735-6puni2q.jpg\" srcset=\"20230829_053952209_iOS.heic-20231118121735-6puni2q.jpg?size=small, 20230829_053952209_iOS.heic-20231118121735-6puni2q.jpg?size=medium 1.5x, 20230829_053952209_iOS.heic-20231118121735-6puni2q.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230829_053952209_iOS.heic\" data-alt=\"20230829_053952209_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e结果尝了一口面,什么味道也没有,又尝了一口右下角碗里的汤,差点给我齁死,然后才恍然大悟,好像是蘸着面吃的。\u003c/p\u003e\n\u003cp\u003e还挺好吃。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230829_054228389_iOS.heic-20231118121825-bdlsch3.jpg\" srcset=\"20230829_054228389_iOS.heic-20231118121825-bdlsch3.jpg?size=small, 20230829_054228389_iOS.heic-20231118121825-bdlsch3.jpg?size=medium 1.5x, 20230829_054228389_iOS.heic-20231118121825-bdlsch3.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230829_054228389_iOS.heic\" data-alt=\"20230829_054228389_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e听说喝了会宾周发光的日本生可乐:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230829_061429868_iOS.heic-20231118121851-tce3wsh.jpg\" srcset=\"20230829_061429868_iOS.heic-20231118121851-tce3wsh.jpg?size=small, 20230829_061429868_iOS.heic-20231118121851-tce3wsh.jpg?size=medium 1.5x, 20230829_061429868_iOS.heic-20231118121851-tce3wsh.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230829_061429868_iOS.heic\" data-alt=\"20230829_061429868_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e喝完了没感觉出来和普通的可乐有什么区别,碳酸气更足了(?)\u003c/p\u003e\n\u003cp\u003e求了几个御守,回来的时候打算去吃咖喱饭,路上的晚霞很好看:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230829_090917939_iOS.heic-20231118121946-hi8rj0b.jpg\" srcset=\"20230829_090917939_iOS.heic-20231118121946-hi8rj0b.jpg?size=small, 20230829_090917939_iOS.heic-20231118121946-hi8rj0b.jpg?size=medium 1.5x, 20230829_090917939_iOS.heic-20231118121946-hi8rj0b.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230829_090917939_iOS.heic\" data-alt=\"20230829_090917939_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e草,强迫症要犯了\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230829_093107535_iOS.heic-20231118121958-pamf7k3.jpg\" srcset=\"20230829_093107535_iOS.heic-20231118121958-pamf7k3.jpg?size=small, 20230829_093107535_iOS.heic-20231118121958-pamf7k3.jpg?size=medium 1.5x, 20230829_093107535_iOS.heic-20231118121958-pamf7k3.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230829_093107535_iOS.heic\" data-alt=\"20230829_093107535_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e日本咖喱真不错:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230829_093527794_iOS.heic-20231118122016-e4rk1lc.jpg\" srcset=\"20230829_093527794_iOS.heic-20231118122016-e4rk1lc.jpg?size=small, 20230829_093527794_iOS.heic-20231118122016-e4rk1lc.jpg?size=medium 1.5x, 20230829_093527794_iOS.heic-20231118122016-e4rk1lc.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230829_093527794_iOS.heic\" data-alt=\"20230829_093527794_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e三彩团子:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230829_125322871_iOS.heic-20231118122100-8x7zqyl.jpg\" srcset=\"20230829_125322871_iOS.heic-20231118122100-8x7zqyl.jpg?size=small, 20230829_125322871_iOS.heic-20231118122100-8x7zqyl.jpg?size=medium 1.5x, 20230829_125322871_iOS.heic-20231118122100-8x7zqyl.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230829_125322871_iOS.heic\" data-alt=\"20230829_125322871_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003ch2 id=\"京都--大阪--关西--回国\"\u003e京都 大阪 关西 ✈️ 回国\u003c/h2\u003e\n\u003cp\u003e是时候回到社会主义的怀抱了。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230830_080750531_iOS.heic-20231118122143-q3tbx30.jpg\" srcset=\"20230830_080750531_iOS.heic-20231118122143-q3tbx30.jpg?size=small, 20230830_080750531_iOS.heic-20231118122143-q3tbx30.jpg?size=medium 1.5x, 20230830_080750531_iOS.heic-20231118122143-q3tbx30.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230830_080750531_iOS.heic\" data-alt=\"20230830_080750531_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e‍\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/travel_jpn/"}]},{"name":"康师傅","email":"","uri":"https://blog.ksfu.top/","description":"太菜了","article":[{"title":"TeX Live 2023安装\u0026VSCode环境配置记录","time":"2023-11-22T15:00:39Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"TeX-Live-2023安装-amp-VSCode环境配置记录\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/8e96/#TeX-Live-2023%E5%AE%89%E8%A3%85-amp-VSCode%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E8%AE%B0%E5%BD%95\" class=\"headerlink\" title=\"TeX Live 2023安装\u0026amp;VSCode环境配置记录\"\u003e\u003c/a\u003eTeX Live 2023安装\u0026amp;VSCode环境配置记录\u003c/h1\u003e\u003cp\u003e整完了。\u003cdel\u003e还没写完,主要快断电了属于是)\u003c/del\u003e\u003c/p\u003e\u003cp\u003e系统信息: Windows 11 专业版 23H2 22635.2771。\u003c/p\u003e\u003cp\u003e之前机子上装过2021版本,但一直没咋用过)刚好后面要开始用这玩意了,就重新装了一下,顺便配一配环境。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e参考链接:\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://zhuanlan.zhihu.com/p/603669792\"\u003eLaTeX小白兔手册-配置篇 - 知乎 (zhihu.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://zhuanlan.zhihu.com/p/166523064\"\u003eVisual Studio Code (vscode)配置LaTeX - 知乎 (zhihu.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://yangyq.net/2022/05/latex-with-visual-studio-code.html\"\u003e配置Visual Studio Code和LaTex环境 - 老杨说话的地方 (yangyq.net)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://github.com/James-Yu/LaTeX-Workshop/wiki\"\u003eHome · James-Yu/LaTeX-Workshop Wiki (github.com)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"TeX-Live安装\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/8e96/#TeX-Live%E5%AE%89%E8%A3%85\" class=\"headerlink\" title=\"TeX Live安装\"\u003e\u003c/a\u003eTeX Live安装\u003c/h2\u003e\u003cp\u003e首先下载TeX Live 2023镜像,推荐清华镜像站:\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/?C=M\u0026amp;O=A\"\u003eIndex of /CTAN/systems/texlive/Images/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror\u003c/a\u003e \u003c/p\u003e\u003cp\u003e选择\u003ccode\u003etexlive2023.iso\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e下载完成后打开镜像,运行\u003ccode\u003einstall-tl-windows.bat\u003c/code\u003e,\u003c/p\u003e\u003cp\u003e图形界面,操作比较简单,注意选择好安装路径即可,大约需要 \u003cstrong\u003e8G\u003c/strong\u003e 的硬盘空间。\u003c/p\u003e\u003cp\u003e然后安装就行,安装时间比较长,50分钟左右?注意别点 \u003ccode\u003eAbort\u003c/code\u003e ,耐心等着就行。\u003c/p\u003e\u003cp\u003e最后提示 \u003ccode\u003e欢迎进入 Tex Live 的世界!\u003c/code\u003e ,就算是装完了。然后打开终端,输入 \u003ccode\u003e latex -v\u003c/code\u003e 查看版本信息,检查安装是否正常。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003epdfTeX \u003cspan class=\"token number\"\u003e3.141592653\u003c/span\u003e-2.6-1.40.25 \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eTeX Live \u003cspan class=\"token number\"\u003e2023\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003ekpathsea version \u003cspan class=\"token number\"\u003e6.3\u003c/span\u003e.5Copyright \u003cspan class=\"token number\"\u003e2023\u003c/span\u003e Han The Thanh \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003epdfTeX\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e et al.There is NO warranty. Redistribution of this software iscovered by the terms of both the pdfTeX copyright andthe Lesser GNU General Public License.For \u003cspan class=\"token function\"\u003emore\u003c/span\u003e information about these matters, see the \u003cspan class=\"token function\"\u003efile\u003c/span\u003enamed COPYING and the pdfTeX source.Primary author of pdfTeX: Han The Thanh \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003epdfTeX\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e et al.Compiled with libpng \u003cspan class=\"token number\"\u003e1.6\u003c/span\u003e.39\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e using libpng \u003cspan class=\"token number\"\u003e1.6\u003c/span\u003e.39Compiled with zlib \u003cspan class=\"token number\"\u003e1.2\u003c/span\u003e.13\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e using zlib \u003cspan class=\"token number\"\u003e1.2\u003c/span\u003e.13Compiled with xpdf version \u003cspan class=\"token number\"\u003e4.04\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch2 id=\"VSCode配置LaTex环境\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/8e96/#VSCode%E9%85%8D%E7%BD%AELaTex%E7%8E%AF%E5%A2%83\" class=\"headerlink\" title=\"VSCode配置LaTex环境\"\u003e\u003c/a\u003eVSCode配置LaTex环境\u003c/h2\u003e\u003ch3 id=\"LaTeX-Workshop插件配置\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/8e96/#LaTeX-Workshop%E6%8F%92%E4%BB%B6%E9%85%8D%E7%BD%AE\" class=\"headerlink\" title=\"LaTeX Workshop插件配置\"\u003e\u003c/a\u003eLaTeX Workshop插件配置\u003c/h3\u003e\u003cp\u003e打开VScode,在扩展搜索 \u003ccode\u003eLaTeX Workshop\u003c/code\u003e 进行安装。\u003c/p\u003e\u003cp\u003e打开\u003ccode\u003eLaTeX Workshop\u003c/code\u003e 的设置,之后在右上角选择 \u003ccode\u003e打开设置(json)\u003c/code\u003e 。因为配置项比较多,所以直接网上抄设置复制进json(毕竟有159个设置项……\u003c/p\u003e\u003cp\u003e\u003ccode\u003eLaTeX Workshop\u003c/code\u003e Wiki:\u003ca href=\"https://github.com/James-Yu/LaTeX-Workshop/wiki\"\u003eHome · James-Yu/LaTeX-Workshop Wiki (github.com)\u003c/a\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e根据Wiki内容:\u003ca href=\"https://github.com/James-Yu/LaTeX-Workshop/wiki/Install#settings\"\u003ehttps://github.com/James-Yu/LaTeX-Workshop/wiki/Install#settings\u003c/a\u003e\u003c/p\u003e\u003cp\u003eYou can modify settings through the menu of VS Code, \u003ccode\u003ePreferences \u0026gt; Settings\u003c/code\u003e. You can also modify settings by directly editing \u003ccode\u003esettings.json\u003c/code\u003e. See an \u003ca href=\"https://code.visualstudio.com/docs/getstarted/settings#_settings-file-locations\"\u003eofficial document\u003c/a\u003e for the location of \u003ccode\u003esettings.json\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eYou can also have different settings for each project with \u003ccode\u003e.vscode/settings.json\u003c/code\u003e at the root of each project workspace. See an \u003ca href=\"https://code.visualstudio.com/docs/getstarted/settings#_settings-file-locations\"\u003eofficial document\u003c/a\u003e.\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e有两种修改VSCode设置的方式,一种是直接修改,全局生效的这种。另一种是针对不同工程使用不同配置,需要在工程下建立名为 \u003ccode\u003e.vscode\u003c/code\u003e 的文件夹,建立 \u003ccode\u003esettings.json\u003c/code\u003e 进行设置。我们选择第一种。\u003c/p\u003e\u003cp\u003e注意编辑json文件时要注意格式,如果文件内有其他配置,跟后面就行,别直接复制进去给覆盖掉)然后记得配置复制到最外头的大括号里面( \u003cstrong\u003e\u003ccode\u003e{其他配置,你的配置}\u003c/code\u003e\u003c/strong\u003e )。\u003c/p\u003e\u003cp\u003e到处借鉴然后揉了点适合自己的配置:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token comment\"\u003e//---------LaTeX Workshop 配置开始-----------\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 设置是否自动编译,可选:\u0026#34;never\u0026#34;, \u0026#34;onSave\u0026#34;, \u0026#34;onFileChange\u0026#34;\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.latex.autoBuild.run\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;never\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//文件输出路径,会自动创建temp文件\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//\u0026#34;latex-workshop.latex.outDir\u0026#34;: \u0026#34;./temp\u0026#34;,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//右键菜单\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.showContextMenu\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token boolean\"\u003etrue\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//从使用的包中自动补全命令和环境\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.intellisense.package.enabled\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token boolean\"\u003etrue\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//编译出错时设置是否弹出气泡设置\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.message.error.show\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.message.warning.show\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 编译工具和命令\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.latex.tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;args\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-shell-escape\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//加上这句,以使用minted宏包\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-8bit\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//防止minted宏包转义特殊字符\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-synctex=1\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-interaction=nonstopmode\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-file-line-error\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//\u0026#34;-output-directory=temp\u0026#34;, //自定义辅助文件输出路径\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//\u0026#34;-outdir=%OUTDIR%\u0026#34;, //辅助文件输出路径\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;%DOCFILE%\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;args\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-shell-escape\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//加上这句,以使用minted宏包\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-8bit\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//防止minted宏包转义特殊字符\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-synctex=1\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-interaction=nonstopmode\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-file-line-error\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//\u0026#34;-output-directory=temp\u0026#34;, //自定义辅助文件输出路径\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//\u0026#34;-outdir=%OUTDIR%\u0026#34;, //辅助文件输出路径\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;%DOCFILE%\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;latexmk\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;latexmk\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;args\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-synctex=1\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-interaction=nonstopmode\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-file-line-error\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-pdf\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-outdir=%OUTDIR%\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;%DOCFILE%\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;bibtex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;bibtex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;args\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;%DOCFILE%\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 用于配置编译链\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.latex.recipes\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;XeLaTeX\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;XeLaTeX*2\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;PDFLaTeX\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;PDFLaTeX*2\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;BibTeX\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;bibtex\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;LaTeXmk\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;latexmk\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex -\u0026gt; bibtex -\u0026gt; xelatex*2\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;bibtex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex -\u0026gt; bibtex -\u0026gt; pdflatex*2\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;bibtex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//文件清理。此属性必须是字符串数组\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.latex.clean.fileTypes\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//\u0026#34;*.aux\u0026#34;,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.bbl\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.blg\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.idx\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.ind\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.lof\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.lot\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//\u0026#34;*.out\u0026#34;,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.toc\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.acn\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.acr\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.alg\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.glg\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.glo\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.gls\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.ist\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.fls\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.log\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.fdb_latexmk\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//设置为onFaild 在构建失败后清除辅助文件\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.latex.autoClean.run\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;onFailed\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 使用上次的recipe编译组合\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.latex.recipe.default\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;lastUsed\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 用于反向同步的内部查看器的键绑定。ctrl/cmd +点击(默认)或双击\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.view.pdf.internal.synctex.keybinding\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;double-click\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//设置查看PDF的工具,可选\u0026#34;browser\u0026#34;,\u0026#34;tab\u0026#34;,\u0026#34;external\u0026#34;\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.view.pdf.viewer\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;tab\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//---------LaTeX Workshop 配置结束-----------\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"配置相关内容解释\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/8e96/#%E9%85%8D%E7%BD%AE%E7%9B%B8%E5%85%B3%E5%86%85%E5%AE%B9%E8%A7%A3%E9%87%8A\" class=\"headerlink\" title=\"配置相关内容解释\"\u003e\u003c/a\u003e配置相关内容解释\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e\u0026#34;latex-workshop.latex.tools\u0026#34;\u003c/code\u003e\u003c/strong\u003e :是编译使用的工具,\u003ccode\u003elatexmk\u003c/code\u003e、\u003ccode\u003exelatex\u003c/code\u003e、\u003ccode\u003epdflatex\u003c/code\u003e、\u003ccode\u003ebibtex\u003c/code\u003e 都是常用的编译命令,它们编译的方式不一样。\u003ccode\u003ebibtex\u003c/code\u003e 能用来生成参考文献,\u003ccode\u003elatexmk\u003c/code\u003e、\u003ccode\u003exelatex\u003c/code\u003e、\u003ccode\u003epdflatex\u003c/code\u003e 中只有 \u003ccode\u003exelatex\u003c/code\u003e 较好适合中文,但编译速度 \u003ccode\u003epdflatex\u003c/code\u003e 比 \u003ccode\u003exelatex\u003c/code\u003e 快。\u003ccode\u003eargs\u003c/code\u003e 里是一些参数,可以根据实际情况改,比如在 \u003ccode\u003exelatex\u003c/code\u003e、\u003ccode\u003epdflatex\u003c/code\u003e 的 \u003ccode\u003eargs\u003c/code\u003e 里加了一句\u003ccode\u003e”-shell-escape”\u003c/code\u003e,是为了支持使用 \u003ccode\u003eminted 宏包\u003c/code\u003e(用来代码高亮等)。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e\u0026#34;latex-workshop.latex.recipes\u0026#34;\u003c/code\u003e\u003c/strong\u003e 是编译使用的命令序列,就是 \u003ccode\u003elatexmk\u003c/code\u003e、\u003ccode\u003exelatex\u003c/code\u003e、\u003ccode\u003epdflatex\u003c/code\u003e、\u003ccode\u003ebibtex\u003c/code\u003e 的组合。首先要知道,编译一个\u003ccode\u003e.tex\u003c/code\u003e 文件,用一个编译命令是不够的,当要生成目录时,一般是要用 \u003ccode\u003epdflatex\u003c/code\u003e 或 \u003ccode\u003exelatex\u003c/code\u003e 等编译源代码 2 次,第 1 次生成了辅助文件记录目录等信息,第 2 次才会生成目录;当要生成参考文献时,要编译 4 次,第 1 次用 \u003ccode\u003epdflatex\u003c/code\u003e 或 \u003ccode\u003exelatex\u003c/code\u003e 等编译源代码,第 2 次用 \u003ccode\u003ebibtex\u003c/code\u003e 命令处理\u003ccode\u003e.aux\u003c/code\u003e 辅助文件记录的\u003cbr/\u003e参考文献格式、引用条目等信息,接下来再用 \u003ccode\u003epdflatex\u003c/code\u003e 或 \u003ccode\u003exelatex\u003c/code\u003e 等编译源代码 2 次读入参考文献并生成引用。我们这里定义、添加了 8 种方法:\u003c/p\u003e\u003col\u003e\u003cli\u003e一次 \u003ccode\u003eXeLaTeX\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003eXeLaTeX*2\u003c/code\u003e\u003c/li\u003e\u003cli\u003e一次 \u003ccode\u003ePDFLaTeX\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003ePDFLaTeX*2\u003c/code\u003e\u003c/li\u003e\u003cli\u003e一次 \u003ccode\u003eBibTeX\u003c/code\u003e\u003c/li\u003e\u003cli\u003e一次 \u003ccode\u003eLaTeXmk\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003exelatex -\u0026gt; bibtex -\u0026gt; xelatex*2\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003epdflatex -\u0026gt; bibtex -\u0026gt; pdflatex*2\u003c/code\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e其中第一个的是默认编译命令,因为处理中文文档,所以把一次 \u003ccode\u003eXeLaTeX\u003c/code\u003e 放在第一位。当你使用 TeXstudio 时你不必在乎这些,因为它会自动为你进行多次编译。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e\u0026#34;latex-workshop.view.pdf.viewer\u0026#34;\u003c/code\u003e\u003c/strong\u003e 是用来查看 PDF 的工具,我们这里采用 \u003ccode\u003e\u0026#34;tab\u0026#34;\u003c/code\u003e(内置阅读器)。如果选择 \u003ccode\u003eexternal\u003c/code\u003e(外部阅读器),需要添加其他配置,可以在参考链接中获取相关信息。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e\u0026#34;latex-workshop.latex.autoBuild.run\u0026#34;\u003c/code\u003e\u003c/strong\u003e 是控制是否自动编译,可以通过自动编译实现准实时预览,但是一来编译需要时间,特别是复杂文档编译时间往往漫长;二来边编译边输入很可能造成意想不到的错误,这种错误不能通过重新编译一遍解决,需要将辅助文件全部删除后重新编译。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e构建一份 PDF,除了 \u003ccode\u003e.tex\u003c/code\u003e 源文件,一般需要 \u003ccode\u003e.cls\u003c/code\u003e、\u003ccode\u003e.sty\u003c/code\u003e 文件,如果需要参考文献,还\u003cbr/\u003e需要 \u003ccode\u003e.bib\u003c/code\u003e、\u003ccode\u003e.bst\u003c/code\u003e 文件,具体如下:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e.cls\u003c/code\u003e,文档类文件,如内置的 \u003ccode\u003earticle.cls\u003c/code\u003e、\u003ccode\u003ebook.cls\u003c/code\u003e,文档类名称与文件名一致\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.sty\u003c/code\u003e,宏包文件,如 \u003ccode\u003ectex.sty\u003c/code\u003e,宏包名称与文件名一致\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.bst\u003c/code\u003e,\u003ccode\u003eBibTEX\u003c/code\u003e 参考文献样式文件,如内置的 \u003ccode\u003eplain.bst\u003c/code\u003e\u003c/li\u003e\u003cli\u003e.bib,\u003ccode\u003eBibTEX\u003c/code\u003e 参考文献数据库文件\u003cbr/\u003e编译过程中会生成许多辅助文件,有些中间辅助文件会自动清除,有些则不会,生\u003cbr/\u003e成的常见辅助文件有:\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.aux\u003c/code\u003e,主辅助文件,记录交叉引用、目录、参考文献的引用等\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.log\u003c/code\u003e,错误日志文件\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.toc\u003c/code\u003e,目录记录文件\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.synctex.gz\u003c/code\u003e,正反向搜索文件\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.bbl\u003c/code\u003e,\u003ccode\u003ebibtex\u003c/code\u003e 生成的参考文献记录文件\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.blg\u003c/code\u003e,\u003ccode\u003ebibtex\u003c/code\u003e 生成的日志文件\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.out\u003c/code\u003e,\u003ccode\u003ehyperref\u003c/code\u003e 宏包生成的 PDF 书签记录文件\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.pyg\u003c/code\u003e,基于 \u003ccode\u003epygment\u003c/code\u003e 的 \u003ccode\u003eminted\u003c/code\u003e 宏包生成的文件\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e生成的辅助文件较多,建议一份文档单独一个文件夹(本来设置了,但调宏包有点问题,注释掉了又);因为要借助辅助文件,有时需要多次编译。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e\u0026#34;latex-workshop.showContextMenu\u0026#34;\u003c/code\u003e\u003c/strong\u003e 是 \u003ccode\u003etrue\u003c/code\u003e 时,你在 \u003ccode\u003e.tex\u003c/code\u003e 文件中右键时会出现一些便捷的命令。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e\u0026#34;latex-workshop.intellisense.package.enabled\u0026#34;\u003c/code\u003e\u003c/strong\u003e 是 \u003ccode\u003etrue\u003c/code\u003e,能够开启自动补全,比较方便。\u003c/p\u003e\u003cp\u003e**\u003ccode\u003e\u0026#34;latex-workshop.message.error.show\u0026#34;\u003c/code\u003e、\u003ccode\u003e\u0026#34;latex-workshop.message.warning.show\u0026#34;\u003c/code\u003e**是关于编译不好时的提醒、警告气泡,比较烦人,建议设置为 \u003ccode\u003efalse\u003c/code\u003e 不显示,错误信息还是可以通过其他方式得到的,比如找红色波浪线,鼠标放上面会有提示。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e\u0026#34;latex-workshop.latex.clean.fileTypes\u0026#34;\u003c/code\u003e\u003c/strong\u003e 是用来清除编译过程中生成的辅助文件。如果注释掉,当存在参考文献等时,一次编译出错会导致原来编译四次才能生成的参考文献因为相关辅助文件被清除要重新编译四次。有些情况下辅助文件也会造成困扰,比如在源文件中改正确了,但辅助文件中的错误不会改过来,从而导致莫名其妙的编译失败,很多情况下这是一种直觉和经验,把辅助文件全删了重新编译就行,可以根据自己的习惯选择是否取消注释开启自动清除。\u003c/p\u003e\u003cp\u003e需要注意的是,\u003cstrong\u003e设置了辅助文件输出目录\u003c/strong\u003e,在调用一些宏包比如 \u003ccode\u003eminted\u003c/code\u003e 宏包时也需要申明辅助文件的路径,最后我没有设置辅助文件输出目录。\u003c/p\u003e\u003ch3 id=\"最后测试\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/8e96/#%E6%9C%80%E5%90%8E%E6%B5%8B%E8%AF%95\" class=\"headerlink\" title=\"最后测试\"\u003e\u003c/a\u003e最后测试\u003c/h3\u003e\u003ch4 id=\"minted-宏包设置\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/8e96/#minted-%E5%AE%8F%E5%8C%85%E8%AE%BE%E7%BD%AE\" class=\"headerlink\" title=\"minted 宏包设置\"\u003e\u003c/a\u003e\u003ccode\u003eminted\u003c/code\u003e 宏包设置\u003c/h4\u003e\u003cp\u003e代码高亮需要用到 \u003ccode\u003eminted\u003c/code\u003e宏包,需要再次折腾一下,就顺便记录一下:\u003c/p\u003e\u003cp\u003e首先确保有一个 \u003ccode\u003ePython\u003c/code\u003e 环境,我这里是 \u003ccode\u003ePython 3.10.1\u003c/code\u003e。(不过为了环境更好的切换,推荐使用 \u003ccode\u003econda\u003c/code\u003e)\u003c/p\u003e\u003cp\u003e\u003ccode\u003ePython\u003c/code\u003e 安装 \u003ccode\u003ePygments\u003c/code\u003e 库:\u003ccode\u003epip install Pygments\u003c/code\u003e\u003c/p\u003e\u003cp\u003e将路径添加环境变量,我的路径是: \u003ccode\u003eC:\\Users\\KSF\\AppData\\Roaming\\Python\\Python310\\Scripts\u003c/code\u003e ,打开系统设置,添加到 \u003ccode\u003e系统-系统信息-高级系统设置-高级-环境变量-系统变量\u003c/code\u003e ,选中变量 \u003ccode\u003ePath\u003c/code\u003e ,选择编辑,之后新建,将路径复制进去。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003cstrong\u003e如果设置了辅助文件夹\u003ccode\u003etemp\u003c/code\u003e:\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e如果在编译命令中在编译命令中加上\u003ccode\u003e\u0026#34;−output−directory=temp\u0026#34;\u003c/code\u003e、\u003ccode\u003e\u0026#34;−outdir=%OUTDIR%\u0026#34;\u003c/code\u003e 两句,即更改了辅助文件的输出位置,一些宏包的输出文件位置也需要申明,比如这里的 \u003ccode\u003eminted\u003c/code\u003e 宏包,需要在 \u003ccode\u003eminted\u003c/code\u003e 宏包的可选参数中申明 \u003ccode\u003eoutputdir=./temp\u003c/code\u003e,即\u003ccode\u003e\\usepackage [cache=false,outputdir=./temp] {minted}\u003c/code\u003e。\u003c/p\u003e\u003c/blockquote\u003e\u003ch4 id=\"效果测试\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/8e96/#%E6%95%88%E6%9E%9C%E6%B5%8B%E8%AF%95\" class=\"headerlink\" title=\"效果测试\"\u003e\u003c/a\u003e效果测试\u003c/h4\u003e\u003cp\u003e最后写一段看看效果:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-latex\" data-language=\"latex\"\u003e\u003ccode class=\"language-latex\"\u003e\u003cspan class=\"token comment\"\u003e% 导言区\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\documentclass\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003earticle\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e%article可以换为book, report, letter, 从而改变文档的整个结构\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\usepackage\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ectex\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e%使用ctex宏包,可以正常显示中文\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\usepackage\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eminted\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\title\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e题目114514\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\author\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e康师傅\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\date\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\today\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token comment\"\u003e%正文区(文稿区)\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\begin\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003edocument\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\maketitle\u003c/span\u003e哼哼嗯啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊\u003cspan class=\"token function selector\"\u003e\\begin\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eminted\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003eframe=single, linenos=true\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003epython\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u0026gt;\u0026gt;\u0026gt; import numpy as np\u0026gt;\u0026gt;\u0026gt; from scipy import stats\u0026gt;\u0026gt;\u0026gt; x = np.array(\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e61, 70, 69, 63, 75, 62, 70, 66\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e)\u0026gt;\u0026gt;\u0026gt; y = np.array(\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e55, 71, 67, 61, 70, 61, 71, 61\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e)\u0026gt;\u0026gt;\u0026gt; _, p = stats.ttest_1samp(x - y, 0)\u0026gt;\u0026gt;\u0026gt; p0.042982513619168904\u003cspan class=\"token function selector\"\u003e\\end\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eminted\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\end\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003edocument\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e效果,整挺好:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/install_texlive/test.webp\" alt=\"test\"/\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/8e96/"},{"title":"合宙Air601连接阿里云物联网平台-MQTT协议学习","time":"2023-07-22T12:31:10Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"合宙Air601连接阿里云物联网平台-MQTT协议学习\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%90%88%E5%AE%99Air601%E8%BF%9E%E6%8E%A5%E9%98%BF%E9%87%8C%E4%BA%91%E7%89%A9%E8%81%94%E7%BD%91%E5%B9%B3%E5%8F%B0-MQTT%E5%8D%8F%E8%AE%AE%E5%AD%A6%E4%B9%A0\" class=\"headerlink\" title=\"合宙Air601连接阿里云物联网平台-MQTT协议学习\"\u003e\u003c/a\u003e合宙Air601连接阿里云物联网平台-MQTT协议学习\u003c/h1\u003e\u003cp\u003e开发板9块9包邮)买来玩玩。\u003c/p\u003e\u003cp\u003e首先赞美一下其他模块有现成AT/MQTT固件,因为Air601刚出来不久,现在还没有AT/MQTT固件,所以要TCP连接后手搓MQTT协议,就当学习了~\u003c/p\u003e\u003cp\u003e鼓捣了一晚上,记录记录过程~\u003c/p\u003e\u003cp\u003e一些官方介绍:\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eAir601-12F 是合宙通信推出的 Wi-Fi - BLE二合一通信模块;\u003cbr/\u003eAir601-12F采用合宙Air601芯片平台,支持Wi-Fi 802.11b/g/n协议,支持BLE 4.2协议;\u003cbr/\u003eAir601-12F 兼容业内主流12F封装(SMD-22),板载PCB天线,极致成本,满足小型化低成本需求;\u003cbr/\u003eAir601-12F 支持AT指令开发,指令集兼容,可无缝替换。\u003cbr/\u003eWi-Fi 安全支持 Wi-Fi WMM/WMM-PS/WPA/WPA2/WPS;\u003cbr/\u003e支持20/40MHz带宽,最高支持150Mbps速率;\u003cbr/\u003e支持 Station 、Station + SoftAP 、SoftAP 模式;\u003cbr/\u003e支持TLS加密通信,硬件加密模块加速,支持多路TLS连接;\u003cbr/\u003e支持fota空中升级;\u003cbr/\u003e支持低功耗休眠,休眠电流小于20 μA\u003c/p\u003e\u003cimg src=\"http://images.elecfans.top/uploads/20230717/3902cb10-2457-11ee-962d-dac502259ad0.png\" style=\"zoom: 25%;\"/\u003e\u003c/blockquote\u003e\u003ch2 id=\"准备工作\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C\" class=\"headerlink\" title=\"准备工作\"\u003e\u003c/a\u003e准备工作\u003c/h2\u003e\u003ch3 id=\"获取AT指令手册\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%8E%B7%E5%8F%96AT%E6%8C%87%E4%BB%A4%E6%89%8B%E5%86%8C\" class=\"headerlink\" title=\"获取AT指令手册\"\u003e\u003c/a\u003e获取AT指令手册\u003c/h3\u003e\u003cp\u003e\u003ca href=\"https://cdn.openluat-luatcommunity.openluat.com/attachment/20230717162214038_%E4%B8%8A%E6%B5%B7%E5%90%88%E5%AE%99WIFI%E6%A8%A1%E7%BB%84(Air601%E7%B3%BB%E5%88%97)AT%E5%91%BD%E4%BB%A4%E6%89%8B%E5%86%8CV1.0.3.pdf\"\u003e上海合宙WIFI模组(Air601系列)AT命令手册V1.0.3.pdf\u003c/a\u003e\u003c/p\u003e\u003cp\u003e因为直接买的开发板,所以开箱即用。使用type-c数据线,通过串口进行操作。\u003c/p\u003e\u003cp\u003e具体指令信息可以参考手册,这里只记录必要过程。\u003c/p\u003e\u003ch3 id=\"连接wifi\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%BF%9E%E6%8E%A5wifi\" class=\"headerlink\" title=\"连接wifi\"\u003e\u003c/a\u003e连接wifi\u003c/h3\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-none\"\u003e\u003ccode class=\"language-none\"\u003eAT+CWJAP=\u0026#34;WiFi名\u0026#34;,\u0026#34;WiFi密码\u0026#34;\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e若返回\u003ccode\u003eWIFI CONNECTED\u003c/code\u003e,则连接成功。\u003c/p\u003e\u003ch3 id=\"阿里云物联网平台创建好设备\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E9%98%BF%E9%87%8C%E4%BA%91%E7%89%A9%E8%81%94%E7%BD%91%E5%B9%B3%E5%8F%B0%E5%88%9B%E5%BB%BA%E5%A5%BD%E8%AE%BE%E5%A4%87\" class=\"headerlink\" title=\"阿里云物联网平台创建好设备\"\u003e\u003c/a\u003e阿里云物联网平台创建好设备\u003c/h3\u003e\u003cp\u003e比较简单就不演示了。\u003c/p\u003e\u003ch2 id=\"计算MQTT协议报文内容\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%AE%A1%E7%AE%97MQTT%E5%8D%8F%E8%AE%AE%E6%8A%A5%E6%96%87%E5%86%85%E5%AE%B9\" class=\"headerlink\" title=\"计算MQTT协议报文内容\"\u003e\u003c/a\u003e计算MQTT协议报文内容\u003c/h2\u003e\u003cp\u003eMQTT(消息队列遥测传输)是一个基于客户端-服务器的消息发布/订阅传输协议。\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://mcxiaoke.gitbooks.io/mqtt-cn/content/\"\u003eMQTT中文手册\u003c/a\u003e\u003c/p\u003e\u003ch3 id=\"MQTT控制报文\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#MQTT%E6%8E%A7%E5%88%B6%E6%8A%A5%E6%96%87\" class=\"headerlink\" title=\"MQTT控制报文\"\u003e\u003c/a\u003eMQTT控制报文\u003c/h3\u003e\u003cp\u003eMQTT控制报文由三部分组成:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e报文部分\u003c/th\u003e\u003cth\u003e描述\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003eFixed header\u003c/td\u003e\u003ctd\u003e固定报头,所有控制报文都包含\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eVariable header\u003c/td\u003e\u003ctd\u003e可变报头,部分控制报文包含\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ePayload\u003c/td\u003e\u003ctd\u003e有效载荷,部分控制报文包含\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch3 id=\"CONNECT-报文结构\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#CONNECT-%E6%8A%A5%E6%96%87%E7%BB%93%E6%9E%84\" class=\"headerlink\" title=\"CONNECT 报文结构\"\u003e\u003c/a\u003eCONNECT 报文结构\u003c/h3\u003e\u003cp\u003e建立客户端(Client)到服务端(Server)的网络连接后,客户端发送给服务端的第一个报文必须是 CONNECT 报文(连接到服务端)。\u003cbr/\u003e并且在一次连接中,只能发送一次 CONNECT 报文,服务端会将客服端发送的第二个CONNECT报文当做协议违规处理并断开连接。\u003cbr/\u003eCONNECT报文结构为:\u003cstrong\u003e固定报头+可变报头+有效载荷。\u003c/strong\u003e\u003c/p\u003e\u003ch4 id=\"固定报头\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%9B%BA%E5%AE%9A%E6%8A%A5%E5%A4%B4\" class=\"headerlink\" title=\"固定报头\"\u003e\u003c/a\u003e固定报头\u003c/h4\u003e\u003ctable\u003e \u003ctbody\u003e\u003ctr\u003e \u003cth colspan=\"9\"\u003e\u003ccenter\u003e固定报文格式\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003eBit\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e7\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e6\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e5\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e4\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e3\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e2\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e1\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e0\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte1\u003c/center\u003e\u003c/td\u003e \u003ctd colspan=\"4\"\u003e\u003ccenter\u003eMQTT控制报文的类型(1)\u003c/center\u003e\u003c/td\u003e \u003ctd colspan=\"4\"\u003e\u003ccenter\u003eReserved 保留位\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte2...\u003c/center\u003e\u003c/td\u003e \u003ctd colspan=\"8\"\u003e\u003ccenter\u003e剩余长度\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e其中\u003cstrong\u003e剩余长度=可变报头长度+有效载荷长度\u003c/strong\u003e ,这个在最后计算。\u003c/p\u003e\u003ch5 id=\"剩余长度详解\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%89%A9%E4%BD%99%E9%95%BF%E5%BA%A6%E8%AF%A6%E8%A7%A3\" class=\"headerlink\" title=\"剩余长度详解\"\u003e\u003c/a\u003e剩余长度详解\u003c/h5\u003e\u003cp\u003e\u003cstrong\u003e位置:\u003c/strong\u003e从第2个字节开始。\u003c/p\u003e\u003cp\u003e剩余长度(Remaining Length)表示当前报文剩余部分的字节数,包括可变报头和负载的数据。剩余长度不包括用于编码剩余长度字段本身的字节数。\u003c/p\u003e\u003cp\u003e剩余长度字段使用一个变长度编码方案,对小于128的值它使用单字节编码。若剩余长度大于等于128字节,则使用双字节低端编码的方式(低八位 - 高八位),最多使用 4 个字节来表示长度:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth align=\"center\"\u003e字节数\u003c/th\u003e\u003cth align=\"center\"\u003e最小值\u003c/th\u003e\u003cth align=\"center\"\u003e最大值\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0 (0x00)\u003c/td\u003e\u003ctd align=\"center\"\u003e127 (0x7F)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003e2\u003c/td\u003e\u003ctd align=\"center\"\u003e128 (0x80, 0x01)\u003c/td\u003e\u003ctd align=\"center\"\u003e16 383 (0xFF, 0x7F)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003e3\u003c/td\u003e\u003ctd align=\"center\"\u003e16 384 (0x80, 0x80, 0x01)\u003c/td\u003e\u003ctd align=\"center\"\u003e2 097 151 (0xFF, 0xFF, 0x7F)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003e4\u003c/td\u003e\u003ctd align=\"center\"\u003e2 097 152 (0x80, 0x80, 0x80, 0x01)\u003c/td\u003e\u003ctd align=\"center\"\u003e268 435 455 (0xFF, 0xFF, 0xFF, 0x7F)\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e其中,每个字节的低七位用于编码数据,第八位延续位用于指示是否有更多的字节。因此每个字节可以编码127个数值(0111 1111)和一个延续位。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e例:\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e小于128字节时:\u003c/p\u003e\u003cp\u003e剩余长度98个字节(0110 0010)转换成16进制为 0x62。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e大于128字节小于16384字节时\u003c/p\u003e\u003cp\u003e剩余长度300个字节时,按照低八位 - 高八位排列,低八位的最高位为1(延续位)。\u003c/p\u003e\u003cp\u003e300 = 1 0010 1100\u003c/p\u003e\u003cp\u003e低八位:1(固定)+300低7位(010 1100) -\u0026gt; 1010 1100\u003c/p\u003e\u003cp\u003e高八位:300低7位前(10) -\u0026gt; 0000 0010\u003c/p\u003e\u003cp\u003e所以剩余长度表示为 AC 02\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/blockquote\u003e\u003ch5 id=\"得到固定报头:\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%BE%97%E5%88%B0%E5%9B%BA%E5%AE%9A%E6%8A%A5%E5%A4%B4%EF%BC%9A\" class=\"headerlink\" title=\"得到固定报头:\"\u003e\u003c/a\u003e得到固定报头:\u003c/h5\u003e\u003cp\u003e16进制,后面均为16进制,不再说明:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e10\u003c/span\u003e ??\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e其中\u003ccode\u003e??\u003c/code\u003e为剩余长度,由最后计算获得。\u003c/p\u003e\u003ch4 id=\"可变报头\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%8F%AF%E5%8F%98%E6%8A%A5%E5%A4%B4\" class=\"headerlink\" title=\"可变报头\"\u003e\u003c/a\u003e可变报头\u003c/h4\u003e\u003cp\u003e某些MQTT控制报文包含一个可变报头部分。它在固定报头和负载之间。可变报头的内容根据报文类型的不同而不同。\u003c/p\u003e\u003cp\u003eCONNECT报文的可变报头按下列次序包含四个字段:协议名(Protocol Name),协议级别(Protocol Level),连接标志(Connect Flags)和保持连接(Keep Alive)。\u003c/p\u003e\u003ch5 id=\"协议名-Protocol-Name\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%8D%8F%E8%AE%AE%E5%90%8D-Protocol-Name\" class=\"headerlink\" title=\"协议名 Protocol Name\"\u003e\u003c/a\u003e协议名 Protocol Name\u003c/h5\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth align=\"center\"\u003e\u003c/th\u003e\u003cth align=\"center\"\u003e说明\u003c/th\u003e\u003cth align=\"center\"\u003e7\u003c/th\u003e\u003cth align=\"center\"\u003e6\u003c/th\u003e\u003cth align=\"center\"\u003e5\u003c/th\u003e\u003cth align=\"center\"\u003e4\u003c/th\u003e\u003cth align=\"center\"\u003e3\u003c/th\u003e\u003cth align=\"center\"\u003e2\u003c/th\u003e\u003cth align=\"center\"\u003e1\u003c/th\u003e\u003cth align=\"center\"\u003e0\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 1\u003c/td\u003e\u003ctd align=\"center\"\u003e长度 MSB (0)\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 2\u003c/td\u003e\u003ctd align=\"center\"\u003e长度 LSB (4)\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 3\u003c/td\u003e\u003ctd align=\"center\"\u003e‘M’\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 4\u003c/td\u003e\u003ctd align=\"center\"\u003e‘Q’\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 5\u003c/td\u003e\u003ctd align=\"center\"\u003e‘T’\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 6\u003c/td\u003e\u003ctd align=\"center\"\u003e‘T’\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e协议名是表示协议名 \u003cem\u003eMQTT\u003c/em\u003e 的UTF-8编码的字符串。MQTT规范的后续版本不会改变这个字符串的偏移和长度。\u003c/p\u003e\u003cp\u003e如果协议名不正确服务端\u003cstrong\u003e可以\u003c/strong\u003e断开客户端的连接,也\u003cstrong\u003e可以\u003c/strong\u003e按照某些其它规范继续处理CONNECT报文。对于后一种情况,按照本规范,服务端\u003cstrong\u003e不能\u003c/strong\u003e继续处理CONNECT报文。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e数据包检测工具,例如防火墙,可以使用协议名来识别MQTT流量。\u003c/p\u003e\u003c/blockquote\u003e\u003ch5 id=\"协议级别-Protocol-Level\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%8D%8F%E8%AE%AE%E7%BA%A7%E5%88%AB-Protocol-Level\" class=\"headerlink\" title=\"协议级别 Protocol Level\"\u003e\u003c/a\u003e协议级别 Protocol Level\u003c/h5\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth align=\"center\"\u003e\u003c/th\u003e\u003cth align=\"center\"\u003e说明\u003c/th\u003e\u003cth align=\"center\"\u003e7\u003c/th\u003e\u003cth align=\"center\"\u003e6\u003c/th\u003e\u003cth align=\"center\"\u003e5\u003c/th\u003e\u003cth align=\"center\"\u003e4\u003c/th\u003e\u003cth align=\"center\"\u003e3\u003c/th\u003e\u003cth align=\"center\"\u003e2\u003c/th\u003e\u003cth align=\"center\"\u003e1\u003c/th\u003e\u003cth align=\"center\"\u003e0\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 7\u003c/td\u003e\u003ctd align=\"center\"\u003eLevel(4)\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e客户端用8位的无符号值表示协议的修订版本。对于3.1.1版协议,协议级别字段的值是4(0x04)。如果发现不支持的协议级别,服务端\u003cstrong\u003e必须\u003c/strong\u003e给发送一个返回码为0x01(不支持的协议级别)的CONNACK报文响应CONNECT报文,然后断开客户端的连接。\u003c/p\u003e\u003ch5 id=\"连接标志-Connect-Flags\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%BF%9E%E6%8E%A5%E6%A0%87%E5%BF%97-Connect-Flags\" class=\"headerlink\" title=\"连接标志 Connect Flags\"\u003e\u003c/a\u003e连接标志 Connect Flags\u003c/h5\u003e\u003cp\u003e连接标志字节包含一些用于指定MQTT连接行为的参数。它还指出有效载荷中的字段是否存在。\u003c/p\u003e\u003ctable\u003e \u003ctbody\u003e\u003ctr\u003e \u003cth colspan=\"9\"\u003e\u003ccenter\u003e连接标志\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003eBit\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e7\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e6\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e5\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e4\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e3\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e2\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e1\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e0\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003e \u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eUser Name Flag\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003ePassword Flag\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eWill Retain\u003c/center\u003e\u003c/td\u003e \u003ctd colspan=\"2\"\u003e\u003ccenter\u003eWill QoS\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eWill Flag\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eClean Session\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eReserved\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 8\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e一共有6个:清理会话 Clean Session,遗嘱标志 Will Flag,遗嘱QoS Will QoS,遗嘱保留 Will Retain,密码标志 Password Flag,用户名标志 User Name Flag。\u003c/p\u003e\u003cp\u003e服务端\u003cstrong\u003e必须\u003c/strong\u003e验证CONNECT控制报文的保留标志位(第0位)是否为0,如果不为0必须断开客户端连接。\u003c/p\u003e\u003cp\u003e各个有效位的具体解释见参考文档\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e一般使用 1100 0010 (用户名、密码、清理会话),转换成16进制为:C2\u003c/strong\u003e\u003c/p\u003e\u003ch5 id=\"保持连接-Keep-Alive\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E4%BF%9D%E6%8C%81%E8%BF%9E%E6%8E%A5-Keep-Alive\" class=\"headerlink\" title=\"保持连接 Keep Alive\"\u003e\u003c/a\u003e保持连接 Keep Alive\u003c/h5\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth align=\"center\"\u003eBit\u003c/th\u003e\u003cth align=\"center\"\u003e7\u003c/th\u003e\u003cth align=\"center\"\u003e6\u003c/th\u003e\u003cth align=\"center\"\u003e5\u003c/th\u003e\u003cth align=\"center\"\u003e4\u003c/th\u003e\u003cth align=\"center\"\u003e3\u003c/th\u003e\u003cth align=\"center\"\u003e2\u003c/th\u003e\u003cth align=\"center\"\u003e1\u003c/th\u003e\u003cth align=\"center\"\u003e0\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 9\u003c/td\u003e\u003ctd align=\"center\"\u003e保持连接 Keep Alive MSB\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 10\u003c/td\u003e\u003ctd align=\"center\"\u003e保持连接 Keep Alive LSB\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e保持连接(Keep Alive)是一个以秒为单位的时间间隔,表示为一个16位的字,它是指在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允许空闲的最大时间间隔。客户端负责保证控制报文发送的时间间隔不超过保持连接的值。如果没有任何其它的控制报文可以发送,客户端\u003cstrong\u003e必须\u003c/strong\u003e发送一个PINGREQ报文。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e如:设置100s表示成16进制为 00 64\u003c/p\u003e\u003c/blockquote\u003e\u003ctable\u003e \u003ctbody\u003e\u003ctr\u003e \u003cth colspan=\"10\"\u003e\u003ccenter\u003e可变报头非规范示例\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003eDescription\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e7\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e6\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e5\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e4\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e3\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e2\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e1\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e0\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003cth colspan=\"10\"\u003e\u003ccenter\u003eProtocol Name\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eLength MSB(0)\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 2\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eLength LSB(4)\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 3\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u0026#39;M\u0026#39;\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 4\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u0026#39;Q\u0026#39;\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 5\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u0026#39;T\u0026#39;\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 6\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u0026#39;T\u0026#39;\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003cth colspan=\"10\"\u003e\u003ccenter\u003eProtocol Level\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 7\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eLevel(4)\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003cth colspan=\"10\"\u003e\u003ccenter\u003eConnect Flags\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003ebyte 8\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eUser Name Flag(1)\u003c/center\u003e\u003c/td\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ePassword Flag(1)\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003eWill Retain(0)\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003eWill QoS(01)\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003eWill Flag(1)\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003eClean Session(1)\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003eReserved(0)\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003cth colspan=\"10\"\u003e\u003ccenter\u003eKeep Alive\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 9\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eKeep Alive MSB(0)\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 10\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eKeep Alive LSB(10)\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch5 id=\"得到可变报头\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%BE%97%E5%88%B0%E5%8F%AF%E5%8F%98%E6%8A%A5%E5%A4%B4\" class=\"headerlink\" title=\"得到可变报头\"\u003e\u003c/a\u003e得到可变报头\u003c/h5\u003e\u003cp\u003e用户名、密码、清理回话,100s\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e04\u003c/span\u003e 4D \u003cspan class=\"token number\"\u003e51\u003c/span\u003e \u003cspan class=\"token number\"\u003e54\u003c/span\u003e \u003cspan class=\"token number\"\u003e54\u003c/span\u003e \u003cspan class=\"token number\"\u003e04\u003c/span\u003e C2 \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e64\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"有效载荷\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E6%9C%89%E6%95%88%E8%BD%BD%E8%8D%B7\" class=\"headerlink\" title=\"有效载荷\"\u003e\u003c/a\u003e有效载荷\u003c/h4\u003e\u003cblockquote\u003e\u003cp\u003e需要用到的工具:\u003c/p\u003e\u003cp\u003e\u003ca href=\"http://www.metools.info/code/c25.html\"\u003e在线HMAC计算-ME2在线工具 (metools.info)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.rapidtables.com/convert/number/hex-to-ascii.html\"\u003eHex to ASCII Text String Converter (rapidtables.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.rapidtables.com/convert/number/ascii-to-hex.html\"\u003eASCII to Hex | Text to Hex Code Converter (rapidtables.com)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e对于各参数的具体信息可以参考阿里云文档:\u003ca href=\"https://help.aliyun.com/zh/iot/user-guide/establish-mqtt-connections-over-tcp#section-llx-5ay-oma\"\u003eMQTT-TCP连接通信 (aliyun.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e有效载荷(payload)包含一个或多个以长度为前缀的字段,可变报头中的标志决定是否包含这些字段。如果包含的话,必须按这个顺序出现:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码,且每个字段必须使用UTF-8编码字符串(\u003cstrong\u003e需要在最前面添加表示长度的16进制字符\u003c/strong\u003e)\u003c/p\u003e\u003ctable\u003e \u003ctbody\u003e\u003ctr\u003e \u003cth colspan=\"2\"\u003e\u003ccenter\u003e每个字段示例\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003cth\u003e\u003ccenter\u003eBit\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e7 - 0\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e数据长度 MSB\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 2\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e数据长度 LSB\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 3...\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e数据长度大于0,这里就是数据部分\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e我们此时需要去阿里云获取三元组(我随便编一编):\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;ProductKey\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;ksf114514\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;DeviceName\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;Air601\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;DeviceSecret\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;ksf1145141919810dj15ltc137666\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e我们约定:\u003c/p\u003e\u003cul\u003e\u003cli\u003e#:ProductKey\u003c/li\u003e\u003cli\u003e*:DeviceName\u003c/li\u003e\u003cli\u003e\u0026amp;:DeviceSecret\u003c/li\u003e\u003c/ul\u003e\u003ch5 id=\"客户端标识符\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%A0%87%E8%AF%86%E7%AC%A6\" class=\"headerlink\" title=\"客户端标识符\"\u003e\u003c/a\u003e客户端标识符\u003c/h5\u003e\u003cp\u003e通用格式:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e*|securemode=\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003esignmethod=hmacsha1|\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e进行填充:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003eAir601|securemode=\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003esignmethod=hmacsha1|\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e转换为16进制:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e41\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e75\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 6D 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e33\u003c/span\u003e 2C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e67\u003c/span\u003e 6E 6D \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e74\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6D \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e添加长度(40 -\u0026gt; 00 28):\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e28\u003c/span\u003e \u003cspan class=\"token number\"\u003e41\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e75\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 6D 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e33\u003c/span\u003e 2C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e67\u003c/span\u003e 6E 6D \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e74\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6D \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch5 id=\"用户名\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E7%94%A8%E6%88%B7%E5%90%8D\" class=\"headerlink\" title=\"用户名\"\u003e\u003c/a\u003e用户名\u003c/h5\u003e\u003cp\u003e通用格式:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e*\u0026amp;#\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e进行填充:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003eAir601\u0026amp;ksf114514\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e转换为16进制\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-none\"\u003e\u003ccode class=\"language-none\"\u003e41 69 72 36 30 31 26 6B 73 66 31 31 34 35 31 34\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e添加长度(16 -\u0026gt; 00 10)\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-none\"\u003e\u003ccode class=\"language-none\"\u003e00 10 41 69 72 36 30 31 26 6B 73 66 31 31 34 35 31 34\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch5 id=\"密码\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%AF%86%E7%A0%81\" class=\"headerlink\" title=\"密码\"\u003e\u003c/a\u003e密码\u003c/h5\u003e\u003cp\u003e通用格式:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003eclientId*deviceName*productKey#\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e进行填充:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003eclientIdAir601deviceNameAir601productKeyksf114514\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e加密:\u003c/p\u003e\u003cp\u003e将填充后的内容\u003cstrong\u003e使用DeviceSecret做密钥\u003c/strong\u003e,进行\u003cstrong\u003eHmacSHA1加密\u003c/strong\u003e:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003ee4b931f38037ef7241455709458b4b630b22eac2\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e转为16进制:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e添加长度(40 -\u0026gt; 00 28)\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e28\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch5 id=\"合并,得到最终有效载荷\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%90%88%E5%B9%B6%EF%BC%8C%E5%BE%97%E5%88%B0%E6%9C%80%E7%BB%88%E6%9C%89%E6%95%88%E8%BD%BD%E8%8D%B7\" class=\"headerlink\" title=\"合并,得到最终有效载荷\"\u003e\u003c/a\u003e合并,得到最终有效载荷\u003c/h5\u003e\u003cp\u003e根据我们在可变报头中的选择:\u003cstrong\u003e最终有效载荷=客户端标识符+用户名+密码\u003c/strong\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e28\u003c/span\u003e \u003cspan class=\"token number\"\u003e41\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e75\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 6D 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e33\u003c/span\u003e 2C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e67\u003c/span\u003e 6E 6D \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e74\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6D \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e10\u003c/span\u003e \u003cspan class=\"token number\"\u003e41\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e26\u003c/span\u003e 6B \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e28\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"得到最终报文\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%BE%97%E5%88%B0%E6%9C%80%E7%BB%88%E6%8A%A5%E6%96%87\" class=\"headerlink\" title=\"得到最终报文\"\u003e\u003c/a\u003e得到最终报文\u003c/h4\u003e\u003cp\u003e首先计算固定报头中的剩余长度:\u003cstrong\u003e剩余长度=可变报头长度+有效载荷长度\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e可得剩余长度为:10+102=112 -\u0026gt; 70。(小于128,所以正常编码)\u003c/p\u003e\u003cp\u003e最终报文:\u003cstrong\u003e固定报头+可变报头+有效载荷\u003c/strong\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e10\u003c/span\u003e \u003cspan class=\"token number\"\u003e70\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e04\u003c/span\u003e 4D \u003cspan class=\"token number\"\u003e51\u003c/span\u003e \u003cspan class=\"token number\"\u003e54\u003c/span\u003e \u003cspan class=\"token number\"\u003e54\u003c/span\u003e \u003cspan class=\"token number\"\u003e04\u003c/span\u003e C2 \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e64\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e28\u003c/span\u003e \u003cspan class=\"token number\"\u003e41\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e75\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 6D 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e33\u003c/span\u003e 2C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e67\u003c/span\u003e 6E 6D \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e74\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6D \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e10\u003c/span\u003e \u003cspan class=\"token number\"\u003e41\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e26\u003c/span\u003e 6B \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e28\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e现在可以愉快的与阿里云物联网平台建立连接了~\u003c/p\u003e\u003ch2 id=\"与阿里云物联网平台建立连接\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E4%B8%8E%E9%98%BF%E9%87%8C%E4%BA%91%E7%89%A9%E8%81%94%E7%BD%91%E5%B9%B3%E5%8F%B0%E5%BB%BA%E7%AB%8B%E8%BF%9E%E6%8E%A5\" class=\"headerlink\" title=\"与阿里云物联网平台建立连接\"\u003e\u003c/a\u003e与阿里云物联网平台建立连接\u003c/h2\u003e\u003ch3 id=\"获取连接地址\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%8E%B7%E5%8F%96%E8%BF%9E%E6%8E%A5%E5%9C%B0%E5%9D%80\" class=\"headerlink\" title=\"获取连接地址\"\u003e\u003c/a\u003e获取连接地址\u003c/h3\u003e\u003cp\u003e直接在阿里云物联网平台的控制台就可以看见,比如我的(瞎编的):\u003ccode\u003eiot-ksf114514.mqtt.iothub.aliyuncs.com\u003c/code\u003e。\u003c/p\u003e\u003ch3 id=\"建立TCP连接\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%BB%BA%E7%AB%8BTCP%E8%BF%9E%E6%8E%A5\" class=\"headerlink\" title=\"建立TCP连接\"\u003e\u003c/a\u003e建立TCP连接\u003c/h3\u003e\u003cp\u003e使用串口助手发送:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003eAT+CIPSTART=\u003cspan class=\"token string\"\u003e\u0026#34;TCP\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;iot-ksf114514.mqtt.iothub.aliyuncs.com\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e1883\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e如果建立连接10s不上报消息,阿里云物联网平台会发送\u003ccode\u003eCLOSED\u003c/code\u003e,并断开连接,这时候需要我们关闭TCP连接然后重新建立连接。\u003c/p\u003e\u003cp\u003e关闭连接:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003eAT+CIPCLOSE\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"发送报文\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%8F%91%E9%80%81%E6%8A%A5%E6%96%87\" class=\"headerlink\" title=\"发送报文\"\u003e\u003c/a\u003e发送报文\u003c/h3\u003e\u003cp\u003e这里都是在单连接的情况(\u003ccode\u003eAT+CIPMUX=0\u003c/code\u003e)。\u003c/p\u003e\u003cp\u003e根据文档,有两种发送方式:\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003eAT+CIPSEND=\u0026lt;length\u0026gt;\u003c/code\u003e\u003c/p\u003e\u003cp\u003e需要指定发送长度,达到指定长度后自动发送。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003eAT+CIPSENDEX=\u0026lt;length\u0026gt;\u003c/code\u003e\u003c/p\u003e\u003cp\u003e指定发送长度,但可以使用字符串 \u003ccode\u003e \\0 (0x5c, 0x30 ASCII)\u003c/code\u003e 触发数据发送。\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e选择哪种?从实践来看,因为使用16进制发送CONNECT报文,报文中出现00同样会触发数据发送(emmmm),所以使用第一种指定长度的发送方式,毕竟报文已经提前算好了。\u003c/p\u003e\u003ch4 id=\"设置发送\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%AE%BE%E7%BD%AE%E5%8F%91%E9%80%81\" class=\"headerlink\" title=\"设置发送\"\u003e\u003c/a\u003e设置发送\u003c/h4\u003e\u003cp\u003e最终报文长度:114\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003eAT+CIPSEND=\u003cspan class=\"token number\"\u003e114\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"发送报文-1\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%8F%91%E9%80%81%E6%8A%A5%E6%96%87-1\" class=\"headerlink\" title=\"发送报文\"\u003e\u003c/a\u003e发送报文\u003c/h4\u003e\u003cp\u003e注意,这里要使用16进制(就是切换成HEX)进行发送:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e10\u003c/span\u003e \u003cspan class=\"token number\"\u003e70\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e04\u003c/span\u003e 4D \u003cspan class=\"token number\"\u003e51\u003c/span\u003e \u003cspan class=\"token number\"\u003e54\u003c/span\u003e \u003cspan class=\"token number\"\u003e54\u003c/span\u003e \u003cspan class=\"token number\"\u003e04\u003c/span\u003e C2 \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e64\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e28\u003c/span\u003e \u003cspan class=\"token number\"\u003e41\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e75\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 6D 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e33\u003c/span\u003e 2C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e67\u003c/span\u003e 6E 6D \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e74\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6D \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e10\u003c/span\u003e \u003cspan class=\"token number\"\u003e41\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e26\u003c/span\u003e 6B \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e28\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"返回参数\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%BF%94%E5%9B%9E%E5%8F%82%E6%95%B0\" class=\"headerlink\" title=\"返回参数\"\u003e\u003c/a\u003e返回参数\u003c/h3\u003e\u003cp\u003e串口返回数据:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003eRx\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e02\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e12\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e09.437\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e 0D 0A 2B \u003cspan class=\"token number\"\u003e49\u003c/span\u003e \u003cspan class=\"token number\"\u003e50\u003c/span\u003e \u003cspan class=\"token number\"\u003e44\u003c/span\u003e 2C \u003cspan class=\"token number\"\u003e34\u003c/span\u003e 3A \u003cspan class=\"token number\"\u003e20\u003c/span\u003e \u003cspan class=\"token number\"\u003e02\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e 0D 0A\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e 末尾的\u003ccode\u003e0D\u003c/code\u003e 是回车符,\u003ccode\u003e0A\u003c/code\u003e是换行符,因为使用串口助手,这俩不可避免。\u003c/p\u003e\u003cp\u003e其中前面的 \u003ccode\u003e0D 0A 2B 49 50 44 2C 34 3A\u003c/code\u003e,是\u003ccode\u003e+IPD,4\u003c/code\u003e,我们只需要关注后面的字节:**\u003ccode\u003e20 02 00 00\u003c/code\u003e** 。\u003c/p\u003e\u003cp\u003e要知道这玩意的意思,首先要了解CONNACK – 确认连接请求。\u003c/p\u003e\u003ch2 id=\"CONNACK-–-确认连接请求\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#CONNACK-%E2%80%93-%E7%A1%AE%E8%AE%A4%E8%BF%9E%E6%8E%A5%E8%AF%B7%E6%B1%82\" class=\"headerlink\" title=\"CONNACK – 确认连接请求\"\u003e\u003c/a\u003eCONNACK – 确认连接请求\u003c/h2\u003e\u003cp\u003e服务端发送CONNACK报文响应从客户端收到的CONNECT报文。服务端发送给客户端的第一个报文\u003cstrong\u003e必须\u003c/strong\u003e是CONNACK。\u003c/p\u003e\u003ch3 id=\"固定报头-1\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%9B%BA%E5%AE%9A%E6%8A%A5%E5%A4%B4-1\" class=\"headerlink\" title=\"固定报头\"\u003e\u003c/a\u003e固定报头\u003c/h3\u003e\u003ctable\u003e \u003ctbody\u003e\u003ctr\u003e \u003cth colspan=\"9\"\u003e\u003ccenter\u003eCONNACK报文固定报头\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003cth\u003e\u003ccenter\u003eBit\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e7\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e6\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e5\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e4\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e3\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e2\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 1\u003c/center\u003e\u003c/td\u003e \u003ctd colspan=\"4\"\u003e\u003ccenter\u003eMQTT报文类型(2)\u003c/center\u003e\u003c/td\u003e \u003ctd colspan=\"4\"\u003e\u003ccenter\u003eReserved 保留位\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 2...\u003c/center\u003e\u003c/td\u003e \u003ctd colspan=\"8\"\u003e\u003ccenter\u003e剩余长度(2)\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e\u003cstrong\u003e剩余长度字段:\u003c/strong\u003e表示可变报头的长度。对于CONNACK报文这个值等于2。\u003c/p\u003e\u003ch4 id=\"固定报头编码\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%9B%BA%E5%AE%9A%E6%8A%A5%E5%A4%B4%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"固定报头编码\"\u003e\u003c/a\u003e固定报头编码\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e20\u003c/span\u003e \u003cspan class=\"token number\"\u003e02\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"可变报头-1\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%8F%AF%E5%8F%98%E6%8A%A5%E5%A4%B4-1\" class=\"headerlink\" title=\"可变报头\"\u003e\u003c/a\u003e可变报头\u003c/h3\u003e\u003ctable\u003e \u003ctbody\u003e\u003ctr\u003e \u003cth colspan=\"10\"\u003e\u003ccenter\u003eCONNACK报文可变报头\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003cth\u003e\u003ccenter\u003e\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e描述\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e7\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e6\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e5\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e4\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e3\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e2\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd colspan=\"2\"\u003e\u003ccenter\u003e连接确认标志\u003c/center\u003e\u003c/td\u003e \u003ctd colspan=\"7\"\u003e\u003ccenter\u003eReserved 保留位\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eSP\u003csup\u003e1\u003csup\u003e\u003c/sup\u003e\u003c/sup\u003e\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd colspan=\"10\"\u003e\u003ccenter\u003e连接返回码\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte2\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch4 id=\"连接确认标志-Connect-Acknowledge-Flags\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%BF%9E%E6%8E%A5%E7%A1%AE%E8%AE%A4%E6%A0%87%E5%BF%97-Connect-Acknowledge-Flags\" class=\"headerlink\" title=\"连接确认标志 Connect Acknowledge Flags\"\u003e\u003c/a\u003e连接确认标志 Connect Acknowledge Flags\u003c/h4\u003e\u003cp\u003e第1个字节是 \u003cem\u003e连接确认标志\u003c/em\u003e,位7-1是保留位且\u003cstrong\u003e必须\u003c/strong\u003e设置为0。 第0 (SP)位 是当前会话(Session Present)标志。\u003c/p\u003e\u003ch5 id=\"当前会话-Session-Present\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%BD%93%E5%89%8D%E4%BC%9A%E8%AF%9D-Session-Present\" class=\"headerlink\" title=\"当前会话 Session Present\"\u003e\u003c/a\u003e当前会话 Session Present\u003c/h5\u003e\u003cp\u003e\u003cstrong\u003e位置:\u003c/strong\u003e连接确认标志的第0位。\u003c/p\u003e\u003cp\u003e如果服务端收到清理会话(CleanSession)标志为1的连接,除了将CONNACK报文中的返回码设置为0之外,还\u003cstrong\u003e必须\u003c/strong\u003e将CONNACK报文中的当前会话设置(Session Present)标志为0。\u003c/p\u003e\u003cp\u003e)我们在发送报文中清理会话标志位为1,所以返回码为0。(其他情况参阅资料)\u003c/p\u003e\u003ch4 id=\"连接返回码-Connect-Return-code\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%BF%9E%E6%8E%A5%E8%BF%94%E5%9B%9E%E7%A0%81-Connect-Return-code\" class=\"headerlink\" title=\"连接返回码 Connect Return code\"\u003e\u003c/a\u003e连接返回码 Connect Return code\u003c/h4\u003e\u003cp\u003e\u003cstrong\u003e位置:\u003c/strong\u003e可变报头的第2个字节。\u003c/p\u003e\u003cp\u003e连接返回码字段使用一个字节的无符号值,在下表中列出。\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e值\u003c/th\u003e\u003cth\u003e返回码响应\u003c/th\u003e\u003cth\u003e描述\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e0x00连接已接受\u003c/td\u003e\u003ctd\u003e连接已被服务端接受\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e1\u003c/td\u003e\u003ctd\u003e0x01连接已拒绝,不支持的协议版本\u003c/td\u003e\u003ctd\u003e服务端不支持客户端请求的MQTT协议级别\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e2\u003c/td\u003e\u003ctd\u003e0x02连接已拒绝,不合格的客户端标识符\u003c/td\u003e\u003ctd\u003e客户端标识符是正确的UTF-8编码,但服务端不允许使用\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e3\u003c/td\u003e\u003ctd\u003e0x03连接已拒绝,服务端不可用\u003c/td\u003e\u003ctd\u003e网络连接已建立,但MQTT服务不可用\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e4\u003c/td\u003e\u003ctd\u003e0x04连接已拒绝,无效的用户名或密码\u003c/td\u003e\u003ctd\u003e用户名或密码的数据格式无效\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e5\u003c/td\u003e\u003ctd\u003e0x05连接已拒绝,未授权\u003c/td\u003e\u003ctd\u003e客户端未被授权连接到此服务器\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e6-255\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003e保留\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e如果服务端收到一个合法的CONNECT报文,但出于某些原因无法处理它,服务端应该尝试发送一个包含非零返回码(表格中的某一个)的CONNACK报文。如果服务端发送了一个包含非零返回码的CONNACK报文,那么它\u003cstrong\u003e必须\u003c/strong\u003e关闭网络连接。\u003c/p\u003e\u003ch4 id=\"正确连接的可变报头\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E6%AD%A3%E7%A1%AE%E8%BF%9E%E6%8E%A5%E7%9A%84%E5%8F%AF%E5%8F%98%E6%8A%A5%E5%A4%B4\" class=\"headerlink\" title=\"正确连接的可变报头\"\u003e\u003c/a\u003e正确连接的可变报头\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-none\"\u003e\u003ccode class=\"language-none\"\u003e00 00\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"有效载荷-1\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E6%9C%89%E6%95%88%E8%BD%BD%E8%8D%B7-1\" class=\"headerlink\" title=\"有效载荷\"\u003e\u003c/a\u003e有效载荷\u003c/h3\u003e\u003cp\u003eCONNACK报文没有有效载荷。\u003c/p\u003e\u003ch2 id=\"最终结果\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E6%9C%80%E7%BB%88%E7%BB%93%E6%9E%9C\" class=\"headerlink\" title=\"最终结果\"\u003e\u003c/a\u003e最终结果\u003c/h2\u003e\u003cp\u003e串口返回数据:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003eRx\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e02\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e12\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e09.437\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e 0D 0A 2B \u003cspan class=\"token number\"\u003e49\u003c/span\u003e \u003cspan class=\"token number\"\u003e50\u003c/span\u003e \u003cspan class=\"token number\"\u003e44\u003c/span\u003e 2C \u003cspan class=\"token number\"\u003e34\u003c/span\u003e 3A \u003cspan class=\"token number\"\u003e20\u003c/span\u003e \u003cspan class=\"token number\"\u003e02\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e 0D 0A\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e根据我们在串口看到的返回结果\u003ccode\u003e20 02 00 00\u003c/code\u003e,可知连接已经建立成功。\u003c/p\u003e\u003cp\u003e这时候在阿里云物联网平台的设备页面,我们看见我们的设备上线了!\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-markup\" data-language=\"markup\"\u003e\u003ccode class=\"language-markup\"\u003e最后上线时间 2023/07/23 02:12:13.847\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch2 id=\"参考链接\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\" class=\"headerlink\" title=\"参考链接\"\u003e\u003c/a\u003e参考链接\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://doc.openluat.com/wiki/49\"\u003eLuat社区 (openluat.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://help.aliyun.com/zh/iot/user-guide/establish-mqtt-connections-over-tcp#section-llx-5ay-oma\"\u003eMQTT-TCP连接通信 (aliyun.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://mcxiaoke.gitbooks.io/mqtt-cn/content/\"\u003eMQTT中文手册\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.codenong.com/cs105877395/\"\u003eMQTT协议学习一、MQTT控制报文的结构与CONNECT报文构建 | 码农家园 (codenong.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introduction.html\"\u003e第一章 - MQTT介绍 · MQTT协议中文版 (gitbooks.io)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/weixin_52672120/article/details/112308318\"\u003eMQTT - CONNECT报文_mqtt_connect_Hebo42的博客-CSDN博客\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/cw_huang/article/details/105815349\"\u003eESP8266-12F AT指令连接阿里云_GEEK.攻城狮的博客-CSDN博客\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/huangcw/p/12778758.html\"\u003eESP8266-12F AT指令连接阿里云 - 黄豆爸 - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://baijiahao.baidu.com/s?id=1715575644678049062\u0026amp;wfr=spider\u0026amp;for=pc\"\u003eMQTT协议报文格式解析 (baidu.com)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/47a8/"},{"title":"STM32使用硬件IIC驱动SHT30温湿度传感器","time":"2023-07-13T16:37:34Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"STM32使用硬件IIC驱动SHT30温湿度传感器\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#STM32%E4%BD%BF%E7%94%A8%E7%A1%AC%E4%BB%B6IIC%E9%A9%B1%E5%8A%A8SHT30%E6%B8%A9%E6%B9%BF%E5%BA%A6%E4%BC%A0%E6%84%9F%E5%99%A8\" class=\"headerlink\" title=\"STM32使用硬件IIC驱动SHT30温湿度传感器\"\u003e\u003c/a\u003eSTM32使用硬件IIC驱动SHT30温湿度传感器\u003c/h1\u003e\u003cp\u003e\u003cdel\u003e喜报,终于写完了\u003c/del\u003e\u003c/p\u003e\u003cp\u003e当时网上 xjb乱逛,突然看见有人讨论小米温湿度传感器,我当时也买了个这玩意,于是突然感兴趣查了一下用的传感器——SHT30,协议是IIC。当时想着能不能自己也山寨一个小米温湿度传感器 \u003cdel\u003e,然后下单了SHT30之后就再也没动过\u003c/del\u003e 。这会放假了,想起来这玩意,就整一整吧,顺便再 \u003cstrong\u003e学习一遍IIC协议\u003c/strong\u003e 。图个方便,这次先用硬件IIC。\u003c/p\u003e\u003ch2 id=\"IIC-协议\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#IIC-%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"IIC 协议\"\u003e\u003c/a\u003eIIC 协议\u003c/h2\u003e\u003ch2 id=\"I2C协议介绍\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#I2C%E5%8D%8F%E8%AE%AE%E4%BB%8B%E7%BB%8D\" class=\"headerlink\" title=\"I2C协议介绍\"\u003e\u003c/a\u003eI2C协议介绍\u003c/h2\u003e\u003ch3 id=\"(1)I2C协议简介\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%881%EF%BC%89I2C%E5%8D%8F%E8%AE%AE%E7%AE%80%E4%BB%8B\" class=\"headerlink\" title=\"(1)I2C协议简介\"\u003e\u003c/a\u003e(1)I2C协议简介\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e【省流版】:\u003c/p\u003e\u003cp\u003e串行通信协议的一种,属于串行通信协议中的半双工同步通信。\u003c/p\u003e\u003cp\u003eIIC是一种被定义好的标准,采用二线制,一条数据线,一条时钟线;\u003c/p\u003e\u003cp\u003e数据线传输数据,一位一位传输;时钟线控制传输速率。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003eI2C总线是Philips公司在八十年代初推出的一种\u003cstrong\u003e串行、半双工的总线\u003c/strong\u003e,主要用于近距离、低速的芯片之间的通信。\u003c/p\u003e\u003cp\u003e每个IIC器件有两条线路:\u003c/p\u003e\u003cul\u003e\u003cli\u003eSDA是供主器件和节点发送和接收数据的线路。\u003c/li\u003e\u003cli\u003eSCL是承载时钟信号的线路。SCL总是由I2C主器件生成。规范对时钟信号的低相位和高相位有最短周期要求。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eI2C总线仅使用两条双向线路:每个器件的SDA和SCL用于简单的IC间通信。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/11.webp\" style=\"zoom:80%;\"/\u003e\u003cp\u003e硬件最重要的注意是在SDA和SCL上加入上拉电阻。I2C器件通过开集或开漏引脚连接到总线,将线路拉低。当没有数据传输时,I2C总线处于高电平空闲状态;线路被被动拉高。要传输数据,须切换线路,即先拉低再释放(又变为高电平)。数据位在时钟下降沿传输。\u003c/p\u003e\u003cp\u003e开漏输出需要一个上拉电阻(Rp)才能正确输出高电平。上拉电阻连接在输出引脚和高电平所需的输出电压(VDD)之间。\u003c/p\u003e\u003cp\u003e对于VCC和VDD (5 V)的典型值,4700 Ω是最常用的上拉电阻值。\u003c/p\u003e\u003cp\u003eI2C总线是一种主从结构(Master/Slave)总线, I2C总线上的每一个设备都可以作为主设备或者从设备,但一个总线上一般只有一个主设备,可以带多个从设备。其中主设备用来产生允许传输的时钟信号,并初始化总线的数据传输,所以主设备通常是CPU,而从设备只能被动响应主设备发起的通信请求,所以各种I2C接口芯片将作为从设备使用。\u003c/p\u003e\u003ch4 id=\"(2)I2C从设备地址\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%882%EF%BC%89I2C%E4%BB%8E%E8%AE%BE%E5%A4%87%E5%9C%B0%E5%9D%80\" class=\"headerlink\" title=\"(2)I2C从设备地址\"\u003e\u003c/a\u003e(2)I2C从设备地址\u003c/h4\u003e\u003cp\u003e因为一个I2C总线上可以有多个从设备,这样主设备需要通过地址来确定与哪个器件进行通信。I2C总线上每个从设备都有一个唯一的7bit地址物理识别,这个地址固化在芯片内部,并可以从芯片datasheet上找到。\u003c/p\u003e\u003cp\u003eI2C有16个保留地址。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/12.webp\" style=\"zoom:80%;\"/\u003e\u003cp\u003e其中I2C的从器件地址(本次SHT30只用到了7位的)的组成如下:\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e1byte = 7bit地址 + 1bit读写标志\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e注:1bit读写标志中,0-发送数据(写),1-请求数据(读)\u003c/p\u003e\u003cp\u003e有些时候一个总线上可能需要挂多个同一芯片,这样有些芯片还需要引出一个或几个引脚,由开发板设计电路来决定其具体地址,从而让不同芯片具有不同的7bit物理地址。\u003c/p\u003e\u003ch3 id=\"I2C通信时序\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#I2C%E9%80%9A%E4%BF%A1%E6%97%B6%E5%BA%8F\" class=\"headerlink\" title=\"I2C通信时序\"\u003e\u003c/a\u003eI2C通信时序\u003c/h3\u003e\u003cp\u003e在I2C总线上传送的每一位数据都由一个同步时钟脉冲相对应,即在SCL串行时钟的配合下,数据在SDA上从高位向低位依次串行传送每一位的数据。IIC通信时序图:\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/13.webp\" style=\"zoom:80%;\"/\u003e\u003ch4 id=\"(1)起始位\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%881%EF%BC%89%E8%B5%B7%E5%A7%8B%E4%BD%8D\" class=\"headerlink\" title=\"(1)起始位\"\u003e\u003c/a\u003e(1)起始位\u003c/h4\u003e\u003cp\u003eI2C总线在空闲时SDA和SCL都处于高电平状态(由上拉电阻拉成高电平),当主设备要开始一次I2C通信时就发送一个START(S)信号,这个起始位就可以告诉所有I2C从机, “我”要开始进行I2C通信了;当要结束一次I2C通信时,则发送一个STOP信号结束本次通信。\u003c/p\u003e\u003cp\u003eSTART(S):当SCL保持高电平时候,SDA出现下降沿,产生一个起始位,注意SCL一定要在高电平。\u003cbr/\u003eSTOP( P ):当SCL保持高电平时候,SDA出现上升沿,产生一个停止位,注意SCL一定要在高电平。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/14.webp\" style=\"zoom: 67%;\"/\u003e\u003ch4 id=\"(2)读写地址\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%882%EF%BC%89%E8%AF%BB%E5%86%99%E5%9C%B0%E5%9D%80\" class=\"headerlink\" title=\"(2)读写地址\"\u003e\u003c/a\u003e(2)读写地址\u003c/h4\u003e\u003cp\u003e主机在发送START信号之后,第2个时序应该立刻给出要通信的目标从机物理地址。此外,I2C总线是一种能够实现半双工通信的同步串行通信协议,站在主设备的角度来看应该具有读/写从设备的功能。\u003c/p\u003e\u003cp\u003e这时候I2C的读写地址除了7bit物理地址以外,还有1bit用来标识读/写方向位。这样I2C的从设备读写地址通常是一个字节,其中高7bit是上面描述的物理地址,最低位用来表示读写方向(0为写操作, 1为读操作)\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/15.webp\" style=\"zoom:67%;\"/\u003e\u003ch4 id=\"(3)I2C应答信号\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%883%EF%BC%89I2C%E5%BA%94%E7%AD%94%E4%BF%A1%E5%8F%B7\" class=\"headerlink\" title=\"(3)I2C应答信号\"\u003e\u003c/a\u003e(3)I2C应答信号\u003c/h4\u003e\u003cp\u003e主机往I2C总线上传输器件地址,所有的从机接收到这个地址后与自己的地址相比较若相同则发出一个应答ACK(Acknowledge)信号,主机收到这个应答信号后通讯连接建立成功,若未收到应答信号则表示寻址失败。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/16.webp\" style=\"zoom: 67%;\"/\u003e\u003cp\u003e此外,主/从机在之后的数据通信中,数据接收方(可能是主机也可能是从机)收到传输的一个字节数据后,需要给出响应,此时处在第九个时钟,发送端释放SDA线控制权,将SDA电平拉高,由接收方控制。\u003c/p\u003e\u003cul\u003e\u003cli\u003e若希望继续,则给出“应答(ACK, Acknowledge)”信号,即SDA为低电平\u003c/li\u003e\u003cli\u003e若不希望继续,则给出“非应答(NACK,Not Acknowledge) ”信号,即SDA为高电平\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"(4)数据位发送与接收\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%884%EF%BC%89%E6%95%B0%E6%8D%AE%E4%BD%8D%E5%8F%91%E9%80%81%E4%B8%8E%E6%8E%A5%E6%94%B6\" class=\"headerlink\" title=\"(4)数据位发送与接收\"\u003e\u003c/a\u003e(4)数据位发送与接收\u003c/h4\u003e\u003cp\u003e主机在收到从机的应答信号之后,开始给从机发送数据。SDA数据线上的每个字节必须是8位,每次传输的字节数量没有限制,每个字节发送完成之后,从机必须跟一个应答信号。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/17.webp\" style=\"zoom:67%;\"/\u003e\u003cp\u003eI2C总线通信时数据位传输采用MSB(最高位优先)方式发送,其中高电平表示数据位1,低电平表示数据位0。\u003c/p\u003e\u003cp\u003e当传输的数据位需要改变时(如上一个位发送的是1,下一个位要发送0),必须发生在SCL为低电平期间。另外在传输过程中, SDA上的数据位在SCL高电平期间必须保持稳定不变。\u003c/p\u003e\u003cp\u003e假设SCL在高电平,想一下是不是就会触发起始位或者终止位。想一想起始信号与停止信号是怎么发送的就会明白为什么SCL一定要在高电平才能改变SDA。\u003c/p\u003e\u003ch3 id=\"I2C协议主机收发数据流程\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#I2C%E5%8D%8F%E8%AE%AE%E4%B8%BB%E6%9C%BA%E6%94%B6%E5%8F%91%E6%95%B0%E6%8D%AE%E6%B5%81%E7%A8%8B\" class=\"headerlink\" title=\"I2C协议主机收发数据流程\"\u003e\u003c/a\u003eI2C协议主机收发数据流程\u003c/h3\u003e\u003ch4 id=\"(1)主机发送数据\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%881%EF%BC%89%E4%B8%BB%E6%9C%BA%E5%8F%91%E9%80%81%E6%95%B0%E6%8D%AE\" class=\"headerlink\" title=\"(1)主机发送数据\"\u003e\u003c/a\u003e(1)主机发送数据\u003c/h4\u003e\u003cp\u003e主机在检测到总线为“空闲状态”(即 SDA、SCL 线均为高电平)时,发送一个启动信号“S”,开始一次通信的开始;\u003c/p\u003e\u003cp\u003e主机接着发送一个从设备地址,它由7bit物理地址和1bit读写控制位R/W组成(此时R/W=0);\u003cbr/\u003e相对应的从机收到命令字节后向主机回馈应答信号 ACK(ACK=0);\u003c/p\u003e\u003cp\u003e主机收到从机的应答信号后开始发送第一个字节的数据;\u003c/p\u003e\u003cp\u003e从机收到数据后返回一个应答信号 ACK;\u003c/p\u003e\u003cp\u003e主机收到应答信号后再发送下一个数据字节;\u003c/p\u003e\u003cp\u003e当主机发送最后一个数据字节并收到从机的 ACK 后,通过向从机发送一个停止信号P结束本次通信并释放总线。从机收到P信号后也退出与主机之间的通信。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/18.webp\" style=\"zoom:67%;\"/\u003e\u003cblockquote\u003e\u003cp\u003e\u003ccode\u003e注意\u003c/code\u003e :\u003c/p\u003e\u003cul\u003e\u003cli\u003e主机通过发送地址码与对应的从机建立了通信关系,而挂接在总线上的其它从机虽然同时也收到了地址码,但因为与其自身的地址不相符合,因此提前退出与主机的通信;\u003c/li\u003e\u003cli\u003e主机的一次发送通信,其发送的数据数量不受限制。主机是通过 P 信号通知发送的结束,从机收到 P 信号后退出本次通信;\u003c/li\u003e\u003cli\u003e主机的每一次发送后都是通过从机的 ACK 信号了解从机的接收状况,如果应答错误则重发。\u003c/li\u003e\u003c/ul\u003e\u003c/blockquote\u003e\u003ch4 id=\"(2)主机接收数据\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%882%EF%BC%89%E4%B8%BB%E6%9C%BA%E6%8E%A5%E6%94%B6%E6%95%B0%E6%8D%AE\" class=\"headerlink\" title=\"(2)主机接收数据\"\u003e\u003c/a\u003e(2)主机接收数据\u003c/h4\u003e\u003cul\u003e\u003cli\u003e主机发送起始信号后,接着发送地址字节(其中R/W=1);\u003c/li\u003e\u003cli\u003e对应的从机收到地址字节后,返回一个应答信号并向主机发送数据;\u003c/li\u003e\u003cli\u003e主机收到数据后向从机反馈一个应答信号ACK;\u003c/li\u003e\u003cli\u003e从机收到应答信号后再向主机发送下一个数据;\u003c/li\u003e\u003cli\u003e当主机完成接收数据后,向从机发送一个NAK,从机收到非应答信号后便停止发送;\u003c/li\u003e\u003cli\u003e主机发送非应答信号后,再发送一个停止信号,释放总线结束通信。\u003c/li\u003e\u003c/ul\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/19.webp\" style=\"zoom:67%;\"/\u003e\u003cblockquote\u003e\u003cp\u003e\u003ccode\u003e注意\u003c/code\u003e :\u003c/p\u003e\u003cul\u003e\u003cli\u003e主机所接收数据的数量是由主机自身决定,当发送“非应答信号NAK”时从机便结束传送并释放总线。\u003c/li\u003e\u003cli\u003e非应答信号的两个作用:前一个数据接收成功,停止从机的再次发送。\u003c/li\u003e\u003c/ul\u003e\u003c/blockquote\u003e\u003ch2 id=\"SHT30-温湿度传感器\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#SHT30-%E6%B8%A9%E6%B9%BF%E5%BA%A6%E4%BC%A0%E6%84%9F%E5%99%A8\" class=\"headerlink\" title=\"SHT30 温湿度传感器\"\u003e\u003c/a\u003eSHT30 温湿度传感器\u003c/h2\u003e\u003cp\u003e\u003cdel\u003e)睡醒再写……\u003c/del\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003eSHT3X数据手册下载: \u003ca href=\"https://sensirion.com/media/documents/213E6A3B/63A5A569/Datasheet_SHT3x_DIS.pdf\"\u003e[Datasheet SHT3x-DIS]\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\u003ch3 id=\"SHT30简介\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#SHT30%E7%AE%80%E4%BB%8B\" class=\"headerlink\" title=\"SHT30简介\"\u003e\u003c/a\u003eSHT30简介\u003c/h3\u003e\u003cp\u003eSHT30数字温湿度传感器采用业内知名的瑞士Sensirion公司推出的新一代SHT30温湿度传感器芯片,它能够提供极高的可靠性和出色的长期稳定性,具有功耗低、反应快、抗干扰能力强等优点。IIC通讯,兼容3.3V/5V,可以非常容易的集成到智能楼宇、天气站、仓库存储、养殖、孵化等应用场景中,其中小米的温湿度传感器使用的也是SHT30。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/index.webp\" style=\"zoom: 50%;\"/\u003e\u003cul\u003e\u003cli\u003e高精度,内部自动校准,数字输出\u003c/li\u003e\u003cli\u003e低功耗、响应速度快、抗干扰能力强\u003c/li\u003e\u003cli\u003e兼容3.3V/5V控制器\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"SHT30工作原理\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#SHT30%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86\" class=\"headerlink\" title=\"SHT30工作原理\"\u003e\u003c/a\u003eSHT30工作原理\u003c/h3\u003e\u003cp\u003eSHT30 芯片有八个引脚,利用I2C进行数据传输,具有两个可选地址,宽电源电压从2.4V到5.5V。下面是引脚说明:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e管脚\u003c/th\u003e\u003cth\u003e名称\u003c/th\u003e\u003cth\u003e备注\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e1\u003c/td\u003e\u003ctd\u003eSDA\u003c/td\u003e\u003ctd\u003eI2C数据引脚,输入/输出\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e2\u003c/td\u003e\u003ctd\u003eADDR\u003c/td\u003e\u003ctd\u003e地址引脚,输入\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e3\u003c/td\u003e\u003ctd\u003eALENT\u003c/td\u003e\u003ctd\u003e报警引脚,输出;\u003cstrong\u003e不使用时悬空\u003c/strong\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e4\u003c/td\u003e\u003ctd\u003eSCL\u003c/td\u003e\u003ctd\u003eI2C时钟引脚,输入/输出\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e5\u003c/td\u003e\u003ctd\u003eVDD\u003c/td\u003e\u003ctd\u003e电源引脚,输入\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e6\u003c/td\u003e\u003ctd\u003enRESET\u003c/td\u003e\u003ctd\u003e复位引脚,输入\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e7\u003c/td\u003e\u003ctd\u003eR\u003c/td\u003e\u003ctd\u003e无用引脚,接地\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e8\u003c/td\u003e\u003ctd\u003eVSS\u003c/td\u003e\u003ctd\u003e接地引脚\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch4 id=\"SHT30地址选择\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#SHT30%E5%9C%B0%E5%9D%80%E9%80%89%E6%8B%A9\" class=\"headerlink\" title=\"SHT30地址选择\"\u003e\u003c/a\u003eSHT30地址选择\u003c/h4\u003e\u003cp\u003eSHT3x有两个地址,可以将\u003ccode\u003eADDR\u003c/code\u003e接到不同电平进行切换:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003eSHT3x-DIS\u003c/th\u003e\u003cth\u003eI2C地址\u003c/th\u003e\u003cth\u003e条件\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003eI2C地址A\u003c/td\u003e\u003ctd\u003e0x44(默认)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eADDR\u003c/code\u003e引脚接\u003cstrong\u003e低\u003c/strong\u003e电平\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eI2C地址B\u003c/td\u003e\u003ctd\u003e0x45\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eADDR\u003c/code\u003e引脚接\u003cstrong\u003e高\u003c/strong\u003e电平\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch4 id=\"SHT3x电路图\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#SHT3x%E7%94%B5%E8%B7%AF%E5%9B%BE\" class=\"headerlink\" title=\"SHT3x电路图\"\u003e\u003c/a\u003eSHT3x电路图\u003c/h4\u003e\u003cp\u003e因为是开漏,所以记得将\u003ccode\u003eSDA\u003c/code\u003e,\u003ccode\u003eSCL\u003c/code\u003e两个引脚拉高。(因为直接买的模块,所以就不用操心了。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/20.webp\" alt=\"电路图\" style=\"zoom:67%;\"/\u003e\u003ch3 id=\"SHT30数据采集\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#SHT30%E6%95%B0%E6%8D%AE%E9%87%87%E9%9B%86\" class=\"headerlink\" title=\"SHT30数据采集\"\u003e\u003c/a\u003eSHT30数据采集\u003c/h3\u003e\u003cp\u003eSHT3x有单次测量命令数据采集模式和周期性测量命令数据采集模式,这里选择\u003cstrong\u003e周期性测量命令数据采集模式\u003c/strong\u003e。\u003c/p\u003e\u003ch4 id=\"定期数据采集模式的测量命令\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%AE%9A%E6%9C%9F%E6%95%B0%E6%8D%AE%E9%87%87%E9%9B%86%E6%A8%A1%E5%BC%8F%E7%9A%84%E6%B5%8B%E9%87%8F%E5%91%BD%E4%BB%A4\" class=\"headerlink\" title=\"定期数据采集模式的测量命令\"\u003e\u003c/a\u003e定期数据采集模式的测量命令\u003c/h4\u003e\u003cp\u003e在这种模式下,一个发出的测量命令会产生一个数据对流。每个数据对由一个16位温度值和一个16位湿度值(按此顺序)组成。在周期模式下,可以选择不同的测量命令。对应的16位命令如表9所示。它们在可重复性(低、中、高)和数据采集频率(每秒0.5、1、2、4和10次测量值,mps)方面存在差异。在此模式下不能选择时钟拉伸。数据采集频率和可重复性设置会影响传感器的测量持续时间和电流消耗。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/21.webp\" style=\"zoom:80%;\"/\u003e\u003cp\u003e根据表格的通信时序,主机发送起始信号,然后发送从机地址加写指令命令,等待从机应答,再发送命令的高位(MSB),等待从机应答,再发送命令的低位(LSB)。\u003c/p\u003e\u003ch4 id=\"周期模式下测量结果的读数\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%91%A8%E6%9C%9F%E6%A8%A1%E5%BC%8F%E4%B8%8B%E6%B5%8B%E9%87%8F%E7%BB%93%E6%9E%9C%E7%9A%84%E8%AF%BB%E6%95%B0\" class=\"headerlink\" title=\"周期模式下测量结果的读数\"\u003e\u003c/a\u003e周期模式下测量结果的读数\u003c/h4\u003e\u003cp\u003e\u003cstrong\u003e读数据的命令是: \u003ccode\u003e0xE000\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/22.webp\" style=\"zoom:67%;\"/\u003e\u003cp\u003e读数可以通过上表所示的命令启动。如果没有测量数据,I2C读取头用NACK而不是ACK(表中的位9)响应,通信停止。\u003c/p\u003e\u003cp\u003e空白的数据块是由32发送,黑色的数据块是由SHT30发送。\u003c/p\u003e\u003cp\u003e根据表中的通信时序,获取SHT30的温湿度数据,获取到的是16位的温度值和16位的湿度值,温度和湿度后都有CRC-8校验。\u003c/p\u003e\u003ch4 id=\"SHT30复位\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#SHT30%E5%A4%8D%E4%BD%8D\" class=\"headerlink\" title=\"SHT30复位\"\u003e\u003c/a\u003eSHT30复位\u003c/h4\u003e\u003cp\u003eSHT30的系统复位有两种方式,一种是发出命令(软重置),一种是通过外部向专用复位引脚(\u003ccode\u003enRESET\u003c/code\u003e)发送脉冲。我们选择\u003cstrong\u003e软重置\u003c/strong\u003e。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e软重置的命令是: \u003ccode\u003e0x30A2\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/23.webp\" style=\"zoom:67%;\"/\u003e\u003ch4 id=\"差错校验\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%B7%AE%E9%94%99%E6%A0%A1%E9%AA%8C\" class=\"headerlink\" title=\"差错校验\"\u003e\u003c/a\u003e差错校验\u003c/h4\u003e\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/f0c68eebb8a1\"\u003eCRC8校验 - 简书 (jianshu.com)\u003c/a\u003e \u003cdel\u003e(原理进行一个参考链接的抄)\u003c/del\u003e\u003c/p\u003e\u003cp\u003eCRC覆盖了先前传输的两个数据字节的内容。 为了计算校验和,仅使用这两个先前发送的数据字节。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/24.webp\" style=\"zoom:67%;\"/\u003e\u003ch4 id=\"温湿度转换\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E6%B8%A9%E6%B9%BF%E5%BA%A6%E8%BD%AC%E6%8D%A2\" class=\"headerlink\" title=\"温湿度转换\"\u003e\u003c/a\u003e温湿度转换\u003c/h4\u003e\u003cp\u003e测量数据始终以 16 位值(无符号整数)形式传输。 这些值已经线性化并补偿了温度和电源电压的影响。 可以使用以下公式将这些原始值转换为物理标度。\u003c/p\u003e\u003cp\u003e相对湿度换算公式(结果以%RH为单位):\u003c/p\u003e\u003cp\u003e$$RH=100\\times \\frac{S_{RH}}{2^{16}-1}$$\u003c/p\u003e\u003cp\u003e温度换算公式(结果以 °C 和 °F 为单位):\u003c/p\u003e\u003cp\u003e$$T[°C]=-45+175\\times\\frac{S_T}{2^{16}-1}$$\u003c/p\u003e\u003cp\u003e$$T[°F]=-49+315\\times\\frac{S_T}{2^{16}-1}$$\u003c/p\u003e\u003cp\u003e$S_{RH}$ 和 $S_{T}$ 分别表示湿度和温度的原始传感器输出。 仅当$S_{RH}$ 和 $S_{T}$ 以十进制表示形式使用时,这些公式才能正确工作。\u003c/p\u003e\u003ch2 id=\"代码驱动SHT30\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E4%BB%A3%E7%A0%81%E9%A9%B1%E5%8A%A8SHT30\" class=\"headerlink\" title=\"代码驱动SHT30\"\u003e\u003c/a\u003e代码驱动SHT30\u003c/h2\u003e\u003cp\u003e首先使用 STM32CubeMX进行一些常规配置,时钟,调试选项……\u003c/p\u003e\u003cp\u003e然后配置串口: \u003ca href=\"https://blog.ksfu.top/posts/b619/\"\u003eSTM32\u0026amp;UART串口通信(使用CubeMX)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e在I2C2中选择I2C,打开硬件I2C。\u003c/p\u003e\u003ch3 id=\"HAL库中I2C发送接收数据函数\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#HAL%E5%BA%93%E4%B8%ADI2C%E5%8F%91%E9%80%81%E6%8E%A5%E6%94%B6%E6%95%B0%E6%8D%AE%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"HAL库中I2C发送接收数据函数\"\u003e\u003c/a\u003eHAL库中I2C发送接收数据函数\u003c/h3\u003e\u003ch4 id=\"(1)HAL-I2C-Master-Transmit\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%881%EF%BC%89HAL-I2C-Master-Transmit\" class=\"headerlink\" title=\"(1)HAL_I2C_Master_Transmit()\"\u003e\u003c/a\u003e(1)HAL_I2C_Master_Transmit()\u003c/h4\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e函数原型\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token function\"\u003eHAL_I2C_Master_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eI2C_HandleTypeDef \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehi2c\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e DevAddress\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003epData\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e Size\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e Timeout\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e函数功能:IIC发送数据,主机需要将数据通过IIC发送过去\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e参数介绍:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e*hi2c\u003c/code\u003e 设置使用的是那个IIC\u003c/li\u003e\u003cli\u003e\u003ccode\u003eDevAddress\u003c/code\u003e 写入的地址,设置写入数据的地址\u003c/li\u003e\u003cli\u003e\u003ccode\u003e*pData\u003c/code\u003e 需要写入的数据\u003c/li\u003e\u003cli\u003e\u003ccode\u003eSize\u003c/code\u003e 要发送的字节数\u003c/li\u003e\u003cli\u003e\u003ccode\u003eTimeout\u003c/code\u003e 最大传输时间,超过传输时间将自动退出传输函数\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e使用到的函数参数讲解():\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token function\"\u003eHAL_I2C_Master_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehi2c2\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e SHT30_ADDR_WR\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e\u0026amp;hi2c2\u003c/code\u003e:我们使用的是:\u003ccode\u003ehi2c2\u003c/code\u003e,传地址\u003ccode\u003e\u0026amp;hi2c2\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003eSHT30_ADDR_WR\u003c/code\u003e:我们宏定义了写的地址,传写的地址\u003ccode\u003e#define SHT30_ADDR_WR (SHT30_ADDR\u0026lt;\u0026lt;1)\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003e(uint8_t*)buf\u003c/code\u003e:我们将需要传的数据保存在\u003ccode\u003ebuf\u003c/code\u003e中\u003c/li\u003e\u003cli\u003e\u003ccode\u003e2\u003c/code\u003e:传\u003ccode\u003e2\u003c/code\u003e个字节,\u003ccode\u003e16\u003c/code\u003e个位\u003c/li\u003e\u003cli\u003e\u003ccode\u003e0xFFFF\u003c/code\u003e超时:\u003ccode\u003e0xFFFF\u003c/code\u003e(4 294 967 295也就是无符号整型所能表示的最大值)\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"HAL-I2C-Master-Receive\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#HAL-I2C-Master-Receive\" class=\"headerlink\" title=\"HAL_I2C_Master_Receive()\"\u003e\u003c/a\u003eHAL_I2C_Master_Receive()\u003c/h4\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e函数原型\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token function\"\u003eHAL_I2C_Master_Receive\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eI2C_HandleTypeDef \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehi2c\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e DevAddress\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003epData\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e Size\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e Timeout\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e函数功能:IIC接收数据,从机发送给主机,主机需要将数据通过IIC接收\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e函数参数和HAL_I2C_Master_Transmit()大概是一样的,只是取到的数据保存在pData中。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e使用到的函数参数讲解():\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token function\"\u003eHAL_I2C_Master_Receive\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehi2c2\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e SHT30_ADDR_RD\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e buf\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e SHT30_DATA_SIZE\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e\u0026amp;hi2c2\u003c/code\u003e:我们使用的是:\u003ccode\u003ehi2c2\u003c/code\u003e,传地址\u003ccode\u003e\u0026amp;hi2c2\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003eSHT30_ADDR_RD\u003c/code\u003e:我们宏定义了读的地址,传读的地址\u003ccode\u003e#define SHT30_ADDR_RD ((SHT30_ADDR\u0026lt;\u0026lt;1) | 0x01)\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003ebuf\u003c/code\u003e:我们将获取到的数据保存在\u003ccode\u003ebuf\u003c/code\u003e中\u003c/li\u003e\u003cli\u003e\u003ccode\u003eSHT30_DATA_SIZE\u003c/code\u003e:宏定义,6个字节\u003ccode\u003e#define SHT30_DATA_SIZE 6\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003e0xFFFF\u003c/code\u003e超时:\u003ccode\u003e0xFFFF\u003c/code\u003e(4 294 967 295也就是无符号整型所能表示的最大值)\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"头文件-sht30-h\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%A4%B4%E6%96%87%E4%BB%B6-sht30-h\" class=\"headerlink\" title=\"头文件 sht30.h\"\u003e\u003c/a\u003e头文件 \u003ccode\u003esht30.h\u003c/code\u003e\u003c/h3\u003e\u003cp\u003e在头文件中我们提前定义好相关命令与函数原型。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eenum\u003c/code\u003e用于定义枚举类型,它本质上是一种整数类型。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003eifndef\u003c/span\u003e \u003cspan class=\"token expression\"\u003eINC_SHT30_H_\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003eINC_SHT30_H_\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;stm32f4xx_hal.h\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003eSHT30_ADDR\u003c/span\u003e \u003cspan class=\"token expression\"\u003e\u003cspan class=\"token number\"\u003e0x44\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003eSHT30_ADDR_WR\u003c/span\u003e \u003cspan class=\"token expression\"\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eSHT30_ADDR\u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003eSHT30_ADDR_RD\u003c/span\u003e \u003cspan class=\"token expression\"\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eSHT30_ADDR\u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e|\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003eSHT30_DATA_SIZE\u003c/span\u003e \u003cspan class=\"token expression\"\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token keyword\"\u003etypedef\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eenum\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 软件复位命令 */\u003c/span\u003e SOFT_RESET_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x30A2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 单次测量模式 命名格式:Repeatability_CS_CMD CS: Clock stretching */\u003c/span\u003e HIGH_ENABLED_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2C06\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e MEDIUM_ENABLED_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2C0D\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e LOW_ENABLED_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2C10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e HIGH_DISABLED_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2400\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e MEDIUM_DISABLED_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x240B\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e LOW_DISABLED_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2416\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 周期测量模式 命名格式:Repeatability_MPS_CMD MPS:measurement per second */\u003c/span\u003e HIGH_0_5_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2032\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e MEDIUM_0_5_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2024\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e LOW_0_5_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x202F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e HIGH_1_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2130\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e MEDIUM_1_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2126\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e LOW_1_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x212D\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e HIGH_2_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2236\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e MEDIUM_2_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2220\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e LOW_2_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x222B\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e HIGH_4_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2334\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e MEDIUM_4_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2322\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e LOW_4_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2329\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e HIGH_10_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2737\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e MEDIUM_10_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2721\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e LOW_10_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x272A\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 周期测量模式读取数据命令 */\u003c/span\u003e READOUT_FOR_PERIODIC_MODE \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xE000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e SHT30_CMD\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eextern\u003c/span\u003e \u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003esht30_soft_reset\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eextern\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eSHT30_Init\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eextern\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eSHT30_Read_Dat\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eextern\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eCheckCrc8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e \u003cspan class=\"token keyword\"\u003econst\u003c/span\u003e message\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e initial_value\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eextern\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eSHT30_Dat_To_Float\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e \u003cspan class=\"token keyword\"\u003econst\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e temperature\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e humidity\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003eendif\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* INC_SHT30_H_ */\u003c/span\u003e\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"主要文件-sht30-c\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E4%B8%BB%E8%A6%81%E6%96%87%E4%BB%B6-sht30-c\" class=\"headerlink\" title=\"主要文件 sht30.c\"\u003e\u003c/a\u003e主要文件 \u003ccode\u003esht30.c\u003c/code\u003e\u003c/h3\u003e\u003cp\u003e先包含主要的一些头文件\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;stdio.h\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;i2c.h\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;sht30.h\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"发送指令\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%8F%91%E9%80%81%E6%8C%87%E4%BB%A4\" class=\"headerlink\" title=\"发送指令\"\u003e\u003c/a\u003e发送指令\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e/** * @brief 向SHT30发送一条指令(16bit) * @param cmd —— SHT30指令(在SHT30_MODE中枚举定义) * @retval 成功返回HAL_OK*/\u003c/span\u003e\u003cspan class=\"token keyword\"\u003estatic\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e \u003cspan class=\"token function\"\u003esht30_send_cmd\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eSHT30_CMD cmd\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e buf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e cmd \u003cspan class=\"token operator\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e cmd\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_I2C_Master_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehi2c2\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e SHT30_ADDR_WR\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"复位SHT30\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%A4%8D%E4%BD%8DSHT30\" class=\"headerlink\" title=\"复位SHT30\"\u003e\u003c/a\u003e复位SHT30\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e/** * @brief 复位SHT30 * @param none * @retval none*/\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003esht30_soft_reset\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token function\"\u003esht30_send_cmd\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eSOFT_RESET_CMD\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_Delay\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"初始化SHT30\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%88%9D%E5%A7%8B%E5%8C%96SHT30\" class=\"headerlink\" title=\"初始化SHT30\"\u003e\u003c/a\u003e初始化SHT30\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-C\" data-language=\"C\"\u003e\u003ccode class=\"language-C\"\u003e/** * @brief 初始化SHT30 * @param none * @retval 成功返回HAL_OK * @note 周期测量模式*/uint8_t SHT30_Init(void) {return sht30_send_cmd(MEDIUM_2_CMD);}\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"读取数据\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E8%AF%BB%E5%8F%96%E6%95%B0%E6%8D%AE\" class=\"headerlink\" title=\"读取数据\"\u003e\u003c/a\u003e读取数据\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e/** * @brief 从SHT30读取一次数据 * @param dat —— 存储读取数据的地址(6个字节数组) * @retval 成功 —— 返回HAL_OK*/\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eSHT30_Read_Dat\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token function\"\u003esht30_send_cmd\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eREADOUT_FOR_PERIODIC_MODE\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_I2C_Master_Receive\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehi2c2\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e SHT30_ADDR_RD\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"CRC-8校验\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#CRC-8%E6%A0%A1%E9%AA%8C\" class=\"headerlink\" title=\"CRC-8校验\"\u003e\u003c/a\u003eCRC-8校验\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003eCRC8_POLYNOMIAL\u003c/span\u003e \u003cspan class=\"token expression\"\u003e\u003cspan class=\"token number\"\u003e0x31\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eCheckCrc8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e \u003cspan class=\"token keyword\"\u003econst\u003c/span\u003e message\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e initial_value\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e remainder\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//余数\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e i \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e j \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//循环变量\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 初始化 */\u003c/span\u003e remainder \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e initial_value\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ej \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e j \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ej\u003cspan class=\"token operator\"\u003e++\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e remainder \u003cspan class=\"token operator\"\u003e^=\u003c/span\u003e message\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ej\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 从最高位开始依次计算 */\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ei \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e i \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e i\u003cspan class=\"token operator\"\u003e++\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eremainder \u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x80\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e remainder \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eremainder \u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eCRC8_POLYNOMIAL\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e remainder \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eremainder \u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 返回计算的CRC码 */\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e remainder\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"温湿度转换-1\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E6%B8%A9%E6%B9%BF%E5%BA%A6%E8%BD%AC%E6%8D%A2-1\" class=\"headerlink\" title=\"温湿度转换\"\u003e\u003c/a\u003e温湿度转换\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e/** * @brief 将SHT30接收的6个字节数据进行CRC校验,并转换为温度值和湿度值 * @param dat —— 存储接收数据的地址(6个字节数组) * @retval 校验成功 —— 返回0 * 校验失败 —— 返回1,并设置温度值和湿度值为0*/\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eSHT30_Dat_To_Float\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e \u003cspan class=\"token keyword\"\u003econst\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e temperature\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e humidity\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e recv_temperature \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e recv_humidity \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 校验温度数据和湿度数据是否接收正确 */\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eCheckCrc8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e!=\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e||\u003c/span\u003e \u003cspan class=\"token function\"\u003eCheckCrc8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e!=\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 转换温度数据 */\u003c/span\u003e recv_temperature \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e|\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003etemperature \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e45\u003c/span\u003e \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e \u003cspan class=\"token number\"\u003e175\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003erecv_temperature\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e65535\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 转换湿度数据 */\u003c/span\u003e recv_humidity \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e|\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehumidity \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e100\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003erecv_humidity \u003cspan class=\"token operator\"\u003e/\u003c/span\u003e \u003cspan class=\"token number\"\u003e65535\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"在main-c中使用SHT30\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%9C%A8main-c%E4%B8%AD%E4%BD%BF%E7%94%A8SHT30\" class=\"headerlink\" title=\"在main.c中使用SHT30\"\u003e\u003c/a\u003e在\u003ccode\u003emain.c\u003c/code\u003e中使用SHT30\u003c/h3\u003e\u003cp\u003e在\u003ccode\u003eint main()\u003c/code\u003e外定义格式化函数:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003ereport_tempRH_json\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003etemperature\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehumidity\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e在\u003ccode\u003eint main()\u003c/code\u003e的\u003ccode\u003ewhile (1)\u003c/code\u003e前定义相关变量与SHT30初始化:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e temperature \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0.0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e humidity \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0.0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003esht30_soft_reset\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eSHT30_Init\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e HAL_OK\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eprintf\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;sht30 init is ok!\\r\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eprintf\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;sht30 init is not ok!\\r\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e在\u003ccode\u003ewhile(1)\u003c/code\u003e内调用格式化函数,每次调用后进行适当延时。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token function\"\u003ereport_tempRH_json\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003etemperature\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehumidity\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_Delay\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"格式化函数\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E6%A0%BC%E5%BC%8F%E5%8C%96%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"格式化函数\"\u003e\u003c/a\u003e格式化函数\u003c/h4\u003e\u003cp\u003e将格式化函数写在 \u003ccode\u003e/* USER CODE BEGIN 4 */\u003c/code\u003e 与 \u003ccode\u003e/* USER CODE END 4 */\u003c/code\u003e 之中。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e字符串格式化输出 \u003ccode\u003esprintf()\u003c/code\u003e:\u003c/p\u003e\u003cp\u003e\u003ccode\u003eint sprintf(char * s, const char * format, ...);\u003c/code\u003e定义在\u003ccode\u003estdio.h\u003c/code\u003e中,适用于 \u003ccode\u003e string\u003c/code\u003e 版本的格式化输出,其目标不是控制台,而是一个字符串。\u003c/p\u003e\u003cp\u003e用\u003ccode\u003esprintf()\u003c/code\u003e 格式化一个字符串,例如:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e buf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e256\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003esprintf\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;Name:%s,Age:%d,Weight:%.2f\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;LiMing\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e1.68\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e运行后目标\u003ccode\u003ebuf\u003c/code\u003e格式化为:\u003ccode\u003eName:LiMing,Age:30,Weight:1.68\u003c/code\u003e\u003c/p\u003e\u003cp\u003e\u003ccode\u003esprintf()\u003c/code\u003e对于字符串的处理非常有用。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e将SHT30温湿度数据格式化并通过串口输出:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003ereport_tempRH_json\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003etemperature\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehumidity\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eSHT30_Read_Dat\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e HAL_OK\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eSHT30_Dat_To_Float\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003etemperature\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003ehumidity\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e HAL_OK\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e buf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e128\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003ememset\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003esizeof\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003esnprintf\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003esizeof\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;{\\\u0026#34;Temperature\\\u0026#34;:\\\u0026#34;%.2f\\\u0026#34;, \\\u0026#34;Humidity\\\u0026#34;:\\\u0026#34;%.2f\\\u0026#34;}\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003etemperature\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehumidity\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token function\"\u003estrlen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eprintf\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;sht30 check failed!\\r\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eprintf\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;sht30 read date failed!\\r\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch2 id=\"结果对比\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E7%BB%93%E6%9E%9C%E5%AF%B9%E6%AF%94\" class=\"headerlink\" title=\"结果对比\"\u003e\u003c/a\u003e结果对比\u003c/h2\u003e\u003cp\u003e随便复制几段单片机串口发过来的:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e24\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e53.824\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.36\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.92\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e24\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e55.818\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.34\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.85\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e24\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e57.818\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.41\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.88\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e24\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e59.815\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.33\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.98\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e01.809\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.40\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.89\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e03.808\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.38\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.96\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e05.804\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.38\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.94\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e07.799\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.38\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;54.02\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e09.796\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.36\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.84\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e11.807\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.37\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.82\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e13.788\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.36\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.71\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e手机上看一眼小米温湿度传感器的:\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/res.webp\" style=\"zoom:67%;\"/\u003e\u003cp\u003e还行。\u003c/p\u003e\u003ch2 id=\"参考链接\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\" class=\"headerlink\" title=\"参考链接\"\u003e\u003c/a\u003e参考链接\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://www.analog.com/cn/analog-dialogue/articles/i2c-communication-protocol-understanding-i2c-primer-pmbus-and-smbus.html\"\u003eI2C通信协议:了解I2C Primer、 PMBus和SMBus | 亚德诺半导体 (analog.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/m0_51429770/article/details/127661382?spm=1001.2014.3001.5506\"\u003eI2C协议介绍以及HAL库实现I2C对SHT30温湿度采样_hal i2c_HaiQinyanAN的博客-CSDN博客\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/Yangtzey/article/details/129660763?spm=1001.2014.3001.5506\"\u003eIIC及配置应用(SHT30读取温湿度)_嵌不入的博客-CSDN博客\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/weixin_46251230/article/details/126722112?spm=1001.2014.3001.5506\"\u003eSTM32物联网项目-SHT30温湿度采集(IIC通信)_ONE_Day|的博客-CSDN博客\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://sensirion.com/media/documents/213E6A3B/63A5A569/Datasheet_SHT3x_DIS.pdf\"\u003e[Datasheet SHT3x-DIS]\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/f0c68eebb8a1\"\u003eCRC8校验 - 简书 (jianshu.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/\"\u003eSTM32\u0026amp;UART串口通信(使用CubeMX)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/6c49/"},{"title":"STM32温湿度测量与显示-单总线协议学习","time":"2023-05-18T15:55:06Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"STM32温湿度测量与显示-单总线协议学习\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#STM32%E6%B8%A9%E6%B9%BF%E5%BA%A6%E6%B5%8B%E9%87%8F%E4%B8%8E%E6%98%BE%E7%A4%BA-%E5%8D%95%E6%80%BB%E7%BA%BF%E5%8D%8F%E8%AE%AE%E5%AD%A6%E4%B9%A0\" class=\"headerlink\" title=\"STM32温湿度测量与显示-单总线协议学习\"\u003e\u003c/a\u003eSTM32温湿度测量与显示-单总线协议学习\u003c/h1\u003e\u003cp\u003e为了验收个小玩意用一晚上搓了一个,比较氵。 \u003cdel\u003e那就氵篇博客算了。\u003c/del\u003e \u003c/p\u003e\u003cp\u003e手头正好有个ST的板子,型号是STM32G431KBT6,主频170M。刚好拿过来用了。(真好用啊,就是做这个有点浪费。\u003c/p\u003e\u003cp\u003e温湿度传感器使用 \u003cstrong\u003eDHT11\u003c/strong\u003e (单总线协议),屏幕是个IIC的小OLED,还用到了串口来看数据是否正确。(没了,确实氵。\u003c/p\u003e\u003cp\u003e效果图:\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/DHT11/index.webp\" alt=\"效果图\" style=\"zoom: 33%;\"/\u003e\u003ch2 id=\"准备\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E5%87%86%E5%A4%87\" class=\"headerlink\" title=\"准备\"\u003e\u003c/a\u003e准备\u003c/h2\u003e\u003cp\u003e首先去官网下载 \u003cstrong\u003eSTM32G4xx\u003c/strong\u003e 的包。(\u003ca href=\"https://keilpack.azureedge.net/pack/Keil.STM32G4xx_DFP.1.5.0.pack\"\u003eKeil.STM32G4xx_DFP.1.5.0.pack\u003c/a\u003e)。官网直连下载很慢,很慢……\u003c/p\u003e\u003cp\u003e然后去CubeMX里面新建工程,因为是官方的板子,所以可以直接选择这块板子的模板创建。时钟设置170M(默认的)。选择一个没有中文的路径生成工程。\u003c/p\u003e\u003cp\u003e接下来的流程是:\u003c/p\u003e\u003cul\u003e\u003cli\u003e设置串口\u003c/li\u003e\u003cli\u003e驱动OLED屏幕\u003cul\u003e\u003cli\u003e重新配置延时函数\u003c/li\u003e\u003cli\u003e添加软件IIC\u003c/li\u003e\u003cli\u003e添加OLED驱动\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e驱动DHT11温湿度传感器(\u003cstrong\u003e单总线协议的学习\u003c/strong\u003e)\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e因为使用的OLED驱动比较特殊,添加之后无法使用原来的 \u003ccode\u003eHAL_Dealy()\u003c/code\u003e 函数,需要按照该驱动的要求重新配置延时函数,之后使用其提供的 \u003ccode\u003edelay_ms()\u003c/code\u003e 和 \u003ccode\u003edelay_us()\u003c/code\u003e 两个函数代替 \u003ccode\u003eHAL_Dealy()\u003c/code\u003e 函数,当然实际上是方便不少的,因为 \u003ccode\u003eHAL_Dealy()\u003c/code\u003e 是毫秒级延时,所以直接使用上面两个函数可以让自己少写一个微秒的延时函数,具体原理可以参考\u003ca href=\"https://blog.ksfu.top/posts/463a/\"\u003e之前的一篇博客\u003c/a\u003e。\u003c/p\u003e\u003ch2 id=\"具体实现\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E5%85%B7%E4%BD%93%E5%AE%9E%E7%8E%B0\" class=\"headerlink\" title=\"具体实现\"\u003e\u003c/a\u003e具体实现\u003c/h2\u003e\u003ch3 id=\"串口设置\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E4%B8%B2%E5%8F%A3%E8%AE%BE%E7%BD%AE\" class=\"headerlink\" title=\"串口设置\"\u003e\u003c/a\u003e串口设置\u003c/h3\u003e\u003cp\u003e串口的具体实现参考我之前的博客步骤:\u003ca href=\"https://blog.ksfu.top/posts/b619/\"\u003eSTM32\u0026amp;UART串口通信(使用CubeMX)\u003c/a\u003e 。因为这次没有用到收的功能,所以只需要设置好发送功能即可。\u003c/p\u003e\u003cp\u003e本次使用USART1。其实 \u003cstrong\u003e更推荐\u003c/strong\u003e 使用USART2的,因为官方的板子上本身就有串口芯片,使用的USART2,这样用一根USB线连电脑上就可以同时供电,下载和查看串口数据了,不用自己再连一个USB转串口的模块了,还能腾出来两个引脚,这STM32G431KBT6的引脚是真的少。 \u003cdel\u003e(还是官方板子好用,就是贵\u003c/del\u003e\u003c/p\u003e\u003chr/\u003e\u003cblockquote\u003e\u003cp\u003e\u003cdel\u003e)晚上要去重庆,剩下的具体流程就等下周回来再写了。\u003c/del\u003e\u003c/p\u003e\u003cp\u003e\u003cdel\u003e回来了,发现实习二面寄了,悲)\u003c/del\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003chr/\u003e\u003ch3 id=\"驱动OLED屏幕\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E9%A9%B1%E5%8A%A8OLED%E5%B1%8F%E5%B9%95\" class=\"headerlink\" title=\"驱动OLED屏幕\"\u003e\u003c/a\u003e驱动OLED屏幕\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003e这一节可以略过。\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e本次的驱动选自 \u003ca href=\"http://www.lcdwiki.com/zh/Main_Page\"\u003eLCD wiki\u003c/a\u003e 。\u003c/p\u003e\u003cp\u003e因为 LCD wiki 的驱动为gb2312编码,为了以后写的舒服,我先转换为了utf-8,具体可以参考:\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.ksfu.top/posts/2d8a/\"\u003e批量转换文件编码gb2312转utf-8\u003c/a\u003e 。但是注意,代码里有中文的地方,比如 \u003ccode\u003etest.c\u003c/code\u003e,\u003ccode\u003eoledfont.h\u003c/code\u003e等文件需要保持原来的gb2312。\u003cdel\u003e(看见编译时候的编码报错真是心累呐\u003c/del\u003e\u003c/p\u003e\u003cp\u003eLCD wiki 的驱动使用标准库编写,放入HAL库的项目中会狠狠报错,所以要进行修改)我自己修改了一下,以后写一下修改过程emmm(咕咕\u003c/p\u003e\u003ch4 id=\"重新配置延时函数\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E9%87%8D%E6%96%B0%E9%85%8D%E7%BD%AE%E5%BB%B6%E6%97%B6%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"重新配置延时函数\"\u003e\u003c/a\u003e重新配置延时函数\u003c/h4\u003e\u003cp\u003e添加 \u003ccode\u003esys.h\u003c/code\u003e , \u003ccode\u003esys.c\u003c/code\u003e , \u003ccode\u003edelay.h\u003c/code\u003e , \u003ccode\u003edelay.c\u003c/code\u003e ,注意修改里面包含的头文件为对应的 \u003ccode\u003e#include \u0026#34;stm32g4xx.h\u0026#34;\u003c/code\u003e\u003c/p\u003e\u003cp\u003e之后在 \u003ccode\u003emain.c\u003c/code\u003e 里面进行初始化: \u003ccode\u003edelay_init();\u003c/code\u003e 初始化完成后以后的延时就用 \u003ccode\u003edelay_ms()\u003c/code\u003e 和 \u003ccode\u003edelay_us()\u003c/code\u003e 。\u003c/p\u003e\u003ch4 id=\"添加软件IIC\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E6%B7%BB%E5%8A%A0%E8%BD%AF%E4%BB%B6IIC\" class=\"headerlink\" title=\"添加软件IIC\"\u003e\u003c/a\u003e添加软件IIC\u003c/h4\u003e\u003cp\u003e添加 \u003ccode\u003eiic.c\u003c/code\u003e , \u003ccode\u003eiic.h\u003c/code\u003e ,注意修改里面 \u003ccode\u003eSCL\u003c/code\u003e 与 \u003ccode\u003eSDA\u003c/code\u003e 的引脚。本次分别使用 \u003ccode\u003ePA1\u003c/code\u003e , \u003ccode\u003ePA0\u003c/code\u003e 。\u003c/p\u003e\u003ch4 id=\"添加OLED驱动\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E6%B7%BB%E5%8A%A0OLED%E9%A9%B1%E5%8A%A8\" class=\"headerlink\" title=\"添加OLED驱动\"\u003e\u003c/a\u003e添加OLED驱动\u003c/h4\u003e\u003cp\u003e添加 \u003ccode\u003ebmp.h\u003c/code\u003e , \u003ccode\u003egui.h\u003c/code\u003e , \u003ccode\u003egui.c\u003c/code\u003e , \u003ccode\u003eoled.c\u003c/code\u003e , \u003ccode\u003eoled.h\u003c/code\u003e , \u003ccode\u003eoledfont.h\u003c/code\u003e , \u003ccode\u003etest.c\u003c/code\u003e , \u003ccode\u003etest.h\u003c/code\u003e 。\u003c/p\u003e\u003cp\u003e这次所用的汉字取模保存至 \u003ccode\u003eoledfont.h\u003c/code\u003e 内,注意为gb2312编码。\u003c/p\u003e\u003cp\u003e取模使用 \u003ccode\u003ePCtoLCD2002\u003c/code\u003e ,为逐行式,顺向。考虑到屏幕大小,取模的大小为16×16。添加在 \u003ccode\u003econst typFNT_GB16 cfont16[]\u003c/code\u003e 的后面。如:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token string\"\u003e\u0026#34;康\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x80\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x3F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFE\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x80\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x2F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xF8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x88\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x3F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFE\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x88\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x2F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xF8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x28\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x80\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xC4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xA8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x44\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x90\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x48\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x88\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x92\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x86\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token comment\"\u003e/*\u0026#34;康\u0026#34;*/\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;师\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x08\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x0B\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFE\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x48\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x48\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x48\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x49\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFC\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x49\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x49\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x49\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x49\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x49\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x09\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x34\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x11\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x28\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x40\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token comment\"\u003e/*\u0026#34;师\u0026#34;*/\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;傅\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x08\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x50\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x08\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x48\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x0F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFE\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x40\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x17\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFC\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x34\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x44\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x37\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFC\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x54\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x44\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x97\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFC\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x14\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x44\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x08\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x1F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFE\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x12\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x08\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x11\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x08\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x11\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x28\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token comment\"\u003e/*\u0026#34;傅\u0026#34;*/\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e显示汉字使用 \u003ccode\u003eGUI_ShowCHinese(uint8_t x,uint8_t y,uint8_t hsize,uint8_t *str,uint8_t mode)\u003c/code\u003e ,使用实例如 \u003ccode\u003eGUI_ShowCHinese(40,2,16,\u0026#34;康师傅\u0026#34;,1);\u003c/code\u003e\u003c/p\u003e\u003cp\u003e该函数说明:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e/***************************************************************************** * @name :void GUI_ShowCHinese(uint8_t x,uint8_t y,uint8_t hsize,uint8_t *str,uint8_t mode) * @date :2018-08-27 * @function :Display Chinese strings * @parameters :x:the bebinning x coordinate of the Chinese strings y:the bebinning y coordinate of the Chinese stringssize:the size of Chinese stringsstr:the start address of the Chinese stringsmode:0-white background and black character 1-black background and white character * @retvalue :None******************************************************************************/\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e显示其他内容可以 结合\u003ccode\u003etest.c\u003c/code\u003e 中的实例与 \u003ccode\u003egui.c\u003c/code\u003e 里的函数说明学习。\u003c/p\u003e\u003cp\u003e为了分开gb2312与utf-8,我将显示中文的地方全部写在了一个文件里,我在 \u003ccode\u003emain.c\u003c/code\u003e 用到的时候直接调用。\u003c/p\u003e\u003ch3 id=\"驱动DHT11温湿度传感器(单总线协议的学习)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E9%A9%B1%E5%8A%A8DHT11%E6%B8%A9%E6%B9%BF%E5%BA%A6%E4%BC%A0%E6%84%9F%E5%99%A8%EF%BC%88%E5%8D%95%E6%80%BB%E7%BA%BF%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%AD%A6%E4%B9%A0%EF%BC%89\" class=\"headerlink\" title=\"驱动DHT11温湿度传感器(单总线协议的学习)\"\u003e\u003c/a\u003e驱动DHT11温湿度传感器(\u003cstrong\u003e单总线协议的学习\u003c/strong\u003e)\u003c/h3\u003e\u003cp\u003e)当时大二赶广和通项目的时候用的是 \u003ccode\u003eDS18B20\u003c/code\u003e 来着,是个单总线协议的温度传感器,网上找了段代码糊了一个,这次用 \u003ccode\u003eDHT11\u003c/code\u003e 学习学习单总线协议。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eDHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC\u003cbr/\u003e测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够\u003cbr/\u003e实时的采集本地湿度和温度。DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一\u003cbr/\u003e个 I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式\u003cbr/\u003e进行校验,有效的保证数据传输的准确性。DHT11 功耗很低,5V 电源电压下,工作平均最大\u003cbr/\u003e电流 0.5mA。DHT11 的技术参数:工作电压范围:3.3V-5.5V;工作电流 :平均 0.5mA;输出:单总线数字信号;测量范围:湿度 20\u003cdel\u003e90%RH,温度 0\u003c/del\u003e50℃;精度 :湿度±5%,温度±2℃;分辨率 :湿度 1%,温度 1℃;\u003c/p\u003e\u003c/blockquote\u003e\u003ch4 id=\"DHT11-数据传输格式\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#DHT11-%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93%E6%A0%BC%E5%BC%8F\" class=\"headerlink\" title=\"DHT11 数据传输格式\"\u003e\u003c/a\u003eDHT11 数据传输格式\u003c/h4\u003e\u003cp\u003eDHT11 数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由 40Bit 组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。\u003c/p\u003e\u003cp\u003eDHT11 的数据格式为:\u003cstrong\u003e8bit 湿度整数数据\u003c/strong\u003e + \u003cstrong\u003e8bit 湿度小数数据\u003c/strong\u003e + \u003cstrong\u003e8bit 温度整数数据\u003c/strong\u003e + \u003cstrong\u003e8bit 温度小数数据\u003c/strong\u003e + \u003cstrong\u003e8bit 校验和\u003c/strong\u003e。其中校验和数据为前四个字节相加。\u003cbr/\u003e传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。例如,某次从 DHT11 读到的数据如下表所示:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003ebyte4\u003c/th\u003e\u003cth\u003ebyte3\u003c/th\u003e\u003cth\u003ebyte2\u003c/th\u003e\u003cth\u003ebyte1\u003c/th\u003e\u003cth\u003ebyte0\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e0010 1101\u003c/td\u003e\u003ctd\u003e0000 0000\u003c/td\u003e\u003ctd\u003e0001 1100\u003c/td\u003e\u003ctd\u003e0000 0000\u003c/td\u003e\u003ctd\u003e0100 1001\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e湿度 \u003cstrong\u003e整数\u003c/strong\u003e 部分\u003c/td\u003e\u003ctd\u003e湿度 \u003cstrong\u003e小数\u003c/strong\u003e 部分\u003c/td\u003e\u003ctd\u003e温度 \u003cstrong\u003e整数\u003c/strong\u003e 部分\u003c/td\u003e\u003ctd\u003e温度 \u003cstrong\u003e小数\u003c/strong\u003e 部分\u003c/td\u003e\u003ctd\u003e校验和\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e由以上数据就可得到湿度和温度的值,计算方法:\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e湿度= byte4 . byte3=45.0 (%RH)\u003cbr/\u003e温度= byte2 . byte1=28.0 ( ℃)\u003cbr/\u003e校验= byte4+ byte3+ byte2+ byte1=73(=湿度+温度)(校验正确)\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003eDHT11 的数据格式是十分简单,DHT11 和 MCU 的一次通信最大为 3ms 左右,建议主机连续读取时间间隔不要小于 100ms。 下面,我们介绍一下 DHT11 的传输时序。\u003c/p\u003e\u003ch4 id=\"提前准备\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E6%8F%90%E5%89%8D%E5%87%86%E5%A4%87\" class=\"headerlink\" title=\"提前准备\"\u003e\u003c/a\u003e提前准备\u003c/h4\u003e\u003cp\u003e本次使用数据传输脚:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e// 数据传输脚 PA12\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003eDHT11_DQ_OUT\u003c/span\u003e \u003cspan class=\"token expression\"\u003eGPIO_PIN_12\u003c/span\u003e\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e设置数据传输脚为输出:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003eDHT11_IO_OUT\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e GPIO_InitTypeDef GPIO_InitStruct \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003eGPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ePin \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e DHT11_DQ_OUT\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003eGPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eMode \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e GPIO_MODE_OUTPUT_PP\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003eGPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ePull \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e GPIO_NOPULL\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003eGPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eSpeed \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e GPIO_SPEED_FREQ_LOW\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eGPIOA\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003eGPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e设置数据传输脚为输入:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003eDHT11_IO_IN\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e GPIO_InitTypeDef GPIO_InitStruct \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e GPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ePin \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e DHT11_DQ_OUT\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e GPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eMode \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e GPIO_MODE_INPUT\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e GPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ePull \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e GPIO_PULLUP\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eGPIOA\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003eGPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"DHT11-的数据发送流程\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#DHT11-%E7%9A%84%E6%95%B0%E6%8D%AE%E5%8F%91%E9%80%81%E6%B5%81%E7%A8%8B\" class=\"headerlink\" title=\"DHT11 的数据发送流程\"\u003e\u003c/a\u003eDHT11 的数据发送流程\u003c/h4\u003e\u003cp\u003eDHT11 的数据发送流程如下图所示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/DHT11/DHT11-1.png\" alt=\"DHT11 的数据发送流程\"/\u003e\u003c/p\u003e\u003ch5 id=\"开始信号\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E5%BC%80%E5%A7%8B%E4%BF%A1%E5%8F%B7\" class=\"headerlink\" title=\"开始信号\"\u003e\u003c/a\u003e开始信号\u003c/h5\u003e\u003cp\u003e首先主机发送 \u003cstrong\u003e开始信号\u003c/strong\u003e,即:拉低数据线,保持 t1(至少 18ms)时间,然后 \u003cstrong\u003e拉高数据线\u003c/strong\u003e t2(20~ 40us)时间,然后读取 DHT11 的响应。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/DHT11/DHT11-2.png\" alt=\"DHT11 开始信号\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e复位DHT11\u003c/strong\u003e :\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-C\" data-language=\"C\"\u003e\u003ccode class=\"language-C\"\u003evoid DHT11_Rst(void) { DHT11_IO_OUT(); //SET OUTPUT HAL_GPIO_WritePin(GPIOA, DHT11_DQ_OUT, GPIO_PIN_RESET); delay_ms(20); //拉低至少18ms HAL_GPIO_WritePin(GPIOA, DHT11_DQ_OUT, GPIO_PIN_SET); delay_us(30); //主机拉高20~40us}\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch5 id=\"响应信号\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E5%93%8D%E5%BA%94%E4%BF%A1%E5%8F%B7\" class=\"headerlink\" title=\"响应信号\"\u003e\u003c/a\u003e响应信号\u003c/h5\u003e\u003cp\u003eDHT11的 \u003cstrong\u003e响应\u003c/strong\u003e :正常的话,DHT11 会 \u003cstrong\u003e拉低\u003c/strong\u003e 数据线,保持 t3(40~50us)时间,作为响应信号,然后 DHT11 \u003cstrong\u003e拉高\u003c/strong\u003e 数据线,保持 t4(40 ~50us)时间后,开始输出数据。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/DHT11/DHT11-3.png\" alt=\"DHT11 开始信号\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e检测DHT11的回应\u003c/strong\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e//返回1:未检测到DHT11的存在\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//返回0:存在\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eDHT11_Check\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e retry\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003eDHT11_IO_IN\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//SET INPUT\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//DHT11会拉低40~80us\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eGPIOA\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e DHT11_DQ_OUT\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e retry\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e100\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e++\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e\u0026gt;=\u003c/span\u003e\u003cspan class=\"token number\"\u003e100\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e retry\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//DHT11拉低后会再次拉高40~80us\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e!\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eGPIOA\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e DHT11_DQ_OUT\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u0026amp;\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e100\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e++\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e\u0026gt;=\u003c/span\u003e\u003cspan class=\"token number\"\u003e100\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch5 id=\"DHT11-发送数据\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#DHT11-%E5%8F%91%E9%80%81%E6%95%B0%E6%8D%AE\" class=\"headerlink\" title=\"DHT11 发送数据\"\u003e\u003c/a\u003eDHT11 发送数据\u003c/h5\u003e\u003cp\u003e总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据。\u003c/p\u003e\u003cp\u003e每一bit数据都以50us低电平时隙 \u003cstrong\u003e开始\u003c/strong\u003e ,\u003cstrong\u003e高电平的长短\u003c/strong\u003e 定了数据位是0还是1。\u003c/p\u003e\u003cp\u003e如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。\u003c/p\u003e\u003ch5 id=\"DHT11-发送-0\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#DHT11-%E5%8F%91%E9%80%81-0\" class=\"headerlink\" title=\"DHT11 发送 0\"\u003e\u003c/a\u003eDHT11 发送 0\u003c/h5\u003e\u003cp\u003e\u003cstrong\u003e高电平是26-28us就表示0。\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/DHT11/DHT11-4.png\" alt=\"DHT11 发送0\"/\u003e\u003c/p\u003e\u003ch5 id=\"DHT11-发送1\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#DHT11-%E5%8F%91%E9%80%811\" class=\"headerlink\" title=\"DHT11 发送1\"\u003e\u003c/a\u003eDHT11 发送1\u003c/h5\u003e\u003cp\u003e\u003cstrong\u003e高电平是70us表示1。\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/DHT11/DHT11-5.png\" alt=\"DHT11 发送0\"/\u003e\u003c/p\u003e\u003ch5 id=\"接收数据\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E6%8E%A5%E6%94%B6%E6%95%B0%E6%8D%AE\" class=\"headerlink\" title=\"接收数据\"\u003e\u003c/a\u003e接收数据\u003c/h5\u003e\u003cp\u003e主机只要读取等待50us低电平过去,然后再判断高电平长短就能收集数据了。\u003c/p\u003e\u003cp\u003e从DHT11读取一个位:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e//返回值:1/0\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eDHT11_Read_Bit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e retry\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eGPIOA\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e DHT11_DQ_OUT\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u0026amp;\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e100\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//等待变为低电平\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e++\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e!\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eGPIOA\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e DHT11_DQ_OUT\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u0026amp;\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e100\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//等待变高电平\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e++\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e40\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//等待40us\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eGPIOA\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e DHT11_DQ_OUT\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e读取8次为一个字节:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e//返回值:读到的数据\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eDHT11_Read_Byte\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e i \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003edat \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e++\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003edat \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e dat\u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e dat \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e dat \u003cspan class=\"token operator\"\u003e|\u003c/span\u003e \u003cspan class=\"token function\"\u003eDHT11_Read_Bit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e一共5个字节:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e//temp:温度值(范围:0~50°)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//humi:湿度值(范围:20%~90%)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//返回值:0,正常;1,读取失败\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003eDHT11_Read_Data\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003etemp\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehumi\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e i\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e buf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003eDHT11_Rst\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eDHT11_Check\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e==\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e++\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//读取40位数据\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ei\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token function\"\u003eDHT11_Read_Byte\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e+\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e+\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e+\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e==\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehumi\u003cspan class=\"token operator\"\u003e=\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003etemp\u003cspan class=\"token operator\"\u003e=\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e)不过为了显示的更精确可以小数位也传过去。\u003c/p\u003e\u003ch3 id=\"完成\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E5%AE%8C%E6%88%90\" class=\"headerlink\" title=\"完成\"\u003e\u003c/a\u003e完成\u003c/h3\u003e\u003cp\u003e到此,完成了串口通信,OLED屏幕驱动,温湿度数据的获取。之后在OLED屏幕上的显示布局可以自己设计~ \u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/e0ca/"},{"title":"6063/6064 公益慢火车运转","time":"2023-04-05T15:19:17Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"6063-x2F-6064-公益慢火车运转\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/54cd/#6063-x2F-6064-%E5%85%AC%E7%9B%8A%E6%85%A2%E7%81%AB%E8%BD%A6%E8%BF%90%E8%BD%AC\" class=\"headerlink\" title=\"6063/6064 公益慢火车运转\"\u003e\u003c/a\u003e6063/6064 公益慢火车运转\u003c/h1\u003e\u003cblockquote\u003e\u003cp\u003e群山如森海,慢车即航船。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e这是2022年8月初的事情了,那会正值暑假,因为防控原因我在学校呆到7月底才回家,顺便去运转了一下这趟公益慢火车。当时运转时这趟车还是非空调车,现在已经更换车底,成为空调车了。刚好赶在换车底前完成了这一趟。全程下来,还是很有意思的。\u003c/p\u003e\u003cp\u003e\u003cdel\u003e不过人是个懒狗,拖到这会才想起来写。后面想起来再更新。\u003c/del\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/54cd/"},{"title":"Hexo 注入器实践","time":"2023-04-04T20:39:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"Hexo-注入器实践\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5eba/#Hexo-%E6%B3%A8%E5%85%A5%E5%99%A8%E5%AE%9E%E8%B7%B5\" class=\"headerlink\" title=\"Hexo 注入器实践\"\u003e\u003c/a\u003eHexo 注入器实践\u003c/h1\u003e\u003ch2 id=\"前言\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5eba/#%E5%89%8D%E8%A8%80\" class=\"headerlink\" title=\"前言\"\u003e\u003c/a\u003e前言\u003c/h2\u003e\u003cp\u003e我博客首页飘的那个樱花看着花里胡哨,但是非常占用资源……而且因为是直接引进来的 \u003ccode\u003ejs\u003c/code\u003e ,所以每个页面都有这玩意,但是毕竟花里胡哨,也就对性能问题睁一只眼闭一只眼,刚才翻别人博客突然发现了注入器这个神奇玩意,于是问题解决了:只在首页显示樱花飘落的动画。\u003c/p\u003e\u003ch3 id=\"参考博客\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5eba/#%E5%8F%82%E8%80%83%E5%8D%9A%E5%AE%A2\" class=\"headerlink\" title=\"参考博客\"\u003e\u003c/a\u003e参考博客\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://gishai.top/blog/posts/1563abd8.html\"\u003e基于hexo的fluid主题的魔改汇总 - GISHAI\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://hexo.fluid-dev.com/docs/advance/#hexo-%E6%B3%A8%E5%85%A5%E4%BB%A3%E7%A0%81\"\u003e进阶用法 | Hexo Fluid 用户手册 (fluid-dev.com)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"具体实践\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5eba/#%E5%85%B7%E4%BD%93%E5%AE%9E%E8%B7%B5\" class=\"headerlink\" title=\"具体实践\"\u003e\u003c/a\u003e具体实践\u003c/h2\u003e\u003cp\u003e在 \u003cstrong\u003e\u003ca href=\"https://hexo.fluid-dev.com/docs/\"\u003eHexo Fluid 用户手册\u003c/a\u003e\u003c/strong\u003e 中说的比较清楚了:注入器可以将 HTML 片段注入生成页面的 \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e 和 \u003ccode\u003e\u0026lt;body\u0026gt;\u003c/code\u003e 节点中,而且可以选择注入的页面类型(比如我首页的樱花我可以选择只注入首页)。\u003c/p\u003e\u003cp\u003e编写注入代码,需要在博客的根目录下创建 \u003ccode\u003escripts\u003c/code\u003e 文件夹,然后在里面任意命名创建一个 js 文件即可。\u003c/p\u003e\u003cp\u003e我创建了一个 \u003ccode\u003e/Hexo/scripts/yinghua.js\u003c/code\u003e 了一个文件,内容为:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-javascript\" data-language=\"javascript\"\u003e\u003ccode class=\"language-javascript\"\u003ehexo\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eextend\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003einjector\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003eregister\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;body_end\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;\u0026lt;script src=\u0026#34;//must.best/assets/js/flower.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;home\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e上述代码会在生成的页面 \u003ccode\u003e\u0026lt;/body\u0026gt;\u003c/code\u003e 注入加载 \u003ccode\u003e//must.best/assets/js/flower.js\u003c/code\u003e 的代码。\u003c/p\u003e\u003cp\u003e这里发挥作用的是 \u003cstrong\u003e\u003ccode\u003eregister\u003c/code\u003e\u003c/strong\u003e 函数。\u003c/p\u003e\u003ch3 id=\"register-函数\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5eba/#register-%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"register 函数\"\u003e\u003c/a\u003e\u003ccode\u003eregister\u003c/code\u003e 函数\u003c/h3\u003e\u003cp\u003e\u003ccode\u003eregister\u003c/code\u003e 函数可接受三个参数。\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e\u003cstrong\u003e第一个参数\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e第一个参数是\u003cstrong\u003e代码片段注入的位置\u003c/strong\u003e,接受以下值:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003ehead_begin\u003c/code\u003e: 注入在 \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e 之后(默认)\u003c/li\u003e\u003cli\u003e\u003ccode\u003ehead_end\u003c/code\u003e: 注入在 \u003ccode\u003e\u0026lt;/head\u0026gt;\u003c/code\u003e 之前\u003c/li\u003e\u003cli\u003e\u003ccode\u003ebody_begin\u003c/code\u003e: 注入在 \u003ccode\u003e\u0026lt;body\u0026gt;\u003c/code\u003e 之后\u003c/li\u003e\u003cli\u003e\u003ccode\u003ebody_end\u003c/code\u003e: 注入在 \u003ccode\u003e\u0026lt;/body\u0026gt;\u003c/code\u003e 之前\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003cstrong\u003e第二个参数\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e第二个参数是注入的片段,可以是字符串,也可以是一个返回值为字符串的函数。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003cstrong\u003e第三个参数\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e第三个参数是注入的页面类型,接受以下值:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003edefault\u003c/code\u003e: 注入到每个页面(默认值)\u003c/li\u003e\u003cli\u003e\u003ccode\u003ehome\u003c/code\u003e: 只注入到主页(\u003ccode\u003eis_home()\u003c/code\u003e 为 \u003ccode\u003etrue\u003c/code\u003e 的页面)\u003c/li\u003e\u003cli\u003e\u003ccode\u003epost\u003c/code\u003e: 只注入到文章页面(\u003ccode\u003eis_post()\u003c/code\u003e 为 \u003ccode\u003etrue\u003c/code\u003e 的页面)\u003c/li\u003e\u003cli\u003e\u003ccode\u003epage\u003c/code\u003e: 只注入到独立页面(\u003ccode\u003eis_page()\u003c/code\u003e 为 \u003ccode\u003etrue\u003c/code\u003e 的页面)\u003c/li\u003e\u003cli\u003e\u003ccode\u003earchive\u003c/code\u003e: 只注入到归档页面(\u003ccode\u003eis_archive()\u003c/code\u003e 为 \u003ccode\u003etrue\u003c/code\u003e 的页面)\u003c/li\u003e\u003cli\u003e\u003ccode\u003ecategory\u003c/code\u003e: 只注入到分类页面(\u003ccode\u003eis_category()\u003c/code\u003e 为 \u003ccode\u003etrue\u003c/code\u003e 的页面)\u003c/li\u003e\u003cli\u003e\u003ccode\u003etag\u003c/code\u003e: 只注入到标签页面(\u003ccode\u003eis_tag()\u003c/code\u003e 为 \u003ccode\u003etrue\u003c/code\u003e 的页面)\u003c/li\u003e\u003cli\u003e或是其他自定义 layout 名称,例如在Fluid 主题中 \u003ccode\u003eabout\u003c/code\u003e 对应关于页、\u003ccode\u003elinks\u003c/code\u003e 对应友联页\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e比如上面我要樱花飘落的动画只在首页显示,所以选择 \u003ccode\u003ehome\u003c/code\u003e 这个参数。\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/5eba/"},{"title":"【有方杯总结】一个物联网小项目","time":"2023-04-04T19:31:50Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"【有方杯总结】一个物联网小项目\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/1b10/#%E3%80%90%E6%9C%89%E6%96%B9%E6%9D%AF%E6%80%BB%E7%BB%93%E3%80%91%E4%B8%80%E4%B8%AA%E7%89%A9%E8%81%94%E7%BD%91%E5%B0%8F%E9%A1%B9%E7%9B%AE\" class=\"headerlink\" title=\"【有方杯总结】一个物联网小项目\"\u003e\u003c/a\u003e【有方杯总结】一个物联网小项目\u003c/h1\u003e\u003ch2 id=\"前言\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/1b10/#%E5%89%8D%E8%A8%80\" class=\"headerlink\" title=\"前言\"\u003e\u003c/a\u003e前言\u003c/h2\u003e\u003cp\u003e这次的项目其实是比较简单的。相对于大二那会做的广和通物联网项目来说,这次的项目算是比较有条理的做了下来,能理清楚各部分的关系,在编写的过程中不断学习实践,各类传感器的整合,数据上报,云端数据的流转……收获很多。\u003c/p\u003e\u003cp\u003e不过总的来说,这个项目是单片机收集了一些传感器的数据,然后通过 \u003ccode\u003e有方N58\u003c/code\u003e 通信模块上报阿里云物联网平台,进而展示在前端页面上。\u003c/p\u003e\u003cp\u003e想想之前做广和通的时候没搞清楚这些关系,先是在服务器上运行了一个 \u003ccode\u003ec-socket\u003c/code\u003e 脚本,然后用广和通物联网模块去连接这个脚本,之后脚本将接收到的数据写入文件。网页前端是不断访问这个文件进行页面展示数据的更改。走了很多弯路,而且很不稳定,每次断掉之后得等服务器上那个端口空闲之后才能再次运行脚本……这次使用了 \u003ccode\u003ewebsocket\u003c/code\u003e 与阿里云物联网平台,可以说是又稳又快,用 \u003ccode\u003ejs\u003c/code\u003e 处理数据也方便的多。\u003c/p\u003e\u003cp\u003e\u003cdel\u003e用 \u003ccode\u003eC语言\u003c/code\u003e 处理字符串还是太折磨人了。\u003c/del\u003e\u003c/p\u003e\u003cp\u003e大概流程:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/neoway/2.png\"/\u003e\u003c/p\u003e\u003cp\u003e前端演示地址:\u003c/p\u003e\u003cp\u003e\u003ca href=\"http://neoway.ksfu.top/\"\u003ehttp://neoway.ksfu.top/\u003c/a\u003e\u003c/p\u003e\u003cp\u003e前端效果图:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/neoway/1.jpg\"/\u003e\u003c/p\u003e\u003chr/\u003e\u003cp\u003e具体内容的起来再写~\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/1b10/"},{"title":"2022 年终\u0026期末总结","time":"2023-01-03T08:53:20Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"2022-年终总结\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/3ff3/#2022-%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93\" class=\"headerlink\" title=\"2022 年终总结\"\u003e\u003c/a\u003e2022 年终总结\u003c/h1\u003e\u003cp\u003e\u003cdel\u003e因为这几天趁着冬促入了奥德赛,所以还在肝这玩意,先占个坑肝差不多了就写\u003c/del\u003e\u003c/p\u003e\u003cp\u003e\u003cdel\u003e奥德赛好长啊\u003c/del\u003e\u003c/p\u003e\u003cp\u003e去年还是太逆天了,不过终究是过来了。\u003c!--今年要准备考研了。--\u003e今年到目前来说还不错,追了很多场演唱会,也和同学组多参加了一些小比赛。不过压力也感觉大了起来,感觉自己现在也没啥技能,简历上没啥东西能写。学业上也不咋样。女朋友必然也是没有的(也没认识几个女生就是说。体重只能说保持的还不错。海浪会来,希望这学期的生活能冲淡去年的影响,等这学期大三总结和2022总结一起写吧。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/3ff3/"},{"title":"基于FPGA的ASK信号生成及测量分析技术-西电通院随机信号实验","time":"2022-11-04T19:55:20Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"基于FPGA的ASK信号生成及测量分析技术\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E5%9F%BA%E4%BA%8EFPGA%E7%9A%84ASK%E4%BF%A1%E5%8F%B7%E7%94%9F%E6%88%90%E5%8F%8A%E6%B5%8B%E9%87%8F%E5%88%86%E6%9E%90%E6%8A%80%E6%9C%AF\" class=\"headerlink\" title=\"基于FPGA的ASK信号生成及测量分析技术\"\u003e\u003c/a\u003e基于FPGA的ASK信号生成及测量分析技术\u003c/h1\u003e\u003cp\u003e) 随机信号实验选到了这个,就当学 \u003ccode\u003eVerilog\u003c/code\u003e 了。\u003c/p\u003e\u003cp\u003e(以下内容围绕西电通院随机信号实验:《基于FPGA的ASK信号生成及测量分析技术》展开。\u003c/p\u003e\u003ch2 id=\"模块框图\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E6%A8%A1%E5%9D%97%E6%A1%86%E5%9B%BE\" class=\"headerlink\" title=\"模块框图\"\u003e\u003c/a\u003e模块框图\u003c/h2\u003e\u003cp\u003e2ASK调制电路组成框图\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/%E8%AE%B0%E5%BD%95.png\"/\u003e\u003cp\u003e2ASK调制的FPGA程序框图\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/%E6%A1%86%E5%9B%BE.png\"/\u003e\u003ch2 id=\"模块分解\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E6%A8%A1%E5%9D%97%E5%88%86%E8%A7%A3\" class=\"headerlink\" title=\"模块分解\"\u003e\u003c/a\u003e模块分解\u003c/h2\u003e\u003cp\u003e梳理一下:\u003c/p\u003e\u003col\u003e\u003cli\u003e分频模块\u003c/li\u003e\u003cli\u003e载波产生模块\u003cul\u003e\u003cli\u003e八进制计数器\u003c/li\u003e\u003cli\u003eROM\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003em序列产生模块\u003c/li\u003e\u003cli\u003e键控开关\u003c/li\u003e\u003cli\u003eDAC输出模块(给了)\u003c/li\u003e\u003cli\u003e拓展输出口(给了)\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e所以需要编写5个模块。\u003c/p\u003e\u003ch3 id=\"1-分频模块设计\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#1-%E5%88%86%E9%A2%91%E6%A8%A1%E5%9D%97%E8%AE%BE%E8%AE%A1\" class=\"headerlink\" title=\"1. 分频模块设计\"\u003e\u003c/a\u003e1. 分频模块设计\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e2.1.1按原理2.1节设计分频器a(4分频、6分频、10分频等)将系统时钟sys_clk分频,作为载波产生模块的时钟,则载波频率为sys_clk/(分频值a*一个载波周期的存储点数n)(Hz)。(sys_clk=26MHz)\u003c/p\u003e\u003cp\u003e2.1.2按原理2.1节设计分频器b(分频值应设置为上步中a*n的整数倍)将系统时钟分频,作为m序列产生模块的时钟,则基带码元速率为sys_clk/b(bit/s)。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e可以知道要设计两个分频模块,其中主频为 \u003cstrong\u003e26MHz\u003c/strong\u003e。\u003c/p\u003e\u003cp\u003e分频模块端口示意图:\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/%E5%88%86%E9%A2%91%E6%A8%A1%E5%9D%97.png\" style=\"zoom: 50%;\"/\u003e\u003cblockquote\u003e\u003cp\u003eclk端为系统时钟信号输入,从out8、out16、out256可分别得到系统时钟的8分频、16分频和256分频信号。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e经历了一晚上的折磨,我终于悟出了:\u003cstrong\u003e所谓X分频,就是把时钟原来每一下变一次,变成现在是每X下变一次。\u003c/strong\u003e \u003cdel\u003e(有时候很明显的事情就是转不过来弯\u003c/del\u003e\u003c/p\u003e\u003cp\u003e所以就可以顺着这个思路编写 \u003ccode\u003efenpin.v\u003c/code\u003e :\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e fenpin \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e out8\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e out16\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e out256\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 所谓X分频,就是原来时钟是每一下变一次\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 现在是每X下变一次\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// lb(256) = 8\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e7\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter_256\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter_16\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter_8\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e counter_256 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e8\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e counter_16 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e4\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e counter_8 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out8 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out16 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out256 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 折中计数到一半就行\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 8分频\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter_8 \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e counter_8 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e counter_8 \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out8 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e out8\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e counter_8 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out8 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eout8\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 16分频\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter_16 \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e counter_16 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e counter_16 \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out16 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e out16\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e counter_16 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e4\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out16 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eout16\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 256分频\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter_256 \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e256\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e counter_256 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e counter_256 \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out256 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e out256\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e counter_256 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e8\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out256 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eout256\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e\u003ccode\u003etestbench\u003c/code\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token constant\"\u003e`timescale\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e \u003cspan class=\"token function\"\u003etb_fenpin\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e out8\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e out16\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e out256\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#10\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003efenpin fenpin_inst\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eclk \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eout8 \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eout8\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eout16 \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eout16\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eout256 \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eout256\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e仿真波形:\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/%E5%88%86%E9%A2%91%E4%BB%BF%E7%9C%9F.png\"/\u003e\u003ch3 id=\"2-载波产生模块\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#2-%E8%BD%BD%E6%B3%A2%E4%BA%A7%E7%94%9F%E6%A8%A1%E5%9D%97\" class=\"headerlink\" title=\"2. 载波产生模块\"\u003e\u003c/a\u003e2. 载波产生模块\u003c/h3\u003e\u003cp\u003e载波产生模块示意图:\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/%E8%BD%BD%E6%B3%A2%E4%BA%A7%E7%94%9F%E6%A8%A1%E5%9D%97.png\"/\u003e\u003cblockquote\u003e\u003cp\u003e载波产生模块示意图如上图所示,其中clock为载波采样时钟,q[2:0]为计数器输出,q[7:0]输出为载波信号。载波产生模块由一个计数器和一个ROM构成,其中ROM中存储着一个载波周期的样点值,则计数器的进制设置为一个载波周期包含的样点数。本实验中一个载波周期取八个样点,计数器设置为八进制计数器,ROM和计数器均可使用IP核实现。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e结合示意图可以知道,载波产生模块又分为两部分:\u003cstrong\u003e八进制计数器\u003c/strong\u003e和\u003cstrong\u003eROM\u003c/strong\u003e。分开来写。\u003c/p\u003e\u003ch4 id=\"1)-八进制计数器\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#1%EF%BC%89-%E5%85%AB%E8%BF%9B%E5%88%B6%E8%AE%A1%E6%95%B0%E5%99%A8\" class=\"headerlink\" title=\"1) 八进制计数器\"\u003e\u003c/a\u003e1) 八进制计数器\u003c/h4\u003e\u003cp\u003eq 的值每个时钟加1,从0加到7。\u003c/p\u003e\u003cp\u003e\u003ccode\u003elpm_counter0.v\u003c/code\u003e :\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e lpm_counter0 \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e q\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e q \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eq \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u0026#39;b111\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e q \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e q \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e q \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e\u003ccode\u003etestbench\u003c/code\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token constant\"\u003e`timescale\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e \u003cspan class=\"token function\"\u003etb_lpm_counter0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e q\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#10\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003elpm_counter0 lpm_counter0_inst\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003eclk\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003eq\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eq\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e仿真波形\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/%E8%AE%A1%E6%95%B0%E5%99%A8%E4%BB%BF%E7%9C%9F.png\"/\u003e\u003ch4 id=\"2)ROM\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#2%EF%BC%89ROM\" class=\"headerlink\" title=\"2)ROM\"\u003e\u003c/a\u003e2)ROM\u003c/h4\u003e\u003cp\u003e使用 \u003cstrong\u003eIP核\u003c/strong\u003e ,照着野火的教程学了学。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://www.bilibili.com/video/BV17z411i7er/?p=46\"\u003e46-第二十六讲-ROM-IP核的调用(一)_哔哩哔哩_bilibili\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e经过大概分析,可以知道本实验使用 \u003cstrong\u003e单端口ROM\u003c/strong\u003e ,数据为 \u003cstrong\u003e8位宽\u003c/strong\u003e ,地址为 \u003cstrong\u003e3位宽\u003c/strong\u003e ,至少包含 \u003cstrong\u003e8个\u003c/strong\u003e 数据(采样了8个点),使用单时钟。\u003c/p\u003e\u003cp\u003e输出添加一个寄存器会延后两个周期输出。(原来延后一个,经过寄存器再延后一个。)\u003c/p\u003e\u003cp\u003e写操作是时钟的上升沿,读也是时钟的上升沿。\u003c/p\u003e\u003ch5 id=\"产生-mif-文件\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E4%BA%A7%E7%94%9F-mif-%E6%96%87%E4%BB%B6\" class=\"headerlink\" title=\"产生 mif 文件\"\u003e\u003c/a\u003e产生 mif 文件\u003c/h5\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/weixin_44939178/article/details/112314742\"\u003ematlab生成.mif文件 产生正弦信号数据_橘子FPGA的博客-CSDN博客_matlab生成正弦信号\u003c/a\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e本实验中一个载波周期取八个样点。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e本次使用 \u003ccode\u003epython\u003c/code\u003e 进行生成\u003cdel\u003e(就8个点手写也行\u003c/del\u003e。\u003c/p\u003e\u003cp\u003e根据 \u003ccode\u003e.mif\u003c/code\u003e 文件的格式一句一句打印出来。\u003c/p\u003e\u003cp\u003e一个普通余弦信号周期为 $2\\pi$ ,取样8个点,就是 $cos(2{\\pi}\\times\\frac{x}{8})$ ;\u003c/p\u003e\u003cp\u003e数据位宽为8位,所表示的数据在0~255之间,所以需要将 $cos(2{\\pi}\\times\\frac{x-1}{8})$ 的幅值**-1~+1变化到0~255**。\u003c/p\u003e\u003cp\u003e具体做法是将 $cos(2{\\pi}\\times\\frac{x}{8})\\times128+128$ 。就是将原幅值变换至-128~+128,然后加上128,范围变为0~256。 \u003c/p\u003e\u003cp\u003e\u003ccode\u003epython\u003c/code\u003e 代码:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-python\" data-language=\"python\"\u003e\u003ccode class=\"language-python\"\u003e\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e mathpi \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e math\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003epifilename \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;sin_8x8.mif\u0026#34;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewith\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efilename\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;w+\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003eencoding\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;utf-8\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eas\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;WIDTH=8;\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;DEEPTH=8;\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;ADDRESS_RADIX=UNS;\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;DATA_RADIX=UNS;\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;CONTENT BEGIN\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e i \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e \u003cspan class=\"token builtin\"\u003erange\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e x \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003eint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003emath\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ecos\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003epi\u003cspan class=\"token operator\"\u003e*\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token number\"\u003e128\u003c/span\u003e\u003cspan class=\"token operator\"\u003e+\u003c/span\u003e\u003cspan class=\"token number\"\u003e128\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e x \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e256\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e x \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e x\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string-interpolation\"\u003e\u003cspan class=\"token string\"\u003ef\u0026#34;\u003c/span\u003e\u003cspan class=\"token interpolation\"\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003ei\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token string\"\u003e:\u003c/span\u003e\u003cspan class=\"token interpolation\"\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003ex\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token string\"\u003e\\n\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;END;\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e效果(如果发现quartus报错就生成一个标准的mif文件然后把下面的复制进去替换:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-mif\" data-language=\"mif\"\u003e\u003ccode class=\"language-mif\"\u003eWIDTH=8;DEEPTH=8;ADDRESS_RADIX=UNS;DATA_RADIX=UNS;CONTENT BEGIN0:2551:2182:1283:374:05:376:1277:218END;\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/sin.png\"/\u003e\u003ch5 id=\"生成IP核\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E7%94%9F%E6%88%90IP%E6%A0%B8\" class=\"headerlink\" title=\"生成IP核\"\u003e\u003c/a\u003e生成IP核\u003c/h5\u003e\u003cp\u003e注意深度选择的时候下拉没有8深度的选择,但是可以手动输入。\u003c/p\u003e\u003cp\u003e\u003cdel\u003e)不过我在其他文件调用ip核的时候一直仿真失败emm,所以ip核就直接用了,等我找到问题再看看。\u003c/del\u003e\u003c/p\u003e\u003ch5 id=\"编写代码及仿真\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E7%BC%96%E5%86%99%E4%BB%A3%E7%A0%81%E5%8F%8A%E4%BB%BF%E7%9C%9F\" class=\"headerlink\" title=\"编写代码及仿真\"\u003e\u003c/a\u003e编写代码及仿真\u003c/h5\u003e\u003cp\u003e添加IP核,进行仿真。\u003c/p\u003e\u003cp\u003e\u003ccode\u003etestbench\u003c/code\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token constant\"\u003e`timescale\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e \u003cspan class=\"token function\"\u003etb_lpm_rom\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e address2\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e7\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e q\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e address2 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u0026#39;b000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#10\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#20\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e\u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eaddress2 \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u0026#39;b111\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003eaddress2 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u0026#39;b000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003eaddress2 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e address2 \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003ecos_8x8cos_8x8_inst \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eaddress \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e address2 \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eclock \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e clk \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eq \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e q \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e仿真波形\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/cos%E4%BB%BF%E7%9C%9F.png\"/\u003e\u003ch3 id=\"3-m序列产生模块\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#3-m%E5%BA%8F%E5%88%97%E4%BA%A7%E7%94%9F%E6%A8%A1%E5%9D%97\" class=\"headerlink\" title=\"3.m序列产生模块\"\u003e\u003c/a\u003e3.m序列产生模块\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/weixin_45015947/article/details/89891757\"\u003em序列产生原理及其性质_Angelo_pj的博客-CSDN博客_m序列\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://zhuanlan.zhihu.com/p/377685193\"\u003e【verilog杂谈(一)】 2-16位长度的m序列发生器 - 知乎 (zhihu.com)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cblockquote\u003e\u003cp\u003e要求:按原理2.3节设计m序列产生模块,要求产生不同长度的m序列。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e代码根据实验要求修改自参考链接,可以产生2~16位的m序列。\u003c/p\u003e\u003cp\u003e\u003ccode\u003emxulie.v\u003c/code\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e mxulie#\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eparameter\u003c/span\u003e len \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e4\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// parameter range from 2 to 16\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e m_sequence \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003elen\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eassign\u003c/span\u003e m_sequence \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003elen\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e Q_r \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e \u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e Q_r \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// shift reg\u003c/span\u003e \u003cspan class=\"token function\"\u003ecase\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003elen\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token number\"\u003e2\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e4\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e5\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e6\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e7\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e8\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e7\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e9\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e9\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e11\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e12\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e11\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e7\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e13\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e12\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e11\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e9\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e14\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e13\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e12\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e7\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e14\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e13\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e14\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e12\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003edefault\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eendcase\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e\u003ccode\u003etestbench\u003c/code\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token comment\"\u003e//~ `New testbench\u003c/span\u003e\u003cspan class=\"token constant\"\u003e`timescale\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens \u003cspan class=\"token operator\"\u003e/\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens \u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e tb_mxulie\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// M_series Parameters\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eparameter\u003c/span\u003e M_len \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// M_series Inputs\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// M_series Outputs\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e m_sequence \u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#10\u003c/span\u003e clk\u003cspan class=\"token operator\"\u003e=~\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003emxulie #\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003elen \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e M_len \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003emxulie_inst \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eclk \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003em_sequence \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003em_sequence\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e仿真波形\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/m%E5%BA%8F%E5%88%97.png\"/\u003e\u003ch3 id=\"4-键控开关\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#4-%E9%94%AE%E6%8E%A7%E5%BC%80%E5%85%B3\" class=\"headerlink\" title=\"4.键控开关\"\u003e\u003c/a\u003e4.键控开关\u003c/h3\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/%E9%94%AE%E6%8E%A7%E5%BC%80%E5%85%B3.png\" style=\"zoom:50%;\"/\u003e\u003cblockquote\u003e\u003cp\u003e键控开关示意图图上图所示,其中data[7:0]端输入载波信号,gate端输入基带码元,当gate信号为1时,载波信号通过,如果gate信号为0时,载波信号不能通过。模块的输出端q[7:0]输出2ASK已调信号。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003ccode\u003elpm_gate.v\u003c/code\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e \u003cspan class=\"token function\"\u003elpm_gate\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e gate\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e7\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e7\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e q\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e q \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e8\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways@\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003egate \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e q \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e data\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e q \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e8\u0026#39;b01111111\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// +127将0变换过去\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch2 id=\"整合以及整体仿真\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E6%95%B4%E5%90%88%E4%BB%A5%E5%8F%8A%E6%95%B4%E4%BD%93%E4%BB%BF%E7%9C%9F\" class=\"headerlink\" title=\"整合以及整体仿真\"\u003e\u003c/a\u003e整合以及整体仿真\u003c/h2\u003e\u003cp\u003e将以上各个模块添加进实验给定的模板,并生成原理图,然后连线。\u003c/p\u003e\u003cp\u003e要整体仿真,所以要先把原理图转换为 \u003ccode\u003eVerilog\u003c/code\u003e (File -\u0026gt; Create / Update -\u0026gt; Create HDL Design File from Current File…),之后从工程文件移除原理图,设置生成的 \u003ccode\u003everilog\u003c/code\u003e 文件为顶层文件进行编译,然后仿真。\u003c/p\u003e\u003cp\u003e通过对比编译出来的 RTL 视图,符合给定框图。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/twoask.png\"/\u003e\u003cp\u003e整体仿真,只要注意 \u003ccode\u003eclk\u003c/code\u003e , \u003ccode\u003em_squence\u003c/code\u003e , \u003ccode\u003etwo_ask[7...0]\u003c/code\u003e 这几个信号就行。 \u003ccode\u003etestbench\u003c/code\u003e 如下:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token constant\"\u003e`timescale\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e tb_sim\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e m_squence\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e7\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e two_ask\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#10\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003etwoask \u003cspan class=\"token function\"\u003etwoask_inst\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003eclk\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003em_squence\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003em_squence\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003etwo_ask\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etwo_ask\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e仿真波形:\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/%E6%95%B4%E4%BD%93%E4%BB%BF%E7%9C%9F.jpg\"/\u003e\u003ch3 id=\"管脚分配\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E7%AE%A1%E8%84%9A%E5%88%86%E9%85%8D\" class=\"headerlink\" title=\"管脚分配\"\u003e\u003c/a\u003e管脚分配\u003c/h3\u003e\u003cp\u003e管脚分配啥的给的模板文件里已经分配好了,直接用就行。\u003c/p\u003e\u003ch2 id=\"总结\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E6%80%BB%E7%BB%93\" class=\"headerlink\" title=\"总结\"\u003e\u003c/a\u003e总结\u003c/h2\u003e\u003cp\u003e毕竟是主要是记录 \u003ccode\u003everilog\u003c/code\u003e 的一个学习过程,剩下的就不分析了,属于是实验报告里的活。这算是第一次用 \u003ccode\u003everilog\u003c/code\u003e 干这种比较综合的活?接触到了一些新玩意,IP核,mif文件之类的。也锻炼了从s一样实验指导手册里提炼信息的能力?\u003c/p\u003e\u003cp\u003e\u003cdel\u003e(然后细节和要补充的等后面想起来再说\u003c/del\u003e \u003c/p\u003e\u003cp\u003e \u003cdel\u003e(我超突然想起来线下验收完忘了拍时域波形\u003c/del\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/5f6b/"},{"title":"批量转换文件编码gb2312转utf-8","time":"2022-08-10T09:32:11Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"批量转换文件编码gb2312转utf-8\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/2d8a/#%E6%89%B9%E9%87%8F%E8%BD%AC%E6%8D%A2%E6%96%87%E4%BB%B6%E7%BC%96%E7%A0%81gb2312%E8%BD%ACutf-8\" class=\"headerlink\" title=\"批量转换文件编码gb2312转utf-8\"\u003e\u003c/a\u003e批量转换文件编码gb2312转utf-8\u003c/h1\u003e\u003cp\u003e\u003cdel\u003e锟斤拷烫烫烫\u003c/del\u003e\u003c/p\u003e\u003cp\u003e这几天网上找代码学习用vscode打开之后中文全是乱码,转换编码为 \u003ccode\u003egb2312\u003c/code\u003e 后才正常显示,之前也因为这玩意狠狠的踩坑( \u003ccode\u003eKeil\u003c/code\u003e 默认的编码对中文来说太坑了。但是一个工程里文件很多,所以就需要一个批量把这些文件转换为 \u003ccode\u003eutf-8\u003c/code\u003e 的脚本。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/gb2312/1.webp\" style=\"zoom: 67%;\"/\u003e\u003ch2 id=\"参考博客\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/2d8a/#%E5%8F%82%E8%80%83%E5%8D%9A%E5%AE%A2\" class=\"headerlink\" title=\"参考博客\"\u003e\u003c/a\u003e参考博客\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/a417655340/article/details/124460824\"\u003e批量转换文件编码gb2312转utf-8_每天一罐可乐的博客-CSDN博客_批量转换编码格式\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_42336581/article/details/125776879\"\u003epython 递归遍历目录下的所有文件_Joy-\u0026gt;Boy的博客-CSDN博客_python递归获取文件夹下所有文件\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"关于文件编码\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/2d8a/#%E5%85%B3%E4%BA%8E%E6%96%87%E4%BB%B6%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"关于文件编码\"\u003e\u003c/a\u003e关于文件编码\u003c/h2\u003e\u003cp\u003eb站上找到的这个视频挺好。\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.bilibili.com/video/BV1U5411d7FB\"\u003e「烫烫屯屯锟斤拷」揭秘ASCII、GBK、UTF-8,B站独家,一听就懂\u003c/a\u003e\u003c/p\u003e\u003ciframe src=\"//player.bilibili.com/player.html?aid=468972234\u0026amp;bvid=BV1U5411d7FB\u0026amp;cid=715388833\u0026amp;page=1\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"\u003e \u003c/iframe\u003e\u003ch2 id=\"脚本\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/2d8a/#%E8%84%9A%E6%9C%AC\" class=\"headerlink\" title=\"脚本\"\u003e\u003c/a\u003e脚本\u003c/h2\u003e\u003cp\u003e其实网上随便一搜就有好多,试了一个效果不错,但是只能转换根目录下的文件。于是我稍微做了点修改。\u003c/p\u003e\u003cp\u003e效果还是不错的\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003e运行结果\u003c/summary\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\" language-bash\" data-language=\"bash\"\u003e\u003ccode class=\" language-bash\"\u003e请输入要转换编码的文件夹路径:C:\\Demo_OLED_STM32F103RCT6_Software_IIC===============================================================fileName fileEncoding===============================================================core_cm3.c GB18030core_cm3.h GB18030iic.c GB18030iic.h GB18030bmp.h GB18030oled.c GB18030oled.h GB18030oledfont.h GB18030RTE_Components.h GB18030misc.h GB18030stm32f10x_adc.h GB18030stm32f10x_bkp.h GB18030stm32f10x_can.h GB18030stm32f10x_cec.h GB18030stm32f10x_crc.h GB18030stm32f10x_dac.h GB18030stm32f10x_dbgmcu.h GB18030stm32f10x_dma.h GB18030stm32f10x_exti.h GB18030stm32f10x_flash.h GB18030stm32f10x_fsmc.h GB18030stm32f10x_gpio.h GB18030stm32f10x_i2c.h GB18030stm32f10x_iwdg.h GB18030stm32f10x_pwr.h GB18030stm32f10x_rcc.h GB18030stm32f10x_rtc.h GB18030stm32f10x_sdio.h GB18030stm32f10x_spi.h GB18030stm32f10x_tim.h GB18030stm32f10x_usart.h GB18030stm32f10x_wwdg.h GB18030misc.c GB18030stm32f10x_adc.c GB18030stm32f10x_bkp.c GB18030stm32f10x_can.c GB18030stm32f10x_cec.c GB18030stm32f10x_crc.c GB18030stm32f10x_dac.c GB18030stm32f10x_dbgmcu.c GB18030stm32f10x_dma.c GB18030stm32f10x_exti.c GB18030stm32f10x_flash.c GB18030stm32f10x_fsmc.c GB18030stm32f10x_gpio.c GB18030stm32f10x_i2c.c GB18030stm32f10x_iwdg.c GB18030stm32f10x_pwr.c GB18030stm32f10x_rcc.c GB18030stm32f10x_rtc.c GB18030stm32f10x_sdio.c GB18030stm32f10x_spi.c GB18030stm32f10x_tim.c GB18030stm32f10x_usart.c GB18030stm32f10x_wwdg.c GB18030delay.c GB18030delay.h GB18030sys.c GB18030sys.h GB18030gui.c GB18030gui.h GB18030main.c GB18030stm32f10x.h GB18030stm32f10x_conf.h GB18030stm32f10x_it.c GB18030stm32f10x_it.h GB18030system_stm32f10x.c GB18030system_stm32f10x.h GB18030test.c GB18030test.h GB18030---------错误统计------------共0个错误!-----------------------------\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003c/details\u003e\u003cimg src=\"https://yun.ksfu.top/blog/gb2312/2.webp\" style=\"zoom:67%;\"/\u003e\u003cp\u003e直接打开,舒服了\u003cspan class=\"diana_bixin\"\u003e\u003c/span\u003e\u003c/p\u003e\u003ch3 id=\"代码\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/2d8a/#%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"代码\"\u003e\u003c/a\u003e代码\u003c/h3\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-python\" data-language=\"python\"\u003e\u003ccode class=\"language-python\"\u003e\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e os\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e codecsgErrArray \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token keyword\"\u003edef\u003c/span\u003e \u003cspan class=\"token function\"\u003econvert\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efileName\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e filePath\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e out_enc\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;utf-8\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003etry\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e content \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e codecs\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efilePath\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;rb\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eread\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# 直接设置GB18030编码节省时间\u003c/span\u003e source_encoding \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;GB18030\u0026#39;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;{0:50}{1}\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token builtin\"\u003eformat\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efileName\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e source_encoding\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e source_encoding \u003cspan class=\"token operator\"\u003e!=\u003c/span\u003e \u003cspan class=\"token boolean\"\u003eNone\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e source_encoding \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e out_enc\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e content \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e content\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003edecode\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003esource_encoding\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eencode\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eout_enc\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e codecs\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efilePath\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;wb\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003econtent\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e gErrArray\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eappend\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;can not recgonize file encoding %s\u0026#34;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e%\u003c/span\u003e filePath\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eexcept\u003c/span\u003e Exception \u003cspan class=\"token keyword\"\u003eas\u003c/span\u003e err\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e gErrArray\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eappend\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;%s:%s\u0026#34;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e%\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efilePath\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e err\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003edef\u003c/span\u003e \u003cspan class=\"token function\"\u003eshow_files\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebase_path\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token triple-quoted-string string\"\u003e\u0026#34;\u0026#34;\u0026#34; 遍历当前目录所有py文件及文件夹 :param path: :param all_files: :return: \u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e file_list \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e os\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003elistdir\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebase_path\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# 准备循环判断每个元素是否是文件夹还是文件,是文件的话,把名称传入list,是文件夹的话,递归\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e \u003cspan class=\"token builtin\"\u003efile\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e file_list\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# 利用os.path.join()方法取得路径全名,并存入cur_path变量,否则每次只能遍历一层目录\u003c/span\u003e cur_path \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e os\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003epath\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ejoin\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebase_path\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token builtin\"\u003efile\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# 判断是否是文件夹\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e os\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003epath\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eisdir\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecur_path\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e show_files\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecur_path\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e suffix \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e os\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003epath\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003esplitext\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003efile\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e suffix \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;.h\u0026#39;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e suffix \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;.c\u0026#39;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e suffix \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;.cpp\u0026#39;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e suffix \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;.hpp\u0026#39;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e suffix \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;.bat\u0026#39;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e suffix \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;.java\u0026#39;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e suffix \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;.txt\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e convert\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003efile\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e cur_path\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003edef\u003c/span\u003e \u003cspan class=\"token function\"\u003emain\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token comment\"\u003e#explore(os.getcwd())\u003c/span\u003e filePath \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token builtin\"\u003einput\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;请输入要转换编码的文件夹路径: \\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;\\r\\n===============================================================\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;{0:50}{1}\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token builtin\"\u003eformat\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;fileName\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;fileEncoding\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;===============================================================\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e show_files\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efilePath\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;\\r\\n---------错误统计------------\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e index\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e item \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eenumerate\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003egErrArray\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eitem\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;\\r\\n共%d个错误!\u0026#39;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e%\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003elen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003egErrArray\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003elen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003egErrArray\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;请检查错误文件手动修改编码\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;\\r\\n-----------------------------\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e __name__ \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;__main__\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e main\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/2d8a/"},{"title":"STM32使用SysTick定时器延时","time":"2022-07-27T18:42:15Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"STM32使用SysTick定时器延时\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#STM32%E4%BD%BF%E7%94%A8SysTick%E5%AE%9A%E6%97%B6%E5%99%A8%E5%BB%B6%E6%97%B6\" class=\"headerlink\" title=\"STM32使用SysTick定时器延时\"\u003e\u003c/a\u003eSTM32使用SysTick定时器延时\u003c/h1\u003e\u003cp\u003e最近在学习Stm32 HAL库相关教程\u003cdel\u003e(之前都是xjb缝合,缺少点原理的理解\u003c/del\u003e,在看到TM1640(一个可以方便在数码管上显示内容的模块)驱动编写的过程需要用到us 级别的延时,而HAL 库的 \u003ccode\u003eHal_Dealy()\u003c/code\u003e 的函数是ms 级别的,所以需要自己手动编写一个更精准的延时函数。看教程里几行不知所云,在搜索过程中大概了解到了几种写发,但是感觉比较优雅的是使用 \u003cstrong\u003eSysTick定时器\u003c/strong\u003e 进行延时。但是几篇教程在原理处比较简略,所以根据个人理解学习了一下。\u003c/p\u003e\u003ch2 id=\"参考目录\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E5%8F%82%E8%80%83%E7%9B%AE%E5%BD%95\" class=\"headerlink\" title=\"参考目录\"\u003e\u003c/a\u003e参考目录\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e《ARM Cortex-M3 权威指南》第3版\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/Fireflycjd/p/14304902.html\"\u003eSTM32延时函数的四种方法 - Fireflycjd - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/xuqu607/p/13737040.html\"\u003eSTM32的SysTick延时方法 - 代码争霸 - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/Leisure_ksj/article/details/105273110\"\u003eSTM32学习心得九:Systick滴答定时器和延时函数解读_天亮继续睡的博客-CSDN博客\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/haha690/article/details/111053367\"\u003estm32的systick(滴答定时器)实现精准延时_haha690的博客-CSDN博客_stm32精准定时\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://weibo01.blog.csdn.net/article/details/81136564\"\u003eSTM32延时函数的四种方法:普通延时(2种)、SysTick 定时器延时(2种)_魏波-的博客-CSDN博客_delayms延时函数用法\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://waka-can.blog.csdn.net/article/details/106527001?spm=1001.2014.3001.5506\"\u003e关于STM32单片机延时微妙(delay_us)函数-hal库_好奇龙猫的博客-CSDN博客_delay_us\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/Firefly_cjd/article/details/106709259?spm=1001.2014.3001.5506\"\u003eSTM32延时函数的四种方法_strongercjd的博客-CSDN博客_stm32延时函数\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://shequ.stmicroelectronics.cn/forum.php?mod=viewthread\u0026amp;tid=628767\"\u003eSTM32高精度延时实验 (stmicroelectronics.cn)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"几种延时方法\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E5%87%A0%E7%A7%8D%E5%BB%B6%E6%97%B6%E6%96%B9%E6%B3%95\" class=\"headerlink\" title=\"几种延时方法\"\u003e\u003c/a\u003e几种延时方法\u003c/h2\u003e\u003cp\u003e第一种比较粗暴,就是让单片机做一些无关紧要的工作来打发时间,比如写点循环;\u003c/p\u003e\u003cp\u003e第二种是用汇编指令,和第一种大同小异;\u003c/p\u003e\u003cp\u003e第三种是使用SysTick滴答定时器,但是是采取 \u003cstrong\u003e中断\u003c/strong\u003e 的方式;\u003c/p\u003e\u003cp\u003e第四种是使用SysTick滴答定时器,但是是采取 \u003cstrong\u003e查询\u003c/strong\u003e 的方式,也就是 \u003cstrong\u003e本次使用的方法\u003c/strong\u003e ;\u003c/p\u003e\u003cp\u003e……(前三种可以在参考目录找到具体实现\u003c/p\u003e\u003ch2 id=\"SysTick-定时器\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#SysTick-%E5%AE%9A%E6%97%B6%E5%99%A8\" class=\"headerlink\" title=\"SysTick 定时器\"\u003e\u003c/a\u003eSysTick 定时器\u003c/h2\u003e\u003ch3 id=\"简介\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E7%AE%80%E4%BB%8B\" class=\"headerlink\" title=\"简介\"\u003e\u003c/a\u003e简介\u003c/h3\u003e\u003cp\u003e详细资料可以阅读 《ARM Cortex-M3 权威指南》第3版 9.5 SysTick 定时器。\u003c/p\u003e\u003cp\u003eSysTick 定时器是 Cortex-M 处理器内部集成的一个小型定时器,属于NVIC 的一部分,可以产生SysTick 异常。SysTick 为简单的向下计数的24位计数器,可以使用处理器时钟或者外部时钟。\u003c/p\u003e\u003cp\u003eSysTick 定时器可用作简单的定时器外设,用以产生周期性中断,延时或时间测量。\u003c/p\u003e\u003ch3 id=\"SyTick-定时器的寄存器\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#SyTick-%E5%AE%9A%E6%97%B6%E5%99%A8%E7%9A%84%E5%AF%84%E5%AD%98%E5%99%A8\" class=\"headerlink\" title=\"SyTick 定时器的寄存器\"\u003e\u003c/a\u003eSyTick 定时器的寄存器\u003c/h3\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e地址\u003c/th\u003e\u003cth\u003eCMSIS-Core 符号\u003c/th\u003e\u003cth\u003e寄存器\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e0xE000E010\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eSysTick -\u0026gt; CTRL\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eSysTick 控制和状态寄存器\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e0xE000E014\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eSysTick -\u0026gt; LOAD\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eSysTick 重装值寄存器\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e0xE000E018\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eSysTick -\u0026gt; VAL\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eSysTick 当前值寄存器\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e0xE000E01C\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eSysTick -\u0026gt; CALIB\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eSysTick 校准值寄存器\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch4 id=\"SysTick-控制和状态寄存器(SysTick-gt-CTRL)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#SysTick-%E6%8E%A7%E5%88%B6%E5%92%8C%E7%8A%B6%E6%80%81%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%88SysTick-gt-CTRL%EF%BC%89\" class=\"headerlink\" title=\"SysTick 控制和状态寄存器(SysTick -\u0026gt; CTRL)\"\u003e\u003c/a\u003eSysTick 控制和状态寄存器(\u003ccode\u003eSysTick -\u0026gt; CTRL\u003c/code\u003e)\u003c/h4\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e位段\u003c/th\u003e\u003cth\u003e名称\u003c/th\u003e\u003cth\u003e类型\u003c/th\u003e\u003cth\u003e复位值\u003c/th\u003e\u003cth\u003e描述\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e16\u003c/td\u003e\u003ctd\u003eCOUNTFLAG\u003c/td\u003e\u003ctd\u003eRO\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e当SYSTICK 定时器计数到0时,该位变成1,读取寄存器或清除计数器当前值会被清零\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e2\u003c/td\u003e\u003ctd\u003eCLKSOURCE\u003c/td\u003e\u003ctd\u003eR/W\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e0 = 外部参考时钟(STCLK);\u003cbr/\u003e1 = 使用内核时钟\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e1\u003c/td\u003e\u003ctd\u003eTOCKINT\u003c/td\u003e\u003ctd\u003eR/W\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e1 = SYSTICK 定时器计数减至0时产生异常 \u003cbr/\u003e0 = 不产生异常\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003eENABLE\u003c/td\u003e\u003ctd\u003eR/W\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003eSYSTICK 定时器使能\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch4 id=\"SysTick-重装值寄存器(SysTick-gt-LOAD)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#SysTick-%E9%87%8D%E8%A3%85%E5%80%BC%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%88SysTick-gt-LOAD%EF%BC%89\" class=\"headerlink\" title=\"SysTick 重装值寄存器(SysTick -\u0026gt; LOAD)\"\u003e\u003c/a\u003eSysTick 重装值寄存器(\u003ccode\u003eSysTick -\u0026gt; LOAD\u003c/code\u003e)\u003c/h4\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e位\u003c/th\u003e\u003cth\u003e名称\u003c/th\u003e\u003cth\u003e类型\u003c/th\u003e\u003cth\u003e复位值\u003c/th\u003e\u003cth\u003e描述\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e23: 0\u003c/td\u003e\u003ctd\u003eRELOAD\u003c/td\u003e\u003ctd\u003eR/W\u003c/td\u003e\u003ctd\u003e未定义\u003c/td\u003e\u003ctd\u003e定时器为0时的重装载值\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch4 id=\"SysTick-当前值寄存器(SysTick-gt-VAL)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#SysTick-%E5%BD%93%E5%89%8D%E5%80%BC%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%88SysTick-gt-VAL%EF%BC%89\" class=\"headerlink\" title=\"SysTick 当前值寄存器(SysTick -\u0026gt; VAL)\"\u003e\u003c/a\u003eSysTick 当前值寄存器(\u003ccode\u003eSysTick -\u0026gt; VAL\u003c/code\u003e)\u003c/h4\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e位\u003c/th\u003e\u003cth\u003e名称\u003c/th\u003e\u003cth\u003e类信\u003c/th\u003e\u003cth\u003e复位值\u003c/th\u003e\u003cth\u003e描述\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e23: 0\u003c/td\u003e\u003ctd\u003eCURRENT\u003c/td\u003e\u003ctd\u003eR/Wc\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e读出值位SYSTICK 定时器的当前数值。写入任何值都会清除寄存器,SYSTICK 控制和状态寄存器中的 COUNTFLAG 也会清零\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch4 id=\"SysTick-校准值寄存器(SysTick-gt-CALIB)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#SysTick-%E6%A0%A1%E5%87%86%E5%80%BC%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%88SysTick-gt-CALIB%EF%BC%89\" class=\"headerlink\" title=\"SysTick 校准值寄存器(SysTick -\u0026gt; CALIB)\"\u003e\u003c/a\u003eSysTick 校准值寄存器(\u003ccode\u003eSysTick -\u0026gt; CALIB\u003c/code\u003e)\u003c/h4\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e位\u003c/th\u003e\u003cth\u003e名称\u003c/th\u003e\u003cth\u003e类型\u003c/th\u003e\u003cth\u003e复位值\u003c/th\u003e\u003cth\u003e描述\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e31\u003c/td\u003e\u003ctd\u003eNOREF\u003c/td\u003e\u003ctd\u003eR\u003c/td\u003e\u003ctd\u003e-\u003c/td\u003e\u003ctd\u003e1 = 没有外部参考时钟(STCLK 不可用)\u003cbr/\u003e0 = 有外部参考时钟可供使用\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e30\u003c/td\u003e\u003ctd\u003eSKEW\u003c/td\u003e\u003ctd\u003eR\u003c/td\u003e\u003ctd\u003e-\u003c/td\u003e\u003ctd\u003e1= 校准值并非精准的 10ms\u003cbr/\u003e0 = 校准值准确\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e23: 0\u003c/td\u003e\u003ctd\u003eTENMS\u003c/td\u003e\u003ctd\u003eR/W\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e10毫秒校准值。芯片设计者应通过 Cortex-M3 的输入信号提供该数值,若读出为0,则表示校准值不可用。\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch3 id=\"使用-SysTick-定时器\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E4%BD%BF%E7%94%A8-SysTick-%E5%AE%9A%E6%97%B6%E5%99%A8\" class=\"headerlink\" title=\"使用 SysTick 定时器\"\u003e\u003c/a\u003e使用 SysTick 定时器\u003c/h3\u003e\u003ch4 id=\"主要流程\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E4%B8%BB%E8%A6%81%E6%B5%81%E7%A8%8B\" class=\"headerlink\" title=\"主要流程\"\u003e\u003c/a\u003e主要流程\u003c/h4\u003e\u003cp\u003e本次使用查询的方式。\u003c/p\u003e\u003col\u003e\u003cli\u003e将0写入 \u003ccode\u003eSysTick -\u0026gt; CTRL\u003c/code\u003e 禁止 SysTick 定时器,防止之前 SysTick 定时器在之前被使能过;\u003c/li\u003e\u003cli\u003e将新的重加载值写入 \u003ccode\u003eSysTick -\u0026gt; LOAD\u003c/code\u003e ,重加载值应为周期数减1(因为是倒数到0);\u003c/li\u003e\u003cli\u003e将任何数值写入 SysTick 当前值寄存器 \u003ccode\u003eSysTick -\u0026gt; VAL\u003c/code\u003e ,该寄存器会被清零;\u003c/li\u003e\u003cli\u003e写入 SysTick 控制和状态寄存器 \u003ccode\u003eSysTick -\u0026gt; CTRL\u003c/code\u003e 启动寄存器\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"延时原理\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E5%BB%B6%E6%97%B6%E5%8E%9F%E7%90%86\" class=\"headerlink\" title=\"延时原理\"\u003e\u003c/a\u003e延时原理\u003c/h4\u003e\u003cp\u003e利用SysTick 控制和状态寄存器 \u003ccode\u003eSysTick -\u0026gt; CTRL\u003c/code\u003e 中的 \u003cstrong\u003e计数标志位\u003c/strong\u003e 来确定定时器合适变为0.可以设置 \u003ccode\u003eSysTick -\u0026gt; LOAD\u003c/code\u003e 的值,然后等待计数标志位变为0,以此实现延时。\u003c/p\u003e\u003cp\u003e示例代码\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e//禁止 SysTick 定时器\u003c/span\u003eSysTick \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e CTRL \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//设置计数周期为256 (255~0)\u003c/span\u003eSysTick \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e LOAD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0XFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 清零当前值寄存器\u003c/span\u003eSysTick \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e VAL \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 5 = b\u0026#39;101\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 位0 = 1 为使能SYSTICK定时器\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 位2 = 1 表示使用内核时钟\u003c/span\u003eSysTick \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e CTRL \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 0x00010000 = 1\u0026lt;\u0026lt;16\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 通过查询 SysTick -\u0026gt; CTRL 第16位标志位判断计数器是否计数到0\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eSysTick \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e CTRL \u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x00010000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//禁止 SysTick 定时器\u003c/span\u003eSysTick \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e CTRL \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"进行-us-级别延时\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E8%BF%9B%E8%A1%8C-us-%E7%BA%A7%E5%88%AB%E5%BB%B6%E6%97%B6\" class=\"headerlink\" title=\"进行 us 级别延时\"\u003e\u003c/a\u003e进行 us 级别延时\u003c/h3\u003e\u003ch4 id=\"关于时钟\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E5%85%B3%E4%BA%8E%E6%97%B6%E9%92%9F\" class=\"headerlink\" title=\"关于时钟\"\u003e\u003c/a\u003e关于时钟\u003c/h4\u003e\u003cp\u003e本次选用外部时钟。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e对于STM32,外部时钟源是HCLK(AHB总线时钟)的1/8,内核时钟是HCLK时钟\u003c/strong\u003e ;\u003c/p\u003e\u003cp\u003e)可以翻出来 CubeMX 的时钟树看一眼\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/mg995/4.webp\"/\u003e\u003c/p\u003e\u003cp\u003e以f103 为例,这里HCLK 为72MHz,那么SYSTICK 的时钟为9MHz,即 \u003cstrong\u003eSYSTICK定时器以9MHz的频率递减\u003c/strong\u003e 。\u003c/p\u003e\u003ch4 id=\"计算\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E8%AE%A1%E7%AE%97\" class=\"headerlink\" title=\"计算\"\u003e\u003c/a\u003e计算\u003c/h4\u003e\u003cp\u003e如果要获取 \u003cstrong\u003eN\u003c/strong\u003eus的延迟,那么我们需要计算出 \u003ccode\u003eSysTick -\u0026gt; LOAD\u003c/code\u003e ,即重加载值\u003c/p\u003e\u003cp\u003e容易得到:\u003c/p\u003e\u003cp\u003e$1s = 10^6us$\u003c/p\u003e\u003cp\u003e$$Nus=T\\times LOAD=\\frac{LOAD}{SYSTICK}\\times 10^6$$\u003c/p\u003e\u003cp\u003e$$LOAD=Nus\\times SysTick \\times 10^{-6}$$\u003c/p\u003e\u003cp\u003e已知有:\u003c/p\u003e\u003cp\u003e$HCLK=72MHz$\u003c/p\u003e\u003cp\u003e$SYSTICK=9MHz$\u003c/p\u003e\u003cp\u003e代入具体数值可以得到:\u003c/p\u003e\u003cp\u003e$LOAD=Nus\\times9\\times 10^6\\times 10^{-6}$\u003c/p\u003e\u003cp\u003e最后得到\u003c/p\u003e\u003cp\u003e$$LOAD=Nus\\times9$$\u003c/p\u003e\u003ch4 id=\"72M主频代码\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#72M%E4%B8%BB%E9%A2%91%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"72M主频代码\"\u003e\u003c/a\u003e72M主频代码\u003c/h4\u003e\u003cp\u003e\u003cdel\u003e)博客里面xjb找了一段\u003c/del\u003e\u003c/p\u003e\u003ch5 id=\"us级延时\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#us%E7%BA%A7%E5%BB%B6%E6%97%B6\" class=\"headerlink\" title=\"us级延时\"\u003e\u003c/a\u003eus级延时\u003c/h5\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e/*采用SysTick定时器位16标志位读取方式做延时(程序起始处)*/\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e nus\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//us级延时\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e temp\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eLOAD\u003cspan class=\"token operator\"\u003e=\u003c/span\u003enus\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token number\"\u003e9\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eVAL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//清空计数器\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//使能,减到零时无动作,采用外部时钟源\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 当计数器的值减小到 0 的时候, CRTL 寄存器的位 16 会置 1\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 当置 1 时,读取该位会清 0\u003c/span\u003e \u003cspan class=\"token keyword\"\u003edo\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e temp\u003cspan class=\"token operator\"\u003e=\u003c/span\u003eSysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etemp\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e!\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etemp\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 等待时间到达\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//关闭计数器\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eVal\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//清空计数器\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token comment\"\u003e/*采用SysTick定时器位16标志位读取方式做延时(程序结束处)*/\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch5 id=\"ms级延时\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#ms%E7%BA%A7%E5%BB%B6%E6%97%B6\" class=\"headerlink\" title=\"ms级延时\"\u003e\u003c/a\u003ems级延时\u003c/h5\u003e\u003cp\u003e循环1000次即可\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_ms\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e nms\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e i\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e++\u003c/span\u003ei\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003enms\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"更通用一点的代码\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E6%9B%B4%E9%80%9A%E7%94%A8%E4%B8%80%E7%82%B9%E7%9A%84%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"更通用一点的代码\"\u003e\u003c/a\u003e更通用一点的代码\u003c/h3\u003e\u003cp\u003e上面那个 \u003ccode\u003eSysTick-\u0026gt;LOAD=nus*9;\u003c/code\u003e 的9是手动算出来的,一般情况下主频是很容易知道的,那直接用主频自动算出这个数字就更方便了\u003c/p\u003e\u003cp\u003e再次回到上面的式子\u003c/p\u003e\u003cp\u003e记系统时钟 $SYSCLK \\ Mhz$\u003c/p\u003e\u003cp\u003e$SYSTICK=SYSCLK\\div9 \\ Mhz$\u003c/p\u003e\u003cp\u003e$$Nus=T\\times LOAD=\\frac{LOAD}{SYSTICK\\times10^6}\\times 10^6=\\frac{LOAD}{SYSTICK}$$\u003c/p\u003e\u003cp\u003e$$LOAD=Nus\\times SYSTICK$$\u003c/p\u003e\u003cp\u003e这样可以在代码中定义一个延时倍乘数 \u003ccode\u003efac_us\u003c/code\u003e\u003c/p\u003e\u003cp\u003e$fac_\\ us=SYSCLK\\div8$\u003c/p\u003e\u003ch3 id=\"代码\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"代码\"\u003e\u003c/a\u003e代码\u003c/h3\u003e\u003cp\u003e代码分为两步\u003c/p\u003e\u003col\u003e\u003cli\u003e配置 \u003ccode\u003eSYSTICK\u003c/code\u003e 为\u003ccode\u003eSYSCLK\u003c/code\u003e 的$\\frac{1}{8}$ ,并计算出延时倍乘数 \u003ccode\u003efac_us\u003c/code\u003e\u003c/li\u003e\u003cli\u003e采用SysTick定时器位16标志位读取方式做延时\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cstrong\u003e还要记得在头文件包含 \u003ccode\u003estm32f1xx.h\u003c/code\u003e\u003c/strong\u003e (以f103为例)\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003edealy.c\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003estatic\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e fac_us\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//us延时倍乘数\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 初始化延迟函数\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// SYSTICK的时钟固定为AHB时钟的1/8\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// SYSCLK:系统时钟频率\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_init\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e SYSCLK\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_SYSTICK_CLKSourceConfig\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eSYSTICK_CLKSOURCE_HCLK_DIV8\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//配置SYSTICK \u003c/span\u003efac_us\u003cspan class=\"token operator\"\u003e=\u003c/span\u003eSYSCLK\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//采用SysTick定时器位16标志位读取方式做延时(程序起始处)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//us级延时\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e nus\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e temp\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eLOAD\u003cspan class=\"token operator\"\u003e=\u003c/span\u003enus\u003cspan class=\"token operator\"\u003e*\u003c/span\u003efac_us\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eVAL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//清空计数器\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//使能,减到零时无动作,采用外部时钟源\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 当计数器的值减小到 0 的时候, CRTL 寄存器的位 16 会置 1\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 当置 1 时,读取该位会清 0\u003c/span\u003e \u003cspan class=\"token keyword\"\u003edo\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e temp\u003cspan class=\"token operator\"\u003e=\u003c/span\u003eSysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etemp\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e!\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etemp\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 等待时间到达\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//关闭计数器\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eVAL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//清空计数器\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//采用SysTick定时器位16标志位读取方式做延时(程序结束处)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//ms级延时\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_ms\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e nms\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e i\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e++\u003c/span\u003ei\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003enms\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003edelay.h\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;stm32f1xx.h\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_init\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e SYSCLK\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e nus\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_ms\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e nms\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cblockquote\u003e\u003cp\u003e \u003cstrong\u003e函数 \u003ccode\u003eHAL_SYSTICK_CLKSourceConfig()\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e/** * @brief Configures the SysTick clock source. * @param CLKSource specifies the SysTick clock source. * This parameter can be one of the following values: * @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. * @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source. * @retval None */\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_SYSTICK_CLKSourceConfig\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e CLKSource\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* Check the parameters */\u003c/span\u003e \u003cspan class=\"token function\"\u003eassert_param\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eIS_SYSTICK_CLK_SOURCE\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eCLKSource\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eCLKSource \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e SYSTICK_CLKSOURCE_HCLK\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL \u003cspan class=\"token operator\"\u003e|=\u003c/span\u003e SYSTICK_CLKSOURCE_HCLK\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL \u003cspan class=\"token operator\"\u003e\u0026amp;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eSYSTICK_CLKSOURCE_HCLK\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003c/blockquote\u003e\u003ch2 id=\"总结\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E6%80%BB%E7%BB%93\" class=\"headerlink\" title=\"总结\"\u003e\u003c/a\u003e总结\u003c/h2\u003e\u003cp\u003e最后看下来就是 \u003cstrong\u003e设置重装载值,使能,检查标志位\u003c/strong\u003e 这三个步骤。\u003c/p\u003e\u003cp\u003e还有就是书上讲的是比较清楚详细的。\u003cspan class=\"diana_jiayou\"\u003e\u003c/span\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/463a/"},{"title":"使用FRP和OpenVPN实现校园网内网穿透","time":"2022-05-11T16:52:34Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"使用FRP和OpenVPN实现校园网内网穿透\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#%E4%BD%BF%E7%94%A8FRP%E5%92%8COpenVPN%E5%AE%9E%E7%8E%B0%E6%A0%A1%E5%9B%AD%E7%BD%91%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F\" class=\"headerlink\" title=\"使用FRP和OpenVPN实现校园网内网穿透\"\u003e\u003c/a\u003e使用FRP和OpenVPN实现校园网内网穿透\u003c/h1\u003e\u003cp\u003e)因为手头闲置了一台腾讯云小水管,树莓派3b也没啥任务,就准备尝试一下内网穿透校园网。(学校自己的VPN也能用。)\u003c/p\u003e\u003cul\u003e\u003cli\u003e公网云服务器:运行FRP服务端\u003c/li\u003e\u003cli\u003e公司内网服务器:运行FRP客户端、安装OpenVPN\u003c/li\u003e\u003cli\u003e手头的设备:安装OpenVPN客户端进行连接\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"参考链接\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\" class=\"headerlink\" title=\"参考链接\"\u003e\u003c/a\u003e参考链接\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://www.spacesafe.top/archives/1557\"\u003e使用FRP和OpenVPN实现内网穿透 – EI_’s Blog (spacesafe.top)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/kxwinxp/article/details/88428053\"\u003eCentOS下搭建Frp内网穿透服务_宁静致远kioye的博客-CSDN博客_centos frp\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.ywbj.cc/?p=663\"\u003eVPN设置,设置OpenVPN访问公司内网,图文详细 - 运维笔记(ywbj.cc)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"开个端口先\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#%E5%BC%80%E4%B8%AA%E7%AB%AF%E5%8F%A3%E5%85%88\" class=\"headerlink\" title=\"开个端口先\"\u003e\u003c/a\u003e开个端口先\u003c/h2\u003e\u003cp\u003e本次 frp 服务端监听 端口为 \u003cstrong\u003e\u003ccode\u003e11451\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\u003cp\u003eOpenVPN 使用端口为 \u003cstrong\u003e\u003ccode\u003e21194\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e所以 在腾讯云管理控制台先把这两个端口开了\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003efrp是一个可用于内网穿透的高性能的反向代理应用,支持tcp、udp协议,为http和https协议提供了额外的能力,且尝试性支持了点对点穿透。\u003c/p\u003e\u003cp\u003eFRP采用GO语言开发,支持windows linux MacOS 等多平台部署\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"安装-frp-服务端与客户端\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#%E5%AE%89%E8%A3%85-frp-%E6%9C%8D%E5%8A%A1%E7%AB%AF%E4%B8%8E%E5%AE%A2%E6%88%B7%E7%AB%AF\" class=\"headerlink\" title=\"安装 frp 服务端与客户端\"\u003e\u003c/a\u003e安装 frp 服务端与客户端\u003c/h2\u003e\u003cp\u003e因为网络问题选择先下载好再上传\u003c/p\u003e\u003cp\u003efrp 项目地址: \u003ca href=\"https://github.com/fatedier/frp/releases\"\u003eReleases · fatedier/frp (github.com)\u003c/a\u003e\u003c/p\u003e\u003ch3 id=\"服务端\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#%E6%9C%8D%E5%8A%A1%E7%AB%AF\" class=\"headerlink\" title=\"服务端\"\u003e\u003c/a\u003e服务端\u003c/h3\u003e\u003cp\u003e在云服务器上操作\u003c/p\u003e\u003cp\u003e找个地方解压出来,然后进入目录\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token function\"\u003etar\u003c/span\u003e zxf frp_0.42.0_linux_amd64.tar.gz\u003cspan class=\"token builtin class-name\"\u003ecd\u003c/span\u003e frp_0.42.0_linux_amd64/\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e修改 \u003ccode\u003efrps.ini\u003c/code\u003e 内容如下\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ecommon\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003ebind_port \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e11451\u003c/span\u003e\u003cspan class=\"token comment\"\u003e# 默认配置中监听的是 7000 端口,可根据自己实际情况修改。\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e启动 frp 服务端\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e./frps \u003cspan class=\"token parameter variable\"\u003e-c\u003c/span\u003e ./frps.ini\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"客户端\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#%E5%AE%A2%E6%88%B7%E7%AB%AF\" class=\"headerlink\" title=\"客户端\"\u003e\u003c/a\u003e客户端\u003c/h3\u003e\u003cp\u003e在树莓派上操作\u003c/p\u003e\u003cp\u003e找个地方解压出来,然后进入目录\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token function\"\u003etar\u003c/span\u003e zxf frp_0.42.0_linux_arm64.tar.gz\u003cspan class=\"token builtin class-name\"\u003ecd\u003c/span\u003e frp_0.42.0_linux_arm64/\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e修改 \u003ccode\u003efrps.ini\u003c/code\u003e 内容如下\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ecommon\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003eserver_addr \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e *.*.*.*\u003cspan class=\"token comment\"\u003e# * 改为 FRP 服务端的公网 IP\u003c/span\u003eserver_port \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e11451\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# 为 FRP 服务端监听端口 上面配置端口对应\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003evpn_test_tcp\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token builtin class-name\"\u003etype\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e tcp\u003cspan class=\"token comment\"\u003e#local_ip = 127.0.0.1\u003c/span\u003elocal_port \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1194\u003c/span\u003eremote_port \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e21194\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003evpn_test_udp\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token builtin class-name\"\u003etype\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e udp\u003cspan class=\"token comment\"\u003e#local_ip = 127.0.0.1\u003c/span\u003elocal_port \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1194\u003c/span\u003eremote_port \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e21194\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ecommon\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token comment\"\u003e# server_addr 为 FRP 服务端的公网 IP\u003c/span\u003eserver_addr \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e *.*.*.*\u003cspan class=\"token comment\"\u003e# server_port 为 FRP 服务端监听的端口\u003c/span\u003eserver_port \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e11451\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e启动 frp 客户端\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token comment\"\u003e# 先确保服务端启动了再启动客户端\u003c/span\u003e./frpc \u003cspan class=\"token parameter variable\"\u003e-c\u003c/span\u003e ./frpc.ini\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e这样 frp 服务端就可以建立一个客户端连接了\u003c/p\u003e\u003ch3 id=\"设置-frp-开机自启\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#%E8%AE%BE%E7%BD%AE-frp-%E5%BC%80%E6%9C%BA%E8%87%AA%E5%90%AF\" class=\"headerlink\" title=\"设置 frp 开机自启\"\u003e\u003c/a\u003e设置 frp 开机自启\u003c/h3\u003e\u003cp\u003e客户端服务端操作大同小异\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e注意:\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e客户端是 \u003cstrong\u003e\u003ccode\u003efrpc\u003c/code\u003e\u003c/strong\u003e 和 \u003cstrong\u003e\u003ccode\u003efrpc.ini\u003c/code\u003e\u003c/strong\u003e \u003c/p\u003e\u003cp\u003e服务端是 \u003cstrong\u003e\u003ccode\u003efrps\u003c/code\u003e\u003c/strong\u003e 和 \u003cstrong\u003e\u003ccode\u003efrps.ini\u003c/code\u003e\u003c/strong\u003e \u003c/p\u003e\u003cp\u003e创建后台启动模版(服务端为例)\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token function\"\u003evi\u003c/span\u003e /etc/systemd/system/frps.service\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e\u003ccode\u003eExecStart\u003c/code\u003e 根据自己放 \u003ccode\u003efrp\u003c/code\u003e 的目录选\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003eUnit\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token assign-left variable\"\u003eDescription\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003efrps\u003cspan class=\"token assign-left variable\"\u003eAfter\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003enetwork.target\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003eService\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token assign-left variable\"\u003eExecStart\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e/home/yk/frp/frps \u003cspan class=\"token parameter variable\"\u003e-c\u003c/span\u003e /home/yk/frp/frps.ini\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003eInstall\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token assign-left variable\"\u003eWantedBy\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003emulti-user.target\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token comment\"\u003e# 启动测试\u003c/span\u003esystemctl start frps.service\u003cspan class=\"token comment\"\u003e# 查看启动状态\u003c/span\u003esystemctl status frps.service\u003cspan class=\"token comment\"\u003e# 开机自启\u003c/span\u003esystemctl \u003cspan class=\"token builtin class-name\"\u003eenable\u003c/span\u003e frps.service\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch2 id=\"OpenVPN-配置\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#OpenVPN-%E9%85%8D%E7%BD%AE\" class=\"headerlink\" title=\"OpenVPN 配置\"\u003e\u003c/a\u003eOpenVPN 配置\u003c/h2\u003e\u003cp\u003e在树莓派上操作(与运行)\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e这里使用tun模式、tcp模式,比较容易搭建。手动搭建比较繁琐,我是直接使用一键搭建脚本。\u003c/p\u003e\u003cp\u003e脚本地址:\u003ca href=\"https://github.com/angristan/openvpn-install\"\u003ehttps://github.com/angristan/openvpn-install\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token function\"\u003ecurl\u003c/span\u003e \u003cspan class=\"token parameter variable\"\u003e-O\u003c/span\u003e https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh\u003cspan class=\"token function\"\u003echmod\u003c/span\u003e +x openvpn-install.sh\u003cspan class=\"token function\"\u003esudo\u003c/span\u003e ./openvpn-install.sh\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e因为这里我没截图,就用参考博客的图了\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/frp_openvpn/3.webp\" alt=\"3\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/frp_openvpn/4.webp\" alt=\"4\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/frp_openvpn/5.webp\" alt=\"5\"/\u003e\u003c/p\u003e\u003cp\u003e然后启动 OpenVPN\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-none\"\u003e\u003ccode class=\"language-none\"\u003e# 启动测试systemctl start openvpn.service# 查看启动状态systemctl status openvpn.service# 开机自启systemctl enable openvpn.service\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e在安装完成后,会生成一个以刚刚命名好的ovpn文件。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/frp_openvpn/6.webp\" alt=\"6\"/\u003e\u003c/p\u003e\u003cp\u003e把这玩意下载下来\u003c/p\u003e\u003cp\u003e然后用文本编辑器打开并修改一处(应该是第三行)\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003eremote xxx.xxx.xxx.xxx \u003cspan class=\"token number\"\u003e21194\u003c/span\u003e\u003cspan class=\"token comment\"\u003e#将默认的1194端口改成FRP转发端口21194(上面FRP客户端配置文件配置的)\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cblockquote\u003e\u003cp\u003e安装完成再次运行脚本,可选择 1)添加用户 2)移除已存在的用户 3)协助软件 4)退出\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"进行连接\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#%E8%BF%9B%E8%A1%8C%E8%BF%9E%E6%8E%A5\" class=\"headerlink\" title=\"进行连接\"\u003e\u003c/a\u003e进行连接\u003c/h2\u003e\u003cp\u003e我是在手机上测试的\u003c/p\u003e\u003cp\u003e安装 OpenVPN 客户端,选择我们修改好的 ovpn 文件,连接\u003c/p\u003e\u003cp\u003e)就是速度嘛,理解万岁,看了看论坛还行\u003cspan class=\"carol_shuileshuile\"\u003e\u003c/span\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/24b6/"},{"title":"【fpga4fun】Music box","time":"2022-05-08T17:12:44Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"fpga4fun-Music-box\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#fpga4fun-Music-box\" class=\"headerlink\" title=\"[fpga4fun] Music box\"\u003e\u003c/a\u003e[fpga4fun] Music box\u003c/h1\u003e\u003cblockquote\u003e\u003cp\u003e还没整完。\u003c/p\u003e\u003cp\u003eUPDATE1 AT: 2022-12-22 继续完成了Music box 2 这一部分\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e因为在学校收了一块野火征途mini FPGA开发板,在看的是配套的视频教程。群里学长推荐我做一做 fpga4fun 上的东西,那就整一整 ~\u003c/p\u003e\u003ch2 id=\"简介\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#%E7%AE%80%E4%BB%8B\" class=\"headerlink\" title=\"简介\"\u003e\u003c/a\u003e简介\u003c/h2\u003e\u003cp\u003e这个项目是用 FPGA 驱动喇叭发出声音和音乐。\u003c/p\u003e\u003cp\u003e硬件连接为 FPGA 开发板,一个喇叭,一个 1kΩ 电阻。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://www.fpga4fun.com/images/MusicBox.jpg\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://www.fpga4fun.com/images/MusicBoxSchematic.gif\"/\u003e\u003c/p\u003e\u003ch2 id=\"Music-box-1-Simple-beep\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#Music-box-1-Simple-beep\" class=\"headerlink\" title=\"Music box 1 -Simple beep\"\u003e\u003c/a\u003eMusic box 1 -Simple beep\u003c/h2\u003e\u003ch3 id=\"计数与频率\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#%E8%AE%A1%E6%95%B0%E4%B8%8E%E9%A2%91%E7%8E%87\" class=\"headerlink\" title=\"计数与频率\"\u003e\u003c/a\u003e计数与频率\u003c/h3\u003e\u003cp\u003e一个16位的计数器,范围位 0 ~ 65535 共65536个值,如果板子的主频为 25M ,如果在上升沿计数(时钟是个方波),那么这个16位计数器最高位对应的频率便为 $25\\times10^6\\div65536=381Hz$ \u003cstrong\u003e(就是加到对应那一位变化之后算一次)\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e以此类推第15位为 $25\\times10^6\\div32768=762Hz$ , 第14位为 $25\\times10^6\\div16384=1525Hz$ …… 第2位为$25\\times10^6\\div4=6.25\\times10^6Hz$ , 第1位为$25\\times10^6\\div2=15.5\\times10^6Hz$\u003c/p\u003e\u003ch3 id=\"产生-A-的声音\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#%E4%BA%A7%E7%94%9F-A-%E7%9A%84%E5%A3%B0%E9%9F%B3\" class=\"headerlink\" title=\"产生 A 的声音\"\u003e\u003c/a\u003e产生 A 的声音\u003c/h3\u003e\u003cp\u003eA 的频率为 440Hz \u003c/p\u003e\u003cp\u003e以 25M 主频为例,产生440Hz可以先使用16位计数器,将 25M 分为 65536 份,此时计算出产生 440Hz 只需要计数到 56818 即可。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter\u003cspan class=\"token operator\"\u003e==\u003c/span\u003e\u003cspan class=\"token number\"\u003e56817\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e counter\u003cspan class=\"token operator\"\u003e+\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eassign\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e counter\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e但是这样的话,占空比就不是 50% 了,$b’1000\\ 0000\\ 0000\\ 0000=d’32768$ ,所以低电平为 0\u003cdel\u003e32767,高电平为 32768\u003c/del\u003e56818,占空比为42%\u003c/p\u003e\u003cp\u003e所以可以折中一下,然后每次翻转 \u003ccode\u003espeaker\u003c/code\u003e 的电平值 ,而且折中之后可以省一位计数器的值~\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e14\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter\u003cspan class=\"token operator\"\u003e==\u003c/span\u003e\u003cspan class=\"token number\"\u003e28408\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e counter\u003cspan class=\"token operator\"\u003e+\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter\u003cspan class=\"token operator\"\u003e==\u003c/span\u003e\u003cspan class=\"token number\"\u003e28408\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"实践\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#%E5%AE%9E%E8%B7%B5\" class=\"headerlink\" title=\"实践\"\u003e\u003c/a\u003e实践\u003c/h3\u003e\u003cp\u003e因为征途mini的主频为50M,所以用17位可以产生的时钟为 $(2\\times25\\times10^6)\\div(2\\times65536)=381Hz$\u003c/p\u003e\u003cp\u003e要产生440Hz,计数到 $56818\\times2=113636$ 即可。\u003c/p\u003e\u003cp\u003e使用翻转的方式,使用16位计数器,折中计数至 56818,同时加上了复位信号\u003c/p\u003e\u003cp\u003e主程序代码:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token comment\"\u003e// music.v\u003c/span\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e music \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;d56817\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;d56817\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e仿真验证,\u003ccode\u003eTestbench\u003c/code\u003e 代码\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token comment\"\u003e// tb_music.v\u003c/span\u003e\u003cspan class=\"token constant\"\u003e`timescale\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e \u003cspan class=\"token function\"\u003etb_music\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e rst \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e#20\u003c/span\u003e rst \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#10\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003emusic music_inst\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eclk \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003erst \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003espeaker \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"仿真结果\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#%E4%BB%BF%E7%9C%9F%E7%BB%93%E6%9E%9C\" class=\"headerlink\" title=\"仿真结果\"\u003e\u003c/a\u003e仿真结果\u003c/h4\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/fpga4fun/0.png\" alt=\"0\"/\u003e\u003c/p\u003e\u003cp\u003e占空比 $4545450-3409090=1136360$ $3409090-2272730=1136360$ ,可以看出占空比确实为50% \u003c/p\u003e\u003cp\u003e频率 $\\frac{1}{4545450-2272730}\\times10^9=440Hz$\u003c/p\u003e\u003cp\u003e)因为我莫得喇叭,就先不上板子了……\u003c/p\u003e\u003chr/\u003e\u003cp\u003e\u003cdel\u003e剩下的等我学完……\u003c/del\u003e 下面的再更新一下 \u003cspan class=\"bella_beijixing\"\u003e\u003c/span\u003e\u003c/p\u003e\u003ch3 id=\"添加参数\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#%E6%B7%BB%E5%8A%A0%E5%8F%82%E6%95%B0\" class=\"headerlink\" title=\"添加参数\"\u003e\u003c/a\u003e添加参数\u003c/h3\u003e\u003cp\u003e添加了一个名字叫 \u003ccode\u003eclkdivider\u003c/code\u003e 的参数,方便之后的修改。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token comment\"\u003e// music.v\u003c/span\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e music #\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eparameter\u003c/span\u003e clkdivider \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e50000000\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e440\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e clkdivider\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e clkdivider\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token comment\"\u003e// testbench.v\u003c/span\u003e\u003cspan class=\"token constant\"\u003e`timescale\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e \u003cspan class=\"token function\"\u003etb_music\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eparameter\u003c/span\u003e clkdivider \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e50000000\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e440\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e rst \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e#20\u003c/span\u003e rst \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#10\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003emusic #\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003eclkdivider\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eclkdivider\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003emusic_inst \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eclk \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003erst \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003espeaker \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch2 id=\"Music-box-2-Ambulance-siren\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#Music-box-2-Ambulance-siren\" class=\"headerlink\" title=\"Music box 2 - Ambulance siren\"\u003e\u003c/a\u003eMusic box 2 - Ambulance siren\u003c/h2\u003e\u003cp\u003e这次在两种音调之间交替。首先使用24位计数器 \u003ccode\u003etone\u003c/code\u003e 来产生一个缓慢的方波,其最高位(MSB)以1.5Hz的频率进行切换。然后我们在这两个频率之间切换另一个计数器。这样就发出了类似救护车警报一类的声音。\u003c/p\u003e\u003cp\u003e先产生一个1.5Hz的信号 \u003ccode\u003etone\u003c/code\u003e ,此时计数器 \u003ccode\u003ecounter\u003c/code\u003e 为向下计数,当 \u003ccode\u003ecounter\u003c/code\u003e 为0时,如果 \u003ccode\u003etone\u003c/code\u003e 为1,继续产生440Hz的信号,当 \u003ccode\u003etone\u003c/code\u003e 为0时,产生220Hz。这两个频率的信号以1.5Hz的频率交替出现。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token comment\"\u003e// ambulance.v\u003c/span\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e music #\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eparameter\u003c/span\u003e clkdivider \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e50000000\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e440\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// MSB 1.5Hz变动一次\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e tone \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e25\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e tone \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e tone\u003cspan class=\"token operator\"\u003e+\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 计数器为0,说明当前频率已产生完毕,切换下一个\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 根据tone的MSB是否有值来确定\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 如果tone的MSB为0,则切换为220Hz的声音\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 如果tone的MSB为1,则切换为440Hz的声音\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e?\u003c/span\u003eclkdivider\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e clkdivider\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e-\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"Police-siren\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#Police-siren\" class=\"headerlink\" title=\"Police siren\"\u003e\u003c/a\u003ePolice siren\u003c/h3\u003e\u003cp\u003e接下来是生成一个听起来像警笛的声音。这个声音听着是又小逐渐变大的这种,之前声音像跳楼梯,这次的像上坡。\u003c/p\u003e\u003cp\u003e我们将音调计数器 \u003ccode\u003etone\u003c/code\u003e 的速度提高一倍,变为3Hz。\u003c/p\u003e\u003cp\u003e然后,就开始升频操作。我们提取音调计数器的16位到第22位:\u003ccode\u003etone[22:16]\u003c/code\u003e。这样我们得到了7bit,并且以一个中等速度从0~127,到达127后,再从127~0。\u003c/p\u003e\u003cp\u003e为了得到一个向下的斜坡,将其进行翻转(\u003ccode\u003e~tone[22:16]\u003c/code\u003e),此时从127~0。\u003c/p\u003e\u003cp\u003e为了切换上下这两个通道,同上面一样,我们根据 MSB \u003ccode\u003etone[23]\u003c/code\u003e 的值进行选择,3Hz切换一次。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e ramp \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e23\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e?\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cblockquote\u003e\u003cp\u003ewire表示直通,即只要输入有变化,输出马上无条件地反映;reg表示一定要有触发,输出才会反映输入。(\u003ca href=\"https://zhuanlan.zhihu.com/p/482748824\"\u003e【Verilog HDL】Verilog中wire与reg类型学习 - 知乎 (zhihu.com)\u003c/a\u003e)\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e这样做的意义:\u003ca href=\"https://www.fpga4fun.com/MusicBox_ramp_explanation.html\"\u003efpga4fun.com - Music box siren ramp\u003c/a\u003e 。\u003c/p\u003e\u003cp\u003e这个 \u003ccode\u003eramp\u003c/code\u003e 的值从 \u003ccode\u003e7\u0026#39;b0000000\u003c/code\u003e 到 \u003ccode\u003e7\u0026#39;b1111111\u003c/code\u003e 。为了得到一个可用的值产生声音,我们在他前面补2位 \u003ccode\u003e2\u0026#39;b01\u003c/code\u003e 后面补7位 \u003ccode\u003e7\u0026#39;b0000000\u003c/code\u003e 进行填充。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e clkdivider \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u0026#39;b01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e ramp\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e7\u0026#39;b0000000\u003c/span\u003e\u003cspan class=\"token operator\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e这样, \u003ccode\u003eclkdivider\u003c/code\u003e 的值从 \u003ccode\u003e16\u0026#39;b0100000000000000\u003c/code\u003e 到\u003ccode\u003e16\u0026#39;b01111110000000\u003c/code\u003e ,在50MHz的时钟下,相当于产生从765Hz到1525Hz的高音调警报器。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token comment\"\u003e// police\u003c/span\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e police #\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eparameter\u003c/span\u003e clkdivider \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e50000000\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e440\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// MSB 3Hz变动一次\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e23\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e tone \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e24\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e tone \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e tone\u003cspan class=\"token operator\"\u003e+\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 判断是上升还是下降\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e ramp \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e23\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e?\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// clkdivider 以3Hz为周期变动\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e clkdivider \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u0026#39;b01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e ramp\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e7\u0026#39;b0000000\u003c/span\u003e\u003cspan class=\"token operator\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e clkdivider\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e-\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"High-speed-pursuit\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#High-speed-pursuit\" class=\"headerlink\" title=\"High-speed pursuit\"\u003e\u003c/a\u003eHigh-speed pursuit\u003c/h3\u003e\u003cp\u003e要进行高速追击,警报声音有快有慢。\u003c/p\u003e\u003cp\u003e所以 \u003ccode\u003etone[22:16]\u003c/code\u003e 给我们一个快速的斜坡,而 \u003ccode\u003etone[25:19]\u003c/code\u003e 给我们一个缓慢的斜坡。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e fastsweep \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e23\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e?\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e slowsweep \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e26\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e?\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e19\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e19\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e clkdivider \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u0026#39;b01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e28\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e?\u003c/span\u003e slowsweep \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e fastsweep\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e7\u0026#39;b0000000\u003c/span\u003e\u003cspan class=\"token operator\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e最终代码\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token comment\"\u003e// hign.v\u003c/span\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e hign \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e28\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e tone \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e25\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e tone \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e tone\u003cspan class=\"token operator\"\u003e+\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e fastsweep \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e23\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e?\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e slowsweep \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e26\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e?\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e19\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e19\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e clkdivider \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u0026#39;b01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e28\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e?\u003c/span\u003e slowsweep \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e fastsweep\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e7\u0026#39;b0000000\u003c/span\u003e\u003cspan class=\"token operator\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e clkdivider\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e-\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e仿真\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token constant\"\u003e`timescale\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e \u003cspan class=\"token function\"\u003etb_hign\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//初始化输入信号\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e rst \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e#20\u003c/span\u003e rst \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#10\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ehign hign_inst \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eclk \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//input clk\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003erst \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003espeaker \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//output speaker\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/fpga4fun/1.png\" alt=\"1\"/\u003e\u003c/p\u003e\u003cp\u003e可以看出间隔确实是变化的,仿真波形图里第一个频率经过计算为912Hz,符合要求。\u003c/p\u003e\u003chr/\u003e\u003cp\u003e待续……\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/f804/"},{"title":"STM32\u0026UART串口通信(使用CubeMX)","time":"2022-05-08T14:54:19Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"STM32-UART通信\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#STM32-UART%E9%80%9A%E4%BF%A1\" class=\"headerlink\" title=\"STM32 UART通信\"\u003e\u003c/a\u003eSTM32 UART通信\u003c/h1\u003e\u003cp\u003e\u003cdel\u003e令人感慨,大二上学期不知道这玩意的我,是怎么把广和通项目糊出来的?\u003c/del\u003e\u003c/p\u003e\u003cp\u003e写完咯 ~ \u003cdel\u003e还没写完\u003c/del\u003e\u003c/p\u003e\u003ch2 id=\"参考链接\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\" class=\"headerlink\" title=\"参考链接\"\u003e\u003c/a\u003e参考链接\u003c/h2\u003e\u003cp\u003e研究原理啥的还是看看参考的博客的好~\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e[\u003ca href=\"https://www.emoe.xyz/bonjour-stm32-uart-communication/\"\u003eBonjour STM32] No.7-demo 4.串口通信 - Emoe-Studio\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.emoe.xyz/ee_tutorial_04/\"\u003e电子入门教程[04]-喂?zaima? - Emoe-Studio\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/menlsh/archive/2013/01/28/2880580.html\"\u003e串口通信与编程01:串口基础知识 - 依旧淡然 - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/ChurF-Lin/p/10793111.html\"\u003e基于STM32之UART串口通信协议(一)详解 - LLLIN000 - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/ChurF-Lin/p/10798193.html\"\u003e基于STM32之UART串口通信协议(二)发送 - LLLIN000 - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/ChurF-Lin/p/10809000.html\"\u003e基于STM32之UART串口通信协议(三)接收 - LLLIN000 - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/ChurF-Lin/p/11139901.html\"\u003e基于STM32之UART串口通信协议(四)Printf发送 - LLLIN000 - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/milton/p/14711577.html\"\u003eSTM32 printf 方法重定向到串口UART - Milton - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/ForeverIT/article/details/82263142\"\u003eSTM32 Uart 实现printf函数_ForeverIT的博客-CSDN博客_stm32 实现printf\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"串口通信\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E4%B8%B2%E5%8F%A3%E9%80%9A%E4%BF%A1\" class=\"headerlink\" title=\"串口通信\"\u003e\u003c/a\u003e串口通信\u003c/h2\u003e\u003cp\u003e串口是串行接口(serial port)的简称,也称为串行通信接口或COM接口。\u003c/p\u003e\u003cimg src=\"https://s2.ax1x.com/2020/02/11/1TKcqI.jpg\" style=\"zoom: 67%;\"/\u003e\u003cimg src=\"https://s2.ax1x.com/2020/02/11/1TKyMd.jpg\" style=\"zoom:67%;\"/\u003e\u003cp\u003e串口通信是指采用串行通信协议(serial communication)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。\u003c/p\u003e\u003cp\u003e串口按电气标准及协议来划分,包括RS-232-C、RS-422、RS485等。\u003c/p\u003e\u003cp\u003e在串行通信中,数据在1位宽的 \u003cstrong\u003e单条线路\u003c/strong\u003e 上进行传输,一个字节的数据要分为8次,由低位到高位按顺序一位一位的进行传送。\u003c/p\u003e\u003cp\u003e串行通信的数据是逐位传输的,发送方发送的每一位都具有固定的时间间隔,这就要求接收方也要按照发送方同样的时间间隔来接收每一位。不仅如此,接收方还必须能够确定一个信息组的开始和结束。\u003c/p\u003e\u003cp\u003e常用的两种基本串行通信方式包括同步通信和异步通信。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e然后剩下的可以去参考链接继续了解了~\u003c/strong\u003e \u003cspan class=\"diana_yiyanzhen\"\u003e\u003c/span\u003e\u003c/p\u003e\u003ch2 id=\"UART简介\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#UART%E7%AE%80%E4%BB%8B\" class=\"headerlink\" title=\"UART简介\"\u003e\u003c/a\u003eUART简介\u003c/h2\u003e\u003cp\u003e嵌入式开发中,UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),是 \u003cstrong\u003e异步串口通信协议\u003c/strong\u003e 的一种,工作原理是将传输数据的每个字符一位接一位地传输,它能将要传输的资料在串行通信与并行通信之间加以转换,能够灵活地与外部设备进行全双工数据交换。\u003cspan class=\"ava_datou\"\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003eUSART\u003c/strong\u003e 相当于UART的升级版,USART支持同步模式,因此USART 需要同步始终信号USART_CK(如STM32 单片机),通常情况同步信号很少使用,因此一般的单片机UART和USART使用方式是一样的,都使用异步模式。因为USART的使用方法上跟UART基本相同,所以在此就 \u003cstrong\u003e以UART\u003c/strong\u003e 来讲该通信协议了。\u003c/p\u003e\u003ch2 id=\"UART功能说明\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#UART%E5%8A%9F%E8%83%BD%E8%AF%B4%E6%98%8E\" class=\"headerlink\" title=\"UART功能说明\"\u003e\u003c/a\u003eUART功能说明\u003c/h2\u003e\u003cp\u003e接口通过三个引脚从外部连接到其它设备。任何 USART 双向通信均需要 至少两个引脚:接收数据输入引脚 (RX) 和发送数据引脚输出 (TX):\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e两个系统的GND必须连在一起\u003c/strong\u003e(因为需要有相同的参考电位)\u003c/p\u003e\u003cp\u003e\u003cstrong\u003eRX:\u003c/strong\u003e接收数据输入引脚就是串行数据输入引脚。过采样技术可区分有效输入数据和噪声,从而用于恢复数据。\u003cbr/\u003e\u003cstrong\u003eTX:\u003c/strong\u003e发送数据输出引脚。如果关闭发送器,该输出引脚模式由其 I/O 端口配置决定。如果使 能了发送器但没有待发送的数据,则 TX 引脚处于高电平。在单线和智能卡模式下,该 I/O 用于发送和接收数据(USART 电平下,随后在 SW_RX 上接收数据)。\u003c/p\u003e\u003chr/\u003e\u003cp\u003e具体原理留个坑,先大概了解到这,这次主要是通过 \u003cstrong\u003eCubeMX\u003c/strong\u003e 使用UART进行通信~\u003cspan class=\"diana_bixin\"\u003e\u003c/span\u003e\u003c/p\u003e\u003chr/\u003e\u003ch2 id=\"波特率\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E6%B3%A2%E7%89%B9%E7%8E%87\" class=\"headerlink\" title=\"波特率\"\u003e\u003c/a\u003e波特率\u003c/h2\u003e\u003cp\u003e波特率的单位是 \u003cstrong\u003eBits/s\u003c/strong\u003e,很好理解, \u003cstrong\u003e每一位的传输时间\u003c/strong\u003e 。这个参数决定了串口传输数据的速度,115200,这是串口常用的波特率里很快的一个速度了,但是计算一下,11.5kbits/s,除以8换算成字节,也就是不到2kBytes/s,每秒传输一千多个字节的数据,就是这样一个速度了——比较老的USB2.0的U盘拷贝文件的速度大概在几个MBytes到十几MBytes每秒之间,对比一下可见串口这玩意确实是一个在速度上十分落后的通信接口了。\u003c/p\u003e\u003cp\u003e如何计算?比如我们的波特率是9600,那么每一位传输的时间是1/9600 s,意思就是说如果接连不断地发送数据帧,按照11bit长度计算,1秒钟可以发送9600/11=872.7,也就是差不多872个数据帧,也就是872字节。按照ASCII字母来说,872个英文字母/s,够直观了8~\u003c/p\u003e\u003ch2 id=\"CubeMX配置\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#CubeMX%E9%85%8D%E7%BD%AE\" class=\"headerlink\" title=\"CubeMX配置\"\u003e\u003c/a\u003eCubeMX配置\u003c/h2\u003e\u003cp\u003e本次使用 STM32F405RGT6\u003c/p\u003e\u003ch3 id=\"配置时钟\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E9%85%8D%E7%BD%AE%E6%97%B6%E9%92%9F\" class=\"headerlink\" title=\"配置时钟\"\u003e\u003c/a\u003e配置时钟\u003c/h3\u003e\u003cp\u003e选择外部晶振,然后时钟拉到最高~\u003c/p\u003e\u003cp\u003e)用一张之前的图,意思差不多\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/mg995/0.webp\" style=\"zoom:80%;\"/\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/mg995/4.webp\" alt=\"4\"/\u003e\u003c/p\u003e\u003ch4 id=\"设置调试接口\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E8%AE%BE%E7%BD%AE%E8%B0%83%E8%AF%95%E6%8E%A5%E5%8F%A3\" class=\"headerlink\" title=\"设置调试接口\"\u003e\u003c/a\u003e设置调试接口\u003c/h4\u003e\u003cp\u003e)照着参考链接来\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/uart/0.webp\"/\u003e\u003c/p\u003e\u003ch3 id=\"配置串口\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E9%85%8D%E7%BD%AE%E4%B8%B2%E5%8F%A3\" class=\"headerlink\" title=\"配置串口\"\u003e\u003c/a\u003e配置串口\u003c/h3\u003e\u003cp\u003e先启用,选择异步通信;然后波特率保持默认的 115200 就行\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/uart/1.webp\" alt=\"1\"/\u003e\u003ch3 id=\"选择生成必要的代码\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E9%80%89%E6%8B%A9%E7%94%9F%E6%88%90%E5%BF%85%E8%A6%81%E7%9A%84%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"选择生成必要的代码\"\u003e\u003c/a\u003e选择生成必要的代码\u003c/h3\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/uart/2.webp\" alt=\"2\"/\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e1.Copy all used libraries into the project folder\u003c/p\u003e\u003cp\u003e将所有使用过的库复制到项目文件夹中。\u003c/p\u003e\u003cp\u003e不管你用,还是没有用到,都拷贝到你工程目录下。这样一来,你工程下文件就比较多。\u003c/p\u003e\u003cp\u003e2.Copy only the necessary library files \u003c/p\u003e\u003cp\u003e只复制必要的库文件。\u003c/p\u003e\u003cp\u003e这个相比上一个减少了很多文件。比如你没有使用CAN、SPI…等外设,就不会拷贝相关库文件到你工程下。\u003c/p\u003e\u003cp\u003e3.Add necessary library files as reference in the toolchain project configuration file \u003c/p\u003e\u003cp\u003e在工具链项目配置文件中添加必要的库文件作为参考。\u003c/p\u003e\u003cp\u003e这里没有复制HAL库文件,只添加了必要文件(如main.c)。相比上面,没有Drivers相关文件。\u003c/p\u003e\u003c/blockquote\u003e\u003cblockquote\u003e\u003cp\u003eGenerate peripheral initialization as a pair of’.c/.h’ files per peripheral\u003c/p\u003e\u003cp\u003e每个外设生成独立的’.c/.h’文件\u003c/p\u003e\u003cp\u003e不勾:所有初始化代码都生成在main.c\u003c/p\u003e\u003cp\u003e勾选:初始化代码生成在对应的外设文件。 如UART初始化代码生成在uart.c中。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e)其他配置啥的可以上网搜搜具体意思\u003c/p\u003e\u003ch2 id=\"UART-发送\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#UART-%E5%8F%91%E9%80%81\" class=\"headerlink\" title=\"UART 发送\"\u003e\u003c/a\u003eUART 发送\u003c/h2\u003e\u003cp\u003e主要使用到的函数为\u003c/p\u003e\u003cp\u003e在 \u003ccode\u003estm32f4xx_hal_uart.c\u003c/code\u003e 中\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003eHAL_StatusTypeDef \u003cspan class=\"token function\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eUART_HandleTypeDef \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehuart\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003epData\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e Size\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e Timeout\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cblockquote\u003e\u003cul\u003e\u003cli\u003ehuart :选择用来发送的UART串口\u003c/li\u003e\u003cli\u003epData :指向将要发送的数据的指针\u003c/li\u003e\u003cli\u003eSize :发送数据的大小\u003c/li\u003e\u003cli\u003eTimeout:超时时间\u003c/li\u003e\u003c/ul\u003e\u003c/blockquote\u003e\u003ch3 id=\"直接发送\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E7%9B%B4%E6%8E%A5%E5%8F%91%E9%80%81\" class=\"headerlink\" title=\"直接发送\"\u003e\u003c/a\u003e直接发送\u003c/h3\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e定义一个数组\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e//数组内十六进制代表“ABCDE”\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e uTx_Data\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x41\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x42\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x43\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x44\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x45\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e调用函数发送\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// UART发送,使用打开的第一个端口,发送定义的数组里的字符\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e uTx_Data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003esizeof\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003euTx_Data\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xffff\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 延迟1s\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_Delay\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"自己写发送函数\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E8%87%AA%E5%B7%B1%E5%86%99%E5%8F%91%E9%80%81%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"自己写发送函数\"\u003e\u003c/a\u003e自己写发送函数\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e前面的发送方式,不仅要传入句柄参数,还有数组、长度、超时时间参数。\u003c/p\u003e\u003cp\u003e为了简便发送,我们可以专门写一个字符串发送函数,可以直接传入一个数组即可发送,可以更简便地实现字符串发送。\u003c/p\u003e\u003cp\u003e优点是,发送数据更简便,能够一次性发送很长的数据数组。\u003c/p\u003e\u003cp\u003e但缺点就是不能控制发送的长度,会将整个数据数组发出。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e具体实现方式可以在参考链接中找到~\u003c/p\u003e\u003ch3 id=\"使用-printf-函数发送\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E4%BD%BF%E7%94%A8-printf-%E5%87%BD%E6%95%B0%E5%8F%91%E9%80%81\" class=\"headerlink\" title=\"使用 printf() 函数发送\"\u003e\u003c/a\u003e使用 printf() 函数发送\u003c/h3\u003e\u003cp\u003e\u003cdel\u003e好好好好好好好好好好好好好好好好好好\u003c/del\u003e\u003c/p\u003e\u003cp\u003e首先打开 \u003ccode\u003eusart.c\u003c/code\u003e,然后添加头文件 \u003ccode\u003e#include \u0026#34;stdio.h\u0026#34;\u003c/code\u003e\u003c/p\u003e\u003cp\u003e再加入\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e/* USER CODE BEGIN 1 */\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003eifdef\u003c/span\u003e \u003cspan class=\"token expression\"\u003e__GNUC__\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* With GCC/RAISONANCE, small printf (option LD Linker-\u0026gt;Libraries-\u0026gt;Small printf set to \u0026#39;Yes\u0026#39;) calls __io_putchar() */\u003c/span\u003e \u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003ePUTCHAR_PROTOTYPE\u003c/span\u003e \u003cspan class=\"token expression\"\u003e\u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e \u003cspan class=\"token function\"\u003e__io_putchar\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e ch\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003eelse\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003ePUTCHAR_PROTOTYPE\u003c/span\u003e \u003cspan class=\"token expression\"\u003e\u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e \u003cspan class=\"token function\"\u003efputc\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e ch\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e FILE \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ef\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003eendif\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* __GNUC__ */\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token comment\"\u003e/** * @brief Retargets the C library printf function to the USART. * @param None * @retval None */\u003c/span\u003ePUTCHAR_PROTOTYPE\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* Place your implementation of fputc here */\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ech\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e ch\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token comment\"\u003e/* USER CODE END 1 */\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e然后再到 \u003ccode\u003emain.c\u003c/code\u003e 中添加头文件 \u003ccode\u003e#include \u0026#34;stdio.h\u0026#34;\u003c/code\u003e\u003c/p\u003e\u003cp\u003e然后就能愉快的用 \u003ccode\u003eprintf()\u003c/code\u003e 了~\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token function\"\u003eprintf\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;Hello World!\\n\\r\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"具体效果\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E5%85%B7%E4%BD%93%E6%95%88%E6%9E%9C\" class=\"headerlink\" title=\"具体效果\"\u003e\u003c/a\u003e具体效果\u003c/h3\u003e\u003cp\u003e)用这个板子是因为上面已经有 \u003ccode\u003eCH340\u003c/code\u003e 这个芯片了,电脑上装好驱动可以直接用~\u003c/p\u003e\u003cp\u003e如果莫得的话,买一个 \u003ccode\u003eUSB 转 TTL 模块\u003c/code\u003e 就行,几块钱~\u003c/p\u003e\u003cp\u003e主要代码\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e// 数组内十六进制代表 ABCDE\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e uTx_Data\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x41\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x42\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x43\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x44\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x45\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 直接发送\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e uTx_Data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003esizeof\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003euTx_Data\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xffff\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_Delay\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 使用 printf 发送\u003c/span\u003e \u003cspan class=\"token function\"\u003eprintf\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;Hello World!\\n\\r\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_Delay\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e然后连上,打开串口助手,打开串口\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/uart/3.gif\" alt=\"3\"/\u003e\u003c/p\u003e\u003ch2 id=\"UART-接收\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#UART-%E6%8E%A5%E6%94%B6\" class=\"headerlink\" title=\"UART 接收\"\u003e\u003c/a\u003eUART 接收\u003c/h2\u003e\u003cp\u003e\u003cdel\u003e)等我学完\u003c/del\u003e \u003cspan class=\"ava_datou\"\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e在之前文件的基础上,打开串口中断\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/uart/4.webp\" alt=\"4\" style=\"zoom:50%;\"/\u003e\u003cp\u003e如果开启了其他中断,要顺便设置一下中断优先级,如果没有默认即可\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/uart/5.webp\" alt=\"5\" style=\"zoom:67%;\"/\u003e\u003cp\u003e生成代码。\u003c/p\u003e\u003ch3 id=\"函数说明\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E5%87%BD%E6%95%B0%E8%AF%B4%E6%98%8E\" class=\"headerlink\" title=\"函数说明\"\u003e\u003c/a\u003e函数说明\u003c/h3\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e中断处理函数 \u003ccode\u003evoid USART1_IRQHandler(void)\u003c/code\u003e ,在 \u003ccode\u003estm32f4xx_it.c\u003c/code\u003e 中;\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003eHAL库函数 \u003ccode\u003eHAL_UART_Transmit\u003c/code\u003e ,用来发送数据;\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003eHAL库函数 \u003ccode\u003eHAL_UART_Receive\u003c/code\u003e ,用来接收函数\u003c/p\u003e\u003cp\u003e该函数能够通过huart串口接收Size位pData数据。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003cstrong\u003e参数说明:\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003ehuart\u003c/code\u003e :选择用来接收的UART串口\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003epData\u003c/code\u003e :指向将要存放数据的指针\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003eSize\u003c/code\u003e :接收数据的大小\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003eTimeout\u003c/code\u003e :超时时间\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/blockquote\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"接收方式\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E6%8E%A5%E6%94%B6%E6%96%B9%E5%BC%8F\" class=\"headerlink\" title=\"接收方式\"\u003e\u003c/a\u003e接收方式\u003c/h3\u003e\u003cp\u003e接收方式大概有三种,大致是\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e直接接收\u003c/p\u003e\u003cp\u003e这种方式为在 \u003ccode\u003ewhile\u003c/code\u003e 循环中不断判断是否接收成功,\u003cstrong\u003e会严重占用程序的进程\u003c/strong\u003e ,且接收较长的数据时,会发生接收错误。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e中断接收,接收一位发送一位\u003c/p\u003e\u003cp\u003e使用中断可以很大程度的避免不必要的资源浪费。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e在没有什么特别事件的时候,单片机会按照原本的程序运行着,等到有数据从UART串口发送过来时,会马上进入UART串口的中断处理函数中,完成相应的中断处理操作,完成后会退出中断函数,并继续原本在进行的程序,这样就不会占用单片机程序太多的进程了。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e但仍会发生前面直接接收方式的接收异常状况\u003c/strong\u003e ,主要原因是,在中断处理函数中,我们在接收了数据后并紧接着作出发送的操作,这会出现一个状况,还没来得及将上一次接收到的数据发送出去,就进入下一次接收的中断,然而导致失去了一些数据了。\u003c/p\u003e\u003c/blockquote\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e中断接收,全部接收完后再发送\u003c/p\u003e\u003cp\u003e这个方式以一定的资源换取了一定程度数据的完整。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e这种接收方式,是在方式2的基础上稍作改进的,较于前两种接收方式,是更好的一种接收方式,不会给原本的程序进程造成太大影响。还可以先接收全部数据(提示:通过定义一个较大的数组来存储),再将数据进行处理,这样能确保接收数据的完整性,并能将数据进行有效的处理、分析。\u003c/p\u003e\u003c/blockquote\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e以上 1, 2 两种方式可以在参考博客中找到实现方法,这里主要关注方法 3\u003c/p\u003e\u003ch3 id=\"中断接收,全部接收完后再发送\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E4%B8%AD%E6%96%AD%E6%8E%A5%E6%94%B6%EF%BC%8C%E5%85%A8%E9%83%A8%E6%8E%A5%E6%94%B6%E5%AE%8C%E5%90%8E%E5%86%8D%E5%8F%91%E9%80%81\" class=\"headerlink\" title=\"中断接收,全部接收完后再发送\"\u003e\u003c/a\u003e中断接收,全部接收完后再发送\u003c/h3\u003e\u003ch4 id=\"使能接收中断\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E4%BD%BF%E8%83%BD%E6%8E%A5%E6%94%B6%E4%B8%AD%E6%96%AD\" class=\"headerlink\" title=\"使能接收中断\"\u003e\u003c/a\u003e\u003cstrong\u003e使能接收中断\u003c/strong\u003e\u003c/h4\u003e\u003cp\u003e在 \u003ccode\u003eHAL_UART_MspInit\u003c/code\u003e(在 \u003ccode\u003eusart.c\u003c/code\u003e中)\u003cstrong\u003e使能接收中断\u003c/strong\u003e \u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_UART_MspInit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eUART_HandleTypeDef\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e uartHandle\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 省略掉的前面的一些配置\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* USER CODE BEGIN USART1_MspInit 1 */\u003c/span\u003e \u003cspan class=\"token function\"\u003e__HAL_UART_ENABLE_IT\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003euartHandle\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e UART_IT_RXNE\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* USER CODE END USART1_MspInit 1 */\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"编写接收中断服务程序\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E7%BC%96%E5%86%99%E6%8E%A5%E6%94%B6%E4%B8%AD%E6%96%AD%E6%9C%8D%E5%8A%A1%E7%A8%8B%E5%BA%8F\" class=\"headerlink\" title=\"编写接收中断服务程序\"\u003e\u003c/a\u003e编写接收中断服务程序\u003c/h4\u003e\u003cp\u003e \u003cstrong\u003e\u003ccode\u003eUSART1_IRQHandler\u003c/code\u003e\u003c/strong\u003e (在 \u003ccode\u003estm32f4xx_it.c\u003c/code\u003e 中)\u003c/p\u003e\u003cp\u003e定义三个静态变量\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e// 存储数组\u003c/span\u003e\u003cspan class=\"token keyword\"\u003estatic\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e uRx_Data\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1024\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 指向存储数组将要存储数据的位\u003c/span\u003e\u003cspan class=\"token keyword\"\u003estatic\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003e pRx_Data \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e uRx_Data\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 接收数据长度\u003c/span\u003e\u003cspan class=\"token keyword\"\u003estatic\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e uLength \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e调用HAL库的UART接收函数以及发送函数\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e2、3步都可以根据自身要求进行改进\u003c/p\u003e\u003cul\u003e\u003cli\u003e第2步:判断接收结束条件,这个可以根据自己想要接收何种类型的数据而定。本次使用 \u003ccode\u003e回车\u003c/code\u003e 作为判断条件\u003c/li\u003e\u003cli\u003e第3步:数据处理,可以在这一步执行自己想要对数据做的一些操作。本次为将接收到的数据重新发送出去。\u003c/li\u003e\u003c/ul\u003e\u003c/blockquote\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e// 1. 接收数据\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_UART_Receive\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e pRx_Data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 2. 判断数据结尾\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003epRx_Data \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token char\"\u003e\u0026#39;\\n\u0026#39;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e||\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003epRx_Data \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token char\"\u003e\u0026#39;\\r\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 3. 将接收成功的数据通过串口发出去\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e uRx_Data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e uLength\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xffff\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 4. 初始化指针和数据长度\u003c/span\u003e pRx_Data \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e uRx_Data\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//重新指向数组起始位置 uLength = 0; //长度清零\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 5. 若未结束,指针往下一位移动,长度自增1\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token operator\"\u003e++\u003c/span\u003epRx_Data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token operator\"\u003e++\u003c/span\u003euLength\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e完整中断服务程序\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003eUSART1_IRQHandler\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* USER CODE BEGIN USART1_IRQn 0 */\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 存储数组\u003c/span\u003e \u003cspan class=\"token keyword\"\u003estatic\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e uRx_Data\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1024\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 指向存储数组将要存储数据的位\u003c/span\u003e \u003cspan class=\"token keyword\"\u003estatic\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003e pRx_Data \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e uRx_Data\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 接收数据长度\u003c/span\u003e \u003cspan class=\"token keyword\"\u003estatic\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e uLength \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 接收数据\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_UART_Receive\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e pRx_Data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 判断数据结尾\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003epRx_Data \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token char\"\u003e\u0026#39;\\n\u0026#39;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e||\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003epRx_Data \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token char\"\u003e\u0026#39;\\r\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 将接收成功的数据通过串口发出去\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e uRx_Data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e uLength\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xffff\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 初始化指针和数据长度\u003c/span\u003e pRx_Data \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e uRx_Data\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//重新指向数组起始位置\u003c/span\u003e uLength \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//长度清零\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 若未结束,指针往下一位移动,长度自增1\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token operator\"\u003e++\u003c/span\u003epRx_Data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token operator\"\u003e++\u003c/span\u003euLength\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* USER CODE END USART1_IRQn 0 */\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_UART_IRQHandler\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* USER CODE BEGIN USART1_IRQn 1 */\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* USER CODE END USART1_IRQn 1 */\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"查看效果\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E6%9F%A5%E7%9C%8B%E6%95%88%E6%9E%9C\" class=\"headerlink\" title=\"查看效果\"\u003e\u003c/a\u003e查看效果\u003c/h4\u003e\u003cp\u003e编译下载,使用串口查看\u003c/p\u003e\u003cp\u003e默认是不断发送之前的 \u003ccode\u003eHello World !\u003c/code\u003e ,在受到我们发送的数据后,将其再发送,结束后之前运行不受影响。(中断的好处)\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/uart/6.gif\" alt=\"6\" style=\"zoom:67%;\"/\u003e\u003chr/\u003e\u003cp\u003e发送与接收都完成咯,撒花 ~\u003c/p\u003e\u003cp\u003e)这算是搞明白了当时是如何操纵 \u003ccode\u003eStm32\u003c/code\u003e 使用 \u003ccode\u003eAT\u003c/code\u003e 指令与广和通 \u003ccode\u003eL610\u003c/code\u003e 通信了 ~\u003c/p\u003e\u003cp\u003e\u003cdel\u003e(当时没搞明白,对着例程xjb抄,发送功能糊出来了结果最后没有接收功能……令人感慨。\u003c/del\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/b619/"},{"title":"CubeMX初配置PWM\u0026驱动MG995舵机","time":"2022-05-02T12:32:45Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"CubeMX初配置PWM-amp-驱动MG995舵机\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#CubeMX%E5%88%9D%E9%85%8D%E7%BD%AEPWM-amp-%E9%A9%B1%E5%8A%A8MG995%E8%88%B5%E6%9C%BA\" class=\"headerlink\" title=\"CubeMX初配置PWM\u0026amp;驱动MG995舵机\"\u003e\u003c/a\u003eCubeMX初配置PWM\u0026amp;驱动MG995舵机\u003c/h1\u003e\u003cp\u003e\u003cdel\u003e最近在重学STM32,发现大二上整的像s一样\u003c/del\u003e\u003c/p\u003e\u003ch3 id=\"参考博客\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#%E5%8F%82%E8%80%83%E5%8D%9A%E5%AE%A2\" class=\"headerlink\" title=\"参考博客\"\u003e\u003c/a\u003e参考博客\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e[\u003ca href=\"https://www.emoe.xyz/bonjour-stm32-timer-cookbook/\"\u003eBonjour STM32] No.6-定时器简单理解与使用 - Emoe-Studio\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_42967008/article/details/89267010\"\u003e STM32CubeMX学习笔记1——PWM配置_夏沫不学习的博客-CSDN博客_cubemx配置pwm\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/6151e6d4b207\"\u003eHAL库函数之呼吸灯——PWM波 - 简书 (jianshu.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/he__yuan/article/details/79195435\"\u003e(37条消息) MG995舵机工作原理及基于STM32的驱动源代码_斜杠青年/的博客-CSDN博客_mg995舵机\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch3 id=\"PWM\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#PWM\" class=\"headerlink\" title=\"PWM\"\u003e\u003c/a\u003ePWM\u003c/h3\u003e\u003cp\u003e个人理解:PWM就是方波,具体使用的时候改变这玩意的占空比就行。 \u003cspan class=\"diana_biu\"\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://s2.ax1x.com/2019/09/12/nBut8s.gif\"/\u003e\u003c/p\u003e\u003ch3 id=\"配置PWM\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#%E9%85%8D%E7%BD%AEPWM\" class=\"headerlink\" title=\"配置PWM\"\u003e\u003c/a\u003e配置PWM\u003c/h3\u003e\u003cp\u003e要知道 \u003ccode\u003eCNT\u003c/code\u003e (计数器当前值), \u003ccode\u003eARR\u003c/code\u003e (自动重装载值), \u003ccode\u003eCCRx\u003c/code\u003e (捕获/比较寄存器值)\u003c/p\u003e\u003cp\u003e当 \u003ccode\u003eCNT\u003c/code\u003e 小于 \u003ccode\u003eCCRx\u003c/code\u003e 时,通道输出高电平;\u003c/p\u003e\u003cp\u003e当 \u003ccode\u003eCNT\u003c/code\u003e 等于或大于 \u003ccode\u003eCCRx\u003c/code\u003e 时,通道输出低电平;\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://s1.ax1x.com/2020/06/13/tjSq39.jpg\"/\u003e\u003c/p\u003e\u003cp\u003e因为目前使用 \u003ccode\u003eSTM32F103C8T6\u003c/code\u003e ,首先设置使用外部时钟,再设置时钟为72Mhz\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/mg995/0.webp\" alt=\"3\"/\u003e\u003c/p\u003e\u003cp\u003e直接输入 72 就行,CubeMX 会自动配置\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/mg995/4.webp\" alt=\"4\"/\u003e\u003c/p\u003e\u003cp\u003e然后贴一段参考博客里的: \u003cspan class=\"diana_bixin\"\u003e\u003c/span\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e确定时钟源频率后,我们就可以设置\u003cstrong\u003ePSC\u003c/strong\u003e和\u003cstrong\u003eARR\u003c/strong\u003e了。按照之前的要求,我们想让定时器的溢出频率为5Hz,则240MHz/5Hz=48M分频。我们知道,一个模值(“容量”)为48M的定时器即可完成此分频,可是我们的\u003cstrong\u003eCNT\u003c/strong\u003e寄存器只有16位,也就是说模值最大设置为65535,远远不够呀。这就是预分频器\u003cstrong\u003ePSC\u003c/strong\u003e存在的意义了,“时钟源太快了,\u003cstrong\u003eCNT\u003c/strong\u003e没有足够的容量来实现较长周期的定时,所以需要预分频器把时钟降慢一些”。所以说,我们把48M拆成2400*20000就可以了。注意实际填入\u003cstrong\u003ePSC\u003c/strong\u003e和\u003cstrong\u003eARR\u003c/strong\u003e都有一个“-1”,这是因为定时器是从0开始计数的,由0计到239正好是240次。总结一个定时器频率公式,就是这样:\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e$$f_{TIM}=\\frac{f_{CLK}}{(PSC+1)\\times(ARR+1)}$$\u003c/p\u003e\u003cp\u003e改变占空比只需要改变对应计时器的 CCRx 就行\u003c/p\u003e\u003cp\u003e$$Duty_x=\\frac{CCRx}{ARR}$$\u003c/p\u003e\u003cp\u003e因为 MG995 电机需要一个20ms的时基脉冲,所以需要频率50Hz,为我们设置 \u003ccode\u003ePSC=7200-1\u003c/code\u003e \u003ccode\u003eARR=200-1\u003c/code\u003e\u003c/p\u003e\u003cp\u003e\u003ccode\u003e72000000/7200/200=50\u003c/code\u003e\u003c/p\u003e\u003cp\u003e所以计数器每次 \u003ccode\u003e+1\u003c/code\u003e 的时间为 \u003ccode\u003e20ms/ARR=20ms/200=0.1ms\u003c/code\u003e\u003c/p\u003e\u003cp\u003e在CubeMX配置如下\u003c/p\u003e\u003cp\u003e设置 TIM3 定时器 ,只用一个通道就行,设置为 PWM模式,默认是 GPIOA16 管脚\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/mg995/5.webp\" alt=\"5\" style=\"zoom:80%;\"/\u003e\u003ch3 id=\"先点个灯\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#%E5%85%88%E7%82%B9%E4%B8%AA%E7%81%AF\" class=\"headerlink\" title=\"先点个灯\"\u003e\u003c/a\u003e先点个灯\u003c/h3\u003e\u003cp\u003e\u003cdel\u003e历时108个秒,我做出了苹果手机没有的功能,呼吸灯\u003c/del\u003e \u003cspan class=\"diana_yiyanzhen\"\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e呼吸灯的呼吸,就是灯的强弱状态,改变 PWM 的占空比便可调整\u003c/p\u003e\u003cp\u003e具体配置和前面差不多,这里设置为 \u003ccode\u003eARR=500\u003c/code\u003e\u003c/p\u003e\u003cp\u003e 改变 CRRx 的两种方式\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e//ld1_duty 为我们设置的CCRx具体数值\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//方法一,直接操作\u003c/span\u003eTIM3 \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e CCR1 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e ld1_duty\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//方法二,使用库函数\u003c/span\u003e\u003cspan class=\"token function\"\u003e__HAL_TIM_SetCompare\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehtim3\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003eTIM_CHANNEL_1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003eld1_duty\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"主要代码为\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#%E4%B8%BB%E8%A6%81%E4%BB%A3%E7%A0%81%E4%B8%BA\" class=\"headerlink\" title=\"主要代码为\"\u003e\u003c/a\u003e主要代码为\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e \u003cspan class=\"token function\"\u003emain\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 省略一堆初始化函数\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 记录变强还是变弱\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e ld1_dir \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 相当于CNT\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e ld1_duty \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 初始化,启动 TIM3 通道1的 PWM 模式 \u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_TIM_PWM_Start\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehtim3\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003eTIM_CHANNEL_1\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//PA6\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 变强状态\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eld1_dir \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e ld1_duty \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e \u003cspan class=\"token number\"\u003e20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 变弱状态\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eld1_dir \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e ld1_duty \u003cspan class=\"token operator\"\u003e-=\u003c/span\u003e \u003cspan class=\"token number\"\u003e20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 由强变弱\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eld1_duty \u003cspan class=\"token operator\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e500\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e ld1_dir \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 由弱变强\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eld1_duty \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e ld1_dir \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 使用库函数改变 TIM3 通道1 PWM 的占空比\u003c/span\u003e \u003cspan class=\"token function\"\u003e__HAL_TIM_SetCompare\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehtim3\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003eTIM_CHANNEL_1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003eld1_duty\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//延时\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_Delay\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e50\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"大概效果\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#%E5%A4%A7%E6%A6%82%E6%95%88%E6%9E%9C\" class=\"headerlink\" title=\"大概效果\"\u003e\u003c/a\u003e大概效果\u003c/h4\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/mg995/1.gif\" alt=\"1\"/\u003e\u003c/p\u003e\u003ch3 id=\"驱动MG995舵机\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#%E9%A9%B1%E5%8A%A8MG995%E8%88%B5%E6%9C%BA\" class=\"headerlink\" title=\"驱动MG995舵机\"\u003e\u003c/a\u003e驱动MG995舵机\u003c/h3\u003e\u003cp\u003e这玩意具体参数可以去参考的博客去看\u003c/p\u003e\u003ch4 id=\"控制原理\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#%E6%8E%A7%E5%88%B6%E5%8E%9F%E7%90%86\" class=\"headerlink\" title=\"控制原理\"\u003e\u003c/a\u003e控制原理\u003c/h4\u003e\u003cp\u003e舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例,那么对应的控制关系是这样的:\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e0.5ms————–0度;\u003cbr/\u003e1.0ms————45度;\u003cbr/\u003e1.5ms————90度;\u003cbr/\u003e2.0ms———–135度;\u003cbr/\u003e2.5ms———–180度;\u003c/p\u003e\u003c/blockquote\u003e\u003cimg src=\"https://img-blog.csdn.net/20180129143043496?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVfX3l1YW4=\" style=\"zoom:67%;\"/\u003e\u003cp\u003e既然前面已经配置好时钟了,可以直接写代码了\u003c/p\u003e\u003cp\u003e调上面的角度转换成对应高电平部分\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e// 对应角度 0 45 90 135 180\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e deg\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e启动 TIM3 通道1的 PWM 模式\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token function\"\u003eHAL_TIM_PWM_Start\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehtim3\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003eTIM_CHANNEL_1\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//PA6\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e所以主函数为\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e \u003cspan class=\"token function\"\u003emain\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 省了略各种初始化函数\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e deg\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 初始化,启动 TIM3 通道1的 PWM 模式\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_TIM_PWM_Start\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehtim3\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003eTIM_CHANNEL_1\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//PA6\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 先正转,再反转\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e i \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e i \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e++\u003c/span\u003ei\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 更新CCR1值,直接用寄存器操作\u003c/span\u003e TIM3 \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e CCR1 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e deg\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ei\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 延时,等舵机转过去\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_Delay\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e i \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e i \u003cspan class=\"token operator\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e--\u003c/span\u003ei\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e TIM3 \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e CCR1 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e deg\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ei\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_Delay\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"转动效果\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#%E8%BD%AC%E5%8A%A8%E6%95%88%E6%9E%9C\" class=\"headerlink\" title=\"转动效果\"\u003e\u003c/a\u003e转动效果\u003c/h4\u003e\u003cp\u003e对了如果发现不转记得检查一下供电,最好插上电源线再测试。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/mg995/2.gif\" alt=\"2\"/\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/cac5/"},{"title":"D2550刷64位BIOS记录","time":"2022-05-01T17:20:28Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"D2550-刷64位BIOS记录\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/1eaf/#D2550-%E5%88%B764%E4%BD%8DBIOS%E8%AE%B0%E5%BD%95\" class=\"headerlink\" title=\"D2550 刷64位BIOS记录\"\u003e\u003c/a\u003eD2550 刷64位BIOS记录\u003c/h1\u003e\u003cp\u003e早知道,还是软路由 \u003cspan class=\"ava_datou\"\u003e\u003c/span\u003e\u003c/p\u003e\u003ch3 id=\"参考链接\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/1eaf/#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\" class=\"headerlink\" title=\"参考链接\"\u003e\u003c/a\u003e参考链接\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://www.bilibili.com/video/BV1x441147zn?spm_id_from=333.880.my_history.page.click\"\u003e芯片级硬解64位系统限制!免费帮助网友解除d2550主板64位系统限制!刷bios轻松解决_哔哩哔哩_bilibili\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://yiniot.com/archives/48/\"\u003e编程夹刷写魔改BIOS ZTE CT320(D2550 cpu)支持64位系统 - 算云烟 (yiniot.com)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch3 id=\"0x00\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/1eaf/#0x00\" class=\"headerlink\" title=\"0x00\"\u003e\u003c/a\u003e0x00\u003c/h3\u003e\u003cp\u003e目前的网络使用 k2p + N1 使用,比较碰巧这几天有个学弟在出 x86 软路由,就顺手收了过来\u003c/p\u003e\u003cp\u003eU 是 D2550 ,内存 ddr3 2G ,刚好垃圾之前捡的比较多(因为我刚进校的本子是 ddr3 内存),挑了一根4g 的顺便升级一下,至于硬盘多大,已经不重要了…… \u003cdel\u003e(因为后面我线接错给烧了)\u003c/del\u003e\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/d2550/2.webp\" alt=\"2\" style=\"zoom: 33%;\"/\u003e\u003ch3 id=\"0x01\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/1eaf/#0x01\" class=\"headerlink\" title=\"0x01\"\u003e\u003c/a\u003e0x01\u003c/h3\u003e\u003cp\u003e拿到手头试了试,速度还不错\u003cspan class=\"diana_bixin\"\u003e\u003c/span\u003e\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/d2550/6.png\" alt=\"6\" style=\"zoom: 67%;\"/\u003e\u003cp\u003e然后想顺便在 docker 里装一个 clash 顺便把我 N1 的活也代替了,但是安装的时候提示不支持……查了一下发现因为这玩意是32 位 BIOS ,但是我不晓得我这是个啥板子……看了点相关博客,决定赌一个 \u003ccode\u003e占美、实达D2550-64BIOS\u003c/code\u003e ,借了个编程器,开始我第一次刷这玩意\u003c/p\u003e\u003ch3 id=\"0x02\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/1eaf/#0x02\" class=\"headerlink\" title=\"0x02\"\u003e\u003c/a\u003e0x02\u003c/h3\u003e\u003cp\u003e先把主板拆出来,发现他的 BIOS 芯片在散热旁边,用夹子夹好一直识别不成功……于是决定拆下来,但是散热器挡着得先拆散热,就想着顺便把硅脂也换了。属于是歪打正着,这玩意硅脂已经硬的离谱了,我清理了半天才下来……\u003c/p\u003e\u003cp\u003e拆下来就这小玩意\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/d2550/3.jpg\" alt=\"3\" style=\"zoom:50%;\"/\u003e\u003cp\u003e整之前电脑上先把该装的 \u003cstrong\u003e驱动\u003c/strong\u003e 装了。\u003c/p\u003e\u003cp\u003e夹到夹子用 CH341A 识别挺快,先把原来的 BIOS 读取出来备份,然后按教程里的选 BIOS 刷入,但是我这一直报错\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/d2550/4.jpg\" alt=\"4\" style=\"zoom: 80%;\"/\u003e\u003cp\u003e试了好多次还是寄,我以为是夹子的锅,又把这玩意焊到了编程器了,但还是寄。\u003cspan class=\"diana_bengbuzhule\"\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e经过一番搜索,找到了大概原因是因为有的这玩意有保护,换用 \u003cstrong\u003e\u003ccode\u003eAsProgrammer\u003c/code\u003e\u003c/strong\u003e 刷入,非常顺利\u003c/p\u003e\u003cp\u003e最后开机查看BIOS,屏幕轻松点亮\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/d2550/5.webp\" alt=\"5\" style=\"zoom: 33%;\"/\u003e\u003ch3 id=\"一点小状况\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/1eaf/#%E4%B8%80%E7%82%B9%E5%B0%8F%E7%8A%B6%E5%86%B5\" class=\"headerlink\" title=\"一点小状况\"\u003e\u003c/a\u003e一点小状况\u003c/h3\u003e\u003cp\u003e)为什么莫得硬盘呢……纠结了半天最后发现是把电源线接错地方了\u003c/p\u003e\u003cp\u003e然后赶紧换了过来,好家伙一插上就关机……\u003c/p\u003e\u003cp\u003e烧咯……\u003cspan class=\"diana_qiaoda\"\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cdel\u003e画了60买了新盘,血亏\u003c/del\u003e\u003c/p\u003e\u003chr/\u003e\u003cp\u003e寄,买来硬盘要注意电源线的线序啊,差点又给我烧了。但是线坏了,又得花钱买线了……\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/1eaf/"},{"title":"2021_Summary","time":"2021-12-31T06:53:41Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"2021-年终总结\"\u003e\u003ca href=\"https://blog.ksfu.top/2021-Summary/#2021-%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93\" class=\"headerlink\" title=\"2021 年终总结\"\u003e\u003c/a\u003e2021 年终总结\u003c/h1\u003e\u003cp\u003e妈耶,一年这就结束了 ~ \u003c/p\u003e\u003cp\u003e今年过的算是不错,因为比较躺平所以也很容易满足~ \u003cdel\u003e(躺到写年终总结一时间不知道要写啥\u003c/del\u003e\u003c/p\u003e\u003cp\u003e学业方面差强人意?大一结束成绩没有很拉跨,得以在分流于后几名勉强进入通信工程专业。但是作为大类招生第一年的实验品,分流后这一学期学校课程安排的可以说非常拉跨,各种实验各种冲突各种大作业\u003cdel\u003ewdnmd\u003c/del\u003e。但好在还有一点自强不息的意识,身体挺好能熬夜,终于到了这学期结束。不过课程虽然拉跨但还是有合自己胃口的,单片机点亮个灯还是有意思的……不过大多数课真的是能混就混,然后天天早八对我这阴间作息的人来说属实离谱\u003cdel\u003e(怎么会是呢\u003c/del\u003e……\u003c/p\u003e\u003cp\u003e虽然没有太管得住嘴\u003cdel\u003e(还有缺德群友半夜发美食(我自己也发啊那没事了\u003c/del\u003e,但是腿倒是迈开了,每个月书院有一个5km马拉松的小活动,都参加了~虽然跑的挺慢\u003cdel\u003e(基本垫底)\u003c/del\u003e 但能跑下来还整挺好。体测虽然1km还差了几秒,但是过了 ~ 3km的成绩也在及格线里面了。体重只能说挺稳定……(不过这几天因为疫情只能待在宿舍,所以\u003cdel\u003e(xjb找理由就对了\u003c/del\u003e…… 身体健康!\u003cdel\u003e(20岁,四肢健全,大小便正常,下雨知道往家跑,一天可吃三顿饭,健康码绿色,未来可期!)\u003c/del\u003e\u003c/p\u003e\u003cdiv align=\"center\"\u003e \u003cimg src=\"https://blog.ksfu.top/img/posts/2021Summary/1.png\" alt=\"1\" style=\"zoom:70%;\"/\u003e\u003c/div\u003e\u003chr/\u003e\u003cp\u003e今年又认识了很多人\u003cdel\u003e(水群越来越勤快了)\u003c/del\u003e,又是被大伙继续关照的一年~也是兴趣爱好和技能继续扩展的一年。因为有大佬带飞,学到了挺多没接触过的东西。现在虽然没有学的很深入,但对于自己的一些想法总能曲曲折折找到一些实现的法子\u003cdel\u003e(让我也体验了一把收获的喜悦)\u003c/del\u003e。在交通群了解到了很多火车知识,顺便看时刻表发现平凉站一天十几趟车只有一趟不是25G……为了运转双层火车,将返校的车票分为两程,结果因为暴雨影响,第一趟车原路折返,改签之后遇到火车改道,在车上困了1天\u003cdel\u003e(一个难忘的国庆假期)\u003c/del\u003e。校庆纪念信封的发行,让我对集邮又有了更多的认识,顺便寄了不少纪念封给同学\u003cdel\u003e(邮政现在挺快哦\u003c/del\u003e。\u003c/p\u003e\u003cp\u003e暑假上海之行,因为疫情影响,火车接二连三被取消……不过到达之后属实大开眼界,各种高架,地铁站十几个出口balabalabala……不过因为建设的比较早,大多数地铁还是挺旧,有的还没报站\u003cdel\u003e(或者是我没发现?\u003c/del\u003e,跑起来挺颠簸。参观了几个公司\u003cdel\u003e(微软园区真不错)\u003c/del\u003e,逛了南京路,看了东方明珠塔,黄浦江漫步,晚上组团上网吧\u003cdel\u003e(交大周围环境真好)\u003c/del\u003e……吃的挺好,就是贵是真贵。然后因为疫情也没有活动很大范围。地方确实挺好,魔都哦~不过回去之后给我健康码变黄了……还好核酸之后打电话给我变回来了。\u003c/p\u003e\u003cdiv align=\"center\"\u003e \u003cimg src=\"https://blog.ksfu.top/img/posts/2021Summary/2.jpeg\" alt=\"1641069033334\" style=\"zoom: 50%;text-align: center;margin: 0 auto;\"/\u003e\u003c/div\u003e\u003chr/\u003e\u003cp\u003e大伙都一个一个脱单了,真不错 ~ 然后今年寡了一年\u003cdel\u003e(女生也没认识几个emm\u003c/del\u003e,人也是一如既往的怂\u003cdel\u003e(?\u003c/del\u003e。水群水的的飞起,底下尬聊还是尬聊。祝大伙脱单的长长久久 ~ \u003cdel\u003e没脱单的看看我(男桐不要)\u003c/del\u003e\u003c/p\u003e\u003cp\u003e一年就这么没心没肺下来了 ~ 今年感谢大伙!然后新年继续努力,多水几篇博客,好好学习\u003cdel\u003e吧?\u003c/del\u003e脚踏实地,继续深入学习学习技能。坚持跑步\u003cdel\u003e(减肥\u003c/del\u003e。多找几本书看看,今年好像没看多少书emm\u003cdel\u003e(写个年终中总结都憋不出来几句骚话)\u003c/del\u003e。多看几部电影,多看几部纪录片,多看几场演唱会 ~ 继续维持和大伙的关系,多多联系 ~ 女朋友尽量尽量尽量找\u003cdel\u003e(万一呢)\u003c/del\u003e。少整点阴间作息。情绪少波动一点,虽然说不要想太多,但还是喜欢乱想\u003cdel\u003e(果然还是闲的\u003c/del\u003e。虽说难免走入低谷,还是希望新年能够平稳一些 ~ \u003c/p\u003e\u003cp\u003e\u003cem\u003e♫后知后觉,又过了一个秋~\u003c/em\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e祝大伙新年快乐,踔厉奋发,笃行不怠!愿疫情早日过去!祝福国泰民安!\u003c/strong\u003e\u003c/p\u003e\u003cdiv align=\"center\"\u003e \u003cimg src=\"https://i.loli.net/2021/04/18/OQWE5NkgnGXdD2C.jpg\" style=\"zoom: 83%;text-align: center;margin: 0 auto;\"/\u003e\u003c/div\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/2021-Summary/"},{"title":"Deepin新增分辨率","time":"2021-10-09T14:04:03Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"Deepin-新增屏幕分辨率\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b368/#Deepin-%E6%96%B0%E5%A2%9E%E5%B1%8F%E5%B9%95%E5%88%86%E8%BE%A8%E7%8E%87\" class=\"headerlink\" title=\"Deepin 新增屏幕分辨率\"\u003e\u003c/a\u003eDeepin 新增屏幕分辨率\u003c/h1\u003e\u003cp\u003e因为最近同学送了半台 ThinkPad ,于是拿来装了 Deepin ,但是发现并没有适合自己屏幕的分辨率。\u003c/p\u003e\u003cp\u003e自己动手搜索解决,记录一下过程。\u003c/p\u003e\u003ch3 id=\"添加分辨率\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b368/#%E6%B7%BB%E5%8A%A0%E5%88%86%E8%BE%A8%E7%8E%87\" class=\"headerlink\" title=\"添加分辨率\"\u003e\u003c/a\u003e添加分辨率\u003c/h3\u003e\u003cp\u003e先查看推荐的配置,加入 \u003ccode\u003e-r\u003c/code\u003e 可以尽可能的减少黑边\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003exrandr \u003cspan class=\"token parameter variable\"\u003e-r\u003c/span\u003e \u003cspan class=\"token number\"\u003e1920\u003c/span\u003e \u003cspan class=\"token number\"\u003e1080\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e我的显示\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token comment\"\u003e# 1920x1080 59.93 Hz (CVT 2.07M9-R) hsync: 66.59 kHz; pclk: 138.50 MHz\u003c/span\u003eModeline \u003cspan class=\"token string\"\u003e\u0026#34;1920x1080R\u0026#34;\u003c/span\u003e \u003cspan class=\"token number\"\u003e138.50\u003c/span\u003e \u003cspan class=\"token number\"\u003e1920\u003c/span\u003e \u003cspan class=\"token number\"\u003e1968\u003c/span\u003e \u003cspan class=\"token number\"\u003e2000\u003c/span\u003e \u003cspan class=\"token number\"\u003e2080\u003c/span\u003e \u003cspan class=\"token number\"\u003e1080\u003c/span\u003e \u003cspan class=\"token number\"\u003e1083\u003c/span\u003e \u003cspan class=\"token number\"\u003e1088\u003c/span\u003e \u003cspan class=\"token number\"\u003e1111\u003c/span\u003e +hsync \u003cspan class=\"token parameter variable\"\u003e-vsync\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e查看输出的名字\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003exrandr \u003cspan class=\"token parameter variable\"\u003e-q\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e查出来我输出的名字叫 \u003ccode\u003eVGA-1\u003c/code\u003e\u003c/p\u003e\u003cp\u003e接下来执行(后面改成自己的)\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003exrandr \u003cspan class=\"token parameter variable\"\u003e--newmode\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;1920x1080R\u0026#34;\u003c/span\u003e \u003cspan class=\"token number\"\u003e138.50\u003c/span\u003e \u003cspan class=\"token number\"\u003e1920\u003c/span\u003e \u003cspan class=\"token number\"\u003e1968\u003c/span\u003e \u003cspan class=\"token number\"\u003e2000\u003c/span\u003e \u003cspan class=\"token number\"\u003e2080\u003c/span\u003e \u003cspan class=\"token number\"\u003e1080\u003c/span\u003e \u003cspan class=\"token number\"\u003e1083\u003c/span\u003e \u003cspan class=\"token number\"\u003e1088\u003c/span\u003e \u003cspan class=\"token number\"\u003e1111\u003c/span\u003e +hsync \u003cspan class=\"token parameter variable\"\u003e-vsync\u003c/span\u003exrandr \u003cspan class=\"token parameter variable\"\u003e--addmode\u003c/span\u003e VGA-1 1920x1080R\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"保存分辨率\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b368/#%E4%BF%9D%E5%AD%98%E5%88%86%E8%BE%A8%E7%8E%87\" class=\"headerlink\" title=\"保存分辨率\"\u003e\u003c/a\u003e保存分辨率\u003c/h3\u003e\u003cp\u003e这样修改之后重启就又没有了,所以保存配置\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token function\"\u003esudo\u003c/span\u003e \u003cspan class=\"token function\"\u003evi\u003c/span\u003e /etc/profile\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e在文件 \u003cstrong\u003e末尾\u003c/strong\u003e 加上\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003exrandr \u003cspan class=\"token parameter variable\"\u003e--newmode\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;1920x1080R\u0026#34;\u003c/span\u003e \u003cspan class=\"token number\"\u003e138.50\u003c/span\u003e \u003cspan class=\"token number\"\u003e1920\u003c/span\u003e \u003cspan class=\"token number\"\u003e1968\u003c/span\u003e \u003cspan class=\"token number\"\u003e2000\u003c/span\u003e \u003cspan class=\"token number\"\u003e2080\u003c/span\u003e \u003cspan class=\"token number\"\u003e1080\u003c/span\u003e \u003cspan class=\"token number\"\u003e1083\u003c/span\u003e \u003cspan class=\"token number\"\u003e1088\u003c/span\u003e \u003cspan class=\"token number\"\u003e1111\u003c/span\u003e +hsync \u003cspan class=\"token parameter variable\"\u003e-vsync\u003c/span\u003exrandr \u003cspan class=\"token parameter variable\"\u003e--addmode\u003c/span\u003e VGA-1 1920x1080R\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e\u003cstrong\u003e保存退出\u003c/strong\u003e\u003c/p\u003e\u003ch3 id=\"来点成品\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b368/#%E6%9D%A5%E7%82%B9%E6%88%90%E5%93%81\" class=\"headerlink\" title=\"来点成品\"\u003e\u003c/a\u003e来点成品\u003c/h3\u003e\u003cimg src=\"https://i.loli.net/2021/10/09/sCnVyacZrL2oKxl.jpg\" alt=\"psc.jpg\" style=\"zoom:67%;\"/\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/b368/"},{"title":"MoeCTF 2021 WriteUp","time":"2021-09-21T12:15:45Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"MoeCTF-2021-WriteUp\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#MoeCTF-2021-WriteUp\" class=\"headerlink\" title=\"MoeCTF 2021 WriteUp\"\u003e\u003c/a\u003eMoeCTF 2021 WriteUp\u003c/h1\u003e\u003cp\u003e\u003cdel\u003e没想到摸鱼摸到第9了(感谢Hidden了的师傅们(逃\u003c/del\u003e\u003c/p\u003e\u003cp\u003e挺菜的边做边学。\u003c/p\u003e\u003cp\u003e这次主要做了做 \u003ccode\u003eMisc\u003c/code\u003e 和 \u003ccode\u003eWeb\u003c/code\u003e ,其他的就看了看前面几个开了开视野(\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e题目全部在 \u003ccode\u003eWindows 7\u003c/code\u003e 环境下做出\u003c/strong\u003e\u003c/p\u003e\u003ch2 id=\"目录\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#%E7%9B%AE%E5%BD%95\" class=\"headerlink\" title=\"目录\"\u003e\u003c/a\u003e目录\u003c/h2\u003e\u003ch3 id=\"Crypto(4-x2F-14)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Crypto%EF%BC%884-x2F-14%EF%BC%89\" class=\"headerlink\" title=\"Crypto(4/14)\"\u003e\u003c/a\u003eCrypto(4/14)\u003c/h3\u003e\u003col\u003e\u003cli\u003eCryptography入门指北(略)\u003c/li\u003e\u003cli\u003ebeginOfCrypto\u003c/li\u003e\u003cli\u003eBabyMultiple\u003c/li\u003e\u003cli\u003eLazyRSA\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"Reverse(2-x2F-14)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Reverse%EF%BC%882-x2F-14%EF%BC%89\" class=\"headerlink\" title=\"Reverse(2/14)\"\u003e\u003c/a\u003eReverse(2/14)\u003c/h3\u003e\u003col\u003e\u003cli\u003e逆向工程入门指北(略)\u003c/li\u003e\u003cli\u003ewelcome_to_the_world_of_re\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"Classical-Cryptography(1-x2F-6)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Classical-Cryptography%EF%BC%881-x2F-6%EF%BC%89\" class=\"headerlink\" title=\"Classical Cryptography(1/6)\"\u003e\u003c/a\u003eClassical Cryptography(1/6)\u003c/h3\u003e\u003col\u003e\u003cli\u003eAugustine’s Way\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"Bonus-0-x2F-1\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Bonus-0-x2F-1\" class=\"headerlink\" title=\"Bonus(0/1)\"\u003e\u003c/a\u003eBonus(0/1)\u003c/h3\u003e\u003ch3 id=\"MISC-12-x2F-12)之前是13个来着\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#MISC-12-x2F-12%EF%BC%89%E4%B9%8B%E5%89%8D%E6%98%AF13%E4%B8%AA%E6%9D%A5%E7%9D%80\" class=\"headerlink\" title=\"MISC(12/12)之前是13个来着\"\u003e\u003c/a\u003eMISC(12/12)\u003cdel\u003e之前是13个来着\u003c/del\u003e\u003c/h3\u003e\u003col\u003e\u003cli\u003eMisc入门指北(略)\u003c/li\u003e\u003cli\u003efind_me\u003c/li\u003e\u003cli\u003eMacross\u003c/li\u003e\u003cli\u003eHomework\u003c/li\u003e\u003cli\u003eflipflipflip\u003c/li\u003e\u003cli\u003eWhite Album\u003c/li\u003e\u003cli\u003ePhone Call\u003c/li\u003e\u003cli\u003e社工题\u003c/li\u003e\u003cli\u003e好 康 的\u003c/li\u003e\u003cli\u003eeasyForensics\u003c/li\u003e\u003cli\u003eR P G\u003c/li\u003e\u003cli\u003e诺亚的日记\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"Pwn(3-x2F-11)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Pwn%EF%BC%883-x2F-11%EF%BC%89\" class=\"headerlink\" title=\"Pwn(3/11)\"\u003e\u003c/a\u003ePwn(3/11)\u003c/h3\u003e\u003col\u003e\u003cli\u003ePwn入门指北(略)\u003c/li\u003e\u003cli\u003etest_your_nc\u003c/li\u003e\u003cli\u003eInt_overflow\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"Web(9-x2F-14)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Web%EF%BC%889-x2F-14%EF%BC%89\" class=\"headerlink\" title=\"Web(9/14)\"\u003e\u003c/a\u003eWeb(9/14)\u003c/h3\u003e\u003col\u003e\u003cli\u003eWeb入门指北(略)\u003c/li\u003e\u003cli\u003eWeb安全入门指北—GET\u003c/li\u003e\u003cli\u003eWeb安全入门指北—小饼干\u003c/li\u003e\u003cli\u003e2048\u003c/li\u003e\u003cli\u003eWeb_Inc\u003c/li\u003e\u003cli\u003eezinclude\u003c/li\u003e\u003cli\u003ebabeRCE\u003c/li\u003e\u003cli\u003eDo you know HTTP?\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"问卷题-1-x2F-2\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#%E9%97%AE%E5%8D%B7%E9%A2%98-1-x2F-2\" class=\"headerlink\" title=\"问卷题(1/2)\"\u003e\u003c/a\u003e问卷题(1/2)\u003c/h3\u003e\u003col\u003e\u003cli\u003e信息统计(略)\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Crypto\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Crypto\" class=\"headerlink\" title=\"Crypto\"\u003e\u003c/a\u003eCrypto\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003ePython 真是绝绝子!\u003c/p\u003e\u003c/blockquote\u003e\u003ch3 id=\"02-beginOfCrypto\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#02-beginOfCrypto\" class=\"headerlink\" title=\"02 beginOfCrypto\"\u003e\u003c/a\u003e02 beginOfCrypto\u003c/h3\u003e\u003cp\u003e打开下载的文件发现下面有申必的数字,然后再看上面有 \u003ccode\u003eflag = xxx\u003c/code\u003e , 再看一眼代码,应该是把字符通过申必的方法转换成申必的数字,然后先赋值 \u003ccode\u003eflag = \u0026#34;moectf\u0026#34;\u003c/code\u003e 发现和前面几个数字对上了,然后用只能人工方法将26个字母和几个符号带进去都看了一遍值,找到了flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{c0me_on!begin_your_Crypt0_c4r33r}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"03-BabyMultiple\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#03-BabyMultiple\" class=\"headerlink\" title=\"03 BabyMultiple\"\u003e\u003c/a\u003e03 BabyMultiple\u003c/h3\u003e\u003cp\u003e和上一题一样,带进去不同字符经过处理变成其他申必字符,然后利用智能人工全部带了一遍,得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{y0u_4r3_gr34t_47_Mu17ic4ti0n}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e### 04 LazyRSA\u003cp\u003e去网上大概查了一下原理,然后对着教程里的代码改了一下\u003c/p\u003e\u003cp\u003e读的博客\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/hiwuchong/p/9069392.html\"\u003ehttps://www.cnblogs.com/hiwuchong/p/9069392.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/carroll_/article/details/79975226\"\u003ehttps://blog.csdn.net/carroll_/article/details/79975226\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/Ahuuua/article/details/108830834\"\u003ehttps://blog.csdn.net/Ahuuua/article/details/108830834\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/weixin_41818069/article/details/106532665\"\u003ehttps://blog.csdn.net/weixin_41818069/article/details/106532665\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/Higgerw/p/14289041.html\"\u003ehttps://www.cnblogs.com/Higgerw/p/14289041.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html\"\u003ehttp://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_41429081/article/details/103403957\"\u003ehttps://blog.csdn.net/qq_41429081/article/details/103403957\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/tinyzhao/article/details/52681634\"\u003ehttps://blog.csdn.net/tinyzhao/article/details/52681634\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-python\" data-language=\"python\"\u003e\u003ccode class=\"language-python\"\u003e\u003cspan class=\"token keyword\"\u003efrom\u003c/span\u003e Crypto\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eUtil\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003enumber \u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e gmpy2\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e binasciip \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e题目里的p\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003eq \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e题目里的q\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003ec \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e题目里的c\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e n \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e p\u003cspan class=\"token operator\"\u003e*\u003c/span\u003eqe \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x10001\u003c/span\u003ed \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e gmpy2\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003einvert\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ee\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ep\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eq\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003em \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token builtin\"\u003epow\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ec\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003ed\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003en\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e# c = pow(m,e,n)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003ehex\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003em\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebinascii\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eunhexlify\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003ehex\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003em\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003estrip\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;L\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{w0w_yOU_Know_h0w_70_d3crypt_th3_RSA}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch2 id=\"Reverse\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Reverse\" class=\"headerlink\" title=\"Reverse\"\u003e\u003c/a\u003eReverse\u003c/h2\u003e\u003ch3 id=\"02-welcome-to-the-world-of-re\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#02-welcome-to-the-world-of-re\" class=\"headerlink\" title=\"02 welcome_to_the_world_of_re\"\u003e\u003c/a\u003e02 welcome_to_the_world_of_re\u003c/h3\u003e\u003cp\u003e\u003cdel\u003e之前找简单软件注册码的法子\u003c/del\u003e\u003c/p\u003e\u003cp\u003e直接拖进 \u003ccode\u003eOD\u003c/code\u003e 能找到,拖进文本也行(\u003c/p\u003e\u003cimg src=\"https://i.loli.net/2021/09/21/RwJMH68qB2hKjIE.png\" alt=\"re1.PNG\" style=\"zoom:80%;\"/\u003e\u003cimg src=\"https://i.loli.net/2021/09/21/ZL6sevtD1lGIrzk.png\" alt=\"re2\" style=\"zoom:80%;\"/\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{W31C0Me_t0_m03CTF_2021_w0o0o0oooo0ooooo0o0oooo0!!!}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch2 id=\"Classical-Cryptography\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Classical-Cryptography\" class=\"headerlink\" title=\"Classical Cryptography\"\u003e\u003c/a\u003eClassical Cryptography\u003c/h2\u003e\u003cp\u003e\u003cdel\u003e看的时候离结束还有半天了,就看了第一个\u003c/del\u003e\u003c/p\u003e\u003ch3 id=\"01-Classical-Cryptography\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#01-Classical-Cryptography\" class=\"headerlink\" title=\"01 Classical Cryptography\"\u003e\u003c/a\u003e01 Classical Cryptography\u003c/h3\u003e\u003cp\u003e前几个和 \u003ccode\u003emoectf\u003c/code\u003e 对比了一下发现是每个字母后移了一位\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{e3sy_Au9u1ne!}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch2 id=\"Misc\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Misc\" class=\"headerlink\" title=\"Misc\"\u003e\u003c/a\u003eMisc\u003c/h2\u003e\u003ch3 id=\"02-find-me\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#02-find-me\" class=\"headerlink\" title=\"02 find_me\"\u003e\u003c/a\u003e02 find_me\u003c/h3\u003e\u003cp\u003e拖进 \u003ccode\u003e010 Editor\u003c/code\u003e\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{hs_g1v3_u_fl@g}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"03-Macross\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#03-Macross\" class=\"headerlink\" title=\"03 Macross\"\u003e\u003c/a\u003e03 Macross\u003c/h3\u003e\u003cp\u003e百度搜了半天不晓得这是啥,然后上 Google 搜出来是个记录鼠标移动的软件\u003cdel\u003e(Google真是绝绝子)\u003c/del\u003e,下载安装,然后打开 Windows 图画,运行文件,得到名画\u003c/p\u003e\u003cimg src=\"https://i.loli.net/2021/09/21/BNxQez71C68ObY9.png\" alt=\"Mar\" style=\"zoom:80%;\"/\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{Rec0rder_15_Funny}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"04-Homework\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#04-Homework\" class=\"headerlink\" title=\"04 Homework\"\u003e\u003c/a\u003e04 Homework\u003c/h3\u003e\u003cp\u003e先看了一遍啥也没找到,然后先全选清除格式发现半个flag,然后用 \u003ccode\u003e7-zip\u003c/code\u003e 解压出来直接看 \u003ccode\u003exml\u003c/code\u003e 里东西了,搜 \u003ccode\u003e}\u003c/code\u003e,找到后一半,当然在 Word 里搜 \u003ccode\u003e{\u003c/code\u003e 发现是个文本框,拿到后半段flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{0h_U_f1nd_m3!}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"05-flipflipflip\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#05-flipflipflip\" class=\"headerlink\" title=\"05 flipflipflip\"\u003e\u003c/a\u003e05 flipflipflip\u003c/h3\u003e\u003cp\u003e这个题可太折磨人了……\u003c/p\u003e\u003cp\u003e参考博客\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/1go0/p/9977359.html\"\u003ehttps://www.cnblogs.com/1go0/p/9977359.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/mq0036/p/6544055.html\"\u003ehttps://www.cnblogs.com/mq0036/p/6544055.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/csqazwsxedc/article/details/59186769?fps=1\u0026amp;locationNum=2\"\u003ehttps://blog.csdn.net/csqazwsxedc/article/details/59186769?fps=1\u0026amp;locationNum=2\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.it1352.com/904413.html\"\u003ehttps://www.it1352.com/904413.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnpython.com/qa/153478\"\u003ehttps://www.cnpython.com/qa/153478\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/h-zhang/p/10568028.html\"\u003ehttps://www.cnblogs.com/h-zhang/p/10568028.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/zuferj115/p/11547486.html\"\u003ehttps://www.cnblogs.com/zuferj115/p/11547486.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/u010065754/article/details/81710160\"\u003ehttps://blog.csdn.net/u010065754/article/details/81710160\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/erchun/p/11766408.html\"\u003ehttps://www.cnblogs.com/erchun/p/11766408.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/Blood_Seeker/article/details/81519426?utm_source=blogxgwz3\"\u003ehttps://blog.csdn.net/Blood_Seeker/article/details/81519426?utm_source=blogxgwz3\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/weixin_43742794/article/details/104210963\"\u003ehttps://blog.csdn.net/weixin_43742794/article/details/104210963\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/qsmyjz/p/11987815.html\"\u003ehttps://www.cnblogs.com/qsmyjz/p/11987815.html\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e我超,100多MB的字符串,刚开始没头绪最后xjb猜是base64,那么大文件得整个脚本,然后网上搜\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-python\" data-language=\"python\"\u003e\u003ccode class=\"language-python\"\u003e\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e base64\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e systext \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;C:\\\\Users(后面文件路径省略了)\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eread\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003elen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etext\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e%\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e text \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;==\u0026#34;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003elen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etext\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e%\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e text \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;=\u0026#34;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewith\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;C:\\\\Users\\\\Users(后面文件路径省略了)\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;wb\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eas\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebase64\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eb64decode\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etext\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;success\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e第一遍看着解出来好东西了,然后第二遍解出来不知道一堆啥东西……然后又不会整了。\u003c/p\u003e\u003cp\u003e突然发现第一遍解出来的东西开头是 \u003ccode\u003e==\u003c/code\u003e ,再想想题目名字……base64倒过来了属于是,然后整了个反转的脚本\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-python\" data-language=\"python\"\u003e\u003ccode class=\"language-python\"\u003e\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e base64\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e systext \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;C:\\\\Users\\\\(后面路径省略)\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eread\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewith\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;C:\\\\Users\\\\(后面路径省略)\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;w\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eas\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etext\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;success\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e然后就这么xjb整……遇见解出来不对劲的就反转……然后通过智能人工整了70多次。。。从100多MB整到1KB……得到flag\u003c/p\u003e\u003cimg src=\"https://i.loli.net/2021/09/21/3NzvcCOM6ZYuqRW.png\" alt=\"filp\" style=\"zoom:80%;\"/\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{fffffflipppppp}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"06-White-Album\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#06-White-Album\" class=\"headerlink\" title=\"06 White Album\"\u003e\u003c/a\u003e06 White Album\u003c/h3\u003e\u003cp\u003e看到 \u003ccode\u003e.png\u003c/code\u003e ,就猜要么是LSB要么是图片尺寸问题,试了一下果然是图片尺寸,在\u003ccode\u003e010 Editor\u003c/code\u003e 里改了下尺寸得到一个申必图案\u003c/p\u003e\u003cimg src=\"https://i.loli.net/2021/09/21/ZpC9ox3itfAJLQm.jpg\" alt=\"whilt\" style=\"zoom:80%;\"/\u003e\u003cp\u003e猜了下是条码,就搜了下条码图案,发现是 \u003ccode\u003epdf417\u003c/code\u003e ,想找个在线扫的发现很难找,最后找到个网站可以解这个\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://online-barcode-reader.inliteresearch.com/\"\u003ehttps://online-barcode-reader.inliteresearch.com/\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{WhY_@r3_u_s0_5K1ll3D}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"07-Phone-Call\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#07-Phone-Call\" class=\"headerlink\" title=\"07 Phone Call\"\u003e\u003c/a\u003e07 Phone Call\u003c/h3\u003e\u003cp\u003e参考博客\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"http://dyf.ink/crypto/classical/others/#_24\"\u003ehttp://dyf.ink/crypto/classical/others/#_24\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/cg1510167/article/details/114279633\"\u003ehttps://blog.csdn.net/cg1510167/article/details/114279633\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/weixin_33806914/article/details/91868832\"\u003ehttps://blog.csdn.net/weixin_33806914/article/details/91868832\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e就拖进AE看就行,手动一个一个解的,得到\u003cdel\u003e很臭的\u003c/del\u003eflag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{114514-1919810-7738-9634}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"08-社工题\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#08-%E7%A4%BE%E5%B7%A5%E9%A2%98\" class=\"headerlink\" title=\"08 社工题\"\u003e\u003c/a\u003e08 社工题\u003c/h3\u003e\u003cp\u003e这题可太草了,从假期整到开学……原来有4个博客2个仓库……\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://noahtie.github.io/\"\u003eNoahBox (noahtie.github.io)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://noahbox.github.io/\"\u003ehttps://noahbox.github.io/\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://nuoyazhicheng.lofter.com/\"\u003ehttps://nuoyazhicheng.lofter.com/\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://masternoah.lofter.com/\"\u003ehttps://masternoah.lofter.com/\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e在hexo博客点签订契约进入lofter博客,在lofter博客点一下上面 \u003cstrong\u003ei\u003c/strong\u003e 一样的标志找到另一个hexo博客,在里面留言板里找到了 HackerHS,最后找到第二个仓库根据意思在里面找到commits,发现莫斯电码,复制到在线网站解密,得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{HAHAHAHAH_NOAH_IS_A_VEGETABLE_CHICKEN}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"09-好-康-的\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#09-%E5%A5%BD-%E5%BA%B7-%E7%9A%84\" class=\"headerlink\" title=\"09 好 康 的\"\u003e\u003c/a\u003e09 好 康 的\u003c/h3\u003e\u003cimg src=\"https://i.loli.net/2021/09/21/qO3mhC6S4aAVXFL.png\" alt=\"rr1\" style=\"zoom:80%;\"/\u003e\u003cp\u003e(被骗一次,之后就会被骗第二次\u003c/p\u003e\u003cp\u003e太草了,放完发现后面有一段不能放,用 \u003ccode\u003emkvtoolnix\u003c/code\u003e 分离出来字幕,拖进\u003ccode\u003e010 Editor\u003c/code\u003e 直接搜索 \u003ccode\u003emoectf\u003c/code\u003e ,找到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{N3v3r_90tt@_L3t-y0U_dOwN~}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"10-easyForensics\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#10-easyForensics\" class=\"headerlink\" title=\"10 easyForensics\"\u003e\u003c/a\u003e10 easyForensics\u003c/h3\u003e\u003cp\u003e参考博客\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/luostudent/article/details/113786916?utm_term=base64%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BD%AC%E6%96%87%E4%BB%B6python\u0026amp;utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-1-113786916\u0026amp;spm=3001.4430\"\u003ehttps://blog.csdn.net/luostudent/article/details/113786916?utm_term=base64%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BD%AC%E6%96%87%E4%BB%B6python\u0026amp;utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-1-113786916\u0026amp;spm=3001.4430\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_37865996/article/details/87970732\"\u003ehttps://blog.csdn.net/qq_37865996/article/details/87970732\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"http://blog.sina.com.cn/s/blog_68f8a3370102vqv7.html\"\u003ehttp://blog.sina.com.cn/s/blog_68f8a3370102vqv7.html\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e找了半天,用 \u003ccode\u003eAccessData FTK Imager\u003c/code\u003e 打开,挂载,进入,翻目录找到 \u003ccode\u003eflag.mp4\u003c/code\u003e 一气呵成\u003c/p\u003e\u003cp\u003e打开 \u003ccode\u003eflag.mp4\u003c/code\u003e \u003c/p\u003e\u003cimg src=\"https://i.loli.net/2021/09/21/qO3mhC6S4aAVXFL.png\" alt=\"rr1\" style=\"zoom:80%;\"/\u003e\u003cp\u003e草\u003c/p\u003e\u003cp\u003e又经过了漫长的鼓捣,最后在 \u003ccode\u003eFTK\u003c/code\u003e 里发现一些被删除的文件夹还有一个python文件,都是申必的命名,全部导出来,读了代码发现是把一个文件转成base64了,这里要注意 \u003ccode\u003edata = data.replace(\u0026#34;/\u0026#34;, \u0026#34;_\u0026#34;)\u003c/code\u003e\u003c/p\u003e\u003cp\u003e写了个脚本把文件夹的名字提取了出来(发现写了两个,好像差不多,随便粘一个)\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-python\" data-language=\"python\"\u003e\u003ccode class=\"language-python\"\u003e\u003cspan class=\"token comment\"\u003e# -*- coding: utf-8 -*-\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e os\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e base64\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e sysfile_dir \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;C:\\\\Users\\\\(之后目录省略)\u0026#39;\u003c/span\u003es \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e root\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e dirs\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e files \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e os\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewalk\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efile_dir\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e var \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e root s \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e s \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e var\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e54\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003es \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e s\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ereplace\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;_\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewith\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;C:\\\\Users\\\\(之后目录省略)\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;w\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eas\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003es\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;success\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e然后用脚本把base64转文件,还搜了个大佬写的图形化工具,(最后发现是个word)得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{Th@_1s_N0t_U53FULL_@_4LL}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"11-R-P-G\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#11-R-P-G\" class=\"headerlink\" title=\"11 R P G\"\u003e\u003c/a\u003e11 R P G\u003c/h3\u003e\u003cp\u003e是游戏捏,按F12还能出来 DevTools 捏,本来想怎么改地图直接穿过去,发现不会整,然后又改了下等级,好像也没啥用,然后又整了一下一进去就是第二个,还是不会整,最后在\u003ccode\u003eMap002.json\u003c/code\u003e 里发现了好像base64的申必字符,然后复制出来,得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{Th3_w0rld_0f_G4m3}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"12-诺亚的日记\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#12-%E8%AF%BA%E4%BA%9A%E7%9A%84%E6%97%A5%E8%AE%B0\" class=\"headerlink\" title=\"12 诺亚的日记\"\u003e\u003c/a\u003e12 诺亚的日记\u003c/h3\u003e\u003cp\u003e\u003cdel\u003e我超,嘉心糖\u003c/del\u003e\u003c/p\u003e\u003cp\u003e参考博客\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qiuchi1975/article/details/106149854/\"\u003ehttps://blog.csdn.net/qiuchi1975/article/details/106149854/\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/u012388993/article/details/116395497\"\u003ehttps://blog.csdn.net/u012388993/article/details/116395497\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.codercto.com/a/109222.html\"\u003ehttps://www.codercto.com/a/109222.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.anquanke.com/post/id/85218\"\u003ehttps://www.anquanke.com/post/id/85218\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/ba9763ceb620\"\u003ehttps://www.jianshu.com/p/ba9763ceb620\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/756aa623c3b5\"\u003ehttps://www.jianshu.com/p/756aa623c3b5\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/ECJTUACM-873284962/p/9473808.html\"\u003ehttps://www.cnblogs.com/ECJTUACM-873284962/p/9473808.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/756aa623c3b5\"\u003ehttps://www.jianshu.com/p/756aa623c3b5\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/ECJTUACM-873284962/p/9473808.html\"\u003ehttps://www.cnblogs.com/ECJTUACM-873284962/p/9473808.html\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e是个流量包捏,随便翻了一下里面 \u003ccode\u003eHID Data\u003c/code\u003e 里好像有好东西捏,但怎么提取出来捏?看了上面的博客,先把流量包用 \u003ccode\u003etshark\u003c/code\u003e 转换成json,找到 \u003ccode\u003eHID Data\u003c/code\u003e 叫啥,然后再提出来\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003etshark.exe \u003cspan class=\"token parameter variable\"\u003e-T\u003c/span\u003e json \u003cspan class=\"token parameter variable\"\u003e-r\u003c/span\u003e pcapng.pcap \u003cspan class=\"token operator\"\u003e\u0026gt;\u003c/span\u003e test.json\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003etshark.exe \u003cspan class=\"token parameter variable\"\u003e-r\u003c/span\u003e pcapng.pcap \u003cspan class=\"token parameter variable\"\u003e-T\u003c/span\u003e fields \u003cspan class=\"token parameter variable\"\u003e-e\u003c/span\u003e usbhid.data \u003cspan class=\"token operator\"\u003e\u0026gt;\u003c/span\u003e usbdata.txt\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e然后看博客里面只有两位是有用的,然后就是对着表翻译。找了好多脚本都是错的,交了很多次……最后终于找到个有用的\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-python\" data-language=\"python\"\u003e\u003ccode class=\"language-python\"\u003e\u003cspan class=\"token comment\"\u003e# coding:utf-8\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e sys\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e osusb_codes \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x04\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;aA\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x05\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;bB\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x06\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;cC\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x07\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;dD\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x08\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;eE\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x09\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;fF\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x0A\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;gG\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x0B\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;hH\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x0C\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;iI\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x0D\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;jJ\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x0E\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;kK\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x0F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;lL\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;mM\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x11\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;nN\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x12\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;oO\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x13\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pP\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x14\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;qQ\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;rR\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;sS\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x17\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;tT\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x18\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;uU\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x19\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;vV\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x1A\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;wW\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x1B\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xX\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x1C\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;yY\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x1D\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;zZ\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x1E\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;1!\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x1F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;2@\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;3#\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x21\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;4$\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;5%\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x23\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;6^\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;7\u0026amp;\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x25\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;8*\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x26\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;9(\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x27\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;0)\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2C\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2D\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-_\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2E\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;=+\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;[{\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x30\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;]}\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x32\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;#~\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x33\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;;:\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x34\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;\u0026#39;\\\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x36\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;,\u0026lt;\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x37\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;.\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x4f\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x50\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;\u0026lt;\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token keyword\"\u003edef\u003c/span\u003e \u003cspan class=\"token function\"\u003ecode2chr\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efilepath\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e lines \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e pos \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e x \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efilepath\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;r\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ereadlines\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e code \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ex\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# 即第三个字节\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e code \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003econtinue\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# newline or down arrow - move down\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e code \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x51\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e code \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x28\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e pos \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e \u003cspan class=\"token keyword\"\u003econtinue\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# up arrow - move up\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e code \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x52\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e pos \u003cspan class=\"token operator\"\u003e-=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e \u003cspan class=\"token keyword\"\u003econtinue\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# select the character based on the Shift key\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"token builtin\"\u003elen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003elines\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e pos\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e lines\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eappend\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e code \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e \u003cspan class=\"token builtin\"\u003erange\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e81\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ex\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e code \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e usb_codes\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e lines\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003epos\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e usb_codes\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ecode\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e lines\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003epos\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;\u0026lt;un\u0026gt;\u0026#34;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e code \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e usb_codes\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e lines\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003epos\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e usb_codes\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ecode\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e lines\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003epos\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;\u0026lt;un\u0026gt;\u0026#34;\u003c/span\u003e result \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e x \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e lines\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e result \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e x \u003cspan class=\"token comment\"\u003e# print(x)\u003c/span\u003e fout \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;C:\\\\Users\\\\(后面路径省略)\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;w\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e fout\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eresult\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e fout\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eclose\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e __name__ \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;__main__\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e code2chr\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;C:\\\\Users\\\\(后面路径省略)\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{D@m3daNe_D4me_yoooooo}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch2 id=\"PWN\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#PWN\" class=\"headerlink\" title=\"PWN\"\u003e\u003c/a\u003ePWN\u003c/h2\u003e\u003ch3 id=\"02-test-your-nc\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#02-test-your-nc\" class=\"headerlink\" title=\"02 test_your_nc\"\u003e\u003c/a\u003e02 test_your_nc\u003c/h3\u003e\u003cp\u003e如题\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token function\"\u003enc\u003c/span\u003e pwn.blackbird.wang \u003cspan class=\"token number\"\u003e9500\u003c/span\u003e\u003cspan class=\"token function\"\u003els\u003c/span\u003e\u003cspan class=\"token function\"\u003ecat\u003c/span\u003e flag\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{enjoy_the_netcat_and_the_shell}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"03-Int-overflow\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#03-Int-overflow\" class=\"headerlink\" title=\"03 Int_overflow\"\u003e\u003c/a\u003e03 Int_overflow\u003c/h3\u003e\u003cp\u003e试着试着给了个 \u003ccode\u003e-1\u003c/code\u003e ,得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{y0ul0v3m3m3l0v3y0u_1nt0v3rfl0w}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch2 id=\"Web\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Web\" class=\"headerlink\" title=\"Web\"\u003e\u003c/a\u003eWeb\u003c/h2\u003e\u003cp\u003e\u003cdel\u003ePHP真实绝绝子\u003c/del\u003e\u003c/p\u003e\u003ch3 id=\"02-Web安全入门指北—GET\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#02-Web%E5%AE%89%E5%85%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8C%97%E2%80%94GET\" class=\"headerlink\" title=\"02 Web安全入门指北—GET\"\u003e\u003c/a\u003e02 Web安全入门指北—GET\u003c/h3\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003ehttp://47.93.215.154:10000/?moe\u003cspan class=\"token operator\"\u003e=\u003c/span\u003eflag\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{We1c0me_t0_CTF_Web!}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"03-Web安全入门指北—POST\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#03-Web%E5%AE%89%E5%85%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8C%97%E2%80%94POST\" class=\"headerlink\" title=\"03 Web安全入门指北—POST\"\u003e\u003c/a\u003e03 Web安全入门指北—POST\u003c/h3\u003e\u003cp\u003e随便找个在线工具发POST就行\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{POST_1s_an_1mp0rtant_m3th0d!}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"04-Web安全入门指北—小饼干\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#04-Web%E5%AE%89%E5%85%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8C%97%E2%80%94%E5%B0%8F%E9%A5%BC%E5%B9%B2\" class=\"headerlink\" title=\"04 Web安全入门指北—小饼干\"\u003e\u003c/a\u003e04 Web安全入门指北—小饼干\u003c/h3\u003e\u003cp\u003e浏览器F12 把cookies里值改成1,刷新\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{C00kie_1s_sw33t!}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"05-2048\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#05-2048\" class=\"headerlink\" title=\"05 2048\"\u003e\u003c/a\u003e05 2048\u003c/h3\u003e\u003cp\u003e审查元素大法好,找到代码\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-javascript\" data-language=\"javascript\"\u003e\u003ccode class=\"language-javascript\"\u003e\u003cspan class=\"token function-variable function\"\u003egetFlag\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efunction\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token keyword\"\u003evar\u003c/span\u003e req \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enew\u003c/span\u003e \u003cspan class=\"token class-name\"\u003eXMLHttpRequest\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e req\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;GET\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;flag.php?score=\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e+\u003c/span\u003eobj\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003escore\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token boolean\"\u003etrue\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e req\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function-variable function\"\u003eonload\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efunction\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token function\"\u003ealert\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ethis\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eresponseText\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e req\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003esend\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e打开发现申必数字\u003ccode\u003e50000\u003c/code\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003ehttp://47.93.215.154:5001/flag.php?score\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e50000\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e获得flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{2048_1s_intere5t1ng!}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003cp\u003e参考博客\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/CSDNiamcoming/article/details/108837347\"\u003e(6条消息) 总结ctf中 MD5 绕过的一些思路_y0un9er-CSDN博客_ctf md5绕过\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token assign-left variable\"\u003ea\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2\u003cspan class=\"token assign-left variable\"\u003eb\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{xdsec3gf9dfg62fh342}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"06-ezinclude\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#06-ezinclude\" class=\"headerlink\" title=\"06 ezinclude\"\u003e\u003c/a\u003e06 ezinclude\u003c/h3\u003e\u003cp\u003e参考博客\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/vhkjhwbs/article/details/99728785\"\u003ehttps://blog.csdn.net/vhkjhwbs/article/details/99728785\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_42181428/article/details/87090539\"\u003ehttps://blog.csdn.net/qq_42181428/article/details/87090539\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.leavesongs.com/PENETRATION/php-filter-magic.html\"\u003ehttps://www.leavesongs.com/PENETRATION/php-filter-magic.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/ichunqiu/p/10683379.html\"\u003ehttps://www.cnblogs.com/ichunqiu/p/10683379.html\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003ehttp://47.98.215.112:5000/?file\u003cspan class=\"token operator\"\u003e=\u003c/span\u003ephp://filter/read\u003cspan class=\"token operator\"\u003e=\u003c/span\u003econvert.base64-encode/resource\u003cspan class=\"token operator\"\u003e=\u003c/span\u003eflag.php\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e得到base64字符串,解码\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{xdsec6asdgas7ahfsfaxczc}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"07-babeRCE\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#07-babeRCE\" class=\"headerlink\" title=\"07 babeRCE\"\u003e\u003c/a\u003e07 babeRCE\u003c/h3\u003e\u003cp\u003e参考博客\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_44657899/article/details/107676580\"\u003ehttps://blog.csdn.net/qq_44657899/article/details/107676580\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e挺有意思,试了里面好多法子,最后试出来了然后还得每个字符之间都加\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003ehttp://47.93.215.154:5000/?rce\u003cspan class=\"token operator\"\u003e=\u003c/span\u003et\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003ea\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003ec\u003cspan class=\"token variable\"\u003e${\u003cspan class=\"token environment constant\"\u003eIFS\u003c/span\u003e}\u003c/span\u003ef\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003el\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003ea\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003eg\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003e\u003cspan class=\"token builtin class-name\"\u003e.\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003ep\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003eh\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003ep\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003eoectf{Do_y0u_l1k3_Rcccccccccccccce?}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e### 08 Do you know HTTP?\u003cp\u003ephp真是绝绝子\u003c/p\u003e\u003cp\u003e用php+curl,查阅了文档,然后一步一步按题给的要求加东西\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-php\" data-language=\"php\"\u003e\u003ccode class=\"language-php\"\u003e\u003cspan class=\"token php language-php\"\u003e\u003cspan class=\"token delimiter important\"\u003e\u0026lt;?php\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$url\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token string single-quoted-string\"\u003e\u0026#39;http://47.93.215.154:5002\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$ch\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token function\"\u003ecurl_init\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$header\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token keyword\"\u003earray\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token string double-quoted-string\"\u003e\u0026#34;Referer: www.ltyyds.com\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string double-quoted-string\"\u003e\u0026#34;X-Forwarded-For: 127.0.0.1\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string double-quoted-string\"\u003e\u0026#34;User-Agent: LT\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string double-quoted-string\"\u003e\u0026#34;Date: Dec, 26 Dec 2015 17:30:00 GMT\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003ecurl_setopt\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$ch\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token constant\"\u003eCURLOPT_URL\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$url\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003ecurl_setopt\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$ch\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token constant\"\u003eCURLOPT_CUSTOMREQUEST\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token string single-quoted-string\"\u003e\u0026#39;HS\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003ecurl_setopt\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$ch\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token constant\"\u003eCURLOPT_TIMEOUT\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003ecurl_setopt\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$ch\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token constant\"\u003eCURLOPT_RETURNTRANSFER\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e#curl_setopt($ch,CURLOPT_HTTPHEADER,array(\u0026#34;X-Forwarded-For: 127.0.0.1\u0026#34;));\u003c/span\u003e\u003cspan class=\"token function\"\u003ecurl_setopt\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$ch\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token constant\"\u003eCURLOPT_HTTPHEADER\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$header\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$content\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token function\"\u003ecurl_exec\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$ch\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eecho\u003c/span\u003e \u003cspan class=\"token variable\"\u003e$content\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token delimiter important\"\u003e?\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{HTTPHeaders_1s_s0_ea5y!}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/82c9/"},{"title":"blogEncrypt","time":"2021-09-09T14:02:52Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cdiv class=\"hbe hbe-container\" id=\"hexo-blog-encrypt\" data-wpm=\"抱歉, 这个密码看着不太对, 请再试试.\" data-whm=\"抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.\"\u003e \u003cscript id=\"hbeData\" type=\"hbeData\" data-hmacdigest=\"4838c035240a77ed6a78693c026a2ff61b17c3551b0ee6366631d0ca6dcd57bb\"\u003eeefcb32dea6b1b3cf00a6005fbaeec13fe33249b90ab29d6586ecb398d0eca850144a02e601cd72ca042df0f6de4861b3b858d5692d5cde454c3b47084d3a78437917c5f5bbee81f8032aa9a1e29a844b0f4ca6e476c84a7eec435bf74a1be3edabb682d58c0e60af8baf6929662b069f5f11272f77a74d1b3477df7f4251f003c2801887418a7e0ad930d46f0a553d96a393a1222821cabf2e2e4e07db2017269ad22f352e61748bbb4b5c3e35a2cb0f9059ef4225ed713beae899374580e36163878e69f63c6c053ce0ca053c0c747\u003c/script\u003e \u003cdiv class=\"hbe hbe-content\"\u003e \u003cdiv class=\"hbe hbe-input hbe-input-xray\"\u003e \u003cinput class=\"hbe hbe-input-field hbe-input-field-xray\" type=\"password\" id=\"hbePass\"/\u003e \u003clabel class=\"hbe hbe-input-label hbe-input-label-xray\" for=\"hbePass\"\u003e \u003cspan class=\"hbe hbe-input-label-content hbe-input-label-content-xray\"\u003e这里需要密码.\u003c/span\u003e \u003c/label\u003e \u003csvg class=\"hbe hbe-graphic hbe-graphic-xray\" width=\"300%\" height=\"100%\" viewBox=\"0 0 1200 60\" preserveAspectRatio=\"none\"\u003e \u003cpath d=\"M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0\"\u003e\u003c/path\u003e \u003cpath d=\"M0,2.5c0,0,298.666,0,399.333,0C448.336,2.5,513.994,13,597,13c77.327,0,135-10.5,200.999-10.5c95.996,0,402.001,0,402.001,0\"\u003e\u003c/path\u003e \u003c/svg\u003e \u003c/div\u003e \u003c/div\u003e\u003c/div\u003e\u003cscript data-pjax=\"\" src=\"/lib/hbe.js\"\u003e\u003c/script\u003e\u003clink href=\"/css/hbe.style.css\" rel=\"stylesheet\" type=\"text/css\"/\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/af/"}]},{"name":"Canxin Site","email":"","uri":"https://canxin121.github.io/","description":"Recent content on Canxin Site","article":[{"title":"屏幕 控制 电机(pid)","time":"2023-09-18T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/cover.png\" alt=\"Featured image of post 屏幕 控制 电机(pid)\"/\u003e\u003ch1 id=\"保命事项\"\u003e保命事项\u003c/h1\u003e\n\u003col\u003e\n\u003cli\u003eVCC等电压和GND接地千万不要接反! 否则板子升天, money打水漂.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"元器件列表\"\u003e元器件列表\u003c/h2\u003e\n\u003cp\u003e感谢物院实验室某佬倾情相借!\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eStm32 H750VBT6\u003c/li\u003e\n\u003cli\u003e轮趣科技 Tb6612 稳压版电机驱动\u003c/li\u003e\n\u003cli\u003e轮趣科技 MG513 霍尔解码器版电机\u003c/li\u003e\n\u003cli\u003eTJC3224K024 触控屏\u003c/li\u003e\n\u003cli\u003ePWlink2 lite版本 下载\\调试器\u003c/li\u003e\n\u003cli\u003e一块电池\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"使用工具\"\u003e使用工具\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eVscode + EIDE套装\u003c/li\u003e\n\u003cli\u003eKeil u5(\u003c/li\u003e\n\u003cli\u003eStm Cube MX\u003c/li\u003e\n\u003cli\u003eUSART HMI (TJC图形化编程工具)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"实践过程\"\u003e实践过程\u003c/h2\u003e\n\u003ch3 id=\"接线\"\u003e接线\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cem\u003e电机\u003c/em\u003e 和 \u003cem\u003e驱动板\u003c/em\u003e接线, 这里直接使用附赠的排线连接.\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e驱动板\u003c/em\u003e 和 \u003cem\u003eStm主板\u003c/em\u003e 接线 ( 可以按照自己喜欢的布局连接, 也可以参考驱动板厂家给出的示例.\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e显示屏\u003c/em\u003e 和 \u003cem\u003eStm主板\u003c/em\u003e 接线 (TX,RX对接就完了), 这里电池给显示屏供电, 所以直接接到了驱动板引出的5v和GND.\u003c/li\u003e\n\u003cli\u003e\u003cem\u003ePwlink2lite下载器\u003c/em\u003e 和 \u003cem\u003eStm主板\u003c/em\u003e 接线( 这里要单独接一个TX-\u0026gt;RX, 用来输出调试信息).\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e这里简单介绍下不同串口的接线意义:\u003c/p\u003e\n\u003ch4 id=\"驱动板和stm\"\u003e驱动板和Stm\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e驱动板的 E2A和E2B (这里的2代表用的第二个电机,也就是B电机,“A”,“B\u0026#34;代表编码器的A相和B相) 接 Stm 的 两个Pin设定同一个TIM并且将该TIM设定为Combined Mode下的Encoder Mode用来解码从电机获取的实际转速(这里实际是 固定时间的位移 正比于速度, 可以当成转速来用)\u003c/li\u003e\n\u003cli\u003e驱动板的 ADC 接口 (这里是用来读取电压) 接 Stm 的 Pin 设定为 ADC_IN.(呃呃,这里最后其实没把电压显示出来,所以没用上)\u003c/li\u003e\n\u003cli\u003e驱动板的 PWMB (这里的B就是代表B电机了) 接 Stm 的 Pin 设定为 TIM 并将对应 TIM 的 对应 CH 设定为PWM GENERATION CHx, 用来输出PWM信号\u003c/li\u003e\n\u003cli\u003e驱动版的 BIN1,2 接 Stm 的 Pin 设定为 GPIO OUTput, 用来设定电机旋转的模式\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e还有其他的使能,电源接口就不赘述了.可以查看 驱动板的使用说明\u003c/p\u003e\n\u003ch4 id=\"触控屏和stm\"\u003e触控屏和Stm\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e触控屏使用UART通信, TX,RX 和 Stm 对接(小白注意嗷,TX-\u0026gt;RX对接), Stm上的 两个Pin 设置RX,TX(这里用的USART), 并且要打开对应USART的NVIC (中断)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"stm和-pwlink2lite-下载器\"\u003eStm和 PwLink2lite 下载器\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e调试下载的直接对应相连, 电压接3v3, GND对接\u003c/li\u003e\n\u003cli\u003ePwlink2lite 的 Rx 接到Stm 的 Pin 设置为 USART TX, 用来发送调试信息(后面的代码部分会提到Printf的重定向)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"stm-cube-mx-配置\"\u003eStm Cube MX 配置\u003c/h3\u003e\n\u003cp\u003e这里的创建工程略过, 小白可以自己看看MX的教学视频\u003c/p\u003e\n\u003ch4 id=\"串口设定pin-out\"\u003e串口设定(Pin OUT)\u003c/h4\u003e\n\u003ch5 id=\"这里的串口要对应好自己的实际接线\"\u003e这里的串口要对应好自己的实际接线.\u003c/h5\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/pin_out.png\" width=\"1112\" height=\"989\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/pin_out_hu06611d6c8d4fc68f059f2a7211a156e7_199638_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/pin_out_hu06611d6c8d4fc68f059f2a7211a156e7_199638_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" class=\"gallery-image\" data-flex-grow=\"112\" data-flex-basis=\"269px\"/\u003e\u003c/p\u003e\n\u003ch4 id=\"串口相应功能设定\"\u003e串口相应功能设定\u003c/h4\u003e\n\u003cp\u003e这些功能要对应好你实际的串口设定\u003c/p\u003e\n\u003ch5 id=\"tim\"\u003eTIM\u003c/h5\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/rcc.png\" width=\"1417\" height=\"635\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/rcc_hu749d9b4ca982880304e14ae1d218a3b9_148125_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/rcc_hu749d9b4ca982880304e14ae1d218a3b9_148125_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"然后RCC设置给时钟HSE选择CCR源\" class=\"gallery-image\" data-flex-grow=\"223\" data-flex-basis=\"535px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/encoder.png\" width=\"964\" height=\"591\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/encoder_hu0cb4eaea236f392224f4bb2d886ce4cd_111946_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/encoder_hu0cb4eaea236f392224f4bb2d886ce4cd_111946_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"Encoder (E2A,E2B)\" class=\"gallery-image\" data-flex-grow=\"163\" data-flex-basis=\"391px\"/\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/pwm.png\" width=\"914\" height=\"577\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/pwm_hu536268e8857b5e7c97e540165974e99a_104347_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/pwm_hu536268e8857b5e7c97e540165974e99a_104347_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"Pwm (PwmB)\" class=\"gallery-image\" data-flex-grow=\"158\" data-flex-basis=\"380px\"/\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/time_control.png\" width=\"941\" height=\"875\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/time_control_hu4db4ca04e1c690adffb3211d5d5e5ab9_165813_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/time_control_hu4db4ca04e1c690adffb3211d5d5e5ab9_165813_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"TIM \" class=\"gallery-image\" data-flex-grow=\"107\" data-flex-basis=\"258px\"/\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/time_control1.png\" width=\"934\" height=\"709\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/time_control1_hud30bc67d88e4606d86734df99e013dba_183490_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/time_control1_hud30bc67d88e4606d86734df99e013dba_183490_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"续上图配置的周期(用于控制读Encoder并设定Pwm的间隔,这里调成了0.1秒多一次)\" class=\"gallery-image\" data-flex-grow=\"131\" data-flex-basis=\"316px\"/\u003e\u003c/p\u003e\n\u003ch5 id=\"adc\"\u003eADC\u003c/h5\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/adc.png\" width=\"910\" height=\"435\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/adc_hu76805e7ed3647cf5d90adcec01194c89_44184_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/adc_hu76805e7ed3647cf5d90adcec01194c89_44184_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"这里的ADC设置了Single-ended模式\" class=\"gallery-image\" data-flex-grow=\"209\" data-flex-basis=\"502px\"/\u003e\u003c/p\u003e\n\u003ch5 id=\"gpio\"\u003eGPIO\u003c/h5\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/gpio.png\" width=\"931\" height=\"1081\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/gpio_hu4620c1d6af36e037585fadb09c11ee09_156730_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/gpio_hu4620c1d6af36e037585fadb09c11ee09_156730_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"这里的GPIO的Bin1和Bin2可以打个标签区分一下, 同时两个都Pull Down(对应的状态是 电机停止)\" class=\"gallery-image\" data-flex-grow=\"86\" data-flex-basis=\"206px\"/\u003e\u003c/p\u003e\n\u003ch5 id=\"usart\"\u003eUSART\u003c/h5\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/screen_usart.png\" width=\"938\" height=\"785\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/screen_usart_hu3a00685f918a87810710b7d4b581c1cc_143248_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/screen_usart_hu3a00685f918a87810710b7d4b581c1cc_143248_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"触控屏接到的USART还要打开NVIC全局中断\" class=\"gallery-image\" data-flex-grow=\"119\" data-flex-basis=\"286px\"/\u003e\n![发送调试信息到Pwlink2lite的Usart把Mode打开成Async就好]\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/printf_usart.png\" width=\"937\" height=\"445\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/printf_usart_hufbbd1ce6f6e9d2cf426b2d4c66957dc5_52572_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/printf_usart_hufbbd1ce6f6e9d2cf426b2d4c66957dc5_52572_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"Alt text\" class=\"gallery-image\" data-flex-grow=\"210\" data-flex-basis=\"505px\"/\u003e\u003c/p\u003e\n\u003ch5 id=\"project-manager\"\u003eProject Manager\u003c/h5\u003e\n\u003cp\u003e然后配置一下生成代码的设置, 让它生成单独的c/h文件, 并且生成MDK(Keil)的源代码, 这样后面的VSC + EIDE可以直接以MDK项目格式导入进去,嘎嘎方便.\n\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/hc.png\" width=\"2557\" height=\"1260\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/hc_hub7ae0b88da0fd6eb5b9d150d279a9c1c_307450_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/hc_hub7ae0b88da0fd6eb5b9d150d279a9c1c_307450_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"生成单独c/h文件\" class=\"gallery-image\" data-flex-grow=\"202\" data-flex-basis=\"487px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/mdk.png\" width=\"2560\" height=\"1263\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/mdk_huf2c82dab1e6b106f83a5e1f661bb4c21_350215_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/mdk_huf2c82dab1e6b106f83a5e1f661bb4c21_350215_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"生成MDK项目\" class=\"gallery-image\" data-flex-grow=\"202\" data-flex-basis=\"486px\"/\u003e\u003c/p\u003e\n\u003ch3 id=\"usart-hmi-写刷-触控屏程序\"\u003eUSART HMI 写/刷 触控屏程序\u003c/h3\u003e\n\u003cp\u003e小白可以先看看这个系列教程了解一下这个 陶晶驰的图形化设计软件的使用方法\u003cbr/\u003e\n\u003c/p\u003e\u003cdiv class=\"video-wrapper\"\u003e\n\u003ciframe src=\"https://player.bilibili.com/player.html?as_wide=1\u0026amp;high_quality=1\u0026amp;page=1\u0026amp;bvid=BV16T4y127YE\u0026amp;autoplay=0\" scrolling=\"no\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"\u003e\n\u003c/iframe\u003e\n\u003c/div\u003e\n点击上面可以跳转到完整的系列视频⬆️⬆️⬆️\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e下面是正文⬇️⬇️⬇️\u003c/p\u003e\n\u003cp\u003e我设计的简陋的界面\n\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/home.png\" width=\"2072\" height=\"795\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/home_hu4d582b6e9de5983c6fdf2c2f2b1c7da8_247571_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/home_hu4d582b6e9de5983c6fdf2c2f2b1c7da8_247571_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"HOME\" class=\"gallery-image\" data-flex-grow=\"260\" data-flex-basis=\"625px\"/\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/about.png\" width=\"1978\" height=\"783\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/about_huac7dfe68c132b969493914a8117ee917_356200_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/about_huac7dfe68c132b969493914a8117ee917_356200_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"ABOUT\" class=\"gallery-image\" data-flex-grow=\"252\" data-flex-basis=\"606px\"/\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/func.png\" width=\"1873\" height=\"749\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/func_hu87881c4c4d9fd19bd5b5842f06b5fc53_263046_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/func_hu87881c4c4d9fd19bd5b5842f06b5fc53_263046_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"FUNC\" class=\"gallery-image\" data-flex-grow=\"250\" data-flex-basis=\"600px\"/\u003e\u003c/p\u003e\n\u003cp\u003e这里面唯一有用的就是func界面了(其他纯属引流嗷,建议别学我嗷\n\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/func_deatil.png\" width=\"687\" height=\"522\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/func_deatil_hu57adf9d35597e7a450a8e7d262e59fc3_255222_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/func_deatil_hu57adf9d35597e7a450a8e7d262e59fc3_255222_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"Func\" class=\"gallery-image\" data-flex-grow=\"131\" data-flex-basis=\"315px\"/\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e首先需要两个数字框(绑定数字键盘), 一个用来设定目标速度,一个用来设定目标圈数,并且设定了初始值\u003c/li\u003e\n\u003cli\u003e然后加个复选框来 选择 正转 or 反转\u003c/li\u003e\n\u003cli\u003e然后加两个按钮, 一个start 一个 stop, 本质都是用uart发一些数据\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e这里两个按钮需要自己定义一个简单的通信协议, 我这里是这样极其简陋乱写的\u003cbr/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/start.png\" width=\"193\" height=\"280\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/start_hub1ea8b066bc44846cdeb9988ecd989c4_20676_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/start_hub1ea8b066bc44846cdeb9988ecd989c4_20676_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"Start\" class=\"gallery-image\" data-flex-grow=\"68\" data-flex-basis=\"165px\"/\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/stop.png\" width=\"344\" height=\"294\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/stop_hu2a72a1dc7b1766df73c052fd9822e9e0_24339_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/stop_hu2a72a1dc7b1766df73c052fd9822e9e0_24339_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"Stop\" class=\"gallery-image\" data-flex-grow=\"117\" data-flex-basis=\"280px\"/\u003e\u003cbr/\u003e\n也就是 [-1,速度的整数,-2,圈数的整数,-3,复选框(正/反转)的整数]\u003c/p\u003e\n\u003cp\u003e搞定程序设计我们调试试一下效果,没有问题就可以把 屏幕用下载器接到电脑(自己简单对接可以)\u003c/p\u003e\n\u003ch3 id=\"vscode--eide\"\u003eVscode + EIDE\u003c/h3\u003e\n\u003ch4 id=\"环境配置\"\u003e环境配置\u003c/h4\u003e\n\u003cp\u003e小白直接看这个教程吧\n\u003c/p\u003e\u003cdiv class=\"video-wrapper\"\u003e\n\u003ciframe src=\"https://player.bilibili.com/player.html?as_wide=1\u0026amp;high_quality=1\u0026amp;page=1\u0026amp;bvid=BV1nr4y1R7Jb\u0026amp;autoplay=0\" scrolling=\"no\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"\u003e\n\u003c/iframe\u003e\n\u003c/div\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch4 id=\"控制代码\"\u003e控制代码\u003c/h4\u003e\n\u003cp\u003eEIDE 导入项目后 开始写代码\u003cbr/\u003e\n这里由于程序简单, 我直接全写在main.c了\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e这里注意一定要在 BEGIN 和 END 中间来写自己的代码, 否则CubeMX再次生成代码时, 会把你非用户代码区的代码删掉了.\u003c/em\u003e\u003cbr/\u003e\n\u003cem\u003e下面的代码中也只有 BEGIN 和 END 中间的代码是开发者自己写的,其他全部由CubeMX自动生成\u003c/em\u003e\u003c/p\u003e\n\u003ch5 id=\"include\"\u003einclude\u003c/h5\u003e\n\u003cp\u003e这里只用到了一个pid(这个代码分享在最后吧), 一个stdio(使用printf)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN Includes */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;pid.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;stdio.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END Includes */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch5 id=\"用uart重定向printf到调试器\"\u003e用uart重定向printf到调试器\u003c/h5\u003e\n\u003cp\u003e这个记住就好啦, 网上抄来的方法, 确实不错的方案\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003efputc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eFILE\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ef\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 使用HAL库函数HAL_UART_Transmit将字符ch发送到UART4串口\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart4\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 返回发送的字符,这通常不会有实际的影响,但是它需要返回发送的字符。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch5 id=\"main函数\"\u003emain函数\u003c/h5\u003e\n\u003col\u003e\n\u003cli\u003e初始化一些参数, 并初始化一个PID计算的结构体\u003c/li\u003e\n\u003cli\u003e把屏幕控制的USART打开来接受信息, 并且设置每接受六次产生一次中断(因为上面的串口屏是设定的发送6个整数)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e70\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 0 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 定义一个全局的PID结构体,用来计算PID的时候传参\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e \u003cspan class=\"n\"\u003epid\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 定义一个buf用来储存从屏幕的uart收到的消息(发了6个整数)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END 0 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief The application entry point.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @retval int\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 1 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END 1 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* MCU Configuration--------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* Reset of all peripherals, Initializes the Flash interface and the Systick. */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN Init */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END Init */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* Configure the system clock */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eSystemClock_Config\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN SysInit */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END SysInit */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* Initialize all configured peripherals */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_GPIO_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_TIM3_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_ADC1_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_TIM2_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_TIM4_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_UART4_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_USART1_UART_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 2 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这里是一个坑, 详情请看下面的PWM部分的Read_Encoder()\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM2\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eCNT\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x7FFF\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 把屏幕的UART的接受消息打开,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_Receive_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 把PID结构体初始化,这里的P I D参数要看自己选择合适的值, 可以根据实际情况适当调节.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KP\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KI\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KD\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 调用PID初始化函数(这个代码我放在结尾吧, 作者是物院实验室某佬)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 这里最后两个参数是限定I项的, 具体左右可以看代码\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003ePID_init\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003epid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KP\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KI\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KD\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END 2 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* Infinite loop */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN WHILE */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END WHILE */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 3 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END 3 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch5 id=\"屏幕串口的uart中断\"\u003e屏幕串口的UART中断\u003c/h5\u003e\n\u003cp\u003e我们通过重定义中断回调函数来实现对HAL的中断回调的使用\u003cbr/\u003e\n下面的代码 通过 屏幕串口USART中断来实现 不同状态下 激活/关闭 计时器和电机\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 74\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 75\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 76\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 77\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 78\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 79\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 80\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 81\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 82\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 83\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 84\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 85\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 86\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 87\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 88\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 89\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 90\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 91\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 92\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 93\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 94\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 95\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 96\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 97\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 98\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 99\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e100\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e101\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e102\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e103\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e104\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e105\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e106\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e107\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e108\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e109\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e110\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e111\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e112\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e113\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e114\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e115\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e116\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e117\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e118\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e119\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e120\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e121\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e122\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e123\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e124\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e125\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e126\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e127\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e128\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e129\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e130\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e131\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e132\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e133\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e134\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这里定义一些变量\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 电机转一圈所需的Encoder读数累和\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eEach_Circle\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1440\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 设定的目标速度 Encoder读出的真实速度\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 设定的目标位置总读数和 实际位置读数和\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 给电机的PWM设定的占空比数值(这里需要每次累加,因为使用的是增程式pid)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eStart_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Start Encoder tim 开启解码器时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_Encoder_Start\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_ALL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Start Time Control tim 开启定时控制的时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_Base_Start_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim4\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Start the pwm tim 开启pwm输出的时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_PWM_Start\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_3\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eStop_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 重置各种参数。 防止下次启动时有上次残留的值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eReality_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Stop Encoder tim 关闭解码器时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_Encoder_Stop\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_ALL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Stop Time Control tim 关闭定时控制的时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_Base_Stop_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim4\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Stop the pwm tim 关闭pwm输出的时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_PWM_Stop\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_3\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这个函数用来设定电机 正转/反转/不转/刹车\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eMoTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003emode\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这里需要对照你的接线来设定,BIN1和BIN2对应的不同状态状态可以在驱动的说明中找到\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 同时也要对应好 屏幕设定的 复选框 发送的0/1对应的正反转\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"cm\"\u003e/*\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e 1 foreward\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e 0 reversal\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e -1 stop\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e -2 brake\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eswitch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emode\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_SET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_SET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_SET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_SET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_RxCpltCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eUART_HandleTypeDef\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这是HAL库提供的UART接收完成回调函数,当UART接收完成时,该函数会被自动调用。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 判断是哪个UART触发了回调,这里使用了单个UART1,可以根据实际情况进行扩展。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 清除空闲中断标志位,UART通信中,空闲中断通常用于检测接收结束。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_CLEAR_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_CLEAR_IDLEF\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 禁用UART发送中断,以防止在处理接收数据时发送数据。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_DISABLE_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_IT_TXE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 检查接收到的数据是否符合预期的协议,如果传输中出错了,就直接跳过不执行,根据协议格式解析数据。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// -1 -2 -3\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFF\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFE\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFD\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 从接收到的数据中提取速度、圈数和模式信息。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003espeed\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ecircle\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003emode\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 检查速度和圈数是否都不为零,才需要转动。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003espeed\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003ecircle\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 如果目标速度和位置都为零,则说明当前没有进行任何动作,可以开始新的动作。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 设置目标速度和目标位置。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003espeed\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecircle\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eEach_Circle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 根据模式调用MoTo函数执行相应的操作。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// MoTo 函数定义时要把屏幕传过来的 (0/1) 和 真实转动的对应正确\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eMoTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emode\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 启动定时器,这样其他的中断才会发生。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eStart_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 如果速度或圈数为零,就说明要停下电机。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eMoTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 调用MoTo函数执行刹停电机。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 重置各种参数(防止下次启动时有上次残留的值) 并且 停止定时器。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eStop_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 重新启用UART发送中断,以便后续可以发送数据。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_ENABLE_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_IT_TXE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 重新启用UART接收中断,以便继续接收数据。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_Receive_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 清空UART的数据寄存器,以确保不会因为残留数据而触发接收中断。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_FLUSH_DRREGISTER\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 清除UART接收缓冲区非空标志位,以确保下一次接收可以正常触发中断。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_CLEAR_FLAG\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_FLAG_RXNE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch5 id=\"固定时间间隔的-中断控制\"\u003e固定时间间隔的 中断控制\u003c/h5\u003e\n\u003cp\u003e之所以要新开一个 tim, 固定时间的读取encoder并设定pwm, 是为了\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eencoder读出的实际可以理解为转动的总距离, 只有时间间隔固定, 我们才能将固定时间的 转动距离差 当作 速度来用\u003c/li\u003e\n\u003cli\u003e防止过快的设置pwm, 别把电机玩坏了(\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e52\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这里读取encoder有一个坑\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 由于这个encoder是一直累加(或减,取决于电机正反转)的, 它累加到最大值(减到0) 就自动重置了\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 因此你上一次读的数 不一定比 这次读的数大, 这样一算差值, 就可能出现一个极其大的负值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 为了防止这种情况, 我们就需要把这个 tim 的读数一开始(main里面就设置了)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 就设定到一个 中间数值(0和最大之间), 并且 每次读完之后都把它设定回去\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这样就能保证每次都得到一个 计算正确的 值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint16_t\u003c/span\u003e \u003cspan class=\"nf\"\u003eRead_Encoder\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint16_t\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_TIM_GET_COUNTER\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTIM2\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eCNT\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x7FFF\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e-=\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x7FFF\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这里因为电机 正传反转 有一种情况是累加,一种是累减, 所以有正有负\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 但是计算pid并设置pwm都是正值, 所以返回绝对值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 固定时间间隔的 中断控制, 每0.1秒多执行一次\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_PeriodElapsedCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eTIM_HandleTypeDef\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim4\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 读取实际转速(相当于转速)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003eRead_Encoder\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 转速累和相当于总距离(实际上转速使用这个总距离做差才算出来的,前面已经解释过了)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 每次先判断是不是已经到了设定的要转的总距离, 如果是, 刹车关定时器重置相关参数\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eReality_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 刹车\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eMoTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 停止计时器\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eStop_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 用PID算法计算出要设定的pwm值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"nf\"\u003ePID\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003epid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这里串口输出一下调试信息,方便查看\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;target: %d, real: %d, set: %d\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 设定pwm值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eSet_Pwm\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"相关代码分享\"\u003e相关代码分享\u003c/h2\u003e\n\u003ch3 id=\"pid\"\u003epid\u003c/h3\u003e\n\u003cp\u003e由某物院实验室佬手写\u003c/p\u003e\n\u003cp\u003epid.h\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#ifndef __PID_H_\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#define __PID_H_\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#define MAX_LEN 15\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eKP\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eKI\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eKD\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eMAX_LEN\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eMAX_I\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eLEN\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eis_first\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 解决D的首次误差减去0得到一个不正常的D值问题\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003etop_index\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003ePID_init\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003ekp\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eki\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003ekd\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003emax_i\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"nf\"\u003ePID\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003etar\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#endif\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003epid.c\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 74\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 75\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 76\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 77\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 78\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 79\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 80\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 81\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 82\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 83\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 84\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 85\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 86\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 87\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 88\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 89\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 90\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 91\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 92\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 93\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 94\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 95\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 96\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 97\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 98\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 99\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e100\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e101\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e102\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e103\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e104\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e105\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e106\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e107\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e108\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e109\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e110\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e111\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @file PID\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @author zl (2293721550@qq.com)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief 一个通用的PID函数,该PID接收返回数据全部为float类型\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * 使用时先构造PID_struct类型的结构体,再调用PID_init()函数初始化结构体,最后调用PID()函数得到PID的返回值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @version 0.1\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @date 2023-08-24\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @copyright Copyright (c) 2023\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;pid.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief 初始化PID结构体\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param pid_struct 想要初始化的PID结构体指针\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param kp P项比例系数\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param ki I项比例系数\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param kd D项比例系数\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param len I积分项长度(不能超过MAX_LEN的设定值)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param max_i I项最大输出量,防止出现积分量过大导致的过冲\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003ePID_init\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003ekp\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eki\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003ekd\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003emax_i\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eKP\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ekp\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eKI\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eki\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eKD\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ekd\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eLEN\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eMAX_I\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003emax_i\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eis_first\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eMAX_LEN\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief 求出积分项值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param pid_struct 想要处理的PID结构体指针\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @return float\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"nf\"\u003eerr_sum\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 获取I值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003ebuf\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eMAX_LEN\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ebuf\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ebuf\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief 求出微分项值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param pid_struct 想要处理的PID结构体指针\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @return float\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"nf\"\u003eerr_change\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 获取D值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003echange_speed\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eis_first\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003echange_speed\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eMAX_LEN\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003echange_speed\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eis_first\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003echange_speed\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief PID函数\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param pid_struct 想要处理的PID结构体指针\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param tar 目标值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param cur 当前值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @return float 返回PID计算后的值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"nf\"\u003ePID\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003etar\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003epid\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eerr\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etar\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eP\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eI\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eD\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// PID数据先进先出\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eLEN\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eLEN\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eLEN\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eMAX_LEN\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eP\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 获取PID三值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eI\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003eerr_sum\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eD\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003eerr_change\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 数据头向前移动一个\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"n\"\u003eMAX_LEN\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eI\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eKI\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eMAX_I\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eI\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eMAX_I\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eKI\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eI\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eI\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 限制I的累计不可大于MAX_I\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eP\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eKP\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eI\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eKI\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eD\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eKD\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 计算出PID的返回值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003epid\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"完整的mainc程序\"\u003e完整的main.c程序\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 74\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 75\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 76\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 77\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 78\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 79\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 80\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 81\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 82\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 83\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 84\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 85\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 86\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 87\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 88\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 89\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 90\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 91\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 92\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 93\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 94\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 95\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 96\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 97\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 98\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 99\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e100\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e101\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e102\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e103\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e104\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e105\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e106\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e107\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e108\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e109\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e110\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e111\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e112\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e113\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e114\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e115\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e116\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e117\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e118\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e119\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e120\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e121\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e122\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e123\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e124\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e125\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e126\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e127\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e128\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e129\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e130\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e131\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e132\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e133\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e134\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e135\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e136\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e137\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e138\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e139\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e140\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e141\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e142\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e143\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e144\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e145\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e146\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e147\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e148\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e149\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e150\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e151\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e152\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e153\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e154\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e155\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e156\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e157\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e158\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e159\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e160\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e161\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e162\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e163\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e164\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e165\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e166\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e167\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e168\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e169\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e170\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e171\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e172\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e173\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e174\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e175\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e176\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e177\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e178\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e179\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e180\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e181\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e182\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e183\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e184\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e185\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e186\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e187\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e188\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e189\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e190\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e191\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e192\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e193\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e194\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e195\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e196\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e197\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e198\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e199\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e200\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e201\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e202\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e203\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e204\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e205\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e206\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e207\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e208\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e209\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e210\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e211\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e212\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e213\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e214\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e215\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e216\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e217\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e218\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e219\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e220\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e221\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e222\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e223\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e224\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e225\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e226\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e227\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e228\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e229\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e230\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e231\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e232\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e233\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e234\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e235\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e236\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e237\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e238\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e239\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e240\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e241\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e242\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e243\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e244\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e245\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e246\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e247\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e248\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e249\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e250\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e251\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e252\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e253\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e254\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e255\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e256\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e257\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e258\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e259\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e260\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e261\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e262\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e263\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e264\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e265\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e266\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e267\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e268\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e269\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e270\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e271\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e272\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e273\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e274\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e275\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e276\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e277\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e278\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e279\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e280\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e281\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e282\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e283\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e284\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e285\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e286\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e287\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e288\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e289\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e290\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e291\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e292\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e293\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e294\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e295\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e296\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e297\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e298\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e299\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e300\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e301\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e302\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e303\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e304\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e305\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e306\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e307\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e308\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e309\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e310\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e311\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e312\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e313\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e314\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e315\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e316\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e317\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e318\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e319\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e320\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e321\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e322\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e323\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e324\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e325\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e326\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e327\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e328\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e329\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e330\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e331\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e332\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e333\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e334\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e335\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e336\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e337\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e338\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e339\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e340\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e341\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e342\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e343\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e344\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e345\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e346\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e347\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e348\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e349\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e350\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e351\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e352\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e353\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e354\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e355\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e356\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e357\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e358\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e359\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e360\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e361\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e362\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e363\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e364\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e365\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e366\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e367\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e368\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e369\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e370\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e371\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e372\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e373\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e374\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e375\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e376\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e377\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e378\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e379\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e380\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e381\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e382\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e383\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e384\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e385\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e386\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e387\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e388\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e389\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e390\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e391\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e392\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e393\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e394\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e395\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e396\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e397\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e398\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e399\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e400\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e401\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e402\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e403\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e404\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e405\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e406\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e407\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e408\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e409\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e410\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e411\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e412\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e413\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e414\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e415\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e416\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e417\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e418\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e419\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e420\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e421\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e422\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e423\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e424\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e425\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e426\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e427\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e428\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e429\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e430\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e431\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e432\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e433\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e434\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e435\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e436\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e437\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e438\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e439\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e440\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e441\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e442\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e443\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e444\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e445\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e446\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e447\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e448\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e449\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e450\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e451\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e452\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e453\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e454\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN Header */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e ******************************************************************************\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @file : main.c\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief : Main program body\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e ******************************************************************************\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @attention\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * Copyright (c) 2023 STMicroelectronics.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * All rights reserved.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * This software is licensed under terms that can be found in the LICENSE file\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * in the root directory of this software component.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * If no LICENSE file comes with this software, it is provided AS-IS.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e ******************************************************************************\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END Header */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* Includes ------------------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;main.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;adc.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;tim.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;usart.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;gpio.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* Private includes ----------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN Includes */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;pid.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;stdio.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END Includes */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* Private typedef -----------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN PTD */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END PTD */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* Private define ------------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN PD */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END PD */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* Private macro -------------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN PM */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END PM */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* Private variables ---------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN PV */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END PV */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* Private function prototypes -----------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eSystemClock_Config\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN PFP */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END PFP */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* Private user code ---------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 0 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// redirect `printf`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003efputc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eFILE\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ef\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 使用HAL库函数HAL_UART_Transmit将字符ch发送到UART4串口\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart4\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 返回发送的字符,这通常不会有实际的影响,但是它需要返回发送的字符。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// uint16_t Get_adc(void)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// HAL_ADC_Start(\u0026amp;hadc1);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// HAL_ADC_PollForConversion(\u0026amp;hadc1, 2);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// if (HAL_IS_BIT_SET(HAL_ADC_GetState(\u0026amp;hadc1), HAL_ADC_STATE_REG_EOC))\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// return HAL_ADC_GetValue(\u0026amp;hadc1);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// else\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// return Get_adc();\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// uint16_t Get_adc_Average(uint8_t times)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// uint32_t sum = 0;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// for (uint8_t i = 0; i \u0026lt; times; i++)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// sum += Get_adc();\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// return sum / times;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// define pid struct\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e \u003cspan class=\"n\"\u003epid\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// the buf for screen usart\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END 0 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief The application entry point.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @retval int\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 1 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END 1 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* MCU Configuration--------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* Reset of all peripherals, Initializes the Flash interface and the Systick. */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN Init */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END Init */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* Configure the system clock */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eSystemClock_Config\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN SysInit */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END SysInit */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* Initialize all configured peripherals */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_GPIO_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_TIM3_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_ADC1_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_TIM2_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_TIM4_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_UART4_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_USART1_UART_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这里是一个坑, 详情请看下面的PWM部分的Read_Encoder()\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM2\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eCNT\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x7FFF\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 把屏幕的UART的接受消息打开,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_Receive_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 把PID结构体初始化,这里的P I D参数要看自己选择合适的值, 可以根据实际情况适当调节.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KP\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KI\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KD\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 调用PID初始化函数(这个代码我放在结尾吧, 作者是物院实验室某佬)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 这里最后两个参数是限定I项的, 具体左右可以看代码\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003ePID_init\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003epid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KP\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KI\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KD\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END 2 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* Infinite loop */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN WHILE */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END WHILE */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 3 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END 3 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief System Clock Configuration\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @retval None\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eSystemClock_Config\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitTypeDef\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitTypeDef\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Supply configuration update enable\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_PWREx_ConfigSupply\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ePWR_LDO_SUPPLY\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Configure the main internal regulator output voltage\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003e__HAL_PWR_VOLTAGESCALING_CONFIG\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ePWR_REGULATOR_VOLTAGE_SCALE3\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nf\"\u003e__HAL_PWR_GET_FLAG\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ePWR_FLAG_VOSRDY\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Initializes the RCC Oscillators according to the specified parameters\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * in the RCC_OscInitTypeDef structure.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOscillatorType\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_OSCILLATORTYPE_HSI\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eHSIState\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_HSI_DIV1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eHSICalibrationValue\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_HSICALIBRATION_DEFAULT\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLState\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_PLL_ON\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLSource\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_PLLSOURCE_HSI\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLM\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLN\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e9\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLP\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLQ\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLR\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLRGE\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_PLL1VCIRANGE_3\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLVCOSEL\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_PLL1VCOMEDIUM\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLFRACN\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3072\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nf\"\u003eHAL_RCC_OscConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003eHAL_OK\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eError_Handler\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Initializes the CPU, AHB and APB buses clocks\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eClockType\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_CLOCKTYPE_HCLK\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_CLOCKTYPE_SYSCLK\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_CLOCKTYPE_PCLK1\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_CLOCKTYPE_PCLK2\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_CLOCKTYPE_D3PCLK1\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_CLOCKTYPE_D1PCLK1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSYSCLKSource\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_SYSCLKSOURCE_PLLCLK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSYSCLKDivider\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_SYSCLK_DIV1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAHBCLKDivider\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_HCLK_DIV1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAPB3CLKDivider\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_APB3_DIV1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAPB1CLKDivider\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_APB1_DIV2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAPB2CLKDivider\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_APB2_DIV2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAPB4CLKDivider\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_APB4_DIV1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nf\"\u003eHAL_RCC_ClockConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eFLASH_LATENCY_1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003eHAL_OK\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eError_Handler\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 4 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这里定义一些变量\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 电机转一圈所需的Encoder读数累和\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eEach_Circle\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1440\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 设定的目标速度 Encoder读出的真实速度\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 设定的目标位置总读数和 实际位置读数和\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 给电机的PWM设定的占空比数值(这里需要每次累加,因为使用的是增程式pid)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eStart_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Start Encoder tim 开启解码器时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_Encoder_Start\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_ALL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Start Time Control tim 开启定时控制的时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_Base_Start_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim4\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Start the pwm tim 开启pwm输出的时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_PWM_Start\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_3\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eStop_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 重置各种参数。 防止下次启动时有上次残留的值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eReality_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Stop Encoder tim 关闭解码器时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_Encoder_Stop\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_ALL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Stop Time Control tim 关闭定时控制的时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_Base_Stop_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim4\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Stop the pwm tim 关闭pwm输出的时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_PWM_Stop\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_3\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这个函数用来设定电机 正转/反转/不转/刹车\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eMoTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003emode\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这里需要对照你的接线来设定,BIN1和BIN2对应的不同状态状态可以在驱动的说明中找到\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 同时也要对应好 屏幕设定的 复选框 发送的0/1对应的正反转\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"cm\"\u003e/*\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e 1 foreward\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e 0 reversal\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e -1 stop\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e -2 brake\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eswitch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emode\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_SET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_SET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_SET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_SET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_RxCpltCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eUART_HandleTypeDef\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这是HAL库提供的UART接收完成回调函数,当UART接收完成时,该函数会被自动调用。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 判断是哪个UART触发了回调,这里使用了单个UART1,可以根据实际情况进行扩展。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 清除空闲中断标志位,UART通信中,空闲中断通常用于检测接收结束。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_CLEAR_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_CLEAR_IDLEF\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 禁用UART发送中断,以防止在处理接收数据时发送数据。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_DISABLE_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_IT_TXE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 检查接收到的数据是否符合预期的协议,如果传输中出错了,就直接跳过不执行,根据协议格式解析数据。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// -1 -2 -3\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFF\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFE\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFD\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 从接收到的数据中提取速度、圈数和模式信息。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003espeed\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ecircle\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003emode\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 检查速度和圈数是否都不为零,才需要转动。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003espeed\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003ecircle\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 如果目标速度和位置都为零,则说明当前没有进行任何动作,可以开始新的动作。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 设置目标速度和目标位置。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003espeed\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecircle\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eEach_Circle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 根据模式调用MoTo函数执行相应的操作。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// MoTo 函数定义时要把屏幕传过来的 (0/1) 和 真实转动的对应正确\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eMoTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emode\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 启动定时器,这样其他的中断才会发生。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eStart_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 如果速度或圈数为零,就说明要停下电机。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eMoTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 调用MoTo函数执行刹停电机。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 重置各种参数(防止下次启动时有上次残留的值) 并且 停止定时器。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eStop_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 重新启用UART发送中断,以便后续可以发送数据。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_ENABLE_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_IT_TXE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 重新启用UART接收中断,以便继续接收数据。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_Receive_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 清空UART的数据寄存器,以确保不会因为残留数据而触发接收中断。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_FLUSH_DRREGISTER\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 清除UART接收缓冲区非空标志位,以确保下一次接收可以正常触发中断。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_CLEAR_FLAG\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_FLAG_RXNE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这里读取encoder有一个坑\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 由于这个encoder是一直累加(或减,取决于电机正反转)的, 它累加到最大值(减到0) 就自动重置了\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 因此你上一次读的数 不一定比 这次读的数大, 这样一算差值, 就可能出现一个极其大的负值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 为了防止这种情况, 我们就需要把这个 tim 的读数一开始(main里面就设置了)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 就设定到一个 中间数值(0和最大之间), 并且 每次读完之后都把它设定回去\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这样就能保证每次都得到一个 计算正确的 值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint16_t\u003c/span\u003e \u003cspan class=\"nf\"\u003eRead_Encoder\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint16_t\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_TIM_GET_COUNTER\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTIM2\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eCNT\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x7FFF\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e-=\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x7FFF\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这里因为电机 正传反转 有一种情况是累加,一种是累减, 所以有正有负\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 但是计算pid并设置pwm都是正值, 所以返回绝对值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eDead_Voltage\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e160\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eSet_Pwm\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eVelocity\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003e__HAL_TIM_SET_COMPARE\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eVelocity\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eDead_Voltage\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 固定时间间隔的 中断控制, 每0.1秒多执行一次\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_PeriodElapsedCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eTIM_HandleTypeDef\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim4\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 读取实际转速(相当于转速)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003eRead_Encoder\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 转速累和相当于总距离(实际上转速使用这个总距离做差才算出来的,前面已经解释过了)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 每次先判断是不是已经到了设定的要转的总距离, 如果是, 刹车关定时器重置相关参数\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eReality_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 刹车\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eMoTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 停止计时器\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eStop_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 用PID算法计算出要设定的pwm值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"nf\"\u003ePID\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003epid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这里串口输出一下调试信息,方便查看\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;target: %d, real: %d, set: %d\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 设定pwm值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eSet_Pwm\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END 4 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief This function is executed in case of error occurrence.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @retval None\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eError_Handler\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN Error_Handler_Debug */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* User can add his own implementation to report the HAL error return state */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003e__disable_irq\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END Error_Handler_Debug */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#ifdef USE_FULL_ASSERT\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief Reports the name of the source file and the source line number\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * where the assert_param error has occurred.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param file: pointer to the source file name\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param line: assert_param error line source number\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @retval None\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eassert_failed\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003efile\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003euint32_t\u003c/span\u003e \u003cspan class=\"n\"\u003eline\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 6 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* User can add his own implementation to report the file name and line number,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e ex: printf(\u0026#34;Wrong parameters value: file %s on line %d\\r\\n\u0026#34;, file, line) */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END 6 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#endif \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* USE_FULL_ASSERT */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/"},{"title":"SparkGPT","time":"2023-09-10T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://canxin121.github.io/p/sparkgpt/cover.png\" alt=\"Featured image of post SparkGPT\"/\u003e\u003ch2 id=\"项目地址---spark-gpthttpsgithubcomcanxin121spark-gpt\"\u003e项目地址 -\u0026gt; \u003ca class=\"link\" href=\"https://github.com/canxin121/Spark-GPT\" target=\"_blank\" rel=\"noopener\"\u003eSpark-GPT\u003c/a\u003e\u003c/h2\u003e\n\u003ch2 id=\"feature\"\u003eFeature\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e使用Nonebot框架跨适配器实现,多聊天平台同步实现\u003c/li\u003e\n\u003cli\u003e支持 QQ, QQ频道, Kook, 飞书, Telegram, Discord\u003c/li\u003e\n\u003cli\u003e支持跨平台账户绑定,多平台账户统一数据\u003c/li\u003e\n\u003cli\u003e适配多来源语言模型, 多态模型\u003c/li\u003e\n\u003cli\u003e实现 多用户, 多会话窗口, 公共会话和私有会话\u003c/li\u003e\n\u003cli\u003e实现 流式输出 , 文转图, 文转网络剪切板链接\u003c/li\u003e\n\u003cli\u003e实现WebUi编辑配置,实时热更新\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"todo\"\u003eToDo\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e负载均衡\u003c/li\u003e\n\u003cli\u003e用户权限系统\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"模型来源支持情况\"\u003e模型来源支持情况\u003c/h2\u003e\n\u003cp\u003e✔️:支持 ❌:不支持\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e来源\u003c/th\u003e\n\u003cth\u003e传入文本\u003c/th\u003e\n\u003cth\u003e传入图片\u003c/th\u003e\n\u003cth\u003e输出文本\u003c/th\u003e\n\u003cth\u003e输出图片\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eNewbing\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePoe\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eChatGPT Api\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eChatGPT 网页\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eClaude.Ai\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSlack Claude\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003ePs: \u003ccode\u003e各来源的配置使用均在WebUi中已有详细说明\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"聊天平台支持情况\"\u003e聊天平台支持情况\u003c/h2\u003e\n\u003cp\u003e✔️:支持 ❌:不支持\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e来源\u003c/th\u003e\n\u003cth\u003e传入文本\u003c/th\u003e\n\u003cth\u003e传入图片\u003c/th\u003e\n\u003cth\u003e输出文本\u003c/th\u003e\n\u003cth\u003e输出图片\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eQQ\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eQQ频道\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKook\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e飞书\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTelegram\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDiscord\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003ePs: \u003ccode\u003e各聊天平台接入,请查看对应的Nonebot适配器使用说明\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"教程\"\u003e教程\u003c/h2\u003e\n\u003ch3 id=\"基本概念说明\"\u003e基本概念说明\u003c/h3\u003e\n\u003ch4 id=\"会话-chat-\"\u003e会话( chat )\u003c/h4\u003e\n\u003cp\u003e在本插件中,\u003ccode\u003e会话\u003c/code\u003e指的是 一个独立的由指定\u003ccode\u003e模型\u003c/code\u003e驱动的聊天上下文\u003c/p\u003e\n\u003cp\u003e会话的分类如下:\u003c/p\u003e\n\u003cpre class=\"mermaid\"\u003egraph TD\nChat[\u0026#34;会话\u0026#34;]\nPrivateChat[\u0026#34;私有会话\u0026#34;]\nPublicChat[\u0026#34;公有会话\u0026#34;]\nQPrivateChat[\u0026#34;QQ的一个和好友的聊天窗口,\\n你们的对话时私有的,\\n别的用户没办法加入到你们的对话中来.\\n为了保证上下文的连贯性,\\n同一个会话必须一问一答.\u0026#34;]\nQPublicChat[\u0026#34;QQ的一个群聊窗口, \\n所有用户都可以使用.\\n但用户是提问者,\\n只有一个 语言模型 是回答者,\\n为了保证上下文的连贯性,\\n语言模型只能 一个一个顺序 回答问题,\\n 不能同时回答你们\u0026#34;]\nChat --\u0026gt; PrivateChat --\u0026gt; |\u0026#34;类似于\u0026#34;|QPrivateChat\nChat --\u0026gt; PublicChat --\u0026gt; |\u0026#34;类似于\u0026#34;|QPublicChat\n\u003c/pre\u003e\n\u003c!-- 模型开始 --\u003e\n\u003ch4 id=\"模型-model-\"\u003e模型( model )\u003c/h4\u003e\n\u003cp\u003e在本插件中,\u003ccode\u003e模型\u003c/code\u003e指的是驱动\u003ccode\u003e会话\u003c/code\u003e的实际的回复人\n\u003ccode\u003e模型\u003c/code\u003e需要在web ui中配置相关内容才可以启用\u003c/p\u003e\n\u003ch4 id=\"预设-prompt-\"\u003e预设( prompt )\u003c/h4\u003e\n\u003cp\u003e在本插件中,\u003ccode\u003e预设\u003c/code\u003e指每次新对话开始前,优先加载的\u003cstrong\u003e人格\u003c/strong\u003e\u003cbr/\u003e\n原理:\u003cbr/\u003e\n基本是在\u003ccode\u003e会话\u003c/code\u003e开始前,自动先向会话中发送预设文本,也有特殊的来源会使用其他方法\u003c/p\u003e\n\u003cp\u003e注意:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e预设\u003c/code\u003e 不一定对所有的\u003ccode\u003e模型\u003c/code\u003e都有效,因为有些模型本身会 阻止这种对模型输出行为的干预\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e预设\u003c/code\u003e 的字数不是越长越好, 字数也会有\u003cstrong\u003e上限\u003c/strong\u003e,各模型的上限不一, 超出上限会报错, 只能自行更改预设\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- 模型结束 --\u003e\n\u003c!-- 指令开始 --\u003e\n\u003ch4 id=\"指令-command-\"\u003e指令( command )\u003c/h4\u003e\n\u003cp\u003e在本插件中,\u003ccode\u003e指令\u003c/code\u003e指自动填充在问题前面的指令,可以用来命令\u003ccode\u003e模型\u003c/code\u003e一定的格式或者要求进行回复\u003c/p\u003e\n\u003cp\u003e原理:\n在发送用户的问题之前,现在用户的问题前面加上\u003ccode\u003e指令\u003c/code\u003e文本,然后再发送过去\n注意:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e指令\u003c/code\u003e字数有\u003cstrong\u003e上限\u003c/strong\u003e,各模型的上限不一, 超出上限会报错, 只能自行更改指令\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- 指令结束 --\u003e\n\u003c!-- 基本使用逻辑开始 --\u003e\n\u003ch3 id=\"基本使用逻辑说明\"\u003e基本使用逻辑说明\u003c/h3\u003e\n\u003cpre class=\"mermaid\"\u003egraph TD\nCU[\u0026#34;用户\u0026#34;]\nML[\u0026#34;获取模型列表\u0026#34;]\nPL[\u0026#34;获取预设列表\u0026#34;]\nCmdL[\u0026#34;获取指令列表\u0026#34;]\nCL[\u0026#34;获取可用会话 (公有 | 私有)\u0026#34;]\nCAprivate[\u0026#34;创建新的会话 (私有 | 公有 {仅管理员} ) \u0026#34;]\nCC[\u0026#34;使用会话\u0026#34;]\nCPC[\u0026#34;回复来继续会话\u0026#34;]\nCU --\u0026gt; CL\nCU --\u0026gt; ML\nCU --\u0026gt; CmdL\nCU --\u0026gt; PL\nML --\u0026gt; CAprivate\nCmdL --\u0026gt; CAprivate\nPL --\u0026gt; CAprivate\nCL --\u0026gt; CC\nCAprivate --\u0026gt; CC\nCC --\u0026gt; CPC\n\u003c/pre\u003e\n\u003c!-- 基本使用逻辑结束 --\u003e\n\u003ch3 id=\"部署教程\"\u003e部署教程\u003c/h3\u003e\n\u003ch4 id=\"部署nonebot\"\u003e部署Nonebot\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003e这里直接看Well404的教程吧,点击即可跳转到b站系列教程\u003c/strong\u003e\n\u003c/p\u003e\u003cdiv class=\"video-wrapper\"\u003e\n\u003ciframe src=\"https://player.bilibili.com/player.html?as_wide=1\u0026amp;high_quality=1\u0026amp;page=1\u0026amp;aid=608028309\u0026amp;autoplay=0\" scrolling=\"no\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"\u003e\n\u003c/iframe\u003e\n\u003c/div\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch4 id=\"部署各适配器\"\u003e部署各适配器\u003c/h4\u003e\n\u003cp\u003e在这里我直接贴出个适配器的官方使用文档或者合适的教程了\u003c/p\u003e\n\u003ch5 id=\"qqobv11\"\u003eQQ(OBV11)\u003c/h5\u003e\n\u003cp\u003e首先是qsign的部署,这个目前是 必须的\u003c/p\u003e\n\u003cdiv class=\"video-wrapper\"\u003e\n\u003ciframe src=\"https://player.bilibili.com/player.html?as_wide=1\u0026amp;high_quality=1\u0026amp;page=1\u0026amp;bvid=BV11W4y1o7u5\u0026amp;autoplay=0\" scrolling=\"no\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"\u003e\n\u003c/iframe\u003e\n\u003c/div\u003e\n\u003cp\u003e然后需要使用 gocq 的dev 版本,这里给出 gocq dev的action地址,可以自行在这里寻找合适的构建版本,\u003cbr/\u003e\n而连接到nb的方法在上面的 nonebot部署教程中已经又过了,这里不在放出地址\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://github.com/Mrs4s/go-cqhttp/actions/workflows/ci.yml\" target=\"_blank\" rel=\"noopener\"\u003egocq-dev Action CL\u003c/a\u003e\u003c/p\u003e\n\u003ch5 id=\"qqguid-qq频道\"\u003eQQGuid (QQ频道)\u003c/h5\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://github.com/nonebot/adapter-qqguild\" target=\"_blank\" rel=\"noopener\"\u003eQQ频道适配器 gh链接\u003c/a\u003e\u003c/p\u003e\n\u003ch5 id=\"kook开黑啦\"\u003eKOOK(开黑啦)\u003c/h5\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://github.com/Tian-que/nonebot-adapter-kaiheila\" target=\"_blank\" rel=\"noopener\"\u003eKOOK(开黑啦)适配器 gh链接\u003c/a\u003e\u003c/p\u003e\n\u003ch5 id=\"飞书\"\u003e飞书\u003c/h5\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://feishu.adapters.nonebot.dev/docs/guide/installation\" target=\"_blank\" rel=\"noopener\"\u003e飞书(Lark)适配器 gh链接\u003c/a\u003e\u003c/p\u003e\n\u003ch5 id=\"telegram\"\u003eTelegram\u003c/h5\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://github.com/nonebot/adapter-telegram\" target=\"_blank\" rel=\"noopener\"\u003eTelegram适配器 gh链接\u003c/a\u003e\u003c/p\u003e\n\u003ch5 id=\"discord\"\u003eDiscord\u003c/h5\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://github.com/nonebot/adapter-discord\" target=\"_blank\" rel=\"noopener\"\u003eDiscord适配器 gh链接\u003c/a\u003e\u003c/p\u003e\n\u003ch4 id=\"部署spark-gpt\"\u003e部署Spark GPT\u003c/h4\u003e\n\u003ch5 id=\"安装插件\"\u003e安装插件\u003c/h5\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enb plugin install spark_gpt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch5 id=\"配置相关信息\"\u003e配置相关信息\u003c/h5\u003e\n\u003col\u003e\n\u003cli\u003eSparkGPT 依赖 \u003ca class=\"link\" href=\"https://github.com/canxin121/nonebot_plugin_web_config\" target=\"_blank\" rel=\"noopener\"\u003enonebot_plugin_web_config\u003c/a\u003e 进行实时配置热更新,所以需要配置的相关信息(端口,账号密码),可以点击进入查看相关的env配置.\u003c/li\u003e\n\u003cli\u003eSparkGPT 的GPT来源需要手动配置相应的 auth 信息才可以使用,具体获取方式都均在web ui(默认\u003ca class=\"link\" href=\"http://127.0.0.1:8666\" target=\"_blank\" rel=\"noopener\"\u003ehttp://127.0.0.1:8666\u003c/a\u003e)中已经标出,并可以实时热更新.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"使用教程\"\u003e使用教程\u003c/h3\u003e\n\u003cp\u003e使用教程图片版可以使用 shelp 命令获取.\u003cbr/\u003e\n本插件 均采用\u003ca class=\"link\" href=\"https://github.com/nonebot/plugin-alconna\" target=\"_blank\" rel=\"noopener\"\u003eAlc\u003c/a\u003e命令形式 进行使用.\u003cbr/\u003e\n在下面的文本中,用\u003ccode\u003e{}\u003c/code\u003e来标志 需要替换的变量, 用\u003ccode\u003e()\u003c/code\u003e框起来的为 选填的变量\u003c/p\u003e\n\u003ch4 id=\"会话\"\u003e会话\u003c/h4\u003e\n\u003ch5 id=\"使用公有会话询问\"\u003e使用公有会话询问\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003epublic_command{chat_name} {question} ( {photo} )\u003c/code\u003e\u003cbr/\u003e\n参数:\u003c/p\u003e\n\u003cp\u003e必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003echat_name\u003c/code\u003e: 会话昵称\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003equestion\u003c/code\u003e: 问题\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e选填:\u003cbr/\u003e\n3. \u003ccode\u003ephoto\u003c/code\u003e: 需要识别的图片内容,只有model为bing时才可以使用,需要跟随文本信息一同发送\n4.\u003c/p\u003e\n\u003ch5 id=\"使用私有会话询问\"\u003e使用私有会话询问\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003eprivate_command{chat_name} {question} ( {photo} )\u003c/code\u003e\u003cbr/\u003e\n参数:\u003c/p\u003e\n\u003cp\u003e必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003echat_name\u003c/code\u003e: 会话昵称\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003equestion\u003c/code\u003e: 问题\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e选填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003ephoto\u003c/code\u003e: 需要识别的图片内容,只有model为bing时才可以使用,需要跟随文本信息一同发送\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"创建新的会话\"\u003e创建新的会话\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003echat add -n {chat_name} -m {model} ( -p {prompt} -c {command} -auto_pic {bool} -num_limit {int} -pic {bool} -url {bool} -stream {bool} -public )\u003c/code\u003e\u003cbr/\u003e\n参数:\u003c/p\u003e\n\u003cp\u003e必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003echat_name\u003c/code\u003e: 会话名称\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emodel\u003c/code\u003e: 使用的模型名称或者索引数字\n选填:\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eprompt\u003c/code\u003e:\u003cbr/\u003e\n使用本地预设,须在预设名称前加’.‘号\u003cbr/\u003e\n使用自定义预设,直接输入内容\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecommand\u003c/code\u003e:\u003cbr/\u003e\n使用本地指令,须在指令名称前加’.‘号\u003cbr/\u003e\n使用自定义指令,直接输入内容\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eauto_pic\u003c/code\u003e: 是否当字数过多时自动转图片\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enum_limit\u003c/code\u003e: 自动转图片的字数上限\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epic\u003c/code\u003e: 是否总是文字转图片\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eurl\u003c/code\u003e: 是否在图片或流式回复时发送全文链接\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estream\u003c/code\u003e: 是否流式输出,分段发送结果\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epublic\u003c/code\u003e: 是否是创建共有会话\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"修改新的会话\"\u003e修改新的会话\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003echat edit -on {old_name} \\n( -nn {new_name} -m {model} -p {prompt} -c {command} -auto_pic {bool} -num_limit {int} -pic {bool} -url {bool} -stream {bool} -public )\u003c/code\u003e\u003cbr/\u003e\n参数:\u003c/p\u003e\n\u003cp\u003e必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003eold_name\u003c/code\u003e: 原来的会话名称\n选填:\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enew_name\u003c/code\u003e: 原来的会话名称\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emodel\u003c/code\u003e: 使用的模型名称或者索引数字\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eprompt\u003c/code\u003e:\u003cbr/\u003e\n使用本地预设,须在预设名称前加’.‘号\u003cbr/\u003e\n使用自定义预设,直接输入内容\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecommand\u003c/code\u003e:\u003cbr/\u003e\n使用本地指令,须在指令名称前加’.‘号\u003cbr/\u003e\n使用自定义指令,直接输入内容\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eauto_pic\u003c/code\u003e: 是否当字数过多时自动转图片\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enum_limit\u003c/code\u003e: 自动转图片的字数上限\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epic\u003c/code\u003e: 是否总是文字转图片\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eurl\u003c/code\u003e: 是否在图片或流式回复时发送全文链接\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estream\u003c/code\u003e: 是否流式输出,分段发送结果\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epublic\u003c/code\u003e: 是否是修改共有会话\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"获取所有会话的列表\"\u003e获取所有会话的列表\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003echat list\u003c/code\u003e\u003c/p\u003e\n\u003ch5 id=\"删除一个会话\"\u003e删除一个会话\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003echat del -n {chat_name} ( -public )\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003echat_name\u003c/code\u003e: 会话名称\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e选填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003epublic\u003c/code\u003e: 是否是创建共有会话\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"模型\"\u003e模型\u003c/h4\u003e\n\u003ch5 id=\"获取可用模型列表\"\u003e获取可用模型列表\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003emodel list\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"预设\"\u003e预设\u003c/h4\u003e\n\u003ch5 id=\"添加一个新的预设\"\u003e添加一个新的预设\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003eprompt add -n {name} -c {content}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e参数:\u003cbr/\u003e\n必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ename: 预设名称\u003c/li\u003e\n\u003cli\u003econtent: 预设内容\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"删除一个预设\"\u003e删除一个预设\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003eprompt del -n {name}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e参数:\u003cbr/\u003e\n必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ename: 预设名称\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"查看预设列表\"\u003e查看预设列表\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003eprompt list ( -p {num} )\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e参数:\u003cbr/\u003e\n选填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003enum: 页数\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"查看特定预设具体内容\"\u003e查看特定预设具体内容\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003eprompt show -n {name}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e参数:\u003cbr/\u003e\n必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ename: 预设名称\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"指令\"\u003e指令\u003c/h4\u003e\n\u003ch5 id=\"添加一个新的指令\"\u003e添加一个新的指令\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003ecommand add -n {name} -c {content}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e参数:\u003cbr/\u003e\n必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ename: 指令名称\u003c/li\u003e\n\u003cli\u003econtent: 指令内容\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"删除一个指令\"\u003e删除一个指令\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003ecommand del -n {name}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e参数:\u003cbr/\u003e\n必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ename: 指令名称\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"查看指令列表\"\u003e查看指令列表\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003ecommand list ( -p {num} )\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e参数:\u003cbr/\u003e\n选填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003enum: 页数\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"查看特定指令具体内容\"\u003e查看特定指令具体内容\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003ecommand show -n {name}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e参数:\u003cbr/\u003e\n必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ename: 指令名称\u003c/li\u003e\n\u003c/ol\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://canxin121.github.io/p/sparkgpt/"},{"title":"SparkGPT 思路分析","time":"2023-09-10T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"项目地址---spark-gpthttpsgithubcomcanxin121spark-gpt\"\u003e项目地址 -\u0026gt; \u003ca class=\"link\" href=\"https://github.com/canxin121/Spark-GPT\" target=\"_blank\" rel=\"noopener\"\u003eSpark-GPT\u003c/a\u003e\u003c/h2\u003e\n\u003ch2 id=\"nonebot框架\"\u003eNonebot框架\u003c/h2\u003e\n\u003cp\u003e由于SparkGPT由Python开发, 在Python中运行, 而Python目前最佳的bot框架为Nonebot框架,所以 目前2.0.0版本深度绑定Nonebot框架进行开发.\u003c/p\u003e\n\u003cp\u003e预计将在下个大版本 将SparkGPT独立实现协议, 再实现不同语言框架的协议对接\u003c/p\u003e\n\u003ch2 id=\"配置管理\"\u003e配置管理\u003c/h2\u003e\n\u003ch3 id=\"webui\"\u003ewebui\u003c/h3\u003e\n\u003cp\u003e实现了\u003ccode\u003eNonebot_plugin_web_config\u003c/code\u003e来是实现webui管理配置信息, 借助pydantic的\u003ccode\u003eBaseModel\u003c/code\u003e来实现序列化反序列化并持久储存和方便的存取.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eNonebot_plugin_web_config\u003c/code\u003e提供了一个父类给其他插件,直接继承并填写相关注释和属性即可实现持久储存和web编辑, 并且提供了从\u003ccode\u003eNonebot_plugin_web_config\u003c/code\u003e实时获取配置的方法,而无需重新反序列化.\u003c/p\u003e\n\u003cp\u003eToDo:\u003cbr/\u003e\n预计将会实现pydantic -\u0026gt; json schema的转换用于通信, 并重写前端页面\u003c/p\u003e\n\u003ch2 id=\"数据储存\"\u003e数据储存\u003c/h2\u003e\n\u003ch3 id=\"用户会话数据储存\"\u003e用户会话数据储存\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e使用pydantic的\u003ccode\u003eBaseModel\u003c/code\u003e方便 序列化和反序列化\u003c/li\u003e\n\u003cli\u003e使用\u003ccode\u003eNonebot_plugin_bind\u003c/code\u003e的统一id作为用户标志储存, 实现跨平台跨账户的数据共享\u003c/li\u003e\n\u003cli\u003e所有的会话数据以json形式储存在以用户id命名的文件中, 单用户单数据, 保证数据的隔断性\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"预设指令模型数据\"\u003e预设,指令,模型数据\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e继承自\u003ccode\u003eNonebot_plugin_web_config\u003c/code\u003e提供的父类, 直接实现了持久储存和webui编辑\u003c/li\u003e\n\u003cli\u003e实现了一个装饰器, 方便的给每个子类生成一个从\u003ccode\u003eNonebot_plugin_web_config\u003c/code\u003e获取数据的方法\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"消息事件处理\"\u003e消息事件处理\u003c/h2\u003e\n\u003ch3 id=\"消息接受\"\u003e消息接受\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e依赖\u003ccode\u003eNonebot_plugin_alconna\u003c/code\u003e进行命令形式的消息事件匹配,分发给不同的函数进行处理\u003c/li\u003e\n\u003cli\u003e实现\u003ccode\u003eNonebot_plugin_bind\u003c/code\u003e 进行不同账户(可跨平台)信息的绑定, 将同一人的所有聊天平台的数据统一起来\u003c/li\u003e\n\u003cli\u003e实现了会话的持久储存和一个从信息中获取会话依赖注入, 可以从一条信息中获取用户私有的或公有的会话, 分发给不同模型的Chatbot处理\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"回复生成\"\u003e回复生成\u003c/h3\u003e\n\u003ch4 id=\"模型回复\"\u003e模型回复\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e实现\u003ccode\u003eBaseChatBot\u003c/code\u003e父类, 实现使用 异步生成器 实现 流式发送(每次发送消息的两段左右,如果平台支持编辑消息,那么直接加到原来的消息后面,否则发送新的消息) 和 一次性发送(可以自适应长度文转图转链接, 也可以强制设定使用文字或图片回复), 这里其实就是消息发送的步骤.\u003c/li\u003e\n\u003cli\u003e所有的\u003ccode\u003eChatBot\u003c/code\u003e子类只需添加特有的属性(用于储存会话信息)和\u003ccode\u003eBaseChatBot\u003c/code\u003e父类要求的属性, 以及一个异步生成器方法(逆向或使用官方api)和一个刷新会话方法, 即可实现一个新的api的接入\u003c/li\u003e\n\u003cli\u003e涉及的实现的逆向工程的链接\u0026#34; \u003ca class=\"link\" href=\"https://github.com/canxin121/Async-Bing-Client\" target=\"_blank\" rel=\"noopener\"\u003eAsync-Bing-Client\u003c/a\u003e “, \u0026#34; \u003ca class=\"link\" href=\"https://github.com/canxin121/Async-Poe-Client\" target=\"_blank\" rel=\"noopener\"\u003eAsync-Poe-Client\u003c/a\u003e “, \u0026#34; \u003ca class=\"link\" href=\"https://github.com/canxin121/Async-Claude-Client\" target=\"_blank\" rel=\"noopener\"\u003eAsync-Claude-Client\u003c/a\u003e \u0026#34;\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"普通回复\"\u003e普通回复\u003c/h4\u003e\n\u003ch5 id=\"菜单和帮助\"\u003e菜单和帮助\u003c/h5\u003e\n\u003col\u003e\n\u003cli\u003e实现了Nonebot_plugin_templates, 提供一些模板和构造方法, 直接构造出菜单的html并用htmlrender渲染截图返回结果.\u003c/li\u003e\n\u003cli\u003e实现了一个Menu类来将 文本菜单 和 Nonebot_plugin_templates生成的菜单同时实现, 并且缓存图片, 减小开销, 提高效率\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"基本查看和管理\"\u003e基本查看和管理\u003c/h5\u003e\n\u003col\u003e\n\u003cli\u003echat的list在\u003ccode\u003e用户会话数据储存类\u003c/code\u003e的基础上加了一个方法, 并借助Nonebot_plugin_templates生成 会话的列表图片并缓存和动态更新, 减少开销, 提升效率\u003c/li\u003e\n\u003cli\u003eprompt和command的图片回复在\u003ccode\u003eNonebot_plugin_web_config\u003c/code\u003e的子类的基础上借助Nonebot_plugin_templates实现图片列表和具体展示\u003c/li\u003e\n\u003cli\u003e其他文本形式的回复直接发送即可\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"消息发送\"\u003e消息发送\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e依赖\u003ccode\u003eNonebot_plugin_saa\u003c/code\u003e进行跨适配器(跨聊天平台)的发送消息,可以实现图文发送\u003c/li\u003e\n\u003cli\u003e依赖\u003ccode\u003eNonebot_plugin_htmlrender\u003c/code\u003e进行文转图, 实质上就是使用playwright使用我的自制模板进行前端渲染并截图\u003c/li\u003e\n\u003cli\u003e使用 \u003ccode\u003edpaste.org\u003c/code\u003e 的 逆向api 进行文转网络剪切板链接, 方便用户拿去回答和信息\u003c/li\u003e\n\u003c/ol\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://canxin121.github.io/p/sparkgpt-%E6%80%9D%E8%B7%AF%E5%88%86%E6%9E%90/"},{"title":"SparkGPT 预览","time":"2023-09-10T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"项目地址---spark-gpthttpsgithubcomcanxin121spark-gpt\"\u003e项目地址 -\u0026gt; \u003ca class=\"link\" href=\"https://github.com/canxin121/Spark-GPT\" target=\"_blank\" rel=\"noopener\"\u003eSpark-GPT\u003c/a\u003e\u003c/h2\u003e\n\u003ch2 id=\"sparkgpt使用示例\"\u003eSparkGPT使用示例\u003c/h2\u003e\n\u003ch2 id=\"webui\"\u003eWebui\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/webui.png\" width=\"2560\" height=\"1363\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/webui_hudfc518bf0e3dff5f58a40d0e9292d707_109343_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/webui_hudfc518bf0e3dff5f58a40d0e9292d707_109343_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"使用webui配置相关信息 \" class=\"gallery-image\" data-flex-grow=\"187\" data-flex-basis=\"450px\"/\u003e\u003c/p\u003e\n\u003ch2 id=\"帮助\"\u003e帮助\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/shelp.png\" width=\"576\" height=\"543\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/shelp_hu944c3e2c5f8f713cb74e42c3e320bf12_505859_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/shelp_hu944c3e2c5f8f713cb74e42c3e320bf12_505859_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 获取帮助说明 \" class=\"gallery-image\" data-flex-grow=\"106\" data-flex-basis=\"254px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/help.png\" width=\"1103\" height=\"1104\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/help_hu251595a42a1b5b8f82ad76b655cf6edf_1104940_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/help_hu251595a42a1b5b8f82ad76b655cf6edf_1104940_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 获取某个命令的子命令格式 \" class=\"gallery-image\" data-flex-grow=\"99\" data-flex-basis=\"239px\"/\u003e\u003c/p\u003e\n\u003ch2 id=\"模型\"\u003e模型\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/model_list.png\" width=\"573\" height=\"537\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/model_list_hu23029734091389392b7f3cc6c00ab338_504350_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/model_list_hu23029734091389392b7f3cc6c00ab338_504350_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 获取所有模型 \" class=\"gallery-image\" data-flex-grow=\"106\" data-flex-basis=\"256px\"/\u003e\u003c/p\u003e\n\u003ch2 id=\"会话\"\u003e会话\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_list.png\" width=\"659\" height=\"706\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_list_hu0073cb7dda307cc6b080e3dc900b34a8_691617_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_list_hu0073cb7dda307cc6b080e3dc900b34a8_691617_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 获取所有会话 \" class=\"gallery-image\" data-flex-grow=\"93\" data-flex-basis=\"224px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/private_chat.png\" width=\"655\" height=\"1100\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/private_chat_hud4482fb84500528454f3593a7514105d_1059521_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/private_chat_hud4482fb84500528454f3593a7514105d_1059521_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 创建一个新的私有会话并使用 \" class=\"gallery-image\" data-flex-grow=\"59\" data-flex-basis=\"142px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/public_chat.png\" width=\"639\" height=\"767\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/public_chat_hub91b792aa6ea24cd0e152fda59917491_555628_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/public_chat_hub91b792aa6ea24cd0e152fda59917491_555628_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 创建一个新的公有会话并使用 \" class=\"gallery-image\" data-flex-grow=\"83\" data-flex-basis=\"199px\"/\u003e\u003cbr/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_del.png\" width=\"653\" height=\"278\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_del_hu470a197b58cd883b82a911a603d25821_243419_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_del_hu470a197b58cd883b82a911a603d25821_243419_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 删除一个会话 \" class=\"gallery-image\" data-flex-grow=\"234\" data-flex-basis=\"563px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_edit.png\" width=\"657\" height=\"303\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_edit_hued1d147889be06e39648a664af08d1ad_225903_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_edit_hued1d147889be06e39648a664af08d1ad_225903_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 编辑一个会话 \" class=\"gallery-image\" data-flex-grow=\"216\" data-flex-basis=\"520px\"/\u003e\u003c/p\u003e\n\u003ch2 id=\"预设\"\u003e预设\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_list.png\" width=\"636\" height=\"575\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_list_hu2a03ea50776fff542bb050407f9d74b3_517821_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_list_hu2a03ea50776fff542bb050407f9d74b3_517821_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 获取所有预设缩略信息 \" class=\"gallery-image\" data-flex-grow=\"110\" data-flex-basis=\"265px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_show.png\" width=\"645\" height=\"643\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_show_hue285e6203402b430e11d1ef58ecd77df_404262_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_show_hue285e6203402b430e11d1ef58ecd77df_404262_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 查看某个预设 \" class=\"gallery-image\" data-flex-grow=\"100\" data-flex-basis=\"240px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_add.png\" width=\"638\" height=\"294\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_add_hu8d9c1abd7b76c69a4f57521c2565bb16_195901_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_add_hu8d9c1abd7b76c69a4f57521c2565bb16_195901_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 添加新的预设 \" class=\"gallery-image\" data-flex-grow=\"217\" data-flex-basis=\"520px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_del.png\" width=\"646\" height=\"304\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_del_hu0c533b535e009a9a041576f870965eb8_279579_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_del_hu0c533b535e009a9a041576f870965eb8_279579_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 删除一个预设 \" class=\"gallery-image\" data-flex-grow=\"212\" data-flex-basis=\"510px\"/\u003e\u003c/p\u003e\n\u003ch2 id=\"指令\"\u003e指令\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_list.png\" width=\"658\" height=\"309\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_list_hudf42e09201443fce7f9a642b48866969_274942_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_list_hudf42e09201443fce7f9a642b48866969_274942_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 获取所有指令缩略信息 \" class=\"gallery-image\" data-flex-grow=\"212\" data-flex-basis=\"511px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_show.png\" width=\"636\" height=\"541\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_show_huaa6fe30c97db4a6fbb3f7b189f90ba8e_310978_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_show_huaa6fe30c97db4a6fbb3f7b189f90ba8e_310978_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 查看某个指令 \" class=\"gallery-image\" data-flex-grow=\"117\" data-flex-basis=\"282px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_add.png\" width=\"654\" height=\"315\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_add_hucf6b8b789b7e075a413aee63eed81613_210970_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_add_hucf6b8b789b7e075a413aee63eed81613_210970_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 添加新的指令 \" class=\"gallery-image\" data-flex-grow=\"207\" data-flex-basis=\"498px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_del.png\" width=\"649\" height=\"292\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_del_hu4ae45de794030bbc9548e0c4cd8cbc9e_260364_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_del_hu4ae45de794030bbc9548e0c4cd8cbc9e_260364_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 删除一个指令 \" class=\"gallery-image\" data-flex-grow=\"222\" data-flex-basis=\"533px\"/\u003e\u003c/p\u003e\n\u003ch2 id=\"群二维码\"\u003e群二维码\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/qrcode.png\" width=\"1284\" height=\"2283\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/qrcode_hu51b203c4463a8d8fd4df1bc6f83211bb_239525_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/qrcode_hu51b203c4463a8d8fd4df1bc6f83211bb_239525_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" class=\"gallery-image\" data-flex-grow=\"56\" data-flex-basis=\"134px\"/\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/"},{"title":"归档","time":"2022-03-06T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://canxin121.github.io/archives/"},{"title":"Led灯控制(Usart)","time":"0001-01-01T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"cpp中的重定向printf\"\u003eCPP中的重定向printf\u003c/h2\u003e\n\u003cp\u003ecpp不允许重定义 =\u0026gt; 不按照cpp规则编译即可\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eextern\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;C\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003efputc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eFILE\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ef\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"led控制亮度--led-类\"\u003eLED控制亮度 =\u0026gt; LED 类\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 74\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 75\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 76\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 77\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 78\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 79\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 80\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 81\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 82\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 83\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 84\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 85\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 86\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 87\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 88\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 89\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 90\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 91\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 92\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 93\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 94\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 95\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 96\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 97\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 98\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 99\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e100\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e101\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e102\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e103\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e104\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e105\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e106\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e107\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e108\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e109\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e110\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e111\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e112\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e113\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e114\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e115\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e116\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e117\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e118\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e119\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e120\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e121\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e122\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e123\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e124\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e125\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e126\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e127\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e128\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e129\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e130\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e131\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e132\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e133\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e134\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e135\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e136\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e137\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e138\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e139\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e140\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e141\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e142\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e143\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eLed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eprivate\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTIM_HandleTypeDef\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003e__htim__\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003e__ch__\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003e__max__\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e255\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003e__diff__\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eCrtTask\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ecrt\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eLed\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eTIM_HandleTypeDef\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__htim__\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ehtim\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__ch__\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__HAL_TIM_SET_COMPARE\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e__htim__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003e__ch__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ecompare\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompare\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecompare\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompare\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003e__max__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecompare\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003e__max__\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecrt\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecompare\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__HAL_TIM_SetCompare\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e__htim__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003e__ch__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecompare\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtTask\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003etoggle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ecompare\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecrt\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompare\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"nf\"\u003eminus\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ediff\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecrt\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecrt\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ediff\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"nf\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ediff\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecrt\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003e__max__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecrt\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003ediff\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"nf\"\u003eTryBreath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ediff\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"n\"\u003ealways\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eswitch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ediff\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eminus\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ediff\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ealways\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003esetTask\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003etask\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtTask\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etask\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eexecTask\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eswitch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCrtTask\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e__diff__\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eminus\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e__diff__\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTryBreath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e__diff__\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTryBreath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e__diff__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"led类--led-array-类\"\u003eLED类 =\u0026gt; LED Array 类\u003c/h2\u003e\n\u003cp\u003e简单的将上面的LED用array来 遍历 控制。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e74\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003etemplate\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003esize_t\u003c/span\u003e \u003cspan class=\"n\"\u003eN\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eLedArray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003estd\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eN\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003e__size__\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eLedArray\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estd\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eN\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003eleds\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eleds\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"n\"\u003e__size__\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eN\u003c/span\u003e\u003cspan class=\"p\"\u003e){};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"n\"\u003eLedArray\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nl\"\u003eled\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eled\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eresetAll\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nl\"\u003eled\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eled\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eprintCompares\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nl\"\u003eled\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;index: %d, compare: %d\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eled\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecrt\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003esetCompares\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e[])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecustomAssert\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egetArrayLength\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"n\"\u003e__size__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eComparison\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eEqual\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nl\"\u003eled\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eled\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003etoggleLeds\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e[])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecustomAssert\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egetArrayLength\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"n\"\u003e__size__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eComparison\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eEqual\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nl\"\u003eled\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eled\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etoggle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003esetTasks\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e[])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecustomAssert\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egetArrayLength\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"n\"\u003e__size__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eComparison\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eEqual\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nl\"\u003eled\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eled\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esetTask\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eexecTasks\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nl\"\u003eled\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eled\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexecTask\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"延时执行类-delay\"\u003e延时执行类 Delay\u003c/h2\u003e\n\u003cp\u003e为了实现 流水 效果, 需要延时(每隔几次运行一次)来执行\u003c/p\u003e\n\u003cp\u003ehpp\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eDelay\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003edelayTimes\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"n\"\u003efirst\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003ectn\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"nf\"\u003eexceed\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eprivate\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003e__delay_times__\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003e__crt_times__\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003ecpp\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003edelayTimes\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"n\"\u003efirst\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__delay_times__\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edelayTimes\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"n\"\u003e__crt_times__\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edelayTimes\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"o\"\u003e::~\u003c/span\u003e\u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__delay_times__\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__crt_times__\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003ectn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__crt_times__\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eexceed\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e__crt_times__\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"n\"\u003e__delay_times__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ectn\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e## 串口屏控制(状态控制和直接控制)\n这里的状态一是Crt_Main_Task, 也就写了个流水,二是每个灯独立的状态控制,用到的也就一个 呼吸。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e62\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003ereset_whole\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrt_Main_Task\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtLedIndex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eledarray\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eresetAll\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003edelay_20\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_RxCpltCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eUART_HandleTypeDef\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__HAL_UART_CLEAR_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_CLEAR_IDLEF\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__HAL_UART_DISABLE_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_IT_TXE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrt_Main_Task\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eswitch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 全关复位\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x01\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ereset_whole\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 设置亮度\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x02\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eledarray\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esetCompares\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 亮灭互转且设置亮度\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x03\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003etoggles\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003etoggles\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eledarray\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etoggleLeds\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etoggles\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 呼吸(逐渐亮/暗)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x04\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eledarray\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esetTasks\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 流水呼吸\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x05\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrt_Main_Task\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这个函数用来处理各led的顺序大小然后重新排序\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003esortVectorByValue\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBlink_Leds\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBlink_Cnt\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__HAL_UART_ENABLE_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_IT_TXE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eHAL_UART_Receive_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e9\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__HAL_UART_FLUSH_DRREGISTER\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__HAL_UART_CLEAR_FLAG\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_FLAG_RXNE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e上面的sortVectorByValue,这直接 Ai 写吧,先排个序然后再判断相邻的是不是相等就行了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003esortVectorByValue\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"n\"\u003evec\u003c/span\u003e\u003cspan class=\"p\"\u003e[],\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003esize\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003esortedIndices\u003c/span\u003e\u003cspan class=\"p\"\u003e[][\u003c/span\u003e\u003cspan class=\"n\"\u003eMAX_SIZE\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eMAX_SIZE\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eMAX_SIZE\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003esortedIndices\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ePair\u003c/span\u003e \u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eMAX_SIZE\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esize\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003evec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003estd\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003esort\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003esize\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecompareByValue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003esubArray\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eMAX_SIZE\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003esubCount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eprevValue\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esize\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eprevValue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003esubArray\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003esubCount\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esubCount\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003esortedIndices\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esubArray\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003esubCount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003esubArray\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003esubCount\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eprevValue\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esubCount\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003esortedIndices\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esubArray\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"定时执行执行状态对应的任务\"\u003e定时执行(执行状态对应的任务)\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_PeriodElapsedCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eTIM_HandleTypeDef\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim2\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 执行Crt_Main_Task对应的任务,这个其实可以再拆一个 类 出来,但是没有更多功能要写,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 先扔这里了。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eswitch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCrt_Main_Task\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 延时开启下一组led的呼吸任务\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edelay_20\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexceed\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCrtLedIndex\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"n\"\u003eBlink_Cnt\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtLedIndex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nl\"\u003eindex\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eBlink_Leds\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eCrtLedIndex\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003eindex\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eledarray\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003esetTask\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtLedIndex\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 执行所有的led的任务\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eledarray\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexecTasks\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 隔一段时间输出一下led的状态\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edelay_30\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexceed\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eledarray\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eprintCompares\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://canxin121.github.io/p/led%E7%81%AF%E6%8E%A7%E5%88%B6usart/"},{"title":"链接","time":"0001-01-01T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://canxin121.github.io/%E9%93%BE%E6%8E%A5/"},{"title":"搜索","time":"0001-01-01T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://canxin121.github.io/search/"}]}],"update":"2024-04-07T04:26:58.384153196Z"} \ No newline at end of file +{"version":1,"author":[{"name":"神社的储物间","email":"","uri":"https://mxts.jiujiuer.xyz/","description":"*节操消失了*","article":[{"title":"API压测笔记","time":"2024-03-18T14:41:07Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003eAPI的压力测试是业务上线前的重要环节,也是对系统性能的一个量化测量,对实际业务诸方面都有重要的参考价值。\u003c/p\u003e\u003cp\u003e这里主要说说API压测的方法和常用手段。\u003c/p\u003e\u003ch2 id=\"压测方法\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/03/18/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/API%E5%8E%8B%E6%B5%8B%E7%AC%94%E8%AE%B0/#%E5%8E%8B%E6%B5%8B%E6%96%B9%E6%B3%95\" class=\"headerlink\" title=\"压测方法\"\u003e\u003c/a\u003e压测方法\u003c/h2\u003e\u003cul\u003e\u003cli\u003ego benchmark\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e如果是golang后端,可以直接手写测试用例,然后使用go工具链自带的benchmark进行压测。\u003c/p\u003e\u003cul\u003e\u003cli\u003eApacheBench\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。\u003c/p\u003e\u003cp\u003e安装\u003ccode\u003eapache2-utils\u003c/code\u003e即可在系统上使用\u003ccode\u003eab\u003c/code\u003e命令。\u003c/p\u003e\u003cp\u003e作为演示,使用ab测试一个GET接口:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eab -n 2000 -c 1200 \u003cspan class=\"string\"\u003e\u0026#34;http://127.0.0.1:9999/get_result?a=10\u0026amp;b=20\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003en: 测试轮次\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003ec: 客户端数量\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003eT: 内容类型\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003ep: 包含post参数的文件\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e引号是必须的\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003ewrk\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e一个C编写的API压测工具\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003ewrk -t10 -c100 -d10s http://localhost:8080/api/users \u003cspan class=\"comment\"\u003e# 使用10个线程,100并发数,测试持续10s\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"开测\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/03/18/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/API%E5%8E%8B%E6%B5%8B%E7%AC%94%E8%AE%B0/#%E5%BC%80%E6%B5%8B\" class=\"headerlink\" title=\"开测\"\u003e\u003c/a\u003e开测\u003c/h2\u003e\u003cp\u003e我最后还是选了\u003ccode\u003ewrk\u003c/code\u003e做压测\u003cdel\u003e因为ab装不上\u003c/del\u003e\u003c/p\u003e\u003cp\u003e测试接口是\u003ccode\u003ePOST http://localhost:8080/api/calc/mul\u003c/code\u003e,payload是一个2*n的json格式的二维数组。\u003c/p\u003e\u003cp\u003e测试指令:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003ewrk -t 20 -c 10000 -d 180s -s bench.lua --latency \u003cspan class=\"string\"\u003e\u0026#34;http://localhost:8080/api/calc/mul\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e## bench.lua\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewrk.method = \u003cspan class=\"string\"\u003e\u0026#34;POST\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewrk.body = \u003cspan class=\"string\"\u003e\u0026#34;[[1,2,3,1],[4,5,7,8]]\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewrk.headers[\u003cspan class=\"string\"\u003e\u0026#39;Content-Type\u0026#39;\u003c/span\u003e] = \u003cspan class=\"string\"\u003e\u0026#34;application/json\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e测试结果如下:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003exeonds@ark-station:~/code/vec-calculator-server$ make bench \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e build \u0026amp;\u0026amp; ./vec-calc-web-linux-amd64-1.0.0 \u0026amp; \u003cspan class=\"built_in\"\u003esleep\u003c/span\u003e 1 \u0026amp;\u0026amp; \\\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewrk -t 20 -c 10000 -d 180s -s bench.lua --latency \u003cspan class=\"string\"\u003e\u0026#34;http://localhost:8080/api/calc/mul\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eRunning 3m \u003cspan class=\"built_in\"\u003etest\u003c/span\u003e @ http://localhost:8080/api/calc/mul\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 20 threads and 10000 connections\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Thread Stats Avg Stdev Max +/- Stdev\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Latency 61.27ms 62.15ms 1.46s 93.06%\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Req/Sec 9.74k 1.33k 22.11k 71.75%\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Latency Distribution\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 50% 48.47ms\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 75% 66.32ms\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 90% 90.10ms\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 99% 364.05ms\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 34884275 requests \u003cspan class=\"keyword\"\u003ein\u003c/span\u003e 3.00m, 4.35GB \u003cspan class=\"built_in\"\u003eread\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eRequests/sec: 193693.29\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTransfer/sec: 24.75MB\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e测试平台是\u003ccode\u003eIntel Core i7-12700H\u003c/code\u003e,可以看到并发在\u003ccode\u003e1,0000\u003c/code\u003e的时候,Gin的性能还是不错的,TPS保持在了19万的水准。\u003c/p\u003e\u003ch2 id=\"碎碎念\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/03/18/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/API%E5%8E%8B%E6%B5%8B%E7%AC%94%E8%AE%B0/#%E7%A2%8E%E7%A2%8E%E5%BF%B5\" class=\"headerlink\" title=\"碎碎念\"\u003e\u003c/a\u003e碎碎念\u003c/h2\u003e\u003cp\u003e该说不该说呢,以前我认为语言就是由语法和编译器/解释器构成,但是Golang这样从语法上支持一个feature的行为让我疑惑:语言的标准库该不该算是语言特性的一部分?\u003c/p\u003e\u003cp\u003e\u003ccode\u003ego\u003c/code\u003e这个关键字作为一个大大的语法糖,似乎在打破语言的库和语言本身的分界线。我也无从知晓这一方向的尽头是什么。\u003c/p\u003e\u003ch2 id=\"Reference\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/03/18/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/API%E5%8E%8B%E6%B5%8B%E7%AC%94%E8%AE%B0/#Reference\" class=\"headerlink\" title=\"Reference\"\u003e\u003c/a\u003eReference\u003c/h2\u003e\u003cul\u003e\u003cli\u003e\u003ca href=\"https://zhuanlan.zhihu.com/p/609348456\"\u003eAPI性能测试指标以及压测方式 - 最难不过二叉树 - 知乎\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://golang.cx/go/golang%E5%8E%8B%E6%B5%8B.html\"\u003egolang压测\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://www.digitalocean.com/community/tutorials/how-to-benchmark-http-latency-with-wrk-on-ubuntu-14-04\"\u003eHow To Benchmark HTTP Latency with wrk on Ubuntu 14.04 - DigitalOcean\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://stackoverflow.com/questions/15261612/post-request-with-wrk\"\u003ePOST request with wrk? - StackOverflow\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/issues/267\"\u003eCan I disable gin’s stdout? - GitHub Issue\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2024/03/18/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/API%E5%8E%8B%E6%B5%8B%E7%AC%94%E8%AE%B0/"},{"title":"青岛之行","time":"2024-01-18T05:53:51Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"第0天-西安市长安区\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/18/%E6%96%87%E5%AD%A6/%E6%B8%B8%E8%AE%B0/trip-to-tsingdao/#%E7%AC%AC0%E5%A4%A9-%E8%A5%BF%E5%AE%89%E5%B8%82%E9%95%BF%E5%AE%89%E5%8C%BA\" class=\"headerlink\" title=\"第0天-西安市长安区\"\u003e\u003c/a\u003e第0天-西安市长安区\u003c/h2\u003e\u003cp\u003e这个考试月是真能破人的防,所以哥们考完试直接开润,好好抚慰以一下难绷的心智。跟哥们合计了一下,寻思着\u003cdel\u003e去码头整点薯条\u003c/del\u003e然后就有了去青岛溜达一圈的打算。\u003c/p\u003e\u003cp\u003e现在是1.18,早上随便叼个面包,拉着箱子就走了。今天早上西安的雾气挺大的,走的时候大概9点,门口不少拉箱子回家的大学生,看了一眼感觉不少大三老东西,还有一些大一大二一看就没在校门口坐过公交的。\u003c/p\u003e\u003cp\u003e时间过得真快啊,还没多久就只剩一年半了。\u003c/p\u003e\u003cp\u003e抛开有的没的,到站下车转地铁,6倒2到北站等火车。以及再次,西安北站真tm大。\u003c/p\u003e\u003cp\u003e顺利和彦汇合上,俩人就坐下来开始侃大山,路上风景倒是不错。刚开始计划的路线里边是经过郑州的,不过后来换了D1672然后就不走那边了,现在的路线是西安-\u0026gt;太原-\u0026gt;石家庄-\u0026gt;德州-\u0026gt;济南-\u0026gt;青岛。全程从11点到晚上9点,车程比较长。\u003c/p\u003e\u003cp\u003e在动车上跟哥们干了各种事消磨时间:看时间,聊二次元等等等等,\u003cdel\u003e听得我都想入坑ba了\u003c/del\u003e。\u003c/p\u003e\u003cp\u003e下了车之后直接进了地铁站,七拐八拐到了酒店。这边地铁修的比较新,所以装潢还挺新的。\u003c/p\u003e\u003cp\u003e出了站之后走了点路就到了酒店。俩人一进酒店就开始开香槟,30块一晚上是这住宿条件:\u003c/p\u003e\u003cp\u003e更香槟开爆的一集:30多跟哥们恰烧烤外卖恰到撑。老陕震撼.jpg,这边伙食是真不戳。\u003c/p\u003e\u003cp\u003e就是晚上1点多给另一个哥们写代码到早上3点有点难绷\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e彦:熬夜别似我旁边\u003cbr/\u003e我:无所谓我收入高\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"第1天-青岛海军博物馆-amp-杂七杂八\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/18/%E6%96%87%E5%AD%A6/%E6%B8%B8%E8%AE%B0/trip-to-tsingdao/#%E7%AC%AC1%E5%A4%A9-%E9%9D%92%E5%B2%9B%E6%B5%B7%E5%86%9B%E5%8D%9A%E7%89%A9%E9%A6%86-amp-%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB\" class=\"headerlink\" title=\"第1天-青岛海军博物馆\u0026amp;杂七杂八\"\u003e\u003c/a\u003e第1天-青岛海军博物馆\u0026amp;杂七杂八\u003c/h2\u003e\u003cp\u003e第二天\u003cdel\u003e起了个大早\u003c/del\u003e九点准时起床,身体好像已经习惯六小时睡眠了。简单收拾之后就准备出发去看看船了。放6年前彦估计更兴奋,毕竟他玩碧蓝航线。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e哎,泛二刺螈。哦,他现在玩Blue Archive。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e笑死,早起根本没用。俩人还是差点迟了。最骚的操作是我们发现时间可能赶不上然后俩啥必退票准备换时间,然后发现别的时间都满了。\u003c/p\u003e\u003cp\u003etmd吓个半死,赶紧给重新定回那个时间。俩人跟俩萝卜一样,一人一个坑给剩下俩位置占满了。\u003c/p\u003e\u003cp\u003e不管时间是不是来不及,俩人开始往过疯狂冲刺。趁着上车的间隙,算了一下时间,刚好剩了3分钟,所幸最后没迟到。\u003c/p\u003e\u003cp\u003e路上路过一片小区,人建筑风格特别欧式,一度以为是殖民地残留,被哥们吐槽了。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e彦:你这得让青岛人笑话死\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e赶时间所以没想到啥吐槽。穿过博物馆大厅,从扶梯下去,就是海边了。大厅后边就是黄海的海岸线了,码头停了不少待参观的船,潜艇,还有\u003cdel\u003e来码头整点薯条的\u003c/del\u003e海鸥,不过这会的我显然还没有意识到青岛的海风自带湿冷的魔法攻击。\u003c/p\u003e\u003cp\u003e没顾得上拍照,赶紧跟着哥们跑去核潜艇参观区域。俩人兴冲冲跟着引导员走到潜艇入口,准备从入口进去。不过刚进去入口的时候我就觉得不对劲了:被狠狠磕了一下脑袋。然后我才注意到,这潜艇里边的环境是真tm狭小。里边是不允许拍照的,所以这部分没有图图。很震撼,有种纯粹工业风的美感,而且还能看到生产日期跟自己爸妈一个年龄的各种粗扩庞大\u003cdel\u003e不知道能干啥\u003c/del\u003e不可名状的巨大机械/管道,元素相当丰富。整体而言,环境相当压抑。居住区空间极小,而且是两层乃至三层的卧铺,躺床上只能看到压抑的上铺床板。更离谱的是,各个区域之间的连通通道不是门结构,而是环状圆盘盖子结构。想了半天,原因可能是为了进一步保证气密/作为一种空间隔断手段而使用,以至于人过去是要钻过去的——我自己身高1米8多,已经不是脑袋磕的疼不疼的问题了,那是我弯腰过去会被卡在门上的问题。不过也能理解,毕竟从外边看体积本来就小,里边的空间更是寸土寸金。另外还看到唯一一个很大的房子,俺猜测应该是船长/政委的?另外就是这个核动力潜艇很明显属于那种过于落后可以展示的那种,现在的潜艇长啥样子我根本不敢想象。以及这玩意的制造时间也跟我印象里边那会还在为造拖拉机发愁的轻工业为主的年代严重不符——现在回望那会的前辈,相当厉害。快60年前的东西,都能带给我如此巨大的震撼。这种旧时代的堪称疯狂的造物是我非常喜爱的,因为这背后是一个集体倾尽全力所能创造的工程学奇迹。其他宏伟的古早人工造物,比如早些时代的防空洞,那些旧时代的大型工厂,都是我的偏爱。\u003c/p\u003e\u003cp\u003e就是里边一些现代化电子设备比较出戏。我甚至还看到一个生产日期挺新的电风扇。\u003c/p\u003e\u003cp\u003e另外一点我想展开说的就是,重工业风。生活中很难见到特别粗的管道,这边有,而且尺寸范围相当大。但是你放工厂我会欣赏,放正常过道两边甚至头顶,盖得你看不到一个平整的仓壁,那就是幽闭恐惧症级别的地狱绘图了。墙上和地上,不是覆盖着,那几乎是管道和数量巨大的阀门、仪表拼接而成,被挤压的只剩下常人几乎不可能迅速通过的极度不规则的逼仄空间。另外我找了半天愣是没找到一个窗户,在这种暗无天日的地方关上不知道多久,一般人在这种地方肯定会疯。而且,潜艇的战略地位,也昭示着潜艇兵的命运:不存在侥幸,深海出故障的情况下,只有死亡这一既定而缓慢但恒定到来的命运。现代核潜艇更是战略级别的威慑,他们所面对的任何一种情况都是极度恐怖的。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e彦:这地方你待上没几天就幽闭恐惧症了\u003cbr/\u003e我:难怪人补贴空军之下第一档呢,这我是真服\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e最逆天的地方来了。俩人参观完核动力部分,在看主电机的时候,里边照明电路突然断电了。以潜艇的封闭程度,一瞬间里边就陷入一片死黑。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e我:啊?\u003cbr/\u003e彦:啊??\u003cbr/\u003e我:啊???\u003cbr/\u003e彦:啊????\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e所幸,大概十几秒后供电又恢复力。不过这一段时间对我来说长如极夜。那一刻俩啥必都以为自己要被关里头了,怂的跟受惊的兔子似的。应该是拉闸老大爷听到我俩动静了,又上电问里边有人没。俩人赶紧从出口窜出去了。\u003c/p\u003e\u003cp\u003e最哈人的一集。\u003c/p\u003e\u003cp\u003e出去之后俩人缓了会,然后上旁边开始今天的观景了。\u003c/p\u003e\u003cp\u003e首先是济南舰,最后是长江舰。中间回去休息了一下,看到底下一架遮住的飞机,还惊喜了半天。彦不屑一顾,我诧异半天才想起来人是瓜,啊不,三航爷。\u003c/p\u003e\u003cp\u003e下午拍了一组片子,顺便跟他玩了玩胶片机之后,俩人就出来去信号山旁边一个小地方恰了饭。28一份的土豆牛肉盖饭,好贵……不过胜在离景点近。可惜的是那会德国监狱旧址已经关门了,俩人就去爬旁边信号山了。有一说一,上边视野不错,也出了不少很满意的片。\u003c/p\u003e\u003cp\u003e最给力的是这俩老鸽:\u003c/p\u003e\u003cp\u003e亮灯之后拍了不少,遗憾的是树杈子太挡视野了,不太好出片。以及某人痛定思痛决定回头整个脚架。不过那边有不少望远镜,挺稳的,就是要扫码才能用。所以俩人直接用这玩意当脚架平替了。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e彦:纯,太纯了(陶醉\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e之后俩人坐地铁打算去那家甜甜烧烤,可惜让百度地图坑了一回,从台北街道绕了一圈到人旧址了。找到之后发现人就在起点附近。更离谱的是进去只有一个空座,上二楼发现没位置结果下来一楼也满了。红温了.jpg\u003c/p\u003e\u003cp\u003e没办法,刚好也晚了,在旁边步行街吃了点小吃,坐地铁回宾馆旁边那家烧烤。线上挺好吃的,线下也可以,不过人店面似乎主营是外卖。但是实惠和味道上没让我失望,啤酒上没让我哥们失望。\u003c/p\u003e\u003cp\u003e干完饭,回酒店睡觉。替哥们负重前行了一天,倒头就睡。\u003c/p\u003e\u003ch2 id=\"第2天-麦岛,栈桥,海鸥和薯条,以及代码\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/18/%E6%96%87%E5%AD%A6/%E6%B8%B8%E8%AE%B0/trip-to-tsingdao/#%E7%AC%AC2%E5%A4%A9-%E9%BA%A6%E5%B2%9B%EF%BC%8C%E6%A0%88%E6%A1%A5%EF%BC%8C%E6%B5%B7%E9%B8%A5%E5%92%8C%E8%96%AF%E6%9D%A1%EF%BC%8C%E4%BB%A5%E5%8F%8A%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"第2天-麦岛,栈桥,海鸥和薯条,以及代码\"\u003e\u003c/a\u003e第2天-麦岛,栈桥,海鸥和薯条,以及代码\u003c/h2\u003e\u003cp\u003e早上看天气预报,这边要下雪,感觉今天天气可能会有点糟……不过好在出去之后倒是没雪。这边天气这几天是冷锋过境,属于是变天如变脸的程度。\u003c/p\u003e\u003cp\u003e这一天睡到了自然醒。\u003cdel\u003e早上\u003c/del\u003e中午步行麦岛,被海风吹傻了。不过出片很多。早上一早上在宾馆写代码……至于为啥,合作项目快到ddl了。不过好在早上没出去,风大的虾仁。午饭是张亮麻辣烫和古茗,味道确实可以就是挺贵。\u003c/p\u003e\u003cp\u003e2点到麦岛,吹海风到3,4点。打车去栈桥\u003cdel\u003e捉\u003c/del\u003e喂了半天海鸥,哥们的Z50直接ISO爆炸了。6点左右俩人走着上了栈桥溜了个来回,海中间的亭子,别有景致。\u003c/p\u003e\u003cp\u003e步行到教堂,哥特式建筑美感别具一格,感觉薄纱半道的安妮小屋。另,青岛的地名好像真是按照全国省份起名的。\u003c/p\u003e\u003cp\u003e拐下去,在K和M的中门对决中选了M。\u003c/p\u003e\u003cp\u003e然后是1号线,体验了一把6分钟跨海,可惜啥都看不到,就是噪音特大。\u003c/p\u003e\u003cp\u003e看了中石油大学。石油的爷才是爷!\u003c/p\u003e\u003cp\u003e然后1号线回台东,路上为了我和另一个哥们的ddl疯狂写代码。居然在手机上搞定了。他也从他导师的侧目微笑里边解脱了。这期间哥们\u003cdel\u003e遛\u003c/del\u003e牵着我逛了这边一个步行街,规模意外的不太大。尝了下青岛啤酒原浆,苦的,喝不懂。给哥们解决了。\u003c/p\u003e\u003cp\u003e俩人开始乱逛,跑奥体对面五四广场乱逛听涛。\u003c/p\u003e\u003cp\u003e打车回宾馆了。洗漱+计划了下行程:济南/淄博,启动!\u003c/p\u003e\u003cp\u003e算了先别启动了,睡觉了。\u003c/p\u003e\u003ch2 id=\"第3天-海鸽子鸥,栈桥,小鱼山,德国领事馆旧址,以及夕阳\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/18/%E6%96%87%E5%AD%A6/%E6%B8%B8%E8%AE%B0/trip-to-tsingdao/#%E7%AC%AC3%E5%A4%A9-%E6%B5%B7%E9%B8%BD%E5%AD%90%E9%B8%A5%EF%BC%8C%E6%A0%88%E6%A1%A5%EF%BC%8C%E5%B0%8F%E9%B1%BC%E5%B1%B1%EF%BC%8C%E5%BE%B7%E5%9B%BD%E9%A2%86%E4%BA%8B%E9%A6%86%E6%97%A7%E5%9D%80%EF%BC%8C%E4%BB%A5%E5%8F%8A%E5%A4%95%E9%98%B3\" class=\"headerlink\" title=\"第3天-海鸽子鸥,栈桥,小鱼山,德国领事馆旧址,以及夕阳\"\u003e\u003c/a\u003e第3天-海\u003cdel\u003e鸽子\u003c/del\u003e鸥,栈桥,小鱼山,德国领事馆旧址,以及夕阳\u003c/h2\u003e\u003cp\u003e这回来青岛最大的成就,就是薅到了\u003cdel\u003e海鸽子\u003c/del\u003e海鸥。昨天\u003c/p\u003e\u003ch2 id=\"第4天-青岛:最澄澈的空与海·太美丽了淄博\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/18/%E6%96%87%E5%AD%A6/%E6%B8%B8%E8%AE%B0/trip-to-tsingdao/#%E7%AC%AC4%E5%A4%A9-%E9%9D%92%E5%B2%9B%EF%BC%9A%E6%9C%80%E6%BE%84%E6%BE%88%E7%9A%84%E7%A9%BA%E4%B8%8E%E6%B5%B7%C2%B7%E5%A4%AA%E7%BE%8E%E4%B8%BD%E4%BA%86%E6%B7%84%E5%8D%9A\" class=\"headerlink\" title=\"第4天-青岛:最澄澈的空与海·太美丽了淄博\"\u003e\u003c/a\u003e第4天-青岛:最澄澈的空与海·太美丽了淄博\u003c/h2\u003e\u003ch2 id=\"第5天-济南-老舍你最好没骗我\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/18/%E6%96%87%E5%AD%A6/%E6%B8%B8%E8%AE%B0/trip-to-tsingdao/#%E7%AC%AC5%E5%A4%A9-%E6%B5%8E%E5%8D%97-%E8%80%81%E8%88%8D%E4%BD%A0%E6%9C%80%E5%A5%BD%E6%B2%A1%E9%AA%97%E6%88%91\" class=\"headerlink\" title=\"第5天-济南-老舍你最好没骗我\"\u003e\u003c/a\u003e第5天-济南-老舍你最好没骗我\u003c/h2\u003e\u003cp\u003emd,跟老舍爆了,俩人冻的要似。\u003c/p\u003e\u003cp\u003e早上9点坐高铁到济南。10点多坐地铁到了宾馆。彦已经困的不行了,遂让他睡了一觉。这酒店条件确实不错,还有厨房。\u003c/p\u003e\u003cp\u003e另外就是济南这边地铁起码是从19年开始修的,这地方东边倒是还行,西边地铁修建难度简直地狱。地下各种复杂的地下水源,断层等等,能有地铁已经很不错了。能看得出来,济南地铁修的很新,而且也符合济南这边的特色:空间辽阔。\u003c/p\u003e\u003cp\u003e中午出发,先去旁边商超里边吃了一顿午饭。好久没吃米饭,俩人就恰了家石锅拌饭。\u003c/p\u003e\u003cp\u003e完事之后,我提出想去浪潮集团总部看看打个卡。毕竟在你电浪潮社也待了三年了,不太远(感觉比国医到你电西门的距离近一些),俩人就走过去了。\u003c/p\u003e\u003cp\u003e另外就是济南地铁\u003c/p\u003e\u003ch2 id=\"第6天-返航-最背刺的一集\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/18/%E6%96%87%E5%AD%A6/%E6%B8%B8%E8%AE%B0/trip-to-tsingdao/#%E7%AC%AC6%E5%A4%A9-%E8%BF%94%E8%88%AA-%E6%9C%80%E8%83%8C%E5%88%BA%E7%9A%84%E4%B8%80%E9%9B%86\" class=\"headerlink\" title=\"第6天-返航-最背刺的一集\"\u003e\u003c/a\u003e第6天-返航-最背刺的一集\u003c/h2\u003e\u003cp\u003e早上早早起来,洗漱了下,俩人出门进地铁站。济南这边地铁修的相当新,虽然条形地铁线路比较难换乘,但是有地铁这一点已经薄纱某些地方了,而且还是直达济南东站的。赢!\u003c/p\u003e\u003cp\u003e最难绷的一集:俩人买票那会发现难买,进站发现人一大群小学生搁那去西安旅游……算是彻底被背刺了。\u003c/p\u003e\u003cp\u003e路上太原开始这段雪景很绝。白色的斑驳成片覆盖在黄色的平原上,在纯蓝天的映射下格外让人有食欲。\u003c/p\u003e\u003cp\u003e遂恰饭点了一顿15元高铁套餐。评价是感觉不如…海棠一楼食堂,但是好tm贵QAQ。\u003c/p\u003e\u003cp\u003e彦这作息跟那啥考拉一样(哎对\u003cdel\u003e配色\u003c/del\u003e穿搭也差不多)又开始睡了。\u003c/p\u003e\u003cp\u003e路上边看地图边看风景……注意到前边过黄河了,俩人扒窗边看了会,发现了最符合天气的一集:黄河整个冻住了。不过就算是冻住了风光也很不错。\u003c/p\u003e\u003cp\u003e另外就是山西太原附近了,风光很有意思,很多谷地,覆上雪景后别有风味。\u003c/p\u003e\u003cp\u003e路上还路过了香汾,小站没太在意。感知最明显的就是天空从山东沿海地区的澄澈逐渐过渡到熟悉的灰蒙蒙的天空——当然风也小了许多。\u003c/p\u003e\u003cp\u003e西安站倒是下去溜达了一圈,气候温和多了。就是听到一点疑似关门的动静后赶紧钻回去车里边了。车门旁边倒是还有人趁着到站抽烟的,人家就比我淡定多了。\u003c/p\u003e\u003cp\u003e之后不久就到站了。温度比沿海地区温和了很多,饱受折磨的俩人一下子放松下来:\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e彦:这温度谁拉拉链啊\u003cbr/\u003e:笑死,根本不冷\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e不过最后某人还是把拉链拉上了。\u003c/p\u003e\u003cp\u003e俩人混的不错,摇到一个同学开车给我俩接回去了。回去之前几个人一块来搓了一顿\u003cdel\u003emai\u003c/del\u003e麦,已经是穷鬼的我必然是点了一份穷鬼套餐,顺便聊了不少时政\u003cdel\u003e不是怎么每回的保留环节都是政治乐子啊\u003c/del\u003e。另外,宝鸡夜色某种意义上比大明湖强。\u003c/p\u003e\u003chr/\u003e\u003cp\u003e坐着同学的车到了家门口,提下箱子,关门,隔着车门和彦挥了挥手\u003c/p\u003e\u003cp\u003e转身,离去。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2024/01/18/%E6%96%87%E5%AD%A6/%E6%B8%B8%E8%AE%B0/trip-to-tsingdao/"},{"title":"数据库复习笔记","time":"2024-01-15T11:17:19Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e这学期学的数据库主要偏向应用,理论部分相对比较少,重点如下:\u003c/p\u003e\u003ch2 id=\"数据库系统概论-大纲\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/#%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%AE%BA-%E5%A4%A7%E7%BA%B2\" class=\"headerlink\" title=\"数据库系统概论 大纲\"\u003e\u003c/a\u003e数据库系统概论 大纲\u003c/h2\u003e\u003cul\u003e\u003cli\u003e绪论\u003cul\u003e\u003cli\u003e特点,概念,发展\u003c/li\u003e\u003cli\u003e数据模型:层次,网状,关系\u003c/li\u003e\u003cli\u003e结构:三级模式,二级映像\u003c/li\u003e\u003cli\u003e组成\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e关系数据库\u003cul\u003e\u003cli\u003e关系数据结构\u003c/li\u003e\u003cli\u003e关系操作!\u003c/li\u003e\u003cli\u003e关系完整性:实体完整性,参照完整性,用户定义的完整性\u003c/li\u003e\u003cli\u003e关系代数!\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eSQL\u003cul\u003e\u003cli\u003e定义{模式,表,索引,数据字典} \u003c/li\u003e\u003cli\u003e查询:单表,连接,嵌套,集合,派生表\u003c/li\u003e\u003cli\u003e更新:插入,修改,删除\u003c/li\u003e\u003cli\u003e空值,试图\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e安全性\u003cul\u003e\u003cli\u003e安全性控制:用户身份控制,存取控制,自主存取控制,授权/收回,抢注存取控制方法\u003c/li\u003e\u003cli\u003e视图 - 审计 - 数据加密\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e数据库完整性\u003cul\u003e\u003cli\u003e实体完整性,参照完整性,用户定义的完整性\u003c/li\u003e\u003cli\u003e完整性约束命名子句\u003c/li\u003e\u003cli\u003e断言\u003c/li\u003e\u003cli\u003e触发器\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e关系数据理论\u003cul\u003e\u003cli\u003e规范化\u003cul\u003e\u003cli\u003e函数依赖 - 码 - 范式 - 2NF - 3NF - BCNF - 多值依赖和4NF\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e数据依赖的公理系统 - 模式分解\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e数据库设计\u003cul\u003e\u003cli\u003e数据字典\u003c/li\u003e\u003cli\u003e概念模型\u003c/li\u003e\u003cli\u003eE-R模型及其扩充\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e数据库编程\u003cul\u003e\u003cli\u003e嵌入式SQL:处理过程,通信(游标,动态SQL)\u003c/li\u003e\u003cli\u003e过程化SQL\u003c/li\u003e\u003cli\u003e存储过程和函数\u003c/li\u003e\u003cli\u003eODBC编程\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e关系查询处理和查询优化\u003cul\u003e\u003cli\u003e查询处理步骤,优化\u003c/li\u003e\u003cli\u003e代数优化,物理优化\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e数据库恢复技术\u003cul\u003e\u003cli\u003e事务概念和特点 - 恢复概述 - 故障种类,恢复技术和策略\u003c/li\u003e\u003cli\u003e并发控制\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e整理的不是特别全乎,不过也涵盖不少了。往年大题就那几道,题型相对固定,针对性做题,做会题就算复习完了。\u003c/p\u003e\u003cp\u003e上面的知识点里边特别重要的就那几个:\u003cstrong\u003e关系代数,关系完整性,SQL,关系数据理论和事务与并发,查询优化\u003c/strong\u003e这几个。其他零碎的小知识点有印象就行了。\u003c/p\u003e\u003cp\u003e复习方法一是做题,最好是看答案;二是看例子,例题,然后递归复习知识点,效率最高。三是下策,先看知识点,再做题,适合开始复习比较早,时间充裕的情况,也是最充分的复习,但是问题是容易动力不足。\u003c/p\u003e\u003ch2 id=\"SQL\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/#SQL\" class=\"headerlink\" title=\"SQL\"\u003e\u003c/a\u003eSQL\u003c/h2\u003e\u003ch3 id=\"CREATE-DROP-ALTER\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/#CREATE-DROP-ALTER\" class=\"headerlink\" title=\"CREATE,DROP,ALTER\"\u003e\u003c/a\u003eCREATE,DROP,ALTER\u003c/h3\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eCREATE\u003c/span\u003e SCHEMA \u003cspan class=\"operator\"\u003e\u0026lt;\u003c/span\u003e\u0026#34;name\u0026#34;\u003cspan class=\"operator\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"keyword\"\u003eAUTHORIZATION\u003c/span\u003e \u0026#34;username\u0026#34;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eDROP\u003c/span\u003e SCHEMA \u0026#34;name\u0026#34; [CASCADE\u003cspan class=\"operator\"\u003e/\u003c/span\u003eRESTRICT];\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"keyword\"\u003eTABLE\u003c/span\u003e \u0026#34;name\u0026#34;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e{ Col1 \u003cspan class=\"type\"\u003eVARCHAR\u003c/span\u003e(\u003cspan class=\"number\"\u003e10\u003c/span\u003e) \u003cspan class=\"keyword\"\u003ePRIMARY\u003c/span\u003e KEY,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Col2 NUMBER(\u003cspan class=\"number\"\u003e10\u003c/span\u003e) \u003cspan class=\"keyword\"\u003eNOT\u003c/span\u003e \u003cspan class=\"keyword\"\u003eNULL\u003c/span\u003e \u003cspan class=\"keyword\"\u003eUNIQUE\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Col3 \u003cspan class=\"type\"\u003eINT\u003c/span\u003e \u003cspan class=\"keyword\"\u003eFOREIGN\u003c/span\u003e KEY(Sno) \u003cspan class=\"keyword\"\u003eREFERENCES\u003c/span\u003e TABLE2(Sno),\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eCHECK\u003c/span\u003e(Col1 \u003cspan class=\"operator\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"number\"\u003e1\u003c/span\u003e \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e Col1 \u003cspan class=\"operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"number\"\u003e10\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e};\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"keyword\"\u003eTABLE\u003c/span\u003e schema.tablename{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"operator\"\u003e/\u003c/span\u003e\u003cspan class=\"operator\"\u003e/\u003c/span\u003e 同上\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e};\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eCREATE\u003c/span\u003e SCHEMA \u0026#34;name\u0026#34; \u003cspan class=\"keyword\"\u003eAUTHORIZATION\u003c/span\u003e \u0026#34;user\u0026#34; \u003cspan class=\"keyword\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"keyword\"\u003eTABLE\u003c/span\u003e \u0026#34;table1\u0026#34;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"operator\"\u003e/\u003c/span\u003e\u003cspan class=\"operator\"\u003e/\u003c/span\u003e 同上\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e};\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eALTER\u003c/span\u003e \u003cspan class=\"keyword\"\u003eTABLE\u003c/span\u003e \u0026#34;name\u0026#34; [\u003cspan class=\"keyword\"\u003eADD\u003c/span\u003e \u003cspan class=\"keyword\"\u003eCOLUMN\u003c/span\u003e name \u003cspan class=\"type\"\u003eVARCHAR\u003c/span\u003e(\u003cspan class=\"number\"\u003e10\u003c/span\u003e) \u003cspan class=\"operator\"\u003e|\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eADD\u003c/span\u003e \u003cspan class=\"keyword\"\u003eUNIQUE\u003c/span\u003e(Cname) \u003cspan class=\"operator\"\u003e|\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eADD\u003c/span\u003e \u003cspan class=\"keyword\"\u003eFOREIGN\u003c/span\u003e KEY(Cno) \u003cspan class=\"keyword\"\u003eREFERENCES\u003c/span\u003e Student(Cno) \u003cspan class=\"operator\"\u003e|\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eDROP\u003c/span\u003e Col1 CASCADE\u003cspan class=\"operator\"\u003e|\u003c/span\u003eRESTRICT\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eDROP\u003c/span\u003e \u003cspan class=\"keyword\"\u003eCONSTRAINT\u003c/span\u003e “completeness” CASCADE\u003cspan class=\"operator\"\u003e|\u003c/span\u003eRESTRICT\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eALTER\u003c/span\u003e \u003cspan class=\"keyword\"\u003eCOLUMN\u003c/span\u003e Col1 \u003cspan class=\"type\"\u003eVARCHAR\u003c/span\u003e(\u003cspan class=\"number\"\u003e114514\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e];\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eDROP\u003c/span\u003e \u003cspan class=\"keyword\"\u003eTABLE\u003c/span\u003e \u0026#34;name\u0026#34; CASCADE\u003cspan class=\"operator\"\u003e|\u003c/span\u003eRESTRICT;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"INDEX\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/#INDEX\" class=\"headerlink\" title=\"INDEX\"\u003e\u003c/a\u003eINDEX\u003c/h3\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"keyword\"\u003eUNIQUE\u003c/span\u003e\u003cspan class=\"operator\"\u003e|\u003c/span\u003eCLUSTER INDEX \u0026#34;index_name\u0026#34; \u003cspan class=\"keyword\"\u003eON\u003c/span\u003e tableName(Col1 \u003cspan class=\"keyword\"\u003eDESC\u003c/span\u003e, Col2 \u003cspan class=\"keyword\"\u003eASC\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eALTER\u003c/span\u003e INDX \u0026#34;old_index\u0026#34; RENAME \u003cspan class=\"keyword\"\u003eTO\u003c/span\u003e \u0026#34;new_index\u0026#34;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eDROP\u003c/span\u003e INDEX \u0026#34;index_name\u0026#34;;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"SELECT\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/#SELECT\" class=\"headerlink\" title=\"SELECT\"\u003e\u003c/a\u003eSELECT\u003c/h3\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eSELECT\u003c/span\u003e [\u003cspan class=\"keyword\"\u003eDISTINCT\u003c/span\u003e\u003cspan class=\"operator\"\u003e|\u003c/span\u003e\u003cspan class=\"keyword\"\u003eALL\u003c/span\u003e] \u003cspan class=\"number\"\u003e2022\u003c/span\u003e\u003cspan class=\"operator\"\u003e-\u003c/span\u003etable1.age,table2.Sname\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eFROM\u003c/span\u003e [\u0026#34;table1\u0026#34; \u003cspan class=\"operator\"\u003e|\u003c/span\u003e \u0026#34;view1\u0026#34;]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eWHERE\u003c/span\u003e age\u003cspan class=\"operator\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"number\"\u003e5\u003c/span\u003e \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e\u003cspan class=\"operator\"\u003e|\u003c/span\u003e\u003cspan class=\"keyword\"\u003eOR\u003c/span\u003e age\u003cspan class=\"operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"number\"\u003e7\u003c/span\u003e \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e Sdept\u003cspan class=\"operator\"\u003e=\u003c/span\u003e\u003cspan class=\"string\"\u003e\u0026#39;CS\u0026#39;\u003c/span\u003e \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e age [\u003cspan class=\"keyword\"\u003eNOT\u003c/span\u003e] \u003cspan class=\"keyword\"\u003eBETWEEN\u003c/span\u003e \u003cspan class=\"number\"\u003e20\u003c/span\u003e \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e \u003cspan class=\"number\"\u003e30\u003c/span\u003e \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e Sdept \u003cspan class=\"keyword\"\u003eIN\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;CS\u0026#39;\u003c/span\u003e,\u003cspan class=\"string\"\u003e\u0026#39;MA\u0026#39;\u003c/span\u003e) \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e name \u003cspan class=\"keyword\"\u003eLIKE\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#39;张____\u0026#39;\u003c/span\u003e \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e GRADE \u003cspan class=\"keyword\"\u003eIS\u003c/span\u003e \u003cspan class=\"keyword\"\u003eNULL\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eGROUP\u003c/span\u003e \u003cspan class=\"keyword\"\u003eBY\u003c/span\u003e Col2 \u003cspan class=\"keyword\"\u003eHAVING\u003c/span\u003e \u003cspan class=\"built_in\"\u003eAVG\u003c/span\u003e(Grade)\u003cspan class=\"operator\"\u003e\u0026gt;=\u003c/span\u003e\u003cspan class=\"number\"\u003e90\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eORDER\u003c/span\u003e \u003cspan class=\"keyword\"\u003eBY\u003c/span\u003e Col1 \u003cspan class=\"keyword\"\u003eDESC\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e连接查询时,列举全部属性列,去掉相同的列就是自然连接。\u003c/p\u003e\u003cp\u003e单表连接查询:\u003c/p\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eFROM\u003c/span\u003e Course.FIRST, Course.SECOND\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eSELECT\u003c/span\u003e FIRST.Cno, SECOND.Cpno\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eWHERE\u003c/span\u003e FIRST.Cpno\u003cspan class=\"operator\"\u003e=\u003c/span\u003eSECOND.Cno;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"operator\"\u003e/\u003c/span\u003e\u003cspan class=\"operator\"\u003e/\u003c/span\u003e外连接查询\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eFROM\u003c/span\u003e table1 \u003cspan class=\"keyword\"\u003eLEFT\u003c/span\u003e\u003cspan class=\"operator\"\u003e|\u003c/span\u003e\u003cspan class=\"keyword\"\u003eRIGHT\u003c/span\u003e \u003cspan class=\"keyword\"\u003eOUTER\u003c/span\u003e \u003cspan class=\"keyword\"\u003eJOIN\u003c/span\u003e table2 \u003cspan class=\"keyword\"\u003eON\u003c/span\u003e\u003cspan class=\"operator\"\u003e|\u003c/span\u003e\u003cspan class=\"keyword\"\u003eUSING\u003c/span\u003e(table1.sno\u003cspan class=\"operator\"\u003e=\u003c/span\u003etable2.sno) \u003cspan class=\"operator\"\u003e/\u003c/span\u003e\u003cspan class=\"operator\"\u003e/\u003c/span\u003e \u003cspan class=\"keyword\"\u003eUSING\u003c/span\u003e去重\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e\u003ccode\u003e%_\u003c/code\u003e任意字符、一个字符,汉字\u003cstrong\u003e长两个字符\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e子查询使用\u003ccode\u003eIN\u003c/code\u003e关键字,阅读/构造时从内部构造。下面的例子相当于是将子查询的结果作为父查询的语句的参数了。\u003c/p\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eSELECT\u003c/span\u003e Sno, Sname, Sdept\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eFROM\u003c/span\u003e Student\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eWHERE\u003c/span\u003e Sdept \u003cspan class=\"keyword\"\u003eIN\u003c/span\u003e (\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eSELECT\u003c/span\u003e Sdept\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eFROM\u003c/span\u003e Student\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eWHERE\u003c/span\u003e Sname\u003cspan class=\"operator\"\u003e=\u003c/span\u003e\u003cspan class=\"string\"\u003e\u0026#39;lex\u0026#39;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e) \u003cspan class=\"keyword\"\u003eAND\u003c/span\u003e xxx;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e还有\u003ccode\u003eEXISTS\u003c/code\u003e子查询,跟上边\u003ccode\u003eIN\u003c/code\u003e差不多,不过意思是将”至少存在一个查询结果“作为查询选择器的条件。\u003c/p\u003e\u003cp\u003e多个查询可以用\u003ccode\u003eUNION,, INTERSECT, EXCEPT\u003c/code\u003e分别进行并,交,差三个集合运算,目标的数据结构必须相同。\u003c/p\u003e\u003ch3 id=\"INSERT-UPDATE-DELETE\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/#INSERT-UPDATE-DELETE\" class=\"headerlink\" title=\"INSERT,UPDATE,DELETE\"\u003e\u003c/a\u003eINSERT,UPDATE,DELETE\u003c/h3\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eINSERT\u003c/span\u003e \u003cspan class=\"keyword\"\u003eINTO\u003c/span\u003e \u003cspan class=\"keyword\"\u003etable\u003c/span\u003e(Col1, Col2) [\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eVALUES\u003c/span\u003e(\u003cspan class=\"number\"\u003e1\u003c/span\u003e,\u003cspan class=\"number\"\u003e2\u003c/span\u003e,\u003cspan class=\"number\"\u003e3\u003c/span\u003e,\u003cspan class=\"string\"\u003e\u0026#39;4\u0026#39;\u003c/span\u003e) \u003cspan class=\"operator\"\u003e|\u003c/span\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eSELECT\u003c/span\u003e xxx \u003cspan class=\"keyword\"\u003eFROM\u003c/span\u003e xxx \u003cspan class=\"keyword\"\u003eWHERE\u003c/span\u003e xxx \u003cspan class=\"keyword\"\u003eGROUP\u003c/span\u003e \u003cspan class=\"keyword\"\u003eBY\u003c/span\u003e xxx\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e];\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eUPDATE\u003c/span\u003e \u003cspan class=\"keyword\"\u003etable\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eSET\u003c/span\u003e Col1\u003cspan class=\"operator\"\u003e=\u003c/span\u003exxx\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eWHERE\u003c/span\u003e cond;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eDELETE\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eFROM\u003c/span\u003e \u003cspan class=\"keyword\"\u003etable\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eWHERE\u003c/span\u003e cond;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"VIEW\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/#VIEW\" class=\"headerlink\" title=\"VIEW\"\u003e\u003c/a\u003eVIEW\u003c/h3\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eCREATE\u003c/span\u003e \u003cspan class=\"keyword\"\u003eVIEW\u003c/span\u003e vname(Col1,Coln)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eAS\u003c/span\u003e 子查询\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[\u003cspan class=\"keyword\"\u003eWITH\u003c/span\u003e \u003cspan class=\"keyword\"\u003eCHECK\u003c/span\u003e OPTION]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eGROUP\u003c/span\u003e \u003cspan class=\"keyword\"\u003eBY\u003c/span\u003e xxx;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eDROP\u003c/span\u003e \u003cspan class=\"keyword\"\u003eVIEW\u003c/span\u003e vname CASCADE\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"空值\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/#%E7%A9%BA%E5%80%BC\" class=\"headerlink\" title=\"空值\"\u003e\u003c/a\u003e空值\u003c/h3\u003e\u003cfigure class=\"highlight sql\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003exxx \u003cspan class=\"keyword\"\u003eIS\u003c/span\u003e [\u003cspan class=\"keyword\"\u003eNOT\u003c/span\u003e] \u003cspan class=\"keyword\"\u003eNULL\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2024/01/15/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/db-review/"},{"title":"2023这一年","time":"2023-12-31T12:30:31Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e时间过得真快啊。一转眼已经过去5/8个大学了。\u003c/p\u003e\u003cspan id=\"more\"\u003e\u003c/span\u003e\u003cp\u003e记得去年这个时候,我还是和同学在语音里闲聊着,一起等着跨年。然后,2023,就在我们几个的闲聊中拉开了序幕。比较幸运的是,放开之后,没啥大的折腾,nCov-19终于慢慢销声匿迹了。还好,终于能有个比较正常的大学生活了。\u003c/p\u003e\u003cp\u003e冷清的窗外,忽的传来几声烟花爆裂的声音,提醒着我,这一年确实是过去了。家里只有父母和奶奶,静悄悄的。大人们都早早睡下了,毕竟还要工作。深冬的寒夜里我依旧在思考,但又不知道在想什么。或许只是借助思考打发孤独罢了。\u003c/p\u003e\u003cp\u003e哦对了,去年那会差点喜提新机:跟某同学去完市图书馆之后,回家放东西的时候手没拿稳直接drop it了。还好机器主体没啥问题,就是屏幕漏液痛失360元。不过当时脑子一抽打开2077看了下效果,嗯,更沉浸了。\u003c/p\u003e\u003ch2 id=\"一,二月\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E4%B8%80%EF%BC%8C%E4%BA%8C%E6%9C%88\" class=\"headerlink\" title=\"一,二月\"\u003e\u003c/a\u003e一,二月\u003c/h2\u003e\u003cp\u003e过年前还跟哥们出去浪了一会,顺便被一个南科大的哥们请恰了一顿饭。毕竟帮人家搞定了课程大作业确实挺不容易的,就是不知道这孩子有啥想不开的,一个学金融的非要选Java……反正逛的是挺爽的:顶着刚疫情还没恢复的身子去爬山差点没给我爬入土了。后面几天有一天在发小家里聊到好晚,还带了一袋子自己炸的薯条分而啖之。他很喜欢米家的游戏,\u003cdel\u003e倒是跟我刚好相反\u003c/del\u003e反正跟原切割了。不过这不重要,反正见面的话题永远聊不完:两个天差地别的专业,聊啥都是新鲜的;更重要的是,还好现在远没到拉家常的年纪,我们暂且都还是比较有趣的人。\u003c/p\u003e\u003cp\u003e转眼就是过年。现在春节用春晚作为背景音的都很少了,拜完年串完门,烧纸的烧纸,上坟的上坟。村子里的人是一年比一年少,有些房子变新了,也变冷清了;有些房子门前已经满是杂草,无人打理许久了。偶尔请些亲戚来家里做客才能稍微驱逐些寂寥,有点小孩就更热闹了——可惜,现在他们对于手机更感兴趣。\u003c/p\u003e\u003cp\u003e跟哥们一块看了《流浪地球2》,感觉比1提升不小。导演功力到位,华仔演技在线,剧情不错,就是叙事节奏有改进空间。在这之后,ChatGPT就第一次问世了。\u003c/p\u003e\u003ch2 id=\"三,四月\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E4%B8%89%EF%BC%8C%E5%9B%9B%E6%9C%88\" class=\"headerlink\" title=\"三,四月\"\u003e\u003c/a\u003e三,四月\u003c/h2\u003e\u003cp\u003e机械性的春节后,该上学的上学,该上班的上班,一切照旧。去年没有考的试就放到了开春来考,队友想专心复习,顶不住压力,就放弃了美赛。临阵垮台,于是参加美赛的机会从三次变成了两次。如果想要给考研加点分的话,那就只能指望大三寒假咯。队友不太好意思,遂请我们吃了个\u003cdel\u003e散伙\u003c/del\u003e饭。想说些啥,但是也没啥好说的。那会的大学时间还有不少,机会也是。\u003c/p\u003e\u003cp\u003e到这里,节奏基本还行,但是对于大二下的恶毒我还是始料不及。三月,四月,又是期中考试,实验陆续开始。西电的传统是实验报告大多手写,于是免不了应付这些繁文缛节。加上课内作业,而且最重要的是,我还是选了最累的活法:打了一堆毛毛雨一般的竞赛。最忙的时候,手头同时有6,7个任务得搞定。\u003c/p\u003e\u003cp\u003e我发现我好像那个什么抖m,净喜欢给自己找罪受。\u003c/p\u003e\u003cp\u003e不过这些倒还好,属于是有惊无险地都干完了。真正难绷的事情才刚刚开始。虽然没有rx那么强的开发效率,但是我还是接下了同学拉我去做的烂摊子。那本来是个挺简单的vue+springBoot标准前后端项目,最后做的我怀疑人生,差点放弃前端。那项目我打5月接手的时候看了下需求,感觉多是多,但是能做——然后我就被另一个哥们封装的,小山包一样的屎山代码糊脸了。这个后面说。另外那段时间也把鸽了整一年的OJ拉出来重新写了,刚好能用上新学的东西,这会应该算是真正开始熟悉了Vue和Golang这俩现代开发语言的用法。\u003c/p\u003e\u003cp\u003e不得不提的还有大模型,人类史上用户量最快达到一亿的玩意,没有学术上的美感,有的只是空前庞大的恐怖算力,工业界的暴力美学所创造出的前所未有的奇迹——能力只有文字接龙,但是能力强到让许多人开始担心自己的饭碗,甚至有人认为它的智能快达到临界点了。\u003c/p\u003e\u003cp\u003e以及就是业余无线电能力测试。一晚上速通,拿上A证了。上了两年大学,好在应试能力留了一些。\u003c/p\u003e\u003ch2 id=\"五月\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E4%BA%94%E6%9C%88\" class=\"headerlink\" title=\"五月\"\u003e\u003c/a\u003e五月\u003c/h2\u003e\u003cp\u003e5月是实验的谎言。一个月天天是实验,周周有实验报告要写。好在有几个能直接提交电子打印版的,借助历史的积淀秒了。不过实验本身也够占时间的,导致我错过了半个晒你祭(恼)。5.13早上当了会门口引导的志愿者之后,把俩\u003cdel\u003e二刺螈\u003c/del\u003e同学从隔壁瓜大领进去光了会,拍了几个coser,就被电子线路实验带走了。俩小时速通之后,展子还在,但是不剩啥节目了。事后同学表示,这Live神中神,特别是那个鼓手定得一批。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e我:我tm在做实验没听到啊啊啊啊\u003cbr/\u003e:你这辈子就是让实验给害了\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e不过还好,4月还是3月喜提新哥们,还是意外盒到的酷安群u(甚至刚好还是个潜在越共),5月初有长安THO,就给他拽过去逛车万展子了。好像之后还陪着他娶了个新旧电脑(无误),他的古董电子产品收集喜加一。也是他的影响让我开始怀疑我对算力需求的必要性了。也是月初,发小还去上海逛cp29(还是多少)了,买周边就花了小1k。只能感叹某些二次元的行动力真的强,一个人从西安跑上海还跟特种兵似的,基本所有重要地方都打卡过了。\u003c/p\u003e\u003cp\u003e这个月还跟浪潮的朋友们出去团建了。19级的学长到这个点也基本都未来既定了,值得庆祝的是学长们去向还都相当可以。西电保研清华的老学长还来回来逛了一圈,可惜比较社恐也就没聊几句。感叹一句,浪潮这些学长水平真的都好强啊。\u003c/p\u003e\u003cp\u003e还有一回是得知西安的亲戚住院了,很震惊,顶着大雨跑雁塔去看望了。越发感叹身体的重要性,尤其叔叔他上的班还是长期熬夜那种,很伤身体。于是之后也下定决心少熬夜\u003cdel\u003e但是只有一点点\u003c/del\u003e。巧的是这地方刚好离你电老校区不远,就顺便跑过去逛了一圈。刚开始在家属区里溜达了半天,最后才找着进去学校的路。刚好去听了个EDA公司的校企合作实验室揭榜,顺便第一回线下见到了你电的校长\u003cdel\u003e之一\u003c/del\u003e。可惜的是去晚了,没白嫖到讲座送的礼盒。\u003c/p\u003e\u003cp\u003e后面雨突然特别大,打着伞都给你打一身溅射伤害那种,于是刚好趁这个时间逛了下你电的老图书馆。好像那种老楼都喜欢修得很高,这玩意外边看着还行,里边有足足十一层。看了下都是些研究生学长学姐在自习/看书/写论文,座位倒是比南校区多很多。随机roll到本Hadoop的书看了下,然后就下楼了。\u003c/p\u003e\u003cp\u003e在雨里边看着路边树上挂的一排诗歌的牌子,还有你电老校区的老苏式宿舍楼,感觉有种回到小时候的感觉。\u003c/p\u003e\u003cp\u003e不过雨太大了,于是跑到食堂去了。老校区食堂还不错,便宜大碗。然后也不知道怎么突然想起来,也是去年这几天,袁隆平院士走了。然后出门看着雨都变了个滋味。\u003c/p\u003e\u003ch2 id=\"六月\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E5%85%AD%E6%9C%88\" class=\"headerlink\" title=\"六月\"\u003e\u003c/a\u003e六月\u003c/h2\u003e\u003cp\u003e之后就是复习,考试了。这之间学校里边“报复式”地办了不少活动,比如什么大学生音乐节。完事之后也到六月了,刚好也到19级老东西们爆金币的时候了。说起来去年这会刚送走小梦,现在看电表还在维护,真是感慨万千。当时学原生安卓开发,还是向小梦哥哥请教的很多问题。现在学长已经在字节干了快一年半两年了,希望一切都顺利吧。\u003c/p\u003e\u003cp\u003e另外就是,把原来那个B450的AMD平台板U条套装换成了RD450X的Intel Xeon平台的板U套装了。不过因为电源输出端口不够的原因,买了个电源在路上还没运回来。一直拖到下个月才装好。不过有一说一,双路E5真的爽啊,特别是拿来跑各种数据挖掘算法的时候,那速度真的吊着普通消费级处理器打,12700H要跑十几分钟的k-means聚类,这玩意只要几十秒;编译的时候\u003ccode\u003emake -j56\u003c/code\u003e更是爽的一批。\u003c/p\u003e\u003cp\u003e考试完了之后也算是去逛一逛,光速约了一堆哥们(重大失误,约人的时候尽量少点,特别里边不少都不是特别熟的人)跑去爬华山。上山的过程嘛很爽,跟几个好朋友一路边吐槽边往上走,晚上山上风景倒是也别有风味,尤其是看着一路上一条条光点连成的线条,以及山脚下\u003cdel\u003e万家\u003c/del\u003e灯火,有种说不出来的震撼。几个哥们爬到中峰就爬不动了,我倒是莽上去东峰了,就是半路上两条腿轮流抽筋实在有点酸爽。\u003c/p\u003e\u003cp\u003e最后倒是亲眼看到了完整的日出,太阳从一个小点慢慢变得越来越红火,越来越大,感觉一晚上的努力也值了。\u003c/p\u003e\u003cp\u003e下山实在不想说了,建议是千万别人多的时候爬山,真的够你喝一壶了,氪金都不能速通的那种痛(虽然主要是因为一晚上没睡觉)。乱七八糟的事让这事虎头蛇尾地结束了,也从此对华山这地方有了ptsd。这种景区建议最好先对周边了解清楚之后再去。\u003c/p\u003e\u003cp\u003e然后回了学校,就是为期一周的军训。大学的军训比印象中高中那会红河谷那次水多了,基本就是每天上午8点集合,站一个上午军姿/学走正步/整队之类的。教官和我们同岁,所以也比较仁慈\u003cdel\u003e放水\u003c/del\u003e。最后军训完了之后,也刚好到暑假了。\u003c/p\u003e\u003ch2 id=\"暑假\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E6%9A%91%E5%81%87\" class=\"headerlink\" title=\"暑假\"\u003e\u003c/a\u003e暑假\u003c/h2\u003e\u003cp\u003e跟好哥们去网安大楼天台上溜达了一圈,风景真的不错。夕阳刚好,空无一物的天空让人心情无比平静,很大程度上也排解了之前的糟心事的影响。小赵真的是个很好的人,希望他未来能被世界温柔以待吧。后来也跟他合作整过一个小项目,我写前端,他做硬件。不得不说,这还是我第二次做一个这么贴近硬件的项目。可能以后遇到硬件方面的需求的话,我真的能用一个esp32整出不少活吧。\u003c/p\u003e\u003cp\u003e之后几天,跟隔壁瓜大两个哥们线下联机打了一段时间的MC Java原版生存。这游戏也陪着我走过了起码快十年了吧?小学玩过,初中玩过,高中也跟舍友玩过,大学了还在玩,可能这就是开放世界的魅力吧。当然,我们三个彩笔打了两三天还没通关,光停下来造房子造基地了,末地门都还没找到呢。趁着这段时间,顺便逛了一圈\u003cdel\u003e瓜大\u003c/del\u003e东大村,评价是比你电周边丰富多了。以及西工大校内,虽然学校地方比较偏僻,但是瓜大的校内生活似乎也还行。特别是同学宿舍晚上基本不关门这点薄纱你电,以及瓜大的风景真不是吹的,到处都是好机位,依山傍水,出图书馆就是四时之景。而且瓜大的图书馆真的大,里边甚至有商超那种大电动扶梯,一堆自习位置,靠窗的位置学累了还能看会风景。另外关于这点,彦的自习常用位置是四个书架合围的一个小空间里边。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e:你是不喜欢看风景吗\u003cbr/\u003e彦:学习要讲究一个氛围\u003cbr/\u003e:嗯所以呢\u003cbr/\u003e彦:你想想mc里边附魔台周围都要围一圈书呢\u003cbr/\u003e:合着你给你自个附魔呢是\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e中间有一回回学校拿电脑(mc果然得几个人联机才有意思),顺便带他俩在学校里(再次)溜达了一圈。中间带他俩去部室打了会sdvx差点给主线任务忘了\u003cdel\u003e音批是这样的\u003c/del\u003e。那之后带他们rua了会大鹅,以及在B楼底下不定期出没的黑子,拿上电脑恰了个饭,就打车回瓜大了。然后几个彩笔被循声守卫轮流锤死不知道多少次。之后不知道为啥瓜的\u003cdel\u003e唐\u003c/del\u003e航小天莫名其妙火了,然后莫名其妙跟你电的\u003cdel\u003e唐\u003c/del\u003e西小电联动了(?)\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003cdel\u003e唐\u003c/del\u003e航小天可爱捏\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e另外就是另一个鸽子精那会也从哈尔滨回来了。摇了几个朋友出去小聚了一下。后面基本就只剩下天天写代码肝外包项目了。哦对,还有偶尔去学校游泳池游个泳啥的。顺带还带着一个同学大概学会了怎么在水里扑腾(\u003c/p\u003e\u003cp\u003e这个假期最主要的就是俩外包项目,硬是把github commits从不到300刷到了600+。接了俩外包,在学校干了俩月。靠着外包挣的一点钱给整了个平板,升级了服务器,整了个便携屏,给笔记本升级到32+8的抽象内存组合了。8月份,同学来打电赛省赛,还迎带同学溜达了一圈。那阵子雨天挺多的,一阵秋雨一阵凉,感觉西安这地方只有夏天跟冬天俩季节。中间回家了一趟,好在家里没啥大问题。在宝鸡拉着同学出去溜达了一圈,比较离谱的是他们见到了个核酸检测点之后集体发电,不存在的记忆增加了.jpg\u003c/p\u003e\u003cp\u003e后面回了西安之后,还遇到高中同学来西安逛。俩人聊天聊了一个通宵。回去之后不知道咋想的突然就想给电脑换个Arch\u003cdel\u003e然后就找到目前最理想的系统了\u003c/del\u003e。\u003c/p\u003e\u003ch2 id=\"九月\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E4%B9%9D%E6%9C%88\" class=\"headerlink\" title=\"九月\"\u003e\u003c/a\u003e九月\u003c/h2\u003e\u003cp\u003eISC招新,感受到自己已经确实是个大三老东西了。趁着开学听了好多校招会,虽然本科大概率没有直接就业的想法。比较幸运的一点是,小米的校招会上还抽到个Xiaomi Sounds Pro。可惜不是声学发烧友,倒是让几个好哥们爽了一回。\u003c/p\u003e\u003cp\u003e月中跟哥们去看了奥本海默,确实是好片,没别人说的那么难懂,就是太过沉迷剧情,两个人三回标题都没拍下来打卡,最后只拍下来个龙标,笑死。后来跟他速通了下西安理工金花校区,苏联老楼给我留下了极其深刻的印象\u003cdel\u003e有种回家的错觉\u003c/del\u003e。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e回来没两天就是湖人哥一战成名的时刻了。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e后面就是第一回参加开源社区活动,壮着胆子讲了回Linux,起码没翻车。顺便线下了好多酷安/OSC群的群u\u003cdel\u003e当然最后也是没逃过来自群u的盒打击\u003c/del\u003e。后一天去车万组活现场瞅了一眼,在放漫才,确实很有节目效果。\u003c/p\u003e\u003cp\u003e之后就是星铁/崩坏的啥活动,俩哥们跑去线下打卡来着,顺便又聚了一回,又三个人速通了回西安理工新校区。一个崩批一个铁批行动力是真强,晚上嗯走七个打卡点打卡,我在干啥,我那会好像在边走边在给电脑装Arch\u003cdel\u003eArch To Go\u003c/del\u003e。顺便几个人吐槽了一波西安依托的地面交通。\u003c/p\u003e\u003cp\u003e月底,那个外包项目也因为各种问题凉了。说实话心里很不是滋味,并且对于这种任务之后心里都没了底。说不上来是好是坏。\u003c/p\u003e\u003cp\u003e25号,一个20级研究生学姐跳了,在此之前西电好像已经十几年都没跳的了。不知道是什么让她做出了这样的选择。对她的行为我不应也不想做出评价,对于这个结果还是希望逝者安息吧。\u003c/p\u003e\u003ch2 id=\"十月\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E5%8D%81%E6%9C%88\" class=\"headerlink\" title=\"十月\"\u003e\u003c/a\u003e十月\u003c/h2\u003e\u003cp\u003e国庆+中秋调休,回去家里参加了邻家姐姐的婚礼。后面又和几个同学在宝鸡的小地方到处乱逛了一回,作为国庆的收尾。\u003c/p\u003e\u003cp\u003e这个月后面的就是音乐会,迎新歌会之类的。活动确实不少,还跟高中来打比赛的学弟们见了回面,时间真快啊。\u003c/p\u003e\u003cp\u003e后面14号是浪潮的迎新晚会,15号还有你电的百团大战。现场特别热闹,酷安群的抽象海报和那张顶针专辑的关注度挺高的。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e早知道,还是原道.jpg\u003cdel\u003e触发悔恨之泪\u003c/del\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e后面跟着彦和辰出去溜达,没处去的时候\u003cdel\u003e骗\u003c/del\u003e带他俩来打maimai,俩人打得倒是不亦乐乎。后面看到一个用币随机抽天子手办的机器之后就走不动道了,把白嫖的币用完也没拿到qaq\u003c/p\u003e\u003cp\u003e这个月也发布了不少手机平板之类的。米14发布那天同学还拉着我去线下摸了真机器,还有华子那个特别大的平板冲击力也不小。\u003c/p\u003e\u003ch2 id=\"十一月\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E5%8D%81%E4%B8%80%E6%9C%88\" class=\"headerlink\" title=\"十一月\"\u003e\u003c/a\u003e十一月\u003c/h2\u003e\u003cp\u003e这个月也挺魔幻的,以一个重大删库事件为开端。不过实际影响并没有那么大,毕竟开源什么时候死过。\u003c/p\u003e\u003cp\u003e中间去电信的陕西主干IDC机房参观过。现代化的工业美学,真的帅的顶天。包括垂直化冗余能源设计,应急热交换塔(真的是个塔),特大号的备用发电机组机房和热交换机组机房,帅惨了。反倒是核心的业务机房,特别规整,\u003cdel\u003e环境优美\u003c/del\u003e倒是没啥特别突出的,不过单就这一间机房的装机量以及那个密堆叠,加上天花板走线,真的帅。这机房的数据吞吐量更是恐怖,出口时延\u0026lt;2ms,出口带宽16.4T(没见标注的单位是啥,应该是bps吧)。,\u003c/p\u003e\u003cp\u003e比较难绷的是介绍企业文化的时候,听到那个半部电台起家还以为在讲你电校史呢。另外比较惊喜的就是展示产品的时候,一个陈列墙上挂了很多相当大时间跨度的移动通信终端,甚至还有大哥大。回了学校之后刚好赶上各种国企的校招,就去凑了个热闹。\u003c/p\u003e\u003cp\u003e之后就是贴吧高校头像异变事件了。隔壁瓜大唐小天火遍全网,你电唐小电也一触即发。最后俩cp学校吧头官宣联动了。\u003c/p\u003e\u003cp\u003e月中,籽岷的工作站组装好了,然后子建就顺道来西安送东西+装机/溜达了。刚好有人电脑有问题,子建就把家伙拿上了。来都来了不拿个电脑顺带清清灰说不过去,但是因为服务器全塔实在背不动就只拿了俩笔记本。先给兆廷把液金换成了7958sp,然后某人就得液金ptsd了。更难绷的是兆廷电脑的热管因为玄学的剪切力弯了,不过无伤大雅,某人也没时间倒腾这问题了。\u003c/p\u003e\u003cp\u003e当天晚上我们几个还是继续推主线任务,给籽岷把他的工作站部署好顺带给一群人的电脑清灰+换硅脂\u003cdel\u003e反正7958sp又放不住不用白不用\u003c/del\u003e。但是离谱的是遇到玄学问题,明明子建拿来的时候已经给系统+专业软件都装好了,结果突然不能开机了。没办法,我跟子建就轮流干清灰/debug的活。最后整了半天没找出来问题,灰倒是都清完了。更离谱的是我俩一堆WinPE一个都进不去,然后我脑子一抽打算进我U盘上自带的Arch LiveCD试试。感谢Linux启动日志,我很快就把问题锁定到那个蓝盘上了。果然,替换法试了下,那个蓝盘莫名其妙挂了。\u003c/p\u003e\u003cp\u003e完事之后已经快早上五六点了,本来说完事打打mc呢也没时间了,睡吧。好在我们仨在东大村找了个宾馆住了一晚上,休息的也还行。第二天起来让籽岷换个固态,另一个哥们则是完全被整麻了。不过好在之后换了盘之后,远程指导同学分区装系统打驱动,一遍过。\u003c/p\u003e\u003cp\u003e事后彦看着我们当晚的工作场面照,评价说我们跟一群准备攻打瓜大的黑客一样。没绷住。另外就是被霓虹的场子做工震撼到了,那个松下的机子我第一回见到那么分体式的主板,而且也是我继G15之后见到的第二个风扇装主办背面的笔记本。换硅脂的时候我如履薄冰战战兢兢生怕抠的太用力给晶圆一块带走了,因为这东西硅脂已经彻底硬化了,估计是从16年到现在就没换过硅脂。好在有惊无险地清理完了。下午带子建在瓜大逛了一下午,以及中间难绷的是彦差点被他们点名拿下一血,好在没事。刚好这回来的时候他们在修飞机展示区,虽然不太了解军事但是这堆真货是真的帅。\u003c/p\u003e\u003cp\u003e以及后面清完灰之后发现手上这个松下的本子安静过头了,本来想赞扬下子建清灰手法高超,直到我拆开机器之后发现:\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e哥们忘插风扇电源了,那能不安静吗.jpg\u003cbr/\u003e狠狠拷打.jpg\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e之后就是各种上机/实验了,给我时间全占完了基本,导致瓜大的车万展子咱都没去成。哦月底还感冒了一回,不过还好是普通感冒,来得快去得也快,可能也是因为这学期报的散打强度比较大提升了免疫力?月末的电子线路课设差点给我带走,不过还好有惊无险过了。\u003c/p\u003e\u003cp\u003e29号酷安群线下k70发布会,印象最深的不是手机而是chi哥的发型。\u003c/p\u003e\u003ch2 id=\"十二月\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/#%E5%8D%81%E4%BA%8C%E6%9C%88\" class=\"headerlink\" title=\"十二月\"\u003e\u003c/a\u003e十二月\u003c/h2\u003e\u003cp\u003eISC这个月开了几次讲座,有我提议的Linux基础,还有AI那边发起的机器学习概论。质量都不错,场面也挺热闹的。\u003c/p\u003e\u003cp\u003e顺便几次差一点线下了Dimole,不过这孩子好像挺多灾多难的,希望人没事.jpg\u003c/p\u003e\u003cp\u003e然后月初带家里人来学校里逛了回,月中\u003cdel\u003e被大一学弟带\u003c/del\u003e带大一学弟打了星火杯。\u003c/p\u003e\u003cp\u003e12.15 今年的第一场雪。\u003c/p\u003e\u003cp\u003e12.16 三刷六级,微原实验,以及生日。\u003c/p\u003e\u003cp\u003e12.18 23:59 第一次被地震警报吵醒,希望甘肃同胞平安。\u003c/p\u003e\u003cp\u003e12.19 和好朋友去设了台,算是半个HAM了。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e没想到的是西电湖人的落幕带来的是西电冰人的出现,电专学子永远是会整活的。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e月底出去跟朋友溜达了一次,圣诞节跟一个未知的朋友交换了礼物,忙了一个月的各种ddl,\u003c/p\u003e\u003cp\u003e12.30 跟同学出去溜达就当提前跨年了。先是和彦在香积寺里边做了一下午的光影猎手,然后和兆廷在师大万科恰了顿饭,时间真快。\u003c/p\u003e\u003cp\u003e月初很忙,月末也忙,忙忙碌碌的一个月。\u003c/p\u003e\u003chr/\u003e\u003cp\u003e这篇流水账从28号开始写,到现在也刚好3天了,再过几个小时,人类又要庆祝自己小小的行星绕着恒星走过了一圈。年年如此,未来也将如此。\u003c/p\u003e\u003cp\u003e这个敲了半天的薄膜键盘,是我在高考完那个暑假买的,一个普通的键盘。它连上过我的老台式机,笔记本,以及现在这个松下笔记本,快三年了,它也老了:大部分按键因为写代码的摧残,已经被磨成了白色。左Shift也因为频繁使用,已经卡的吱吱嘎嘎的响。\u003c/p\u003e\u003cp\u003e看着键盘,想想我自己,好像也差不多。本科排课问题的摧残,jwc烂活的摧残,跟甲方搏斗的摧残,在某些方面我也逐渐迟钝起来,行动力也不如从前。似乎高考前那阵子是我行动力最强的时候,一个人凭着兴趣就写了快四千行代码,给自己和朋友们做了个小玩具。或许这也是一种磨损?\u003c/p\u003e\u003cp\u003e有时候真觉得自己老了,写不动了。不过这两年写的其实也并不少,甚至就那个因为各种原因烂尾的项目,我提交的代码可能都有几万行。相比于几年前,我确实进步了不少:纯粹依靠自己一个人做到的东西,上限越来越高了。特别是视野开拓了不少,现在能用很多学科的知识去解决实际问题了。不过最重要的还是热情,这几年挖过不少坑,甚至还在酷安发过自己编写的应用,给开源社区贡献了一个博客聚合系统的实现,也被收到了水表里边,作为博客星球的后端,在讲座上讲过两次技术相关的内容。竞赛也打了不少,奖也是。\u003c/p\u003e\u003cp\u003e不过,即使面对天堑我也不想停下,因为我就是想做到我想做的事。和自己和解能解决很多问题,但是我不想,只因为我不服这个自己。所以我一次次挑战自己。即使陷入迷惘,也不想停下步伐,因为这比找不到路更可怕。\u003c/p\u003e\u003cp\u003e现在已经是晚上了,冬天的太阳落山早,天已经黑了。舍友一个回家了,一个出去跨年了。宿舍只剩我一个,宿舍空荡荡的,也没开灯。对着空荡荡的Vim敲了半天,心里有种说不上来的孤独。这算不算是一种孤独编程?(笑)\u003c/p\u003e\u003cp\u003e还没感叹完呢,那几个哥们已经在商量着连麦跨年了。白孤独了(x\u003c/p\u003e\u003cp\u003e变的倒是很多,不变的也挺多。至少在外边,还有这些狐朋狗友陪着我,不是吗?\u003c/p\u003e\u003chr/\u003e\u003cp\u003e你好,2024。有什么展望的话,希望明年写流水账的时候,能来点更精彩的。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/12/31/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/2023%E8%BF%99%E4%B8%80%E5%B9%B4/"},{"title":"云原生架构的现状和未来","time":"2023-12-29T00:27:36Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"云原生架构的现状和未来\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5\" class=\"headerlink\" title=\"云原生架构的现状和未来\"\u003e\u003c/a\u003e云原生架构的现状和未来\u003c/h1\u003e\u003ch2 id=\"云原生的定义\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%BA%91%E5%8E%9F%E7%94%9F%E7%9A%84%E5%AE%9A%E4%B9%89\" class=\"headerlink\" title=\"云原生的定义\"\u003e\u003c/a\u003e云原生的定义\u003c/h2\u003e\u003cp\u003e云原生是一个很新的概念,笔者并没有搜集到这一概念的原始文献。不过目前最认可的定义通常如下:\u003c/p\u003e\u003cp\u003e云原生(Cloud Native)是一种软件开发和部署的方法,它利用云计算的特性,如弹性、自动化、可扩展性和微服务。云原生的应用程序可以在不同的云平台上运行,无需修改代码或配置。云原生的目标是提高软件的质量、效率和安全性,以适应快速变化的市场需求。\u003c/p\u003e\u003cp\u003e因此这种开发和部署模式相当适合如今对于业务需求繁复,且对于开发效率的要求很高的现状。举个例子,比如一个云原生应用的开发流程可以是这样:先根据需求设计系统架构,随后根据云原生应用的设计准则将应用划分为一系列无状态的微服务并将状态统一管理。完成代码编写后,通过Docker Images的形式发布,最后通过Kubernetes等部署在云服务器上,交付给客户。之后的测试环节也可以使用云原生平台的基础设施来完成后续的运维。\u003c/p\u003e\u003cp\u003e要更好地理解云原生,就得知道原来的开发模式是什么样的。传统的开发模式下,开发者通常得自己考虑数据库的配置和部署,软件发布后需要自己部署到目标计算机上,并且大部分的运维工作都需要手动完成,而这其中大部分的运维工作往往都是重复的,比如数据库的备份恢复,扩容,服务的扩容等等。传统架构下,需要开发者/运维根据文档手动添加系统的各部分,并修改系统的配置,甚至修改系统本身的部分实现。可以说,传统的架构就是直接在裸服务器环境下手动管理服务进程和系统的各部分软件。\u003c/p\u003e\u003ch3 id=\"云原生的发展历史\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%BA%91%E5%8E%9F%E7%94%9F%E7%9A%84%E5%8F%91%E5%B1%95%E5%8E%86%E5%8F%B2\" class=\"headerlink\" title=\"云原生的发展历史\"\u003e\u003c/a\u003e云原生的发展历史\u003c/h3\u003e\u003cp\u003e从全球云计算技术发展历程来看,大致经历了三个阶段:1.0是云计算培育期,以资源虚拟化和集中管理为核心技术特点;2.0是云计算成熟期,以云原生和资源编排为核心技术特点,大数据和人工智能成为热点;3.0是云计算发展深化期,进入算力时代,政府和企业应用加速上云,应用领域触及到政府和中大型企业核心系统,以云网融合、云边端协同为核心技术特点。\u003c/p\u003e\u003cp\u003e云的本质是对算力的妥协,以及对于用户体验的平衡,进而演进出的一种解决方案。当信息行业服务提供者的业务复杂到一定程度后,就必然会面对运维,也就是Ops的复杂度急剧上升的问题。云计算的诞生就是为了借助云将Ops的负担转移,让企业专注于业务本身,免于花费精力于服务端的维护上。\u003c/p\u003e\u003cp\u003e云计算、5G、AI、大数据、区块链等新技术的应用和数字化进程的加速,带来了丰富业务的同时也对网络功能提出了极高的挑战,传统网络仅提供纯粹的管道功能,已不能满足云上业务应用对网络资源的调度需求,因此催生了网络功能虚拟化和资源化的架构模式,以满足云业务对网络的调度需求。云原生技术的提出和发展,带来应用敏捷交付、快速弹性、平滑迁移、无损容灾等特点,被越来越多的企业用户所接受,企业关注点已经从以资源为中心转移到以应用为中心,网络需要同步演进,通过构筑敏捷、安全、开放、弹性、灵活的云原生网络更好地支持业务应用,推进数字时代的发展。\u003c/p\u003e\u003cp\u003e云原生作为网络演进的一个阶段,它的前两个阶段分别是单机互联时代和上云时代。这二者中,前者只是将各个机器使用网络连接起来,上云时代则将一部分资源从网络中抽离出来,以接口的形式暴露在网络中供网络使用。而云原生和网络的结合,也就是云原生网络,是利用云原生技术构建与云能够天然融合的新型网络架构。\u003c/p\u003e\u003ch3 id=\"为何需要云原生\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%B8%BA%E4%BD%95%E9%9C%80%E8%A6%81%E4%BA%91%E5%8E%9F%E7%94%9F\" class=\"headerlink\" title=\"为何需要云原生\"\u003e\u003c/a\u003e为何需要云原生\u003c/h3\u003e\u003cp\u003e传统的可变基础设施是指应用服务基于物理机或虚拟服务器进行部署,运行环境的构建依赖很多变量,诸如一些服务器上的配置、基础软件等,在不同环境之间可以通过动态配置下发或实时访问外部服务更新应用的状态,整个应用服务所依赖的基础设施一直处于变化之中,当出现需要进行应急回滚的场景时,运维人员处理流程往往会比较复杂,容易出错。\u003c/p\u003e\u003cp\u003e而云原生的通常做法是将应用依赖的基础设施(如安全插件、日志组件、JDK 基础软件等)打包成不可变的镜像,实现了多环境统一镜像,在应用发布时,只需对容器镜像进行变更即可,极大地降低了应用多环境的部署成本,同时对自动轮转替换、自动回滚等运维动作更友好,提升了基础设施运维的自动化水平。\u003c/p\u003e\u003ch2 id=\"云原生的现状分析\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%BA%91%E5%8E%9F%E7%94%9F%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%88%86%E6%9E%90\" class=\"headerlink\" title=\"云原生的现状分析\"\u003e\u003c/a\u003e云原生的现状分析\u003c/h2\u003e\u003ch3 id=\"云原生发展的三大关系\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%BA%91%E5%8E%9F%E7%94%9F%E5%8F%91%E5%B1%95%E7%9A%84%E4%B8%89%E5%A4%A7%E5%85%B3%E7%B3%BB\" class=\"headerlink\" title=\"云原生发展的三大关系\"\u003e\u003c/a\u003e云原生发展的三大关系\u003c/h3\u003e\u003cp\u003e软件和硬件的关系,服务器和终端的关系,算力和网络的关系。这几个对象在技术上互相融合,市场上互相补充,互相竞争。\u003c/p\u003e\u003cp\u003e服务器高算力,但是终端数量巨大,二者之间可以说是在进行着算力的博弈。云计算希望承载更多的算力并将终端变成瘦终端,终端希望承载更多的智能算力以进一步提升用户体验,边缘计算实际上是云计算和终端算力竞争下出现的一种阶段性产物。这样的竞争本质上是围绕需求和体验,保证算力无缝流转的问题。\u003c/p\u003e\u003cp\u003e也就是因为边缘设备的数量占比巨大,所以出现了边缘计算这个从端侧入手的算力利用方法,如何通过云的方式来结合二者的优势是一个问题。\u003c/p\u003e\u003ch3 id=\"云计算需要解决的四个问题\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%BA%91%E8%AE%A1%E7%AE%97%E9%9C%80%E8%A6%81%E8%A7%A3%E5%86%B3%E7%9A%84%E5%9B%9B%E4%B8%AA%E9%97%AE%E9%A2%98\" class=\"headerlink\" title=\"云计算需要解决的四个问题\"\u003e\u003c/a\u003e云计算需要解决的四个问题\u003c/h3\u003e\u003cp\u003e云原生本质还是一种服务交付和运维方式,它的底座还是云计算。而想要发展云计算,现阶段就必须面对这几个问题:\u003c/p\u003e\u003col\u003e\u003cli\u003e基础设施技术积累不足的问题:核心技术有供应链危险。现阶段在云服务器领域采用X86、ARM指令集的芯片占比超9成,自主指令集芯片占比低且与主流芯片存在较大代际差;操作系统国产化市场接受度不高,指令集和操作系统技术掌控不够是关系云计算产业供应链安全的根本问题。\u003c/li\u003e\u003cli\u003e软硬件协同处理问题:硬件层面摩尔定律失效,需要借助软硬件架构继续进步,本质是硬件和软件的关系。\u003c/li\u003e\u003cli\u003e云边缘资源调度问题:充分利用端侧算力,和云端算力统一调度的问题,本质是处理云计算和终端的关系。\u003c/li\u003e\u003cli\u003e网络云化的问题:现阶段网络成本高调度不灵活,需要”云化“来提升效率,本质是处理计算和网络的关系。\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"云原生的相关技术\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%BA%91%E5%8E%9F%E7%94%9F%E7%9A%84%E7%9B%B8%E5%85%B3%E6%8A%80%E6%9C%AF\" class=\"headerlink\" title=\"云原生的相关技术\"\u003e\u003c/a\u003e云原生的相关技术\u003c/h2\u003e\u003cp\u003e云原生虽然是一个比较新的概念,但是它的技术底座不少都是复用了已经相对成熟的解决方案,因此概念虽然新,但是借助着架构的合理抽象设计,云原生却有着很高的可用性和可靠性。\u003c/p\u003e\u003ch3 id=\"微服务\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E5%BE%AE%E6%9C%8D%E5%8A%A1\" class=\"headerlink\" title=\"微服务\"\u003e\u003c/a\u003e微服务\u003c/h3\u003e\u003cp\u003e随着互联网技术的发展,大型 IT 系统一般采用分布式计算模式,以优化资源配置并提高系统可靠性、可用性和灵活性等。为了便于分布式信息系统的设计、开发与集成,以及提高系统架构的灵活性、复用性和可增长性,面向服务的体系结构 SOA 因此产生。SOA 体系结构将定义良好的,具有开放接口并独立于软硬件平台以及实现技术的单个服务组件关联起来,以构造整体应用并采用松耦合的方式保护既有 IT 基础设施。实际上,SOA 只是一种架构思想,而 Web 服务及其相关标准和 SOAP、WSDL、UDDI 等协议的出现,则为 SOA 的具体 实 践 提 供 了 技 术 支 撑 和 处 理 方 案 。 Web 服 务 基 于SOA 架构理念,采用一套标准技术实现了对企业间服务资源的共享和复用。SOA 体系结构及 Web 服务等相关标准和技术的产生,为构造松耦合的大型分布式应用指明了较好的方向,并做了开拓性工作。\u003c/p\u003e\u003cp\u003e尽管 Web 服务为跨平台的企业开发提供了方便,但是在开发模式上,仍然采用的是单体架构。单体架构由于自身特点较适合小型应用的开发,并不适用于业务复杂度较高、业务需求量较大的中、大型企业。微服务体系结构思想的出现,则较好地解决了上述难题。其核心要义在于基于面向服务的思想,对传统大型应用系统进行 功 能 分 解 ,推 动 细 粒 度 服 务 的 使 用 。 微 服 务 架 构(MicroServices Architecture,MSA)则指根据应用系统的业务需求,通过对预定义的微服务进行重组而形成企业级应用的分布式体系结构。它主要将传统概念上的单体应用在功能、数据等方面进行分解,划分为多个具有明确边界并可被自由重组的小规模子服务。这些子服务间采用轻量级通信方式实现交互、协作,每个服务都有自己的数据库并可在独立进程中被部署、运行等,服务之间保持技术异构性,可由不同的团队选择合适的工具、语言进行开发。与单体架构相比,微服务架构的优势在于:(1)微服务按业务功能划分,每个服务都具备特定的功能,易于开发、维护等;(2)每个独立的微服务可以由不同的语言基于不同的平台开发,灵活性较好;(3)子服务可独立部署,能够实现可持续集成及交付;(4)容错能力强大,单个微服务出现问题不会影响系统其他服务的运行;(5)可实现动态按需实时扩展等。目前,微服务体系结构的思想已被应用于很多大型公司的分布式应用系统中。\u003c/p\u003e\u003ch3 id=\"容器\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E5%AE%B9%E5%99%A8\" class=\"headerlink\" title=\"容器\"\u003e\u003c/a\u003e容器\u003c/h3\u003e\u003cp\u003e如果要指出云原生的一个代表性技术的话,那就是以Docker为代表的轻量级虚拟化技术了。容器是一种新的软件分发方式,同时也是一种新的虚拟化运行时环境技术。近几年以Docker等为代表的轻量级虚拟化容器技术迅速兴起。作为一种新的软件交付方式,它给出了一种高可用的,十分简单的一体化部署和运维方案。\u003c/p\u003e\u003cp\u003e容器 (container) 技术作为一种轻量级的操作系统层面的虚拟化技术, 能够为软件应用及其依赖组件提供一个资源独立的运行环境 . 在容器化过程中, 应用程序及其所有必要的依赖关系 (代码、运行时、系统工具和系统库等) 会被打包成一个可重用的镜像 (image), 镜像内容可以通过配置文件 (例如 Dockerfile 和 docker-compose.yml)中的指令定义 , 镜像运行环境不与主操作系统共享内存、CPU 和硬盘空间, 由此也保证了容器内部进程与容器外部进程的独立关系 . 与传统虚拟机相比, 容器技术具有快速启动、运行环境可移植、弹性伸缩、快速部署以及低系统资源消耗等优点 . 随着云原生 、DevOps、CI/CD等愈发流行与普及, 容器技术在软件开发和运维方面有着广阔的应用前景 , 已经引起了业内的广泛关注 . 许多云服务提供商已经开始提供基于容器的云服务, 以满足其不断增长的需求, 例如谷歌容器引擎 (Google GKE)、亚马逊弹性容器服务 (Amazon ECS) 和 Azure容器服务 (Azure ACS).\u003c/p\u003e\u003cp\u003e在众多容器技术中, Docker 无疑是最受欢迎的容器化技术, 已成为工业界的行业标准. Docker 本身是一个基于 LXC (Linux 容器)、操作系统虚拟化 等技术实现的开源项目, 通过提供标准化的运行时环境, 可以将同一个软件构建版本用于开发、测试、预发布、生产等任何环境, 并且与底层操作系统解耦, 从而实现“构建一次, 随处运行”的目标. Docker 容器技术有希望将开发人员从繁重的开发运维负担中解脱出来, 其主要原因有 3 个:(1) Docker 可以很好地解决代码运行环境变更问题, 从而降低依赖时的复杂度; (2) Docker 可以通过定义环境, 很好地解决环境不一致的问题; (3) Docker 可以帮助开发者精简部署流程, 使代码部署更加透明、高效.\u003c/p\u003e\u003cp\u003e自 2013 年诞生至今, Docker 容器镜像已经被下载超过 1 300 亿次 (\u003ca href=\"https://www.docker.com/company\"\u003ehttps://www.docker.com/company\u003c/a\u003e). 《Flexera 2021 年云计算报告》发现, 76% 的公司受访者表示正在或计划使用 Docker 容器技术. 目前 Docker 受到越来越多的公司和开发者欢迎, 被广泛地应用于软件开发和运维过程 , 也在各种实际应用中部署, 例如智能汽车、物联网和雾/边缘计算 (fog/edge computing). 近年来, Docker 容器技术也逐渐成为学术界一个热门的研究领域, 相关论文发表在软件工程领域的高质量会议和期刊上, 如 ICSE、FSE 和 ESE 等. 此外, 在并行与分布计算 (如 TPDS) 以及存储系统 (如 FAST) 等领域的高质量会议上也有相关论文发表。\u003c/p\u003e\u003cp\u003e轻量级虚拟化技术可以应用在边缘和泛智能终端上,解决云边端协同场景下边缘和终端侧资源和性能有限的问题。在一些算力协同调度场景下,如视频识别场景下,可以将智能识别的算力从中心到边缘到终端进行卸载,如图像渲染场景下,可以将算力从终端迁移到边缘或者云端上。通过轻量级虚拟化技术实现一致的运行环境,配合云边端资源调度技术,保证算力自由流动提升云边端算力的整体使用效率。\u003c/p\u003e\u003cp\u003e虚拟化技术本质上是一种资源隔离技术,现阶段轻量级虚拟化有三条技术路线,一是针对传统虚拟化的裁剪和硬件卸载方案,适用于公有云场景,解决公有云高虚拟化损耗、网络和存储性能瓶颈等问题;二是轻量化容器技术,针对容器虚拟化进行裁剪,可以解决云边端协同场景下边缘和终端侧部署容器引擎占用资源过高的问题,前期研究测试表明,基于Containerd裁剪和结构优化后的轻量级容器引擎部署在树莓派开发板上进行测试,可使flash使用量减少80%,内存平均占用减少45%,可解决容器运行在边缘或终端上的储存空间和内存空间的不足问题;三是WASM(WebAssembly)技术,是一种新型代码运行隔离技术,基于web引擎运行C/C++、Java等多语言程序,具有性能好、占用资源少、多语言兼容的特点,可解决边缘和终端场景下资源隔离性能和效率问题,近期CNCF社区也出现基于WebAssembly标准的开源项目,可以基于云原生生态和工具,在容器环境下实现WASM技术和Kubernetes的集成,经过对比测试,资源占用量减少一个数量级,其性能对比传统容器技术有较大提升,执行效率提升20%,冷启动时间大幅缩短。以上三条技术路线不是替代的关系,而是场景有侧重、技术补充和协同的关系。\u003c/p\u003e\u003cp\u003e截至2023年底,业界已经有许多大型商业公司借助诸如Kubernetes等容器化方式来构建大规模的互联网服务了。比如滴滴出行等。“上云”因为其自身的高可用等优势,已经成为了一种必然的技术趋势。不过现阶段轻量级虚拟化的生态仍然在发展中,需要云计算产业界的继续推进才能达到更大规模的落地应用。\u003c/p\u003e\u003ch3 id=\"无服务(Serverless)\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E6%97%A0%E6%9C%8D%E5%8A%A1%EF%BC%88Serverless%EF%BC%89\" class=\"headerlink\" title=\"无服务(Serverless)\"\u003e\u003c/a\u003e无服务(Serverless)\u003c/h3\u003e\u003cp\u003e无服务器架构并不是说,未来不再需要服务器,而是不再着重关注底层的基础架构,更多的注意力可以放在和业务更相关的一些逻辑实现上,例如一些函数的代码片段,平台自动根据负载按需部署和启动,以及自动伸缩代码逻辑来满足业务处理的需求。\u003c/p\u003e\u003cp\u003e这项新兴计算模式专注于基础设施透明化,减轻服务器管理负担,解耦应用程序,节省云服务成本,让开发者更关注自身业务创新。“Serverless”常与“Serverful”一词相对,用于描述具有服务器透明化特性的技术与应用。2014年Serverless首次以云服务概念被提出,它实现了应用开发者与服务器的分离,减轻了开发者在服务器管理、安全等方面的负担;另一方面,云提供商托管所有基础设施,消除了底层设备差异对上层应用造成的不良影响。Serverless服务主要指函数即服务FaaS(Function as a Service),通常还包括了为FaaS配套的后端即服务BaaS(Backend as a Service)。FaaS提供函数管理平台和运行平台,前者包含函数代码托管与调度工具,兼容多种主流编程语言与开发库;后者本质是改进的PaaS,维持一批函数专用容器,支持事件驱动、自动伸缩等能力。与传统中心化单体应用相比,FaaS函数应用由互相独立的函数显式编排组成,能直观地表现应用的业务逻辑控制流和数据流。\u003cbr/\u003eBaaS本质是后端服务(认证鉴权、安全控制和云存储等)的集成库,可适应多种应用场景,如支持移动应用的M-BaaS(Mobile BaaS)。\u003c/p\u003e\u003ch3 id=\"DevOps\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#DevOps\" class=\"headerlink\" title=\"DevOps\"\u003e\u003c/a\u003eDevOps\u003c/h3\u003e\u003cp\u003eDevOps是个组合词,DevOps,就是开发和运维合体,不像开发和产品,经常刀刃相见,实际上DevOps应该还包括测试,DevOps是一个敏捷思维,是一个沟通文化,也是组织形式,为云原生提供持续交付能力。\u003c/p\u003e\u003ch3 id=\"持续交付\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E6%8C%81%E7%BB%AD%E4%BA%A4%E4%BB%98\" class=\"headerlink\" title=\"持续交付\"\u003e\u003c/a\u003e持续交付\u003c/h3\u003e\u003cp\u003e持续交付是不误时开发,不停机更新,小步快跑,反传统瀑布式开发模型,这要求开发版本和稳定版本并存,其实需要很多流程和工具支撑。\u003c/p\u003e\u003ch3 id=\"服务网格\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E6%9C%8D%E5%8A%A1%E7%BD%91%E6%A0%BC\" class=\"headerlink\" title=\"服务网格\"\u003e\u003c/a\u003e服务网格\u003c/h3\u003e\u003cp\u003e服务网格是近年兴起的一个话题,在容器微服务的基础上,通过服务网格可以让用户更精细、更智能的去管理服务之间的通讯。Service Mesh社区的旗舰项目Istio,当前的热度正在迅速的飙升。\u003c/p\u003e\u003ch3 id=\"面向网路的云原生技术\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E9%9D%A2%E5%90%91%E7%BD%91%E8%B7%AF%E7%9A%84%E4%BA%91%E5%8E%9F%E7%94%9F%E6%8A%80%E6%9C%AF\" class=\"headerlink\" title=\"面向网路的云原生技术\"\u003e\u003c/a\u003e面向网路的云原生技术\u003c/h3\u003e\u003cp\u003e作为云计算的最新技术成果,云原生技术可以为通信运营商网络提供更加经济、便捷的部署和运营方法,随着运营商云网融合工作推进,云原生成为运营商网络云化的核心技术和关键抓手。基于云原生技术实现云网融合成为业界共识,现阶段云网融合最迫切的问题就是网络上云,目前正处于5G网络规模部署和5G专网大力发展阶段,网络云原生当前的抓手就是5GC的云原生化。需要深入研究5GC系统架构、组网、高可靠、转发加速等CT属性,研究云原生承载5GC的技术要求,为各专业网元云原生化改造提供技术指引及范例。进一步结合技术要求,聚焦网元微服务化、高性能多网络平面、承载网络感知、资源编排等关键技术进行重点攻关,提供满足网络云化需求的云原生底座。后续依托云原生底座,实现5GC上公有云,为公有云全面解耦承接各专业网络上云打造良好开端。\u003c/p\u003e\u003cp\u003e目前中国电信依托自研高性能虚拟化平台,已经完成全面的5GC异厂家三层解耦测试并正在开展现网实验,即将在全网有序开展全云化5GC商用部署,并且正在积极推进5GC云原生化改造和轻量级5GC上天翼云的工作。云原生技术从本质上来说是软件技术,网络运营商一定要用IT软件的视角来看待未来的网络研发、建设和运维,积极拥抱这一变化,才可能在未来国家新基建领域中承担主力军的角色。\u003c/p\u003e\u003ch2 id=\"云原生的研究方向\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E4%BA%91%E5%8E%9F%E7%94%9F%E7%9A%84%E7%A0%94%E7%A9%B6%E6%96%B9%E5%90%91\" class=\"headerlink\" title=\"云原生的研究方向\"\u003e\u003c/a\u003e云原生的研究方向\u003c/h2\u003e\u003cp\u003e作为一个新兴技术,首先的研究方向就是它自身的基线技术。这方面有上面提到的容器化和虚拟化技术,微服务架构,服务网格(Service Mesh),无服务架构,DevOps和持续集成/持续部署(CI/CD)等。\u003c/p\u003e\u003cp\u003e除去这些作为云原生基座的技术之外,剩下的研究方向就是着眼于云原生自身的优势,问题和需求了。比如有如下这几点:\u003c/p\u003e\u003col\u003e\u003cli\u003e云原生安全\u003c/li\u003e\u003cli\u003e多模型数据库和存储\u003c/li\u003e\u003cli\u003e中间件技术\u003c/li\u003e\u003cli\u003e云原生应用架构设计模式\u003c/li\u003e\u003cli\u003e云原生生态系统的集成和互操作性\u003c/li\u003e\u003cli\u003e云原生技术标准化和规范\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e这些是目前几个比较流行的研究方向,总结起来,他们在研究的就是如何提高架构的可靠性,提高云原生架构本身的性能和资源利用率,如何让新的软件能最大化利用云原生架构的优势,如何设计云原生架构的规范,以及云原生的最佳实践这几点。当然,新的领域不可能全部套用老一套的方法论,一定还会有新的问题使得新的研究方向出现。\u003c/p\u003e\u003ch2 id=\"未来展望\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/#%E6%9C%AA%E6%9D%A5%E5%B1%95%E6%9C%9B\" class=\"headerlink\" title=\"未来展望\"\u003e\u003c/a\u003e未来展望\u003c/h2\u003e\u003cp\u003e从历史来看,云原生的发展是随着软件工程的发展而出现的一种必然产物。在软件工业中,当人们面对过高的复杂度时,往往会借助新的抽象和设计去消除或者是转化、统一复杂度。云原生的出现,就是为了更好地解耦大规模软件系统,降低运维和部署的复杂度,让容器和集群等技术充当解决这些复杂度的工具来降低开发者的心智负担,以及运维的成本和难度。\u003c/p\u003e\u003cp\u003e放眼未来,受限于摩尔定律在物理上的失效,以及边缘计算的发展,同时网络基座进一步降低成本,提升质量,单体集群的算力达到顶峰,必然会导致算力走向分布式,并走向基数庞大的边缘设备集群。因此,云原生架构所要解决的问题还会长期存在,并且必然会随着未来的云拓展向边缘设备集群而变得更加复杂。届时,对于云原生架构的中间件必然会提出更高的要求,同时,云的定义发生扩展也会导致软件架构的设计出现新的,能更充分利用边缘设备集群算力等资源的软件架构设计范式的出现。所以,未来很长一段时间之内,云原生架构应该会成为软件工业体系内的一套最佳实践,对应的基础设施和中间件研发,以及对应软件生命周期在云原生上的实践也会在长期的实践中得到沉淀。但是,一旦云原生架构无法适应未来出现的平台/系统,或者安全性难以保障,亦或者是云原生也无法解决未来的软件工业的架构复杂性,那时可能就是云原生架构的谢幕之时吧。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/12/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%BA%91%E5%8E%9F%E7%94%9F%E6%9E%B6%E6%9E%84%E7%9A%84%E7%8E%B0%E7%8A%B6%E5%92%8C%E6%9C%AA%E6%9D%A5/"},{"title":"函数式编程范式","time":"2023-12-11T14:00:41Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e对于大部分场合而言,优化不需要过早,到了需要优化的时候自然会意识到必要性。过早的优化只会带来负担。\u003c/p\u003e\u003cp\u003e最近JS写多了,都快不会写算法题了。其实不怪JS,只是绝大多数具体业务的实现一般很少需要用到什么重要算法。不过我遇到的问题是代码写烦了:这里写一坨那里写一坨,写一些忘一些,最后就成了一大坨,看着多但是实际功能并没多少。这让我想到了代码表达力的问题,于是我开始寻找方法去提高代码的表达力:写更少的代码,实现更多的功能。代码变得紧凑对于检查和维护来说也能降低一部分负担。\u003c/p\u003e\u003cp\u003e于是,我自然而然地正式接触到了函数式编程。对于当前的需求,这似乎就是答案。\u003c/p\u003e\u003ch2 id=\"介绍\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/functional-thinking/#%E4%BB%8B%E7%BB%8D\" class=\"headerlink\" title=\"介绍\"\u003e\u003c/a\u003e介绍\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e下面这段是我和LLM一块写的\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e函数式编程(Functional Programming)是一种编程范式,区别于命令式编程关注指令和操作,函数式编程更加关注函数本身,函数的组合、副作用,流程和代码可读性。函数作为一等公民,基本上可以在任何位置上出现。它关注函数的施用,而非具体操作的实现。这种编程风格强调将数据抽象为函数,将函数作为基本构建块来构建复杂的计算。函数式编程的优势包括:可读性、可维护性、可重用性等。\u003c/p\u003e\u003cp\u003e首先为啥叫函数式,因为函数就是核心,一切围绕函数展开。刚上手时,我对它的印象就是\u003c/p\u003e\u003cfigure class=\"highlight js\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003edata.\u003cspan class=\"title function_\"\u003emap\u003c/span\u003e(...).\u003cspan class=\"title function_\"\u003efilter\u003c/span\u003e(...).\u003cspan class=\"title function_\"\u003ereduce\u003c/span\u003e(...)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003edata.\u003cspan class=\"title function_\"\u003eforEach\u003c/span\u003e(...)\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e这样的。只用这几个函数对数据进行操作就能完成大部分数据操作,这对于处理各种返回值得到裁剪/过滤过的目标数据而言,十分高效简洁。在这两个例子里边,代码将数据处理作为一个流程对待,我们只需要描述\u003cstrong\u003e如何\u003c/strong\u003e处理这个数据源,以及处理的规则,其他的都无需我们参与。同样的需求,使用命令式编程,我们需要:\u003c/p\u003e\u003cfigure class=\"highlight js\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003elet\u003c/span\u003e processed=[]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efor\u003c/span\u003e(\u003cspan class=\"keyword\"\u003elet\u003c/span\u003e i=\u003cspan class=\"number\"\u003e0\u003c/span\u003e;i\u0026lt;data.\u003cspan class=\"property\"\u003elength\u003c/span\u003e;i++){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e (\u003cspan class=\"variable constant_\"\u003eMATCHING_COND\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e processed.\u003cspan class=\"title function_\"\u003epush\u003c/span\u003e(data[i])\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e为什么?因为上面的\u003ccode\u003emap\u003c/code\u003e,\u003ccode\u003ereduce\u003c/code\u003e,\u003ccode\u003efilter\u003c/code\u003e和\u003ccode\u003eforEach\u003c/code\u003e等都是高阶函数,它们可以被应用于数据源,接受一个函数作为参数,并使用函数处理数据。它们封装了常用的处理数据的流程,比如\u003ccode\u003emap\u003c/code\u003e会将数据的每一项使用传入的函数进行变换,并将它输出到新的数组中;\u003ccode\u003efilter\u003c/code\u003e会使用传入函数处理每一项,根据返回值是否为真将数据放入一个新的数组中并返回,等等。每一个高阶函数都是对于一个具体的数据处理流程的抽象描述,而这部分就是传统的命令式编程难以解决的问题——它们关注具体指令,你需要依靠具体的指令来解决你面对的问题,并自己编写具体的处理过程。\u003c/p\u003e\u003cp\u003e在上面传统的解决方法中,我们创建了变量\u003ccode\u003eprocessed\u003c/code\u003e,创建了用于循环的变量\u003ccode\u003ei\u003c/code\u003e,还使用了循环并规定了循环的结束条件,在循环体中规定了将结果加入循环的条件和流程。这些操作都在函数式操作中被抽象成了若干个高阶函数,我们无需再关心具体如何实现\u003ccode\u003emap\u003c/code\u003e和\u003ccode\u003efilter\u003c/code\u003e等操作,更不用自己去管理其中的状态(比如循环变量和用于保存中间处理结果的变量),实现了\u003cdel\u003e降本增效\u003c/del\u003e用少量代码完成常见需求,并减少了我们花费在状态管理(循环变量的创建,自增,临时变量的创建和改变等)和具体实现上的细节,而让我们只专注于和任务本身相关的部分。\u003c/p\u003e\u003cp\u003e并且,我们使用传递参数的方式将它们\u003cstrong\u003e组合\u003c/strong\u003e在一起,而非通过继承将它们\u003cstrong\u003e耦合\u003c/strong\u003e在一起。这一点意味着函数式编程降低了代码的耦合度,并且提高了代码的复用率:比起来面向对象按照类,通过继承进行复用,函数式编程将复用粒度降低到函数的级别,这也显著减少了无用代码。不过继承除了复用,还有规范和约束实现的作用。函数式编程如何解决这个问题我暂时还不太清楚。不过函数式编程,面向对象编程以及元编程,这三者属于是几乎正交的关系,所以完全可以交叉使用没啥问题。\u003c/p\u003e\u003cp\u003e另外还有一点上面的例子并没有表现出来,那就是关于副作用这一点。这个说法应该和不可变这一点放在一起来讲:上面的循环变量\u003ccode\u003ei\u003c/code\u003e就是一个可变的变量,循环的副作用就是改变了这个变量的值。再比如C指针的经典例子:通过\u003ccode\u003eswap\u003c/code\u003e交换两个变量的值,这就是一个典型的有副作用的函数,它改变了传入参数的值。函数式编程之所以排斥这样做,就是因为它在尽量避免函数的副作用,试图将所有函数变为纯函数:函数的执行结果只依赖于输入的值,而和外部状态无关,并且不改变外部的状态。它借此消除副作用带来的不确定性。而数据的不可变是它消除不确定性的另一个方法,这里就是函数式编程的精髓了:没有可变变量要怎么迭代/处理数据?不用迭代了,用递归就行。使用递归也提供了另一个观察问题的方式,比如对上面的迭代筛选例子,我们就可以用递归来改写,从而避免使用循环变量\u003ccode\u003ei\u003c/code\u003e:\u003c/p\u003e\u003cfigure class=\"highlight js\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003elet\u003c/span\u003e processed=[]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003econst\u003c/span\u003e \u003cspan class=\"title function_\"\u003eiter\u003c/span\u003e=(\u003cspan class=\"params\"\u003edata\u003c/span\u003e) =\u0026gt; {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(data.\u003cspan class=\"property\"\u003elength\u003c/span\u003e==\u003cspan class=\"number\"\u003e0\u003c/span\u003e) \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eelse\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(data[\u003cspan class=\"number\"\u003e0\u003c/span\u003e] \u003cspan class=\"variable constant_\"\u003eMATCHES_COND\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e data[\u003cspan class=\"number\"\u003e0\u003c/span\u003e] + \u003cspan class=\"title function_\"\u003eiter\u003c/span\u003e(data[\u003cspan class=\"number\"\u003e1\u003c/span\u003e:]);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"title function_\"\u003eiter\u003c/span\u003e(data[\u003cspan class=\"number\"\u003e1\u003c/span\u003e:])\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e }\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面的代码没用任何可变变量,也完成了数据源的筛选。虽然初次接触不太好想,但是解决大部分问题时,另一种视角确实有时会有意想不到的便利。以及不可变变量的好处也挺多的,比如天然没有竞争和并发问题。\u003c/p\u003e\u003cp\u003e另外关于递归的性能问题,用尾递归可以在受到递归优化的编程语言中得到不输迭代的性能。比如经典的斐波那契数列计算函数,就可以通过尾递归的写法结合语言的优化,达到和迭代写法基本一致的性能。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e下边这例子是LLM写的,暂时没验证\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure class=\"highlight javascript\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e27\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 定义一个高阶函数,用于计算两个数的和\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"title function_\"\u003esum\u003c/span\u003e(\u003cspan class=\"params\"\u003ea, b\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e a + b;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 使用高阶函数组合两个函数,用于计算两个数的和\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"title function_\"\u003ecalculator\u003c/span\u003e(\u003cspan class=\"params\"\u003e\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e sum;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 调用高阶函数组合器,并传入两个数字作为参数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003econst\u003c/span\u003e add = \u003cspan class=\"title function_\"\u003ecalculator\u003c/span\u003e();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 调用高阶函数组合器,并传入两个数字作为参数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003econst\u003c/span\u003e subtract = \u003cspan class=\"title function_\"\u003ecalculator\u003c/span\u003e(\u003cspan class=\"function\"\u003e\u003cspan class=\"params\"\u003ea\u003c/span\u003e =\u0026gt;\u003c/span\u003e a - b);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 调用高阶函数组合器,并传入两个数字作为参数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003econst\u003c/span\u003e multiply = \u003cspan class=\"title function_\"\u003ecalculator\u003c/span\u003e(\u003cspan class=\"function\"\u003e\u003cspan class=\"params\"\u003ea\u003c/span\u003e =\u0026gt;\u003c/span\u003e a * b);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 调用高阶函数组合器,并传入两个数字作为参数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003econst\u003c/span\u003e divide = \u003cspan class=\"title function_\"\u003ecalculator\u003c/span\u003e(\u003cspan class=\"function\"\u003e\u003cspan class=\"params\"\u003ea\u003c/span\u003e =\u0026gt;\u003c/span\u003e a / b);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 测试计算器函数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"variable language_\"\u003econsole\u003c/span\u003e.\u003cspan class=\"title function_\"\u003elog\u003c/span\u003e(\u003cspan class=\"title function_\"\u003eadd\u003c/span\u003e(\u003cspan class=\"number\"\u003e2\u003c/span\u003e, \u003cspan class=\"number\"\u003e3\u003c/span\u003e)); \u003cspan class=\"comment\"\u003e// 输出 5\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"variable language_\"\u003econsole\u003c/span\u003e.\u003cspan class=\"title function_\"\u003elog\u003c/span\u003e(\u003cspan class=\"title function_\"\u003esubtract\u003c/span\u003e(\u003cspan class=\"number\"\u003e5\u003c/span\u003e, \u003cspan class=\"number\"\u003e2\u003c/span\u003e)); \u003cspan class=\"comment\"\u003e// 输出 3\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"variable language_\"\u003econsole\u003c/span\u003e.\u003cspan class=\"title function_\"\u003elog\u003c/span\u003e(\u003cspan class=\"title function_\"\u003emultiply\u003c/span\u003e(\u003cspan class=\"number\"\u003e2\u003c/span\u003e, \u003cspan class=\"number\"\u003e3\u003c/span\u003e)); \u003cspan class=\"comment\"\u003e// 输出 6\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"variable language_\"\u003econsole\u003c/span\u003e.\u003cspan class=\"title function_\"\u003elog\u003c/span\u003e(\u003cspan class=\"title function_\"\u003edivide\u003c/span\u003e(\u003cspan class=\"number\"\u003e10\u003c/span\u003e, \u003cspan class=\"number\"\u003e2\u003c/span\u003e)); \u003cspan class=\"comment\"\u003e// 输出 5\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"组合\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/functional-thinking/#%E7%BB%84%E5%90%88\" class=\"headerlink\" title=\"组合\"\u003e\u003c/a\u003e组合\u003c/h2\u003e\u003cp\u003e组合和继承,都是复用代码的重要手段。组合简洁,继承稍微冗杂一些。\u003c/p\u003e\u003cp\u003e组合的概念就是将一些现有的单元组合到一起,形成新的工具去解决具体问题,而组合这个动作的适用对象就不止是函数那么简单了。它可以是函数的组合,可以是类型的组合,也可以是状态和函数的组合。\u003c/p\u003e\u003cp\u003e借\u003cdel\u003e从某大佬那里偷来的\u003c/del\u003e一个说法,大多数新的语法结构就是让人们更合理地去使用固定范式的GOTO,而Algebraic Effect就是其中最合理\u003cdel\u003e那个佬最推崇\u003c/del\u003e的一个。从我的视角看来,主流编程语言的演进都是朝着可读可写且尽可能兼顾效率的方向发展的。在这个过程中,损失的一部分就是语言的”Tricks”,或者说是语言的灵活性/可能性等。比如GOTO受到的接连削弱,它从一个十分灵活的结构变成了一堆固定但是更理智的语法结构,以一部分灵活性为代价换取了语言的可读性,以此提升可维护性。\u003c/p\u003e\u003cp\u003e组合呢?组合也是一种对于GOTO的封装。甚至更底层的,汇编中的GOTO,(部分)也就是jmp,它在汇编中也有对应的封装:子程序。而这些说法,对于指针这个原始的内存模型中的概念同样适用。封装提高了可读性,限制GOTO的直接使用限制了代码的可写性。二者的矛盾在足够优秀的语法结构出现前基本上是一对难以调和的矛盾。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/12/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/functional-thinking/"},{"title":"winget换源","time":"2023-12-09T12:35:48Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e\u003ca href=\"https://unicom.mirrors.ustc.edu.cn/help/winget-source.html\"\u003ewinget 是 Windows 的一个包管理器,可以用来安装、卸载、更新和搜索软件。winget 默认使用的是 Microsoft Store 的源,但是也可以换成其他的源,比如中科大的源。\u003c/a\u003e\u003ca href=\"https://unicom.mirrors.ustc.edu.cn/help/winget-source.html\"\u003e1\u003c/a\u003e\u003ca href=\"https://www.zhihu.com/question/509903409\"\u003e2\u003c/a\u003e\u003c/p\u003e\u003cp\u003e如果您想换源,您需要以管理员身份运行终端,然后使用以下命令:\u003c/p\u003e\u003cul\u003e\u003cli\u003e删除默认的源:\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003ewinget \u003cspan class=\"built_in\"\u003esource\u003c/span\u003e remove winget\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e添加中科大的源:\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003ewinget \u003cspan class=\"built_in\"\u003esource\u003c/span\u003e add winget https://mirrors.ustc.edu.cn/winget-source\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e重置为官方的源:\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003ewinget \u003cspan class=\"built_in\"\u003esource\u003c/span\u003e reset winget\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e\u003ca href=\"https://unicom.mirrors.ustc.edu.cn/help/winget-source.html\"\u003e\u003c/a\u003e\u003ca href=\"https://unicom.mirrors.ustc.edu.cn/help/winget-source.html\"\u003e1\u003c/a\u003e\u003ca href=\"https://unicom.mirrors.ustc.edu.cn/help/winget-source.html\"\u003e: WinGet 源使用帮助 — USTC Mirror Help 文档\u003c/a\u003e \u003ca href=\"https://www.zhihu.com/question/509903409\"\u003e2\u003c/a\u003e: winget是否可以用国内镜像? - 知乎\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/12/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/winget/"},{"title":"pandoc初窥","time":"2023-12-09T12:10:50Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003epandoc 是一个使用 Haskell 语言编写的一款跨平台、自由开源及命令行界面的标记语言转换工具,可实现不同标记语言间的格式转换,堪称该领域中的“瑞士军刀。pandoc 支持的输入和输出格式范围广泛,包括但不限于 Markdown、HTML、DOCX、PDF、LaTeX、EPUB 等。\u003c/p\u003e\u003cp\u003epandoc 不是 python 的库,但是有一个 python 的封装,叫做 pypandoc,可以在 python 代码中调用 pandoc 的功能。pypandoc 可以使用 pip 命令安装,例如:\u003c/p\u003e\u003cfigure class=\"highlight python\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003epip install pypandoc\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003epandoc 的日常用法主要是通过命令行来转换文档,例如:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003epandoc input.md -o output.html\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e这个命令就是将 input.md 这个 Markdown 文件转换为 output.html 这个 HTML 文件。pandoc 还有很多其他的选项和参数,可以参考 pandoc 的文档。\u003c/p\u003e\u003cp\u003epandoc 也可以在 python 代码中使用 pypandoc 来转换文档,例如:\u003c/p\u003e\u003cfigure class=\"highlight python\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eimport\u003c/span\u003e pypandoc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eoutput = pypandoc.convert_file(\u003cspan class=\"string\"\u003e\u0026#39;input.md\u0026#39;\u003c/span\u003e, \u003cspan class=\"string\"\u003e\u0026#39;html\u0026#39;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eprint\u003c/span\u003e(output)\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e这段代码就是将 input.md 这个 Markdown 文件转换为 HTML 字符串,并打印出来。pypandoc 还有其他的方法和参数,可以参考 pypandoc 的\u003ca href=\"https://blog.csdn.net/VN520/article/details/129120364\"\u003e文档\u003c/a\u003e。\u003c/p\u003e\u003cp\u003epandoc 是一个非常强大和灵活的文档转换工具,可以帮助你在不同的文档格式之间进行转换,特别是对于 Markdown 这种简洁易用的标记语言,可以轻松地生成 PDF、电子书、幻灯片等多种形式的文档。\u003c/p\u003e\u003ch2 id=\"格式转换\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/12/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/pandoc_note/#%E6%A0%BC%E5%BC%8F%E8%BD%AC%E6%8D%A2\" class=\"headerlink\" title=\"格式转换\"\u003e\u003c/a\u003e格式转换\u003c/h2\u003e\u003cp\u003e刚好今天得提交个Word报告,但是写东西我还是喜欢Vim,于是就打算写完转换成Word。正打算手动转换/网页在线转换的时候想起来了这个玩意——\u003c/p\u003e\u003cp\u003e然后就一行秒了。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003epandoc -o $(OUTPUT) -f markdown -t docx $(MARKDOWN) \u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e我直接从Makefile里摘出来的。用Makefile的话,写完敲个make就行。\u003c/p\u003e\u003cp\u003e最让我吃惊的是这玩意速度奇快,转换个快4000字的Markdown到Word,几乎跟我echo个字符串一样快,这还是我在7代intel移动端平台上测试的(?A?)\u003c/p\u003e\u003cul\u003e\u003cli\u003eMarkdown转Tex,速度也很快\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003epandoc -w latex ./test.md -o test.tex\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/12/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/pandoc_note/"},{"title":"计算机视觉学习笔记","time":"2023-11-06T12:02:29Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e之前导论课程上学的基本都是思想和原理,到这里就开始接触真正数学和工程的方法了。\u003c/p\u003e\u003ch2 id=\"序\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%BA%8F\" class=\"headerlink\" title=\"序\"\u003e\u003c/a\u003e序\u003c/h2\u003e\u003cp\u003e这门课的研究思路很清晰,就是围绕标题,自底向上,借助数学工具,一步一步实现各种复杂的功能以及算法,最终一步步接近让计算机拥有“视觉”的目标。\u003c/p\u003e\u003cp\u003e首先是数据的表示,概念的抽象,如何用离散的数据去近似抽象的视觉这个概念。这个过程通过直观理解和数学工具,以及建模方法,为计算机视觉提供了一种可行的数学上的表示和运算方法:像素,以及基于像素的一系列运算,比如滤波,仿射变换,更高自由度的变换,基于像素颜色值的变换等等,以及由这一系列变换得到的图像特征。\u003c/p\u003e\u003cp\u003e其次,是研究在图像的像素模型下,利用数学方法去研究分析以及利用图像特征的方法。这其中,就有诸如角点检测,边缘检测,全景图拼接以及处理等命题。\u003c/p\u003e\u003ch2 id=\"生成对抗网络GAN\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%94%9F%E6%88%90%E5%AF%B9%E6%8A%97%E7%BD%91%E7%BB%9CGAN\" class=\"headerlink\" title=\"生成对抗网络GAN\"\u003e\u003c/a\u003e生成对抗网络GAN\u003c/h2\u003e\u003cp\u003e通俗来说就是让两个网络作为对抗组,比如说生成图片的NN和鉴别图片的NN,两方轮流作为输入输出(也就是交替训练),在循环中不断提升两个网络的效果,最终达到生成内容以假乱真的效果。NN炼丹的关键是其中的loss函数设计,不过他们的做法是直接用另一个NN作为这个NN的loss函数来回馈训练效果。\u003c/p\u003e\u003cp\u003e目前比较突出的成果一个就是近几年的Stable Diffusion,算是这里边比较突出的一个了。这东西在图像的有损压缩里边用的也多,至于有损压缩的应用嘛,一般在一些需要使用算力去换带宽的场合很适用,比如卫星数据传输。其他应用就是图像的填充和补全,比如合理推测图像的缺失部分内容。另外就是,网络的输入不一定是噪声,输出也不一定是真假。改变其输入和输出的类型,可以赋予NN以不少是实用场景。\u003c/p\u003e\u003cp\u003eGAN的优点是效果好,比以前用的高斯模糊的效果都很好。但是问题也很突出,就是GAN很难训练。GAN的两方是生成器和判别器,训练的结果很大程度上与两方的能力是否足够接近有很大关系。\u003c/p\u003e\u003cp\u003e另外就是GAN的思想重点在对抗,并没有要求其他的条件。所以比如说可以有多个判别方,有多个生成方等。\u003c/p\u003e\u003ch2 id=\"Attention-Is-All-You-Need\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#Attention-Is-All-You-Need\" class=\"headerlink\" title=\"Attention Is All You Need\"\u003e\u003c/a\u003eAttention Is All You Need\u003c/h2\u003e\u003cp\u003e注意力机制一开始是应用于机器翻译领域,通过一个合适的重点词语权重标注机制,让算法更有重点地提取概要。如今的GPT也很大程度上受到注意力机制的启发才产生了不断预测下一个词向量概率的朴素思想。\u003c/p\u003e\u003cp\u003e注意力机制可以理解成给分词加上权重。将一个句子进行分词作为一个向量,将这个词语向量通过Softmax这样的激活函数进行处理之后,再借助矩阵进行变换,从而得到处理后的,带有权重的词向量。处理后的词向量,权重总和为1。加权后的句子,再进行翻译,效果就会好很多了。\u003c/p\u003e\u003cp\u003e至于将Attention思想迁移到CV领域进行应用的方法,关键是将图像”语义化“。一个常用的方法是将图像分割,分割成小块,对每个小块采用相同的思想。这就是VIT(Vision Transformer)的思想。\u003c/p\u003e\u003ch2 id=\"激活函数\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E6%BF%80%E6%B4%BB%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"激活函数\"\u003e\u003c/a\u003e激活函数\u003c/h2\u003e\u003ch3 id=\"Softmax\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#Softmax\" class=\"headerlink\" title=\"Softmax\"\u003e\u003c/a\u003eSoftmax\u003c/h3\u003e\u003cp\u003eSoftmax函数是一种常用的激活函数,主要用于将多分类问题中的输出值转换为概率分布。在神经网络中,输出层通常使用softmax函数,将输出值转换为每个类别概率。\u003c/p\u003e\u003cp\u003eSoftmax函数的定义如下:\u003cbr/\u003e$$\u003cbr/\u003eSoftmax(x) = e^(x_i) / (e^(x_1) + e^(x_2) + … + e^(x_n))\u003cbr/\u003e$$\u003cbr/\u003e其中,x是一个K维向量,Softmax函数的输出也是一个K维向量,并且每个元素的范围都在0到1之间,并且所有元素的和为1。\u003c/p\u003e\u003cp\u003e在多分类问题中,假设输出层有K个神经元,每个神经元代表一个类别。Softmax函数的作用是将输出层的输出转换为每个类别对应的概率。例如,如果输出层输出为[1.2, 2.3, 3.1],则对应的概率为[0.21, 0.34, 0.45]。\u003c/p\u003e\u003cp\u003eSoftmax函数可以解决输出值非常大的问题,因为它可以防止输出值过大而导致的梯度消失或梯度爆炸。此外,Softmax函数还可以进行归一化,使得概率和为1,使得概率分布更加合理。\u003c/p\u003e\u003ch2 id=\"期末划重点咯\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E6%9C%9F%E6%9C%AB%E5%88%92%E9%87%8D%E7%82%B9%E5%92%AF\" class=\"headerlink\" title=\"期末划重点咯\"\u003e\u003c/a\u003e期末划重点咯\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e\u003ccode\u003esudo 老师给我分\u003c/code\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e有个压缩包,里边画红钩的都是重点\u003c/p\u003e\u003cp\u003e占比大概NN和传统方法4-6开\u003c/p\u003e\u003cul\u003e\u003cli\u003eChap 1 没啥重点\u003cul\u003e\u003cli\u003e什么是光, 可见光谱的范围这些的\u003c/li\u003e\u003cli\u003e人的视觉系统这些概念啥的\u003c/li\u003e\u003cli\u003e三色光的相关内容\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 3 重点\u003cul\u003e\u003cli\u003e灰度图(取值范围),RGB\u003c/li\u003e\u003cli\u003e图像两种基本运算\u003c/li\u003e\u003cli\u003e矩阵的运算\u003c/li\u003e\u003cli\u003e滤波概念,高斯滤波\u003c/li\u003e\u003cli\u003e卷积,点乘积,性质,计算过程strike, padding计算结果图像尺寸这些的\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 4 边缘检测\u003cul\u003e\u003cli\u003e边缘定义,为啥是边缘\u003c/li\u003e\u003cli\u003e图像的梯度\u003c/li\u003e\u003cli\u003e噪声\u003c/li\u003e\u003cli\u003e边缘检测器:sobel算子,roberts算子,prewwit算子等\u003c/li\u003e\u003cli\u003e边缘存在的问题:噪声,拟合等\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 6 图像插值\u003cul\u003e\u003cli\u003e线性插值,上下采样等,高斯金字塔\u003c/li\u003e\u003cli\u003e图像放大的插值算法(超分)\u003cul\u003e\u003cli\u003e最近邻,双线性,三次插值。不过现在都用GNN做超分了\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap ? 特征匹配\u003cul\u003e\u003cli\u003e典型特征匹配计算方法\u003c/li\u003e\u003cli\u003e特征和特真不变性:啥特征的啥不变性 SIFT特征\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 7 图像变换\u003cul\u003e\u003cli\u003e几种变换方式\u003c/li\u003e\u003cli\u003e线性变换:变灰度,变尺度等\u003c/li\u003e\u003cli\u003e按照变换剧烈程度递增:平移,旋转,仿射,投影\u003c/li\u003e\u003cli\u003e得记得变换矩阵的特征,大概得看明白\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 8 图像配准 没啥讲的\u003c/li\u003e\u003cli\u003eChap 11 单视图建模\u003cul\u003e\u003cli\u003e消失线和消失点等 得会计算\u003c/li\u003e\u003c/ul\u003e\u003cul\u003e\u003cli\u003e双试图立体视觉:视差和深度计算\u003c/li\u003e\u003cli\u003e窗口配准\u003c/li\u003e\u003cli\u003e极点极线极面\u003c/li\u003e\u003cli\u003e本质矩阵,基本矩阵是谁到谁的映射\u003c/li\u003e\u003cli\u003e深度估计\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 14 图像三维重建\u003cul\u003e\u003cli\u003e一个相机转着拍 内参矩阵不变,为了配窗\u003c/li\u003e\u003cli\u003e重复的问题\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 16 机器视觉\u003cul\u003e\u003cli\u003e激活函数和矩阵计算\u003c/li\u003e\u003cli\u003e神经网络结构\u003c/li\u003e\u003cli\u003e卷积网络的池化操作\u003c/li\u003e\u003c/ul\u003e\u003cul\u003e\u003cli\u003e反向传播:对w求导而非对x求导,而且得会算反向传播函数\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 18 图像分割\u003cul\u003e\u003cli\u003e语义分割和实例分割\u003c/li\u003e\u003cli\u003e分割手段:边缘检测,聚类等方法\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 19 目标检测与分类\u003cul\u003e\u003cli\u003e输出:中心型,边界型\u003c/li\u003e\u003cli\u003e两个方法:两步法,一步法(Yolo)\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 21 实操\u003cul\u003e\u003cli\u003e玩玩pytorch\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eChap 23 神经网络前沿\u003cul\u003e\u003cli\u003eGAN\u003c/li\u003e\u003cli\u003eAttention(q,k,v)\u003cul\u003e\u003cli\u003eSoftmax\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"计算机视觉复习\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%A4%8D%E4%B9%A0\" class=\"headerlink\" title=\"计算机视觉复习\"\u003e\u003c/a\u003e计算机视觉复习\u003c/h2\u003e\u003cp\u003e找到一个学长的复习笔记如下\u003c/p\u003e\u003ch3 id=\"图像和图像滤波\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%9B%BE%E5%83%8F%E5%92%8C%E5%9B%BE%E5%83%8F%E6%BB%A4%E6%B3%A2\" class=\"headerlink\" title=\"图像和图像滤波\"\u003e\u003c/a\u003e图像和图像滤波\u003c/h3\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e什么是滤波\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e形成一个新的图像,其像素是原始像素的组合\u003c/p\u003e\u003c/blockquote\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e什么时候利用滤波\u003c/p\u003e\u003cul\u003e\u003cli\u003e==\u003cstrong\u003e增强图像:\u003c/strong\u003e== 降噪、锐化\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e==提取信息:==\u003c/strong\u003e 提取边缘或轮廓\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e滤波的种类:\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e线性滤波:用相邻的线性组合 (加权和)替换每个像素\u003c/p\u003e\u003cul\u003e\u003cli\u003e线性组合的系数称为权重核\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e卷积:\u003c/strong\u003e(权重核反转(水平和垂直))\u003cbr/\u003e$$\u003cbr/\u003eG [ i , j ] = \\sum _ { u = - k } ^ { k } \\sum _ { v = - k } ^ { k } H [ u , v ] F [ i - u , j - v ]\u003cbr/\u003e$$\u003cbr/\u003e记为\u003cbr/\u003e$$\u003cbr/\u003eG=H*F\u003cbr/\u003e$$\u003cbr/\u003e\u003cstrong\u003e相关:\u003c/strong\u003e\u003cbr/\u003e$$\u003cbr/\u003eG [ i , j ] = \\sum _ { u = - k } ^ { k } \\sum _ { v = - k } ^ { k } H [ u , v ] F [ i + u , j + v ]\u003cbr/\u003e$$\u003cbr/\u003e记为:\u003cbr/\u003e$$\u003cbr/\u003eG = H \\otimes F\u003cbr/\u003e$$\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e高斯滤波\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e==从图像中删除 「高频」分量 (低通滤波器)==\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e==高斯核函数==:\u003cbr/\u003e$$\u003cbr/\u003eG _ { \\sigma } = \\frac { 1 } { 2 \\pi \\sigma ^ { 2 } } e ^ { - \\frac { \\left( x ^ { 2 } + y ^ { 2 } \\right) } { 2 \\sigma ^ { 2 } } }\u003cbr/\u003e$$\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e滤波的应用\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e锐化滤波器:\u003cbr/\u003e$$\u003cbr/\u003eF + \\alpha (F-F*H)\u003cbr/\u003e$$\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e阈值滤波器\u003cbr/\u003e$$\u003cbr/\u003eg ( m , n ) = \\left{ \\begin{array} { c c } { 255 , } \u0026amp; { f ( m , n ) \u0026gt; A } \\ { 0 } \u0026amp; { \\text { otherwise } } \\end{array} \\right.\u003cbr/\u003e$$\u003cbr/\u003e==阈值滤波器不是线性滤波==\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e相关和卷积的定义和关系\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e高斯核\u003c/p\u003e\u003cul\u003e\u003cli\u003e调节哪个参数\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e什么是线性滤波器\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e去燥使用什么滤波\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"边缘检测\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%BE%B9%E7%BC%98%E6%A3%80%E6%B5%8B\" class=\"headerlink\" title=\"边缘检测\"\u003e\u003c/a\u003e边缘检测\u003c/h3\u003e\u003ch4 id=\"边缘的特征\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%BE%B9%E7%BC%98%E7%9A%84%E7%89%B9%E5%BE%81\" class=\"headerlink\" title=\"边缘的特征\"\u003e\u003c/a\u003e边缘的特征\u003c/h4\u003e\u003cblockquote\u003e\u003cp\u003e怎样通过导数来反映边缘\u003c/p\u003e\u003c/blockquote\u003e\u003cul\u003e\u003cli\u003e==对于图像强度的一阶导数,边缘对应于导数的极值==\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e如何计算数字图像的导数?\u003c/strong\u003e\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e重建连续图像,然后计算导数\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e采用离散导数(有限差分): ==图像的梯度相当于两个相邻像素之间的差值==\u003cbr/\u003e$$\u003cbr/\u003e\\frac { \\partial f } { \\partial x } [ x , y ] \\approx F [ x + 1 , y ] - F [ x , y ]\u003cbr/\u003e$$\u003cbr/\u003e可以使用线性滤波器实现\u003c/p\u003e\u003cp\u003e==梯度的方向 \u003cstrong\u003e垂直于边缘的方向\u003c/strong\u003e==,梯度的方向是 图像函数 f(x,y) 变化最快的方向,当图像中存在边缘时,一定有较大的梯度\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"图像梯度\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%9B%BE%E5%83%8F%E6%A2%AF%E5%BA%A6\" class=\"headerlink\" title=\"图像梯度\"\u003e\u003c/a\u003e图像梯度\u003c/h4\u003e\u003cp\u003e图像梯度是图像函数在 x ,y 两个方向的导数,\u003c/p\u003e\u003cp\u003e幅值:\u003cbr/\u003e$$\u003cbr/\u003e| \\nabla f | = \\sqrt { \\left( \\frac { \\partial f } { \\partial x } \\right) ^ { 2 } + \\left( \\frac { \\partial f } { \\partial y } \\right) ^ { 2 } }\u003cbr/\u003e$$\u003cbr/\u003e方向:\u003cbr/\u003e$$\u003cbr/\u003e\\theta = \\tan ^ { - 1 } \\left( \\frac { \\partial f } { \\partial y } / \\frac { \\partial f } { \\partial x } \\right)\u003cbr/\u003e$$\u003cbr/\u003e\u003cstrong\u003e==要计算图像梯度,首先要图像去噪,使用高斯核在图像上卷积,平滑图像==\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e可以将两次滤波 (高斯滤波、差分滤波)合成一步实现\u003c/p\u003e\u003cp\u003e\u003cimg src=\"http://media.sumblog.cn/blog/20190102/XhVYP5it42Yb.png?imageslim\" alt=\"mark\"/\u003e\u003c/p\u003e\u003ch5 id=\"二维边缘检测使用的图像算子:\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E4%BA%8C%E7%BB%B4%E8%BE%B9%E7%BC%98%E6%A3%80%E6%B5%8B%E4%BD%BF%E7%94%A8%E7%9A%84%E5%9B%BE%E5%83%8F%E7%AE%97%E5%AD%90%EF%BC%9A\" class=\"headerlink\" title=\"二维边缘检测使用的图像算子:\"\u003e\u003c/a\u003e二维边缘检测使用的图像算子:\u003c/h5\u003e\u003col\u003e\u003cli\u003e\u003cp\u003eSobel 算子\u003c/p\u003e\u003cp\u003e\u003cimg src=\"http://media.sumblog.cn/blog/20190102/PIUiMGyShLVT.png?imageslim\" alt=\"mark\"/\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"非最大抑制\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E9%9D%9E%E6%9C%80%E5%A4%A7%E6%8A%91%E5%88%B6\" class=\"headerlink\" title=\"非最大抑制\"\u003e\u003c/a\u003e非最大抑制\u003c/h4\u003e\u003cp\u003e检查像素是否为\u003cstrong\u003e沿梯度方向的局部最大值\u003c/strong\u003e (需要进行像素差值?)\u003c/p\u003e\u003col start=\"2\"\u003e\u003cli\u003e\u003cp\u003e==Canny 边缘检测器==\u003c/p\u003e\u003col\u003e\u003cli\u003e用高斯导数滤波\u003c/li\u003e\u003cli\u003e获得梯度的幅值和方向\u003c/li\u003e\u003cli\u003e非最大抑制\u003c/li\u003e\u003cli\u003e连接与滞后阈值化:\u003cul\u003e\u003cli\u003e定义高低两个阈值\u003c/li\u003e\u003cli\u003e用==高阈值来寻找边缘曲线的起点,用低阈值来确定后继点==,进行连接\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cstrong\u003eCanny 边缘检测器的参数:\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e$\\sigma:$ 高斯模糊的宽度:大的 $\\sigma$ 可以检测大尺度边缘,$\\sigma$ ==越小,能检测到的细微边缘就越多==\u003c/li\u003e\u003cli\u003e高阈值\u003c/li\u003e\u003cli\u003e低阈值\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e图像的导数\u003c/li\u003e\u003cli\u003e图像的梯度是什么 (两个方向的导数)(复制和方向)\u003c/li\u003e\u003cli\u003e去噪\u003c/li\u003e\u003cli\u003e二维边缘检测\u003cul\u003e\u003cli\u003e列举几个图像算子\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e费最大值抑制\u003c/li\u003e\u003cli\u003e边缘检测器\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"图像的插值和重采样\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%9B%BE%E5%83%8F%E7%9A%84%E6%8F%92%E5%80%BC%E5%92%8C%E9%87%8D%E9%87%87%E6%A0%B7\" class=\"headerlink\" title=\"图像的插值和重采样\"\u003e\u003c/a\u003e图像的插值和重采样\u003c/h3\u003e\u003ch4 id=\"图像采样\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%9B%BE%E5%83%8F%E9%87%87%E6%A0%B7\" class=\"headerlink\" title=\"图像采样\"\u003e\u003c/a\u003e图像采样\u003c/h4\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e采样率\u003c/p\u003e\u003cp\u003e==\u003cstrong\u003e奈奎斯特采样率:\u003c/strong\u003e 采样率 \u0026gt;= 2*图像中的最大频率==\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e若原始图像的频率过高,先对图像滤波,然后子采样\u003c/strong\u003e,构建高斯金字塔\u003c/p\u003e\u003ch4 id=\"图像插值\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%9B%BE%E5%83%8F%E6%8F%92%E5%80%BC\" class=\"headerlink\" title=\"图像插值\"\u003e\u003c/a\u003e图像插值\u003c/h4\u003e\u003cul\u003e\u003cli\u003e最近邻差值:重复 n 次\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e双线性插值\u003c/strong\u003e: 利用输入图像中与输出图像像素点映射位置最邻近的4个像素点的颜色值(或灰度值)计算输出图像中像素点的颜色值(或灰度值)\u003c/li\u003e\u003cli\u003e双三次插值:为了得到更精确的(x’,y’)的颜色值(或灰度值)g(x’,y’),就不仅需要考虑与(x’,y’)点最邻近的四个点对它的影响,还要考虑到该点周围16个相邻点的颜色值(或灰度值)对它的影响。\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"角点检测\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%A7%92%E7%82%B9%E6%A3%80%E6%B5%8B\" class=\"headerlink\" title=\"角点检测\"\u003e\u003c/a\u003e角点检测\u003c/h3\u003e\u003cp\u003eHarris 角点检测:将窗口平移,比较平移前后 w 内每个像素的差异平方和(SSD)\u003cbr/\u003e$$\u003cbr/\u003eE ( u , v ) = \\sum _ { ( x , y ) \\in W } [ I ( x + u , y + v ) - I ( x , y ) ] ^ { 2 }\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003e\\begin{aligned} E ( u , v ) = \u0026amp; \\sum _ { ( x , y ) \\in W } [ I ( x + u , y + v ) - I ( x , y ) ] ^ { 2 } \\ \\approx \u0026amp; \\sum _ { ( x , y ) \\in W } \\left[ I ( x , y ) + I _ { x } u + I _ { y } v - I ( x , y ) \\right] ^ { 2 } \\ \\approx \u0026amp; \\sum _ { ( x , y ) \\in W } \\left[ I _ { x } u + I _ { y } v \\right] ^ { 2 }\\ \\approx Au^2+2Buv +Cv^2\\ \\end{aligned}\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003eA = \\sum _ { ( x , y ) \\in W } I _ { x } ^ { 2 } \\quad B = \\sum _ { ( x , y ) \\in W } I _ { x } I _ { y } \\quad C = \\sum _ { ( x , y ) \\in W } I _ { y } ^ { 2 }\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e算法实现:\u003c/strong\u003e\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e计算图像在 X, Y 两个方向的梯度\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e计算两个方向上梯度的乘积\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e使用高斯函数对 $I_x^2,I_y^2,I_xI_y$ 进行高斯加权,生成矩阵的元素 A,B,C\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e计算每个像素的 Harris 响应值 R, 并对小于某个阈值的 R 置 0\u003cbr/\u003e$$\u003cbr/\u003eR = \\left{ R : \\operatorname { det } M - \\alpha ( \\operatorname { trace } M ) ^ { 2 } \u0026lt; t \\right}\u003cbr/\u003e$$\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e在邻域内进行非最大抑制,局部最大值即为图像的角点\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"特征不变性\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%89%B9%E5%BE%81%E4%B8%8D%E5%8F%98%E6%80%A7\" class=\"headerlink\" title=\"特征不变性\"\u003e\u003c/a\u003e特征不变性\u003c/h3\u003e\u003cp\u003e我们希望角点的位置对光度变换具有不变性 (图像变换之后,角点位置不变),对几何变换具有协变性 (相应位置检测到同一特征)\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e不变性:\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e对平移、旋转协变\u003c/li\u003e\u003cli\u003e对强度平移具有不变性,对强度缩放不具有不变性\u003c/li\u003e\u003cli\u003e对缩放不具有不变性\u003cul\u003e\u003cli\u003e需要同时在位置和尺度上查找:自动尺度选择\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e自动尺度选择:\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e在高斯金字塔中使用固定大小的窗口,寻找具有局部最大值的尺度\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e斑点检测:\u003c/strong\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e斑点是指二维图像中和周围颜色有颜色差异和灰度差异的区域,因为斑点代表的是一个区域,所以其相对于单纯的角点,具有更好的稳定性和更好的抗干扰能力.\u003c/p\u003e\u003c/blockquote\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e核函数:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e高斯拉普拉斯:\u003cbr/\u003e$$\u003cbr/\u003e\\nabla ^ { 2 } g = \\frac { \\partial ^ { 2 } g } { \\partial x ^ { 2 } } + \\frac { \\partial ^ { 2 } g } { \\partial y ^ { 2 } }\u003cbr/\u003e$$\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e高斯差分函数\u003cbr/\u003e$$\u003cbr/\u003eD o G = G ( x , y , k \\sigma ) - G ( x , y , \\sigma )\u003cbr/\u003e$$\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e当 $$\\sigma = r/\\sqrt{2}$$ 时,响应最大,图像黑白反向时,响应最小,因此将高斯拉普拉斯算子响应达到峰值的 $\\sigma$ 值,称为特征尺度\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e怎么实现特征的不变\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003eHarris 检测的步骤\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"特征描述与匹配\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%89%B9%E5%BE%81%E6%8F%8F%E8%BF%B0%E4%B8%8E%E5%8C%B9%E9%85%8D\" class=\"headerlink\" title=\"特征描述与匹配\"\u003e\u003c/a\u003e特征描述与匹配\u003c/h3\u003e\u003ch4 id=\"特征描述符\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%89%B9%E5%BE%81%E6%8F%8F%E8%BF%B0%E7%AC%A6\" class=\"headerlink\" title=\"特征描述符\"\u003e\u003c/a\u003e特征描述符\u003c/h4\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e\u003cstrong\u003eMOPS\u003c/strong\u003e:\u003c/p\u003e\u003col\u003e\u003cli\u003e选取特征点周围 40*40 的方形窗口\u003c/li\u003e\u003cli\u003e缩放到 1/5 大小\u003c/li\u003e\u003cli\u003e旋转特征向量方向到水平\u003c/li\u003e\u003cli\u003e在以特征为中心的 8*8 方形窗口内采样\u003c/li\u003e\u003cli\u003e规格化 (强度减去平均值,除以标准差,均值为0,方差为1)\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003cstrong\u003eSIFT:\u003c/strong\u003e尺度不变特征转换\u003c/p\u003e\u003cp\u003e\u003cimg src=\"http://media.sumblog.cn/blog/20190102/52PLX111WYbj.png?imageslim\" alt=\"mark\"/\u003e\u003c/p\u003e\u003col\u003e\u003cli\u003e在所检测的特征周围取 16*16 的窗口\u003c/li\u003e\u003cli\u003e为每个像素计算边缘方向\u003c/li\u003e\u003cli\u003e去除弱的边缘方向(设定阈值)\u003c/li\u003e\u003cli\u003e为剩余边缘方向建立直方图\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"特征匹配\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%89%B9%E5%BE%81%E5%8C%B9%E9%85%8D\" class=\"headerlink\" title=\"特征匹配\"\u003e\u003c/a\u003e特征匹配\u003c/h4\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e特征距离\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e更好的方法:距离比\u003c/p\u003e\u003cp\u003e$f_2$ 是 $f_1$ 在 $I_2$ 中最好的 SSD 匹配,$f_2^\\prime$ 次之\u003cbr/\u003e$$\u003cbr/\u003e距离比 = \\frac{||f_1-f_2||}{||f_1-f_2^\\prime||}\u003cbr/\u003e$$\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e测量特征匹配的性能\u003c/p\u003e\u003cul\u003e\u003cli\u003e真正例率(TPR) (召回率) = 匹配到的真正例数 / 所有真正例数\u003c/li\u003e\u003cli\u003e假正例率 (FPR) = 匹配到的假正例数/所有真正例数\u003c/li\u003e\u003cli\u003eROC 曲线:以 FPR 为横轴,TPR 为纵轴\u003c/li\u003e\u003cli\u003eAUC:曲线下的面积,越大越好\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"变换与卷绕\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%8F%98%E6%8D%A2%E4%B8%8E%E5%8D%B7%E7%BB%95\" class=\"headerlink\" title=\"变换与卷绕\"\u003e\u003c/a\u003e变换与卷绕\u003c/h3\u003e\u003cp\u003e什么是图像卷绕:\u003cstrong\u003e更改图像的定义域\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e常见的变换\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e平移\u003c/li\u003e\u003cli\u003e欧式变换:平移+旋转\u003c/li\u003e\u003cli\u003e相似变换:平移+旋转+等比放缩\u003c/li\u003e\u003cli\u003e仿射变换:平移+旋转+等比放缩+剪切\u003c/li\u003e\u003cli\u003e投影变换:原来平行的线不再平行,但还是保持直线性\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"线性变换\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%BA%BF%E6%80%A7%E5%8F%98%E6%8D%A2\" class=\"headerlink\" title=\"线性变换\"\u003e\u003c/a\u003e线性变换\u003c/h4\u003e\u003cul\u003e\u003cli\u003e等比缩放: 比例S\u003c/li\u003e\u003cli\u003e旋转角度 \u003c/li\u003e\u003cli\u003e剪切\u003c/li\u003e\u003cli\u003e镜像\u003c/li\u003e\u003c/ul\u003e\u003cblockquote\u003e\u003cp\u003e\u003cstrong\u003e线性变换的性质\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e原点到原点\u003c/p\u003e\u003cp\u003e直线到直线\u003c/p\u003e\u003cp\u003e平行线保持平行\u003c/p\u003e\u003cp\u003e比率被保持\u003c/p\u003e\u003cp\u003e线性变换的组合是线性变换\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e平移不是 2D 坐标上的线性变换,我们需要 \u003cstrong\u003e添加一个坐标\u003c/strong\u003e -\u0026gt; \u003cstrong\u003e齐次坐标\u003c/strong\u003e\u003c/p\u003e\u003ch3 id=\"仿射变换\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E4%BB%BF%E5%B0%84%E5%8F%98%E6%8D%A2\" class=\"headerlink\" title=\"仿射变换\"\u003e\u003c/a\u003e仿射变换\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003e任何最后一行 为 [0,0,1] 的 3·3 矩阵表示的转换称为仿射变换\u003c/strong\u003e,\u003cstrong\u003e仿射变换是线性变换和平移的组合\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e变换完成后,平面位置不变\u003c/p\u003e\u003cp\u003e基本的仿射变换:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e\u003cstrong\u003e平移、缩放、2D 平面旋转、剪切\u003c/strong\u003e \u003c/p\u003e\u003cp\u003e\u003cimg src=\"http://media.sumblog.cn/blog/20190105/Je0CygVwaYrM.png?imageslim\" alt=\"mark\"/\u003e\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003cstrong\u003e仿射变换是线性变换 + 平移\u003c/strong\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e性质\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e原点不一定到原点\u003c/li\u003e\u003cli\u003e直线到直线\u003c/li\u003e\u003cli\u003e平行还平行\u003c/li\u003e\u003cli\u003e保持比率\u003c/li\u003e\u003cli\u003e闭包\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"透视变换、投影变换、同态映射\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E9%80%8F%E8%A7%86%E5%8F%98%E6%8D%A2%E3%80%81%E6%8A%95%E5%BD%B1%E5%8F%98%E6%8D%A2%E3%80%81%E5%90%8C%E6%80%81%E6%98%A0%E5%B0%84\" class=\"headerlink\" title=\"透视变换、投影变换、同态映射\"\u003e\u003c/a\u003e透视变换、投影变换、同态映射\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e最后一元素固定为1 ,共有8个参数, \u003cstrong\u003e是成像平面的变换\u003c/strong\u003e,仿射变换是特例\u003c/p\u003e\u003c/blockquote\u003e\u003cul\u003e\u003cli\u003e原点不一定映射到原点\u003c/li\u003e\u003cli\u003e平行线不一定保持平行\u003c/li\u003e\u003cli\u003e不保持比率\u003c/li\u003e\u003cli\u003e闭包\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"卷绕\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%8D%B7%E7%BB%95\" class=\"headerlink\" title=\"卷绕\"\u003e\u003c/a\u003e卷绕\u003c/h4\u003e\u003cp\u003e卷绕有两种:\u003c/p\u003e\u003col\u003e\u003cli\u003e前向卷绕\u003c/li\u003e\u003cli\u003e反向卷绕\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e变换后的像素位置如果不是整数: \u003cstrong\u003e将像素值分配给四个最近邻,记录每个点的权重并在最后归一化\u003c/strong\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e效果:混叠与模糊\u003c/p\u003e\u003c/blockquote\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e\u003cstrong\u003e反向卷绕\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e先获取每个像素在原图像中对应的位置处的像素值 (逆变换)\u003c/p\u003e\u003cp\u003e如果像素位置不是整数,利用原来相邻像素值插值\u003c/p\u003e\u003cul\u003e\u003cli\u003e可能的插值滤波器\u003cul\u003e\u003cli\u003e最近邻\u003c/li\u003e\u003cli\u003e双线性\u003c/li\u003e\u003cli\u003e双三次\u003c/li\u003e\u003cli\u003e窗 sinc\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e需要防止锯齿和混叠(需要预先滤波)\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e变换有哪几种\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e卷绕有两种\u003c/p\u003e\u003cp\u003e卷绕之后产生了非整数值怎么办\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e常见的变换\u003c/p\u003e\u003cul\u003e\u003cli\u003e旋转\u003c/li\u003e\u003cli\u003e平移\u003c/li\u003e\u003cli\u003e基本仿射变换\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e仿射变换的含义是什么\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"图像配准\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%9B%BE%E5%83%8F%E9%85%8D%E5%87%86\" class=\"headerlink\" title=\"图像配准\"\u003e\u003c/a\u003e图像配准\u003c/h3\u003e\u003cp\u003e配准算法的流程,怎么实现\u003c/p\u003e\u003cul\u003e\u003cli\u003e特征提取\u003c/li\u003e\u003cli\u003e匹配\u003c/li\u003e\u003cli\u003e反向变换\u003c/li\u003e\u003cli\u003e插值\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e优化方式\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e最小二乘法\u003c/strong\u003e\u003c/p\u003e\u003ch4 id=\"图像配准算法\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%9B%BE%E5%83%8F%E9%85%8D%E5%87%86%E7%AE%97%E6%B3%95\" class=\"headerlink\" title=\"图像配准算法\"\u003e\u003c/a\u003e图像配准算法\u003c/h4\u003e\u003cp\u003e\u003cstrong\u003e给定图像 A 和 B\u003c/strong\u003e\u003c/p\u003e\u003col\u003e\u003cli\u003e计算 A、B 的图像特征\u003c/li\u003e\u003cli\u003e匹配 A、B 之间的特征\u003c/li\u003e\u003cli\u003e使用匹配集计算 A 到 B 的单应映射矩阵的最小二乘解\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"最小化残差平方和\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E6%9C%80%E5%B0%8F%E5%8C%96%E6%AE%8B%E5%B7%AE%E5%B9%B3%E6%96%B9%E5%92%8C\" class=\"headerlink\" title=\"最小化残差平方和\"\u003e\u003c/a\u003e最小化残差平方和\u003c/h4\u003e\u003cp\u003e定义残差:\u003cbr/\u003e$$\u003cbr/\u003e\\begin{array} { l } { r _ { \\mathbf { x } _ { i } } \\left( \\mathbf { x } _ { t } \\right) = \\left( \\mathbf { x } _ { i } + \\mathbf { x } _ { t } \\right) - \\mathbf { x } _ { i } ^ { \\prime } } \\ { r _ { \\mathbf { y } _ { i } } \\left( \\mathbf { y } _ { t } \\right) = \\left( \\mathbf { y } _ { i } + \\mathbf { y } _ { t } \\right) - \\mathbf { y } _ { i } ^ { \\prime } } \\end{array}\u003cbr/\u003e$$\u003cbr/\u003e将 n 个点形成的 2n 个方程写成矩阵方程:\u003cbr/\u003e$$\u003cbr/\u003e\\left[ \\begin{array} { l l } { 1 } \u0026amp; { 0 } \\ { 0 } \u0026amp; { 1 } \\ { 1 } \u0026amp; { 0 } \\ { 0 } \u0026amp; { 1 } \\ { 0 } \u0026amp; { 1 } \\ { \\vdots } \\ { 1 } \u0026amp; { 0 } \\ { 0 } \u0026amp; { 1 } \\end{array} \\right] \\left[ \\begin{array} { l } { x _ { t } } \\ { y _ { t } } \\end{array} \\right] = \\left[ \\begin{array} { c } { x _ { 1 } ^ { \\prime } - x _ { 1 } } \\ { y _ { 1 } ^ { \\prime } - y _ { 1 } } \\ { x _ { 1 } ^ { \\prime } - x _ { 2 } } \\ { y _ { 2 } ^ { \\prime } - y _ { 2 } } \\ { \\vdots } \\ { x _ { n } ^ { \\prime } - x _ { n } } \\ { y _ { n } ^ { \\prime } - y _ { n } } \\end{array} \\right]\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003eAt =b\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e找到 t ,最大限度的减少\u003cbr/\u003e$$\u003cbr/\u003e| \\mathbf { A } \\mathbf { t } - \\mathbf { b } | ^ { 2 }\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003e\\begin{array} { c } { \\mathbf { A } ^ { \\mathrm { T } } \\mathbf { A } \\mathbf { t } = \\mathbf { A } ^ { \\mathrm { T } } \\mathbf { b } } \\ { \\mathbf { t } = \\left( \\mathbf { A } ^ { \\mathrm { T } } \\mathbf { A } \\right) ^ { - 1 } \\mathbf { A } ^ { \\mathrm { T } } \\mathbf { b } } \\end{array}\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e对于仿射变换:\u003cbr/\u003e$$\u003cbr/\u003e\\left[ \\begin{array} { l } { x ^ { \\prime } } \\ { y ^ { \\prime } } \\ { 1 } \\end{array} \\right] = \\left[ \\begin{array} { l l l } { a } \u0026amp; { b } \u0026amp; { c } \\ { d } \u0026amp; { e } \u0026amp; { f } \\ { 0 } \u0026amp; { 0 } \u0026amp; { 1 } \\end{array} \\right] \\left[ \\begin{array} { l } { x } \\ { y } \\ { 1 } \\end{array} \\right]\u003cbr/\u003e$$\u003cbr/\u003e有六个未知数,每个匹配有两个方程,我们需要三个匹配\u003c/p\u003e\u003cp\u003e残差:\u003cbr/\u003e$$\u003cbr/\u003e\\begin{aligned} r _ { x _ { i } } ( a , b , c , d , e , f ) \u0026amp; = \\left( a x _ { i } + b y _ { i } + c \\right) - x _ { i } ^ { \\prime } \\ r _ { y _ { i } } ( a , b , c , d , e , f ) \u0026amp; = \\left( d x _ { i } + e y _ { i } + f \\right) - y _ { i } ^ { \\prime } \\end{aligned}\u003cbr/\u003e$$\u003cbr/\u003e对于同态映射(透视变换)\u003cbr/\u003e$$\u003cbr/\u003e\\left[ \\begin{array} { c } { x _ { i } ^ { \\prime } } \\ { y _ { i } ^ { \\prime } } \\ { 1 } \\end{array} \\right] \\cong \\left[ \\begin{array} { l l l } { h _ { 00 } } \u0026amp; { h _ { 01 } } \u0026amp; { h _ { 02 } } \\ { h _ { 10 } } \u0026amp; { h _ { 11 } } \u0026amp; { h _ { 12 } } \\ { h _ { 20 } } \u0026amp; { h _ { 21 } } \u0026amp; { h _ { 22 } } \\end{array} \\right] \\left[ \\begin{array} { c } { x _ { i } } \\ { y _ { i } } \\ { 1 } \\end{array} \\right]\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003e\\begin{aligned} x _ { i } ^ { \\prime } \\left( h _ { 20 } x _ { i } + h _ { 21 } y _ { i } + h _ { 22 } \\right) \u0026amp; = h _ { 00 } x _ { i } + h _ { 01 } y _ { i } + h _ { 02 } \\ y _ { i } ^ { \\prime } \\left( h _ { 20 } x _ { i } + h _ { 21 } y _ { i } + h _ { 22 } \\right) \u0026amp; = h _ { 10 } x _ { i } + h _ { 11 } y _ { i } + h _ { 12 } \\end{aligned}\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e\u003cimg src=\"http://media.sumblog.cn/blog/20190105/LyDbpPwVzvUz.png?imageslim\" alt=\"mark\"/\u003e\u003c/p\u003e\u003cp\u003eAh = 0 的非平凡最小二乘解,即为 $A^TA$ 具有最小特征值的特征向量\u003c/p\u003e\u003ch3 id=\"RANSAC-随机抽样一致\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#RANSAC-%E9%9A%8F%E6%9C%BA%E6%8A%BD%E6%A0%B7%E4%B8%80%E8%87%B4\" class=\"headerlink\" title=\"RANSAC 随机抽样一致\"\u003e\u003c/a\u003eRANSAC 随机抽样一致\u003c/h3\u003e\u003cp\u003e如何计算\u003c/p\u003e\u003cul\u003e\u003cli\u003e随机抽取\u003c/li\u003e\u003cli\u003e计算匹配误差\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"Ransac-算法\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#Ransac-%E7%AE%97%E6%B3%95\" class=\"headerlink\" title=\"Ransac 算法\"\u003e\u003c/a\u003eRansac 算法\u003c/h4\u003e\u003col\u003e\u003cli\u003e随机选择 S 个样本\u003cul\u003e\u003cli\u003e通常 s 等于可以求解模型的最少样本数量\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e使用这 s 个样本求得一个解\u003c/li\u003e\u003cli\u003e计数符合模型的 inliers 数\u003c/li\u003e\u003cli\u003e重复 N 次\u003c/li\u003e\u003cli\u003e选择具有最多 inliers 数的模型\u003c/li\u003e\u003cli\u003e使用所有的 inliers 点,采用最小平方拟合\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"实验轮数的确定\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%AE%9E%E9%AA%8C%E8%BD%AE%E6%95%B0%E7%9A%84%E7%A1%AE%E5%AE%9A\" class=\"headerlink\" title=\"实验轮数的确定\"\u003e\u003c/a\u003e实验轮数的确定\u003c/h4\u003e\u003cul\u003e\u003cli\u003e$p$ 数内点的概率\u003c/li\u003e\u003cli\u003e$s$ 是每次实验使用样本点的数目\u003c/li\u003e\u003cli\u003e$P$ 为实验最终成功找到正确解的概率\u003c/li\u003e\u003cli\u003e$R$ 为实验轮数\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e$$\u003cbr/\u003e\\begin{array} { l } \u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/11/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"},{"title":"如何搭建一个本地镜像源","time":"2023-10-16T15:23:51Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e最近好哥们沉迷pocketchip,但是苦于架构比较古老(ARM-V7a但是能跑Linux Mainline),所以镜像站特别稀少,只有个国外的站点还开着。所以嘛,闲着也是闲着,就打算自己搭建一个镜像站咯。\u003c/p\u003e\u003cp\u003e顺便还能好好玩玩那个ESXi服务器。毕竟现在就只跑了一个OpenWRT和一个Ubuntu Server,实在没利用起来(\u003c/p\u003e\u003cp\u003e或许回头整个本地镜像源还能试试刷新一下Arch安装速度记录(逃\u003c/p\u003e\u003ch2 id=\"准备\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/16/setup-local-linux-mirror/#%E5%87%86%E5%A4%87\" class=\"headerlink\" title=\"准备\"\u003e\u003c/a\u003e准备\u003c/h2\u003e\u003cp\u003e首先需要足够的硬盘空间和一个Linux计算机,以及差不多的网络环境。\u003c/p\u003e\u003cp\u003e然后是一些\u003cdel\u003e神秘妙妙\u003c/del\u003e工具:\u003ccode\u003eapache2, debmirror, gnupg, xz-utils, rsync(recommend)\u003c/code\u003e\u003c/p\u003e\u003ch2 id=\"开始\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/16/setup-local-linux-mirror/#%E5%BC%80%E5%A7%8B\" class=\"headerlink\" title=\"开始\"\u003e\u003c/a\u003e开始\u003c/h2\u003e\u003cp\u003e首先,因为同步的数据量会比较大,所以建议使用一块单独的硬盘或者看具体情况分个区都行。硬盘处理好后,可以将它挂载到\u003ccode\u003e/mount/\u003c/code\u003e下,随后创建我们的镜像站仓库目录们。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emkdir\u003c/span\u003e -p /mirror/debmirror/{amd64,keyring}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emkdir\u003c/span\u003e -p /mirror/scripts \u003cspan class=\"comment\"\u003e# 各种镜像站工具脚本\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e随后安装GPG keyrnig:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003egpg --no-default-keyring --keyring /mirror/debmirror/mirrorkeyring/trustedkeys.gpg --import /usr/share/keyrings/ubuntu-archive-keyring.gpg\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e安装完成后,在Web服务器站点根目录创建符号链接:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e /var/www/html\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eln\u003c/span\u003e -s /mirror/debmirror/amd64 ubuntu\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e在这之后,我们还需要配置debmirror才能实现自动同步upstream等功能。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e /mirror/scripts\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewget https://louwrentius.com/files/debmirroramd64.sh.txt -O debmirroramd64.sh \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003echmod\u003c/span\u003e +x debmirroramd64.sh\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e接着修改脚本设置:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eexport\u003c/span\u003e GNUPGHOME=/mirror/debmirror/mirrorkeyring\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003erelease=focal,focal-security,focal-updates,focal-backports,jammy,jammy-security,jammy-updates,jammy-backports\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eserver=nl.archive.ubuntu.com\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eproto=rsync\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eoutPath=/mirror/debmirror/amd64\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e#bwlimit=1000 # 设置rsync的带宽限速为1000KB/s,如果要启用这个限制,还需要取消注释下面的行:\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e--rsync-options \u003cspan class=\"string\"\u003e\u0026#34;-aIL --partial --bwlimit=\u003cspan class=\"variable\"\u003e$bwlimit\u003c/span\u003e\u0026#34;\u003c/span\u003e \\\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e完成后,你可以先运行一次脚本来完成第一次同步。\u003cstrong\u003e同步完成后\u003c/strong\u003e,再在crontab里边加上自动任务(不然你的同步进程时间过长,可能会干扰cron任务):\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e0 1 * * * /mirror/scripts/debmirroramd64.sh\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"References\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/16/setup-local-linux-mirror/#References\" class=\"headerlink\" title=\"References\"\u003e\u003c/a\u003eReferences\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://louwrentius.com/how-to-setup-a-local-or-private-ubuntu-mirror.html\"\u003eLouwrentius - How to Setup a Local or Private Ubuntu Mirror\u003c/a\u003e\u003cbr/\u003e\u003ca href=\"https://www.debian.org/mirror/ftpmirror\"\u003eDebian - Setting up a Debian archive mirror\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/10/16/setup-local-linux-mirror/"},{"title":"CSDN复制解禁","time":"2023-10-12T06:18:34Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e省流不看:F12开发者工具终端执行\u003ccode\u003edocument.designMode=\u0026#39;on\u0026#39;\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e原理嘛,就是利用浏览器的DOM启用设计模式来允许选择元素。关于DOM的详细介绍在下边:\u003c/p\u003e\u003ch2 id=\"DOM简介\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/12/csdn-copy/#DOM%E7%AE%80%E4%BB%8B\" class=\"headerlink\" title=\"DOM简介\"\u003e\u003c/a\u003eDOM简介\u003c/h2\u003e\u003cp\u003e在浏览器中,\u003ccode\u003edocument\u003c/code\u003e对象是一个非常重要的对象,它代表了当前页面的文档。\u003ccode\u003edocument.DesignMode\u003c/code\u003e属性是\u003ccode\u003edocument\u003c/code\u003e对象的一个属性,它用于指定页面的设计模式。\u003c/p\u003e\u003cp\u003e设计模式主要有两种:\u003c/p\u003e\u003col\u003e\u003cli\u003e模式(常态):页面在正常模式下运行,用户可以正常查看和操作页面元素。 \u003c/li\u003e\u003cli\u003elayouter 模式(布局模式):页面在 layouter 模式下运行,用户无法正常查看和操作页面元素,只能查看页面的布局和结构。\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e这两种设计模式主要用于开发者调试和测试网页布局。通常,开发者会在开发过程中将页面切换到 layouter 模式,以便更好地查看和调整页面布局。当开发完成后,页面会自动切换回正常模式。\u003c/p\u003e\u003cp\u003e在页面加载时,浏览器会自动设置\u003ccode\u003edocument.DesignMode\u003c/code\u003e属性的值。开发者也可以通过 JavaScript 代码来修改这个属性的值,从而实现在不同设计模式之间的切换。\u003c/p\u003e\u003cp\u003e除了\u003ccode\u003eDesignMode\u003c/code\u003e属性之外,\u003ccode\u003edocument\u003c/code\u003e对象还有许多其他的属性和方法,它们可以用来完成各种网页开发任务。例如:\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003ccode\u003edocument.body\u003c/code\u003e:表示页面的主体部分,包含了所有的 HTML 元素。 \u003c/li\u003e\u003cli\u003e\u003ccode\u003edocument.title\u003c/code\u003e:表示页面的标题,通常显示在浏览器的标签页上。 \u003c/li\u003e\u003cli\u003e\u003ccode\u003edocument.getElementById()\u003c/code\u003e:通过元素的 ID 获取指定元素。 \u003c/li\u003e\u003cli\u003e\u003ccode\u003edocument.getElementsByClassName()\u003c/code\u003e:通过元素的类名获取指定元素集合。 \u003c/li\u003e\u003cli\u003e\u003ccode\u003edocument.getElementsByTagName()\u003c/code\u003e:通过元素的标签名获取指定元素集合。 \u003c/li\u003e\u003cli\u003e\u003ccode\u003edocument.querySelector()\u003c/code\u003e:通过 CSS 选择器获取指定元素。 \u003c/li\u003e\u003cli\u003e\u003ccode\u003edocument.querySelectorAll()\u003c/code\u003e:通过 CSS 选择器获取指定元素集合。\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e此外,\u003ccode\u003edocument\u003c/code\u003e对象还提供了许多用于操作 DOM 的方法,如\u003ccode\u003ecreateElement()\u003c/code\u003e、\u003ccode\u003eappendChild()\u003c/code\u003e、\u003ccode\u003eremoveChild()\u003c/code\u003e、\u003ccode\u003einsertBefore()\u003c/code\u003e等,以及用于处理事件的方法,如\u003ccode\u003eaddEventListener()\u003c/code\u003e、\u003ccode\u003eremoveEventListener()\u003c/code\u003e等。\u003c/p\u003e\u003cp\u003e总之,\u003ccode\u003edocument\u003c/code\u003e对象是浏览器中最重要的对象之一,它为网页开发者提供了丰富的属性和方法,使得开发者可以更加方便地完成各种网页开发任务。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/10/12/csdn-copy/"},{"title":"联邦学习的投毒和攻防方法","time":"2023-10-11T10:59:46Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e十分的交叉学科。具体而言就是机器学习领域的数据安全问题。\u003c/p\u003e\u003cp\u003e首先是标题 说的大概是一种新的人工智能学习范式。在这种防方式里也有攻击方式和相应的防御方式。\u003c/p\u003e\u003ch2 id=\"联邦学习简介\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%8A%95%E6%AF%92%E5%92%8C%E6%94%BB%E9%98%B2%E6%96%B9%E6%B3%95/#%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%AE%80%E4%BB%8B\" class=\"headerlink\" title=\"联邦学习简介\"\u003e\u003c/a\u003e联邦学习简介\u003c/h2\u003e\u003cul\u003e\u003cli\u003edefinition 联邦学习:一种分布式学习方法。解决的问题主要针对数据量不够/数据获取途径(成本问题),数据难以集中(法律问题和隐私问题)。一种时间方法是在本地进行小规模训练,然后将训练得到的模型参数上传汇总。不但规避了隐私版权问题,也保证了训练效果。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e根据以样本和特征分别作为基准,联邦学习又分为横向/纵向:同特征不同样本/同样本不同特征。它们各自有着相当不同的模型参数聚合方法。后者通常发生在大型企业之间,而前者通常发生在用户/公司之间,双方并非信任关系。\u003c/p\u003e\u003cp\u003e前者的聚合方法有简单的加权平均FedAvg,有离群点修复FedProx,还有SCAFFOLD等。而后者则利用隐私求交集PSI来完成加密实体对齐。典型的纵向联邦学习框架有SecureBoost。\u003c/p\u003e\u003cp\u003e但是数据特征仍然是反映在梯度参数中的,通过深度梯度泄漏方法DLG,可以恢复训练数据,这样就间接泄漏了训练数据的隐私。\u003c/p\u003e\u003ch2 id=\"隐私数据保护方法\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%8A%95%E6%AF%92%E5%92%8C%E6%94%BB%E9%98%B2%E6%96%B9%E6%B3%95/#%E9%9A%90%E7%A7%81%E6%95%B0%E6%8D%AE%E4%BF%9D%E6%8A%A4%E6%96%B9%E6%B3%95\" class=\"headerlink\" title=\"隐私数据保护方法\"\u003e\u003c/a\u003e隐私数据保护方法\u003c/h2\u003e\u003cp\u003e防止梯度泄露的方法主要是两类:密码学方法和差分隐私(Differential Privacy).前者有MPC和HE等,通信开销和计算量较大,但是精度较高。后者则有噪声问题的困扰。\u003c/p\u003e\u003ch2 id=\"联邦学习的攻击方法\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%8A%95%E6%AF%92%E5%92%8C%E6%94%BB%E9%98%B2%E6%96%B9%E6%B3%95/#%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%94%BB%E5%87%BB%E6%96%B9%E6%B3%95\" class=\"headerlink\" title=\"联邦学习的攻击方法\"\u003e\u003c/a\u003e联邦学习的攻击方法\u003c/h2\u003e\u003cp\u003e目的就是使训练模型很难收敛,破坏联邦学习模型的性能和可信度。\u003c/p\u003e\u003cul\u003e\u003cli\u003e投毒攻击,给本地数据添加错误,来弱化学习效果;或者更改分布式训练的模型参数。攻击者的知识、能力越强则攻击能力越强\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e但是太离谱的数据会被数据清洗过滤掉,太小的数据又没啥效果。\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e目标/非目标攻击:针对特定/随即目标进行数据编造投毒攻击。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e数据打乱:比如对于不同群体的用户数据,互换他们attribute的结果,最终使得结果在不同群体上相反。\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"投毒攻击的检测\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%8A%95%E6%AF%92%E5%92%8C%E6%94%BB%E9%98%B2%E6%96%B9%E6%B3%95/#%E6%8A%95%E6%AF%92%E6%94%BB%E5%87%BB%E7%9A%84%E6%A3%80%E6%B5%8B\" class=\"headerlink\" title=\"投毒攻击的检测\"\u003e\u003c/a\u003e投毒攻击的检测\u003c/h2\u003e\u003cp\u003e这种检测难度不小:投毒攻击检测和隐私保护间的矛盾、数据非独立分布、攻击隐蔽性。\u003c/p\u003e\u003cp\u003e比较朴素的思路就是使用数据挖掘的清洗方法,对离群点等进行清洗。比如说有一些聚合方法:Krum, Bulyan, Trimmed mean(修整均值), Medium(中位数)等,都是一些经典的鲁棒性聚合规则。\u003c/p\u003e\u003ch2 id=\"防御方法\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%8A%95%E6%AF%92%E5%92%8C%E6%94%BB%E9%98%B2%E6%96%B9%E6%B3%95/#%E9%98%B2%E5%BE%A1%E6%96%B9%E6%B3%95\" class=\"headerlink\" title=\"防御方法\"\u003e\u003c/a\u003e防御方法\u003c/h2\u003e\u003cp\u003e首先是基于统计学的方法。但是它的局限性是只有少部分客户端被控制。\u003c/p\u003e\u003cp\u003e其次是用验证用数据集进行验证。不过这样纯粹的数据集很难找。\u003c/p\u003e\u003cp\u003e再者就是用机器学习方法1-AE进行检验。它首先在本地预训练一个自编码器模型,然后正式训练过程中基于自编码器计算各节点模型更新的重构误差。\u003c/p\u003e\u003cp\u003e2-GAN:可以用GAN尝试恢复出来训练样本来生成本地训练集,从而验证模型参数是否正常。但是缺陷是,无法应对在训练初期就发动攻击的方式。\u003c/p\u003e\u003cp\u003e区块链1-FLChain:由部分节点进行数据检测再进行上传,从而保证参数的正确性。问题是这部分节点如何选择,以及是否正常。解决方法可以是动态更新这部分成员结点,通过一系列置信度去更新这部分节点。\u003c/p\u003e\u003ch2 id=\"研究成果:神经网络模型水印\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/10/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%8A%95%E6%AF%92%E5%92%8C%E6%94%BB%E9%98%B2%E6%96%B9%E6%B3%95/#%E7%A0%94%E7%A9%B6%E6%88%90%E6%9E%9C%EF%BC%9A%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B%E6%B0%B4%E5%8D%B0\" class=\"headerlink\" title=\"研究成果:神经网络模型水印\"\u003e\u003c/a\u003e研究成果:神经网络模型水印\u003c/h2\u003e\u003cp\u003e初始模型嵌入水印,并对水印进行检测。缺点是上传的模型不能加密。当然也可以允许加密,不过可以聚合模型,用聚合后的模型检验上传者。或者,可以比对上传者的历史行为数据,以此检测上传节点是否异常。\u003c/p\u003e\u003cp\u003e时间有限,基本就到这里了。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/10/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E6%8A%95%E6%AF%92%E5%92%8C%E6%94%BB%E9%98%B2%E6%96%B9%E6%B3%95/"},{"title":"Golang代码复用-分页最佳实践","time":"2023-10-07T13:59:46Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e分页是查询的一个基本要求之一。这部分代码大多重复,适合复用。下面是一种最佳实践:\u003c/p\u003e\u003cp\u003e这是一个传有分页数据的Gin Handler,它需要对数据库进行分页查询:\u003c/p\u003e\u003cfigure class=\"highlight go\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003e\u003cspan class=\"keyword\"\u003efunc\u003c/span\u003e \u003cspan class=\"params\"\u003e(p propertyRepository)\u003c/span\u003e\u003c/span\u003e GetPagedAndFiltered (limit, page \u003cspan class=\"type\"\u003eint\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e随后我们定义一个\u003ccode\u003egorm\u003c/code\u003e中间件去对数据库进行分页:\u003c/p\u003e\u003cfigure class=\"highlight go\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eimport\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;gorm.io/gorm\u0026#34;\u003c/span\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003etype\u003c/span\u003e paginate \u003cspan class=\"keyword\"\u003estruct\u003c/span\u003e { \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003elimit \u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epage \u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e} \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003e\u003cspan class=\"keyword\"\u003efunc\u003c/span\u003e \u003cspan class=\"title\"\u003enewPaginate\u003c/span\u003e\u003cspan class=\"params\"\u003e(limit \u003cspan class=\"type\"\u003eint\u003c/span\u003e, page \u003cspan class=\"type\"\u003eint\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e *paginate { \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e \u0026amp;paginate{limit: limit,page: page} \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e} \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003e\u003cspan class=\"keyword\"\u003efunc\u003c/span\u003e \u003cspan class=\"params\"\u003e(p *paginate)\u003c/span\u003e\u003c/span\u003e paginatedResult(db *gorm.DB) *gorm.DB { \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eoffset := (p.page - \u003cspan class=\"number\"\u003e1\u003c/span\u003e) * p.limit \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e db.Offset(offset). \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eLimit(p.limit) \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e随后,就可以在数据库中使用分页了:\u003c/p\u003e\u003cfigure class=\"highlight go\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003e\u003cspan class=\"keyword\"\u003efunc\u003c/span\u003e \u003cspan class=\"params\"\u003e(p propertyRepository)\u003c/span\u003e\u003c/span\u003e GetPagedAndFiltered(limit, page \u003cspan class=\"type\"\u003eint\u003c/span\u003e) ([]Property, \u003cspan class=\"type\"\u003eerror\u003c/span\u003e) { \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003evar\u003c/span\u003e properties []Property \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eerr := p.db.Scopes(newPaginate(limit,page).paginatedResult).Find(\u0026amp;properties).Error \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e properties, err \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e当然,我对上面的代码进行了进一步的集成。虽然损失了低耦合性质,但是只是在Gin使用的话体验拉满:\u003c/p\u003e\u003cfigure class=\"highlight go\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003etype\u003c/span\u003e Pagination \u003cspan class=\"keyword\"\u003estruct\u003c/span\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ePageSize \u003cspan class=\"type\"\u003eint\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ePageNum \u003cspan class=\"type\"\u003eint\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// GetPagination Get pagination info\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003e\u003cspan class=\"keyword\"\u003efunc\u003c/span\u003e \u003cspan class=\"title\"\u003eGetPagination\u003c/span\u003e\u003cspan class=\"params\"\u003e(c *gin.Context)\u003c/span\u003e\u003c/span\u003e Pagination {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003evar\u003c/span\u003e data Pagination\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epageSize, _ := strconv.Atoi(c.Query(\u003cspan class=\"string\"\u003e\u0026#34;pagesize\u0026#34;\u003c/span\u003e))\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epageNum, _ := strconv.Atoi(c.Query(\u003cspan class=\"string\"\u003e\u0026#34;pagenum\u0026#34;\u003c/span\u003e))\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eswitch\u003c/span\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ecase\u003c/span\u003e pageSize \u0026gt;= \u003cspan class=\"number\"\u003e100\u003c/span\u003e:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003edata.PageSize = \u003cspan class=\"number\"\u003e100\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ecase\u003c/span\u003e pageSize \u0026lt;= \u003cspan class=\"number\"\u003e0\u003c/span\u003e:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003edata.PageSize = \u003cspan class=\"number\"\u003e10\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e pageNum \u0026lt;= \u003cspan class=\"number\"\u003e0\u003c/span\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003edata.PageNum = \u003cspan class=\"number\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e data\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003e\u003cspan class=\"keyword\"\u003efunc\u003c/span\u003e \u003cspan class=\"params\"\u003e(p *Pagination)\u003c/span\u003e\u003c/span\u003e PaginatedResults(db *gorm.DB) *gorm.DB {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eoffset := (p.PageNum - \u003cspan class=\"number\"\u003e1\u003c/span\u003e) * p.PageSize\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e db.Offset(offset).Limit(p.PageSize)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e使用方法就是在Gin Handler中用\u003ccode\u003eGetPagination\u003c/code\u003e获取分页参数,然后在\u003ccode\u003emodel\u003c/code\u003e的具体数据库实现操作中使用\u003ccode\u003edb.Scopes(page.PaginatedResult).xxx\u003c/code\u003e直接分页。\u003c/p\u003e\u003cp\u003e应该是一种最佳实践。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/10/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/Golang/Golang%E4%BB%A3%E7%A0%81%E5%A4%8D%E7%94%A8-%E5%88%86%E9%A1%B5%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5/"},{"title":"Vim备忘录","time":"2023-09-29T21:30:53Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"How-to-Exit\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#How-to-Exit\" class=\"headerlink\" title=\"How to Exit\"\u003e\u003c/a\u003eHow to Exit\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e:q[uit]\u003c/td\u003e\u003ctd\u003eQuit Vim. This fails when changes have been made.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:q[uit]!\u003c/td\u003e\u003ctd\u003eQuit without writing.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:cq[uit]\u003c/td\u003e\u003ctd\u003eQuit always, without writing.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:wq\u003c/td\u003e\u003ctd\u003eWrite the current file and exit.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:wq!\u003c/td\u003e\u003ctd\u003eWrite the current file and exit always.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:wq {file}\u003c/td\u003e\u003ctd\u003eWrite to {file}. Exit if not editing the last\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:wq! {file}\u003c/td\u003e\u003ctd\u003eWrite to {file} and exit always.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[range]wq[!]\u003c/td\u003e\u003ctd\u003e[file] Same as above, but only write the lines in [range].\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eZZ\u003c/td\u003e\u003ctd\u003eWrite current file, if modified, and exit.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eZQ\u003c/td\u003e\u003ctd\u003eQuit current file and exit (same as “:q!”).\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch2 id=\"Editing-a-File\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Editing-a-File\" class=\"headerlink\" title=\"Editing a File\"\u003e\u003c/a\u003eEditing a File\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e:e[dit]\u003c/td\u003e\u003ctd\u003eEdit the current file. This is useful to re-edit the current file, when it has been changed outside of Vim.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:e[dit]!\u003c/td\u003e\u003ctd\u003eEdit the current file always. Discard any changes to the current buffer. This is useful if you want to start all over again.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:e[dit] {file}\u003c/td\u003e\u003ctd\u003eEdit {file}.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:e[dit]! {file}\u003c/td\u003e\u003ctd\u003eEdit {file} always. Discard any changes to the current buffer.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003egf\u003c/td\u003e\u003ctd\u003eEdit the file whose name is under or after the cursor. Mnemonic: “goto file”.\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch2 id=\"Inserting-Text\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Inserting-Text\" class=\"headerlink\" title=\"Inserting Text\"\u003e\u003c/a\u003eInserting Text\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003ea\u003c/td\u003e\u003ctd\u003eAppend text after the cursor [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eA\u003c/td\u003e\u003ctd\u003eAppend text at the end of the line [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ei\u003c/td\u003e\u003ctd\u003eInsert text before the cursor [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eI\u003c/td\u003e\u003ctd\u003eInsert text before the first non-blank in the line [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003egI\u003c/td\u003e\u003ctd\u003eInsert text in column 1 [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eo\u003c/td\u003e\u003ctd\u003eBegin a new line below the cursor and insert text, repeat [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eO\u003c/td\u003e\u003ctd\u003eBegin a new line above the cursor and insert text, repeat [count] times.\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch2 id=\"Inserting-a-file\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Inserting-a-file\" class=\"headerlink\" title=\"Inserting a file\"\u003e\u003c/a\u003eInserting a file\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e:r[ead] [name]\u003c/td\u003e\u003ctd\u003eInsert the file [name] below the cursor.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:r[ead] !{cmd}\u003c/td\u003e\u003ctd\u003eExecute {cmd} and insert its standard output below the cursor.\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch2 id=\"Deleting-Text\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Deleting-Text\" class=\"headerlink\" title=\"Deleting Text\"\u003e\u003c/a\u003eDeleting Text\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\u0026lt;Del\u0026gt; or x\u003c/td\u003e\u003ctd\u003eDelete [count] characters under and after the cursor\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eX\u003c/td\u003e\u003ctd\u003eDelete [count] characters before the cursor\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ed{motion}\u003c/td\u003e\u003ctd\u003eDelete text that {motion} moves over\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003edd\u003c/td\u003e\u003ctd\u003eDelete [count] lines\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eD\u003c/td\u003e\u003ctd\u003eDelete the characters under the cursor until the end of the line\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e{Visual}x or \u003cbr/\u003e{Visual}d\u003c/td\u003e\u003ctd\u003eDelete the highlighted text (for {Visual} see \u003ca href=\"http://fprintf.net/vimCheatSheet.html#select\"\u003eSelecting Text\u003c/a\u003e).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e{Visual}CTRL-H or \u003cbr/\u003e{Visual}\u003c/td\u003e\u003ctd\u003eWhen in Select mode: Delete the highlighted text\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e{Visual}X or \u003cbr/\u003e{Visual}D\u003c/td\u003e\u003ctd\u003eDelete the highlighted lines\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[range]d[elete]\u003c/td\u003e\u003ctd\u003eDelete [range] lines (default: current line)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[range]d[elete] {count}\u003c/td\u003e\u003ctd\u003eDelete {count} lines, starting with [range]\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003ch2 id=\"Changing-or-Replacing-Text\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Changing-or-Replacing-Text\" class=\"headerlink\" title=\"Changing (or Replacing) Text\"\u003e\u003c/a\u003eChanging (or Replacing) Text\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003er{char}\u003c/td\u003e\u003ctd\u003ereplace the character under the cursor with {char}.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eR\u003c/td\u003e\u003ctd\u003eEnter Insert mode, replacing characters rather than inserting\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e~\u003c/td\u003e\u003ctd\u003eSwitch case of the character under the cursor and move the cursor to the right. If a [count] is given, do that many characters.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e~{motion}\u003c/td\u003e\u003ctd\u003eswitch case of {motion} text.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e{Visual}~\u003c/td\u003e\u003ctd\u003eSwitch case of highlighted text\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003ch2 id=\"Substituting\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Substituting\" class=\"headerlink\" title=\"Substituting\"\u003e\u003c/a\u003eSubstituting\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e:[range]s[ubstitute]/{pattern}/{string}/[c][e][g][p][r][i][I] [count]\u003c/td\u003e\u003ctd\u003eFor each line in [range] replace a match of {pattern} with {string}.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[range]s[ubstitute] [c][e][g][r][i][I] [count] :[range]\u0026amp;[c][e][g][r][i][I] [count]\u003c/td\u003e\u003ctd\u003eRepeat last :substitute with same search pattern and substitute string, but without the same flags. You may add extra flags\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003eThe arguments that you can use for the substitute commands:\u003cbr/\u003e[c] Confirm each substitution. Vim positions the cursor on the matching\u003cbr/\u003e string. You can type:\u003cbr/\u003e ‘y’ to substitute this match\u003cbr/\u003e ‘n’ to skip this match\u003cbr/\u003e to skip this match\u003cbr/\u003e ‘a’ to substitute this and all remaining matches {not in Vi}\u003cbr/\u003e ‘q’ to quit substituting {not in Vi}\u003cbr/\u003e CTRL-E to scroll the screen up {not in Vi}\u003cbr/\u003e CTRL-Y to scroll the screen down {not in Vi}.\u003cbr/\u003e[e] When the search pattern fails, do not issue an error message and, in\u003cbr/\u003e particular, continue in maps as if no error occurred.\u003cbr/\u003e[g] Replace all occurrences in the line. Without this argument,\u003cbr/\u003e replacement occurs only for the first occurrence in each line.\u003cbr/\u003e[i] Ignore case for the pattern.\u003cbr/\u003e[I] Don’t ignore case for the pattern.\u003cbr/\u003e[p] Print the line containing the last substitute.\u003c/p\u003e\u003chr/\u003e\u003ch2 id=\"Copying-and-Moving-Text\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Copying-and-Moving-Text\" class=\"headerlink\" title=\"Copying and Moving Text\"\u003e\u003c/a\u003eCopying and Moving Text\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e“{a-zA-Z0-9.%#:-“}\u003c/td\u003e\u003ctd\u003eUse register {a-zA-Z0-9.%#:-“} for next delete, yank or put (use uppercase character to append with delete and yank) ({.%#:} only work with put).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:reg[isters]\u003c/td\u003e\u003ctd\u003eDisplay the contents of all numbered and named registers.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:reg[isters] {arg}\u003c/td\u003e\u003ctd\u003eDisplay the contents of the numbered and named registers that are mentioned in {arg}.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:di[splay] [arg]\u003c/td\u003e\u003ctd\u003eSame as :registers.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[“x]y{motion}\u003c/td\u003e\u003ctd\u003eYank {motion} text [into register x].\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[“x]yy\u003c/td\u003e\u003ctd\u003eYank [count] lines [into register x]\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[“x]Y\u003c/td\u003e\u003ctd\u003eyank [count] lines [into register x] (synonym for yy).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e{Visual}[“x]y\u003c/td\u003e\u003ctd\u003eYank the highlighted text [into register x] (for {Visual} see \u003ca href=\"http://fprintf.net/vimCheatSheet.html#select\"\u003eSelecting Text\u003c/a\u003e).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e{Visual}[“x]Y\u003c/td\u003e\u003ctd\u003eYank the highlighted lines [into register x]\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[range]y[ank] [x]\u003c/td\u003e\u003ctd\u003eYank [range] lines [into register x].\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[range]y[ank] [x] {count}\u003c/td\u003e\u003ctd\u003eYank {count} lines, starting with last line number in [range] (default: current line), [into register x].\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[“x]p\u003c/td\u003e\u003ctd\u003ePut the text [from register x] after the cursor [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[“x]P\u003c/td\u003e\u003ctd\u003ePut the text [from register x] before the cursor [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[“x]gp\u003c/td\u003e\u003ctd\u003eJust like “p”, but leave the cursor just after the new text.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[“x]gP\u003c/td\u003e\u003ctd\u003eJust like “P”, but leave the cursor just after the new text.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[line]pu[t] [x]\u003c/td\u003e\u003ctd\u003ePut the text [from register x] after [line] (default current line).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[line]pu[t]! [x]\u003c/td\u003e\u003ctd\u003ePut the text [from register x] before [line] (default current line).\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003ch2 id=\"Undo-x2F-Redo-x2F-Repeat\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Undo-x2F-Redo-x2F-Repeat\" class=\"headerlink\" title=\"Undo/Redo/Repeat\"\u003e\u003c/a\u003eUndo/Redo/Repeat\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003eu\u003c/td\u003e\u003ctd\u003eUndo [count] changes.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:u[ndo]\u003c/td\u003e\u003ctd\u003eUndo one change.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eCTRL-R\u003c/td\u003e\u003ctd\u003eRedo [count] changes which were undone.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:red[o]\u003c/td\u003e\u003ctd\u003eRedo one change which was undone.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eU\u003c/td\u003e\u003ctd\u003eUndo all latest changes on one line. {Vi: while not moved off of it}\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e.\u003c/td\u003e\u003ctd\u003eRepeat last change, with count replaced with [count].\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003ch2 id=\"Moving-Around\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Moving-Around\" class=\"headerlink\" title=\"Moving Around\"\u003e\u003c/a\u003eMoving Around\u003c/h2\u003e\u003cp\u003eBasic motion commands:\u003c/p\u003e\u003cpre\u003e\u003ccode\u003e k h l j \u003c/code\u003e\u003c/pre\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003eh or\u003c/td\u003e\u003ctd\u003e[count] characters to the left (exclusive).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003el or \u003cbr/\u003eor\u003c/td\u003e\u003ctd\u003e[count] characters to the right (exclusive).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ek or \u003cbr/\u003eor \u003cbr/\u003eCTRL-P\u003c/td\u003e\u003ctd\u003e[count] lines upward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ej or \u003cbr/\u003eor \u003cbr/\u003eCTRL-J or \u003cbr/\u003eor \u003cbr/\u003eCTRL-N\u003c/td\u003e\u003ctd\u003e[count] lines downward (linewise).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003eTo the first character of the line (exclusive).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003chome\u003e\u003c/home\u003e\u003c/td\u003e\u003ctd\u003eTo the first character of the line (exclusive).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e^\u003c/td\u003e\u003ctd\u003eTo the first non-blank character of the line\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e$ or \u003cbr/\u003e\u003cend\u003e\u003c/end\u003e\u003c/td\u003e\u003ctd\u003eTo the end of the line and [count - 1] lines downward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eg0 or \u003cbr/\u003eg\u003chome\u003e\u003c/home\u003e\u003c/td\u003e\u003ctd\u003eWhen lines wrap (‘wrap on): To the first character of the screen line (exclusive). Differs from “0” when a line is wider than the screen. When lines don’t wrap (‘wrap’ off): To the leftmost character of the current line that is on the screen. Differs from “0” when the first character of the line is not on the screen.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eg^\u003c/td\u003e\u003ctd\u003eWhen lines wrap (‘wrap’ on): To the first non-blank character of the screen line (exclusive). Differs from “^” when a line is wider than the screen. When lines don’t wrap (‘wrap’ off): To the leftmost non-blank character of the current line that is on the screen. Differs from “^” when the first non-blank character of the line is not on the screen.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eg$ or \u003cbr/\u003eg\u0026lt;End\u0026amp;gr;\u003c/td\u003e\u003ctd\u003eWhen lines wrap (‘wrap’ on): To the last character of the screen line and [count - 1] screen lines downward (inclusive). Differs from “$” when a line is wider than the screen. When lines don’t wrap (‘wrap’ off): To the rightmost character of the current line that is visible on the screen. Differs from “$” when the last character of the line is not on the screen or when a count is used.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ef{char}\u003c/td\u003e\u003ctd\u003eTo [count]’th occurrence of {char} to the right. The cursor is placed on {char} (inclusive).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eF{char}\u003c/td\u003e\u003ctd\u003eTo the [count]’th occurrence of {char} to the left. The cursor is placed on {char} (inclusive).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003et{char}\u003c/td\u003e\u003ctd\u003eTill before [count]’th occurrence of {char} to the right. The cursor is placed on the character left of {char} (inclusive).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eT{char}\u003c/td\u003e\u003ctd\u003eTill after [count]’th occurrence of {char} to the left. The cursor is placed on the character right of {char} (inclusive).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e;\u003c/td\u003e\u003ctd\u003eRepeat latest f, t, F or T [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e,\u003c/td\u003e\u003ctd\u003eRepeat latest f, t, F or T in opposite direction [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e- \u003cminus\u003e\u003c/minus\u003e\u003c/td\u003e\u003ctd\u003e[count] lines upward, on the first non-blank character (linewise).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e+ or \u003cbr/\u003eCTRL-M or \u003cbr/\u003e\u003ccr\u003e\u003c/cr\u003e\u003c/td\u003e\u003ctd\u003e[count] lines downward, on the first non-blank character (linewise).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e_ \u003cunderscore\u003e\u003c/underscore\u003e\u003c/td\u003e\u003ctd\u003e[count] - 1 lines downward, on the first non-blank character (linewise).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cc-end\u003e or \u003cbr/\u003eG\u003c/c-end\u003e\u003c/td\u003e\u003ctd\u003eGoto line [count], default last line, on the first non-blank character.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cc-home\u003e or \u003cbr/\u003egg\u003c/c-home\u003e\u003c/td\u003e\u003ctd\u003eGoto line [count], default first line, on the first non-blank character.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cs-right\u003e or \u003cbr/\u003ew\u003c/s-right\u003e\u003c/td\u003e\u003ctd\u003e[count] words forward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cc-right\u003e or \u003cbr/\u003eW\u003c/c-right\u003e\u003c/td\u003e\u003ctd\u003e[count] WORDS forward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ee\u003c/td\u003e\u003ctd\u003eForward to the end of word [count]\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eE\u003c/td\u003e\u003ctd\u003eForward to the end of WORD [count]\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cs-left\u003e or \u003cbr/\u003eb\u003c/s-left\u003e\u003c/td\u003e\u003ctd\u003e[count] words backward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cc-left\u003e or \u003cbr/\u003eB\u003c/c-left\u003e\u003c/td\u003e\u003ctd\u003e[count] WORDS backward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ege\u003c/td\u003e\u003ctd\u003eBackward to the end of word [count]\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003egE\u003c/td\u003e\u003ctd\u003eBackward to the end of WORD [count]\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003eThese commands move over words or WORDS.\u003c/p\u003e\u003cp\u003eA word consists of a sequence of letters, digits and underscores, or a sequence of other non-blank characters, separated with white space (spaces, tabs, ). This can be changed with the ‘iskeyword’ option.\u003c/p\u003e\u003cp\u003eA WORD consists of a sequence of non-blank characters, separated with white space. An empty line is also considered to be a word and a WORD.\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e(\u003c/td\u003e\u003ctd\u003e[count] sentences backward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e)\u003c/td\u003e\u003ctd\u003e[count] sentences forward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e{\u003c/td\u003e\u003ctd\u003e[count] paragraphs backward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e}\u003c/td\u003e\u003ctd\u003e[count] paragraphs forward\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e]]\u003c/td\u003e\u003ctd\u003e[count] sections forward or to the next ‘{‘ in the first column. When used after an operator, then the ‘}’ in the first column.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e][\u003c/td\u003e\u003ctd\u003e[count] sections forward or to the next ‘}’ in the first column\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[[\u003c/td\u003e\u003ctd\u003e[count] sections backward or to the previous ‘{‘ in the first column\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e[]\u003c/td\u003e\u003ctd\u003e[count] sections backward or to the previous ‘}’ in the first column\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003eScreen movement commands\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003ez.\u003c/td\u003e\u003ctd\u003eCenter the screen on the cursor\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ezt\u003c/td\u003e\u003ctd\u003eScroll the screen so the cursor is at the top\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ezb\u003c/td\u003e\u003ctd\u003eScroll the screen so the cursor is at the bottom\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003ch2 id=\"Marks\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Marks\" class=\"headerlink\" title=\"Marks\"\u003e\u003c/a\u003eMarks\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003em{a-zA-Z}\u003c/td\u003e\u003ctd\u003eSet mark {a-zA-Z} at cursor position (does not move the cursor, this is not a motion command).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003em’ or \u003cbr/\u003em`\u003c/td\u003e\u003ctd\u003eSet the previous context mark. This can be jumped to with the “‘’” or “``” command (does not move the cursor, this is not a motion command).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[range]ma[rk] {a-zA-Z}\u003c/td\u003e\u003ctd\u003eSet mark {a-zA-Z} at last line number in [range], column 0. Default is cursor line.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:[range]k{a-zA-Z}\u003c/td\u003e\u003ctd\u003eSame as :mark, but the space before the mark name can be omitted.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e‘{a-z}\u003c/td\u003e\u003ctd\u003eTo the first non-blank character on the line with mark {a-z} (linewise).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e‘{A-Z0-9}\u003c/td\u003e\u003ctd\u003eTo the first non-blank character on the line with mark {A-Z0-9} in the correct file\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e`{a-z}\u003c/td\u003e\u003ctd\u003eTo the mark {a-z}\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e`{A-Z0-9}\u003c/td\u003e\u003ctd\u003eTo the mark {A-Z0-9} in the correct file\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:marks\u003c/td\u003e\u003ctd\u003eList all the current marks (not a motion command).\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:marks {arg}\u003c/td\u003e\u003ctd\u003eList the marks that are mentioned in {arg} (not a motion command). For example:\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003ch2 id=\"Searching\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Searching\" class=\"headerlink\" title=\"Searching\"\u003e\u003c/a\u003eSearching\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e/{pattern}[/]\u003c/td\u003e\u003ctd\u003eSearch forward for the [count]’th occurrence of {pattern}\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e/{pattern}/{offset}\u003c/td\u003e\u003ctd\u003eSearch forward for the [count]’th occurrence of {pattern} and go {offset} lines up or down.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e/\u003ccr\u003e\u003c/cr\u003e\u003c/td\u003e\u003ctd\u003eSearch forward for the [count]’th latest used pattern\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e//{offset}\u003ccr\u003e\u003c/cr\u003e\u003c/td\u003e\u003ctd\u003eSearch forward for the [count]’th latest used pattern with new. If {offset} is empty no offset is used.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e?{pattern}[?]\u003ccr\u003e\u003c/cr\u003e\u003c/td\u003e\u003ctd\u003eSearch backward for the [count]’th previous occurrence of {pattern}\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e?{pattern}?{offset}\u003ccr\u003e\u003c/cr\u003e\u003c/td\u003e\u003ctd\u003eSearch backward for the [count]’th previous occurrence of {pattern} and go {offset} lines up or down\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e?\u003ccr\u003e\u003c/cr\u003e\u003c/td\u003e\u003ctd\u003eSearch backward for the [count]’th latest used pattern\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e??{offset}\u003ccr\u003e\u003c/cr\u003e\u003c/td\u003e\u003ctd\u003eSearch backward for the [count]’th latest used pattern with new {offset}. If {offset} is empty no offset is used.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003en\u003c/td\u003e\u003ctd\u003eRepeat the latest “/“ or “?” [count] times.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eN\u003c/td\u003e\u003ctd\u003eRepeat the latest “/“ or “?” [count] times in opposite direction.\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003ch2 id=\"Selecting-Text-Visual-Mode\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#Selecting-Text-Visual-Mode\" class=\"headerlink\" title=\"Selecting Text (Visual Mode)\"\u003e\u003c/a\u003eSelecting Text (Visual Mode)\u003c/h2\u003e\u003cp\u003eTo select text, enter visual mode with one of the commands below, and use \u003ca href=\"http://fprintf.net/vimCheatSheet.html#motion\"\u003emotion commands\u003c/a\u003e to highlight the text you are interested in. Then, use some command on the text.\u003c/p\u003e\u003cp\u003eThe operators that can be used are:\u003cbr/\u003e ~ switch case\u003cbr/\u003e d delete\u003cbr/\u003e c change\u003cbr/\u003e y yank\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e shift right\u003cbr/\u003e \u0026lt; shift left\u003cbr/\u003e ! filter through external command\u003cbr/\u003e = filter through ‘equalprg’ option command\u003cbr/\u003e gq format lines to ‘textwidth’ length \u003c/p\u003e\u003c/blockquote\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003ev\u003c/td\u003e\u003ctd\u003estart Visual mode per character.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eV\u003c/td\u003e\u003ctd\u003estart Visual mode linewise.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cesc\u003e\u003c/esc\u003e\u003c/td\u003e\u003ctd\u003eexit Visual mode without making any changes\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003ch2 id=\"How-to-Suspend\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/#How-to-Suspend\" class=\"headerlink\" title=\"How to Suspend\"\u003e\u003c/a\u003eHow to Suspend\u003c/h2\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e\u003c/th\u003e\u003cth\u003e\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003eCTRL-Z\u003c/td\u003e\u003ctd\u003eSuspend Vim, like “:stop”. Works in Normal and in Visual mode. In Insert and Command-line mode, the CTRL-Z is inserted as a normal character.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e:sus[pend][!] or \u003cbr/\u003e:st[op][!]\u003c/td\u003e\u003ctd\u003eSuspend Vim. If the ‘!’ is not given and ‘autowrite’ is set, every buffer with changes and a file name is written out. If the ‘!’ is given or ‘autowrite’ is not set, changed buffers are not written, don’t forget to bring Vim back to the foreground later!\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003chr/\u003e\u003cp\u003e\u003ca href=\"http://www.catb.org/hacker-emblem/\"\u003e\u003cimg src=\"http://www.catb.org/hacker-emblem/glider.png\"/\u003e\u003c/a\u003e\u003c/p\u003e\u003cp\u003eDaniel Gryniewicz / \u003ca href=\"mailto:dang@fprintf.net\"\u003edang@fprintf.net\u003c/a\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/09/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/Vim%E5%A4%87%E5%BF%98%E5%BD%95/"},{"title":"基于Bash的目录级环境配置工具","time":"2023-09-26T15:46:55Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e最近对于Bash愈发迷恋,几乎任何会花费我超过30秒时间的任务,我都会考虑\u003cdel\u003e打个脚先\u003c/del\u003e写个脚本搞定。再比如说写博客,这种纯输出流就很适合Vim啊,作为一个Vim\u003cdel\u003e批\u003c/del\u003e必然是原教旨主义最好啊:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://mxts.jiujiuer.xyz/img/Pasted%20image%2020230926235753.png\" alt=\"算了截图还是用Obsidian粘吧\"/\u003e\u003c/p\u003e\u003cp\u003e但是除了截图粘贴不方便外,还有一些比较难受的地方。在Obsidian里边我是能直接用插件的各种功能快速编写博客的,虽然在Bash终端环境下编写脚本确实更方便了,但是脚本一多,目录就乱的不能看力:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 强迫症是病,得治\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── about\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── _archive\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── deploy.sh\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── _draft\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── how-much-did-i-write.sh\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── img\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── img-uri-process.sh\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── _inbox\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── links\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── new-post.sh\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── _posts\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e└── _scaffolds\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9 directories, 4 files\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e三个脚本,一个是统计字数的,一个是用\u003ccode\u003esed\u003c/code\u003e处理图片链接的,还有一个是从模板新建博客的。每次打开目录看到这仨在中间总觉得很别扭。\u003c/p\u003e\u003cp\u003e除了这,还有就是用起来也不方便:前面要是不加\u003ccode\u003e./\u003c/code\u003e就能直接用就好了\u003cdel\u003e懒也是病得治\u003c/del\u003e\u003c/p\u003e\u003cp\u003e所以,需求大概就是这样:目录级别的环境变量配置,并且支持还得够完善,不能离开目录了配置还在生效,不然脚本在其他目录跑飞了想想就恐怖。\u003c/p\u003e\u003ch2 id=\"Basic-Implementation\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/26/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/%E5%9F%BA%E4%BA%8EBash%E7%9A%84%E7%9B%AE%E5%BD%95%E7%BA%A7%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E5%B7%A5%E5%85%B7/#Basic-Implementation\" class=\"headerlink\" title=\"Basic Implementation\"\u003e\u003c/a\u003eBasic Implementation\u003c/h2\u003e\u003cp\u003e首先定位清楚,这个对\u003ccode\u003ecd\u003c/code\u003e的Hook只是在指令完成后,加载或者取消配置局部环境变量。因此大概实现方式和结构都有合适的选择。\u003c/p\u003e\u003cul\u003e\u003cli\u003e程序扔\u003ccode\u003e~/.bashrc\u003c/code\u003e里,或者\u003ccode\u003e/etc/profile\u003c/code\u003e里。不过我一般在GUI用konsole比较多,所以就放\u003ccode\u003e.bashrc\u003c/code\u003e里了,也方便dotfile管理。\u003c/li\u003e\u003cli\u003e把具体实现用\u003ccode\u003ealias\u003c/code\u003e赋别名为\u003ccode\u003ecd\u003c/code\u003e达到重载(或者说Hook)\u003ccode\u003ecd\u003c/code\u003e的目的。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e基于上面这两条,这是我写一个粗略实现(没干掉bash基本使用就是能用\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"function\"\u003e\u003cspan class=\"title\"\u003ecd_hook\u003c/span\u003e\u003c/span\u003e() {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"comment\"\u003e# The normal cd\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e [ \u003cspan class=\"variable\"\u003e$#\u003c/span\u003e == 0 ]; \u003cspan class=\"keyword\"\u003ethen\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eelse\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$1\u003c/span\u003e\u0026#34;\u003c/span\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efi\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"comment\"\u003e# If the dir contains bashrc, launch the sub shell and load it\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e [ -f \u003cspan class=\"string\"\u003e\u0026#34;.bashrc\u0026#34;\u003c/span\u003e ] \u0026amp;\u0026amp; [ \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"subst\"\u003e$(pwd)\u003c/span\u003e\u0026#34;\u003c/span\u003e != \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"subst\"\u003e$(getent passwd $USER | awk -F \u0026#39;:\u0026#39; \u0026#39;{print $6}\u0026#39;)\u003c/span\u003e\u0026#34;\u003c/span\u003e ]; \u003cspan class=\"keyword\"\u003ethen\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003epushd\u003c/span\u003e . \u0026gt; /dev/null\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e bash --init-file \u0026lt;(\u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e /etc/profile ~/.bashrc .bashrc)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003efi\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ealias\u003c/span\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#39;cd_hook\u0026#39;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面有依托用来检测是否是家目录的指令来避免套娃(虽然理论上充重复加载家目录配置应该没啥),然后是检测当前目录下(因为是先\u003ccode\u003ecd\u003c/code\u003e过去的嘛,所以\u003ccode\u003epwd\u003c/code\u003e已经变了)是否有\u003ccode\u003e.bashrc\u003c/code\u003e,有的话就把它作为子参数,和家目录下的bashrc一起传给子bash,然后启动它。\u003c/p\u003e\u003cp\u003e这样就能实现cd后自动加载目录下的配置了。赶紧试试:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# My blog\u0026#39;s utiilties and aliases\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eset\u003c/span\u003e -e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTMPL=$(find ./_scaffolds | grep .md)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"function\"\u003e\u003cspan class=\"title\"\u003edeploy\u003c/span\u003e\u003c/span\u003e() {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e ..\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e (\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003erm\u003c/span\u003e -rf deploy \u0026amp;\u0026amp; \u003cspan class=\"built_in\"\u003ecp\u003c/span\u003e -r blog deploy\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e deploy \u0026amp;\u0026amp; git checkout deploy\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ecp\u003c/span\u003e -r blog deploy/source\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e deploy \u0026amp;\u0026amp; pnpm i \u0026amp;\u0026amp; pnpm run server\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e )\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"function\"\u003e\u003cspan class=\"title\"\u003eimage_url_proc\u003c/span\u003e\u003c/span\u003e() {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e find . -\u003cspan class=\"built_in\"\u003etype\u003c/span\u003e f -name \u003cspan class=\"string\"\u003e\u0026#34;*.md\u0026#34;\u003c/span\u003e -\u003cspan class=\"built_in\"\u003eexec\u003c/span\u003e sed -i \u003cspan class=\"string\"\u003e\u0026#39;s/\\!\\[\\[\\(.*\\)\\/\\(.*\\)\\]\\]/\\!\\[\\2\\]\\(\\/img\\/\\2\\)/gi\u0026#39;\u003c/span\u003e {}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"function\"\u003e\u003cspan class=\"title\"\u003enew_post\u003c/span\u003e\u003c/span\u003e() {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sed -e \u003cspan class=\"string\"\u003e\u0026#34;s/{{title}}/\u003cspan class=\"variable\"\u003e$1\u003c/span\u003e/\u0026#34;\u003c/span\u003e -e \u003cspan class=\"string\"\u003e\u0026#34;s/{{date}} {{time}}/\u003cspan class=\"subst\"\u003e$(date \u0026#39;+%Y-%m-%d %H:%M:%S\u0026#39;)\u003c/span\u003e/\u0026#34;\u003c/span\u003e \u003cspan class=\"variable\"\u003e$TMPL\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"function\"\u003e\u003cspan class=\"title\"\u003eline_count\u003c/span\u003e\u003c/span\u003e() {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;You have wrote \u003cspan class=\"subst\"\u003e$(find _* -name *.md | xargs cat 2\u0026gt;/dev/null | wc -l)\u003c/span\u003e lines in total!\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003ecd到目录里边试试\u003ccode\u003eline_count\u003c/code\u003e:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003exeonds@ark-station-breeze:~/Documents/blog$ line_count\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eYou have wrote 36570 lines \u003cspan class=\"keyword\"\u003ein\u003c/span\u003e total!\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003exeonds@ark-station-breeze:~/Documents/blog$ \u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e好好好,再看看目录结构:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── .bashrc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── about\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── _archive\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── _draft\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── img\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── _inbox\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── links\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e├── _posts\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e└── _scaffolds\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 9 directories, 1 files\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e爽死。\u003c/p\u003e\u003cp\u003e慢着,里边还有一行\u003ccode\u003epushd\u003c/code\u003e呢。嗯,这是后面用来实现自动退出子Shell的关键。具体实现等到下一部分再说吧,先睡了。\u003c/p\u003e\u003cp\u003e后来感觉这样有点太麻烦了,于是就把脚本简化了一下:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"function\"\u003e\u003cspan class=\"title\"\u003ecd\u003c/span\u003e\u003c/span\u003e() {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ebuiltin\u003c/span\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$@\u003c/span\u003e\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e [[ -f \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$PWD\u003c/span\u003e/.bashrc\u0026#34;\u003c/span\u003e ]]; \u003cspan class=\"keyword\"\u003ethen\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexec\u003c/span\u003e bash --rcfile \u0026lt;(\u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e ~/.bashrc \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$PWD\u003c/span\u003e/.bashrc\u0026#34;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eelse\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexec\u003c/span\u003e bash --rcfile \u0026lt;(\u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e ~/.bashrc)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003efi\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e逻辑很简单,先直通参数执行完内置\u003ccode\u003ecd\u003c/code\u003e,然后判断目的目录底下有没有\u003ccode\u003e.bashrc\u003c/code\u003e,有的话直接\u003ccode\u003eexec\u003c/code\u003e一个新的bash来加载这个配置文件和\u003ccode\u003e~/\u003c/code\u003e下的默认配置;如果没有的话,也\u003ccode\u003eexec\u003c/code\u003e一个新的bash替换当前进程。\u003c/p\u003e\u003cp\u003e之所以到一个新目录都要开一个新的进程替换当前进程,是为了使得只有在当前目录底下才可以使用当前文件夹的环境变量。不过这也带来了新的问题:那就是执行一些包含\u003ccode\u003ecd\u003c/code\u003e的脚本时,会因为\u003ccode\u003eexec\u003c/code\u003e用新的进程覆盖了当前进程的原因,导致脚本执行终止。\u003c/p\u003e\u003cp\u003e最后想了下,Makefile不也挺好用的(笑)。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/09/26/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/%E5%9F%BA%E4%BA%8EBash%E7%9A%84%E7%9B%AE%E5%BD%95%E7%BA%A7%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E5%B7%A5%E5%85%B7/"},{"title":"SSH学习笔记","time":"2023-09-25T06:16:18Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e文章是我和GPT一块写的,回头再慢慢丰富润色。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003eOpenSSH是一种强大的远程登录和数据传输工具,也是SSH协议目前最流行的实现。它提供了许多安全功能,如数据加密、身份验证和会话完整性。安全性上,SSH能吊着明文传输的Telnet打。并且SSH的配置也相对容易,目前基本所有主流Linux发行版都默认安装了OpenSSH,Win10/11也自带了OpenSSH Cilent。\u003c/p\u003e\u003cp\u003e追求效率提升,首先需要看看日常重复次数最多的操作,然后试着优化——比如SSH,虽然每次只有1,2秒,但累积起来节省的时间也不少。配置好了基本能实现无感登陆那种程度,让你几乎忘掉这个环节,还是挺爽的。除了效率,提升点安全性也是挺好的:公网服务器改用密钥登陆,又无感又安全——只要密钥别丢。\u003c/p\u003e\u003ch2 id=\"基本用法\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/25/ssh-usage/#%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95\" class=\"headerlink\" title=\"基本用法\"\u003e\u003c/a\u003e基本用法\u003c/h2\u003e\u003ch3 id=\"远程登录\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/25/ssh-usage/#%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95\" class=\"headerlink\" title=\"远程登录\"\u003e\u003c/a\u003e远程登录\u003c/h3\u003e\u003cp\u003e基本格式:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh [options] [username]@[hostname] \u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e\u003ccode\u003e[username]\u003c/code\u003e 是远程主机的用户名,\u003ccode\u003e[hostname]\u003c/code\u003e 是远程主机的主机名或 IP 地址。\u003c/p\u003e\u003cp\u003e\u003ccode\u003e[options]\u003c/code\u003e 是可选的参数,例如 \u003ccode\u003e-i\u003c/code\u003e 指定要使用的私钥文件,\u003ccode\u003e-L\u003c/code\u003e 指定要使用的本地端口转发,\u003ccode\u003e-R\u003c/code\u003e 指定要使用的远程端口转发等。\u003c/p\u003e\u003cp\u003e一般用的最多的是默认端口密码登陆:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh username@hostname \u0026lt;-p 22\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e后面的\u003ccode\u003e-p 22\u003c/code\u003e是缺省参数,可以不加。\u003c/p\u003e\u003cp\u003e不过密码登陆安全性并不太高,建议重要场合上密钥登陆。例如,用密钥文件 \u003ccode\u003eid_rsa\u003c/code\u003e 以用户 \u003ccode\u003eusername\u003c/code\u003e 登录远程主机 \u003ccode\u003eexample.com\u003c/code\u003e:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh -i id-rsa username@example.com\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e密钥和公钥就像锁和钥匙一一对应,你可以用同一对公钥密钥登陆多个主机,不过显然不太安全。建议一对公密钥只用于一个服务器的登陆。\u003c/p\u003e\u003cp\u003e它们的创建很简单,使用 \u003ccode\u003eOpenSSH\u003c/code\u003e 自带的 \u003ccode\u003essh-keygen\u003c/code\u003e 命令即可:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003exeonds@ark-station:~$ ssh-keygen \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eGenerating public/private ed25519 key pair.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eEnter file \u003cspan class=\"keyword\"\u003ein\u003c/span\u003e \u003cspan class=\"built_in\"\u003ewhich\u003c/span\u003e to save the key (/home/xeonds/.ssh/id_ed25519): example-key \u003cspan class=\"comment\"\u003e# 指定公钥私钥保存在哪\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eEnter passphrase (empty \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e no passphrase): \u003cspan class=\"comment\"\u003e# 指定私钥使用密码\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eEnter same passphrase again: \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eYour identification has been saved \u003cspan class=\"keyword\"\u003ein\u003c/span\u003e example-key\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eYour public key has been saved \u003cspan class=\"keyword\"\u003ein\u003c/span\u003e example-key.pub\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eThe key fingerprint is:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSHA256:tFoZLdZFg3HDMqGG6rC5jq+zysxClfBCUvffMYgS5GY xeonds@ark-station\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eThe key\u003cspan class=\"string\"\u003e\u0026#39;s randomart image is:\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e+--[ED25519 256]--+\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e| ...+ o** |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e|.o o o o =+o.o |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e|o o E + O =o |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e| . * o = * o |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e| + . S . |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e| . = o |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e|. o . . |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e|*. . |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e|BX+ |\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e+----[SHA256]-----+\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003exeonds@ark-station:~$ ls | grep example\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eexample-key\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eexample-key.pub\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面带\u003ccode\u003e.pub\u003c/code\u003e后缀的就是公钥,私钥是不带后缀的那个。创建完成之后,可以用 \u003ccode\u003essh-copy-id\u003c/code\u003e 把公钥传给你要登陆的服务器,把私钥妥善保管好:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh-copy-id -i example-key.pub username@example.com\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e还可以用\u003ccode\u003e-p xxxx\u003c/code\u003e指定端口。传完之后就能用前面的指令登陆服务器了。但是这样也挺麻烦的对吧。你别急,还有办法:把下面的内容保存到你的\u003ccode\u003e~/.ssh/config\u003c/code\u003e文件中:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eHost my-server\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e HostName example.com\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e User username\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Port 22 # 端口默认22的话可以不写\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e IdentityFile ~/.ssh/example-key # 指向你的密钥路径\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e PreferredAuthentications publickey # 指定优先使用公钥\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e现在就可以直接用下面的指令登陆了:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh my-server\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e直接登陆,几乎无感。当然要是你给私钥设置密码了就得在登陆的时候再输入一遍密码。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e不过跟现代计算机系统比起来,还是人参与的环节更加脆弱,最终还是得小心社工手段。\u003c/p\u003e\u003c/blockquote\u003e\u003ch3 id=\"断开连接\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/25/ssh-usage/#%E6%96%AD%E5%BC%80%E8%BF%9E%E6%8E%A5\" class=\"headerlink\" title=\"断开连接\"\u003e\u003c/a\u003e断开连接\u003c/h3\u003e\u003cp\u003e因为忘了断开另一个开发机的ssh连接导致我有几个端口一直被占用着,所以得想办法断开另一台机器的连接:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003ew \u003cspan class=\"comment\"\u003e# 查看所有连接\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epkill -\u003cspan class=\"built_in\"\u003ekill\u003c/span\u003e -t pts/x \u003cspan class=\"comment\"\u003e# 断开编号为x的连接\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epkill -9 -t pts/x \u003cspan class=\"comment\"\u003e# 和上边一样,不过是强制断联\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e不过不知道为啥好像远程shell的服务还活着,只能手动杀掉了。下次建议用tmux,省事省心。\u003c/p\u003e\u003ch3 id=\"传输文件\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/25/ssh-usage/#%E4%BC%A0%E8%BE%93%E6%96%87%E4%BB%B6\" class=\"headerlink\" title=\"传输文件\"\u003e\u003c/a\u003e传输文件\u003c/h3\u003e\u003cp\u003eOpenSSH 还提供了一种安全传输文件的方法,称为 SFTP(SSH 文件传输协议)。要使用 SFTP 传输文件,您需要使用以下命令:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esftp [options] [username]@[hostname] \u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e其中,\u003ccode\u003e[options]\u003c/code\u003e 是可选的参数,例如 \u003ccode\u003e-i\u003c/code\u003e 指定要使用的私钥文件,\u003ccode\u003e-L\u003c/code\u003e 指定要使用的本地端口转发,\u003ccode\u003e-R\u003c/code\u003e 指定要使用的远程端口转发等。\u003ccode\u003e[username]\u003c/code\u003e 是远程主机的用户名,\u003ccode\u003e[hostname]\u003c/code\u003e 是远程主机的主机名或 IP 地址。\u003cbr/\u003e例如,如果您要使用密钥文件 \u003ccode\u003eid_rsa\u003c/code\u003e 将本地文件 \u003ccode\u003efile.txt\u003c/code\u003e 传输到远程主机 \u003ccode\u003eexample.com\u003c/code\u003e,可以使用以下命令:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esftp -i id_rsa example.com \u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"高级用法\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/25/ssh-usage/#%E9%AB%98%E7%BA%A7%E7%94%A8%E6%B3%95\" class=\"headerlink\" title=\"高级用法\"\u003e\u003c/a\u003e高级用法\u003c/h2\u003e\u003ch3 id=\"1-端口转发\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/25/ssh-usage/#1-%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91\" class=\"headerlink\" title=\"1. 端口转发\"\u003e\u003c/a\u003e1. 端口转发\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003eref:\u003ca href=\"https://zhuanlan.zhihu.com/p/57630633\"\u003eSSH命令的三种代理功能 - 韦易笑\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003eOpenSSH 提供了一种称为端口转发的功能,允许您将本地端口与远程端口进行映射。这使得您可以在本地网络上使用远程服务,而无需将服务暴露给外部网络。要使用端口转发,您需要使用以下命令:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh -L [local_port:]local_host [username]@[hostname] \u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e其中,\u003ccode\u003e[local_port]\u003c/code\u003e 是本地端口的名称,\u003ccode\u003elocal_host\u003c/code\u003e 是本地主机的名称或 IP 地址,\u003ccode\u003e[username]\u003c/code\u003e 是远程主机的用户名,\u003ccode\u003e[hostname]\u003c/code\u003e 是远程主机的主机名或 IP 地址。\u003cbr/\u003e例如,如果您要将本地端口 8080 映射到远程主机的 SSH 服务(端口 22),可以使用以下命令:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh -L 8080:localhost username@example.com \u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面的指令就能很轻易实现基于\u003ccode\u003exxx over SSH\u003c/code\u003e的内网穿透。举个例子,前面我配置好了我的服务器的\u003ccode\u003essh config\u003c/code\u003e,假设我的服务器配置项名为\u003ccode\u003eserver\u003c/code\u003e,在局域网中有一台地址为\u003ccode\u003e1.14.5.14\u003c/code\u003e的Windows服务器,那么我就可以使用一行指令通过SSH跳转连接到这台Windows服务器的远程桌面:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh -L 3389:1.14.5.14:3389 server -N \u0026amp; rdesktop localhost\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e假设我的这台服务器\u003ccode\u003eserver\u003c/code\u003e在层层内网中,需要经过多重跳板才能从公网进行访问,一般的远程桌面面对这种网络环境可能比较困难,但是对于上面的\u003ccode\u003eRDP over SSH\u003c/code\u003e,这种方法既能享受\u003ccode\u003eSSH\u003c/code\u003e的安全性,又能相对便利地进行访问——只要配置好这台\u003ccode\u003eserver\u003c/code\u003e服务器的\u003ccode\u003eProxyJump\u003c/code\u003e路径和登陆就行。\u003c/p\u003e\u003cp\u003e端口转发有三种方式,上边的\u003ccode\u003e-L\u003c/code\u003e是正向代理,也就是在本地启动端口,把本地的数据转发到远端。上面转发桌面的例子就是这样,把本地3389端口的RDP请求转发到了远端的3389端口,从而实现了从本地访问远程服务器所在局域网的计算机的需求。另外两种分别是反向代理\u003ccode\u003e-R\u003c/code\u003e和socks5代理\u003ccode\u003e-D\u003c/code\u003e。这个一般可以作为兜底方案,长期需求建议上服务器。\u003c/p\u003e\u003cp\u003e按照正向代理的思路,反向代理就是把远端端口的访问请求转发到本地的计算机上。比如访问一个公网计算机的1234端口,就可以通过\u003ccode\u003e-R\u003c/code\u003e启动反向代理将这个端口的请求转发到本地的任意端口(比如4514)从而将内网的某个服务映射到公网中。这一点特别适合临时给某个服务搭建一个预览平台。\u003c/p\u003e\u003cp\u003e另外就是socks5转发,可以直接点上边链接看原文,这种我还没用过就不做阐述了。\u003c/p\u003e\u003cp\u003e下面用指令总结下这几种代理方式:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 转发本地请求到远端,例如访问远程局域网的远程桌面\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003essh -L [本地主机所在局域网任意主机:端口]:[目标主机所在局域网任意主机:端口] 要连接的主机\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 转发远端请求到本地,例如穿透本机某端口的服务到公网\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003essh -R [远端主机:端口]:[本地主机局域网任意主机:端口] 远端主机\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 本地socks5代理,效果大概就是让远端主机成为自己1080端口的上网代理?\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 完成之后,在浏览器代理设置里边设置代理为socks5,地址为localhost:1080就行\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003essh -D localhost:1080 远端主机\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003col start=\"2\"\u003e\u003cli\u003e连接后执行一条指令后断开\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e直接在连接命令后边跟上要执行的指令就行。\u003c/p\u003e\u003col start=\"3\"\u003e\u003cli\u003e在远程主机运行X程序\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e连接命令加上\u003ccode\u003e-X\u003c/code\u003e参数,然后主机就会开启X转发。用\u003ccode\u003e-x\u003c/code\u003e则是关闭X转发。没用过,不过看起来像是服务器上跑进程,本地跑GUI的做法?\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/09/25/ssh-usage/"},{"title":"Flutter速通指南","time":"2023-09-16T08:34:35Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e2023 XDU-OSC Community - Presented with love by BenderBlog/SuperBart\u003c/p\u003e\u003cp\u003e借助Flutter,他重新实现了校内十分流行的工具软件电表,使得用iOS的同学也有了自己的电表可用。开源和Flutter带来的,对于开发工作的简化\u003cdel\u003e以及SuperBart的超级肝力\u003c/del\u003e都成为了它能迅速上架iOS并迅速迭代的原因。\u003c/p\u003e\u003cp\u003e原生的电表iOS版本使用了iOS Native开发,在开发效率上略低于先天统一了不同平台实现的Flutter。在运行效率上的提升在业务都相对比较简单的情况下并没有很显著的优势。\u003c/p\u003e\u003cp\u003e其实上面这点也是现在原生客户端开发面对的问题。原生带来了更细致入微的操作粒度,带来更极致的原生性能利用率的同时,对于开发者心智的负担要求很高,也对开发者的能力深入性和熟练度提出了很高的要求;应对这一点的解决方案,有使用Web技术统一全端(就是性能问题和资源利用率一直饱受诟病),也有使用像Flutter这样的混合跨平台框架。后者性能损失相对没那么严重,跨平台能力也相对不错,但是动态程序的本质让它对于低性能设备的友好度较低(比如现在的百度贴吧客户端就是Flutter客户端,面对长列表的加载等场景偶尔会出现崩溃等问题)。\u003c/p\u003e\u003cp\u003e开发效率和程序运行表现基本是一对负相关的参数,其中的取舍就是开发者需要考虑的问题。在程序开发领域,没有银弹。\u003c/p\u003e\u003ch2 id=\"SuperBart的讲座\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#SuperBart%E7%9A%84%E8%AE%B2%E5%BA%A7\" class=\"headerlink\" title=\"SuperBart的讲座\"\u003e\u003c/a\u003eSuperBart的讲座\u003c/h2\u003e\u003ch3 id=\"Flutter概要\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#Flutter%E6%A6%82%E8%A6%81\" class=\"headerlink\" title=\"Flutter概要\"\u003e\u003c/a\u003eFlutter概要\u003c/h3\u003e\u003cp\u003e一套代码 (\u003ccode\u003e./lib\u003c/code\u003e), 多平台运行.\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eandroid, windows, linux, ios等.\u003c/p\u003e\u003c/blockquote\u003e\u003cul\u003e\u003cli\u003e面向客户端\u003c/li\u003e\u003cli\u003e平台无关\u003c/li\u003e\u003cli\u003e上手简单\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eFlutter的开发语言是Dart,初见印象:Dart= JS/C++(语言友好度和性能上) + Java(代码风格上) + Dart VM\u003c/p\u003e\u003ch3 id=\"Basic-code-format\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#Basic-code-format\" class=\"headerlink\" title=\"Basic code format\"\u003e\u003c/a\u003eBasic code format\u003c/h3\u003e\u003cp\u003etldr\u003c/p\u003e\u003cul\u003e\u003cli\u003eEmpty safety: \u003ccode\u003etype?\u003c/code\u003e means var is nullable\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eThis will trigger empty check, avoid npe\u003c/p\u003e\u003cul\u003e\u003cli\u003elate init\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eJust like Kotlin\u003c/p\u003e\u003cul\u003e\u003cli\u003eAsync\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"Basic-layouts\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#Basic-layouts\" class=\"headerlink\" title=\"Basic layouts\"\u003e\u003c/a\u003eBasic layouts\u003c/h3\u003e\u003cul\u003e\u003cli\u003eWidget\u003c/li\u003e\u003cli\u003eText\u003c/li\u003e\u003cli\u003eWarp\u003c/li\u003e\u003cli\u003eRow-Column\u003c/li\u003e\u003cli\u003eContainer\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"Basic-scaffolds\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#Basic-scaffolds\" class=\"headerlink\" title=\"Basic scaffolds\"\u003e\u003c/a\u003eBasic scaffolds\u003c/h3\u003e\u003cul\u003e\u003cli\u003eAppBar\u003c/li\u003e\u003cli\u003eAction\u003c/li\u003e\u003cli\u003eTItle\u003c/li\u003e\u003cli\u003eTabBar\u003c/li\u003e\u003cli\u003eBody\u003c/li\u003e\u003cli\u003eBottomBar\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"Network\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#Network\" class=\"headerlink\" title=\"Network\"\u003e\u003c/a\u003eNetwork\u003c/h3\u003e\u003cp\u003e主要使用\u003ccode\u003eFlutter\u003c/code\u003e的\u003ccode\u003eDio\u003c/code\u003e。不过我用\u003ccode\u003ehttp/http.dart\u003c/code\u003e更多。\u003c/p\u003e\u003ch2 id=\"开发笔记\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#%E5%BC%80%E5%8F%91%E7%AC%94%E8%AE%B0\" class=\"headerlink\" title=\"开发笔记\"\u003e\u003c/a\u003e开发笔记\u003c/h2\u003e\u003cp\u003e评价是Flutter这玩意搓东西真的快。\u003c/p\u003e\u003cp\u003eFlutter使用的dart语言,强类型和可写性平衡的挺舒服的。语法上,Dart算是JavaScript的继承,语法大差不差,改进了JavaScript混乱的类型系统,还封装了不少挺不错的语法特性,比如那个Future,用着还行。还有内置的高级数据结构之类的,用着挺省心。\u003c/p\u003e\u003cp\u003e不过写这东西,我好像很少单独注意语法层面的东西,一般都是定义个返回Widget的build函数完事。另外这语言比较像DSL,没见过别处有用这玩意的。\u003c/p\u003e\u003ch3 id=\"关于WebViewWidget\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#%E5%85%B3%E4%BA%8EWebViewWidget\" class=\"headerlink\" title=\"关于WebViewWidget\"\u003e\u003c/a\u003e关于WebViewWidget\u003c/h3\u003e\u003cp\u003e这玩意比较坑的一点是它只支持Android和iOS平台,对于Windows/Linux/Web平台,这玩意都是不支持的。。\u003c/p\u003e\u003cp\u003e所以review同学的代码的时候,发现在我用Linux平台跑的时候报错了。搜了下才发现这问题。\u003c/p\u003e\u003cp\u003e不过也无所谓了,反正这玩意本来就只是在Android/iOS上跑的。\u003c/p\u003e\u003ch3 id=\"关于TextEditController\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#%E5%85%B3%E4%BA%8ETextEditController\" class=\"headerlink\" title=\"关于TextEditController\"\u003e\u003c/a\u003e关于TextEditController\u003c/h3\u003e\u003cp\u003e声明一个文本框时,它会默认初始化一个TextEditController。如果你传递给它你定义的Controller,它就会使用你提供的而不是自己创建。另外特别注意,给TextField赋值这一项的行为不是常量表达式,不能在它和它的父结构中使用\u003ccode\u003econst\u003c/code\u003e关键字。\u003c/p\u003e\u003ch3 id=\"关于sqflite\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#%E5%85%B3%E4%BA%8Esqflite\" class=\"headerlink\" title=\"关于sqflite\"\u003e\u003c/a\u003e关于sqflite\u003c/h3\u003e\u003cp\u003e这玩意有大坑(关于平台兼容性上的)。反正我目前尝试之后发现要么支持Windows/Linux/Mac等桌面端,要么支持Android/iOS等移动端的SQLite使用。\u003c/p\u003e\u003ch3 id=\"关于ListView\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#%E5%85%B3%E4%BA%8EListView\" class=\"headerlink\" title=\"关于ListView\"\u003e\u003c/a\u003e关于ListView\u003c/h3\u003e\u003cp\u003e关于这个东西,得注意的就是嵌套使用。嵌套的子\u003ccode\u003eListView\u003c/code\u003e,需要设置如下两个属性来避免滚定判定失效:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eshrinkWrap: true,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ephysics: const NeverScrollableScrollPhysics(),\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"关于项目结构\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/#%E5%85%B3%E4%BA%8E%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84\" class=\"headerlink\" title=\"关于项目结构\"\u003e\u003c/a\u003e关于项目结构\u003c/h3\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003elib/\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- models/ // Define your data entities here\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- entity1.dart\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- entity2.dart\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- services/ // Implement background service here\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- background_service.dart\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- screens/ // Screens of your app\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- screen1/ // Screen 1 related files\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- screen1.dart\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- screen1_bloc.dart // If you\u0026#39;re using BLoC pattern\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- screen2/ // Screen 2 related files\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- screen2.dart\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- screen2_bloc.dart // If you\u0026#39;re using BLoC pattern\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- settings/ // Settings related pages\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- settings.dart\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- sub_setting1.dart\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- sub_setting2.dart\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- widgets/ // Reusable widgets\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- providers/ // Provider setup and providers for data and services\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- app_provider.dart // Main provider setup\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- data_provider.dart // Provider for CRUD actions on data entities\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- service_provider.dart // Provider for background service\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |- main.dart // Entry point of the app\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e功能划分基本就这几块:UI,状态管理服务,数据实体,后台服务。代码嘛,能简洁点最好。\u003c/p\u003e\u003cp\u003e另外就我的开发经验而言,最好不要过早规范化工程化。早期过于强调规范和过程的收益是负的。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/09/16/flutter-intro/"},{"title":"C++-STL速通","time":"2023-09-14T14:09:12Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003eC++用的比较少,最近准备试试CSP。于是就得赶紧学学STL。以前是用过,但是没咋记下来。\u003c/p\u003e\u003cp\u003e想查看所有std实体的话,使用下面的指令:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eapropos -r \u003cspan class=\"string\"\u003e\u0026#39;^std\u0026#39;\u003c/span\u003e | vim -\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e关于\u003ccode\u003eapropos\u003c/code\u003e,它是LINUX系统中的一个命令,用来通过关键字查找定位手册页的名字和描述。 它相当于使用带有-k选项的man命令。 每个手册页里都有一个简短的描述。 apropos在这个描述中查找keyword。这是使用\u003ccode\u003eman\u003c/code\u003e 帮助文档的一个好工具。\u003c/p\u003e\u003ch2 id=\"分类\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#%E5%88%86%E7%B1%BB\" class=\"headerlink\" title=\"分类\"\u003e\u003c/a\u003e分类\u003c/h2\u003e\u003cul\u003e\u003cli\u003e顺序式:\u003ccode\u003evector, list, deque\u003c/code\u003e\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ebegin\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eend\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003erbegin\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003erend\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003efront\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eback\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eerase\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eclear\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003epush_back\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003epop_back\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003einsert\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"Vector\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#Vector\" class=\"headerlink\" title=\"Vector\"\u003e\u003c/a\u003eVector\u003c/h3\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;vector\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e简而言之就是数组,但是优化过,缝合了诸如队列、栈一类的特性。\u003c/p\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003evector\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; vec; \u003cspan class=\"comment\"\u003e// 声明一个空的vector\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003evector\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003evec\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"number\"\u003e5\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003evector\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003evec\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"number\"\u003e10\u003c/span\u003e, \u003cspan class=\"number\"\u003e1\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// 大小为10, 初始值为1\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003evector\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003evec\u003c/span\u003e\u003cspan class=\"params\"\u003e(oldVec)\u003c/span\u003e\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003evector\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003evec\u003c/span\u003e\u003cspan class=\"params\"\u003e(oldVec.begin(), dolVec.begin()+\u003cspan class=\"number\"\u003e3\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e arr[\u003cspan class=\"number\"\u003e5\u003c/span\u003e] = {\u003cspan class=\"number\"\u003e1\u003c/span\u003e, \u003cspan class=\"number\"\u003e2\u003c/span\u003e, \u003cspan class=\"number\"\u003e3\u003c/span\u003e, \u003cspan class=\"number\"\u003e4\u003c/span\u003e, \u003cspan class=\"number\"\u003e5\u003c/span\u003e};\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003evector\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003evec\u003c/span\u003e\u003cspan class=\"params\"\u003e(arr, arr+\u003cspan class=\"number\"\u003e5\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// 用数组初始化vec\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003evector\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003evec\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u0026amp;arr[\u003cspan class=\"number\"\u003e0\u003c/span\u003e], \u0026amp;arr[\u003cspan class=\"number\"\u003e5\u003c/span\u003e])\u003c/span\u003e\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// 用数组初始化vec, 注意这里是超尾, 与end相对应\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e那么如果我希望直接在下标为5的位置直接放入这个3呢,那不是需要先往里塞入5个0才可以么?这种情况,我们就可以定义一下vector的长度,然后就可以当做数组一样用了\u003c/p\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003evector\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003ea\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"number\"\u003e10\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ea[\u003cspan class=\"number\"\u003e5\u003c/span\u003e] = \u003cspan class=\"number\"\u003e3\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"List\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#List\" class=\"headerlink\" title=\"List\"\u003e\u003c/a\u003eList\u003c/h3\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;list\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e双向链表。因此并不支持随机访问。尾部插入元素效率很高。\u003c/p\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003elist\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; l;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003elist\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003el\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"number\"\u003e5\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// 含有5个元素的list, 初始值为0\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003elist\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003el\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"number\"\u003e10\u003c/span\u003e, \u003cspan class=\"number\"\u003e1\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// 含有10个元素的list, 初始值为1\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003elist\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003el\u003c/span\u003e\u003cspan class=\"params\"\u003e(oldL)\u003c/span\u003e\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// 复制构造\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003elist\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003el\u003c/span\u003e\u003cspan class=\"params\"\u003e(oldL.begin(), oldL.end())\u003c/span\u003e\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e arr[\u003cspan class=\"number\"\u003e5\u003c/span\u003e] = {\u003cspan class=\"number\"\u003e1\u003c/span\u003e, \u003cspan class=\"number\"\u003e2\u003c/span\u003e, \u003cspan class=\"number\"\u003e3\u003c/span\u003e, \u003cspan class=\"number\"\u003e4\u003c/span\u003e, \u003cspan class=\"number\"\u003e5\u003c/span\u003e};\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003elist\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003el\u003c/span\u003e\u003cspan class=\"params\"\u003e(arr, arr+\u003cspan class=\"number\"\u003e5\u003c/span\u003e)\u003c/span\u003e\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// 用数组初始化list\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"function\"\u003elist\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; \u003cspan class=\"title\"\u003el\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u0026amp;arr[\u003cspan class=\"number\"\u003e1\u003c/span\u003e], \u0026amp;arr[\u003cspan class=\"number\"\u003e5\u003c/span\u003e])\u003c/span\u003e\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// 用数组初始化list\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003elist.\u003cspan class=\"built_in\"\u003emerge\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 合并两个list\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003elist.\u003cspan class=\"built_in\"\u003eremove\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003elist.\u003cspan class=\"built_in\"\u003eremove_if\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 按指定条件删除元素\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003elist.\u003cspan class=\"built_in\"\u003ereverse\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 逆置list元素\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003elist.\u003cspan class=\"built_in\"\u003esort\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 排序\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003elist.\u003cspan class=\"built_in\"\u003eunique\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 删除重复元素\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003elist.\u003cspan class=\"built_in\"\u003esplice\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 从另一个 list 中移动元素\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// Most used functions\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003epush_front\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// vector 没有该函数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003epop_front\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// vector 没有该函数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"Deque\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#Deque\" class=\"headerlink\" title=\"Deque\"\u003e\u003c/a\u003eDeque\u003c/h3\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;deque\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e双端队列。每个元素在内存上是连续的,类似vector,是它的升级版。它有高效的首尾插入/删除操作。实现方法相当于list和vector的折衷。\u003c/p\u003e\u003cp\u003e它支持随机访问和\u003ccode\u003eat()\u003c/code\u003e。\u003c/p\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003epush_back\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003epop_back\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003epush_front\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// vector 没有该函数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003epop_front\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// vector 没有该函数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e关联式容器: \u003ccode\u003emap, unordered_map, multimap, unordered_multimap, set, unordered_set, multiset, unordered_multiset\u003c/code\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"Map\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#Map\" class=\"headerlink\" title=\"Map\"\u003e\u003c/a\u003eMap\u003c/h3\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;map\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e一种基于红黑树的键值对数据结构。\u003c/p\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 数据插入, 复杂度为 logn\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003einsert\u003c/span\u003e({key, value});\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap[key] = value;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 移除, 复杂度为 logn\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003eerase\u003c/span\u003e(key)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 搜索, 复杂度为 logn\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003efind\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap[key]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003ecount\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 返回匹配特定键的元素数量, 对数复杂度\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003econtains\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003eequal_range\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003elower_bound\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003eupper_bound\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"Unordered-Map\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#Unordered-Map\" class=\"headerlink\" title=\"Unordered-Map\"\u003e\u003c/a\u003eUnordered-Map\u003c/h3\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;unordered_map\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e区别于前者使用红黑树实现,它使用哈希函数实现,因此元素无序。\u003c/p\u003e\u003cp\u003e注意,默认情况下,它只支持使用\u003ccode\u003eint\u003c/code\u003e作为键,其他类型是不合法的。\u003c/p\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 数据插入, 复杂度为 logn\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003einsert\u003c/span\u003e({key, value});\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap[key] = value;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 移除, 复杂度为 logn\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003eerase\u003c/span\u003e(key)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e// 搜索, 复杂度为 logn\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003efind\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap[key]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003ecount\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 返回匹配特定键的元素数量, 对数复杂度\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003econtains\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003eequal_range\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003elower_bound\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emap.\u003cspan class=\"built_in\"\u003eupper_bound\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"Set\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#Set\" class=\"headerlink\" title=\"Set\"\u003e\u003c/a\u003eSet\u003c/h3\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;set\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003eset 是一个关键字集合, 其中的关键字 不可重复, 其底层采用红黑树实现, 因此集合中的元素是 有序 的, 在 set 容器上进行的搜索, 插入和移除等操作都是\u003cstrong\u003e对数复杂度\u003c/strong\u003e的.\u003c/p\u003e\u003cp\u003e特有操作:\u003c/p\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003elower_bound\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 返回指向首个不小于给定键的元素的迭代器\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eupper_bound\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// 返回指向首个大于给定键的元素的迭代器\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eerase_if\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"Stack\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#Stack\" class=\"headerlink\" title=\"Stack\"\u003e\u003c/a\u003eStack\u003c/h3\u003e\u003cfigure class=\"highlight cpp\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stack\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003estack\u0026lt;\u003cspan class=\"type\"\u003eint\u003c/span\u003e\u0026gt; s;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003es.\u003cspan class=\"built_in\"\u003epush\u003c/span\u003e(data);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003es.\u003cspan class=\"built_in\"\u003epop\u003c/span\u003e();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003es.\u003cspan class=\"built_in\"\u003etop\u003c/span\u003e(); \u003cspan class=\"comment\"\u003e// get value of top\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003es.\u003cspan class=\"built_in\"\u003eempty\u003c/span\u003e() \u003cspan class=\"comment\"\u003e// judge whether stack is empty\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"Reference\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/#Reference\" class=\"headerlink\" title=\"Reference\"\u003e\u003c/a\u003eReference\u003c/h2\u003e\u003cul\u003e\u003cli\u003e\u003ca href=\"https://stackoverflow.com/questions/5293737/where-are-the-man-pages-for-c\"\u003eStackOverflow - Where are the man pages for C++? [closed]\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://forever97.top/2020/10/21/Re0-2/\"\u003eforever97\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://baike.baidu.com/item/apropos/15852795\"\u003e百度百科 - apropos\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/09/14/cpp-stl/"},{"title":"Arch Linux折腾笔记","time":"2023-09-05T13:39:57Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"安装\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%AE%89%E8%A3%85\" class=\"headerlink\" title=\"安装\"\u003e\u003c/a\u003e安装\u003c/h2\u003e\u003cp\u003e参考 Arch Wiki 或者参考这个简化版教程:\u003ca href=\"https://arch.icekylin.online/\"\u003ehttps://arch.icekylin.online/\u003c/a\u003e。过程按照教程一步步折腾就ok,只要注意区分清楚各个分区,别不小心把数据分区给格式化了就行。联网是安装Arch的必须项,所以请保持网络畅通。另外,建议\u003cstrong\u003e安装镜像最好在安装完成后继续保留着\u003c/strong\u003e,应急情况下(比如滚挂了)可以用\u003ccode\u003earch-chroot\u003c/code\u003e来应急重装内核之类的。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e至于Arch经常被吐槽滚挂了的原因,主要是源自Arch的更新策略比较激进,更新完成后,会直接删除老内核,比起一般的更新策略更容易出现依赖问题造成“滚挂了“。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e桌面环境、cn源、透明代理之类的配置,也可以参考上面的教程。关于透明代理,也可以参考\u003ca href=\"https://blog.linioi.com/posts/clash-on-arch/\"\u003e这篇文章\u003c/a\u003e。\u003c/p\u003e\u003ch2 id=\"美化\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E7%BE%8E%E5%8C%96\" class=\"headerlink\" title=\"美化\"\u003e\u003c/a\u003e美化\u003c/h2\u003e\u003cp\u003e这点上因人而异。我装了layan主题之后,再换个壁纸,装个latte就差不多了。我的原则是,美化差不多就行,但是前提是别影响到系统性能。\u003c/p\u003e\u003ch2 id=\"显示适配\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E6%98%BE%E7%A4%BA%E9%80%82%E9%85%8D\" class=\"headerlink\" title=\"显示适配\"\u003e\u003c/a\u003e显示适配\u003c/h2\u003e\u003cp\u003e单显示器的配置很简单,改下dpi缩放就基本ok。如果是多显示器的话,就会复杂一些。参考下面的公式:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 假设HiDPI显示器的分辨率是AxB,普通分辨率显示器的分辨率是CxD \u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 并且外置显示器的缩放比率是ExF\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003exrandr --output eDP-1 --auto --output HDMI-1 --auto --panning [C*E]x[D*F]+[A]+0 --scale [E]x[F] --right-of eDP-1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e根据上面的公式来设置,基本上能搞定。当然,如果想调整的是内置HiDPI显示器分辨率,就得调整最后\u003ccode\u003epanning\u003c/code\u003e的A为Ax[A的缩放比率]。\u003c/p\u003e\u003ch2 id=\"参考链接\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\" class=\"headerlink\" title=\"参考链接\"\u003e\u003c/a\u003e参考链接\u003c/h2\u003e\u003cul\u003e\u003cli\u003e[1] \u003ca href=\"https://nmgit.net/2020/139/\"\u003eBarry的笔记\u003c/a\u003e\u003c/li\u003e\u003cli\u003e[2] \u003ca href=\"https://harttle.land/2019/12/24/auto-xrandr.html\"\u003eX11 多显示器配置:玩转 XRandR\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"pacman入门\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#pacman%E5%85%A5%E9%97%A8\" class=\"headerlink\" title=\"pacman入门\"\u003e\u003c/a\u003epacman入门\u003c/h2\u003e\u003cp\u003e问了问GPT,大概做了下笔记如下:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo pacman -Sy \u003cspan class=\"comment\"\u003e# 更新软件包数据库\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -S package_name \u003cspan class=\"comment\"\u003e# 安装软件包,可批量安装\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -R package_name \u003cspan class=\"comment\"\u003e# 删除软件包但保留配置\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -Rn package_name \u003cspan class=\"comment\"\u003e# 删除包和配置\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -Syu \u003cspan class=\"comment\"\u003e# 升级所有已安装的包\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -Sc \u003cspan class=\"comment\"\u003e# 清理pacman缓存的旧包\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -Ss search_term \u003cspan class=\"comment\"\u003e# 查找软件包\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -Si package_name \u003cspan class=\"comment\"\u003e# 查找软件包信息\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -Rns $(pacman -Qdtq) \u003cspan class=\"comment\"\u003e# 删除未使用依赖包\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e另外,\u003ccode\u003eSyu\u003c/code\u003e和\u003ccode\u003eSyyu\u003c/code\u003e的区别在于后者强制刷新了软件仓库缓存。后者虽然更新比较及时,但是用得多对于软件源仓库并不友好,而且浪费资源,不宜过于频繁使用。\u003c/p\u003e\u003cp\u003e最底下那个移除孤儿包的操作少用,用的时候手动确认是否包括重要依赖。\u003c/p\u003e\u003cp\u003e另外还有个操作,就是完整备份安装过的包列表,然后在新的系统上重新安装,这个用\u003ccode\u003epacman\u003c/code\u003e可以做到。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003epacman -Qqe \u0026gt; installed_packages.txt \u003cspan class=\"comment\"\u003e# 备份当前系统上所有已经明确安装的包\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -S --needed - \u0026lt; installed_packages.txt \u003cspan class=\"comment\"\u003e# 只安装其中没有安装过的包\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e不过使用这个操作的时候,记得得保证清单的实时性,因为arch滚动更新,系统一直是新的,备份列表太久没更新的话在新系统上安装会有依赖,兼容等等问题。\u003c/p\u003e\u003ch2 id=\"启用外部ssh连接\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%90%AF%E7%94%A8%E5%A4%96%E9%83%A8ssh%E8%BF%9E%E6%8E%A5\" class=\"headerlink\" title=\"启用外部ssh连接\"\u003e\u003c/a\u003e启用外部ssh连接\u003c/h2\u003e\u003cp\u003e如果想从外部连接到Arch的电脑上,只要安装了openssh就行。Arch默认不会启动\u003ccode\u003esshd\u003c/code\u003e,所以我们得手动开启:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esystemctl start sshd\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"在命令行连接Wi-Fi\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%9C%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%BF%9E%E6%8E%A5Wi-Fi\" class=\"headerlink\" title=\"在命令行连接Wi-Fi\"\u003e\u003c/a\u003e在命令行连接Wi-Fi\u003c/h2\u003e\u003cp\u003e在完成安装后,启动NetworkManager:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo systemctl \u003cspan class=\"built_in\"\u003eenable\u003c/span\u003e --now NetworkManager\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后使用\u003ccode\u003enmcli\u003c/code\u003e来连接Wi-Fi:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003enmcli dev wifi list\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 后面的password部分不指定的话,会自动要求输入\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003enmcli dev wifi connect \u003cspan class=\"string\"\u003e\u0026#34;SSID\u0026#34;\u003c/span\u003e password \u003cspan class=\"string\"\u003e\u0026#34;password\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"使用TimeShift备份系统\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E4%BD%BF%E7%94%A8TimeShift%E5%A4%87%E4%BB%BD%E7%B3%BB%E7%BB%9F\" class=\"headerlink\" title=\"使用TimeShift备份系统\"\u003e\u003c/a\u003e使用TimeShift备份系统\u003c/h2\u003e\u003cp\u003eTimeShift是一个很好用的系统备份软件,特别是结合了btrfs之后,备份的体积比借助\u003ccode\u003ersync\u003c/code\u003e时更小。\u003c/p\u003e\u003cp\u003e折腾系统时不时可能滚挂,这种时候有个定期创建的映像就很有用了。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo timeshift --list \u003cspan class=\"comment\"\u003e# 获取快照列表\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo timeshift --restore --snapshot \u003cspan class=\"string\"\u003e\u0026#39;20XX-XX-XX_XX-XX-XX\u0026#39;\u003c/span\u003e --skip-grub \u003cspan class=\"comment\"\u003e# 选择一个快照进行还原,并跳过 GRUB 安装,一般来说 GRUB 不需要重新安装\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e如果恢复后无法使用,用安装盘通过\u003ccode\u003earch-chroot\u003c/code\u003e进去系统,然后手动更改\u003ccode\u003esubvolid\u003c/code\u003e来手动修复,或者直接删除\u003ccode\u003esubvolid\u003c/code\u003e:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 获取subvolid\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo btrfs sub list -u /\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 编辑,根据自己情况,修复\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evim /etc/fstab\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"重启显示管理器(Xorg-x2F-Wayland)\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E9%87%8D%E5%90%AF%E6%98%BE%E7%A4%BA%E7%AE%A1%E7%90%86%E5%99%A8%EF%BC%88Xorg-x2F-Wayland%EF%BC%89\" class=\"headerlink\" title=\"重启显示管理器(Xorg/Wayland)\"\u003e\u003c/a\u003e重启显示管理器(Xorg/Wayland)\u003c/h2\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo systemctl restart display-manager\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"Vim\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#Vim\" class=\"headerlink\" title=\"Vim\"\u003e\u003c/a\u003eVim\u003c/h2\u003e\u003cp\u003e装上Arch之后我很快就把Vim装上了。结果发现没法和系统剪贴板联动。在Vim里边检查\u003ccode\u003ehas(clipboard)\u003c/code\u003e之后发现,好像这个Vim不支持剪贴板。\u003c/p\u003e\u003cp\u003e解决方法:装\u003ccode\u003egvim\u003c/code\u003e:\u003ccode\u003esudo pacman -S gvim\u003c/code\u003e。会提示你是否卸载Vim,选是,配置不会删除所以放心删。安装完了之后你就会发现Vim还能用,而且剪贴板功能好了:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://mxts.jiujiuer.xyz/img/Pasted%20image%2020230926210217.png\"/\u003e\u003c/p\u003e\u003ch2 id=\"桌面目录映射\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E6%A1%8C%E9%9D%A2%E7%9B%AE%E5%BD%95%E6%98%A0%E5%B0%84\" class=\"headerlink\" title=\"桌面目录映射\"\u003e\u003c/a\u003e桌面目录映射\u003c/h2\u003e\u003cp\u003e今天看到群里一个老哥家目录下的文件都堆到桌面了,顺便了解了一下关于桌面目录映射的问题。因为有时候中文模式创建的家目录下的文件夹都是中文,那个老哥就是改成英文目录的时候遇到了这个问题。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eXDG_DESKTOP_DIR\u003c/code\u003e这个环境变量的介绍,在archWiki上也能翻到。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://wiki.archlinux.org/title/XDG_Base_Directory\"\u003eXDG_DESKTOP_DIR是一个环境变量,用于指定用户的桌面文件夹的位置。它是XDG Base Directory规范\u003c/a\u003e\u003ca href=\"https://wiki.archlinux.org/title/XDG_Base_Directory\"\u003e1\u003c/a\u003e\u003ca href=\"https://wiki.archlinux.org/title/XDG_user_directories\"\u003e的一部分,该规范定义了一些标准的用户目录,如音乐、图片、下载等,以及一些用于存储配置、缓存、数据和状态的目录。XDG_DESKTOP_DIR的默认值是$HOME/Desktop,但用户可以通过编辑~/.config/user-dirs.dirs文件或使用xdg-user-dirs-update命令来修改它\u003c/a\u003e\u003ca href=\"https://wiki.archlinux.org/title/XDG_user_directories\"\u003e2\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://wiki.archlinux.org/title/Desktop_entries\"\u003eKDE桌面环境遵循XDG Base Directory规范,并使用XDG_DESKTOP_DIR变量来确定桌面文件夹的位置。如果用户更改了XDG_DESKTOP_DIR的值,KDE会自动更新桌面设置,并将桌面文件夹更改为新的位置。这样,用户可以灵活地管理自己的桌面文件夹,而不影响其他应用程序或桌面环境\u003c/a\u003e\u003ca href=\"https://wiki.archlinux.org/title/Desktop_entries\"\u003e3\u003c/a\u003e。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e所以出问题的话看看\u003ccode\u003e.config\u003c/code\u003e底下配置炸没炸就行。\u003c/p\u003e\u003ch2 id=\"添加多系统启动项\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E6%B7%BB%E5%8A%A0%E5%A4%9A%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8%E9%A1%B9\" class=\"headerlink\" title=\"添加多系统启动项\"\u003e\u003c/a\u003e添加多系统启动项\u003c/h2\u003e\u003cp\u003e在安装Arch的时候,会发现中间有一步是\u003ccode\u003esudo vim /etc/default/grub\u003c/code\u003e然后\u003ccode\u003egrub-mkconfig -o /boot/grub/grub.cfg\u003c/code\u003e。这一步就是先编辑grub的配置,然后生成grub文件到\u003ccode\u003e/boot/grub/\u003c/code\u003e下的配置文件中。因此,我们如果突然心血来潮想装个Windows玩玩\u003cdel\u003e谁装啊\u003c/del\u003e,就可以改改grub配置让它为我们添加启动项。\u003c/p\u003e\u003cp\u003e因为最终的配置项是由\u003ccode\u003egrub-mkconfig\u003c/code\u003e生成的,所以并不推荐直接修改这个文件。更好的做法是安装\u003ccode\u003eos-prober\u003c/code\u003e,然后挂载其他系统的分区,并编辑grub配置文件启用os探测,最后再用\u003ccode\u003egrub-mkconfig\u003c/code\u003e生成新的grub启动项文件。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e至于为啥grub现在默认禁用掉了os-prober,注释里边说的是因为安全问题所以禁用掉了。\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"代理配置\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE\" class=\"headerlink\" title=\"代理配置\"\u003e\u003c/a\u003e代理配置\u003c/h2\u003e\u003cp\u003e既然都上Arch了,那代理软件不得整个自由点的?直接扔了cfw,拥抱clash-core。具体配置教程参考\u003ca href=\"https://blog.linioi.com/posts/clash-on-arch/\"\u003e这篇\u003c/a\u003e,我给个简洁版的:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e27\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e28\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e29\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e30\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e31\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e32\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e33\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e34\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e35\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e36\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e37\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e38\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e39\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e40\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 实在懒得sudo了\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 不过记得看清命令再回车\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo su\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epacman -S clash\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emkdir\u003c/span\u003e -p /etc/clash\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 然后从provider那里下载yaml配置文件\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 假设文件名为config.yaml\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emv\u003c/span\u003e ./config.yaml /etc/clash/\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 设置控制面板路径\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 我这里的控制面板路径在/etc/clash/clash-dashboard\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#39;external-ui: clash-dashboard\u0026#39;\u003c/span\u003e \u0026gt;\u0026gt; /etc/clash/config.yaml\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 配置环境变量,配完了记得重启/重新登陆一下\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e \u0026lt;\u0026lt; \u003cspan class=\"string\"\u003eEOF \u0026gt;\u0026gt; /etc/environment\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003ehttps_proxy=http://127.0.0.1:7890\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003ehttp_proxy=http://127.0.0.1:7890\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eall_proxy=http://127.0.0.1:7890\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 配置systemd服务项\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 配完了就能开机自启动了哦\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e \u0026lt;\u0026lt; \u003cspan class=\"string\"\u003eEOF \u0026gt; /etc/systemd/system/clash.service\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e[Unit]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDescription=Clash daemon, A rule-based proxy in Go.\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eAfter=network.target\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e[Service]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eType=simple\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eRestart=always\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eExecStart=/usr/bin/clash -d /etc/clash # /usr/bin/clash 为绝对路径,请根据你实际情况修改\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e[Install]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eWantedBy=multi-user.target\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e###############\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# clash,启动!\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e###############\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esystemctl \u003cspan class=\"built_in\"\u003eenable\u003c/span\u003e --now clash.service\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e里边比较重要的一步是配置环境变量env,上回配置的时候忘了加\u003ccode\u003ehttp\u003c/code\u003e前缀,结果系统里边啥玩意都不认我的代理设置。\u003c/p\u003e\u003cp\u003e哦对,配置完成之后还得在系统里边设置好代理:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://mxts.jiujiuer.xyz/img/Pasted%20image%2020231023164736.png\"/\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e悲:cfw跑路之后clash-core也跑路了\u003cbr/\u003e然后所有client都跑路了\u003cbr/\u003e为clash家族 + 1s\u003cbr/\u003e以及我的评价是:\u003cbr/\u003e\u003cimg src=\"https://mxts.jiujiuer.xyz/img/Pasted%20image%2020231103203831.png\"/\u003e\u003cbr/\u003e以及某作者的睿频:\u003cbr/\u003e最适合这个民族的其实是一群小\u003cbr/\u003e白围着大大转,大大通过小白的夸奖获得自我满足,然后小白的吃喝拉撒都包给大大解决的模式。通过这个项目我感觉我已经彻底认识到这个民族的前面为什么会有一堵墙了。没有墙哪来的大大。所以到处都是什么附件回帖可见,等级多少用户组可见,一个论坛一个大大供小白跪舔,不需要政府造墙,网民也会自发造墙。这尼玛连做个翻墙软件都要造墙,真是令人叹为观止。这是一个造了几干年墙的保守的农耕民族,缺乏对别人的基本尊重,不愿意分享,喜欢遮遮掩掩,喜欢小圈子抱团,大概这些传统是改不掉了吧。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e另外还有一个,就是切换节点必须得使用clash的控制端口(在\u003ccode\u003econfig.yaml\u003c/code\u003e中给出,一般是\u003ccode\u003e9090\u003c/code\u003e),所以还必须得有个控制面板。一般Windows平台都是用\u003cdel\u003e已经似了的\u003c/del\u003eClash For Windows作为控制面板的,而Linux这边使用\u003ca href=\"https://clash.razord.top/\"\u003ehttps://clash.razord.top/\u003c/a\u003e也就是\u003cdel\u003e也已经似了的\u003c/del\u003e\u003ca href=\"https://github.com/Dreamacro/clash-dashboard/\"\u003eClash的官方控制面板\u003c/a\u003e作为控制面板的。实在不行了可以用命令行下的TUI工具\u003ccode\u003eclashctl\u003c/code\u003e来手动切换节点,应该也能用。\u003c/p\u003e\u003ch2 id=\"RDP连接Windows\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#RDP%E8%BF%9E%E6%8E%A5Windows\" class=\"headerlink\" title=\"RDP连接Windows\"\u003e\u003c/a\u003eRDP连接Windows\u003c/h2\u003e\u003cp\u003e用Arch多了,有时候得偶尔远程一下Windows。配置了半天\u003ccode\u003eRemmina\u003c/code\u003e+\u003ccode\u003efreerdp\u003c/code\u003e,可能这玩意和我风水不合吧,半天跑不起来。遂尝试了下\u003ccode\u003erdesktop\u003c/code\u003e,秒连(也不知道为啥):\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo pacman -S rdesktop\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003erdesktop 114.5.1.4\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后输账号密码登陆就行了。因为暂时这样就够用所以就没咋折腾。\u003c/p\u003e\u003ch2 id=\"X11迁移Wayland\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#X11%E8%BF%81%E7%A7%BBWayland\" class=\"headerlink\" title=\"X11迁移Wayland\"\u003e\u003c/a\u003eX11迁移Wayland\u003c/h2\u003e\u003cp\u003e主要动机:支持一下双屏不同缩放的功能,不然一个高分屏+一个普通1080p的组合太痛苦了。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003epacman -Qi wayland \u003cspan class=\"comment\"\u003e# 已安装则继续,否则安装\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo pacman -S --needed wayland\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eyay -S sddm-git \u003cspan class=\"comment\"\u003e# 必须得是sddm-git,其他版本好像没完善的Wayland支持\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epacman -S --needed xorg-xwayland xorg-xlsclients qt5-wayland glfw-wayland\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epacman -S --needed plasma kde-applications\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epacman -S --needed plasma-wayland-session\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e按照\u003ca href=\"https://linux.cn/article-16171-1.html\"\u003e这里\u003c/a\u003e给出的流程,装完上面的包之后,Logout之后应该就能在左下角看到登陆\u003ccode\u003ePlasma(Wayland)\u003c/code\u003e的提示了。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e你还能通过查看 \u003ccode\u003e$XDG_SESSION_TYPE\u003c/code\u003e 变量来 核实你是否在运行 \u003ccode\u003eWayland\u003c/code\u003e。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e先去装了,一会回来记录。\u003c/p\u003e\u003cp\u003e装完了,兼容性没啥大问题,我甚至没重启,只是重新登陆了下。就是\u003ccode\u003elatte-dock\u003c/code\u003e的图标缩放看着怪怪的,而且桌面小组件也乱飞了。以及,输入法好像不太对劲,在firefox以外的地方皮肤会丢失。\u003c/p\u003e\u003cp\u003e刚重新设置了下屏幕排列,现在能单独设置两块屏幕的缩放了,爽。就是高分屏看着有点糊,以及字体缩放问题,还有这个fcitx也不太对劲。\u003c/p\u003e\u003cp\u003e关于fcitx,系统给了一段报错:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eFcitx should be launched by KWin under KDE Wayland in order to use Wayland input method frontend. This can improve the experience when using Fcitx on Wayland. To configure this, you need to go to \u0026#34;System Settings\u0026#34; -\u0026gt; \u0026#34;Virtual keyboard\u0026#34; and select \u0026#34;Fcitx 5\u0026#34; from it. You may also need to disable tools that launches input method, such as imsettings on Fedora, or im-config on Debian/Ubuntu. For more details see https://fcitx-im.org/wiki/Using_Fcitx_5_on_Wayland#KDE_Plasma \u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e先重启下看看吧。\u003c/p\u003e\u003cp\u003e草了,重启回来变回x11 seession了。找找默认值在哪保存着吧。\u003c/p\u003e\u003cp\u003e找到了,在\u003ccode\u003e/usr/lib/sddm/sddm.conf.d/default.conf\u003c/code\u003e里边,有一个\u003ccode\u003eDisplayServer=x11\u003c/code\u003e的项,把\u003ccode\u003ex11\u003c/code\u003e改为\u003ccode\u003ewayland\u003c/code\u003e应该就行了。重启看看。\u003c/p\u003e\u003cp\u003e好像不太行,而且现在切不过去Wayland了,坏。\u003c/p\u003e\u003cp\u003e把设置都改回去了,现在好像能进去了。但是还是默认进入x11的plasma桌面。\u003c/p\u003e\u003cp\u003e哎,把用户空间的那个sddm configuration改了一下,删了里边的[Autologin]底下的session=的值,重启下试试。以及又得到了一段关于fcitx的建议:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eDetect GTK_IM_MODULE and QT_IM_MODULE being set and Wayland Input method frontend is working. It is recommended to unset GTK_IM_MODULE and QT_IM_MODULE and use Wayland input method frontend instead. For more details see https://fcitx-im.org/wiki/Using_Fcitx_5_on_Wayland#KDE_Plasma\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e好好好搞定了。按照上面的设置先屏蔽了俩环境变量,然后删除了默认值,现在系统已经处于完全可用的状态。回头有时间了整理整理过程。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eFri 22 Dec 2023 05:14:55 PM CST\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e编辑:这个选项不用在命令行里修改,直接去系统设置里边的\u003ccode\u003eStartup nad shutdown-\u0026gt;Login Screen-\u0026gt;Behavior\u003c/code\u003e里边修改\u003ccode\u003e...with session = \u003c/code\u003e的选项就行了。\u003c/p\u003e\u003ch2 id=\"又出问题了\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%8F%88%E5%87%BA%E9%97%AE%E9%A2%98%E4%BA%86\" class=\"headerlink\" title=\"又出问题了\"\u003e\u003c/a\u003e又出问题了\u003c/h2\u003e\u003cp\u003e小笔记本上的arch的kde以至于其中的所有程序突然都变得特别卡。最奇怪的是这会的系统资源专用状况完全没有多高,CPU%,MEM37.4%的占用率应该很健康了吧。\u003c/p\u003e\u003cp\u003e觉得的卡顿是因为我发现就连tmux里边开个vim写文档都卡得不行了才觉得不对劲。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e27\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e28\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e29\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e30\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e31\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e32\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e33\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e34\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e35\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e36\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e37\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e38\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e39\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e41\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e42\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e43\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e44\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e45\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e46\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e47\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e48\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e49\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e50\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e51\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e52\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e53\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e54\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e55\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e56\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e57\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e58\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esystemd-+-NetworkManager\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-bluetoothd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-clash\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-dbus-daemon\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-polkitd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-rtkit-daemon\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-sddm-+-Xorg\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | `-sddm-helper---startplasma-x11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-systemd-+-(sd-pam)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-adb\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-agent\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-at-spi-bus-laun---dbus-daemon\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-at-spi2-registr\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-chrome_crashpad\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-dbus-daemon\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-dconf-service\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-fcitx5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-gmenudbusmenupr\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-gvfs-udisks2-vo\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-gvfsd-+-gvfsd-dnssd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | | |-gvfsd-network\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | | `-gvfsd-trash\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-gvfsd-fuse\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-gvfsd-metadata\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-kaccess\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-kactivitymanage\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-kded5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-kglobalaccel5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-konsole---bash---tmux: client\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-krunner---qq-+-qq---qq\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | | |-qq---2*[qq]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | | `-qq\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-kscreen_backend\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-ksmserver---DiscoverNotifie\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-ksystemstats\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-kwalletd5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-kwin_x11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-latte-dock\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-linuxqq\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-obexd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-org_kde_powerde\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-pipewire\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-pipewire-media-\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-plasmashell---crow\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-polkit-kde-auth\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-pulseaudio---gsettings-helpe\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-tmux: server-+-2*[bash---vim]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | | `-bash---sudo---sudo---pstree\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-2*[xdg-desktop-por]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-xdg-document-po---fusermount3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | |-xdg-permission-\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e | `-xembedsniproxy\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-systemd-journal\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-systemd-logind\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-systemd-udevd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-udisksd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e |-upowerd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e `-wpa_supplicant\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面是\u003ccode\u003esudo pstree -T\u003c/code\u003e的输出,感觉这种卡顿可能就是de内存溢出了。理论上我感觉只要重启一下sddm马上就能变流畅。但是在这之前我想知道更详细的信息。\u003c/p\u003e\u003cp\u003e先把qq关了试试。不出所料还是很卡。上google搜一下吧。\u003c/p\u003e\u003cp\u003e草了,看到一个哥们系统偶尔卡顿最后发现是SSD挂掉的前兆。想起来这个本子用的是三星的老固态,系统盘的文件系统是btrfs;前几天还看群里某群u吐槽说btrfs在他那边对于固态寿命损伤挺严重的。也不知道是不是btrfs的问题。不过好在重要数据都有备份,丢了也不心疼,全从服务器上sync下来就行了。\u003c/p\u003e\u003cp\u003e不过应该这次不是固态的问题,应该还是sddm本身的问题,不然很难解释怎么所有gui里边的东西都开始卡顿了\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e27\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e28\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e29\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e30\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e31\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e32\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e33\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e34\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e35\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e36\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e37\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e38\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e39\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e41\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e42\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e43\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e44\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e45\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e46\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e47\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e48\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e49\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e50\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e51\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e52\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e53\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e54\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e55\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e56\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e57\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e58\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e59\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e60\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e61\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e62\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e63\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e64\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e65\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e66\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e67\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e68\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e69\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e70\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e71\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e72\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e73\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e74\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e75\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e76\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e77\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e78\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e79\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e80\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e81\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e82\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e83\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e84\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e85\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e86\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e87\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e88\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e89\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e90\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e91\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eTIME PID UID GID SIG COREFILE EXE SIZE\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-10-29 23:52:21 CST 2030 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eThu 2023-11-02 13:07:56 CST 3084 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eThu 2023-11-02 17:15:49 CST 36261 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eThu 2023-11-02 23:44:53 CST 1795 1000 1000 SIGTRAP missing /tmp/.mount_linuxqFrCYKS/qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-04 18:43:36 CST 1640 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-04 18:45:41 CST 2255 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-04 18:46:34 CST 2300 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-11-05 18:16:28 CST 19274 1000 1000 SIGABRT missing /opt/vscodium-bin/codium -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-11-05 18:16:30 CST 19330 1000 1000 SIGABRT missing /opt/vscodium-bin/codium -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-11-05 22:13:13 CST 14279 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eThu 2023-11-09 23:30:51 CST 14724 1000 1000 SIGTRAP missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eThu 2023-11-09 23:38:16 CST 15804 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eFri 2023-11-10 01:08:53 CST 14773 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-14 09:04:45 CST 5996 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-14 09:47:58 CST 10033 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-14 10:15:41 CST 75599 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-14 10:30:25 CST 13990 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-14 17:47:23 CST 575 1000 1000 SIGABRT missing /usr/bin/plasmashell -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-14 21:00:24 CST 18347 1000 1000 SIGABRT missing /usr/bin/plasmashell -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-11-15 00:34:08 CST 26489 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-11-15 01:14:11 CST 28479 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-11-15 11:34:37 CST 19955 1000 1000 SIGSEGV missing /usr/bin/plasmashell -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-11-15 23:54:02 CST 36282 1000 1000 SIGSEGV missing /opt/visual-studio-code/code -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eFri 2023-11-17 00:45:55 CST 16467 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eFri 2023-11-17 00:45:56 CST 40168 1000 1000 SIGTRAP missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:06 CST 17969 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:06 CST 15257 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:06 CST 17286 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:56 CST 19088 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:56 CST 19770 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:56 CST 18906 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:56 CST 19731 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:56 CST 19689 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:12:57 CST 19591 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:13:10 CST 25066 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:13:11 CST 25053 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:13:11 CST 20320 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:13:11 CST 24308 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:13:13 CST 25240 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:13:13 CST 25205 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 01:13:14 CST 25646 1000 1000 SIGABRT missing /usr/bin/ccze -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 22:14:12 CST 576 1000 1000 SIGABRT missing /usr/bin/plasmashell -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-18 23:37:15 CST 2175 1000 1000 SIGABRT missing /usr/bin/plasmashell -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-11-19 12:59:47 CST 4430 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-11-19 13:00:33 CST 4459 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-11-19 13:00:34 CST 4469 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-11-19 13:06:05 CST 5821 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-11-20 20:53:13 CST 588 1000 1000 SIGSEGV missing /usr/bin/plasmashell -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-11-20 20:56:33 CST 6077 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-11-20 22:56:05 CST 5427 1000 1000 SIGABRT missing /usr/bin/plasmashell -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-11-20 22:59:54 CST 18385 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-21 23:30:23 CST 12137 1000 1000 SIGBUS missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-21 23:30:25 CST 12093 1000 1000 SIGBUS missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-21 23:30:26 CST 17572 1000 1000 SIGBUS missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-21 23:30:26 CST 12015 1000 1000 SIGBUS missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-21 23:30:26 CST 12016 1000 1000 SIGBUS missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-21 23:30:27 CST 12459 1000 1000 SIGBUS missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-21 23:30:27 CST 12003 1000 1000 SIGBUS missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-21 23:30:28 CST 12043 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eFri 2023-11-24 00:01:53 CST 14600 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-11-25 02:40:58 CST 32138 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-11-28 23:33:11 CST 41077 1000 1000 SIGTRAP missing /qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-11-29 11:43:44 CST 43973 1000 1000 SIGABRT missing /usr/bin/adb -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-11-29 11:44:06 CST 45189 1000 1000 SIGABRT missing /usr/bin/adb -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-11-29 23:29:56 CST 53151 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-11-29 23:45:58 CST 55228 1000 1000 SIGSEGV missing /opt/visual-studio-code/code -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eThu 2023-11-30 00:13:43 CST 42637 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-12-02 01:12:16 CST 56991 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 10:28:09 CST 77126 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 15:18:23 CST 99034 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 15:19:05 CST 99068 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 15:20:45 CST 99231 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 15:54:13 CST 104472 1000 1000 SIGSEGV missing /home/xeonds/code/pizip/pi -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 15:54:45 CST 104495 1000 1000 SIGSEGV missing /home/xeonds/code/pizip/pi -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 15:55:06 CST 104521 1000 1000 SIGSEGV missing /home/xeonds/code/pizip/pi -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 15:55:36 CST 104541 1000 1000 SIGSEGV missing /home/xeonds/code/pizip/pi -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 17:28:20 CST 104920 1000 1000 SIGBUS missing /chrome_crashpad_handler -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-04 23:36:35 CST 119295 1000 1000 SIGSEGV missing /opt/visual-studio-code/code -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-12-06 11:18:53 CST 16426 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-11 19:56:40 CST 97572 1000 1000 SIGTRAP missing /tmp/.mount_linuxqSV6RFp/qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-12-12 01:01:33 CST 123670 1000 1000 SIGTRAP missing /opt/visual-studio-code/code -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eFri 2023-12-15 14:50:41 CST 17039 1000 1000 SIGTRAP missing /tmp/.mount_linuxqkQn53G/qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSat 2023-12-16 23:55:13 CST 19892 1000 1000 SIGTRAP missing /opt/visual-studio-code/code -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-18 13:16:16 CST 28074 0 0 SIGABRT none /usr/bin/fcitx5-remote -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-18 15:08:22 CST 41701 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-12-19 21:37:06 CST 17530 1000 1000 SIGFPE missing /home/xeonds/code/c4/a.out -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eTue 2023-12-19 23:39:47 CST 20684 1000 1000 SIGTRAP missing /tmp/.mount_linuxqllS3Xz/qq -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWed 2023-12-20 12:31:27 CST 23806 1000 1000 SIGABRT missing /usr/bin/clashctl -\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSun 2023-12-24 19:26:26 CST 5873 1000 1000 SIGTRAP present /qq 1.6M\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMon 2023-12-25 01:59:52 CST 5951 1000 1000 SIGBUS present /chrome_crashpad_handler 42.5K\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面是\u003ccode\u003ecoredumpctl\u003c/code\u003e的输出。好像sddm还没崩溃呢。再看看journal:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e27\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e28\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e29\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e30\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e31\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e32\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e33\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e34\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e35\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e36\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e37\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e38\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e39\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e40\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze systemd[1]: Started Simple Desktop Display Manager.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e░░ Subject: A start job \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e unit sddm.service has finished successfully\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e░░ Defined-By: systemd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e░░ \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e░░ A start job \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e unit sddm.service has finished successfully.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e░░ \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e░░ The job identifier is 108.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Initializing...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Starting...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Logind interface found\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Adding new display...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Loaded empty theme configuration\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Xauthority path: \u003cspan class=\"string\"\u003e\u0026#34;/run/sddm/xauth_bDCTVn\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Using VT 2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Display server starting...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Writing cookie to \u003cspan class=\"string\"\u003e\u0026#34;/run/sddm/xauth_bDCTVn\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:08 ark-station-breeze sddm[407]: Running: /usr/bin/X -dpi 120 -background none -seat seat0 vt2 -auth /run/sddm/xauth_bDCTVn -noreset -displayfd 16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm[407]: Setting default cursor\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm[407]: Running display setup script \u003cspan class=\"string\"\u003e\u0026#34;/usr/share/sddm/scripts/Xsetup\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm[407]: Display server started.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm[407]: Reading from \u003cspan class=\"string\"\u003e\u0026#34;/usr/local/share/xsessions/plasma.desktop\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm[407]: Reading from \u003cspan class=\"string\"\u003e\u0026#34;/usr/share/xsessions/plasma.desktop\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm[407]: Session \u003cspan class=\"string\"\u003e\u0026#34;/usr/share/xsessions/plasma.desktop\u0026#34;\u003c/span\u003e selected, \u003cspan class=\"built_in\"\u003ecommand\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#34;/usr/bin/startplasma-x11\u0026#34;\u003c/span\u003e \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e VT 2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: [PAM] Starting...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: [PAM] Authenticating...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: pam_kwallet5(sddm-autologin:auth): pam_kwallet5: pam_sm_authenticate\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: [PAM] Preparing to converse...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: pam_kwallet5(sddm-autologin:auth): pam_kwallet5: Couldn\u003cspan class=\"string\"\u003e\u0026#39;t get password (it is empty)\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: [PAM] Conversation with 1 messages\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: pam_kwallet5(sddm-autologin:auth): pam_kwallet5: Empty or missing password, doing nothing\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: [PAM] returning.\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:09 ark-station-breeze sddm[407]: Authentication for user \u0026#34;xeonds\u0026#34; successful\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: pam_kwallet5(sddm-autologin:setcred): pam_kwallet5: pam_sm_setcred\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:09 ark-station-breeze sddm-helper[433]: pam_unix(sddm-autologin:session): session opened for user xeonds(uid=1000) by xeonds(uid=0)\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:10 ark-station-breeze sddm-helper[433]: pam_kwallet5(sddm-autologin:session): pam_kwallet5: pam_sm_open_session\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:10 ark-station-breeze sddm-helper[433]: pam_kwallet5(sddm-autologin:session): pam_kwallet5: open_session called without kwallet5_key\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:10 ark-station-breeze sddm-helper[433]: Writing cookie to \u0026#34;/tmp/xauth_XpVcsc\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:10 ark-station-breeze sddm-helper[433]: Starting X11 session: \u0026#34;\u0026#34; \u0026#34;/usr/share/sddm/scripts/Xsession \\\u0026#34;/usr/bin/startplasma-x11\\\u0026#34;\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eDec 24 02:28:10 ark-station-breeze sddm[407]: Session started true\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e哦还有xorg的:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e-- No entries --\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e好吧空的。那看看top\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[?1h=[?25l[H[J[mtop - 15:10:25 up 1 day, 12:42, 1 user, load average: 1.40, 1.33, 1.29[m[39;49m[m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e任务:[m[39;49m[1m 204 [m[39;49mtotal,[m[39;49m[1m 3 [m[39;49mrunning,[m[39;49m[1m 201 [m[39;49msleeping,[m[39;49m[1m 0 [m[39;49mstopped,[m[39;49m[1m 0 [m[39;49mzombie[m[39;49m[m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e%Cpu(s):[m[39;49m[1m 28.6 [m[39;49mus,[m[39;49m[1m 0.0 [m[39;49msy,[m[39;49m[1m 0.0 [m[39;49mni,[m[39;49m[1m 71.4 [m[39;49mid,[m[39;49m[1m 0.0 [m[39;49mwa,[m[39;49m[1m 0.0 [m[39;49mhi,[m[39;49m[1m 0.0 [m[39;49msi,[m[39;49m[1m 0.0 [m[39;49mst[m[39;49m[m [m[39;49m[m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMiB Mem :[m[39;49m[1m 7835.3 [m[39;49mtotal,[m[39;49m[1m 584.1 [m[39;49mfree,[m[39;49m[1m 3807.3 [m[39;49mused,[m[39;49m[1m 4760.9 [m[39;49mbuff/cache[m[39;49m[m [m[39;49m[m [m[39;49m[m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMiB Swap:[m[39;49m[1m 0.0 [m[39;49mtotal,[m[39;49m[1m 0.0 [m[39;49mfree,[m[39;49m[1m 0.0 [m[39;49mused.[m[39;49m[1m 4028.0 [m[39;49mavail Mem [m[39;49m[m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[7m 进程号 USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m[1m 411 root 20 0 859280 87628 30916 R 90.9 1.1 248:56.68 Xorg [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m[1m 19316 xeonds 20 0 4028616 892492 271492 R 72.7 11.1 0:17.50 firefox [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 19461 xeonds 20 0 2713128 171852 88252 S 18.2 2.1 0:06.27 WebExte+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m[1m 19901 xeonds 20 0 15440 5760 3584 R 9.1 0.1 0:00.01 top [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 1 root 20 0 22220 10228 7028 S 0.0 0.1 0:02.61 systemd [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pool_wo+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 5 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 7 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 9 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 12 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 14 root 20 0 0 0 0 I 0.0 0.0 0:00.00 rcu_tas+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 15 root 20 0 0 0 0 I 0.0 0.0 0:00.00 rcu_tas+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 16 root 20 0 0 0 0 I 0.0 0.0 0:00.00 rcu_tas+ [m[39;49m[K\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[m 17 root 20 0 0 0 0 S 0.0 0.0 0:30.95 ksoftir+ [m[39;49m[K[?1l\u0026gt;[25;1H\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[34h[?25h[K\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e抽象是抽象了点,但是能看出来好像是Xorg在发电,试试去tty重启xorg看看。\u003c/p\u003e\u003cp\u003e最后发现Xorg是sddm启动的,没办法直接重启了下sddm,问题解决,但是最不爽的是不知道问题到底是咋解决的。\u003c/p\u003e\u003cp\u003e找到一个博客,发现好像不是xorg的问题,而是kwin的问题:暂停恢复合成时,会导致kwin卡顿,这时候重启一下kwin_x11就行了。\u003c/p\u003e\u003cp\u003e这就好说了:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esystemctl --user restart plasma-kwin_x11\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e或者这个\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esetsid kwin_x11 --replace \u0026amp;\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cblockquote\u003e\u003cp\u003eref:\u003ca href=\"https://www.glowmem.com/archives/archlinux-note#toc-head-7\"\u003e律回彼境\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e试了试,问题完美解决,CPU占用也正常了。\u003c/p\u003e\u003cp\u003e 参考:\u003ca href=\"https://blog.mynook.info/post/kde-gui-sluggish-workaround/\"\u003eKDE解决GUI界面卡顿的问题\u003c/a\u003e\u003c/p\u003e\u003ch2 id=\"组合键\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E7%BB%84%E5%90%88%E9%94%AE\" class=\"headerlink\" title=\"组合键\"\u003e\u003c/a\u003e组合键\u003c/h2\u003e\u003cp\u003e其实主要是KDE Plasma的相关组合键。偶尔会意外发现一些组合键,就记录在这里了。\u003c/p\u003e\u003cul\u003e\u003cli\u003e切换桌面:\u003ccode\u003ectrl+F*\u003c/code\u003e\u003c/li\u003e\u003cli\u003e无极缩放:\u003ccode\u003ewin+ctrl\u003c/code\u003e+鼠标滚轮,真的好丝滑QAQ\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"莫得休眠Hibernate选项\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E8%8E%AB%E5%BE%97%E4%BC%91%E7%9C%A0Hibernate%E9%80%89%E9%A1%B9\" class=\"headerlink\" title=\"莫得休眠Hibernate选项\"\u003e\u003c/a\u003e莫得休眠Hibernate选项\u003c/h2\u003e\u003cp\u003e找了半天发现是系统安装的时候没设置swap交换分区。不过暂时默认的睡眠也够用了,之后再考虑吧。\u003c/p\u003e\u003ch2 id=\"备份\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%A4%87%E4%BB%BD\" class=\"headerlink\" title=\"备份\"\u003e\u003c/a\u003e备份\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003eref:\u003ca href=\"https://sspai.com/post/78916\"\u003e现代化的 Archlinux 安装,Btrfs、快照、休眠以及更多。\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e其一就是软件列表备份。\u003ccode\u003epacman -Qe \u0026gt;\u0026gt; installed.txt\u003c/code\u003e就可以备份已安装软件列表\u003c/p\u003e\u003cp\u003e其二就是备份根目录数据。其中的\u003ccode\u003e-avrh\u003c/code\u003e用于保留文件权限。以及似乎必须得注意路径末尾的斜杠问题,rsync好像会区分这两个路径。\u003ccode\u003esudo rsync -avrh --progress /home/ /mnt/backup/\u003c/code\u003e\u003c/p\u003e\u003ch2 id=\"关机等待时间\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%85%B3%E6%9C%BA%E7%AD%89%E5%BE%85%E6%97%B6%E9%97%B4\" class=\"headerlink\" title=\"关机等待时间\"\u003e\u003c/a\u003e关机等待时间\u003c/h2\u003e\u003cp\u003e一直忘了改这个东西了。有时候等待一些服务停止的时候等到倒计时结束才会停止。可以适当减少倒计时的时长环节这个问题。\u003c/p\u003e\u003cp\u003e对应的参数在\u003ccode\u003e/etc/systemd/system.conf\u003c/code\u003e,更改\u003ccode\u003eDefaultTimeoutStopSec=90s\u003c/code\u003e为你想要的等待时间,我改成10s了。\u003c/p\u003e\u003ch2 id=\"记一次内核卡死\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E8%AE%B0%E4%B8%80%E6%AC%A1%E5%86%85%E6%A0%B8%E5%8D%A1%E6%AD%BB\" class=\"headerlink\" title=\"记一次内核卡死\"\u003e\u003c/a\u003e记一次内核卡死\u003c/h2\u003e\u003cp\u003e挺草的说起来。征兆是先是firefox崩了,然后把kwin也爆了。第二次是kwin自己爆炸了,然后玩mc java的时候就OOM+CPU 100%了。问了下群里老哥,发现没开SysRq,不然的话就能在内核卡死的时候使用一些组合键来让内核执行一些有限操作。\u003c/p\u003e\u003cp\u003e等待了大概40min,无果,只能以\u0026gt;2min的不规律时间响应键盘中断,老哥推测可能是活锁,而且OOM也没来得及出动。所以就含泪重启,跟自己tmux里边一堆窗口告别了。\u003c/p\u003e\u003cp\u003e重启,看看内核日志:\u003ccode\u003esudo journalctl -k -b-1\u003c/code\u003e查看上次启动的日志:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e27\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e28\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e29\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e30\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e31\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e32\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e33\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e34\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e35\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e36\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e37\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e38\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e39\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e41\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e42\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e43\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e44\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e45\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e46\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e47\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e48\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e49\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e50\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e51\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e52\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e53\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e54\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e55\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e56\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e57\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e58\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e59\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e60\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e61\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e62\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e63\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e64\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e65\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e66\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e67\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e68\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e69\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e70\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e71\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e72\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e73\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e74\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e75\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e76\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e77\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e78\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e79\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e80\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e81\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e82\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e83\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e84\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e85\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e86\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e87\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e88\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e89\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e90\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e91\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e92\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e93\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e94\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e95\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e96\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e97\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e98\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e99\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e100\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e101\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e102\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e103\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e104\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e105\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e106\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e107\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e108\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e109\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e110\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e111\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e112\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e113\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e114\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e115\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e116\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e117\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e118\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e119\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e120\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e121\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e122\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e123\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e124\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e125\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e126\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e127\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e128\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e129\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e130\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e131\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e132\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e133\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e134\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e135\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e136\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e137\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e138\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e139\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e140\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e141\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e142\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e143\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e144\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e145\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e146\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e147\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e148\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e149\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e150\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e151\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e152\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e153\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e154\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e155\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e156\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e157\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e158\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e159\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e160\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e161\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e162\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e163\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e164\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e165\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e166\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e167\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e168\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e169\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e170\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e171\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e172\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e173\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e174\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e175\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e176\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e177\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e178\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e179\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e180\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e181\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e182\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e183\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e184\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e185\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e186\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e187\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e188\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e189\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e190\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e191\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e192\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e193\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e194\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e195\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e196\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e197\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e198\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e199\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e200\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: Bluetooth: hci0: Malformed MSFT vendor event: 0x02\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: Bluetooth: hci0: Found Intel DDC parameters: intel/ibt-0040-4150.ddc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: Bluetooth: hci0: Applying Intel DDC parameters completed\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: Bluetooth: hci0: Firmware timestamp 2023.42 buildtype 1 build 73111\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: Microcode SW error detected. Restarting 0x0.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: Start IWL Error Log Dump:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: Transport status: 0x0000004A, valid: 6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: Loaded firmware version: 83.e8f84e98.0 so-a0-hr-b0-83.ucode\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000071 | NMI_INTERRUPT_UMAC_FATAL \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x000002F0 | trm_hw_status0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | trm_hw_status1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x004D9024 | branchlink2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x004CF2F2 | interruptlink1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x004CF2F2 | interruptlink2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00015346 | data1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000010 | data2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | data3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x0022F89E | beacon time\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x001E1C6F | tsf low\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | tsf hi\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | time gp1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x001ED6DD | time gp2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000001 | uCode revision type\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000053 | uCode version major\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0xE8F84E98 | uCode version minor\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000370 | hw version\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00C80002 | board version\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x80DDFC04 | hcmd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00020000 | isr0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | isr1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x48F00002 | isr2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00C3000C | isr3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | isr4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x001C0103 | last cmd Id\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00015346 | wait_event\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000010 | l2p_control\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000020 | l2p_duration\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x0000003F | l2p_mhvalid\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | l2p_addr_match\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000009 | lmpm_pmg_sel\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | timestamp\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00004870 | flow_handler\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: Start IWL Error Log Dump:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: Transport status: 0x0000004A, valid: 7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x2010190E | ADVANCED_SYSASSERT\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | umac branchlink1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x804703E0 | umac branchlink2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0xC0081500 | umac interruptlink1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | umac interruptlink2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x0101971C | umac data1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0xDEADBEEF | umac data2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0xDEADBEEF | umac data3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000053 | umac major\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0xE8F84E98 | umac minor\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x001ED6D7 | frame pointer\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0xC0886BE0 | stack pointer\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x0024010D | last host cmd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000000 | isr status reg\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: IML/ROM dump:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000B03 | IML/ROM error/state\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x0000518C | IML/ROM data1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000090 | IML/ROM WFPM_AUTH_KEY_0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: Fseq Registers:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x60000000 | FSEQ_ERROR_CODE\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00350002 | FSEQ_TOP_INIT_VERSION\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00150001 | FSEQ_CNVIO_INIT_VERSION\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x0000A482 | FSEQ_OTP_VERSION\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00000003 | FSEQ_TOP_CONTENT_VERSION\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x4552414E | FSEQ_ALIVE_TOKEN\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00080400 | FSEQ_CNVI_ID\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x01300504 | FSEQ_CNVR_ID\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00080400 | CNVI_AUX_MISC_CHIP\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x01300504 | CNVR_AUX_MISC_CHIP\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x05B0905B | CNVR_SCU_SD_REGS_SD_REG_DIG_DCDC_VTRIM\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x0000025B | CNVR_SCU_SD_REGS_SD_REG_ACTIVE_VDIG_MIRROR\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00150001 | FSEQ_PREV_CNVIO_INIT_VERSION\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00350002 | FSEQ_WIFI_FSEQ_VERSION\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x00350002 | FSEQ_BT_FSEQ_VERSION\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: 0x000000DC | FSEQ_CLASS_TP_VERSION\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: UMAC CURRENT PC: 0x8048f214\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: LMAC1 CURRENT PC: 0xd0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: iwlwifi 0000:00:14.3: WRT: Collecting data: ini trigger 4 fired (delay=0ms).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:33 ark-station kernel: ieee80211 phy0: Hardware restart was requested\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:34 ark-station kernel: iwlwifi 0000:00:14.3: WRT: Invalid buffer destination\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:34 ark-station kernel: Bluetooth: MGMT ver 1.22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:34 ark-station kernel: Bluetooth: hci0: Bad flag given (0x1) vs supported (0x0)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:34 ark-station kernel: iwlwifi 0000:00:14.3: WFPM_UMAC_PD_NOTIFICATION: 0x20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:34 ark-station kernel: iwlwifi 0000:00:14.3: WFPM_LMAC2_PD_NOTIFICATION: 0x1f\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:34 ark-station kernel: iwlwifi 0000:00:14.3: WFPM_AUTH_KEY_0: 0x90\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:34 ark-station kernel: iwlwifi 0000:00:14.3: CNVI_SCU_SEQ_DATA_DW9: 0x10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:34 ark-station kernel: iwlwifi 0000:00:14.3: RFIm is deactivated, reason = 5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:38 ark-station kernel: wlan0: authenticate with e2:cb:4f:01:72:a7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:38 ark-station kernel: wlan0: send auth to e2:cb:4f:01:72:a7 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:38 ark-station kernel: wlan0: authenticated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:38 ark-station kernel: wlan0: associate with e2:cb:4f:01:72:a7 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:38 ark-station kernel: wlan0: RX AssocResp from e2:cb:4f:01:72:a7 (capab=0x1511 status=0 aid=1)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:43:38 ark-station kernel: wlan0: associated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:47:20 ark-station kernel: kwin_wayland[901]: segfault at 0 ip 0000561fd234c33f sp 00007fff916f35c0 error 4 in kwin_wayland[561fd2348000+110000] likely on CPU 13 (core 25, socket 0)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:47:20 ark-station kernel: Code: 8b 47 58 48 8b 58 10 48 01 c3 48 63 40 04 4c 8d 24 c3 49 39 dc 75 0d eb 2a 66 90 48 83 c3 08 49 39 dc 74 1f 48 8b 3b 48 89 ee \u0026lt;48\u0026gt; 8b 07 ff 50 60 84 c0 74 e7 48 83 c4 08 5b 5d 41 5c 41 5d c3 0f\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 10:49:41 ark-station systemd-fstab-generator[2389003]: Failed to create unit file \u0026#39;/run/systemd/generator/-.mount\u0026#39;, as it already exists. Duplicate entry in \u0026#39;/etc/fstab\u0026#39;?\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: deauthenticating from e2:cb:4f:01:72:a7 by local choice (Reason: 3=DEAUTH_LEAVING)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: authenticate with f0:9b:b8:16:62:30\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: 80 MHz not supported, disabling VHT\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: send auth to f0:9b:b8:16:62:30 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: authenticated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: associate with f0:9b:b8:16:62:30 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: RX AssocResp from f0:9b:b8:16:62:30 (capab=0x1421 status=0 aid=2)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: associated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:15:18 ark-station kernel: wlan0: Limiting TX power to 20 (20 - 0) dBm as advertised by f0:9b:b8:16:62:30\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:21:36 ark-station kernel: wlan0: disconnect from AP f0:9b:b8:16:62:30 for new auth to f0:9b:b8:16:62:40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:21:36 ark-station kernel: wlan0: authenticate with f0:9b:b8:16:62:40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:21:36 ark-station kernel: wlan0: send auth to f0:9b:b8:16:62:40 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:21:36 ark-station kernel: wlan0: authenticated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:21:36 ark-station kernel: wlan0: associate with f0:9b:b8:16:62:40 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:21:36 ark-station kernel: wlan0: RX ReassocResp from f0:9b:b8:16:62:40 (capab=0x1501 status=0 aid=4)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:21:36 ark-station kernel: wlan0: associated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:21:36 ark-station kernel: wlan0: Limiting TX power to 30 (30 - 0) dBm as advertised by f0:9b:b8:16:62:40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:22:44 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* Atomic update failure on pipe A (start=282494 end=282495) time 187 us, min 1579, max 1599, scanline start 1564, end 1602\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:41:50 ark-station kernel: wlan0: disconnect from AP f0:9b:b8:16:62:40 for new auth to f0:9b:b8:16:5c:40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:41:50 ark-station kernel: wlan0: authenticate with f0:9b:b8:16:5c:40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:41:50 ark-station kernel: wlan0: send auth to f0:9b:b8:16:5c:40 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:41:50 ark-station kernel: wlan0: authenticated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:41:50 ark-station kernel: wlan0: associate with f0:9b:b8:16:5c:40 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:41:50 ark-station kernel: wlan0: RX ReassocResp from f0:9b:b8:16:5c:40 (capab=0x1501 status=0 aid=2)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:41:50 ark-station kernel: wlan0: associated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 11:41:50 ark-station kernel: wlan0: Limiting TX power to 23 (23 - 0) dBm as advertised by f0:9b:b8:16:5c:40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 18:00:05 ark-station kernel: wlan0: deauthenticating from f0:9b:b8:16:5c:40 by local choice (Reason: 3=DEAUTH_LEAVING)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 18:00:05 ark-station kernel: wlan0: authenticate with e2:cb:4f:01:72:a7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 18:00:05 ark-station kernel: wlan0: send auth to e2:cb:4f:01:72:a7 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 18:00:05 ark-station kernel: wlan0: authenticated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 18:00:05 ark-station kernel: wlan0: associate with e2:cb:4f:01:72:a7 (try 1/3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 18:00:05 ark-station kernel: wlan0: RX AssocResp from e2:cb:4f:01:72:a7 (capab=0x1511 status=0 aid=3)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 18:00:05 ark-station kernel: wlan0: associated\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 18:41:38 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* Atomic update failure on pipe A (start=2487239 end=2487240) time 230 us, min 1579, max 1599, scanline start 1566, end 1613\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 19:34:40 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* Atomic update failure on pipe A (start=2869004 end=2869005) time 158 us, min 1579, max 1599, scanline start 1570, end 1602\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:01:05 ark-station kernel: atkbd serio0: Unknown key pressed (translated set 2, code 0x8b on isa0060/serio0).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:01:05 ark-station kernel: atkbd serio0: Use \u0026#39;setkeycodes e00b \u0026lt;keycode\u0026gt;\u0026#39; to make it known.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:01:05 ark-station kernel: atkbd serio0: Unknown key released (translated set 2, code 0x8b on isa0060/serio0).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:01:05 ark-station kernel: atkbd serio0: Use \u0026#39;setkeycodes e00b \u0026lt;keycode\u0026gt;\u0026#39; to make it known.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:01:07 ark-station kernel: atkbd serio0: Unknown key pressed (translated set 2, code 0x8a on isa0060/serio0).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:01:07 ark-station kernel: atkbd serio0: Use \u0026#39;setkeycodes e00a \u0026lt;keycode\u0026gt;\u0026#39; to make it known.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:01:07 ark-station kernel: atkbd serio0: Unknown key released (translated set 2, code 0x8a on isa0060/serio0).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:01:07 ark-station kernel: atkbd serio0: Use \u0026#39;setkeycodes e00a \u0026lt;keycode\u0026gt;\u0026#39; to make it known.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:02:39 ark-station kernel: atkbd serio0: Unknown key pressed (translated set 2, code 0x8b on isa0060/serio0).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:02:39 ark-station kernel: atkbd serio0: Use \u0026#39;setkeycodes e00b \u0026lt;keycode\u0026gt;\u0026#39; to make it known.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:02:39 ark-station kernel: atkbd serio0: Unknown key released (translated set 2, code 0x8b on isa0060/serio0).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:02:39 ark-station kernel: atkbd serio0: Use \u0026#39;setkeycodes e00b \u0026lt;keycode\u0026gt;\u0026#39; to make it known.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:02:51 ark-station kernel: atkbd serio0: Unknown key pressed (translated set 2, code 0x8a on isa0060/serio0).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:02:51 ark-station kernel: atkbd serio0: Use \u0026#39;setkeycodes e00a \u0026lt;keycode\u0026gt;\u0026#39; to make it known.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:02:51 ark-station kernel: atkbd serio0: Unknown key released (translated set 2, code 0x8a on isa0060/serio0).\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:02:51 ark-station kernel: atkbd serio0: Use \u0026#39;setkeycodes e00a \u0026lt;keycode\u0026gt;\u0026#39; to make it known.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* GT0: GUC: Engine reset failed on 0:0 (rcs0) because 0x00000000\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] GPU HANG: ecode 12:1:84dffffb, in Render thread [3009924]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] Resetting chip for GuC failed to reset engine mask=0x1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* rcs0 reset request timed out: {request: 00000001, RESET_CTL: 00000001}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* rcs0 reset request timed out: {request: 00000001, RESET_CTL: 00000001}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] Render thread[3009924] context reset due to GPU hang\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] GT0: GuC firmware i915/adlp_guc_70.bin version 70.13.1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] GT0: HuC firmware i915/tgl_huc.bin version 7.9.3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] GT0: HuC: authenticated for all workloads\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] GT0: GUC: submission enabled\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:18:46 ark-station kernel: i915 0000:00:02.0: [drm] GT0: GUC: SLPC enabled\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* GT0: GUC: Engine reset failed on 0:0 (rcs0) because 0x00000000\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] GPU HANG: ecode 12:1:84dffffb, in Render thread [3009924]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] Resetting chip for GuC failed to reset engine mask=0x1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* rcs0 reset request timed out: {request: 00000001, RESET_CTL: 00000001}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] *ERROR* rcs0 reset request timed out: {request: 00000001, RESET_CTL: 00000001}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] Render thread[3009924] context reset due to GPU hang\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] GT0: GuC firmware i915/adlp_guc_70.bin version 70.13.1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] GT0: HuC firmware i915/tgl_huc.bin version 7.9.3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] GT0: HuC: authenticated for all workloads\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] GT0: GUC: submission enabled\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:45:01 ark-station kernel: i915 0000:00:02.0: [drm] GT0: GUC: SLPC enabled\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:49:08 ark-station kernel: INFO: task IPC Launch:2387456 blocked for more than 122 seconds.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:49:16 ark-station kernel: Not tainted 6.6.10-arch1-1 #1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:49:27 ark-station kernel: \u0026#34;echo 0 \u0026gt; /proc/sys/kernel/hung_task_timeout_secs\u0026#34; disables this message.\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:49:32 ark-station kernel: task:IPC Launch state:D stack:0 pid:2387456 ppid:870 flags:0x00004002\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:49:38 ark-station kernel: Call Trace:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:49:48 ark-station kernel: \u0026lt;TASK\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:50:00 ark-station kernel: __schedule+0x3e7/0x1410\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:50:16 ark-station kernel: schedule+0x5e/0xd0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:50:28 ark-station kernel: schedule_preempt_disabled+0x15/0x30\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:50:36 ark-station kernel: rwsem_down_write_slowpath+0x203/0x690\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:50:43 ark-station kernel: ? prealloc_shrinker+0x6a/0xd0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:50:51 ark-station kernel: ? __pfx_set_anon_super_fc+0x10/0x10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:50:57 ark-station kernel: down_write+0x5b/0x60\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:51:04 ark-station kernel: __prealloc_shrinker+0x70/0x350\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:51:11 ark-station kernel: ? kvasprintf+0x82/0xd0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:51:17 ark-station kernel: ? __pfx_set_anon_super_fc+0x10/0x10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:51:23 ark-station kernel: prealloc_shrinker+0x7b/0xd0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:51:28 ark-station kernel: alloc_super+0x272/0x2e0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:51:35 ark-station kernel: sget_fc+0x63/0x330\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:51:41 ark-station kernel: ? __pfx_mqueue_fill_super+0x10/0x10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:51:55 ark-station kernel: get_tree_nodev+0x27/0x90\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:52:02 ark-station kernel: vfs_get_tree+0x26/0xf0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:52:07 ark-station kernel: ? refcount_dec_and_lock+0x11/0x70\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:52:12 ark-station kernel: fc_mount+0x12/0x40\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:52:17 ark-station kernel: mq_init_ns+0x10f/0x1b0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:52:21 ark-station kernel: copy_ipcs+0x134/0x270\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eJan 16 20:52:26 ark-station kernel: create_new_namespaces+0xa1/0x2e0\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e看了一圈最后找到个issue,看样子我应该是drm/i195受害者咯。\u003c/p\u003e\u003ch3 id=\"SysRq-Keyboard-Shortcuts\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#SysRq-Keyboard-Shortcuts\" class=\"headerlink\" title=\"SysRq: Keyboard Shortcuts\"\u003e\u003c/a\u003eSysRq: Keyboard Shortcuts\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003esystemd has the SysRq permissions bitmask set to 0x10 by default, which does not allow process signalling or rebooting, among other things. To allow full use of the SysRq key on your system, add kernel.sysrq = 1 to your sysctl configuration. Values greater than 1 can be used to selectively enable SysRq functions; see the Linux kernel documentation for details. If you want to make sure it will be enabled even before the partitions are mounted and in the initrd, then add sysrq_always_enabled=1 to your kernel parameters.\u003c/p\u003e\u003cp\u003eNote that changing the setting through these methods will cause the changes to persist across reboots. If you want to try changing the SysRq settings for just your current session, you can run either sysctl kernel.sysrq=1 or echo “1” \u0026gt; /proc/sys/kernel/sysrq.\u003c/p\u003e\u003cp\u003eThere are some obvious security risks involved in fully enabling the SysRq key. In addition to forcing reboots and the like, it can be used to dump the contents of the CPU registers, which could theoretically reveal sensitive information. Since using it requires physical access to the system (unless you go out of your way), most desktop users will probably consider the level of risk acceptable. That said, make sure you fully understand the implications of enabling it and the dynamics of the larger context in which your system is operating before you turn SysRq all the way on. \u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e上边是\u003ca href=\"https://wiki.archlinux.org/title/keyboard_shortcuts\"\u003earch wiki\u003c/a\u003e的资料链接,可以参考下开开这玩意。这玩意的快捷键可以这么记:\u003cem\u003eReboot Even If System Utterly Broken\u003c/em\u003e。用法就是\u003ccode\u003eAlt+SysRq+这六个单词首字母缩写\u003c/code\u003e,功能分别是\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003eUnraw\u003c/code\u003e:切换键盘输入到ASCII模式,\u003c/li\u003e\u003cli\u003e\u003ccode\u003eTerminate\u003c/code\u003e:给所有进程发送\u003ccode\u003eSIGTERM\u003c/code\u003e,\u003c/li\u003e\u003cli\u003e\u003ccode\u003eKill\u003c/code\u003e:发送\u003ccode\u003eSIGKILL\u003c/code\u003e给所有进程,\u003c/li\u003e\u003cli\u003e\u003ccode\u003eSync\u003c/code\u003e:写入数据到磁盘,\u003c/li\u003e\u003cli\u003e\u003ccode\u003eUnmount\u003c/code\u003e:卸载然后挂载所有文件系统为只读模式,\u003c/li\u003e\u003cli\u003e\u003ccode\u003eReboot\u003c/code\u003e:重启。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e另外还可以用\u003ccode\u003ef\u003c/code\u003e来触发\u003ccode\u003eOOM Killer\u003c/code\u003e。\u003c/p\u003e\u003ch2 id=\"开机时间优化\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%BC%80%E6%9C%BA%E6%97%B6%E9%97%B4%E4%BC%98%E5%8C%96\" class=\"headerlink\" title=\"开机时间优化\"\u003e\u003c/a\u003e开机时间优化\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003eref: \u003ca href=\"https://www.glowmem.com/archives/archlinux-note#toc-head-7\"\u003e律回彼境\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e使用\u003ccode\u003esudo systemd-analyze blame\u003c/code\u003e可以查看系统开机时间详情。\u003c/p\u003e\u003cp\u003e自动mount分区(也就是直接在\u003ccode\u003e/etc/fstab\u003c/code\u003e里边进行配置)会导致启动时间增大,所以更推荐写成一个脚本,在用户登录后自动执行挂载。脚本放置在 ~/.config/autostart/ 即可在用户登录后执行。\u003c/p\u003e\u003ch2 id=\"又被Firefox爆了\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E5%8F%88%E8%A2%ABFirefox%E7%88%86%E4%BA%86\" class=\"headerlink\" title=\"又被Firefox爆了\"\u003e\u003c/a\u003e又被Firefox爆了\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e虽然后来看日志发现是Firefox被kwin爆了\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e这几天频繁出现桌面所有进程炸掉的情况,恢复后Firefox的Crash Report自己会跳出来。。不知道为啥,但是根据群u从\u003ccode\u003eabout:crashes\u003c/code\u003e里边提交的崩溃报告来看,应该是kwin把Firefox爆了。\u003c/p\u003e\u003cp\u003e根据老哥的建议,关闭了系统的自适应同步(Adaptive Sync)选项,按照他的惊叹,问题可能会少一些。\u003c/p\u003e\u003ch2 id=\"传文件的姿势\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E4%BC%A0%E6%96%87%E4%BB%B6%E7%9A%84%E5%A7%BF%E5%8A%BF\" class=\"headerlink\" title=\"传文件的姿势\"\u003e\u003c/a\u003e传文件的姿势\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e什么姿势,还真没见过\u003cbr/\u003e-转自archlinux-cn-依云\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003etar C -c ~tmp/makepkg/wayfire-lily-git/src/build/src wayfire | ssh root@kvm-archkde tar xvU -C /usr/bin/\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"文件系统迁移\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/#%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E8%BF%81%E7%A7%BB\" class=\"headerlink\" title=\"文件系统迁移\"\u003e\u003c/a\u003e文件系统迁移\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e有条件的话,建议还是全新安装最好。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003eReference:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ca href=\"https://zhuanlan.zhihu.com/p/512761420\"\u003e如何将你的文件系统转换为 Btrfs | Linux 中国\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://github.com/BarryWanghyw/Linux_Personal_Note/blob/master/Linux%E7%B3%BB%E7%BB%9F%E4%B9%8Brsync%20%E5%A4%87%E4%BB%BD%E4%B8%8E%E8%BF%98%E5%8E%9F.md\"\u003eLinux_Personal_Note/Linux系统之rsync 备份与还原 - github.com\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"http://blog.imlk.top/posts/migrating-to-btrfs/\"\u003e从ext4迁移到btrfs - imlk’s blog\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://superuser.com/questions/524186/grub-broken-after-conversion-to-btrfs\"\u003eGRUB broken after conversion to btrfs - Superuser.com\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://forum.manjaro.org/t/boot-on-btrfs-subvolume-error-mount-new-root-unknown-filesystem-type-btrfs/152116\"\u003eBoot on btrfs subvolume error: “mount: /new_root: unknown filesystem type ‘btrfs’ ”\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e参考了几个博客,跟着感觉走最后总算是有惊无险整好了。\u003c/p\u003e\u003cp\u003e本来是想用\u003ccode\u003ebtrfs-convert\u003c/code\u003e给直接原地转换的,但是奈何superblock大小太小,转换失败。没办法,自己动手丰衣足食。\u003c/p\u003e\u003cp\u003e首先先是把原来的系统备份好:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003edd\u003c/span\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e=/dev/nvme0n1p5 of=/path/to/another/disk/backup.img bs=4M status=progress\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e有备份了,开整。\u003c/p\u003e\u003cp\u003e发现手边没有U盘,但是有个root的手机。于是就用DriveDroid+一个Arch的LiveISO让它发挥余热了。\u003c/p\u003e\u003cp\u003e启动挺顺利,记得把ArchISO挂载为只读USB存储设备。进去之后\u003cstrong\u003e确保确实备份了之后格式化设备\u003c/strong\u003e(一定要多确认几遍,):\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003emkfs.btrfs -L arch-driver /dev/nvme0n1p5 \u003cspan class=\"comment\"\u003e# 这里务必多确认几遍\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后创建子卷,布局我用的适合\u003ccode\u003etimeshift\u003c/code\u003e的默认方案:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003emount -t btrfs -o compress=zstd /dev/nvme0n1p5 /mnt\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ebtrfs subvolume create /mnt/@ \u003cspan class=\"comment\"\u003e# 创建 / 目录子卷\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ebtrfs subvolume create /mnt/@home \u003cspan class=\"comment\"\u003e# 创建 /home 目录子卷\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eumount /mnt\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emount -t btrfs -o subvol=/@,compress=zstd /dev/nvme0n1p5 /mnt\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emkdir\u003c/span\u003e /mnt/home\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emount -t btrfs -o subvol=/@home,compress=zstd /dev/nvme0n1p5 /mnt/home\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emkdir\u003c/span\u003e -p /mnt/boot\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emount /dev/nvme0n1p2 /mnt/boot\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e创建完成之后,准备迁移数据:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emkdir\u003c/span\u003e ~/old-fs\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emonut /path/to/your/backup/backup.img ~/old-fs\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ersync -av ~/old-fs/home/ /mnt/home/\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ersync -av --exclude={\u003cspan class=\"string\"\u003e\u0026#34;/proc\u0026#34;\u003c/span\u003e,\u003cspan class=\"string\"\u003e\u0026#34;/dev\u0026#34;\u003c/span\u003e} ~/old-fs/ /mnt/\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e等复制完成之后,就可以着手修复系统引导了。这里先用\u003ccode\u003eiwctl\u003c/code\u003e连上网。之后就该开始修复GRUB了:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003egenfstab -U /mnt \u0026gt; /mnt/etc/fstab\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 此时手动检查下结果是否正确\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 可以cat /mnt/etc/fstab看看\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003earch-chroot /mnt\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epacman -S grub-btrfs \u003cspan class=\"comment\"\u003e# 安装支持btrfs版本的GRUB\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003egrub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=ARCH\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esed -i \u003cspan class=\"string\"\u003e\u0026#39;s/loglevel=3 quiet/loglevel=5 nowatchdog/g\u0026#39;\u003c/span\u003e /etc/default/grub\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;GRUB_DISABLE_OS_PROBER=false\u0026#34;\u003c/span\u003e \u0026gt;\u0026gt; /etc/default/grub\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后理论上就OK了。此时\u003ccode\u003ectrl+d\u003c/code\u003e退出\u003ccode\u003echroot\u003c/code\u003e然后\u003ccode\u003eumount -R /mnt \u0026amp;\u0026amp; reboot\u003c/code\u003e,重启,进入新系统看看吧。\u003c/p\u003e\u003cp\u003e反正解决完一堆问题,成功进系统之后,我惊悚地发现,磁盘可用空间从8G变成了30G\u003cdel\u003e而且\u003ccode\u003ebtrfs balance /\u003c/code\u003e之后还又多出来1G\u003c/del\u003e。根据rx所说,btrfs对于文本的压缩效果特别好。那指不定是给我一堆\u003ccode\u003enode_modules\u003c/code\u003e压缩干净了?\u003c/p\u003e\u003cp\u003e谁知道,大概是透明压缩确实顶吧。经过测试,timeshift和其他的btrfs特性都能正常使用。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/09/05/arch-linux%E6%8A%98%E8%85%BE%E7%AC%94%E8%AE%B0/"},{"title":"Linux误删文件恢复","time":"2023-08-29T18:52:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e删了私有云上几百个文件,不过好在最后发现只是删除了数据库里边的记录。万幸万幸。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e注意,\u003cstrong\u003e下面的操作只适用于删文件的进程已经挂了的情况,请根据自己情况选择合适的方法\u003c/strong\u003e。\u003c/p\u003e\u003ch2 id=\"首先要做的\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/08/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/linux-undelete/#%E9%A6%96%E5%85%88%E8%A6%81%E5%81%9A%E7%9A%84\" class=\"headerlink\" title=\"首先要做的\"\u003e\u003c/a\u003e首先要做的\u003c/h2\u003e\u003cp\u003e赶紧杀掉所有进程,防止数据写入到磁盘覆盖\u003ccode\u003einode\u003c/code\u003e,如果被覆盖基本就凉了。比如说,停止当前分区的服务,赶紧卸载当前分区设备,甚至直接断网都是有必要的。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003eunmount /dev/sda1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 如果设备忙的话,用下面的命令强制卸载\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003efuser -m -v -i -k /dir\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后用\u003ccode\u003edd\u003c/code\u003e备份分区,防止恢复失败。比如可以用下面的指令:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003edd\u003c/span\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e=/dev/sda1 of=/tmp/sda1.img\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"工具准备\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/08/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/linux-undelete/#%E5%B7%A5%E5%85%B7%E5%87%86%E5%A4%87\" class=\"headerlink\" title=\"工具准备\"\u003e\u003c/a\u003e工具准备\u003c/h2\u003e\u003cp\u003e根据分区类型使用\u003ccode\u003eextundelete\u003c/code\u003e或者\u003ccode\u003entfsundelete\u003c/code\u003e。后者直接安装\u003ccode\u003entfs-3g\u003c/code\u003e即可,前者使用apt安装\u003ccode\u003eextundelete\u003c/code\u003e。\u003c/p\u003e\u003ch2 id=\"恢复\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/08/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/linux-undelete/#%E6%81%A2%E5%A4%8D\" class=\"headerlink\" title=\"恢复\"\u003e\u003c/a\u003e恢复\u003c/h2\u003e\u003cp\u003e\u003ca href=\"https://manpages.ubuntu.com/manpages/focal/en/man8/ntfsundelete.8.html\"\u003e官方文档\u003c/a\u003e\u003c/p\u003e\u003cp\u003e如果是ntfs分区的话,用这个命令得到文件列表:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 这个-f是因为我懒得卸载卷了\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 正常情况下还是先unmount了再操作,比较安全\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 这样就不用加-f了\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo ntfsundelete -s /dev/sdc2 -f \u0026gt; rec-list.txt\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 或者还有下面这些指令\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# Look for deleted files on /dev/hda1.\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003entfsundelete /dev/hda1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# Look for deleted documents on /dev/hda1.\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003entfsundelete /dev/hda1 -s -m \u003cspan class=\"string\"\u003e\u0026#39;*.doc\u0026#39;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# Look for deleted files between 5000 and 6000000 bytes, with at least 90% of the data\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# recoverable, on /dev/hda1.\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003entfsundelete /dev/hda1 -S 5k-6m -p 90\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# Look for deleted files altered in the last two days\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003entfsundelete /dev/hda1 -t 2d\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后可以按删除日期来筛查文件:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e rec-list.txt | grep 2023-08-30 \u0026gt; res-filtered.txt\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e最后恢复文件:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# Undelete inodes 2, 5 and 100 to 131 of device /dev/sda1\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003entfsundelete /dev/sda1 -u -i 2,5,100-131\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# Undelete inode number 3689, call the file \u0026#39;work.doc\u0026#39;, set it to recovered size and put it\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# in the user\u0026#39;s home directory.\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003entfsundelete /dev/hda1 -u -T -i 3689 -o work.doc -d ~\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# Save MFT Records 3689 to 3690 to a file \u0026#39;debug\u0026#39;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003entfsundelete /dev/hda1 -c 3689-3690 -o debug\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/08/29/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/linux-undelete/"},{"title":"ChatGLM部署手记","time":"2023-08-22T17:20:56Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e这次部署了一次量化后的模型,大概记录一下部署过程和遇到的问题。\u003c/p\u003e\u003cp\u003e因为显卡显存只有8G,所以部署的是6b的int4量化模型。\u003c/p\u003e\u003ch2 id=\"部署\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/08/22/ChatGLM%E9%83%A8%E7%BD%B2%E6%89%8B%E8%AE%B0/#%E9%83%A8%E7%BD%B2\" class=\"headerlink\" title=\"部署\"\u003e\u003c/a\u003e部署\u003c/h2\u003e\u003cp\u003e一般是直接从Hugging Face克隆仓库下来。我当时担心速度不够从清华云盘下载的,不过后来克隆发现速度很快,一般应该是不用担心下载速度的。\u003c/p\u003e\u003cp\u003e首先克隆6b的仓库,然后进入仓库安装依赖:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003egit \u003cspan class=\"built_in\"\u003eclone\u003c/span\u003e https://github.com/THUDM/ChatGLM-6B \u0026amp;\u0026amp; \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e ChatGLM-6B\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003epip install -r requirements.txt\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后下载ChatGLM-6B的模型的量化版本。注意,\u003cstrong\u003e一定要下载所有的文件\u003c/strong\u003e。如果clone不下来,就先把其他小文件下下来,然后在清华网盘下载模型本体:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003egit \u003cspan class=\"built_in\"\u003eclone\u003c/span\u003e https://huggingface.co/THUDM/chatglm-6b-int4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 量化版本地址:https://cloud.tsinghua.edu.cn/d/674208019e314311ab5c/\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e完成后,更改cli-demo.py和webui-demo.py中的\u003ccode\u003eTHUDM/chatglm-6b-int4\u003c/code\u003e为你本地的路径:\u003ccode\u003e/path/to/chatglm-6b-int4\u003c/code\u003e即可。\u003c/p\u003e\u003cp\u003e最后,使用python运行即可:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003epython3 webui-demo.py\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"问题\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/08/22/ChatGLM%E9%83%A8%E7%BD%B2%E6%89%8B%E8%AE%B0/#%E9%97%AE%E9%A2%98\" class=\"headerlink\" title=\"问题\"\u003e\u003c/a\u003e问题\u003c/h2\u003e\u003cp\u003e如果报错的话,可能是缺少 tokenizer 的相关文件:tokenizer_config.json、special_tokens_map.json、tokenization_chatglm.py 和 ice_text.model。将这些文件(位于你下载的模型的目录中)补全即可解决。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/08/22/ChatGLM%E9%83%A8%E7%BD%B2%E6%89%8B%E8%AE%B0/"},{"title":"ESXi折腾小记","time":"2023-07-21T12:32:36Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"序\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E5%BA%8F\" class=\"headerlink\" title=\"序\"\u003e\u003c/a\u003e序\u003c/h2\u003e\u003cp\u003e其实理论上这玩意早都折腾好了。\u003c/p\u003e\u003cp\u003e只不过不满意于当时的家用板子(B450MK+1500X)对于ESXi兼容性太差,后来又换回了Windows+VMWare的组合。这组合咋用咋不爽,所以最后攒了点钱,整了一套服务器平台(联想的X99板子+E5 2680V4 x2+16G DDR4 ECC,一共大概600大洋),不过因为一些原因拖到最近才空出时间调试好。\u003c/p\u003e\u003ch2 id=\"硬件\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E7%A1%AC%E4%BB%B6\" class=\"headerlink\" title=\"硬件\"\u003e\u003c/a\u003e硬件\u003c/h2\u003e\u003cp\u003e本来机子6月已经装好了,但是一直处于开机不亮屏的状态。昨个跟卖家唠嗑了老久,调试了半天才发现这板子好像只知道集成显卡输出,就好像它不知道自己上边还插着个1080一样。\u003c/p\u003e\u003cp\u003e没办法,集显就集显吧,反正确实能用,还能省点电呢(=。=)\u003c/p\u003e\u003cp\u003e进了U盘,启动ESXi镜像,直接开装。因为是服务器板子,所以不用担心网卡支持之类的问题,反正很顺利地装完了。旁边的弱电柜看着挺好,里边还有个交换机来着,但是看到那密密麻麻的走线,折腾了一下就放弃了(而且这玩意要管理还得插串口线,笑死,根本找不到)。\u003c/p\u003e\u003cp\u003e于是直接把机器插到路由器上了。千兆网,爽死。\u003c/p\u003e\u003cp\u003e整好网络配置之后已经很晚了,遂直接回宿舍,来日再整。\u003c/p\u003e\u003ch2 id=\"系统\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E7%B3%BB%E7%BB%9F\" class=\"headerlink\" title=\"系统\"\u003e\u003c/a\u003e系统\u003c/h2\u003e\u003cp\u003e昨天才装好ESXi,今天下午急冲冲跑到实验室装好了Ubuntu,然后想整个OpenWRT当旁路由,但是发现目前还没啥必要,于是作罢,就用Ubuntu直接开始吧(反正比Windows好\u003c/p\u003e\u003cp\u003e随便装了装软件啥的。先是试着用刚学的sed给apt换了个源,然后装了docker,zip啥的。有了docker之后,直接把笔记本上的mc服务器扔了上去+docker run光速部署。真香。\u003c/p\u003e\u003cp\u003e然后慢慢折腾回以前的服务。首先是gitea,1.20居然都支持ci/cd了,这不狠狠部署?但是我以前的数据还在硬盘上扔着,于是先整了下物理硬盘的vhd映射。下面记录一下:\u003c/p\u003e\u003cp\u003e打开ESXi的SecureSHell(ssh)服务之后,用它的管理账户密码登录上去,然后运行\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003els\u003c/span\u003e /vmfs/devices/disks/\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e查看系统挂载的硬盘信息:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e27\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e28\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e29\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e30\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003et10.ATA_____ST2000DM0052D2CW102__________________________________WFL1DE7T\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.ATA_____ST2000DM0052D2CW102__________________________________WFL1DE7T:1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.ATA_____ST2000DM0052D2CW102__________________________________WFL1DE7T:5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.ATA_____ST4000VX0002D2AG166__________________________________ZDHA1DHG\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.ATA_____ST4000VX0002D2AG166__________________________________ZDHA1DHG:1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.ATA_____ST4000VX0002D2AG166__________________________________ZDHA1DHG:2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001:1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001:2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001:3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001:5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001:6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001:7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001:8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003et10.NVMe____ORICO_V500_128GB________________________0000000000000001:9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.010000000020202020202020202020202057464c3144453754535432303030\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.010000000020202020202020202020202057464c3144453754535432303030:1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.010000000020202020202020202020202057464c3144453754535432303030:5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.01000000002020202020202020202020205a44484131444847535434303030\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.01000000002020202020202020202020205a44484131444847535434303030:1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.01000000002020202020202020202020205a44484131444847535434303030:2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20:1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20:2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20:3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20:5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20:6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20:7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20:8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003evml.0100000000303030305f303030305f303030305f30303031004f5249434f20:9\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后找到硬盘对应的编号,然后用\u003ccode\u003evmkfstools\u003c/code\u003e把硬盘映射到vhd文件里:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003evmkfstools -z /vmfs/devices/disks/[target disk] /vmfs/voluems/datastore1/[target vhd \u003cspan class=\"built_in\"\u003elink\u003c/span\u003e name].vmdk\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e完成之后,在虚拟机编辑里添加硬盘,选择现有硬盘,在里边找到刚才新建的两个硬盘映射vhd文件。\u003c/p\u003e\u003cp\u003e挂载到虚拟机上之后,开机,我们还得把硬盘挂载到系统上。\u003c/p\u003e\u003cp\u003e硬盘加到虚拟机上之后,一般会以\u003ccode\u003e/dev/sd[a-z]\u003c/code\u003e的形式出现,这种时候只需要用\u003ccode\u003efdisk\u003c/code\u003e康康磁盘上有什么好康的分区就行啦。不过我这盘好像被Windows的快速启动污染了,得先在Windows里挂载一下,正常关机才能挂载到Linux底下。\u003c/p\u003e\u003cp\u003e所以,现在本来要装Windows来着,但是突然发现Vmware里边有个叫上载虚拟机的东东:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://mxts.jiujiuer.xyz/img/Pasted%20image%2020230721220805.png\"/\u003e\u003c/p\u003e\u003cp\u003e然后就懒得装了,直接把以前的老虚拟机传上去了。开机前设置下硬盘挂载,然后直接开机再关机,搞定。\u003c/p\u003e\u003cp\u003e配置完成之后,发现果然还是另外整个系统当frp的客户端比较稳定。挑了半天发现还是OpenWRT最方便,于是在\u003ca href=\"https://supes.top/?target=x86/64\u0026amp;id=generic\"\u003eOpenWrt软路由固件下载与在线定制编译\u003c/a\u003e这里下了个x86架构的编译版本装上了。启动之后应该就能正常访问了,就是得先配置下网络的配置文件(我这边为了网络环境方便访问,配置的是bridge桥接模式,所以得手动重新设置网关、地址之类的)。配置相关的内容,恩山有不少内容可以参考。\u003c/p\u003e\u003cp\u003e总之一番折腾下来配好旁路由和内网穿透\u003cdel\u003e以及基本不咋用的局域网代理\u003c/del\u003e之后,折腾就基本结束了\u003c/p\u003e\u003cp\u003e直到我发现安装系统选项底下有个MacOS。装都装了,不试试怎么行呢(不过据了解,黑果在ESXi虚拟化环境下体验不行,更建议物理机\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eTODO:等啥时候加个ssd扩容系统盘再说吧。。空间居然不够用了\u003c/p\u003e\u003c/blockquote\u003e\u003ch3 id=\"自动启动\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8\" class=\"headerlink\" title=\"自动启动\"\u003e\u003c/a\u003e自动启动\u003c/h3\u003e\u003cp\u003e装完机器之后想配置宿主机启动后,子主机跟着自动启动。但是在机器的虚拟机设置里边开开了自动启动之后,却没有按照预期开机自动启动VM。排查一番之后发现原来还有个设置没开。\u003c/p\u003e\u003cp\u003e从左侧导航栏到\u003ccode\u003e主机-\u0026gt;管理-\u0026gt;系统-\u0026gt;自动启动\u003c/code\u003e,点编辑设置,把自动启动打开就行。\u003c/p\u003e\u003cp\u003e这边的两个延时,指的是ESXi启动/关闭所有虚拟机的间隔时间,全局设置会被主机的设置覆盖。而等待检测信号(Wait for heartbeat)指的是,在VM中安装VMWare工具后,系统启动完成后会告知宿主机。此时,如果这个设置为真,则ESXi会跳过启动等待时间,去启动下一个系统。\u003c/p\u003e\u003ch3 id=\"磁盘缩容\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E7%A3%81%E7%9B%98%E7%BC%A9%E5%AE%B9\" class=\"headerlink\" title=\"磁盘缩容\"\u003e\u003c/a\u003e磁盘缩容\u003c/h3\u003e\u003cp\u003e为啥缩小容量呢?因为ESXi系统盘大小不够用了,新系统塞不进去(挠头\u003c/p\u003e\u003cp\u003e装了个Windows Server 2012 R2 Datacenter尝尝鲜,在本子上配置好之后觉得还挺香,遂打算扔服务器上,然后因为上面的原因卡住。\u003c/p\u003e\u003cp\u003e解决方法分两步。先声明一下,我是单磁盘系统,如果是多磁盘还得自己探索探索(\u003c/p\u003e\u003cp\u003e首先用Disk Genius(其实系统自带的磁盘管理也行)打开\u003ccode\u003evmdk\u003c/code\u003e磁盘,然后把系统分区缩小到目标容量,剩下的空间留空就行。完成后保存退出Disk Genuis。\u003c/p\u003e\u003cp\u003e然后用随便一个文本编辑器打开\u003ccode\u003evmdk\u003c/code\u003e文件,最上面几行有一行表示磁盘簇大小的,大小是磁盘容量(KB)的二倍,修改它到合适的大小就行。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://mxts.jiujiuer.xyz/img/Pasted%20image%2020231030214637.png\" alt=\"随便找了个图图\"/\u003e\u003c/p\u003e\u003cp\u003e就是RW一行,改成合适的大小就行。\u003c/p\u003e\u003cp\u003e编辑完成之后直接用VMWare Workstation传到ESXi主机上就OK了。这一点不得不夸下,配套的东西确实挺好用。\u003c/p\u003e\u003ch2 id=\"服务\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E6%9C%8D%E5%8A%A1\" class=\"headerlink\" title=\"服务\"\u003e\u003c/a\u003e服务\u003c/h2\u003e\u003cp\u003e折腾好服务器了,就得想想作何用途了。整理出来的大概有这些:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003eService\u003c/th\u003e\u003cth\u003eDescription\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003egitea\u003c/td\u003e\u003ctd\u003e代码托管和CI/CD\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ecloudreve\u003c/td\u003e\u003ctd\u003e私有云,数据管理以及WebDAV数据备份同步\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eminecraft\u003c/td\u003e\u003ctd\u003e这肯定必装啊,大型开放世界游戏(无误\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ejupyter\u003c/td\u003e\u003ctd\u003e都装N卡了,不玩玩深度学习?\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003edatabase\u003c/td\u003e\u003ctd\u003e当Web服务后端,香就一个字\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ecompile\u003c/td\u003e\u003ctd\u003e这可是56线程啊,我以后写个helloworld都要\u003ccode\u003emake -j56\u003c/code\u003e(大声\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ecalculate\u003c/td\u003e\u003ctd\u003e渲染和其他计算任务倒是可以试试丢上来跑\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003evm server\u003c/td\u003e\u003ctd\u003e给别人也整几个虚拟机用用\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eweb services\u003c/td\u003e\u003ctd\u003e挂点WEB服务上去,岂不美哉\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003emirror site\u003c/td\u003e\u003ctd\u003e整个镜像站,功德无量啊功德无量\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eothers\u003c/td\u003e\u003ctd\u003e后面再想\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cblockquote\u003e\u003cp\u003e先配服务器再想应用场景,有一种先射击再瞄准的美\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e目前搭建的基本就是\u003ccode\u003egitea, mc, cloudreve, jupyter, mysql\u003c/code\u003e这几个,后台还跑着一些运维脚本,目前这些已吃完我的内存了QAQ。总之简述下搭建流程吧。毕竟是个blog不是manual,就不贴太详细的步骤了。如果给出了指令,请确保在理解的情况下,按照真实系统环境执行。\u003c/p\u003e\u003ch3 id=\"gitea\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#gitea\" class=\"headerlink\" title=\"gitea\"\u003e\u003c/a\u003egitea\u003c/h3\u003e\u003cp\u003e这个搭建起来很简单,直接wget最新的build到你要安装的目录,然后把官方的service配置cat到\u003ccode\u003e/etc/systemd/system/gitea.service\u003c/code\u003e,再\u003ccode\u003esudo systemctl enable --now gitea.service\u003c/code\u003e,之后再在给出的Web链接里配置好服务,最后修改好\u003ccode\u003econfig.ini\u003c/code\u003e再重启服务就好了。\u003c/p\u003e\u003cp\u003e很好用的客户端\u003c/p\u003e\u003ch3 id=\"cloudreve\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#cloudreve\" class=\"headerlink\" title=\"cloudreve\"\u003e\u003c/a\u003ecloudreve\u003c/h3\u003e\u003cp\u003e跟上面基本一样,先wget下来,再运行一下产生配置文件并修改好设置,并配置好systemd的服务管理,最后启动就行。不过,安装完成后,还得配置下\u003cstrong\u003e存储策略\u003c/strong\u003e来确定文件存储的物理位置,并在用户组中修改每种用户的空间限额大小和权限等。\u003c/p\u003e\u003cp\u003e这东西我最喜欢的点是支持WebDAV,所以配合上AutoSync之类的客户端,就能实现数据增量备份和同步。\u003c/p\u003e\u003ch3 id=\"Minecraft\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#Minecraft\" class=\"headerlink\" title=\"Minecraft\"\u003e\u003c/a\u003eMinecraft\u003c/h3\u003e\u003cp\u003e喜闻乐见的MC时间。这边我是用Docker开服的,环境最干净,并且最方便于管理。具体参考以前写过的Docker-MC开服的博文。\u003c/p\u003e\u003cp\u003e这次为了运维简单,使用了某docker镜像来开服。官方服的唯一优点估计只剩下官方俩字了,实际表现可以说是一般环境一般,弱网环境逆天。据说原因是因为官方服务器只要丢包发生,无论几个都给你踢了。\u003c/p\u003e\u003cp\u003e所以建议用\u003ccode\u003ePaper\u003c/code\u003e之类的第三方服务端,性能好的多。\u003c/p\u003e\u003ch3 id=\"JupyterLab\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#JupyterLab\" class=\"headerlink\" title=\"JupyterLab\"\u003e\u003c/a\u003eJupyterLab\u003c/h3\u003e\u003cp\u003e直接\u003ccode\u003epython3 -m pip install jupyterlab\u003c/code\u003e或者用\u003ccode\u003eapt, pacman\u003c/code\u003e之类的包管理器安装就行。装完了照着上面的在systemd把它添加为服务就行。装好之后,直接浏览器访问端口使用就行了。\u003c/p\u003e\u003cp\u003e唯一要注意的就是安全性了,注意设个复杂点的密码,小心暴力破解。\u003c/p\u003e\u003ch3 id=\"database\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#database\" class=\"headerlink\" title=\"database\"\u003e\u003c/a\u003edatabase\u003c/h3\u003e\u003cp\u003e刚好这边有个项目得用数据库,所以就用docker开了个mysql的daemon当数据库。不得不说是真的方便\u003c/p\u003e\u003ch3 id=\"Compiling-Service\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#Compiling-Service\" class=\"headerlink\" title=\"Compiling Service\"\u003e\u003c/a\u003eCompiling Service\u003c/h3\u003e\u003cp\u003e这部分我是用gitea-action搞定的。其他时候,我一般直接ssh到服务器上手动编译。不过注意,\u003cstrong\u003e服务器的稳定性至关重要\u003c/strong\u003e,别随便跑啥若治脚本把服务器玩炸了。数据可靠性很关键。特别是当你的服务器还挂了一堆存着重要数据的硬盘,要是真手欠\u003ccode\u003erm -rf\u003c/code\u003e了你哭都没地方去。所以建议这种任务通通扔docker,反正没啥性能损失。\u003c/p\u003e\u003ch3 id=\"Calculation\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#Calculation\" class=\"headerlink\" title=\"Calculation\"\u003e\u003c/a\u003eCalculation\u003c/h3\u003e\u003cp\u003e用JupyterLab能搞定一部分\u003cdel\u003e反正他们数据科学的基本全是python\u003c/del\u003e,另一部分相对需求较小的,就直接跑专门的计算进程算了。\u003c/p\u003e\u003cp\u003e由于计算任务的强性能需求和性能抢占特性,务必设置守护进程等手段,防止一个计算任务炸了整个服务器。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e实在不行在ESXi再开个机器专门跑计算。(\u003c/p\u003e\u003c/blockquote\u003e\u003ch3 id=\"VM-Servers\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#VM-Servers\" class=\"headerlink\" title=\"VM Servers\"\u003e\u003c/a\u003eVM Servers\u003c/h3\u003e\u003cp\u003e打算先搓个轮子,然后基于这个轮子整个自动new container并绑定账号和tty的web service。安全性问题后面再说,这些机器可以用来租借或者提供给其他人学习使用。\u003c/p\u003e\u003ch3 id=\"Web-Services\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#Web-Services\" class=\"headerlink\" title=\"Web Services\"\u003e\u003c/a\u003eWeb Services\u003c/h3\u003e\u003cp\u003e比如可以把\u003ccode\u003eXDU-ISC\u003c/code\u003e的主页/blog挂上去,或者挂点其他Web服务,比如自动打卡之类的。\u003c/p\u003e\u003ch3 id=\"Mirror-Site\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#Mirror-Site\" class=\"headerlink\" title=\"Mirror Site\"\u003e\u003c/a\u003eMirror Site\u003c/h3\u003e\u003cp\u003e给各种大型镜像源整个分流,分担下压力造福开源——不过我这点硬盘容量就算了罢。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e2023.11.03 昨天\u003ccode\u003eClash For Windows\u003c/code\u003e删库,今天\u003ccode\u003eclash core\u003c/code\u003e和其他\u003ccode\u003eClash\u003c/code\u003e系的全部删库\u003cbr/\u003e哎 常用软件还是得整份源码小心删库\u003cbr/\u003e实在不行也能自己维护。\u003c/p\u003e\u003c/blockquote\u003e\u003ch3 id=\"Samba\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#Samba\" class=\"headerlink\" title=\"Samba\"\u003e\u003c/a\u003eSamba\u003c/h3\u003e\u003cp\u003e开个Samba给Windows共享用还是挺爽的。Win的Native WebDAV好像有点问题,不然就省事了。\u003c/p\u003e\u003cp\u003e详细配置教程可以参考\u003ca href=\"https://ubuntu.com/tutorials/install-and-configure-samba#1-overview\"\u003eUbuntu tutorials - Install and configure samba\u003c/a\u003e。我搬个简略版的下来:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo apt update \u0026amp;\u0026amp; sudo apt install samba\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 创建你要共享的目录\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emkdir\u003c/span\u003e ~/sambashare\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 编辑samba配置文件\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 为了以命令形式展示这边用了古法编辑\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 建议用Vim/sed/nano之类的搞定\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo \u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e \u0026lt;\u0026lt; \u003cspan class=\"string\"\u003eEOF \u0026gt;\u0026gt; /etc/samba/smb.conf\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e[sambashare]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e comment = Samba on Ubuntu\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e path = /home/username/sambashare\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e read only = no\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e browsable = yes\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo systemctl \u003cspan class=\"built_in\"\u003eenable\u003c/span\u003e --now smbd \u0026amp;\u0026amp; sudo service start samba\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 更改samba共享账户和密码\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 这个用户账户得是系统中现存的账户\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo smbpasswd -a [username]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 然后根据指引设定共享密码,完成\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e完成后,从其他机器上以\u003ccode\u003e\\\\ip-address\\sambashare\u003c/code\u003e就能访问共享的目录。\u003c/p\u003e\u003ch3 id=\"其他服务\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E5%85%B6%E4%BB%96%E6%9C%8D%E5%8A%A1\" class=\"headerlink\" title=\"其他服务\"\u003e\u003c/a\u003e其他服务\u003c/h3\u003e\u003cp\u003e其他服务的话,比如我写的\u003ccode\u003eNanoOJ\u003c/code\u003e就可以挂上去给搞算法竞赛的\u003cdel\u003e小东西\u003c/del\u003e们训练用,也可以把我写那个\u003ccode\u003eXDU-Planet\u003c/code\u003e挂上去,聚合大家的博客\u003cdel\u003e黑历史\u003c/del\u003e博文,还能整点其他的花活。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e最近把\u003ccode\u003eXDU-Planet\u003c/code\u003e贡献给\u003ccode\u003eXDOSC\u003c/code\u003e社区了,目前挂了很多人的\u003cdel\u003e黑\u003c/del\u003e历史,可以来\u003ca href=\"https://xdlinux.github.io/planet/\"\u003ePlanet\u003c/a\u003e看看。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e总之,充分利用嘛。\u003c/p\u003e\u003cp\u003e哦对,这两天还搭建了个Overleaf用来写LaTex。把编译阶段的任务甩给服务器做挺爽的。部署指南参考了\u003ca href=\"https://zhuanlan.zhihu.com/p/656444021\"\u003e这篇\u003c/a\u003e步骤记录如下:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003emkdir\u003c/span\u003e -p overleaf \u0026amp;\u0026amp; \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e overleaf\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewget https://github.com/overleaf/overleaf/blob/main/docker-compose.yml\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 上边下下来compose配置之后得先改点地方,比如overleaf的端口,volume的存放路径等\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003edocker-compose up -d\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 配置完整的TexLive以支持完整编译\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003edocker \u003cspan class=\"built_in\"\u003eexec\u003c/span\u003e -it sharelatex bash\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e /usr/local/texlive\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewget http://mirror.ctan.org/systems/texlive/tlnet/update-tlmgr-latest.sh --no-check-certificate\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esh update-tlmgr-latest.sh -- --upgrade\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003etlmgr option repository https://mirrors.ustc.edu.cn/CTAN/systems/texlive/tlnet\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003etlmgr update --self --all \u003cspan class=\"comment\"\u003e# luaotfload-tool -fu\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003etlmgr install scheme-full\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e最下边的\u003ccode\u003etlmgr install\u003c/code\u003e就是用来安装各种CTAN包的工具。以后有缺失的包时可以按需安装。\u003c/p\u003e\u003ch2 id=\"运维\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E8%BF%90%E7%BB%B4\" class=\"headerlink\" title=\"运维\"\u003e\u003c/a\u003e运维\u003c/h2\u003e\u003cp\u003e服务器的躯体是硬件,灵魂是数据。物理上的安全备份这里先不论,这里主要说说数据上的安全和管理。\u003c/p\u003e\u003ch3 id=\"数据安全\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8\" class=\"headerlink\" title=\"数据安全\"\u003e\u003c/a\u003e数据安全\u003c/h3\u003e\u003cp\u003e磁盘上的数据无非就程序,配置和存储的重要数据文件这三类,下面分开说。\u003c/p\u003e\u003ch4 id=\"程序\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E7%A8%8B%E5%BA%8F\" class=\"headerlink\" title=\"程序\"\u003e\u003c/a\u003e程序\u003c/h4\u003e\u003cp\u003e大部分程序只是一份可以重新安装下载的数据文件,所以我们只需要备份它的程序列表即可。在迁移系统或者出现重大损失时,我们只需要拿到程序列表,然后用你最喜欢的包管理器批量安装这些程序即可。假设你使用\u003ccode\u003eapt\u003c/code\u003e作为包管理器:前者可以通过\u003ccode\u003edpkg --get-selections \u0026gt; backup.txt\u003c/code\u003e做到,后者可以通过\u003ccode\u003esudo apt-get update \u0026amp;\u0026amp; sudo apt-get install $(awk \u0026#39;{print $1}\u0026#39; backup.txt)\u003c/code\u003e做到。\u003c/p\u003e\u003cp\u003e当然,上面的实现只是最基础的。我们可以使用\u003ccode\u003eawk, git\u003c/code\u003e等工具把这件事做的更好。以上面两行脚本为基础原理,我们可以编写一个借助\u003ccode\u003egit\u003c/code\u003e进行备份记录的版本控制和备份,借助\u003ccode\u003eawk\u003c/code\u003e让备份的程序列表更加可读和强大,借助\u003ccode\u003ealias\u003c/code\u003e和\u003ccode\u003ebashrc\u003c/code\u003e为安装增加一个更新应用列表的hook,利用\u003ccode\u003ecrontab\u003c/code\u003e实现备份的无人值守和自动化,并且可以增加应用的版本信息以及特定版本安装等等。\u003c/p\u003e\u003cp\u003e甚至,对于不在apt的软件,也可以手动记录,甚至是直接保存ELF到备份仓库中。\u003c/p\u003e\u003cp\u003e借助这个工具,灾难恢复也会变得相对简单。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eTODO:后边实现这个脚本,先插个flag在这\u003c/p\u003e\u003c/blockquote\u003e\u003ch4 id=\"配置\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E9%85%8D%E7%BD%AE\" class=\"headerlink\" title=\"配置\"\u003e\u003c/a\u003e配置\u003c/h4\u003e\u003cp\u003eLinux下的大多数配置文件因为都以一个点(dot)开头,所以也叫dotfile。我总结的最佳实践应该是利用Git和Hard-Link去进行管理。比较麻烦的是dotfiles的恢复,这个工作也可以写一个脚本完成,自动根据记录的配置文件路径(存储于csv文件中)去自动创建硬链接来管理。这个方法基本没啥问题,就是容易遇到各种莫名其妙的失效问题,以及在termux里边由于没有root权限不能创建符号链接就很难受。\u003c/p\u003e\u003cp\u003e这里有篇文章,讲解的更加详细:\u003ca href=\"https://medium.com/@simontoth/best-way-to-manage-your-dotfiles-2c45bb280049\"\u003eBest way to manage your dotfiles\u003c/a\u003e,也比较接近我的观念。还有这篇也值得参考:\u003ca href=\"https://medium.com/@simontoth/best-way-to-manage-your-dotfiles-2c45bb280049\"\u003eBest way to manage your dotfiles\u003c/a\u003e\u003c/p\u003e\u003cp\u003e参考上面的思路,对dotfiles的管理可以帮你\u003cdel\u003e在你电脑炸了的时候\u003c/del\u003e快速重建你的环境配置,以及回溯以前的配置文件,又或者是同步你的环境到其他机器上。舒适度拉满.jpg\u003c/p\u003e\u003ch4 id=\"数据\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E6%95%B0%E6%8D%AE\" class=\"headerlink\" title=\"数据\"\u003e\u003c/a\u003e数据\u003c/h4\u003e\u003cp\u003e这部分我做的最早。不过方案嘛,主打一个能用就行。\u003c/p\u003e\u003cp\u003e具体而言,首先在各个需要备份的目录下写一个\u003ccode\u003ebackup.sh\u003c/code\u003e来生成要备份的文件,比如这个:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#!/bin/bash\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eFNAME=\u003cspan class=\"string\"\u003e\u0026#34;[backup]mc-server-\u003cspan class=\"variable\"\u003e$NAME\u003c/span\u003e-\u003cspan class=\"subst\"\u003e$(date +%Y%m%d%H%M%S)\u003c/span\u003e.zip\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eNAME=\u003cspan class=\"string\"\u003e\u0026#34;my-server\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ezip -qr \u003cspan class=\"variable\"\u003e$FNAME\u003c/span\u003e \u003cspan class=\"variable\"\u003e$NAME\u003c/span\u003e/\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"variable\"\u003e$FNAME\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e注意,必须输出生成的文件名称,后面有用。\u003c/p\u003e\u003cp\u003e然后随便找个地方写个脚本:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#!/bin/bash\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 使用Bash实现的自动备份工具\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 注意,绝对不能备份当前目录,不然会产生无限递归\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eBACKUP_DIR=$(\u003cspan class=\"built_in\"\u003edirname\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$0\u003c/span\u003e\u0026#34;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eset\u003c/span\u003e -e \u003cspan class=\"comment\"\u003e# 在出现错误时自动退出\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eset\u003c/span\u003e -u \u003cspan class=\"comment\"\u003e# 在使用未定义的变量时自动退出\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eset\u003c/span\u003e -o pipefail \u003cspan class=\"comment\"\u003e# 在管道中的任何一个命令出错时自动退出\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e IFS= \u003cspan class=\"built_in\"\u003eread\u003c/span\u003e -r line; \u003cspan class=\"keyword\"\u003edo\u003c/span\u003e \u003cspan class=\"comment\"\u003e# 循环处理每一个备份任务\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e [[ -z \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$line\u003c/span\u003e\u0026#34;\u003c/span\u003e || \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$line\u003c/span\u003e\u0026#34;\u003c/span\u003e =~ ^\u003cspan class=\"comment\"\u003e# ]]; then # 不执行注释和空行\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003econtinue\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003efi\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"comment\"\u003e# 使用awk得到任务参数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e SOURCE=$(awk -F, \u003cspan class=\"string\"\u003e\u0026#39;{print $1}\u0026#39;\u003c/span\u003e \u0026lt;\u0026lt;\u0026lt; \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$line\u003c/span\u003e\u0026#34;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e TARGET=$(awk -F, \u003cspan class=\"string\"\u003e\u0026#39;{print $2}\u0026#39;\u003c/span\u003e \u0026lt;\u0026lt;\u0026lt; \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$line\u003c/span\u003e\u0026#34;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e MAX=$(awk -F, \u003cspan class=\"string\"\u003e\u0026#39;{print $3}\u0026#39;\u003c/span\u003e \u0026lt;\u0026lt;\u0026lt; \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$line\u003c/span\u003e\u0026#34;\u003c/span\u003e) \u003cspan class=\"comment\"\u003e# 最大保留备份数量\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;[\u003cspan class=\"subst\"\u003e$(date)\u003c/span\u003e] Backing up \u003cspan class=\"variable\"\u003e$SOURCE\u003c/span\u003e to \u003cspan class=\"variable\"\u003e$TARGET\u003c/span\u003e with max \u003cspan class=\"variable\"\u003e$MAX\u003c/span\u003e items\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$SOURCE\u003c/span\u003e\u0026#34;\u003c/span\u003e \u0026amp;\u0026amp; ./backup.sh | xargs \u003cspan class=\"built_in\"\u003emv\u003c/span\u003e -t \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$TARGET\u003c/span\u003e\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;[\u003cspan class=\"subst\"\u003e$(date)\u003c/span\u003e] Backup source \u003cspan class=\"variable\"\u003e$SOURCE\u003c/span\u003e completed\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$TARGET\u003c/span\u003e\u0026#34;\u003c/span\u003e \u0026amp;\u0026amp; \u003cspan class=\"built_in\"\u003els\u003c/span\u003e -t | \u003cspan class=\"built_in\"\u003etail\u003c/span\u003e -n +$((MAX+\u003cspan class=\"number\"\u003e1\u003c/span\u003e)) | xargs \u003cspan class=\"built_in\"\u003erm\u003c/span\u003e -f\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003edone\u003c/span\u003e \u0026lt; \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$BACKUP_DIR\u003c/span\u003e/config.csv\u0026#34;\u003c/span\u003e \u003cspan class=\"comment\"\u003e# 备份任务配置数据位于脚本所在目录\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e注释比较详细就不细说了。接下来在同级目录下\u003ccode\u003etouch config.csv\u003c/code\u003e来保存备份条目信息,举个例子:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e# src,target,max-items\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e/home/xeonds/mc-server,/mnt/c/backup/mc-server-backup/atelier-of-zimin,4\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后把上面的脚本加入\u003ccode\u003ecrontab\u003c/code\u003e中定时运行:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e0 4 * * * output=$(/home/xeonds/backup/backup.sh); pushplus \u003cspan class=\"string\"\u003e\u0026#34;自动备份任务完成\u0026#34;\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$output\u003c/span\u003e\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面的就是我正在用的的自动备份方案,\u003ccode\u003epushplus\u003c/code\u003e参考我写的Bash学习笔记。\u003c/p\u003e\u003cp\u003e总体就突出一个刚好能用。\u003c/p\u003e\u003cp\u003e另外我记得好像推荐\u003ccode\u003ersync\u003c/code\u003e做增量备份的来着,不过我的这些数据可能不太适合增量备份所以没用。如果是照片一类的文件,倒是很适合rsync来处理。回头可以抽空升级下这个脚本。\u003c/p\u003e\u003ch4 id=\"备份服务器\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E5%A4%87%E4%BB%BD%E6%9C%8D%E5%8A%A1%E5%99%A8\" class=\"headerlink\" title=\"备份服务器\"\u003e\u003c/a\u003e备份服务器\u003c/h4\u003e\u003cp\u003e在继续阅读之前,\u003cstrong\u003e永远保证数据安全,root的无上权限永远意味着使用者的责任,按下回车之前一定再三检查指令!!!\u003c/strong\u003e\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003essh username@server_ip \u003cspan class=\"string\"\u003e\u0026#34;sudo dd if=/dev/sdX bs=4M status=progress\u0026#34;\u003c/span\u003e | \u003cspan class=\"built_in\"\u003edd\u003c/span\u003e of=/path/to/local/backup/server_root.img bs=4M\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面的指令,将远端服务器的一个分区直接备份到本地的一个文件中,块级别拷贝,安全可靠,就是\u003ccode\u003edd\u003c/code\u003e指令特别危险,得谨慎使用。\u003c/p\u003e\u003cp\u003e还原的时候,在目标计算机上启动Live CD进入一个临时系统,挂载磁盘然后用合适的指令还原数据:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003edd\u003c/span\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e=/path/to/local/backup/server_root.img bs=4M status=progress | ssh username@new_server_ip \u003cspan class=\"string\"\u003e\u0026#34;sudo dd of=/dev/sdY bs=4M status=progress\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e如果是同一服务器备份还原,那还原之后直接用就行了。但是如果服务器硬件不一致的话,那就得重新配置一些东西了。\u003c/p\u003e\u003col\u003e\u003cli\u003e保证启动配置正确\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e我用的是GRUB,解决方案如下。基本就是重新安装然后更新引导项。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# Assuming /mnt is the mount point of the restored system\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo mount /dev/sdY1 /mnt \u003cspan class=\"comment\"\u003e# Mount the root partition\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo mount --\u003cspan class=\"built_in\"\u003ebind\u003c/span\u003e /dev /mnt/dev\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo mount --\u003cspan class=\"built_in\"\u003ebind\u003c/span\u003e /proc /mnt/proc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo mount --\u003cspan class=\"built_in\"\u003ebind\u003c/span\u003e /sys /mnt/sys\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo \u003cspan class=\"built_in\"\u003echroot\u003c/span\u003e /mnt /bin/bash\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003egrub-install /dev/sdY\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eupdate-grub\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003col start=\"2\"\u003e\u003cli\u003e磁盘大小恢复\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e使用\u003ccode\u003edd\u003c/code\u003e恢复有一个问题,就是如果新的系统盘变大了,那还原之后系统可能还以为大小和以前一样。这种情况就需要:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo resize2fs /dev/sdY1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003edf\u003c/span\u003e -h \u003cspan class=\"comment\"\u003e# check whether the disk size covers the entire partition\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e完事之后可能还需要用\u003ccode\u003egparted\u003c/code\u003e之类的东西变一下磁盘大小。\u003c/p\u003e\u003col start=\"3\"\u003e\u003cli\u003e更新磁盘UUID\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e这玩意其实其他地方也会需要,比如硬盘\u003ccode\u003eUUID\u003c/code\u003e因为各种玄学原因变化了。\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo blkid /dev/sdY1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo vi /etc/fstab \u003cspan class=\"comment\"\u003e# 更新其中对应设备的UUID\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e另外就是如果在\u003ccode\u003e/etc/default/grub\u003c/code\u003e里边的\u003ccode\u003eGRUB_CMDLINE_LINUX\u003c/code\u003e里边也指定了,那也得改成对应的。改完之后\u003ccode\u003esudo update-grub\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e完事重启,应该就能正常使用了。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e如果服务器是全新安装,并且采用UEFI启动的话,那必须手动重建EFI分区,而且它得是硬盘的第一个分区。详细参考这里:\u003ca href=\"https://arch.icekylin.online/guide/rookie/basic-install-detail.html#%F0%9F%86%95-%E5%85%A8%E6%96%B0%E5%AE%89%E8%A3%85\"\u003e全新安装 - archlinux简明指南\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e不过我自己迁移的时候因为几块硬盘倒来倒去太麻烦,索性就直接重装系统了。迁移之后,对于之前的数据恢复,找到那个备份生成的.img文件,用下面的指令挂载然后恢复数据就行:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo mount -o ro,noload server-old.img ./old/\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面的镜像和要挂载的目录改成你自己需要的就行。要迁移的项目就下面几个:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e名称\u003c/th\u003e\u003cth\u003e路径\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003ecrontab\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e/etc/cron.*/\u003c/code\u003e和\u003ccode\u003ecrontab -l\u003c/code\u003e的内容\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ehome下的各种服务\u003c/td\u003e\u003ctd\u003e~/\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e各种自定义脚本\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e/usr/local/bin\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch3 id=\"硬件安全\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E7%A1%AC%E4%BB%B6%E5%AE%89%E5%85%A8\" class=\"headerlink\" title=\"硬件安全\"\u003e\u003c/a\u003e硬件安全\u003c/h3\u003e\u003cp\u003e首当其冲就是硬盘安全。这方面可以用\u003ccode\u003esmartctl\u003c/code\u003e来定期监测SMART信息确认磁盘状态。我试了下,好像ESXi里边我映射的硬盘也支持检测SMART信息。这里也可以写个脚本定期监测并发送监测报告\u003cdel\u003e此处可本\u003c/del\u003e。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e天天脚本脚本,那么\u003cdel\u003e你们程序员移一定都是足控吧.jpg\u003c/del\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e其他的嘛……暂时莫得啥需求。\u003c/p\u003e\u003ch3 id=\"数据管理\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E6%95%B0%E6%8D%AE%E7%AE%A1%E7%90%86\" class=\"headerlink\" title=\"数据管理\"\u003e\u003c/a\u003e数据管理\u003c/h3\u003e\u003cp\u003e很喜欢Bash的一句话:\u003ccode\u003eman bash\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e如何整理磁盘上的文件?问问\u003ccode\u003emv, cp, ls, rm, cat, grep, sed, awk, xargs\u003c/code\u003e;然后,用bash把它们拼起来就行。只要你想,你可以编写出任何脚本来整理你的所有文件。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eTODO:具体的脚本太多了,这里地方小,写不下(溜\u003c/p\u003e\u003c/blockquote\u003e\u003chr/\u003e\u003cblockquote\u003e\u003cp\u003e2024.1.4:update\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e很早之前就整上这个Windows Server 2012 R2数据中心版本了,之前一直纯当Windows用的,今天发现Windows Server Datacenter确实是有一些很便利数据中心管理的feature,其中最让我心动的无疑是它的Deduplication功能。这个部分作为服务器的可选功能,需要在服务器管理面板手动添加,而且微软的东西的一个好处就是文档有中文而且相对比较完善,参考\u003ca href=\"https://learn.microsoft.com/zh-cn/windows-server/storage/data-deduplication/install-enable\"\u003e安装和启用数据删除\u003c/a\u003e。虽然上边标注的适用版本里边好像没有Windows Server 2012 R2 Datacenter,但是我自己实测是支持这个版本的。\u003c/p\u003e\u003cp\u003e具体的开启步骤上面的参考链接里边有,这里说下我的踩坑经历。首先就是这玩意的文件系统只支持NTFS和ReFS两种,并且必须是本地的磁盘(但是我主力Linux,而且文件比较乱,还没把磁盘重新分配给Windows),也就是说必须在ESXi里边把磁盘分配给Windows才能享受数据压缩。其次就是这个压缩是以块为粒度的,根据微软官方的说法而言,能够节省的空间确实不少,适合文件服务器和给Hyper-V服务器用,能显著节省空间。另外这个玩意是个定期运行的服务,服务的注意事项它也得注意。\u003c/p\u003e\u003cp\u003e以及除了这个本体之外,还有一个\u003ccode\u003eddpeval.exe\u003c/code\u003e是用来评估数据压缩效果的。可以先跑一次这个然后再根据实际情况决策是否启用数据压缩。还有就是这东西作为重型I/O操作,很吃内存和CPU,所以启用数据去重服务的时候得注意根据实际情况限制它可以使用的资源量。\u003c/p\u003e\u003cp\u003e哎,要是这玩意有开源实现就好了,直接挂Linux底下定期执行。\u003c/p\u003e\u003ch3 id=\"自动运维\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E8%87%AA%E5%8A%A8%E8%BF%90%E7%BB%B4\" class=\"headerlink\" title=\"自动运维\"\u003e\u003c/a\u003e自动运维\u003c/h3\u003e\u003cp\u003e都Linux了不得写个脚本帮自己干活?而且还有其他好用的工具呢,首当其冲的还得是\u003ccode\u003esystemctl\u003c/code\u003e,\u003ccode\u003ecrontab\u003c/code\u003e,一个自动管理后台服务,一个自动运行任务,堪称运维两大法器。\u003ccode\u003esystemctl\u003c/code\u003e多用来自动启动和重启后台服务,\u003ccode\u003ecrontab\u003c/code\u003e作为一个定时器,基本跟时间相关的任务都能干,比如\u003cdel\u003e自动报时\u003c/del\u003e,定时清理,定时重启,定时更新,定时打卡,定时发送状态简报,定时发送邮件,\u003cdel\u003e定时煮饭\u003c/del\u003e等等你能想到想不到的。\u003c/p\u003e\u003cp\u003e另外,还有\u003ccode\u003ebash\u003c/code\u003e和\u003ccode\u003ealias\u003c/code\u003e,前者不光能跟你\u003cdel\u003e打\u003c/del\u003e交互,还能连接很多强大的工具;后者不光是个别名,还能帮你hook各种命令,给它们加点小功能。这部分建议多读读命令行的艺术,以及\u003ccode\u003eman bash\u003c/code\u003e的内容,更重要的是得多用。\u003c/p\u003e\u003cp\u003e我整完这些之后,感觉还是不太过瘾。毕竟这些功能全能点的面板估计也能做到,而且我也不可能到处因为一点小事就ssh到服务器上吧)\u003c/p\u003e\u003cp\u003e在接触了低代码表单的思想之后,我就又想造轮子了:搓个工具,借助低代码系统,写出自己的运维管理面板,最好是实现一个页面一个配置文件,改配置文件就更新对应页面和后面调用的命令的程度。\u003c/p\u003e\u003cp\u003e借助这个工具倒是可以实现很轻量,而且完全自由的服务器控制面板,而且无需依赖,可定制度拉满那种。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eTODO:这里也挖个坑立个flag\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e上面那段倒是偏离自动运维这个话题了。说回正题:除了上面提到的\u003ccode\u003esystemd\u003c/code\u003e和\u003ccode\u003ecrontab\u003c/code\u003e之外,还可以让系统监听一些事件,并做出即时响应。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e这里先放个UNIX哲学()\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e比如让系统读取某进程的日志输出,如果输出带有ERROR等字样,就发送警告给运维,或者执行其他的动作。,我们可以将触发的部分和执行的部分分离,让系统对不同的问题做出响应。比如收到了内存不足的警报,那就自动执行\u003ccode\u003esudo echo 3 \u0026gt; /proc/sys/vm/drop_caches\u003c/code\u003e来释放内存,还是过高的话就报警\u003cdel\u003e并随机kill一个幸运进程\u003c/del\u003e;比如有个\u003cdel\u003e若治\u003c/del\u003e同事又把你数据库炸了给你发邮件求助,那系统就直接roll back数据库;再比如监测到系统设备panic了,直接发送警报并紧急关机系统防止进一步损失;还可以接收UPS的断电信号,发送警报并迅速关机来避免更大的损失;有什么登录失败的/疑似端口爆破的,直接自动ban了它的IP;再比如系统流量激增,直接报警;再比如ban了\u003ccode\u003esudo rm -rf /\u003c/code\u003e这种敏感操作;甚至自动审核各种请求等等。只有想不到,没有做不到\u003cdel\u003e除了生孩子\u003c/del\u003e。\u003c/p\u003e\u003cp\u003e这里重点介绍下\u003ccode\u003eSystemd\u003c/code\u003e。其中的工具对于自动化运维来说很常用。大多是现代linux都内置了systemd的相关组件,并使用systemd-init替换了原来的sysv-init作为系统引导服务。\u003c/p\u003e\u003cp\u003eSystemd是一组工具合集,其中包含了70多个常用的系统基础工具,覆盖系统服务管理,系统启动管理,网络管理,计划任务等等。\u003c/p\u003e\u003cp\u003e首先值得注意的是systemd对待\u003ccode\u003e$()\u003c/code\u003e的行为。在bash中,这个符号表示执行括号中的命令,并将这个命令原地替换为执行的结果;但是在systemd中,它的行为和makefile中一致:表示变量引用。因此,在编写systemd服务时注意含义区别。\u003c/p\u003e\u003cp\u003e另外就是单元文件存储的位置。单元可以分为三类,一类是系统级单元,一类是本地管理员管理的系统级单元,一类是用户级单元。三类单元分别是系统启动时使用的单元,以系统权限运行的单元,以及非特权用户级别运行的单元,路径分别位于:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e/lib/systemd/system/\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003e/etc/systemd/system/\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003e/etc/systemd/user/\u003c/code\u003e 或 \u003ccode\u003e~/.config/systemd/user/\u003c/code\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"systemd-timer\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#systemd-timer\" class=\"headerlink\" title=\"systemd-timer\"\u003e\u003c/a\u003esystemd-timer\u003c/h4\u003e\u003cp\u003e\u003ccode\u003esystemd-timer\u003c/code\u003e 是 systemd 中的一个重要组件。它允许用户定义和管理定时任务,使得系统能够在预定时间执行特定的操作。作为crontab的替代品比较不错,有完善的日志支持,统一的服务管理,依赖管理等。\u003c/p\u003e\u003col\u003e\u003cli\u003e定时器单元(Timer Units)\u003cbr/\u003e\u003ccode\u003esystemd-timer\u003c/code\u003e 使用单元文件(unit files)来描述要执行的定时任务。定时器单元文件的命名规则为 \u003ccode\u003e.timer\u003c/code\u003e,通常位于 \u003ccode\u003e/etc/systemd/system/\u003c/code\u003e 目录下。\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e以下是一个简单的定时器单元文件的示例,用于每天执行一个备份任务:\u003c/p\u003e\u003cfigure class=\"highlight ini\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Unit]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eDescription\u003c/span\u003e=Backup Timer\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Timer]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eOnCalendar\u003c/span\u003e=daily\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003ePersistent\u003c/span\u003e=\u003cspan class=\"literal\"\u003etrue\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Install]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eWantedBy\u003c/span\u003e=timers.target\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e[Unit]\u003c/code\u003e 部分描述了定时器的基本信息。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e[Timer]\u003c/code\u003e 部分定义了定时器的执行计划。在这个示例中,\u003ccode\u003eOnCalendar=daily\u003c/code\u003e 表示每天执行一次任务。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e[Install]\u003c/code\u003e 部分定义了单元文件的安装信息。\u003c/li\u003e\u003c/ul\u003e\u003col start=\"2\"\u003e\u003cli\u003e常用的 systemctl 命令\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e启动一个定时器:\u003ccode\u003esudo systemctl start mytimer.timer\u003c/code\u003e\u003c/li\u003e\u003cli\u003e停止一个定时器:\u003ccode\u003esudo systemctl stop mytimer.timer\u003c/code\u003e\u003c/li\u003e\u003cli\u003e查看定时器状态:\u003ccode\u003esudo systemctl status mytimer.timer\u003c/code\u003e\u003c/li\u003e\u003cli\u003e查看定时器日志:\u003ccode\u003ejournalctl -u mytimer.timer\u003c/code\u003e\u003c/li\u003e\u003c/ul\u003e\u003col start=\"3\"\u003e\u003cli\u003e\u003cp\u003e持久性定时器\u003cbr/\u003e通过设置 \u003ccode\u003ePersistent=true\u003c/code\u003e,可以使定时器在错过预定执行时间后立即触发任务执行。这对于保证任务的执行是非常有用的。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e使用 OnCalendar 属性\u003cbr/\u003e\u003ccode\u003eOnCalendar\u003c/code\u003e 属性允许您以灵活的方式定义定时器的执行时间。您可以指定特定的日期、每周、每月甚至每小时执行任务的时间。\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"systemd-service\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#systemd-service\" class=\"headerlink\" title=\"systemd-service\"\u003e\u003c/a\u003esystemd-service\u003c/h4\u003e\u003cp\u003e服务管理器是systemd中最核心的部分之一。systemd 的服务管理器允许用户管理系统上运行的服务,这些服务可以是系统进程、网络服务、后台任务等等。\u003c/p\u003e\u003col\u003e\u003cli\u003e服务单元(Service Units)\u003cbr/\u003esystemd 使用单元文件(unit files)来描述要管理的各种资源,其中最常见的就是服务单元。服务单元文件以 \u003ccode\u003e.service\u003c/code\u003e 扩展名结尾,其中包含了服务的配置信息以及其行为。服务单元文件通常位于 \u003ccode\u003e/etc/systemd/system/\u003c/code\u003e 目录下,但也可以位于其他位置。\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e下面是一个简单的示例服务单元文件,用于启动一个假设的 Web 服务器:\u003c/p\u003e\u003cfigure class=\"highlight ini\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Unit]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eDescription\u003c/span\u003e=My Web Server\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eAfter\u003c/span\u003e=network.target\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Service]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eExecStart\u003c/span\u003e=/usr/bin/my_web_server\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eRestart\u003c/span\u003e=always\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Install]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eWantedBy\u003c/span\u003e=multi-user.target\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e[Unit]\u003c/code\u003e 部分描述了单元的基本信息,如描述和依赖关系。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e[Service]\u003c/code\u003e 部分定义了服务的执行方式和行为。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e[Install]\u003c/code\u003e 部分定义了单元文件如何被安装。\u003c/li\u003e\u003c/ul\u003e\u003col start=\"2\"\u003e\u003cli\u003e常用命令\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e启动一个服务:\u003ccode\u003esudo systemctl start servicename\u003c/code\u003e\u003c/li\u003e\u003cli\u003e停止一个服务:\u003ccode\u003esudo systemctl stop servicename\u003c/code\u003e\u003c/li\u003e\u003cli\u003e重启一个服务:\u003ccode\u003esudo systemctl restart servicename\u003c/code\u003e\u003c/li\u003e\u003cli\u003e查看服务状态:\u003ccode\u003esudo systemctl status servicename\u003c/code\u003e\u003c/li\u003e\u003cli\u003e启用一个服务(开机启动):\u003ccode\u003esudo systemctl enable servicename\u003c/code\u003e\u003c/li\u003e\u003cli\u003e禁用一个服务(开机不启动):\u003ccode\u003esudo systemctl disable servicename\u003c/code\u003e\u003c/li\u003e\u003c/ul\u003e\u003col start=\"3\"\u003e\u003cli\u003e\u003cp\u003e日志和故障排除\u003cbr/\u003e可以使用 \u003ccode\u003ejournalctl\u003c/code\u003e 命令来查看 systemd 的日志信息,例如:\u003ccode\u003ejournalctl -u servicename\u003c/code\u003e 将显示特定服务的日志。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e高级功能\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e定义服务间的依赖关系\u003cbr/\u003e在服务单元文件中,可以使用 \u003ccode\u003eRequires\u003c/code\u003e 和 \u003ccode\u003eAfter\u003c/code\u003e 来定义服务之间的依赖关系。\u003ccode\u003eRequires\u003c/code\u003e 指定了其他单元,表示该服务依赖于指定的单元;\u003ccode\u003eAfter\u003c/code\u003e 则指定了在何时启动该服务。\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight ini\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Unit]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eDescription\u003c/span\u003e=My Service\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eRequires\u003c/span\u003e=network.target\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eAfter\u003c/span\u003e=network.target\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e设置资源限制\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e通过在服务单元文件中使用 \u003ccode\u003eLimitCPU\u003c/code\u003e, \u003ccode\u003eLimitMEM\u003c/code\u003e, \u003ccode\u003eLimitNOFILE\u003c/code\u003e 等参数,可以限制服务的资源使用。这有助于防止某个服务占用过多的系统资源。\u003c/p\u003e\u003cfigure class=\"highlight ini\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Service]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eLimitCPU\u003c/span\u003e=\u003cspan class=\"number\"\u003e50\u003c/span\u003e%\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eLimitMEM\u003c/span\u003e=\u003cspan class=\"number\"\u003e512\u003c/span\u003eM\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eLimitNOFILE\u003c/span\u003e=\u003cspan class=\"number\"\u003e10000\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e设置环境变量\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e有时,服务需要使用特定的环境变量才能正常运行。您可以在服务单元文件的 \u003ccode\u003e[Service]\u003c/code\u003e 部分中使用 \u003ccode\u003eEnvironment\u003c/code\u003e 参数来设置这些环境变量。\u003c/p\u003e\u003cfigure class=\"highlight ini\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"section\"\u003e[Service]\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eEnvironment\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;VAR1=value1\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eEnvironment\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;VAR2=value2\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"性能\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E6%80%A7%E8%83%BD\" class=\"headerlink\" title=\"性能\"\u003e\u003c/a\u003e性能\u003c/h3\u003e\u003cp\u003e最近升级成32G DDR4 ECC内存了,所以想着也不用swap了于是就关了:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo swapoff /swap.img \u003cspan class=\"comment\"\u003e# 这里需要改成你的swap文件\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# sudo rm /swap.img # 可选\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e至于关不关,区别似乎不大,但是确实节省了我一些磁盘空间,理论上能延缓磁盘使用寿命。具体还是得看服务器日常内存占用情况而决定。\u003c/p\u003e\u003ch3 id=\"权限管理\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86\" class=\"headerlink\" title=\"权限管理\"\u003e\u003c/a\u003e权限管理\u003c/h3\u003e\u003cp\u003e服务器平时总是空着的,所以打算把服务器给几个哥们也分配个号。想来想去虚拟化的话性能损耗比较大,不如上用户组来进行权限管理,刚好也多一个深入学习Linux系统的机会。\u003c/p\u003e\u003cp\u003e首先是创建用户组:\u003ccode\u003esudo groupadd dim0\u003c/code\u003e,创建完成后再更改用户组权限即可。\u003c/p\u003e\u003cp\u003e然后是创建所有用户:\u003ccode\u003efor user in {tesla,zimin,holynia,ray}; do sudo useradd -m -G dim0 $user; done\u003c/code\u003e,创建用户的同时,将他们加入\u003ccode\u003edim0\u003c/code\u003e用户组,并且自动为他们创建用户目录。\u003c/p\u003e\u003cp\u003e完成之后就是修改用户组的权限了。他们创建的时候就不在\u003ccode\u003ewheel\u003c/code\u003e用户组中,所以没有\u003ccode\u003esudo\u003c/code\u003e权限。\u003c/p\u003e\u003cp\u003e对于需要禁止访问的目录,更改权限和所有权就行:\u003c/p\u003e\u003cfigure class=\"highlight plaintext\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esudo chown xeonds:wheel /path/2/dir\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo chmod go-x /path/2/dir\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"尾声\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/#%E5%B0%BE%E5%A3%B0\" class=\"headerlink\" title=\"尾声\"\u003e\u003c/a\u003e尾声\u003c/h2\u003e\u003cp\u003e到这里,我的服务器就基本折腾好了。我现在拥有一个数据安全性相对较高的NAS,一个日常开发可用的自动化编译/部署服务,一个代码托管和备份系统,一个7x24可用的mc服务器,一个可用于数据科学/AI学习的在线算力,一个可以随时启动的,一个可以租借给他人的docker vm实例集群,甚至是一个会自己维护自己,会帮我处理各种浪费时间的重复任务,并且易于灾难恢复和迁移的系统,以及一个Linux新手应该具备的系统管理心得经验。\u003c/p\u003e\u003cp\u003e可以说,这些投入,物超所值。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/07/21/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/ESXi%E6%8A%98%E8%85%BE%E5%B0%8F%E8%AE%B0/"},{"title":"关于前端Blob下载那点事","time":"2023-07-11T14:16:38Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"背景\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%85%B3%E4%BA%8E%E5%89%8D%E7%AB%AFBlob%E4%B8%8B%E8%BD%BD%E9%82%A3%E7%82%B9%E4%BA%8B/#%E8%83%8C%E6%99%AF\" class=\"headerlink\" title=\"背景\"\u003e\u003c/a\u003e背景\u003c/h2\u003e\u003cp\u003e最近做一个项目,后端返回一个Excel表格给前端下载,前端应该使用Blob将文件保存并下载下来。可是前端这里试了半天,数据大小没问题,就是一直下不下来。后来解决了好几个问题之后才成功解决了这个下载问题。\u003c/p\u003e\u003ch2 id=\"问题1-请求头\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%85%B3%E4%BA%8E%E5%89%8D%E7%AB%AFBlob%E4%B8%8B%E8%BD%BD%E9%82%A3%E7%82%B9%E4%BA%8B/#%E9%97%AE%E9%A2%981-%E8%AF%B7%E6%B1%82%E5%A4%B4\" class=\"headerlink\" title=\"问题1-请求头\"\u003e\u003c/a\u003e问题1-请求头\u003c/h2\u003e\u003cp\u003e查找相关资料后,发现似乎错误的请求头是引发这个问题的一个原因。随后就改了请求部分的代码,加上了请求头的配置:\u003c/p\u003e\u003cfigure class=\"highlight js\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title function_\"\u003eserviceAxios\u003c/span\u003e({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003emethod\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;POST\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003eurl\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;xxx\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003eheaders\u003c/span\u003e: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"string\"\u003e\u0026#39;Content-Type\u0026#39;\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;application/vnd.ms-excel\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eToken\u003c/span\u003e: \u003cspan class=\"variable language_\"\u003elocalStorage\u003c/span\u003e.\u003cspan class=\"title function_\"\u003egetItem\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;token\u0026#39;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e },\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003edata\u003c/span\u003e: \u003cspan class=\"variable language_\"\u003ethis\u003c/span\u003e.\u003cspan class=\"property\"\u003eform_data\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e })\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e .\u003cspan class=\"title function_\"\u003ethen\u003c/span\u003e(\u003cspan class=\"function\"\u003e(\u003cspan class=\"params\"\u003eres\u003c/span\u003e) =\u0026gt;\u003c/span\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"variable language_\"\u003ethis\u003c/span\u003e.\u003cspan class=\"property\"\u003eisShow\u003c/span\u003e = \u003cspan class=\"literal\"\u003efalse\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title function_\"\u003edownload\u003c/span\u003e(\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e res,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"string\"\u003e\u0026#39;application/vnd.ms-excel\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"variable language_\"\u003ethis\u003c/span\u003e.\u003cspan class=\"property\"\u003eform_data\u003c/span\u003e.\u003cspan class=\"property\"\u003ename\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e )\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eElMessage\u003c/span\u003e.\u003cspan class=\"title function_\"\u003esuccess\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;下载成功\u0026#39;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e })\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e .\u003cspan class=\"title function_\"\u003ecatch\u003c/span\u003e(\u003cspan class=\"function\"\u003e(\u003cspan class=\"params\"\u003eerr\u003c/span\u003e) =\u0026gt;\u003c/span\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eElMessage\u003c/span\u003e.\u003cspan class=\"title function_\"\u003eerror\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;下载失败:\u0026#39;\u003c/span\u003e + err)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e })\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e但是这样不仅下载的内容打不开,而且下载本身还报错了:\u003cstrong\u003eHTTP 415:Unsupported Media Type\u003c/strong\u003e。它的简介如下:\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e415 Unsupported Media Type\u003c/code\u003e\u003c/strong\u003e 是一种 HTTP 协议的错误状态代码,表示服务器由于不支持其有效载荷的格式,从而拒绝接受客户端的请求。\u003c/p\u003e\u003cp\u003e格式问题的出现有可能源于客户端在 \u003ca href=\"https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Type\"\u003e\u003ccode\u003eContent-Type\u003c/code\u003e\u003c/a\u003e 或 \u003ca href=\"https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Encoding\"\u003e\u003ccode\u003eContent-Encoding\u003c/code\u003e\u003c/a\u003e 首部中指定的格式,也可能源于直接对负载数据进行检测的结果。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e因此很明显,我应该是设置错了HTTP请求标头。于是查阅了HTTP请求标头的几个字段,发现我应该是搞反了\u003ccode\u003eContent-Type\u003c/code\u003e和\u003ccode\u003eAccept\u003c/code\u003e的意思。\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003eContent-Type\u003c/strong\u003e:自己发送给对方的内容的MIME类型\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eAccept\u003c/strong\u003e:自己能接受的内容的MIME类型\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e常见的MIME类型( \u003cstrong\u003eMultipurpose Internet Mail Extensions,媒体类型\u003c/strong\u003e)如下:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e扩展名\u003c/th\u003e\u003cth\u003e文档类型\u003c/th\u003e\u003cth\u003eMIME 类型\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.aac\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eAAC audio\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eaudio/aac\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.abw\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://en.wikipedia.org/wiki/AbiWord\"\u003eAbiWord\u003c/a\u003e document\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-abiword\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.arc\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eArchive document (multiple files embedded)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-freearc\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.avi\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eAVI: Audio Video Interleave\u003c/td\u003e\u003ctd\u003e\u003ccode\u003evideo/x-msvideo\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.azw\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eAmazon Kindle eBook format\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.amazon.ebook\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.bin\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eAny kind of binary data\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/octet-stream\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.bmp\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eWindows OS/2 Bitmap Graphics\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eimage/bmp\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.bz\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eBZip archive\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-bzip\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.bz2\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eBZip2 archive\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-bzip2\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.csh\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eC-Shell script\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-csh\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.css\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eCascading Style Sheets (CSS)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003etext/css\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.csv\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eComma-separated values (CSV)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003etext/csv\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.doc\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMicrosoft Word\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/msword\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.docx\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMicrosoft Word (OpenXML)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.openxmlformats-officedocument.wordprocessingml.document\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.eot\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMS Embedded OpenType fonts\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.ms-fontobject\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.epub\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eElectronic publication (EPUB)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/epub+zip\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.gif\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eGraphics Interchange Format (GIF)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eimage/gif\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.htm .html\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eHyperText Markup Language (HTML)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003etext/html\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.ico\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eIcon format\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eimage/vnd.microsoft.icon\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.ics\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eiCalendar format\u003c/td\u003e\u003ctd\u003e\u003ccode\u003etext/calendar\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.jar\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eJava Archive (JAR)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/java-archive\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.jpeg\u003c/code\u003e \u003ccode\u003e.jpg\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eJPEG images\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eimage/jpeg\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.js\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eJavaScript\u003c/td\u003e\u003ctd\u003e\u003ccode\u003etext/javascript\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.json\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eJSON format\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/json\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.jsonld\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eJSON-LD format\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/ld+json\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.mid\u003c/code\u003e \u003ccode\u003e.midi\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMusical Instrument Digital Interface (MIDI)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eaudio/midi\u003c/code\u003e \u003ccode\u003eaudio/x-midi\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.mjs\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eJavaScript module\u003c/td\u003e\u003ctd\u003e\u003ccode\u003etext/javascript\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.mp3\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMP3 audio\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eaudio/mpeg\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.mpeg\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMPEG Video\u003c/td\u003e\u003ctd\u003e\u003ccode\u003evideo/mpeg\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.mpkg\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eApple Installer Package\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.apple.installer+xml\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.odp\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eOpenDocument presentation document\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.oasis.opendocument.presentation\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.ods\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eOpenDocument spreadsheet document\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.oasis.opendocument.spreadsheet\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.odt\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eOpenDocument text document\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.oasis.opendocument.text\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.oga\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eOGG audio\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eaudio/ogg\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.ogv\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eOGG video\u003c/td\u003e\u003ctd\u003e\u003ccode\u003evideo/ogg\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.ogx\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eOGG\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/ogg\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.otf\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eOpenType font\u003c/td\u003e\u003ctd\u003e\u003ccode\u003efont/otf\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.png\u003c/code\u003e\u003c/td\u003e\u003ctd\u003ePortable Network Graphics\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eimage/png\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.pdf\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eAdobe \u003ca href=\"https://acrobat.adobe.com/us/en/why-adobe/about-adobe-pdf.html\"\u003ePortable Document Format\u003c/a\u003e (PDF)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/pdf\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.ppt\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMicrosoft PowerPoint\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.ms-powerpoint\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.pptx\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMicrosoft PowerPoint (OpenXML)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.openxmlformats-officedocument.presentationml.presentation\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.rar\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eRAR archive\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-rar-compressed\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.rtf\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eRich Text Format (RTF)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/rtf\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.sh\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eBourne shell script\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-sh\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.svg\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eScalable Vector Graphics (SVG)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eimage/svg+xml\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.swf\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://en.wikipedia.org/wiki/SWF\"\u003eSmall web format\u003c/a\u003e (SWF) or Adobe Flash document\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-shockwave-flash\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.tar\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eTape Archive (TAR)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-tar\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.tif .tiff\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eTagged Image File Format (TIFF)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eimage/tiff\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.ttf\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eTrueType Font\u003c/td\u003e\u003ctd\u003e\u003ccode\u003efont/ttf\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.txt\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eText, (generally ASCII or ISO 8859-\u003cem\u003en\u003c/em\u003e)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003etext/plain\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.vsd\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMicrosoft Visio\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.visio\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.wav\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eWaveform Audio Format\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eaudio/wav\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.weba\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eWEBM audio\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eaudio/webm\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.webm\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eWEBM video\u003c/td\u003e\u003ctd\u003e\u003ccode\u003evideo/webm\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.webp\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eWEBP image\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eimage/webp\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.woff\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eWeb Open Font Format (WOFF)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003efont/woff\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.woff2\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eWeb Open Font Format (WOFF)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003efont/woff2\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.xhtml\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eXHTML\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/xhtml+xml\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.xls\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMicrosoft Excel\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.ms-excel\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.xlsx\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eMicrosoft Excel (OpenXML)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.xml\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eXML\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/xml\u003c/code\u003e 代码对普通用户来说不可读 (\u003ca href=\"https://tools.ietf.org/html/rfc3023#section-3\"\u003eRFC 3023\u003c/a\u003e, section 3) \u003ccode\u003etext/xml\u003c/code\u003e 代码对普通用户来说可读 (\u003ca href=\"https://tools.ietf.org/html/rfc3023#section-3\"\u003eRFC 3023\u003c/a\u003e, section 3)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.xul\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eXUL\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/vnd.mozilla.xul+xml\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.zip\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eZIP archive\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/zip\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.3gp\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://en.wikipedia.org/wiki/3GP_and_3G2\"\u003e3GPP\u003c/a\u003e audio/video container\u003c/td\u003e\u003ctd\u003e\u003ccode\u003evideo/3gpp\u003c/code\u003e \u003ccode\u003eaudio/3gpp\u003c/code\u003e(若不含视频)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.3g2\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://en.wikipedia.org/wiki/3GP_and_3G2\"\u003e3GPP2\u003c/a\u003e audio/video container\u003c/td\u003e\u003ctd\u003e\u003ccode\u003evideo/3gpp2\u003c/code\u003e \u003ccode\u003eaudio/3gpp2\u003c/code\u003e(若不含视频)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003ccode\u003e.7z\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://en.wikipedia.org/wiki/7-Zip\"\u003e7-zip\u003c/a\u003e archive\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eapplication/x-7z-compressed\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e上面的MIME类型就是Content-Type和Accept两个字段的内容。因此,我们应该将请求头改为如下的形式:\u003c/p\u003e\u003cfigure class=\"highlight js\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eheaders\u003c/span\u003e: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eAccept\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;application/vnd.ms-excel\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"string\"\u003e\u0026#39;Content-Type\u0026#39;\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;application/json\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eToken\u003c/span\u003e: \u003cspan class=\"variable language_\"\u003elocalStorage\u003c/span\u003e.\u003cspan class=\"title function_\"\u003egetItem\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;token\u0026#39;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e},\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e然后还是出现HTTP 415错误,不过是后端返回的数据的请求头。让后端排查了下,发现是Spring的代理把请求头改成\u003ccode\u003eapplication/json\u003c/code\u003e了,所以前端这才会出现415的错误。\u003c/p\u003e\u003cp\u003e但是,还有一个小问题没解决,所以下载还是用不了。\u003c/p\u003e\u003ch2 id=\"问题2-Blob\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%85%B3%E4%BA%8E%E5%89%8D%E7%AB%AFBlob%E4%B8%8B%E8%BD%BD%E9%82%A3%E7%82%B9%E4%BA%8B/#%E9%97%AE%E9%A2%982-Blob\" class=\"headerlink\" title=\"问题2-Blob\"\u003e\u003c/a\u003e问题2-Blob\u003c/h2\u003e\u003cp\u003e改了两边的请求头并确定都没问题后,发现虽然能正常下载了,但是下载的内容Execl还是不能打开。但是最奇怪的是,APIfox下载的Excel是可以打开的。遂对比了下APIfox和我的代码下载下来的Excel文件,发现我的好像大了一点。\u003c/p\u003e\u003cp\u003e于是在搜索后,又给axios加上了\u003ccode\u003eresponseType: \u0026#39;blob\u0026#39;\u003c/code\u003e的参数,并且给生成Blob的地方也加上了\u003ccode\u003eapplication/vnd.ms-execl\u003c/code\u003e的参数。再次尝试时,下载已经能正常工作了。\u003c/p\u003e\u003cp\u003e于是我猜测,可能是下载时没有将后端返回的数据转换成Blob数据而直接存入Blob对象,引发了数据错位的问题,导致文件大了一点,并且不能正常打开。\u003c/p\u003e\u003cp\u003e修改后的代码:\u003c/p\u003e\u003cfigure class=\"highlight js\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"title function_\"\u003eserviceAxios\u003c/span\u003e({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003emethod\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;POST\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eurl\u003c/span\u003e: \u003cspan class=\"string\"\u003e`/template/export/\u003cspan class=\"subst\"\u003e${\u003cspan class=\"variable language_\"\u003ethis\u003c/span\u003e.form_data.id}\u003c/span\u003e`\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eheaders\u003c/span\u003e: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eAccept\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;application/vnd.ms-excel\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"string\"\u003e\u0026#39;Content-Type\u0026#39;\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;application/json\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eToken\u003c/span\u003e: \u003cspan class=\"variable language_\"\u003elocalStorage\u003c/span\u003e.\u003cspan class=\"title function_\"\u003egetItem\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;token\u0026#39;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e},\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003edata\u003c/span\u003e: \u003cspan class=\"variable language_\"\u003ethis\u003c/span\u003e.\u003cspan class=\"property\"\u003eform_data\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"attr\"\u003eresponseType\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#39;blob\u0026#39;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e})\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e.\u003cspan class=\"title function_\"\u003ethen\u003c/span\u003e(\u003cspan class=\"function\"\u003e(\u003cspan class=\"params\"\u003eres\u003c/span\u003e) =\u0026gt;\u003c/span\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"variable language_\"\u003ethis\u003c/span\u003e.\u003cspan class=\"property\"\u003eisShow\u003c/span\u003e = \u003cspan class=\"literal\"\u003efalse\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title function_\"\u003edownload\u003c/span\u003e(\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eres,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"string\"\u003e\u0026#39;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\u0026#39;\u003c/span\u003e,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"variable language_\"\u003ethis\u003c/span\u003e.\u003cspan class=\"property\"\u003eform_data\u003c/span\u003e.\u003cspan class=\"property\"\u003ename\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e )\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eElMessage\u003c/span\u003e.\u003cspan class=\"title function_\"\u003esuccess\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;下载成功\u0026#39;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e})\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e.\u003cspan class=\"title function_\"\u003ecatch\u003c/span\u003e(\u003cspan class=\"function\"\u003e(\u003cspan class=\"params\"\u003eerr\u003c/span\u003e) =\u0026gt;\u003c/span\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title class_\"\u003eElMessage\u003c/span\u003e.\u003cspan class=\"title function_\"\u003eerror\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;下载失败:\u0026#39;\u003c/span\u003e + err)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e})\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e这样就行了。里面的\u003ccode\u003edownload()\u003c/code\u003e是随便封装的一个下载Blob文件的工具函数,参数分别是blob数据,MIME类型和文件名。\u003c/p\u003e\u003cp\u003e关于这个\u003ccode\u003edownload\u003c/code\u003e函数的实现:\u003c/p\u003e\u003cfigure class=\"highlight javascript\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e5\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e6\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e7\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e9\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eexport\u003c/span\u003e \u003cspan class=\"keyword\"\u003edefault\u003c/span\u003e (\u003cspan class=\"attr\"\u003edata\u003c/span\u003e: any, \u003cspan class=\"attr\"\u003econtentType\u003c/span\u003e: string, \u003cspan class=\"attr\"\u003efileName\u003c/span\u003e: string) =\u0026gt; {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003econst\u003c/span\u003e downloadLink = \u003cspan class=\"variable language_\"\u003ewindow\u003c/span\u003e.\u003cspan class=\"property\"\u003edocument\u003c/span\u003e.\u003cspan class=\"title function_\"\u003ecreateElement\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e downloadLink.\u003cspan class=\"property\"\u003ehref\u003c/span\u003e = \u003cspan class=\"variable language_\"\u003ewindow\u003c/span\u003e.\u003cspan class=\"property\"\u003eURL\u003c/span\u003e.\u003cspan class=\"title function_\"\u003ecreateObjectURL\u003c/span\u003e(\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003enew\u003c/span\u003e \u003cspan class=\"title class_\"\u003eBlob\u003c/span\u003e([data], { \u003cspan class=\"attr\"\u003etype\u003c/span\u003e: contentType })\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e )\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e downloadLink.\u003cspan class=\"property\"\u003edownload\u003c/span\u003e = fileName\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"variable language_\"\u003edocument\u003c/span\u003e.\u003cspan class=\"property\"\u003ebody\u003c/span\u003e.\u003cspan class=\"title function_\"\u003eappendChild\u003c/span\u003e(downloadLink)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e downloadLink.\u003cspan class=\"title function_\"\u003eclick\u003c/span\u003e()\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"variable language_\"\u003edocument\u003c/span\u003e.\u003cspan class=\"property\"\u003ebody\u003c/span\u003e.\u003cspan class=\"title function_\"\u003eremoveChild\u003c/span\u003e(downloadLink)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch2 id=\"反思\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%85%B3%E4%BA%8E%E5%89%8D%E7%AB%AFBlob%E4%B8%8B%E8%BD%BD%E9%82%A3%E7%82%B9%E4%BA%8B/#%E5%8F%8D%E6%80%9D\" class=\"headerlink\" title=\"反思\"\u003e\u003c/a\u003e反思\u003c/h2\u003e\u003cp\u003e这学期学计网的时候,重点学的部分是物理层,数据链路层,网络层以及传输层。唯一剩下的一层应用层则因为课时压缩直接压没了(但是期末大题还是考了SMTP协议)。但是恰恰是应用层这一部分在日常前端开发中使用最多。\u003c/p\u003e\u003cp\u003e这侧面反映出来了大学教育体系的一些问题,也提醒我们,书不能看一半,趁着大学有时间,尽量让自己的知识面更加全面一些,这是绝对值得的。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/07/11/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%85%B3%E4%BA%8E%E5%89%8D%E7%AB%AFBlob%E4%B8%8B%E8%BD%BD%E9%82%A3%E7%82%B9%E4%BA%8B/"},{"title":"sed,awk与grep","time":"2023-07-10T08:17:33Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"前言\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/sed%EF%BC%8Cawk%E4%B8%8Egrep/#%E5%89%8D%E8%A8%80\" class=\"headerlink\" title=\"前言\"\u003e\u003c/a\u003e前言\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e关于标题:实际上,sed,awk和grep有一个共同的爹叫\u003cstrong\u003eed\u003c/strong\u003e。sed和awk的区别是控制指令不太一样,而grep是起源于ed的一个指令:\u003ccode\u003eg/re/p\u003c/code\u003e,即\u003cstrong\u003e全局-正则表达式匹配-打印\u003c/strong\u003e,相当于把这个ed指令提取出来专门用于编辑。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e之前学了Vim,不过Vim不太容易和其他命令行工具结合实现一些自动化任务。随后我将目光投向了sed和awk,它们二者都满足这个条件:\u003cstrong\u003e可以将一个源的数据经过一些预定义的变换,输出到另一个源中\u003c/strong\u003e。这其中,我对\u003ccode\u003esed\u003c/code\u003e相对更加熟悉一些,awk我感觉可能更复杂一些,而sed只需要正则表达式就行。比如我之前接触到的第一个sed表达式:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esed -i \u003cspan class=\"string\"\u003e\u0026#39;s@^\\(deb.*stable main\\)$@#\\1\\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/apt/termux-main stable main@\u0026#39;\u003c/span\u003e \u003cspan class=\"variable\"\u003e$PREFIX\u003c/span\u003e/etc/apt/sources.list\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e上面那段是termux清华源的换源指令。单就命令格式上来看,我觉得和Vim的\u003ccode\u003e%s\u003c/code\u003e替换表达式比较接近。\u003c/p\u003e\u003cp\u003e没接触之前,一直觉得这玩意很神奇;接触后更感觉这东西的设计太棒了,只需要指令,就能完成大段内容的编辑。\u003c/p\u003e\u003cp\u003e后来接触了正则和Vim之后觉得似曾相识,才发现sed的用法很像Vim的替换指令+正则。而且这一套下来,效率提升真不小。以前做一些爬虫都编辑麻烦,现在直接写个脚本就完事了。比如,我最近为了尝试这三个流编辑器,写了一个爬新闻的脚本:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#!/bin/bash\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e -e \u003cspan class=\"string\"\u003e\u0026#34;# IT news Today\\n\\n\u003cspan class=\"subst\"\u003e$(wget -qO- https://www.ithome.com/block/rank.html | grep -oP \u0026#39;\u0026lt;li\u0026gt;\\s*\u0026lt;a\\K[^\u0026gt;]+\u0026#39; | awk -F \u0026#39;\u003cspan class=\"string\"\u003e\u0026#34;\u0026#39; \u0026#39;{print \u0026#34;\u003c/span\u003e[\u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$2\u003c/span\u003e\u0026#34;\u003c/span\u003e](\u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$6\u003c/span\u003e\u0026#34;\u003c/span\u003e)\u003c/span\u003e\u0026#34;\u003c/span\u003e}\u003cspan class=\"string\"\u003e\u0026#39; | sed \u0026#39;\u003c/span\u003es/^/- /g\u003cspan class=\"string\"\u003e\u0026#39;)\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e这是一个简单的单行脚本:借助管道,将wget抓取到的网页直接交由grep,让它使用Perl正则表达式将新闻标题和链接匹配出来,再交由awk将具体的字段分离出来并按照markdown的标准进行加工,最后交由sed使用行编辑模式在每一行前面加上一个\u003ccode\u003e- \u003c/code\u003e变换为markdown的列表。最后,将输出返回给\u003ccode\u003eecho -e\u003c/code\u003e,得到加上标题的、完整的输出。\u003c/p\u003e\u003cp\u003e其实,上面的例子只用grep+sed/awk就行,但是为了表现三个编辑器各自的特点,还是安排它们共同完成了这个变换工作。希望这个例子能给你带来一个粗浅的印象。\u003c/p\u003e\u003cp\u003e那么,现在就开始正篇吧。\u003c/p\u003e\u003ch2 id=\"sed\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/sed%EF%BC%8Cawk%E4%B8%8Egrep/#sed\" class=\"headerlink\" title=\"sed\"\u003e\u003c/a\u003esed\u003c/h2\u003e\u003cp\u003e首先说说sed它爹ed,这玩意是个很经典的行编辑器。不光可以交互编辑(类似于Vim,不过只能通过交互式指令输出操作结果,比如p输出当前行内容之类的),而且还能把操作指令存储下来\u003c/p\u003e\u003ch3 id=\"基本介绍\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/sed%EF%BC%8Cawk%E4%B8%8Egrep/#%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%BB%8D\" class=\"headerlink\" title=\"基本介绍\"\u003e\u003c/a\u003e基本介绍\u003c/h3\u003e\u003cp\u003esed是一个流编辑器,它可以对文本文件或标准输入进行处理和编辑。sed的基本用法是:\u003c/p\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esed [options] \u003cspan class=\"string\"\u003e\u0026#39;script\u0026#39;\u003c/span\u003e file\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e其中,options是一些可选的参数,script是一些sed命令,file是要处理的文本文件。下面是一些常用的options:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e-n\u003c/code\u003e:只打印匹配到的行,不打印所有行。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e-e\u003c/code\u003e:可以指定多个script,按顺序执行。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e-f\u003c/code\u003e:可以从一个文件中读取script。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e-i\u003c/code\u003e:可以直接修改原文件,而不是输出到标准输出。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e-r\u003c/code\u003e:可以使用扩展正则表达式。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003esed的script由一些地址和命令组成,地址可以指定要处理的行,命令可以指定要执行的操作。下面是一些常用的地址和命令:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e地址可以是一个数字,表示行号,如\u003ccode\u003e3\u003c/code\u003e表示第三行。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e地址可以是一个范围,表示行号之间的区间,如\u003ccode\u003e3,5\u003c/code\u003e表示第三行到第五行。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e地址可以是一个正则表达式,表示匹配该模式的行,如\u003ccode\u003e/^abc/\u003c/code\u003e表示以abc开头的行。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e地址可以是\u003ccode\u003e$\u003c/code\u003e,表示最后一行。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e如果不指定地址,默认对所有行进行处理。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e命令可以是\u003ccode\u003ea\u003c/code\u003e,表示在当前行后面添加一些内容,如\u003ccode\u003ea\\newline\u003c/code\u003e表示在当前行后面添加一行newline。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e命令可以是\u003ccode\u003ec\u003c/code\u003e,表示用新的内容替换当前行,如\u003ccode\u003ec\\newtext\u003c/code\u003e表示用newtext替换当前行。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e命令可以是\u003ccode\u003ed\u003c/code\u003e,表示删除当前行,如\u003ccode\u003ed\u003c/code\u003e表示删除当前行。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e命令可以是\u003ccode\u003ep\u003c/code\u003e,表示打印当前行,如\u003ccode\u003ep\u003c/code\u003e表示打印当前行。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e命令可以是\u003ccode\u003es\u003c/code\u003e,表示用新的内容替换匹配到的内容,如\u003ccode\u003es/old/new/g\u003c/code\u003e表示将old替换为new,g表示全局替换。\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"示例:\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/sed%EF%BC%8Cawk%E4%B8%8Egrep/#%E7%A4%BA%E4%BE%8B%EF%BC%9A\" class=\"headerlink\" title=\"示例:\"\u003e\u003c/a\u003e示例:\u003c/h3\u003e\u003cul\u003e\u003cli\u003e打印1-3行:\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esed -n \u003cspan class=\"string\"\u003e\u0026#39;1,3p\u0026#39;\u003c/span\u003e file.txt\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e删除1-3行:\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esed \u003cspan class=\"string\"\u003e\u0026#39;1,3d\u0026#39;\u003c/span\u003e file.txt\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e在所有行前加#:\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esed \u003cspan class=\"string\"\u003e\u0026#39;s/^/#/g\u0026#39;\u003c/span\u003e file.txt\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e将所有字母大写:\u003c/li\u003e\u003c/ul\u003e\u003cfigure class=\"highlight bash\"\u003e\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"gutter\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e1\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003esed \u003cspan class=\"string\"\u003e\u0026#39;s/.*/\\U\u0026amp;/g\u0026#39;\u003c/span\u003e file.txt\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"参考资料\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/sed%EF%BC%8Cawk%E4%B8%8Egrep/#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99\" class=\"headerlink\" title=\"参考资料\"\u003e\u003c/a\u003e参考资料\u003c/h3\u003e\u003cp\u003e¹: \u003ca href=\"https://www.runoob.com/linux/linux-comm-sed.html\"\u003eLinux sed 命令 | 菜鸟教程\u003c/a\u003e\u003cbr/\u003e²: \u003ca href=\"https://zhuanlan.zhihu.com/p/181734158\"\u003esed 命令快速入门 - 知乎\u003c/a\u003e\u003cbr/\u003e³: \u003ca href=\"https://zhuanlan.zhihu.com/p/145661854\"\u003esed完全教程 - 知乎\u003c/a\u003e\u003c/p\u003e\u003ch2 id=\"awk\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/sed%EF%BC%8Cawk%E4%B8%8Egrep/#awk\" class=\"headerlink\" title=\"awk\"\u003e\u003c/a\u003eawk\u003c/h2\u003e\u003ch2 id=\"grep\"\u003e\u003ca href=\"https://mxts.jiujiuer.xyz/2023/07/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/sed%EF%BC%8Cawk%E4%B8%8Egrep/#grep\" class=\"headerlink\" title=\"grep\"\u003e\u003c/a\u003egrep\u003c/h2\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://mxts.jiujiuer.xyz/2023/07/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/sed%EF%BC%8Cawk%E4%B8%8Egrep/"}]},{"name":"lby's blog site","email":"","uri":"http://lby.github.io/","description":"","article":[{"title":"记——毕业旅行","time":"2024-02-08T16:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e当故事的最后以“毕业旅行”平静谢幕,以至于玩家心中所设想的永别式结局和生离死别的场景都未曾出现,其实是相当出人意料的决定。六年来,这个故事始终在生死一线间完成角色的蜕变,旅途的波澜壮阔从未停息,然抵至终章的最后一个句号竟真如同句号般完整和圆满。我们亲眼见证着琪亚娜从懵懂幼稚成长为坚定合格的战士,逐渐忘记了她的年少和那份年龄理应有的天真;而如今尘埃落定,战士也即将卸下盔甲与使命,渺小的愿望最终并未湮灭在末世的沙尘里,而是等来了能够容纳它的时代的来临。故事走向平淡的收场,角色终于有资格拥抱和平光景下的生活,她们从过往命运的桎梏中毕业,向着未来发起旅行,从画面走进现实里。\u003c/p\u003e\u003c/blockquote\u003e\u003cblockquote\u003e\u003cp\u003e这样的结局不该令人诧异。如同御三家六年来的一步步成长,编剧对于故事主题轮廓的勾勒也愈发清晰。从一开始战胜命运、坚守人性的空洞呐喊,到爱莉希雅\u0026lt;真我\u0026gt;之铭的显现与告白,故事最终的精神内核已经得到了概括性的凝练。在此先不论\u0026lt;真我\u0026gt;在道德和哲学层面上的意义,爱莉希雅活过一生的方式、追寻乐园的旅程,已经足以让她成为后继者最好的“偶像”,于是,纵观乐土之后的剧情,我们似乎总能在御三家身上找到爱莉希雅的影子。这种强烈的既视感无疑是刻意为之,编剧以这种高超的人物塑造技巧将不同的角色形象加以链接,从而将\u0026lt;真我\u0026gt;背后的人性之光反反复复凸显。于是乎,观众得以看见一种精神传承的过程的全貌——相似的话语和理念被不同的角色所表达,但绝非鹦鹉学舌式的拙劣模仿,也不是他者意志的强加,而是在不同情景和抉择下发自真心的宣言。观众绝不会将角色混同,相反,我们始终保有一种清醒——旧世代的人与物皆已消散,而新世代的角色正在真真切切地活于自己的生命轨迹里。正因如此,当代表过去的往事乐土凝翠出崩坏三的故事内核,代表未来的御三家所需做的,必然是坚定自我所选择的道路,以人的姿态抵达终点,把这个不完美的世界,变成她们期望的形态。旧日企盼新生,我们又何尝不企盼这个故事迎来美好的结局。而历经的诸多苦难、离别和悲伤,也不必被视为末日的征兆,而可以是文明成长的阵痛。所以在这一层面上,崩坏三的终章不必再有悲剧性的眼泪和苦楚,与其在故事内穷尽情节设计将情感推向高潮,不如以这令人“难以置信”的美好结局和平淡日常收场,将观众无处安放的情感留给“弦外之音”。\u003c/p\u003e\u003c/blockquote\u003e\u003cblockquote\u003e\u003cp\u003e在此,无论是终焉的形象,还是“毕业旅行”这一概念的使用,都彻底打破了故事结局一锤定音式的永恒,转而赋予它流动性和延续性。琪亚娜的结局不同于奥托和符华,因为崩坏三的故事正是在回忆和当下两种叙事中不断跳跃行进。对于后两者,是“过去的人,就让他过去吧”,或是历历浮生,不断与过去告别,完成一次次“毕业旅行”。琪亚娜的故事也不同于爱莉希雅,爱莉希雅是人性光辉的具象化,但并非那个时代的救世者。爱莉的诞生很像耶稣降临于世,二者又皆为至善的代表,编剧有意借鉴部分宗教要素,为爱莉的身上引入神性的色彩。这种引入从一开始便暗示着爱莉会如殉道者般死去,却并不代表爱莉是某种理念的信徒,通过死亡实现某种超越,最终与观众拉开距离。反观故事尾声,无暇之人选择了牺牲,这是身处悲剧必然导向的结局,也唯有死亡才能成就她的永恒。爱莉希雅的故事,十三英桀的故事,必须到此为止,也只能到此为止。在这里,宗教的观念、悲剧性文学的主题,二者合力让故事走到了结尾。但它们能操纵角色的命运,却无法操纵角色的精神与对既定命运的反抗。爱莉希雅并非耶稣式的布道者,也不是死后升入天堂受世人敬仰的神明,相反,她是一个反宗教式的人物。人性的诸多美好特质与粉色妖精小姐形象并未出现割裂,无论是芽衣还是玩家都未曾在她的身上感受到距离感,无论是芽衣还是玩家都喜爱她的全部。她真实地活在每一个人心中,并没有因死亡的结局而离我们远去。呼唤她的方式也并非祷告,而是将过往铭记珍藏,并践行她身上那些独属于人性的美德。这一次的崩坏三并非去创造神明,而是给予了一位人类“偶像”以生命。也正因如此,当爱莉希雅,当十三英桀走向注定的死亡,我们回顾过往,看着她们馈赠的传承,她们曾骄傲活过的痕迹,方才领悟到“悲剧并非终结,而是希望的起始”。偶像的气质和于绝望中抗争的勇气,原来从未泯灭。\u003c/p\u003e\u003c/blockquote\u003e\u003cblockquote\u003e\u003cp\u003e琪亚娜代表的是现世代文明战胜崩坏的可能,更代表崩坏三六年间的起始,承载着观众对故事、对自身六年来经历的回忆与感情。琪亚娜的故事从一开始并不存在,是她一步步向前迈进,开辟属于自己的未来,并不断回应观众的期待。我们见证着角色的成长,见证着由爱出发的故事兜兜转转最终回到爱,见证着故事的主题染上不同角色的颜色而愈发清晰、浓墨重彩;我们更见证着自己六年来的成长和改变,在与角色共情中试图相信着什么,寻找着最初的自我。而此刻,过往化作回忆,序章写至终章,我们随琪亚娜一起,告别一段经历,告别过去的自己。这也是崩坏三最后的结尾选用“毕业旅行”的原因。当一个故事走向终末,编剧没有选择将它推向幻想的高峰,而是将故事拉回现实,甚至与现实接轨。角色没有付出惨重的代价去拯救世界,观众也无需用悲情的结局铭记角色,我们看着琪亚娜向过往挥手告别,竟突然间看到了自己。“毕业旅行”的高明之处,在于它跨越了死亡这一空虚意象(不仅是角色死亡的空虚,更是故事结束带来的失落与空虚),让故事形成了一种轮回,让观众走进走出故事,最终仍能回归自我;它与现实形成了一种互动,打破了“第四面墙”,让观众主动告别过往,而非等待幕布落下后被动离场,正如纪录片的结尾所言:“在这个故事的最后,我们希望玩家喜欢的不仅仅是这个故事,而是陪伴这个故事一直走到现在的自己”。于是,她们的故事已经结束了,她们的故事就在那里,如果想念,就像书一样再次遍历一章章;她们的故事又不止在那里静静的放,那些话语、那些声音那些图像,与我们的情感交织在一起,故事的根基延伸到现实,在我们身上流淌。\u003c/p\u003e\u003c/blockquote\u003e\u003cblockquote\u003e\u003cp\u003e结语:\u003cbr/\u003e这篇文章其实去年就已经写完了,只是一种咕咕咕到现在才出了电子稿,但其实电子稿和原版相差很大,这几天修改的过程可谓是艰难无比,各种逻辑混乱、语无伦次、不知所云,很想知道我当时是怎样的写作状态(笑)。所以这篇杂谈真的不能细看,漏洞百出,但是多少还寄托着我个人对崩坏三的一些感情,所以便放上来自娱自乐一下。只能说下笔的时候才知道写作尤其是这种议论文?的写作难度,大量的逻辑论证都要反复考量,你事前觉得这个观点绝妙,但随后看来很多地方都经不起推敲,也许我只是想情感输出?(笑),或者叫浪漫主义者有此类写作障碍?(其实就是菜)。加之崩坏三本就文本量巨大,一般回想着文本,一边寻找灵感,很容易抓着一个点一路自嗨狂飙,缺乏统领文本的能力,更别说能深发本质,整饬地排列观点、梳理逻辑,总之莫名感觉像是在编程,可能我两边都学不会吧。最终就是说不清自己想说的话。以后尽量多写,随笔就像是空中的落叶,抓住了一些,埋在赛博空间里,不知道能护出怎样的花。\u003c/p\u003e\u003c/blockquote\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://lby.github.io/2024/02/09/%E8%AE%B0%E2%80%94%E2%80%94%E6%AF%95%E4%B8%9A%E6%97%85%E8%A1%8C/"},{"title":"天气之子——那场熙攘的雨","time":"2023-03-31T07:35:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e序章\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e说起来这竟是如此戏谑又巧合。初逢《天气之子》,我意外迎到了久别难以谋面的知己,虽不至推杯换盏之态,然语心诉情,盛着清风淡月彼肩散漫,是我们对彼此最奢华的礼待。于是乎,莫明而缠绵的秋雨,便让这座城清冷了一周。而再临影院重看《天气之子》这一程,着一袭黑色风衣的我竟显得与这街景格格不入——久违的日光与日影,渲染着本就斑斓的枯叶、草木,让色彩蕴出的世间,令人难以确信虚实。只惜,身形侧尽秋风过,既日别去,我们都已成顾影的离人。\u003c/p\u003e\u003cp\u003e在大雨磅礴中相遇,在丽日和风中相离,这种自以为里的浪漫与伤感,恰与帆高和阳菜的命运相映。本就执着于新海诚的风格,如此一遭,分明又添了几分好感。还是要感谢《天气之子》,正如新海域在B站的采访中谈到,作为被动画救赎的自己,如今也希望用自己的创作触动、救赎当下的年青人,于我,能从纷扰的尘世被拉出,重新去相信,执着那些因适应生存而“退化”的思与情,这定是一种救赎且宛若新生。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eあめ,あめ\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e似乎除了阳菜身边罕见般足以称为奇迹的晴天,东京的雨,浸透了《天气之子》整部影片,雨落地疯狂,以致于常人脑中锋面气旋的基本原理,已很难与这场超乎寻常的雨相奏泊。而帆高最初流落街头,收养的那只名为小雨的猫,在不断地向一只橘猫的体形转变。从某种意义上而言,这又何尝不是对东京雨势变化的暗示?\u003c/p\u003e\u003cp\u003e新海城营造的雨,在《言叶之庭》中已经淅淅沥沥的下了几场。不过《言叶之庭》的雨,更多是作为背景环境和表现手法,为这场彼此缄默难料结果的爱情交织出朦胧而又忧伤的氛围,《天气之子》的雨,则已成为主要的剧情线索,承担着诸多情感的映射,深层次的象征。在此过程中,雨被赋予了一种灵性,在意象与意境二者中游走自如。\u003c/p\u003e\u003cp\u003e何以言之?《天气之子》中的雨,已从朦胧化走向真实化。东京这场不停歇的雨,让晴女的有在有了合理性和价值,人们面对天气,尤显这场惊骇又显无力的雨,内心情感的曲折变化;对于停雨而牺牲晴女的争讨,并由此上升至个体对世界的挣扎反抗……雨在此被新海诚作为更为全面的载体,也是诸多表达上的媒介,而非仅仅具有渲染效果。这样的雨就必须要求多样性。在《天气之子》中,镜头的把控起到了至关的作用,雨被不同镜头分出了层次。磅礴地雨落如柱,一方水洼泛起雨露的轻鸢剪影,东京街头细密如织已融成灰白的强降水,还有阳菜伞顶的惊鸿一暼……雨的多层次化使其可以被模仿现实地细致描摹,值得画师用手绘去一点点刻画,精妙到雨的溅落方向都以水滴为分异,也会被采用印象派的手法,仅用简单的线条,概括般的色块以及光影变幻来表达雨势。\u003c/p\u003e\u003cp\u003e如此多元化的雨,却正是对现实雨的高度拟合,也由此更具有现实意义。雨的变化多端并非率性,而是对人物内心的同步反映。就像阳菜,帆高和凪前辈被迫逃亡途中,雨势随之愈演愈烈,正是对三者内心的孤苦、迷茫和愤怒的读取和直观表现,为加强效果,甚至设定阳菜能招来来闪电。 新海诚在此最精妙的手法,便是利用雨声的表现性。雨声的骤然暂停烘托出放情的天气效果;雨声的变化结合雨势变化共同反映情感变化;雨声持续地击打传递出压抑;以及将雨声做为伴奏之一更好表现插曲。雨被全面的激活,构架出《天气之子》,成为其核心、也最具灵魂的艺术效果。由此看来,用雨进行表述,反过来也赋予了雨灵性,雨共享了其自身应表现的情感,却因此不再呆板。寓情于景,景往往活过来抒情。不仅于此,《天气之子》中的雨,既充当了固定的意象,也成为了特殊的意境,雨的身份在二者中游自如。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://lby.github.io/2023/03/31/%E5%A4%A9%E6%B0%94%E4%B9%8B%E5%AD%90%E2%80%94%E2%80%94%E9%82%A3%E5%9C%BA%E7%86%99%E6%94%98%E7%9A%84%E9%9B%A8/"},{"title":"毕业旅行镜头语言浅析","time":"2023-03-31T07:22:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e我惊讶于这一次的动画短片没有以一场华丽的终焉之战收结,而是用“毕业旅行”这样的概念收束全片。也正因如此,整部短片充满回忆与现实的交错,在时间的倒带中用具象化的场景呈现出琪亚娜的内心世界(月台、列车)。近八分钟的时长里有诸多回忆片段的闪回,但配合着高超的叙述手法和多段式的节奏风格,竟没有丝毫的强行感动而因此落入俗套。\u003c/p\u003e\u003c/blockquote\u003e\u003cblockquote\u003e\u003cp\u003e毕业是与过往的人与事告别,而动画短片精巧地为告别编排了层次——苦难与敌人(奥托、千律、侵蚀)、携手同行的挚友(芽衣,布洛尼娅)、与其一同度过的回忆片段(闪回部分)、回忆出发的原点(姬子与圣芙蕾雅),最终落脚到过去的那个小小的却步伐坚定的自己。毕业典礼临近尾声,琪亚娜看着过去的自己走向偌大的地球,她知晓她的命运,知晓她最终要去承担将整个地球扛在肩上的责任,但时间交错的自己还是再一次做出了相同的选择,用前行作为无声的承诺。过往回溯到了最初的起点,与过去毕业的旅行也到了终点站,情感基调充斥着不舍与伤感,但画面一转,琪亚娜走向月球的身影,与过去的自己形成对照,又无比相似。或许,寻回初心并不意味着结束;或许,成为英雄并非意味着终点;或许,另一层面上的毕业旅行才将要启程。\u003c/p\u003e\u003c/blockquote\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://lby.github.io/2023/03/31/%E6%AF%95%E4%B8%9A%E6%97%85%E8%A1%8C%E9%95%9C%E5%A4%B4%E8%AF%AD%E8%A8%80%E6%B5%85%E6%9E%90/"},{"title":"幻想家与夏","time":"2022-01-12T09:03:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e“接下来要讲述的,是幻想家的故事” \u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e幻想家在桌前,望着这句老套的开场白出神。 \u003c/p\u003e\u003cp\u003e已经许久未曾运笔,至于原因,幻想家心中有一个模糊的答案。但他却不愿承认——被生活的烦忙与琐碎打倒,撕扯,扔进漩涡中心,行动交由早已既定、当下先行的最高指令,意识则一点点被消磨殆尽——这是他矢口否认的,不愿看到的,却又被迫选择的,将一切激情与宝贵岁月心甘情愿交付的,孕育着他的宝石般的未来的——他甚至认为自己理当是个好蚌,可被撬开后,那颗珠的尺寸与光泽却又令他大失所望,夏的火种也随之熄灭了,他空空举着未燃的火把,带不给他一点光与热,呆伫于路上,任由他人的火光将内心刺痛——他的夏,似已结束。 \u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e“我的夏,竟已结束了……” \u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e幻想家喃喃道,那种熟悉的空无感又趁虚而入,将他的内心一点点蚕食,曾经高举过头顶的双臂已垂弱无力,对生命与生活的热情正在被从他身体抽离。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://lby.github.io/2022/01/12/%E5%B9%BB%E6%83%B3%E5%AE%B6%E4%B8%8E%E5%A4%8F/"}]},{"name":"Ri的手账本","email":"","uri":"https://ray.al","description":"","article":[{"title":"如果有你在","time":"2023-12-18T19:13:26Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e你低垂着背脊,雨点敲打着你让我心痛,我怀着祈祷的心情一直关注着你,如果这个世界上,只有一把伞,我定要找到送给你 […]\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/247"},{"title":"Spirits","time":"2023-11-07T16:38:23Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e世界将从微不足道的我启程,这平凡的每一天,总有人在默默守护,我也想要为了谁做些什么,直到此刻和你相遇,我想和你 […]\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/242"},{"title":"狼与驯化的野性","time":"2023-11-07T16:07:46Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e时间在八月到九月间,还远不到下雪的时节,而眼前的风景却令人诧异。一条小径从雪地里穿过,伴着哒哒的马蹄声,一架马 […]\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/239"},{"title":"真正的痛苦","time":"2023-07-16T17:50:50Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e仰头望天,这又是何等的痛苦\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/230"},{"title":"今天的天气,知道的?","time":"2023-07-15T18:16:15Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e连遗忘本身都忘记,那才是真正的束手无策。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/227"},{"title":"好玩的Kalman滤波器(仅样例)","time":"2023-07-14T17:05:02Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e然而Kalman滤波器不是滤波器(\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/221"},{"title":"好玩的传感器和Arduino开发板","time":"2023-07-13T13:38:09Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e算是自己做的一些微小的工作\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/215"},{"title":"剃须与味噌汤","time":"2021-12-02T18:39:16Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e莎优的脑海里又浮现起了那时吉田找到自己时涨得通红的脸,那种担心而大汗淋漓的表情……不知道为什么,她觉得有些心酸,却又有些高兴。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/99"},{"title":"再次相遇","time":"2021-12-02T18:31:35Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e吉田感受到了一种力场,就好像是一根细线,把他和少女的命运系在一起。有只有今天才能遇见的人,也只有今天才能遇见的事。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/122"},{"title":"Buffalo Nas的简单评测","time":"2021-11-02T12:15:59Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e在上课,所以先不放图 这次评测的主人公是Buffalo ls-wxl (LinkStation) 闲鱼上某个老 […]\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/85"}]},{"name":"Reverier's Blog","email":"","uri":"https://blog.woooo.tech/","description":"Creating reality with idealism.","article":[{"title":"音乐与时间与蓝色星球#04 梦境","time":"2024-04-07T01:24:17+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\n\u003cp\u003e持续更新…\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"20240402-世界向我坠落\"\u003e2024.04.02. 世界向我坠落\u003c/h2\u003e\n\u003cp\u003e回过神来,我站在一部电梯面前。旁边的楼层牌子指示着我正在一层,高算中心。楼层牌子以一种倒过来的方式排布着,一楼在最上面,高层在下面。\u003c/p\u003e\n\u003cp\u003e我习惯性的按下了上行的按钮,然后看着电梯从十楼开始缓缓下降————要不今天走楼梯吧,就一层楼坐个什么劲啊。\u003c/p\u003e\n\u003cp\u003e但是身体还是很诚实的等在了原地。牙白,今天没带耳机。\u003c/p\u003e\n\u003cp\u003e门开了,里面空无一人。我走进去,按了一下二楼,然后向后退去,以一种颓废的姿势依靠在电梯墙上。一股失重的感觉袭来,电梯动了,好像有哪里怪怪的,但是我想不起来。\u003c/p\u003e\n\u003cp\u003e电梯门打开,一股白炽的灯光照的人睁不开眼睛。我走出电梯。\u003c/p\u003e\n\u003cp\u003e走廊里异常的安静,甚至连灯都没有开,只有电梯对面墙上的 LED 大字亮着,“陕西省网络空间与信息安全应用技术实验室”,比以往任何时候都要刺眼。\u003c/p\u003e\n\u003cp\u003e这是哪里?\u003c/p\u003e\n\u003cp\u003e一股眩晕感袭来。我走到实验室门口,掏出学生卡刷了一下。\u003c/p\u003e\n\u003cp\u003e“验证失败”,门说。\u003c/p\u003e\n\u003cp\u003e我给卡翻了个面,又刷了一次。\u003c/p\u003e\n\u003cp\u003e“验证失败”,门又说,这次换了一个低沉的语调。\u003c/p\u003e\n\u003cp\u003e怎么回事?我给卡放在手掌中心摩擦了一下,然后仔细看了看卡片确认我没有拿错成身份证,又刷了一次。\u003c/p\u003e\n\u003cp\u003e“验证失败,多次验证失败警告”,门这次换了一个细长尖锐的音调,仿佛在嘲讽我一般,吓了我一跳。\u003c/p\u003e\n\u003cp\u003e嘈杂的声音在门后响起,原来有人啊。我敲了敲门,门里安静下来,我听见有人轻轻地说了一句,“我去开门”,然后门开了。\u003c/p\u003e\n\u003cp\u003e实验室里还是那些熟悉的面孔,但是我却一时忘了都是谁。我走进去,看着他们,他们也看着我。\u003c/p\u003e\n\u003cp\u003e经过一段很短又很长沉默,他们把脸转开,开始埋头做自己的事情,实验室里异常的安静,让我一时以为在门口听见的嘈杂都是错觉。\u003c/p\u003e\n\u003cp\u003e我坐到自己的座位上,旁边的人轻轻说了一句:“生日快乐,神。”\u003c/p\u003e\n\u003cp\u003e我诧异,“可今天不是我的生日。”\u003c/p\u003e\n\u003cp\u003e“今天可以是。”他笑了笑,然后不再言语。\u003c/p\u003e\n\u003cp\u003e我看向我的电脑屏幕,还是熟悉的森林与篝火。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_004/fires@1k.jpg\" srcset=\"fires@1k.jpg?size=small, fires@1k.jpg?size=medium 1.5x, fires@1k.jpg?size=large 2x\" sizes=\"auto\" data-title=\"fires@1k.jpg\" data-alt=\"fires@1k.jpg\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e我输入密码解锁,连着三次都是错误。那股尖锐的声音再次响起:“验证失败,多次验证失败警告”,我正奇怪,却察觉到几股视线。\u003c/p\u003e\n\u003cp\u003e我突然浑身冷汗,我看向旁边的人,他们都在看着我,眼神里闪动着诡异的光。\u003c/p\u003e\n\u003cp\u003e“生日快乐,神。”\u003c/p\u003e\n\u003cp\u003e我感觉大脑似乎被撞了一般,晕眩的感觉让我向后倒去。想象中的硬着陆并没有到来,我睁开眼睛,看见天空离我越来越近,世界在向我坠落。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/night_talk_004/"},{"title":"色彩系统与视觉设计","time":"2024-02-29T08:12:00+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"起源\"\u003e起源\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e光\u003c/strong\u003e,\u003cdel\u003e一种用来拯救世界的信仰\u003c/del\u003e 通常指的是人类眼睛可见的电磁波,\u003cstrong\u003e视知觉\u003c/strong\u003e 就是对于可见光的知觉。\u003c/p\u003e\n\u003cp\u003e可见光只是电磁波谱上介于 400nm - 700nm 之间的部分(也有一些资料定义不同,较窄的定义在 420nm - 680nm 之间,较宽的定义在 380nm - 800nm 之间),在教材上通常以这样一张\u003ca href=\"https://zh.wikipedia.org/wiki/File:EM_spectrum_zh-hans.svg\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e频谱图\u003c/a\u003e来表示:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/EM_spectrum_zh-hans.png\" srcset=\"EM_spectrum_zh-hans.png?size=small, EM_spectrum_zh-hans.png?size=medium 1.5x, EM_spectrum_zh-hans.png?size=large 2x\" sizes=\"auto\" data-title=\"可见光-电磁波谱\" data-alt=\"可见光-电磁波谱\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e每种不同的波长对应的颜色各不相同,因此我们可以根据这个原理制作显示设备,只要找到一种在可控条件下发射不同波长的光的方法就可以了。但是这个想法不现实,首先是设备大小问题。想要制造出任意波长的光需要比较复杂的设备和条件,而这样制造出来的光线还只能显示单个像素。想象一下用这样的技术制造出一个标准1080p显示器,设备本身的大小会十分感人。\u003c/p\u003e\n\u003cp\u003e在进一步探索后,20世纪30年代,国际照明委员会(英文:International Commission on Illumination,法文:Commission internationale de l’éclairage,采用法文缩写:CIE)设计了一套色彩系统,用于描述人眼所能感受到的色彩,并对其进行量化。\u003c/p\u003e\n\u003ch2 id=\"cie-1931-色彩空间\"\u003eCIE 1931 色彩空间\u003c/h2\u003e\n\u003cp\u003e经过医学研究,人眼感知色彩主要依靠三种色锥细胞,分别对应红、绿、蓝三种颜色,后来将其称为光的三原色。所以,使用三种原色的光线就可以混合出五彩斑斓的颜色。在此基础上,CIE设计了一个实验,使用四个光源来量化颜色,并招募志愿者通过人眼感知对色彩进行匹配,称之为颜色匹配实验。从这个试验中,CIE最终构建出了一套色彩模型,称为CIE 1931 xyz色彩空间,也可以直接称为CIE 1931色彩空间。\u003c/p\u003e\n\u003ch3 id=\"色彩实验\"\u003e色彩实验\u003c/h3\u003e\n\u003cp\u003e实验过程大致如下:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e通过三个单色光源(红、绿、蓝)发射出三种光线,照射到一个白色的试验板上,汇聚成一个色彩光斑;\u003c/li\u003e\n\u003cli\u003e通过另一个单色光源调整出待测光线,照射在刚刚光斑的附近形成另一个光斑;\u003c/li\u003e\n\u003cli\u003e使用黑色的不透光材料作为两个光斑的分界线,并移动光源使两个光斑靠在一起;\u003c/li\u003e\n\u003cli\u003e实验者通过同时观察左右光斑,并根据观测结果不断调整三个单色光源的强度,使得两个光斑看起来显示出同一种颜色;\u003c/li\u003e\n\u003cli\u003e记录三个单色光源的强度,这样就得到了一个颜色的RGB值,被称为三刺激值。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e更加直观的视频描述可以\u003ca href=\"https://www.bilibili.com/video/BV1E2421c7NM/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e参考这里\u003c/a\u003e,以下实验图像也来自于此。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/color_lab1.png\" srcset=\"color_lab1.png?size=small, color_lab1.png?size=medium 1.5x, color_lab1.png?size=large 2x\" sizes=\"auto\" data-title=\"色彩实验\" data-alt=\"色彩实验\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e在这个实验中,实验者们发现了一个问题:一些待测光线的色彩是无法通过三原色混合出来的,例如下面的例子,想要混合出这种绿色,似乎需要继续降低红光,但是红色光源已经完全关闭了:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/color_lab2.png\" srcset=\"color_lab2.png?size=small, color_lab2.png?size=medium 1.5x, color_lab2.png?size=large 2x\" sizes=\"auto\" data-title=\"待测光线的色彩是无法通过三原色混合出来\" data-alt=\"待测光线的色彩是无法通过三原色混合出来\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e于是实验者通过将红色光源移到右边进行混色,并通过调整使得两边色彩一致:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/color_lab3.png\" srcset=\"color_lab3.png?size=small, color_lab3.png?size=medium 1.5x, color_lab3.png?size=large 2x\" sizes=\"auto\" data-title=\"通过将红色光源移到右边进行混色\" data-alt=\"通过将红色光源移到右边进行混色\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e最终就可以确定出这个颜色的三刺激值了,只不过红色是负的。\u003c/p\u003e\n\u003cp\u003e在获取了大量的实验数据后,CIE在亮度-波长坐标系中绘制出了这样3条曲线:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/color_lab_result1.png\" srcset=\"color_lab_result1.png?size=small, color_lab_result1.png?size=medium 1.5x, color_lab_result1.png?size=large 2x\" sizes=\"auto\" data-title=\"色彩混合结果\" data-alt=\"色彩混合结果\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e在这个曲线图中,λ轴代表波长,y轴代表亮度,而三条色彩曲线则代表了要混合出视觉上与此波长光线同等时,红、绿、蓝三种光线的强度。\u003c/p\u003e\n\u003ch3 id=\"cie-1931-rgb-色彩空间\"\u003eCIE 1931 RGB 色彩空间\u003c/h3\u003e\n\u003cp\u003e我们发现了一个问题,在这个坐标系中表示颜色很不直观。于是,CIE又在以RGB亮度为轴的三维坐标系中绘制出了这些点:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/color_space_rgb.png\" srcset=\"color_space_rgb.png?size=small, color_space_rgb.png?size=medium 1.5x, color_space_rgb.png?size=large 2x\" sizes=\"auto\" data-title=\"color_space_rgb.png\" data-alt=\"color_space_rgb.png\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e这样,我们就得到了一个色彩空间定义,称为 CIE 1931 RGB色彩空间。\u003c/p\u003e\n\u003ch3 id=\"格拉斯曼定律\"\u003e格拉斯曼定律\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://zh.wikipedia.org/wiki/%E6%A0%BC%E6%8B%89%E6%96%AF%E6%9B%BC%E5%AE%9A%E5%BE%8B_%28%E8%89%B2%E5%BD%A9%29\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e\u003cstrong\u003e格拉斯曼定律\u003c/strong\u003e\u003c/a\u003e是一个关于光学理论的经验法则,它说明了人类对色彩的感知(大约)是\u003cstrong\u003e线性\u003c/strong\u003e的。\u003c/p\u003e\n\u003cp\u003e简单来说,取两个单色可见光,那么这两个可见光在RGB色彩空间里可以用两个坐标 $Color_1 = (R_1, G_1, B_1)$,$Color_2 = (R_2, G_2, B_2)$ 来表示,那么这两个色彩混合一起得到的色彩就可以依照以下的简单加法公式计算出来:\u003c/p\u003e\n\u003cp\u003e$$\nColor_1 + Color_2 = (R_1 + R_2, G_1 + G_2, B_1 + B_2)\n$$\u003c/p\u003e\n\u003cp\u003e这个公式就是格拉斯曼定律的简单表达。但是请注意格拉斯曼定律是由实验总结得出的,由于现代医学技术的限制,我们无法直接严格证明色彩空间就是一个线性空间。\u003c/p\u003e\n\u003cp\u003e格拉斯曼定律的更一般形式可以表达为:\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\n\u0026amp;R = \\int_{0}^{\\infty}I(\\lambda)\\bar{r}(\\lambda)d\\lambda \\\\\n\u0026amp;G = \\int_{0}^{\\infty}I(\\lambda)\\bar{g}(\\lambda)d\\lambda \\\\\n\u0026amp;B = \\int_{0}^{\\infty}I(\\lambda)\\bar{b}(\\lambda)d\\lambda\n\\end{align}\n$$\u003c/p\u003e\n\u003cp\u003e其中,$ I(\\lambda ) $ 为该光束对波长的强度分布;${\\displaystyle {\\bar {r}}(\\lambda )}$,${\\displaystyle {\\bar {g}}(\\lambda )}$,${\\displaystyle {\\bar {b}}(\\lambda )}$ 则分别为人眼中三种锥状细胞对不同波长的反应强度。\u003c/p\u003e\n\u003ch3 id=\"cie-1931-xyz-色彩空间\"\u003eCIE 1931 XYZ 色彩空间\u003c/h3\u003e\n\u003cp\u003e在构建了人类视觉的 RGB 模型之后,CIE 特别委员会的成员希望开发出与 CIE RGB 色彩空间有关的另一个色彩空间,它假定格拉斯曼定律是成立的,这意味着新的色彩空间能够通过线性变换有关于 CIE RGB 色彩空间。\u003c/p\u003e\n\u003cp\u003e于是,CIE 1931 XYZ 色彩空间诞生了。在这个色彩空间中,X、Y、Z 三个坐标轴的定义是:\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\n\u0026amp;X = \\int_{0}^{\\infty}I(\\lambda)\\bar{x}(\\lambda)d\\lambda \\\\\n\u0026amp;Y = \\int_{0}^{\\infty}I(\\lambda)\\bar{y}(\\lambda)d\\lambda \\\\\n\u0026amp;Z = \\int_{0}^{\\infty}I(\\lambda)\\bar{z}(\\lambda)d\\lambda\n\\end{align}\n$$\u003c/p\u003e\n\u003cp\u003e在这个新的色彩空间中,大部分定义与 RGB 色彩空间是相同的,但 XYZ 坐标轴则是歪过来的,这套坐标轴相对于 RGB 坐标轴的大致图例如下:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/color_space_xyz.png\" srcset=\"color_space_xyz.png?size=small, color_space_xyz.png?size=medium 1.5x, color_space_xyz.png?size=large 2x\" sizes=\"auto\" data-title=\"color_space_xyz.png\" data-alt=\"color_space_xyz.png\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e在这个色彩空间中,所有的点都在第一卦限中,因此避免了负值。不过如果仅仅只是为了将所有的点都放在第一卦限中,那其实可以有很多种选择。而 XYZ 色彩空间如此选择的一个重要原因是 Y 轴精确满足了“CIE标准适应光观察者”(CIE 1926)的\u003ca href=\"https://zh.wikipedia.org/wiki/%E5%85%89%E5%BA%A6%E5%87%BD%E6%95%B0\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e适应光发光效率函数(光度函数)\u003c/a\u003e $V(\\lambda)$。\u003c/p\u003e\n\u003cp\u003e光度函数描述了人眼对于不同波长光的平均视觉灵敏度,可用于将辐射能量转化为可见光的计算。\u003c/p\u003e\n\u003cp\u003e从 XYZ 色彩空间中,我们可以通过以下的变换得到 RGB 色彩空间:\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\n\u0026amp;\\left[\\begin{array}{c}\nX\\\\ Y\\\\ Z\\\\\n\\end{array}\\right]=\\frac{1}{b_{21}}\n\\left[\\begin{array}{ccc}\nb_{11}\u0026amp;b_{12}\u0026amp;b_{13}\\\\\nb_{21}\u0026amp;b_{22}\u0026amp;b_{23}\\\\\nb_{31}\u0026amp;b_{32}\u0026amp;b_{33}\n\\end{array}\\right]\n\\left[\\begin{array}{c}R \\\\ G\\\\ B\\end{array}\\right]\n\\\\\n\u0026amp;\\left[\\begin{array}{c}\nX\\\\ Y\\\\ Z\\\\\n\\end{array}\\right]=\\frac{1}{0.17697}\n\\left[\\begin{array}{lll}\n0.49\u0026amp;0.31\u0026amp;0.20\\\\\n0.17697\u0026amp;0.81240\u0026amp;0.01063\\\\\n0.00\u0026amp;0.01\u0026amp;0.99\n\\end{array}\\right]\n\\left[\\begin{array}{c}R\\\\ G \\\\ B\\end{array}\\right]\n\\end{align}\n$$\u003c/p\u003e\n\u003ch3 id=\"插话绝对色彩空间\"\u003e插话:绝对色彩空间\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://zh.wikipedia.org/wiki/%E7%BB%9D%E5%AF%B9%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e\u003cstrong\u003e绝对色彩空间\u003c/strong\u003e\u003c/a\u003e就是不依赖任何外部因素就可以准确表示颜色的色彩空间。\u003c/p\u003e\n\u003cp\u003eRGB 色彩模型(这里指的不是 CIE 1931 RGB 色彩空间)就是一个非绝对色彩空间,因为它的三个坐标轴并没有量化意义,一种颜色是通过RGB三种颜色通过调整亮度混合出来的,而这些颜色并不是标准、精确的定义。在两个不同计算机显示器上,同一个RGB颜色可能看起来大不相同。为了表示 RGB 色彩在绝对色彩中的位置,其中一种方法是定义一个 International Color Consortium(ICC) 色彩配置文件,目前这种方法是业界标准,广泛采用的RGB配置文件有 \u003ca href=\"https://zh.wikipedia.org/wiki/SRGB%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003esRGB\u003c/a\u003e、\u003ca href=\"https://zh.wikipedia.org/wiki/Adobe_RGB_%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eAdobe RGB\u003c/a\u003e 等。\u003c/p\u003e\n\u003ch3 id=\"插话白点\"\u003e插话:白点\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://zh.wikipedia.org/wiki/%E7%99%BD%E7%82%B9\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e\u003cstrong\u003e白点(white point)\u003c/strong\u003e\u003c/a\u003e,在技术文档中常被称作参考白色(reference white)或目标白色(target white),用来在处理颜色时定义 \u003cstrong\u003e白色\u003c/strong\u003e。白点通常是在色彩空间中的一个点,它定义了色彩空间中的\u003cstrong\u003e中性白色\u003c/strong\u003e,并且也定义了色彩空间中的\u003cstrong\u003e亮度\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e白点不是一个绝对的概念,比如说在午后日光的照射下,色彩整体会偏向暖色;而在阴天或者室内冷色 LED 灯的环境下,色彩整体会偏向冷色。但是白点在视觉中的感知是不变的,因此在不同的光照环境下,白点的色彩定义也会有所不同。\u003c/p\u003e\n\u003cp\u003e在 \u003ca href=\"https://zh.wikipedia.org/wiki/SRGB%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003esRGB\u003c/a\u003e 色彩空间中,白点的定义模拟了平均北方天空的日光条件,是以地球上不同地点对日光进行光谱辐射的大量数据为基础,总结出的一组相对光谱功率分布数据,色温为 6500K,近似平均昼光。我们把这个白点称为 \u003cstrong\u003eD65 白点(Daylight Neutral)\u003c/strong\u003e。\u003c/p\u003e\n\u003ch2 id=\"hsl-和-hsv-色彩空间\"\u003eHSL 和 HSV 色彩空间\u003c/h2\u003e\n\u003cp\u003eHSL(Hue 色相;Saturation 饱和度;Lightness 亮度) 和 HSV(Hue 色相;Saturation 饱和度;Value 明度) 都是将 RGB 色彩模型中的点表示在圆柱坐标系中的方法。这两种表示法试图做到比基于笛卡尔坐标系几何结构的 RGB 模型更加直观。\u003c/p\u003e\n\u003cp\u003e其中,Lightness 和 Value 都是表示颜色的亮度,但是它们的含义有所不同,参考下图:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/hsl_hsv_models.webp\" srcset=\"hsl_hsv_models.webp?size=small, hsl_hsv_models.webp?size=medium 1.5x, hsl_hsv_models.webp?size=large 2x\" sizes=\"auto\" data-title=\"hsl_hsv_models.webp\" data-alt=\"hsl_hsv_models.webp\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003eHSV以人类更熟悉的方式封装了关于颜色的信息:“这是什么颜色?深浅如何?明暗如何?”,因此在早期被广泛应用于设计行业与计算机设计中。但是HSV仍旧是RGB色彩空间的线性变换,RGB模型的缺点HSV也并没有解决,对于亮度/明度相同的颜色来说,人眼感受到的视觉亮度不一定相同。\u003c/p\u003e\n\u003ch2 id=\"cie-lab-色彩空间\"\u003eCIE L*a*b* 色彩空间\u003c/h2\u003e\n\u003cp\u003e显然,RGB色彩空间很适合机器实现,只需要使用三个单色灯泡即可。但是对于需要量化色彩的设计行业而言,RGB色彩空间却显得不那么直观。在RGB色彩空间里,人眼对于红色的感知程度相对较低,而对绿色的感知程度则相对较高,这导致了使用RGB色彩空间进行色彩搭配的时候,很难保证所选择的色彩能够带给用户“匹配”的感觉,例如很亮的绿色 \u003ccode\u003e#00FF00\u003c/code\u003e 和很亮的红色 \u003ccode\u003e#FF0000\u003c/code\u003e 放在一起时,人类倾向于感知到绿色的亮度更高。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/red_green_comp.png\" srcset=\"red_green_comp.png?size=small, red_green_comp.png?size=medium 1.5x, red_green_comp.png?size=large 2x\" sizes=\"auto\" data-title=\"red_green_comp.png\" data-alt=\"red_green_comp.png\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e如上图,显然红色背景下的白色字体可读性更好,而绿色背景下可读性差多了。这是因为红色的视觉亮度更低,与白色的对比度更高。\u003c/p\u003e\n\u003cp\u003e如果想要得到一套对于人眼而言亮度更加均匀的颜色,那么使用RGB色彩空间是没有办法直观进行计算的,只能通过设计师的直觉慢慢进行调整,最终得到一个近似的结果。这么做导致调色的过程费事费力,而且最终的效果和设计师本身的经验和水平有很大关系。\u003c/p\u003e\n\u003cp\u003eCIE 1931 色彩空间的另一个问题是,它并没有给出估量颜色差别的直接方式。\u003c/p\u003e\n\u003cp\u003e测量两个颜色之间的差别的想法是 D.L. MacAdam 开发的并总结于 \u003ca href=\"https://en.wikipedia.org/wiki/MacAdam_ellipse\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eMacAdam 椭圆\u003c/a\u003e 的概念中,而在 XYZ 色彩空间中,两个颜色之间的欧氏距离并不能很好地表示人类视觉系统对于两个颜色之间的\u003cstrong\u003e差异\u003c/strong\u003e的感知。基于 MacAdam 的工作,在1960年开发了 CIE L*u*v* 色彩空间,并经过改良后得到了 CIE L*a*b* 色彩空间。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCIELAB 色彩空间(英语:CIELAB color space)\u003c/strong\u003e 又写为 L*a*b*,是 CIE 在 1976 年定义的色彩空间,是惯常用来描述人眼可见的所有颜色的最完备的色彩模型。\u003c/p\u003e\n\u003cp\u003e在这个模型中,L* 代表颜色的\u003cstrong\u003e亮度\u003c/strong\u003e(Lightness)( L* = 0 指示黑色而 L* = 100 指示白色),a* 和 b* 代表颜色的\u003cstrong\u003e色度偏移\u003c/strong\u003e(a* 指示颜色在红色/品红到绿色之间的位置,负值指示绿色,正值指示品红;b* 指示颜色在黄色和蓝色之间的位置,负值指示蓝色,正值指示黄色)。这个色彩模型用于充当做参照的设备无关的模型,用于描述颜色的感知。\u003c/p\u003e\n\u003cp\u003eL*a*b* 色彩空间也可以表达为 L*c*h*,其中 L* 的含义不变,而 c* 代表颜色的\u003cstrong\u003e色度\u003c/strong\u003e(Chroma),色度的含义与灰度类似,取值越高颜色越鲜艳;而 h* 代表颜色的\u003cstrong\u003e色相\u003c/strong\u003e(Hue),色相的含义与角度类似,更改色相就可以遍历色彩。下图展示了 L*a*b* 色彩空间在 L* 取不同值的色彩分布,只展示可充入 \u003ca href=\"https://zh.wikipedia.org/wiki/SRGB%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003esRGB\u003c/a\u003e 色域的颜色(因此可以显示在典型的计算机显示器上)。每个正方形的每个轴取值于 -128 到 127。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/Lab_color_space.png\" srcset=\"Lab_color_space.png?size=small, Lab_color_space.png?size=medium 1.5x, Lab_color_space.png?size=large 2x\" sizes=\"auto\" data-title=\"Lab_color_space.png\" data-alt=\"Lab_color_space.png\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003ch3 id=\"颜色距离\"\u003e颜色距离\u003c/h3\u003e\n\u003cp\u003e在 L*a*b* 色彩空间中,两个颜色之间的欧氏距离可以很好地表示人类视觉系统对于两个颜色之间的\u003cstrong\u003e差异\u003c/strong\u003e的感知。在 L*a*b* 中的均匀改变对应在感知颜色中的均匀改变。我们定义两个颜色的欧氏距离为$\\Delta E*_{ab}$,那么两个颜色$(L_1^*, a_1^*, b_1^*)$和$(L_2^*, a_2^*, b_2^*)$之间的距离就是:\u003c/p\u003e\n\u003cp\u003e$$\n\\Delta E*_{ab} = \\sqrt{(L_2^* - L_1^*)^2 + (a_2^* - a_1^*)^2 + (b_2^* - b_1^*)^2}\n$$\u003c/p\u003e\n\u003ch3 id=\"rgb--cmyk-与-lab-的转换\"\u003eRGB / CMYK 与 L*a*b* 的转换\u003c/h3\u003e\n\u003cp\u003e从 L*a*b* 色彩空间到 RGB / CMYK 等设备相关色彩的转换是一个复杂的过程,我们需要借助 XYZ 色彩空间作为中间桥梁。\u003c/p\u003e\n\u003ch3 id=\"xyz-与-lab-的转换\"\u003eXYZ 与 L*a*b* 的转换\u003c/h3\u003e\n\u003cp\u003e正向变换:\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\n\u0026amp;L* = 116 f(\\frac{Y}{Y_n}) - 16\\\\\n\u0026amp;a* = 500(f(\\frac{X}{X_n}) - f(\\frac{Y}{Y_n}))\\\\\n\u0026amp;b* = 200(f(\\frac{Y}{Y_n}) - f(\\frac{Z}{Z_n}))\\\\\n\\end{align}\n$$\u003c/p\u003e\n\u003cp\u003e其中 $(X_n, Y_n, Z_n)$ 是参照白点的三刺激值(下标 n 的含义是 \u003cem\u003eNormalized\u003c/em\u003e);其中 $f$ 函数的定义为:\u003c/p\u003e\n\u003cp\u003e$$\nf(t) = \\begin{cases}\nt^{\\frac{1}{3}} \u0026amp; t \u0026gt; (\\frac{6}{29})^3 \\\\\n\\frac{1}{3}(\\frac{29}{6})^2t + \\frac{16}{116} \u0026amp; t \\leq (\\frac{6}{29})^3\n\\end{cases}\n$$\u003c/p\u003e\n\u003cp\u003e这里 $f$ 函数被分开定义是为了防止在 $t = 0$ 时的无限斜率,在某个 $t = t_0$ 之下,$f(t)$ 被假定是线性的,并且被假定为匹配函数的 $t^{1/3}$部分在 $t_0$ 处的值和斜率。\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\nt_0^{1/3} \u0026amp;= at_0 + b\\\\\na \u0026amp;= \\frac{1}{3t_0^{2/3}}\n\\end{align}\n$$\u003c/p\u003e\n\u003cp\u003e我们指定一个 $\\delta = \\frac{6}{29}$,并令 $b = \\frac{2}{3}\\delta = \\frac{16}{116}$,上述两个方程对 $a$ 和 $t_0$ 有解:\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\na \u0026amp;= \\frac{1}{3\\delta^2} \u0026amp;= 7.787037…\\\\\nt_0 \u0026amp;= \\delta^3 \u0026amp;= 0.008856…\n\\end{align}\n$$\u003c/p\u003e\n\u003cp\u003e逆向变换:\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\n\u0026amp;f_Y \u0026amp;= \\frac{L^* + 16}{116}\\\\\n\u0026amp;f_X \u0026amp;= f_Y + \\frac{a^*}{500}\\\\\n\u0026amp;f_Z \u0026amp;= f_Y - \\frac{b^*}{200}\\\\\n\\end{align}\n$$\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\nY \u0026amp;= \\begin{cases}\nY_n(f_Y)^3 \u0026amp; f_Y \u0026gt; \\delta \\\\\nY_n(f_Y - \\frac{16}{116}) 3\\delta^2Y_n \u0026amp; f_Y \\leq \\delta\n\\end{cases}\\\\\nX \u0026amp;= \\begin{cases}\nX_n(f_X)^3 \u0026amp; f_X \u0026gt; \\delta \\\\\nX_n(f_X - \\frac{16}{116}) 3\\delta^2X_n \u0026amp; f_X \\leq \\delta\n\\end{cases}\\\\\nZ \u0026amp;= \\begin{cases}\nZ_n(f_Z)^3 \u0026amp; f_Z \u0026gt; \\delta \\\\\nZ_n(f_Z - \\frac{16}{116}) 3\\delta^2Z_n \u0026amp; f_Z \\leq \\delta\n\\end{cases}\n\\end{align}\n$$\u003c/p\u003e\n\u003ch2 id=\"oklab-色彩空间\"\u003eOKLAB 色彩空间\u003c/h2\u003e\n\u003cp\u003eCIELAB 色彩空间已经基本完备,但是它存在一个小问题:它的\u003cem\u003e色彩预测\u003c/em\u003e是不准确的。这里的色彩预测指的是给定色相和饱和度,预测颜色的亮度。但是在 CIELAB 中我们发现,亮度的预测并不是很准确,尤其是对蓝色来说,随着亮度的提高,整体颜色会往紫色偏移。\u003c/p\u003e\n\u003cp\u003e而 \u003ca href=\"https://bottosson.github.io/posts/oklab/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eOKLAB\u003c/a\u003e 通过重新设计色彩空间,解决了这个问题。如下对比图可以看出两者区别:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/lch_blue_hue_difference.avif\" srcset=\"lch_blue_hue_difference.avif?size=small, lch_blue_hue_difference.avif?size=medium 1.5x, lch_blue_hue_difference.avif?size=large 2x\" sizes=\"auto\" data-title=\"lch_blue_hue_difference.avif\" data-alt=\"lch_blue_hue_difference.avif\" class=\"suffix-invalid suffix-invalid__small suffix-invalid__large\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e另外我们还可以对比 HSL/HSV(RGB)色彩空间通过固定亮度和色度颜色渐变:\u003c/p\u003e\n\u003cp\u003eHSV:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/hue_hsv.png\" srcset=\"hue_hsv.png?size=small, hue_hsv.png?size=medium 1.5x, hue_hsv.png?size=large 2x\" sizes=\"auto\" data-title=\"HSV\" data-alt=\"HSV\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003eOKLAB:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/hue_oklab.png\" srcset=\"hue_oklab.png?size=small, hue_oklab.png?size=medium 1.5x, hue_oklab.png?size=large 2x\" sizes=\"auto\" data-title=\"OKLAB\" data-alt=\"OKLAB\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e由于没有一种比较好的办法来比较视觉亮度,这里以灰度做一个简单代替,需要注意的是灰度并不能等同于视觉亮度,只能大致描述。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e可以很明显的感知出两者的区别,OKLAB产生的渐变色彩在亮度上更加统一,而且色相的变化更加平滑。\u003c/p\u003e\n\u003cp\u003eOKLAB 色彩空间的定义如下:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eL\u003c/strong\u003e:视觉亮度;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ea\u003c/strong\u003e:颜色有多绿/红;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eb\u003c/strong\u003e:颜色有多蓝/黄;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e更常用的是极坐标形式的 $LCh^∘$ 色彩空间,其中\u003c/p\u003e\n\u003cp\u003e$$\nC = \\sqrt{a^2 + b^2}, h^∘ = \\arctan2(b, a)\n$$\u003c/p\u003e\n\u003cp\u003e而在实用意义上,$C$ 代表 Chroma,即颜色的饱和度,而 $h^∘$ 代表 Hue,即颜色的色相。\u003c/p\u003e\n\u003cp\u003e在\u003ca href=\"https://lch.oklch.com/#48.934546402228335,57.11239581426788,269.670268110566,100\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eLCH Color Picker \u0026amp; Converter\u003c/a\u003e中我们可以直观的调整 OKLAB 色彩的参数,以便更好地理解这个色彩空间:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/overview_with_colors/oklch_color_picker.webp\" srcset=\"oklch_color_picker.webp?size=small, oklch_color_picker.webp?size=medium 1.5x, oklch_color_picker.webp?size=large 2x\" sizes=\"auto\" data-title=\"oklch_color_picker.webp\" data-alt=\"oklch_color_picker.webp\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003ch3 id=\"推导\"\u003e推导\u003c/h3\u003e\n\u003cp\u003e为了定义 OKLAB,作者使用了三个数据集:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e使用 CAM16 和正常观看条件生成的具有相同亮度但随机色调和色度的颜色对的生成数据集。颜色仅限于指针色域(即一组可能的表面颜色)内;\u003c/li\u003e\n\u003cli\u003e使用 CAM16 和正常观看条件生成的具有相同色度但随机色调和亮度的颜色对的生成数据集。颜色仅限于指针色域(即一组可能的表面颜色)内;\u003c/li\u003e\n\u003cli\u003e用于导出 \u003ca href=\"https://scholarworks.rit.edu/theses/2858/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eIPT\u003c/a\u003e 的\u003ca href=\"https://doi.org/10.1117/12.298269\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e统一感知色相数据\u003c/a\u003e。在这些数据中,颜色被组合成具有相同感知色调的颜色对。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e这些数据集可用于分别测试亮度、色度和色调的\u003cem\u003e预测\u003c/em\u003e。如果颜色空间准确地模拟 $L$、$C$ 和 $h$,则亮度数据集中的颜色对应该具有相同的 $L$,色度数据集中的颜色对应该具有相同的 $C$,而色调数据集中的颜色对应该具有相同的 $h$。\u003c/p\u003e\n\u003ch3 id=\"rgb--cmyk-与-oklab-的转换\"\u003eRGB / CMYK 与 OKLAB 的转换\u003c/h3\u003e\n\u003cp\u003eRGB / CMYK 与 OKLAB 的转换同样需要借助 XYZ 色彩空间作为中间桥梁。\u003c/p\u003e\n\u003ch3 id=\"xyz-与-oklab-的转换\"\u003eXYZ 与 OKLAB 的转换\u003c/h3\u003e\n\u003cp\u003e给定 XYZ 坐标中的颜色,D65 白点 和 白色值 Y=1,我们可以通过以下过程计算出 OKLAB 色彩空间中的颜色:\u003c/p\u003e\n\u003cp\u003e首先,我们将 XYZ 坐标转换为近似的圆锥响应:\u003c/p\u003e\n\u003cp\u003e$$\n\\left[\n\\begin{array}{c}\nl\\\\ m\\\\ s\n\\end{array}\n\\right] = M_1 \\times\n\\left[\n\\begin{array}{c}\nX\\\\ Y\\\\ Z\n\\end{array}\n\\right]\n$$\u003c/p\u003e\n\u003cp\u003e再应用一轮非线性变换:\u003c/p\u003e\n\u003cp\u003e$$\n\\left[\n\\begin{array}{c}\nl’\\\\ m’\\\\ s\u0026#39;\n\\end{array}\n\\right] = \\left[\n\\begin{array}{c}\nl^{1/3}\\\\ m^{1/3}\\\\ s^{1/3}\n\\end{array}\n\\right]\n$$\u003c/p\u003e\n\u003cp\u003e最后将其转换为 $Lab$ 坐标:\u003c/p\u003e\n\u003cp\u003e$$\n\\left[\n\\begin{array}{c}\nL\\\\ a\\\\ b\n\\end{array}\n\\right] = M_2 \\times\n\\left[\n\\begin{array}{c}\nl’\\\\ m’\\\\ s\u0026#39;\n\\end{array}\n\\right]\n$$\u003c/p\u003e\n\u003cp\u003e$M_1$ 和 $M_2$ 是两个矩阵,定义如下:\u003c/p\u003e\n\u003cp\u003e$$\n\\begin{align}\nM_1 = \\left[\n\\begin{array}{ccc}\n+0.8189330101 ​\u0026amp;+0.3618667424 \u0026amp;−0.1288597137\\\\\n+0.0329845436 ​\u0026amp;+0.9293118715 \u0026amp;+0.0361456387\\\\\n+0.0482003018 ​\u0026amp;+0.2643662691 \u0026amp;+0.6338517070\n\\end{array}\n\\right]\n\\\\\nM_2 = \\left[\n\\begin{array}{ccc}\n+0.2104542553 \u0026amp;+0.7936177850 \u0026amp;-0.0040720468\\\\\n+1.9779984951 \u0026amp;−2.4285922050 \u0026amp;+0.4505937099\\\\\n+0.0259040371 \u0026amp;+0.7827717662 \u0026amp;-0.8086757660\n\\end{array}\n\\right]\n\\end{align}\n$$\u003c/p\u003e\n\u003cp\u003eOKLAB 色彩空间目前已经在现代浏览器中普及,可以通过 CSS 的 \u003ccode\u003eoklch()\u003c/code\u003e 函数直接使用。\u003c/p\u003e\n\u003cp\u003e利用 OKLAB 色彩空间,我们终于能够从人类感官的层面来定义一个颜色,并通过色彩空间模型对整个设计色彩体系进行预测与计算。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/overview_with_colors/"},{"title":"音乐与时间与蓝色星球#03 拍星星","time":"2024-02-04T21:00:11+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e有人想不开要学双拼输入法.jpg\u003c/p\u003e\n\u003cp\u003e这篇博客打算全部用双拼写,看看我能坚持多久,要是中途放弃了,我会标出来在哪里放弃的。\u003c/p\u003e\n\u003ch2 id=\"摄影\"\u003e摄影\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://blog.woooo.tech/posts/night_talk_001/#%E6%B6%88%E8%B4%B9\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e接上文\u003c/a\u003e,最后还是没忍住,花了9999大洋买回了人生中第一台相机,Nikon Zfc。镜头配了两个,一个是 Nikkor 18-140mm f/3.5-6.3 的变焦镜头,后来带出去拍星星发现光圈小的离谱,曝光时间需要很长很长,星轨都出来了,于是又整了个 25mm f/2 的定焦手动镜头。这两个镜头加起来差不多跟相机本体一样贵了。\u003c/p\u003e\n\u003cp\u003e要是有时间,我就写篇有关摄影的文章,讲点烂大街的摄影基础知识,这篇就算了。\u003c/p\u003e\n\u003ch2 id=\"拍星星\"\u003e拍星星\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003e人类从未停止过对星空的渴望\u003c/code\u003e —— 这是谁的台词来着。\u003c/p\u003e\n\u003cp\u003e不过确实,我经常半夜两三点出门去便利店整点吃的,有时候难得天气好,路过礼仪广场,抬头就能看到比较亮的星星,比如木星火星天狼星牛郎织女星,如果多驻足一会儿,等眼睛适应了黑暗,还能看见更多一点。不过西电光污染有点过分,即使在半夜三四点,地上的路灯和建筑灯光也能打亮半个天穹。\u003c/p\u003e\n\u003cp\u003e有时候觉得这样的景不拍下来可惜了,然后打开手机摄像头,手机表示它什么也看不见,然后开始使劲上调软件曝光,给你生产一张噪点比星星大的照片,就很。。。\u003c/p\u003e\n\u003cp\u003e买相机的想法就是那个时候萌生的。\u003c/p\u003e\n\u003cp\u003e买回来之后拍了很多张很多张,最开始以为跟手机拍摄应该没什么区别,瞎拍了几十张之后发现没有一张清楚的,于是去请教棒子和以太,看了一些摄影基础知识,然后才拍得像那么回事,堪堪赶上手机拍摄。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:拍了个什么玩意儿\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e不过西电的光污染还是太严重了,最后拍出来一张差不多能看的。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_003/DSC_0051.jpg\" srcset=\"DSC_0051.jpg?size=small, DSC_0051.jpg?size=medium 1.5x, DSC_0051.jpg?size=large 2x\" sizes=\"auto\" data-title=\"星星\" data-alt=\"星星\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e尽力了,真的尽力了。\u003c/p\u003e\n\u003cp\u003e此后又过了大概一个月,迎来了美好的寒假,于是想在村里完成拍星星的夙愿,结果发现三脚架没带,哦嚯,完蛋。\u003c/p\u003e\n\u003cp\u003e还好瓦楞屋顶救了我一命。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_003/old_woof.jpg\" srcset=\"old_woof.jpg?size=small, old_woof.jpg?size=medium 1.5x, old_woof.jpg?size=large 2x\" sizes=\"auto\" data-title=\"古典三脚架.jpg\" data-alt=\"古典三脚架.jpg\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e农村光污染情况确实好了很多,最后修出来的照片比我肉眼看到的星星数量还多:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_003/DSC_0474.jpg\" srcset=\"DSC_0474.jpg?size=small, DSC_0474.jpg?size=medium 1.5x, DSC_0474.jpg?size=large 2x\" sizes=\"auto\" data-title=\"肉眼都没看到过这么多\" data-alt=\"肉眼都没看到过这么多\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_003/DSC_0476.jpg\" srcset=\"DSC_0476.jpg?size=small, DSC_0476.jpg?size=medium 1.5x, DSC_0476.jpg?size=large 2x\" sizes=\"auto\" data-title=\"旁边的树效果意外的不错\" data-alt=\"旁边的树效果意外的不错\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/night_talk_003/"},{"title":"CTF 题目存储结构与类型插件化","time":"2024-01-20T02:34:01+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"起因\"\u003e起因\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cdel\u003e:哎这个 CTF 设计怎么这么抽象啊,又要有静态 flag 又要有动态 flag 还***要上 OJ 搞程序评测\u003c/del\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"现有方案\"\u003e现有方案(?)\u003c/h2\u003e\n\u003cp\u003e这个故事应该要从 CTFd 开始讲。 CTFd 本身设计为一个可以全方位扩展的解题平台,其 Flag 验证、平台功能都是采用插件化的结构来实现的。但是很不巧的是,这个插件化做的有一些问题,太过自由的结构导致给插件开发者带来了很大的心理负担和维护压力,仅仅实现功能还不够,还要附带实现前端,而一些逻辑还耦合在 Controller 中,导致遇到某些特殊的需求还得去改 CTFd 的源码。\u003c/p\u003e\n\u003cp\u003e原因之一是,CTFd 的文件管理功能是自带的,出题人上传一个题目文件,这个文件计算完hash之后会存入哈希路径,并在数据库中留下一条记录关联到对应的题目,然后按照原样提供给选手。在这个过程中,插件是无法进行侵入的,也就是说,文件管理本身是完全受限制的。而动态容器就不同了,CTFd 从设计之初就没有考虑过容器的问题,就导致整个容器管理都需要插件进行实现。于是,文件管理这个功能与容器管理是完全割裂开的。\u003c/p\u003e\n\u003cp\u003e再后来,GZ::CTF 逐渐占领了国内 CTF 赛事的市场。GZ::CTF 各方面用户体验做的很好,不过开发者为了整体用户体验舍弃了很多架构上的设计,其中包括自定义题目分类、题目插件化等等等。在题目文件的存储上 GZ::CTF 并没有做和 CTFd 区别很大的设计,加入了外链文件、根据队伍id动态分发题目文件等支持,但本地文件依旧是按照类似逻辑存储并关联到题目的。\u003c/p\u003e\n\u003cp\u003e这就导致一些需求在这种文件存储设计中实现起来很抽象,逻辑基本是耦合的:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e动态题目文件分发\u003c/strong\u003e:给每个队伍分发不同的题目文件,并映射到不同的flag,以此实现一些反作弊功能;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e动态环境挂载\u003c/strong\u003e:无法将题目文件挂载进选手使用的动态容器中。这个需求有一个固定的场景:OJ评测,我们有现成的评测容器,容器中会对选手的程序进行编译,并重定向输入输出文件,最终进行对比。如果仅使用容器机制进行测评的话,意味着我们每一道评测题目都需要将完整的输入输出评测文件打包进容器镜像之中;如果能够在启动容器时将文件动态挂载进去,那绝大部分评测题目只需要一个容器镜像就可以了;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e基于自定义规则的flag验证机制\u003c/strong\u003e:之前 @koito 提出过一个需求,希望能够自定义flag验证脚本,这样就可以提供一些更加复杂的题目类型和flag验证方式了。emmm虽然在Ruast中实现一个自定义验证脚本可能不是很容易,不过也不是不彳亍。问题在于,在传统模型下,flag验证只能拿到用户信息、题目信息以及用户提交的内容,过少的上下文导致了这个“自定义flag验证脚本”显得很鸡肋,你用吧,其实没比regex提供多少灵活性。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e以上这三个需求只是举个例子,他们都反映了一个共同的特点:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e选手下载文件、做题、提交flag到完成答案验证这个流程是强耦合的\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e一旦有一些新的需求,就需要在这个流程中进行修改,而插件系统一定是无法面面具到的,开发体验和使用体验总要扔一个。\u003c/p\u003e\n\u003cp\u003e那有没有什么二者兼顾而又不那么抽象的方案呢?没准有,看下面。\u003c/p\u003e\n\u003ch2 id=\"基于xxxx竞标一个nb的技术词汇的挑战应答题目机制\"\u003e基于XXXX(竞标一个NB的技术词汇)的挑战应答题目机制\u003c/h2\u003e\n\u003ch3 id=\"题目存储结构\"\u003e题目存储结构\u003c/h3\u003e\n\u003cp\u003e在创建题目时,平台会自动给题目分配一个专属存储目录,这里称之为 \u003ccode\u003eBucket\u003c/code\u003e。在 \u003ccode\u003eBucket\u003c/code\u003e 中,按照用途分为4个部分:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eprovided\u003c/code\u003e\u003c/strong\u003e:存放静态题目文件,上传到这里的文件会被直接提供给选手下载,不会进行任何处理;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003emapped\u003c/code\u003e\u003c/strong\u003e:存放动态题目文件,上传到这里的文件会被动态分发给选手,这里的设计其实是一个妥协,动态分发的特殊性导致这里的文件永远只能给选手分发\u003cstrong\u003e1个\u003c/strong\u003e对应文件,如果需要动态分发多个文件,就只能提前打包成tar/zip来解决了;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003epreserved\u003c/code\u003e\u003c/strong\u003e:存放额外的评测文件,这里的文件对选手是不可见的,但是会在选手提交flag时传递给flag验证器作为额外的上下文。在用途上其实可以很多样,例如把真正的flag验证逻辑作为脚本放在这个区域,然后实现一个flag验证器,在验证时启用某个脚本引擎运行这个脚本,配合相关文件和题目信息上下文进行验证,可以给到很高的自由度;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003emounted\u003c/code\u003e\u003c/strong\u003e:存放需要被挂载进容器中的文件,这里的文件会按照指定路径挂载进选手做题用的环境容器中。这里在某种程度上也许可以减小出题压力。例如制作各个版本带有xinetd的ubuntu镜像,出题人只需要设置好挂载路径并给出题目二进制文件本身即可作为一道完整的pwn题使用,不再需要自己写Dockerfile进行构建,可以很有效的复用现有的镜像资源。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"组件化题目验证机制\"\u003e组件化题目验证机制\u003c/h3\u003e\n\u003cp\u003e有了上述题目存储结构,接下来要实现一个能够利用这套存储结构的题目验证机制,同时,这套机制还应该能够很方便的进行扩展,以满足各种各样的需求。\u003c/p\u003e\n\u003cp\u003e首先,我们分析一下选手做题的流程,这里选了三种常见的题目类型:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e选手打开题目,下载题目附件,解出flag,提交flag并进行静态验证;\u003c/li\u003e\n\u003cli\u003e选手打开题目,下载动态附件,解出flag,提交flag并进行动态映射验证;\u003c/li\u003e\n\u003cli\u003e选手打开题目,启动题目环境,解出flag,提交flag并与环境中的flag对比验证;\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e接下来是管理员的操作流程:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e上传静态附件,设置flag;\u003c/li\u003e\n\u003cli\u003e上传动态附件,设置flag;\u003c/li\u003e\n\u003cli\u003e上传附件,不设置flag,配置题目镜像;\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e在这套流程中,题目验证机制总共有以下两个侵入点:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eflag验证:验证选手提交的flag是否正确;\u003c/li\u003e\n\u003cli\u003e动态容器:在选手启动容器时,动态设置容器的环境变量;\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e这两个侵入点都是可以通过插件进行扩展的,而且这两个侵入点的逻辑都是可以完全自定义的,这样就可以实现各种各样的题目类型了。\u003c/p\u003e\n\u003cdiv class=\"highlight\" id=\"id-1\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003epub\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003etrait\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eFlagChecker\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003easync\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efn\u003c/span\u003e \u003cspan class=\"nf\"\u003echeck\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003euser\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eUser\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echallenge\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eChallenge\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eflag\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"kt\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e-\u0026gt; \u003cspan class=\"nb\"\u003eResult\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eCheckerError\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003easync\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efn\u003c/span\u003e \u003cspan class=\"nf\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003euser\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eUser\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echallenge\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eChallenge\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e-\u0026gt; \u003cspan class=\"nb\"\u003eResult\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nb\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eCheckerError\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003easync\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efn\u003c/span\u003e \u003cspan class=\"nf\"\u003eenv_vars\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003euser\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eUser\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echallenge\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eChallenge\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e-\u0026gt; \u003cspan class=\"nb\"\u003eResult\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eHashMap\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nb\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eString\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eCheckerError\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"o\"\u003e..\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003epub\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eStaticAttachmentChecker\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003epub\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eDynamicAttachmentChecker\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecache\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eRedisPool\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003epub\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eEnvironmentChecker\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecache\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eRedisPool\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/challenge_storage/"},{"title":"katzekit 2 - FUSE 文件系统","time":"2024-01-08T12:31:38+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e文件系统是一种用来存储和组织计算机文件的\u003cstrong\u003e软件\u003c/strong\u003e。我们日常所说的硬盘只是一种存储介质,可以理解为一张白纸,但是这张纸并不能对上面的数据进行分块管理,也不能保证每一个bit在过了一段时间之后还是正确的。而文件系统就是用来管理这张纸的,除了存储文件的元数据信息之外,大部分文件系统还会提供校验码之类的数据安全保障,保证用户的数据不会因为存储介质的问题发生改变。\u003c/p\u003e\n\u003cp\u003e文件系统本身作为软件,还可以提供一些额外的功能,例如权限控制、加密、压缩、快照等等。这些功能都是在文件系统层面实现的,所以用户不需要关心具体的实现细节,只需要在使用的时候调用相应的接口就可以了。文件系统甚至还可以建立在另一个文件系统之上,例如 \u003ccode\u003ecvsfs-fuse\u003c/code\u003e 等等。\u003c/p\u003e\n\u003cp\u003e在用户空间文件系统(User-space Filesystems)出现之前,文件系统开发一直是操作系统内核开发人员的工作。创建一个新的文件系统需要了解内核编程和一些内核技术(例如vfs),但是移动存储设备的新兴和数据管理的需求使得这种文件系统开发方式显得很麻烦,应当有一种更加简洁好使的方案来开发文件系统,并能够在不同的操作系统中与原有API相互配合,于是便有了 \u003cstrong\u003eFUSE(Filesystem in Userspace)\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e本文的目的是简单探索 FUSE 的 API 接口与设计方式,在后续 katze 的开发中可以借鉴这一套方案进行设计。\u003c/p\u003e\n\u003ch2 id=\"fuse-简介\"\u003eFUSE 简介\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eFUSE(Filesystem in Userspace)\u003c/strong\u003e 即 用户空间文件系统,定义了一套简单的 API 接口用于文件系统与内核进行交互。FUSE 本身被设计为一个内核模块,用户空间文件系统通过实现 FUSE API 与 FUSE 模块配合,最终实现了在用户空间中对文件系统的访问。\u003c/p\u003e\n\u003cp\u003e使用 FUSE 开发的文件系统可以直接链接到 FUSE 库,也就是说使用这套文件系统框架不需要了解内核技术也不需要进行内核编程,极大地方便了文件系统开发工作。\u003c/p\u003e\n\u003ch3 id=\"历史--前身\"\u003e历史 \u0026amp; 前身\u003c/h3\u003e\n\u003cp\u003e用户空间文件系统并不是一个新的设计,在 FUSE 出现之前已经有了一些方案:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Linux_Userland_Filesystem\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eLUFS\u003c/a\u003e 是一种混合用户空间文件系统框架,可为任何应用程序透明地支持无限数量的文件系统,由内核模块和用户空间守护进程组成;\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://dl.acm.org/doi/pdf/10.1145/290409.290410\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eUfo\u003c/a\u003e 项目是 Solaris 的一个全局文件系统,允许用户像对待本地文件一样对待远程文件。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eFUSE 的主要目的是将这种文件系统实现引入 Linux。\u003c/p\u003e\n\u003ch2 id=\"fuse-operations\"\u003eFUSE Operations\u003c/h2\u003e\n\u003cp\u003e要在 FUSE 中创建文件系统,需要安装 FUSE 内核模块,然后使用 FUSE 库和 API 集来创建文件系统。\u003c/p\u003e\n\u003cp\u003e一般来说现代 Linux 发行版仓库里都会有 FUSE,并且作为默认内核模块提供。\u003c/p\u003e\n\u003cp\u003efuse_operation 结构体中的必要函数:\u003c/p\u003e\n\u003cdiv class=\"highlight\" id=\"id-1\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003efuse_operations\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egetattr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003estat\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ereadlink\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003esize_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egetdir\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efuse_dirh_t\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efuse_dirfil_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emknod\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003emode_t\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003edev_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emkdir\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003emode_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eunlink\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ermdir\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esymlink\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erename\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elink\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003echmod\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003emode_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003echown\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003euid_t\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003egid_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etruncate\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eoff_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eutime\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003eutimbuf\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003efuse_file_info\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eread\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003esize_t\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eoff_t\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003efuse_file_info\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ewrite\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003esize_t\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eoff_t\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003efuse_file_info\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estatfs\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003estatfs\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eflush\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003efuse_file_info\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erelease\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003efuse_file_info\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efsync\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003efuse_file_info\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esetxattr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003esize_t\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egetxattr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003esize_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elistxattr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003esize_t\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eremovexattr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egetattr\u003c/code\u003e:获取文件属性。这类似于 \u003ccode\u003estat()\u003c/code\u003e ,\u003ccode\u003est_dev\u003c/code\u003e 和 \u003ccode\u003est_blksize\u003c/code\u003e 将被忽略。除非给出 \u003ccode\u003euse_ino\u003c/code\u003e,否则 \u003ccode\u003est_ino\u003c/code\u003e 也会被忽略;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ereadlink\u003c/code\u003e:读取符号链接;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egetdir\u003c/code\u003e:读取目录的内容,此操作是 \u003ccode\u003eopendir()\u003c/code\u003e 、 \u003ccode\u003ereaddir()\u003c/code\u003e 、…、 \u003ccode\u003eclosedir()\u003c/code\u003e 操作序列组合成的。对于每个目录条目,应调用 \u003ccode\u003efilldir()\u003c/code\u003e 函数;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emknod\u003c/code\u003e:将创建一个文件节点;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emkdir\u003c/code\u003e:创建一个目录;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eunlink\u003c/code\u003e:删除一个文件;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ermdir\u003c/code\u003e:删除一个目录;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esymlink\u003c/code\u003e:创建一个符号链接;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erename\u003c/code\u003e:重命名一个文件;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elink\u003c/code\u003e:创建一个硬链接;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003echmod\u003c/code\u003e:更改文件权限;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003echown\u003c/code\u003e:更改文件所有者和组;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etruncate\u003c/code\u003e:更改文件大小;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eutime\u003c/code\u003e:更改文件访问和修改时间;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopen\u003c/code\u003e:打开文件;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eread\u003c/code\u003e:读取文件。\u003ccode\u003eread()\u003c/code\u003e 应准确返回请求的字节数,\u003ccode\u003eEOF\u003c/code\u003e 或错误除外。一个例外是当指定了 \u003ccode\u003edirect_io\u003c/code\u003e 时,\u003ccode\u003eread()\u003c/code\u003e 系统调用的返回值就是 \u003ccode\u003edirect_io\u003c/code\u003e 的返回值;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ewrite\u003c/code\u003e:写入文件;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatfs\u003c/code\u003e:获取文件系统状态;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eflush\u003c/code\u003e:刷新缓冲区;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erelease\u003c/code\u003e:释放打开的文件;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efsync\u003c/code\u003e:同步文件;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esetxattr\u003c/code\u003e:设置扩展属性;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egetxattr\u003c/code\u003e:获取扩展属性;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elistxattr\u003c/code\u003e:列出扩展属性;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e这些操作并不都是绝对必要的,仅实现其中一部分也可以构建一个完整的文件系统。\u003c/p\u003e\n\u003cp\u003e对于 katze 来说,我们只需要读取操作,所以实现的 API 可以简化不少:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egetattr\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egetdir\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eread\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatfs\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egetprops\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e实际实现中还会加一些内部方法。在这些方法中,我主要简化了文件读取操作为单个read,read会返回指定范围的文件内容,不会一次性读取整个文件。在实际实现中这种操作可能需要优化,对于根文件来说应当保留fd,否则每次调用read的时候都要走系统调用重新打开fd再关上,很浪费IO性能。但是对于镜像文件内的文件就没必要这么做了,因为所有的数据都是通过 relay 对象逐步定位到镜像文件上的。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/fuse_api/"},{"title":"跨平台 Native UI 开发:The Elm Structure for GUI","time":"2024-01-05T16:55:42+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\n\u003cp\u003e某 ZeroAurora: 你再搁这儿追求跨平台我就要说 transplatform 了\u003c/p\u003e\n\u003cp\u003e: 那tm是 crossplatform,cross!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"缘由\"\u003e缘由\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://elm-lang.org/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eElm\u003c/a\u003e 是一种函数式编程语言,这个项目在2012年才开始,对编程语言界这群动辄上个世纪的老东西们来说,挺新的。这个语言承诺不会出现运行时异常,并且声称有很出色的性能和“令人愉快的开发人员体验”(虽然每个语言都这么说,但是个人感觉着实没几门语言在大型项目里写起来真的令人愉快)。\u003c/p\u003e\n\u003cp\u003e实际上我也没有看见过有什么网站/开源项目是使用Elm写的——至少比较有名的开源项目里没怎么见过,但是 Elm Structure 却很经常出现在各种新兴的 UI 框架里,无论是 Web 端还是 Native GUI,比如 \u003ca href=\"https://redux.js.org/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eRedux\u003c/a\u003e,\u003ca href=\"https://github.com/iced-rs/iced\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eiced-rs\u003c/a\u003e,\u003ca href=\"https://github.com/Relm4/Relm4\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eRelm4\u003c/a\u003e,\u003ca href=\"https://raphlinus.github.io/rust/gui/2022/05/07/ui-architecture.html\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eXilem\u003c/a\u003e…等等等。\u003c/p\u003e\n\u003ch2 id=\"the-elm-architecture\"\u003eThe Elm Architecture\u003c/h2\u003e\n\u003cp\u003eElm 是一种用于构建交互式程序的模式。\u003c/p\u003e\n\u003cp\u003e按照他们自己的介绍,这种架构是写着写着自己变成这样的:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThis architecture seems to emerge naturally in Elm. Rather than someone inventing it, early Elm programmers kept discovering the same basic patterns in their code. It was kind of spooky to see people ending up with well-architected code without planning ahead!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"basic-pattern\"\u003eBasic Pattern\u003c/h3\u003e\n\u003cp\u003e在 Elm 的 UI 模型中,人机交互主要分为了三个部分:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eModel:用来表示应用程序的状态;\u003c/li\u003e\n\u003cli\u003eView:一种将状态转换为用户界面的方法;\u003c/li\u003e\n\u003cli\u003eUpdate:一种根据消息更新状态的方法;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e因此整个消息循环实际上呈现出下面这样的结构:\u003c/p\u003e\n\u003cdiv class=\"highlight\" id=\"id-1\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-plaintext\" data-lang=\"plaintext\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e +-----\u0026gt; View -------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e | |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e | v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Model \u0026lt;----------- Update\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e看起来有些像以前进化过的 \u003ca href=\"https://developer.mozilla.org/en-US/docs/Glossary/MVC\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eMVC(Model-View-Controller)\u003c/a\u003e 模型?但实际上不太一样,Elm 的架构要更加简单一些。在传统 MVC 架构中,View 的行为是通过 Controller 直接控制的,但是 View 的更改会直接影响 Model,然后 Controller 通过监听 Model 的变化来进行响应(也有的 MVC 模型是 Controller -\u0026gt; Model -\u0026gt; View 的,然后 View 与 Controller 进行双向交互响应);而 Elm 的架构中,View 操作会直接调用 Update 方法,Update 方法会采取措施更新 Model,最终 View 根据 Model 重新构建出用户界面达到一次响应。\u003c/p\u003e\n\u003cp\u003e我们可以发现 MVC 和 Elm 架构最大的区别是 Elm 保证了数据的单向流动。\u003c/p\u003e\n\u003ch3 id=\"relm4\"\u003eRelm4\u003c/h3\u003e\n\u003cp\u003eRelm4 是一个基于 gtk-rs 的 Native UI 框架。我以前一直对 gtk 抱有很大的偏见(\u003cdel\u003e一个经典的形容就是,GNOME/GTK就是巧克力味的屎,KDE/Qt是屎味的巧克力\u003c/del\u003e),但是不得不承认与其他 UI 框架相比,GTK 的可用性一直都是在线的。尝试了几个基于 GTK4 的应用之后,除了 Windows 下的字体渲染有点问题之外,其他的体验都还不错。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e欸 woc,copilot 都知道 Windows 下面各大框架都有啥问题,微软你能不能改改啊.jpg\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/elm_structure/1.png\" srcset=\"1.png?size=small, 1.png?size=medium 1.5x, 1.png?size=large 2x\" sizes=\"auto\" data-title=\"1.png\" data-alt=\"1.png\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"基本单元\"\u003e基本单元\u003c/h2\u003e\n\u003cp\u003e在 Elm Structure 中,\u003cstrong\u003e组件\u003c/strong\u003e 是整套UI系统的基本单元。一个 \u003cstrong\u003e组件\u003c/strong\u003e 被描述为构造用户界面的基本块,一个组件可以由多个组件组合而成。\u003c/p\u003e\n\u003ch3 id=\"状态和消息\"\u003e状态和消息\u003c/h3\u003e\n\u003cp\u003e每个组件都有以下三种数据结构:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003eModel\u003c/code\u003e:组件的状态;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eInput\u003c/code\u003e:组件从外部接收的消息;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eOutput\u003c/code\u003e:组件向外部发送的消息;\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e其中 \u003ccode\u003eModel\u003c/code\u003e 一般是一个结构体,里面存储着组件的持久化状态信息,而 \u003ccode\u003eInput\u003c/code\u003e 和 \u003ccode\u003eOutput\u003c/code\u003e 是枚举(Enum)类型,用来指示消息类型,并携带消息的内容。\u003c/p\u003e\n\u003cp\u003e在 Relm4 的设计中,组件依靠 \u003ccode\u003einit\u003c/code\u003e 和 \u003ccode\u003eupdate\u003c/code\u003e 函数进行消息的处理。当组件接收到消息时,\u003ccode\u003eupdate\u003c/code\u003e 函数就会被调用,然后函数根据枚举类型进行消息的分发处理,例如更新 \u003ccode\u003eModel\u003c/code\u003e,将消息转码之后转发 \u003ccode\u003eOutput\u003c/code\u003e 等等。\u003c/p\u003e\n\u003ch3 id=\"组件\"\u003e组件\u003c/h3\u003e\n\u003cp\u003e组件是状态、消息、处理逻辑和界面描述的组合,一个组件就表示了一个完整的具有响应性和对应行为的用户界面,例如一个会发送点击信号的按钮、能以编程方式和用户点击方式更改选中状态的单选框等等。\u003c/p\u003e\n\u003cp\u003e在 Relm4 中,组件是通过 \u003ccode\u003eSimpleComponent trait\u003c/code\u003e 来定义的,这个 \u003ccode\u003etrait\u003c/code\u003e 会要求开发者实现 \u003ccode\u003eModel\u003c/code\u003e、\u003ccode\u003eInput\u003c/code\u003e、\u003ccode\u003eOutput\u003c/code\u003e 的定义以及 \u003ccode\u003einit\u003c/code\u003e 和 \u003ccode\u003eupdate\u003c/code\u003e 函数,并提供了 \u003ccode\u003eview!\u003c/code\u003e 宏用来生成用户界面。\u003c/p\u003e\n\u003ch2 id=\"例子\"\u003e例子\u003c/h2\u003e\n\u003cp\u003e这里以一个简单的计数器作为例子。\u003c/p\u003e\n\u003cp\u003e首先我们要定义组件的状态,在这个例子中组件的状态就是计数器的值,所以我们定义一个 \u003ccode\u003eModel\u003c/code\u003e 结构体:\u003c/p\u003e\n\u003cdiv class=\"highlight\" id=\"id-2\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eAppModel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecounter\u003c/span\u003e: \u003cspan class=\"kt\"\u003eu8\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e接下来定义组件的消息,这里我们只需要一个 \u003ccode\u003eInput\u003c/code\u003e 类型的消息,用来表示用户点击了哪个按钮:\u003c/p\u003e\n\u003cdiv class=\"highlight\" id=\"id-3\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#[derive(Debug)]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003eenum\u003c/span\u003e \u003cspan class=\"nc\"\u003eAppInput\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eIncrement\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eDecrement\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e最后是界面定义和 \u003ccode\u003eSimpleComponent\u003c/code\u003e 的实现:\u003c/p\u003e\n\u003cdiv class=\"highlight\" id=\"id-4\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-rust\" data-lang=\"rust\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#[relm4::component]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003eimpl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eSimpleComponent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eAppModel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003etype\u003c/span\u003e \u003cspan class=\"nc\"\u003eInit\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eu8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003etype\u003c/span\u003e \u003cspan class=\"nc\"\u003eInput\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eAppMsg\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003etype\u003c/span\u003e \u003cspan class=\"nc\"\u003eOutput\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"fm\"\u003eview!\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003egtk\u003c/span\u003e::\u003cspan class=\"n\"\u003eWindow\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_title\u003c/span\u003e: \u003cspan class=\"nb\"\u003eSome\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Simple app\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_default_width\u003c/span\u003e: \u003cspan class=\"mi\"\u003e300\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_default_height\u003c/span\u003e: \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003egtk\u003c/span\u003e::\u003cspan class=\"nb\"\u003eBox\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_orientation\u003c/span\u003e: \u003cspan class=\"nc\"\u003egtk\u003c/span\u003e::\u003cspan class=\"n\"\u003eOrientation\u003c/span\u003e::\u003cspan class=\"n\"\u003eVertical\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_spacing\u003c/span\u003e: \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_margin_all\u003c/span\u003e: \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003egtk\u003c/span\u003e::\u003cspan class=\"n\"\u003eButton\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_label\u003c/span\u003e: \u003cspan class=\"s\"\u003e\u0026#34;Increment\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econnect_clicked\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003esender\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003emove\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003e_\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003esender\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einput\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eAppMsg\u003c/span\u003e::\u003cspan class=\"n\"\u003eIncrement\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003egtk\u003c/span\u003e::\u003cspan class=\"n\"\u003eButton\u003c/span\u003e::\u003cspan class=\"n\"\u003ewith_label\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Decrement\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econnect_clicked\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003esender\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003emove\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003e_\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003esender\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einput\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eAppMsg\u003c/span\u003e::\u003cspan class=\"n\"\u003eDecrement\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003egtk\u003c/span\u003e::\u003cspan class=\"n\"\u003eLabel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e#[watch]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_label\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eformat\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Counter: {}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecounter\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eset_margin_all\u003c/span\u003e: \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Initialize the UI.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efn\u003c/span\u003e \u003cspan class=\"nf\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecounter\u003c/span\u003e: \u003cspan class=\"nc\"\u003eSelf\u003c/span\u003e::\u003cspan class=\"n\"\u003eInit\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e: \u003cspan class=\"kp\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nc\"\u003eSelf\u003c/span\u003e::\u003cspan class=\"n\"\u003eRoot\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003esender\u003c/span\u003e: \u003cspan class=\"nc\"\u003eComponentSender\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"bp\"\u003eSelf\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e-\u0026gt; \u003cspan class=\"nc\"\u003eComponentParts\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"bp\"\u003eSelf\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eAppModel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecounter\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Insert the macro code generation here\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ewidgets\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"fm\"\u003eview_output!\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eComponentParts\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ewidgets\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efn\u003c/span\u003e \u003cspan class=\"nf\"\u003eupdate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"k\"\u003emut\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e: \u003cspan class=\"nc\"\u003eSelf\u003c/span\u003e::\u003cspan class=\"n\"\u003eInput\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003e_sender\u003c/span\u003e: \u003cspan class=\"nc\"\u003eComponentSender\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"bp\"\u003eSelf\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ematch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eAppMsg\u003c/span\u003e::\u003cspan class=\"n\"\u003eIncrement\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecounter\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecounter\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewrapping_add\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eAppMsg\u003c/span\u003e::\u003cspan class=\"n\"\u003eDecrement\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecounter\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecounter\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewrapping_sub\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eview!\u003c/code\u003e 宏中以一种类似于 QML 的声明式界面写法构造了用户界面,并将 \u003ccode\u003eButton\u003c/code\u003e 的点击事件连接到组件上,通过 \u003ccode\u003esender\u003c/code\u003e 方法通知 \u003ccode\u003eupdate\u003c/code\u003e 函数进行消息处理。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/elm_structure/"},{"title":"音乐与时间与蓝色星球#02 绿皮车","time":"2024-01-01T23:24:25+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"哐当\"\u003e哐当\u003c/h2\u003e\n\u003cp\u003e小时候家里为了省钱,过年经常会坐几个小时的绿皮车晃悠到老家。印象里那时候坐火车是件很大的事,父母提前好几天就会开始操心。等火车的时候不准玩手机,不准打开行李,生怕东西被扒手偷走了,也生怕看忘了时间错过了火车。上车之后就自由好多了,绿皮车经典3+2式座位,两列座位面对面,还有一张小桌子。印象中每次坐车都能碰到一些很有趣的人,坐车坐到一半总能和对面的乘客搭上几句话,然后聊上一整路。等到火车开到中途了,就会有一个推着各色特产的推销员到车厢里四处分发样品,然后开始一次长篇大论的推销 —— 大家都很感兴趣的样子,经常能跟推销员聊上一整路,但是最后下单购买的寥寥无几。大概是大家都知道是个什么套路,但是坐车途中实在无聊,于是都当乐子对待了。\u003c/p\u003e\n\u003ch2 id=\"呜\"\u003e呜——\u003c/h2\u003e\n\u003cp\u003e上大学之后就很少坐绿皮火车了。虽然学校离家倒也不算太远,绿皮车大概要坐11个小时,高铁4个半小时,跟一些偏远地区的同学回个家要坐两天一夜相比好多了。不过可能是全面小康卓有成效,除了第一次上大学和大学毕业最后一次从学校回家之外,坐的都是高铁了。高铁的椅子很舒服,车厢很干净,每个座位都有小桌板,路途上也很安静,但总感觉少了点什么。\u003c/p\u003e\n\u003ch2 id=\"故事从这里开始\"\u003e故事从这里开始\u003c/h2\u003e\n\u003cp\u003e刚上大学的时候就是坐绿皮车从家里晃悠到西安的,和父母一起。父母第一次来西安,坐火车在他们看来依旧是一件大事,来西安送我上学也是一件大事,张罗了好几箱行李。在火车上偶尔和其他乘客聊两句,说到是送孩子上大学的,对面也很惊讶,欸好巧啊我们也是。而具体的路上见闻已经太过久远,细节记不清楚了。后来到西安了学校组织了新生接送大巴统一给我们拉到学校,只记得大巴开了一个多小时才看到学校大门。我开玩笑说这学校这么偏,也不是啥好大学啊。我妈说没事,我看网上报道说2019年底地铁就修到西电了,到时候你们肯定去哪儿都方便。我说彳亍。\u003c/p\u003e\n\u003cp\u003e然后2023年底都过去了,地铁还是没修到西电。\u003c/p\u003e\n\u003ch2 id=\"怎么来的怎么回去\"\u003e怎么来的,怎么回去\u003c/h2\u003e\n\u003cp\u003e去年大学毕业,我跟棒子和银羽一起坐绿皮车回家。我们要去的地方都不一样,但是都在东边。于是买了卧铺,打算晃悠回去。想着四年前拿着一个红本本通知书坐绿皮车过来,四年后拿着一个红本本毕业证坐同一车次的绿皮车回去,大概也算有始有终。我上车的时候要困死了,找到床铺就失去意识了。感受到铁轨在背后一节一节过去,睡起来无比舒服。不过心里好像总有什么事一般,一个小时就醒一次。第一次醒,看见银羽和棒子正聊着;第二次醒,看见棒子在往上铺爬;第三次醒,看见银羽在对面的床上睡得正香;第四次醒,好像和上次醒没啥不同,不过天蒙蒙亮了。于是我没有继续睡,给电脑掏出来打开笔记打算写点什么,但是想了好大一会儿啥也没写出来。最后打开了VSCode,在手头的几个项目里漫无目的地改了一些无关紧要的东西,然后打开手机热点 \u003ccode\u003egit push\u003c/code\u003e 了一下。我也不知道我在干什么。\u003c/p\u003e\n\u003cp\u003e然后大概五点多快六点了,听到隔壁的隔壁床传来打电话的声音,似乎是一个正在上大学的男孩。我探出头瞄了一眼,烫着黄毛,在上铺趴着似乎是跟某个妹子打电话。电话里不乏 “我赚了不少钱,但我觉得钱不重要” 之类的话。大概是打激动了,声音越来越大,吐字还挺清晰,我听的一字不落,听起来似乎是妹子被人坑了,他正在试图劝导妹子,然后展现自己的实力balabala的,感觉挺有意思,但是五六点在这么小的车厢里讲相声属实有点不太合适,我打开群聊看了一眼,棒子正在群里骂这是个傻逼。然后看见棒子一脸没睡醒的样子从上铺爬下来,坐在银羽的床脚,银羽也醒了,我们几个一边听那哥们打电话一边小声吐槽。我甚至不知道他什么时候打完的电话,总之后面的记忆就只有这个插曲了。\u003c/p\u003e\n\u003ch2 id=\"虚假的幸福也是一瞬的幸福\"\u003e虚假的幸福也是一瞬的幸福\u003c/h2\u003e\n\u003cp\u003e上个个月吧,我正跟队友一起在杭州打比赛。然后导师突然发消息说打完比赛直接去兰州,做横向科研项目。我说彳亍,拉跟我一起去。然后打开订票软件一看,杭州飞兰州那几张票时间都很不合适。后来打电话跟我说,要不咱先坐火车去上海,然后从上海飞。缺点是要熬一宿,好处是上海到兰州的机票一大堆,而且还贼便宜,150就能飞过去。我说彳亍,肘!然后就有了这一段绿皮车记忆。\u003c/p\u003e\n\u003cp\u003e绿皮车和高铁飞机不一样,高铁飞机是按排编数字编号,然后每一排用字母编号,一眼就知道买了什么位置的座位。但是绿皮车座位是从1开始按顺序往下走的,第一个座位有时候还会从中间开始编,另一边放一个乘务员专座,所以就很难预测自己到底买了个什么座位。很不幸的是我跟刚好买了错开的两排,不过好在路途比较近,也就凑合着坐了。\u003c/p\u003e\n\u003cp\u003e上车以后,我对面是一个穿着蓝色衣服,扎着两根麻花辫,很符合电视剧里乡村女孩形象的妹子,目测大概接近30岁的样子。上车之后她就一直在说话,同时还掏出纸笔在小桌子上写写画画,我最开始以为她是带着无线耳机在和谁打电话,于是我也戴上耳机听了一会儿歌。这样大概过了一个小时,她还在自言自语个不停。这个时候我觉得好像有点蹊跷,没看见带耳机啊,甚至没看见她掏出来过手机。打电话的话,也没有单方面说个不停的。但是我带着耳机在听歌,也不太想摘下耳机听听她在说啥。过了一会儿她大概是说累了,于是趴在小桌子上,然后突然指了指桌子上的半块面包,抬头跟我说,你把面包往那边收收,我想趴在这儿。我摘下耳机,这面包不是我的,大概是上个人吃剩下的。她笑笑,然后说,如果这个是你的,我想吃一块儿。然后问我,你是去上海吗?我说是。她又问,我身边的人都跟我说,上海有人一个月能赚两三万,你觉得可能不,我迟疑了一下没有搭话。然后她又开始说,我觉得不可能,我上一份工作一个月才两三千,哪有人能拿那么高工资呀。\u003c/p\u003e\n\u003cp\u003e过了一会儿,她又问我,你喜欢上海吗?没等我回答,她接上自己的话茬,我就不喜欢上海,我觉得人太多了,为什么人有钱了就要往一个地方地方挤。我说,大城市各种资源可能都好一些吧。她又说,真的吗,我怎么没感觉呢。然后她又问我,如果你突然变得很有钱,你最想干什么?我说,我也不知道啊,没体验过有钱的生活,真有钱的话,大概会去找一个清静的地方过过日子吧。她说她也不知道。\u003c/p\u003e\n\u003cp\u003e她说她上一份工作没做好,现在手里欠了两万块钱,工作也辞职了。她看到她的朋友炒股,于是她自己也试了试,结果发现她好像有什么天赋,她投的股票100%中!于是她就给自己的工作全辞了,打算好好投资一笔。然后她又拿起纸笔开始算账,她说她发现自己投资纯利率有24%,但是巴菲特才只有8%,那她不出五年就能赚大钱。有钱以后的生活想想就美好啊。她说这句话的时候眼睛里全是光。我听她说了好久好久,有对未来的规划,有对过去不太好经历的讲述,甚至还说到了她身边的朋友,她朋友曾经跟她说你有这能力去证券所找个年薪三四百万的工作轻而易举。她说她再也不想工作了,还是投资更赚钱,就算年薪几百万,她这24%利率往上翻一翻没几年就会超过这个数。然后她又拿起纸笔一顿算。\u003c/p\u003e\n\u003cp\u003e我全程没说话。\u003c/p\u003e\n\u003cp\u003e我下车的时候,跟她说,祝愿你能过上好日子。她还沉浸在纸上那一个个利率和数字里,没有回答我。\u003c/p\u003e\n\u003cp\u003e我无数次想跟她说,投资是有风险的;你被骗了之类的话,但是每次看到她眼睛里的希望,我又憋了回去。我只是火车上的一个路人,我不知道她以前经历了什么,我也不知道她现状如何,只有一点我能确定,我说的话她肯定一句也听不进去。不仅听不进去,可能还会觉得我很煞风景。虚假的幸福也是一瞬的幸福,希望她在某个世界线真的能变成中国的巴菲特吧。\u003c/p\u003e\n\u003ch2 id=\"pending\"\u003epending……\u003c/h2\u003e\n\u003cp\u003e再偷偷放一下 \u003ccode\u003e834548135\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e这问题应该不难罢……\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/night_talk_002/"},{"title":"音乐与时间与蓝色星球#01 夜话","time":"2023-12-27T20:54:48+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\n\u003cp\u003enote1: 随便写写。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003enote2: 标题 neta 自 \u003ca href=\"https://www.bilibili.com/bangumi/play/ep703036\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eギターと孤独と蒼い惑星\u003c/a\u003e。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003enote3: 啊这篇不是写音乐的,只会点管乐,也对音乐没什么深入理解。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"夜话\"\u003e夜话\u003c/h2\u003e\n\u003cp\u003e最早看到“夜话”这个词是在读了 马南邨 先生写的\u003ca href=\"https://zh.wikipedia.org/wiki/%E7%87%95%E5%B1%B1%E5%A4%9C%E8%AF%9D\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e《燕山夜话》\u003c/a\u003e杂文专栏,看起来可有意思,文章很杂很多,什么都讲,就好像大半夜找了个兄弟出去梭哈大排档,或者无聊的时候陪某个有趣的长辈解闷,什么话题都能说上一段,聊着聊着天就亮了。但我当时并不太明白夜话是个什么意思,只是觉得能和其他人聊一晚上人生经历很有趣(也不完全是,在绿皮车上听贩子大吹特吹成功秘诀的时候我只想给他一)。现在想想,感觉夜话应该代表着一种友好的信息交流。《燕山夜话》朴实得几乎说不上有什么文采,读来却有一种难得的舒畅和愉悦。最浅近的字词,最直白的话语,就把事情说得清楚明白,决不故作高深,故弄玄虚。可惜那本很老的书不知道被扔在哪个充满灰尘的角落了,现在想重温还得满世界找找PDF看。\u003c/p\u003e\n\u003cp\u003e所以这篇文章(没准能多写几篇?)也不会有什么重点,也没有什么想要讨论的中心,想到啥就写点啥,不想写了就停,带伙看个乐呵就好。\u003c/p\u003e\n\u003cp\u003e今天考完了信安数基,昨天晚上为了应付这门考试复习了一个通宵,现在脑子还是晕晕乎乎的。事实证明通宵复习并不是什么好主意(虽然我本科期间都是这么过来的),上考场第一道题就给公式忘了,明明前一天晚上还拿着草稿纸演算了两遍。后半夜复习的时候我感觉自己就像是一个 K\u0026amp;R C 时代的 C 语言编译器,面对着一个 C++ 23 标准的一大堆模板声明不知所措。PPT上的每个中国字我都认识,连起来就解析不出来了。最后我只能借鉴现代编译技术的先进经验,把看不懂的当成字符串往脑子里塞,理解不了没关系,先背下来,上考场了再跑JIT。结果上考场了发现我这算力不如8086内存速度跟不上SDRAM的脑子根本跑不动JIT,只能装模作样的在草稿纸上留下一地鸡毛。\u003c/p\u003e\n\u003ch2 id=\"消费\"\u003e消费\u003c/h2\u003e\n\u003cp\u003e上半年天天emo的一大原因就是感觉自己干了一大堆一大堆活,然后全都被画饼行为搪塞过去了。然后这下半年竟然兑现了一些饼,手里有了点钱。\u003c/p\u003e\n\u003cp\u003e关于想买的东西我其实没什么特别的念想 —— 一般都是手里有点钱,然后在某个契机突然想到了某个东西,脑子一热就买了。比如两个月前还在天天熬夜肝代码的时候,经常在实验室通宵,半夜三四点出门去711便利店整点 女子 口乞 的,然后抬头看星星,天气好的时候能看到不少星星。突然有一天很想给星星拍下来,于是打开了手机相机往天上一咔嚓 —— 得到了一张黑乎乎的全是噪点的玩意儿。于是很想买一台单反。但是我当时没钱,我全身上下的钱加起来就够吃一个星期的,于是作罢。然后等到西电发血汗钱了,为数不多的自信心又回来了,让我康康!\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_001/IMG_6579.jpeg\" srcset=\"IMG_6579.jpeg?size=small, IMG_6579.jpeg?size=medium 1.5x, IMG_6579.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"WTF\" data-alt=\"WTF\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_001/IMG_6578.jpeg\" srcset=\"IMG_6578.jpeg?size=small, IMG_6578.jpeg?size=medium 1.5x, IMG_6578.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"你给我卖了吧要不\" data-alt=\"你给我卖了吧要不\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e不过星星还是好看的。那怎么拍呢,我想起来很久以前看过一个Google Daydream团队发的帖子,原帖找不着了,贴个\u003ca href=\"https://www.theverge.com/2017/4/27/15447130/google-post-processing-nighttime-mobile-photography\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e新闻\u003c/a\u003e。大意是给曝光时间调长,然后光圈调小,使劲儿曝光,然后在同一地点拍上64张照片,最后用算法合成,感觉彳亍,那试试。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_001/stars.jpg\" srcset=\"stars.jpg?size=small, stars.jpg?size=medium 1.5x, stars.jpg?size=large 2x\" sizes=\"auto\" data-title=\"星星\" data-alt=\"星星\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_001/stars-loc.jpg\" srcset=\"stars-loc.jpg?size=small, stars-loc.jpg?size=medium 1.5x, stars-loc.jpg?size=large 2x\" sizes=\"auto\" data-title=\"星图\" data-alt=\"星图\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e第二章是在 star walk 上找到了对应的星座位置图。\u003c/p\u003e\n\u003cp\u003e群友锐评:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_001/star-comment.jpg\" srcset=\"star-comment.jpg?size=small, star-comment.jpg?size=medium 1.5x, star-comment.jpg?size=large 2x\" sizes=\"auto\" data-title=\"star-comment.jpg\" data-alt=\"star-comment.jpg\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e看来是大失败,于是发了个空间,让带伙图一乐。但是还是忍不住,于是这几天又旁敲侧击问了问周围有相机的朋友,他们给设备一拿出来,如数家珍:这个机型几k,那个镜头几k,这一包大概四五万,你要入坑的话我先借你玩玩?给我吓得,不用了不用了,万一磕着碰着你给我卖去缅甸没准才能赔得起。最后看了半天看到尼康那个复古的zfc,金属机身贼帅,就发给朋友看了一眼,朋友说你又不咋拍,纯纯暴殄天物。然后我脑子里飘过了一些不好的回忆,也是,不暴殄天物了,下辈子再说。朋友好像意识到了什么不对,急忙改口,那你想买就买呗。但是心情已经没了,算了。\u003c/p\u003e\n\u003ch2 id=\"自我绑架\"\u003e自我绑架\u003c/h2\u003e\n\u003cp\u003e依稀记得上次因为 \u003ccode\u003e钱\u003c/code\u003e 闹矛盾还是在初中的时候,正值暑假,某个亲戚去我家玩,我爸妈上班去了,她就在我家跟我一起看店。然后来了个大学生模样的人,说想借电脑下载一个文档,我说彳亍,你来下,就给电脑让给她操作。然后那个亲戚就说你得付钱啊,下个文件付两块钱。然后顾客不乐意了,说刚刚说借的时候还没说付钱呢。亲戚:小孩子不懂事,你用我们的东西肯定是要付钱的。最后还是收了两块钱。我就跟她吵,我说就借五分钟电脑下个文件怎么还收钱啊,要那么多钱干什么。亲戚很激动,给我训了一顿,说我这么小一点金钱意识都没有,还拿了张纸条,工工整整的把“要那么多钱干什么”写了下来,说等我爸妈回来一定要给他们看看我说的什么话。后来我爸妈回来了,亲戚说了两句,走了,我跟我爸妈看着那个纸条都乐了。\u003c/p\u003e\n\u003cp\u003e所以钱到底意味着什么呢?从我受过的一贯教育来看,钱是表示价值的,用来交换同等使用价值的生活资料/生产资料。所以,赚更多的钱意味着可以更好的活着。是这样吗?钱确实重要,由于家里也穷,于是大三开始给社团和竞赛基地干活有一点稳定劳务费收入之后就没再要过生活费了。这两年尝试经济独立之后,经常会遇到意外消费然后给我手里那点钱烧空,下一笔劳务费/奖金还得等半个月于是得饿肚子的情况,不过总的来说能活下去。\u003c/p\u003e\n\u003cp\u003e跟钱比起来,我其实更怕的是麻烦人和麻烦事。既然钱是交换生存资料的媒介,那我能活着就够了,日常遇到跟钱有关的事情,我一般都会主动让别人来决定怎么分/怎么付,我亏点就亏点,图个少事清静。有时候点外卖点久了算不清钱了我就大致估算一下然后向上取整,一次性给别人。这么多年过来,我也没觉得自己吃亏了什么,反而觉得自己省了不少心,也再也没因为钱的事跟别人发生争执。\u003c/p\u003e\n\u003cp\u003e唯一不爽的是群友们天天在群里哭穷,但一个比一个有钱,于是有时候开玩笑就互相说你好有钱你好富,富哥v50。带伙都知道各自是在开玩笑也都不放在心上,不过有时候学校发点钱,一激动就分享到群里了,于是就要遭受群友的一通轰炸,最后说你发了这么大一笔钱不得请客?我说彳亍,吃啥,然后一个星期饭钱就出去了。过了几天其他群友的奖金也到帐了,我就很想在群里at ta,说ta是富哥,问ta什么时候请客吃饭,但是按照我这语言组织能力,话说出去颇有种在记恨别人终于能报仇了的感觉,有点逆天,也不是我原意,万一别人理解错了我又得难受半天,最后还得主动给别人道个歉,代价太高了,于是还是不说了,又憋回去。\u003c/p\u003e\n\u003cp\u003e有时候想消费一波也是的,明明自己的血汗钱,想买点什么还得藏着掖着有点奇怪,但是不藏着掖着被群友看见了开玩笑了我又得难受半天,有时候群友来一句你买这个没必要之类的话我就更难受了,主打一个自我绑架。大家也确实都没有恶意,但是听了就是受不了,如果以一种很严肃的语气说自己不喜欢这种开玩笑什么的又觉得很别扭,觉得自己在煞风景,于是就一直别扭地过着。\u003c/p\u003e\n\u003ch2 id=\"糖葫芦\"\u003e糖葫芦\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_001/haochi.jpg\" srcset=\"haochi.jpg?size=small, haochi.jpg?size=medium 1.5x, haochi.jpg?size=large 2x\" sizes=\"auto\" data-title=\"haochi.jpg\" data-alt=\"haochi.jpg\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003ch2 id=\"音乐\"\u003e音乐\u003c/h2\u003e\n\u003cp\u003e来点\u003ca href=\"http://163cn.tv/EFOgF2\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eDaydaydream\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e突然很想去充满生活气息的夜市里开一瓶菠萝啤,点几串烤肉再点一碗石凉粉。可惜西安没有石凉粉,信阳也没有好吃的路边烤肉。\u003c/p\u003e\n\u003cp\u003e想那只傻猫了。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/night_talk_001/gouzi.jpg\" srcset=\"gouzi.jpg?size=small, gouzi.jpg?size=medium 1.5x, gouzi.jpg?size=large 2x\" sizes=\"auto\" data-title=\"gouzi.jpg\" data-alt=\"gouzi.jpg\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003ch2 id=\"heading\"\u003e……\u003c/h2\u003e\n\u003cp\u003e真有人看的话,834548135.\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/night_talk_001/"},{"title":"2023 年度小结","time":"2023-12-24T22:11:49+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\n\u003cp\u003e不是刚写完2022的年度小结.jpg\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e写的时候回过头看了看2022的年度小结,感觉时间过的是真快啊。想想今年可能是我这辈子最有意思的一年,但是似乎写2022年度小结就在昨天,但今年发生的事好像已经过去一个世纪了,这是为什么呢.jpg\u003c/p\u003e\n\u003ch2 id=\"今年做了什么\"\u003e今年做了什么\u003c/h2\u003e\n\u003cp\u003e上了个研,\u003ca href=\"https://blog.woooo.tech/posts/travel_jpn\"\u003e然后真的去二次元的世界看了看\u003c/a\u003e。\u003c/p\u003e\n\u003ch2 id=\"迁移迁移迁移\"\u003e迁移,迁移,迁移\u003c/h2\u003e\n\u003cp\u003e要说起今年的开发工作,就俩字,\u003cstrong\u003e迁移\u003c/strong\u003e。每天打开电脑跑一下 \u003ccode\u003epnpm up --latest \u0026amp;\u0026amp; cargo upgrade --incompatible\u003c/code\u003e,总能给我带来点惊喜。因为 Vue 更新给 tsconfig 炸了,整个平台从 Vue 迁移到了 Svelte,年末 rust hyper 发布了 1.0 又是一阵鸡飞狗跳。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/2023_summary/fuck-pnpm.png\" srcset=\"fuck-pnpm.png?size=small, fuck-pnpm.png?size=medium 1.5x, fuck-pnpm.png?size=large 2x\" sizes=\"auto\" data-title=\"fuck-pnpm.png\" data-alt=\"fuck-pnpm.png\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/2023_summary/fuck-vite.png\" srcset=\"fuck-vite.png?size=small, fuck-vite.png?size=medium 1.5x, fuck-vite.png?size=large 2x\" sizes=\"auto\" data-title=\"fuck-vite.png\" data-alt=\"fuck-vite.png\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e然后是去西北师大部署了 Cyber Terminal 并通过了验收,算是给人生中的第一个商业项目告一段落。\u003c/p\u003e\n\u003ch2 id=\"上研\"\u003e上研\u003c/h2\u003e\n\u003cp\u003e本以为保研了就能轻松度过美好的大四时光,但是就后来的遭遇来看\u003ca href=\"https://blog.woooo.tech/posts/20230514\"\u003e大概是寄了\u003c/a\u003e。不过的人生主打一个魔幻,所以倒也合理。\u003c/p\u003e\n\u003cp\u003e上半年接着给学校干活,给毕设写完,然后总算是成功毕业了。心心念念的毕业旅行也去了几个地方,和董叔一起去了汉中,跟果果去苏州打了比赛,跟阳哥去霓虹到处打卡。虽然旅行主打一个穷游,能走路绝不坐车,倒也在路上看了不少风景,\u003cdel\u003e遗憾是手里没几个钱,所以没吃到什么好吃的\u003c/del\u003e。\u003c/p\u003e\n\u003cp\u003e下半年回到西电,一卡通上的年级已经从2019变成2023硕了,但学校还是那么个学校,人还是那一批人,没感觉有什么不同。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e换了个新宿舍,有了自己选的室友,电梯和24h热水,大成功\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e哦不同还是有的,教务处搞了个新签到系统,我这一学期去的课比我过去四年去的课加一起还多。课上老师要求也变了,以前本科都是能过就彳亍,这学期几门课上来就是要求读论文,做汇报(\u003cdel\u003e我又不是你组的 我又不搞你那方向,我读什么读,读得懂\u003c/del\u003e)。\u003c/p\u003e\n\u003ch2 id=\"看番\"\u003e看番\u003c/h2\u003e\n\u003cp\u003e看了不少,但如果要说比较想推的,是下面这三个:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.bilibili.com/bangumi/play/ss1560/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e灵感!\u003c/a\u003e,\u003ca href=\"https://www.bilibili.com/bangumi/play/ss4996/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e地狱少女\u003c/a\u003e,\u003ca href=\"https://www.bilibili.com/bangumi/play/ss6463/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e少女终末旅行\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e一个校园日常,一个经典老番,一个公路片。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e上面这几个只是今年比较对胃口的,如果真要说主推番的话还得是\u003ca href=\"https://www.netflix.com/hk/title/81054853\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e边缘行者\u003c/a\u003e,\u003ca href=\"https://www.bilibili.com/bangumi/play/ss43164/\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003e孤独摇滚\u003c/a\u003e,邦邦的MyGO。\n\u003cdel\u003e不想在博客上放奇怪的第三方动漫网站链接\u003c/del\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"明年\"\u003e明年?\u003c/h2\u003e\n\u003cp\u003e年末给博客翻新了一下,加了一些新东西,修了修样式,换了个评论系统,明年希望能多写点东西。\u003c/p\u003e\n\u003cp\u003e有点想写个架空世界观的公路片小说。\u003c/p\u003e\n\u003cp\u003e先活着吧。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/2023_summary/"},{"title":"二次元是怎么旅游的.jpg","time":"2023-11-18T08:09:06+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\n\u003cp\u003e小小记录一下。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e因为人已经回来很久了,博客里的照片都是带GPS等exif信息的,方便以后看地方;\u003c/li\u003e\n\u003cli\u003e这里放了很多很多图,小心流量;\u003c/li\u003e\n\u003cli\u003e由于博客不方便上传太大的图片,这儿都是压缩处理过一遍的jpg,有看中哪张图想要原图的戳我;\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"序曲\"\u003e序曲\u003c/h2\u003e\n\u003cp\u003e本科毕业的时候(就上半年),我攒了一点钱,打算毕业的时候多去几个地方玩一玩,好好来场毕业旅行。但是毕设加上一堆乱七八糟的事,还有填坑的原因,这笔钱没花出去,也没玩几个地方,就和董叔去汉中逛了两天。然后是浑浑噩噩的暑假,去苏州参加了一场比赛,然后开始每天按部就班的练科二。直到暑假的尾巴,才想起来这本科都毕业了,还没玩呢。\u003c/p\u003e\n\u003cp\u003e早在五月的时候,有个玩的很好的高中同学(下文称他阳哥)问我,要不要去日本玩一圈,他存了一笔钱,带我。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:有这好事?马上就去办护照签证。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e然后就真去办了护照,到暑假过了1/4才想起来。然后我俩开始折腾签证的事,最后找了家晦气旅行社,来回机票加签证坑了我俩一人5k,给这事定下来了。\u003c/p\u003e\n\u003cp\u003e走之前,我问他,咋走,\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e阳哥:别急,咱先去西安住几天。\u003c/p\u003e\n\u003cp\u003e:❓\u003c/p\u003e\n\u003cp\u003e阳哥:我有个玩伴之前找我借了点钱,咱去给钱要到就去日本。\u003c/p\u003e\n\u003cp\u003e:还有这事?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e然后我俩就跑到西安,定了五天酒店,刷完了双人成行,开了一个MC整合包,通关了森林之子。\u003c/p\u003e\n\u003cp\u003e然后临走了,我问他:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:要到帐了?\u003c/p\u003e\n\u003cp\u003e阳哥:借了2w,要回来2k。\u003c/p\u003e\n\u003cp\u003e:?\u003c/p\u003e\n\u003cp\u003e:你身上多少钱?\u003c/p\u003e\n\u003cp\u003e阳哥翻出钱包,掏出里面的10w日元(5k rmb)\u003c/p\u003e\n\u003cp\u003e:身上就1w rmb,还去不去?\u003c/p\u003e\n\u003cp\u003e阳哥:走。\u003c/p\u003e\n\u003cp\u003e:走,大不了学杀酱0元城市生存15天。\u003c/p\u003e\n\u003cp\u003e阳哥:?\u003c/p\u003e\n\u003cp\u003e阳哥:我觉得我把你肾卖了比较好。\u003c/p\u003e\n\u003cp\u003e:\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"北京--关西--大阪\"\u003e北京 ✈️ 关西 大阪\u003c/h2\u003e\n\u003ch3 id=\"08-22-到达\"\u003e08-22 到达\u003c/h3\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/IMG_4612-20231113021932-ztwapbe.jpeg\" srcset=\"IMG_4612-20231113021932-ztwapbe.jpeg?size=small, IMG_4612-20231113021932-ztwapbe.jpeg?size=medium 1.5x, IMG_4612-20231113021932-ztwapbe.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"IMG_4612\" data-alt=\"IMG_4612\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e阳哥是第一次坐飞机,但是他刚熬了一宿,上飞机就睡死了,连起飞的推背感都没叫醒他。\u003c/p\u003e\n\u003cp\u003e​​​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/IMG_4615-20231113022009-rmhtel6.jpeg\" srcset=\"IMG_4615-20231113022009-rmhtel6.jpeg?size=small, IMG_4615-20231113022009-rmhtel6.jpeg?size=medium 1.5x, IMG_4615-20231113022009-rmhtel6.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"IMG_4615\" data-alt=\"IMG_4615\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/IMG_4628-20231113022048-h9befn8.jpeg\" srcset=\"IMG_4628-20231113022048-h9befn8.jpeg?size=small, IMG_4628-20231113022048-h9befn8.jpeg?size=medium 1.5x, IMG_4628-20231113022048-h9befn8.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"IMG_4628\" data-alt=\"IMG_4628\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/IMG_4632-20231113022113-9uxkac7.jpeg\" srcset=\"IMG_4632-20231113022113-9uxkac7.jpeg?size=small, IMG_4632-20231113022113-9uxkac7.jpeg?size=medium 1.5x, IMG_4632-20231113022113-9uxkac7.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"IMG_4632\" data-alt=\"IMG_4632\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e到了关西。\u003c/p\u003e\n\u003cp\u003e接下来去大阪,先买票。阳哥不会讲洋文,自认为洋文还不错,就操着一口Chinglish上了。对着售票员比划了半天,她问我:Chinese?:yes yes。然后售票员操着一口比我还标准的普通话给我讲怎么买,给我把业务办完了。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e在外面等的阳哥:搞好了咩?\u003c/p\u003e\n\u003cp\u003e:得现金付,搞好了,但是是七天通票,没买今天的,今天还得买单程票。\u003c/p\u003e\n\u003cp\u003e阳哥:草,那你再去跟她交涉交涉?\u003c/p\u003e\n\u003cp\u003e:她中国话讲得比你好。\u003c/p\u003e\n\u003cp\u003e阳哥:?\u003c/p\u003e\n\u003cp\u003e阳哥:那剩下的钱呢?\u003c/p\u003e\n\u003cp\u003e:?什么钱?\u003c/p\u003e\n\u003cp\u003e阳哥:我给了你7w日元啊\u003c/p\u003e\n\u003cp\u003e挥了挥手里两张日本铁路全国通票:都在这儿了\u003c/p\u003e\n\u003cp\u003e阳哥:草\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/IMG_4637-20231113022903-i0ijl2c.jpeg\" srcset=\"IMG_4637-20231113022903-i0ijl2c.jpeg?size=small, IMG_4637-20231113022903-i0ijl2c.jpeg?size=medium 1.5x, IMG_4637-20231113022903-i0ijl2c.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"IMG_4637\" data-alt=\"IMG_4637\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e买了票,进了站,迷茫了,坐哪个车?\u003c/p\u003e\n\u003cp\u003e可惜站内的保安不会中国话,用英语问他怎么去Osaka,他叽里呱啦说了一堆明显听起来不是日语但是又不像是英语的东西,见我愣住了,于是开始张牙舞爪的比划,然后嘴里说you take 哈鲁卡 哈鲁卡,还是一脸懵b,直到看到了他指着一辆列车:哈鲁卡!\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/IMG_5186-20231113023310-o2jktc0.jpeg\" srcset=\"IMG_5186-20231113023310-o2jktc0.jpeg?size=small, IMG_5186-20231113023310-o2jktc0.jpeg?size=medium 1.5x, IMG_5186-20231113023310-o2jktc0.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"IMG_5186\" data-alt=\"IMG_5186\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e草。\u003c/p\u003e\n\u003cp\u003e后来道谢的时候我本来脱口而出的thank you又憋了回去,换成了阿里嘎多阔赛伊马斯。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/IMG_5188-20231113023513-a1c77u4.jpeg\" srcset=\"IMG_5188-20231113023513-a1c77u4.jpeg?size=small, IMG_5188-20231113023513-a1c77u4.jpeg?size=medium 1.5x, IMG_5188-20231113023513-a1c77u4.jpeg?size=large 2x\" sizes=\"auto\" data-title=\"IMG_5188\" data-alt=\"IMG_5188\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e于是坐着关西空港特急希望(Haruka)号到了大阪。\u003c/p\u003e\n\u003cp\u003e​​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230822_085104026_iOS.heic-20231117092740-kooe1m4.jpg\" srcset=\"20230822_085104026_iOS.heic-20231117092740-kooe1m4.jpg?size=small, 20230822_085104026_iOS.heic-20231117092740-kooe1m4.jpg?size=medium 1.5x, 20230822_085104026_iOS.heic-20231117092740-kooe1m4.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230822_085104026_iOS.heic\" data-alt=\"20230822_085104026_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​\u003c/p\u003e\n\u003cp\u003e坐JR坐到大阪天王寺,然后俩人又迷失在霓虹的奇妙交通里了。在地铁站里兜兜转转走了一圈又一圈还没弄明白这地铁咋坐的,这JR、Metro、近铁、单营、电车轨道都是什么玩意儿?转了一圈又一圈,还上错一趟车,最后总算是到了Airbnb订的民宿。\u003c/p\u003e\n\u003cp\u003e​ ​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_141507242_iOS.heic-20231117092755-1sit3mg.jpg\" srcset=\"20230823_141507242_iOS.heic-20231117092755-1sit3mg.jpg?size=small, 20230823_141507242_iOS.heic-20231117092755-1sit3mg.jpg?size=medium 1.5x, 20230823_141507242_iOS.heic-20231117092755-1sit3mg.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_141507242_iOS.heic\" data-alt=\"20230823_141507242_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e再便宜的日本民宿都必备的微波炉和浴缸。\u003c/p\u003e\n\u003cp\u003e放了行李,简单休息了一下,该吃晚饭了。外卖不知道怎么点,大众点评翻了一下附近4000円起步,想着拉倒吧不如出去找找小馆子钻一钻。这么想着,我俩就去街上晃悠了。晃了一圈没找到啥好吃的,于是挑了一家人还挺多的店进去,\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230822_120740359_iOS.heic-20231117092809-damm36m.jpg\" srcset=\"20230822_120740359_iOS.heic-20231117092809-damm36m.jpg?size=small, 20230822_120740359_iOS.heic-20231117092809-damm36m.jpg?size=medium 1.5x, 20230822_120740359_iOS.heic-20231117092809-damm36m.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230822_120740359_iOS.heic\" data-alt=\"20230822_120740359_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​​\u003c/p\u003e\n\u003cp\u003e一看菜单东北料理:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230822_112509159_iOS.heic-20231117092815-7rpupub.jpg\" srcset=\"20230822_112509159_iOS.heic-20231117092815-7rpupub.jpg?size=small, 20230822_112509159_iOS.heic-20231117092815-7rpupub.jpg?size=medium 1.5x, 20230822_112509159_iOS.heic-20231117092815-7rpupub.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230822_112509159_iOS.heic\" data-alt=\"20230822_112509159_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​​\u003c/p\u003e\n\u003cp\u003e番茄酱炒番茄,谁想出来的玩意儿。\u003c/p\u003e\n\u003cp\u003e​​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230822_115953637_iOS.heic-20231117092906-s3fnoew.jpg\" srcset=\"20230822_115953637_iOS.heic-20231117092906-s3fnoew.jpg?size=small, 20230822_115953637_iOS.heic-20231117092906-s3fnoew.jpg?size=medium 1.5x, 20230822_115953637_iOS.heic-20231117092906-s3fnoew.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230822_115953637_iOS.heic\" data-alt=\"20230822_115953637_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​​​\u003c/p\u003e\n\u003cp\u003e这抄馓子味道还不错其实。(阳哥:你来日本吃中餐❓ :那你来想吃啥。 阳哥:我觉得中餐也不错)\u003c/p\u003e\n\u003cp\u003e吃完饭,逛了逛附近,找着好几家711,进去一看一只卡芙卡坐在货架上。\u003c/p\u003e\n\u003cp\u003e​​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230822_110458148_iOS.heic.2-20231117092838-97hs6ko.jpg\" srcset=\"20230822_110458148_iOS.heic.2-20231117092838-97hs6ko.jpg?size=small, 20230822_110458148_iOS.heic.2-20231117092838-97hs6ko.jpg?size=medium 1.5x, 20230822_110458148_iOS.heic.2-20231117092838-97hs6ko.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230822_110458148_iOS.heic.2\" data-alt=\"20230822_110458148_iOS.heic.2\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230822_121208126_iOS.heic-20231117092853-cs25xxr.jpg\" srcset=\"20230822_121208126_iOS.heic-20231117092853-cs25xxr.jpg?size=small, 20230822_121208126_iOS.heic-20231117092853-cs25xxr.jpg?size=medium 1.5x, 20230822_121208126_iOS.heic-20231117092853-cs25xxr.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230822_121208126_iOS.heic\" data-alt=\"20230822_121208126_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​​\u003c/p\u003e\n\u003cp\u003e晚上回去想起来人都在日本了,啤酒烧烤启动!\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230822_123158000_iOS-20231117092912-7f88ohg.jpg\" srcset=\"20230822_123158000_iOS-20231117092912-7f88ohg.jpg?size=small, 20230822_123158000_iOS-20231117092912-7f88ohg.jpg?size=medium 1.5x, 20230822_123158000_iOS-20231117092912-7f88ohg.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230822_123158000_iOS\" data-alt=\"20230822_123158000_iOS\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e算了,打不了一点。\u003c/p\u003e\n\u003cp\u003e收拾收拾泡个澡差不多凌晨一两点了,刚说完睡觉,就听见阳哥的鼾声已经起来了。于是倒头就睡,睡到第二天上午十一点,一睁眼就是窗外整整齐齐一排垃圾。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_041207403_iOS.heic-20231117093057-zfrxq1q.jpg\" srcset=\"20230823_041207403_iOS.heic-20231117093057-zfrxq1q.jpg?size=small, 20230823_041207403_iOS.heic-20231117093057-zfrxq1q.jpg?size=medium 1.5x, 20230823_041207403_iOS.heic-20231117093057-zfrxq1q.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_041207403_iOS.heic\" data-alt=\"20230823_041207403_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e阳哥:你也去下面趴着\u003c/p\u003e\n\u003cp\u003e:❓\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"08-23-天守阁和鳗鱼饭\"\u003e08-23 天守阁和鳗鱼饭\u003c/h3\u003e\n\u003cp\u003e霓虹是靠左通行的,过马路时人不让车,司机大老远看见你有过马路的意向就会直接停下来等你过去,如果跟国内一样站着等司机开车过去的话,会尬住很长一段时间,最后还得是你先过马路,不然司机会按喇叭催你。头几天还不太习惯,后面几天看到路口我都是直接走的。(后遗症是回国了之后在北京这么走差点被京爷创死)\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_051338389_iOS.heic-20231117094017-ry16gld.jpg\" srcset=\"20230823_051338389_iOS.heic-20231117094017-ry16gld.jpg?size=small, 20230823_051338389_iOS.heic-20231117094017-ry16gld.jpg?size=medium 1.5x, 20230823_051338389_iOS.heic-20231117094017-ry16gld.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_051338389_iOS.heic\" data-alt=\"20230823_051338389_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_052049246_iOS.heic-20231117094024-pik1b3k.jpg\" srcset=\"20230823_052049246_iOS.heic-20231117094024-pik1b3k.jpg?size=small, 20230823_052049246_iOS.heic-20231117094024-pik1b3k.jpg?size=medium 1.5x, 20230823_052049246_iOS.heic-20231117094024-pik1b3k.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_052049246_iOS.heic\" data-alt=\"20230823_052049246_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e天守阁所在的大阪城公园离我们住的地方非常近,不到一公里。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_052617434_iOS.heic-20231117094717-dkv1j7w.jpg\" srcset=\"20230823_052617434_iOS.heic-20231117094717-dkv1j7w.jpg?size=small, 20230823_052617434_iOS.heic-20231117094717-dkv1j7w.jpg?size=medium 1.5x, 20230823_052617434_iOS.heic-20231117094717-dkv1j7w.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_052617434_iOS.heic\" data-alt=\"20230823_052617434_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_055147470_iOS.heic-20231117094818-1fwa9ga.jpg\" srcset=\"20230823_055147470_iOS.heic-20231117094818-1fwa9ga.jpg?size=small, 20230823_055147470_iOS.heic-20231117094818-1fwa9ga.jpg?size=medium 1.5x, 20230823_055147470_iOS.heic-20231117094818-1fwa9ga.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_055147470_iOS.heic\" data-alt=\"20230823_055147470_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​\u003c/p\u003e\n\u003cp\u003e满地的咕咕咕也不怎么怕人,买了个热狗卷被鸽子啄了一半。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_060349525_iOS.heic-20231117094915-1qw3xui.jpg\" srcset=\"20230823_060349525_iOS.heic-20231117094915-1qw3xui.jpg?size=small, 20230823_060349525_iOS.heic-20231117094915-1qw3xui.jpg?size=medium 1.5x, 20230823_060349525_iOS.heic-20231117094915-1qw3xui.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_060349525_iOS.heic\" data-alt=\"20230823_060349525_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_060613397_iOS.heic-20231117094925-8yqubsv.jpg\" srcset=\"20230823_060613397_iOS.heic-20231117094925-8yqubsv.jpg?size=small, 20230823_060613397_iOS.heic-20231117094925-8yqubsv.jpg?size=medium 1.5x, 20230823_060613397_iOS.heic-20231117094925-8yqubsv.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_060613397_iOS.heic\" data-alt=\"20230823_060613397_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_061557030_iOS.heic-20231117095008-4zsq81d.jpg\" srcset=\"20230823_061557030_iOS.heic-20231117095008-4zsq81d.jpg?size=small, 20230823_061557030_iOS.heic-20231117095008-4zsq81d.jpg?size=medium 1.5x, 20230823_061557030_iOS.heic-20231117095008-4zsq81d.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_061557030_iOS.heic\" data-alt=\"20230823_061557030_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e阳哥:天守阁怎么都装电梯了\u003c/p\u003e\n\u003cp\u003e:方便你上去捡雷神瞳\u003c/p\u003e\n\u003cp\u003e阳哥:❓\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e塔尖好像少了点什么,这样才河里:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_092204100_iOS-20231117095106-idax7of.jpg\" srcset=\"20230823_092204100_iOS-20231117095106-idax7of.jpg?size=small, 20230823_092204100_iOS-20231117095106-idax7of.jpg?size=medium 1.5x, 20230823_092204100_iOS-20231117095106-idax7of.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_092204100_iOS\" data-alt=\"20230823_092204100_iOS\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:你上去跟她对一刀?没事,我给你护照带回去,多少给你封个烈士\u003c/p\u003e\n\u003cp\u003e阳哥:你咋不去\u003c/p\u003e\n\u003cp\u003e:你看我这风神之眼还没亮呢,得先给你献祭了才行\u003c/p\u003e\n\u003cp\u003e阳哥:❓\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e转完回去想起来我带着电脑,刚准备打开发现霓虹插座标准跟国内不一样,看了眼时间还早,阳哥不想动弹,我就自己出去在大阪街上乱晃悠,到处找店问有没有卖转接线的。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_074955629_iOS.heic-20231117095617-gwuck53.jpg\" srcset=\"20230823_074955629_iOS.heic-20231117095617-gwuck53.jpg?size=small, 20230823_074955629_iOS.heic-20231117095617-gwuck53.jpg?size=medium 1.5x, 20230823_074955629_iOS.heic-20231117095617-gwuck53.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_074955629_iOS.heic\" data-alt=\"20230823_074955629_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e发现一个商店街,很有玉子市场既视感。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_081720936_iOS.heic-20231117095635-ldou74i.jpg\" srcset=\"20230823_081720936_iOS.heic-20231117095635-ldou74i.jpg?size=small, 20230823_081720936_iOS.heic-20231117095635-ldou74i.jpg?size=medium 1.5x, 20230823_081720936_iOS.heic-20231117095635-ldou74i.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_081720936_iOS.heic\" data-alt=\"20230823_081720936_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_081948704_iOS.heic-20231117095649-izbxerz.jpg\" srcset=\"20230823_081948704_iOS.heic-20231117095649-izbxerz.jpg?size=small, 20230823_081948704_iOS.heic-20231117095649-izbxerz.jpg?size=medium 1.5x, 20230823_081948704_iOS.heic-20231117095649-izbxerz.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_081948704_iOS.heic\" data-alt=\"20230823_081948704_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e兜兜转转从谷町-4转到了谷町-6,终于找到一家电工商店,花了1400円买了一根破破旧旧还没有接地的线。\u003c/p\u003e\n\u003cp\u003e回去之后,我俩合计着出去吃鳗鱼饭。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_114420645_iOS.heic-20231117095905-km73vvv.jpg\" srcset=\"20230823_114420645_iOS.heic-20231117095905-km73vvv.jpg?size=small, 20230823_114420645_iOS.heic-20231117095905-km73vvv.jpg?size=medium 1.5x, 20230823_114420645_iOS.heic-20231117095905-km73vvv.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_114420645_iOS.heic\" data-alt=\"20230823_114420645_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e挺好吃,就是量太少了。\u003c/p\u003e\n\u003cp\u003e晚上回去路过711,进去买了一瓶这个:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230823_120414970_iOS.heic-20231117100125-m6jdqn8.jpg\" srcset=\"20230823_120414970_iOS.heic-20231117100125-m6jdqn8.jpg?size=small, 20230823_120414970_iOS.heic-20231117100125-m6jdqn8.jpg?size=medium 1.5x, 20230823_120414970_iOS.heic-20231117100125-m6jdqn8.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230823_120414970_iOS.heic\" data-alt=\"20230823_120414970_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e说是改善睡眠质量,实际上就是酸奶,喝了感觉没啥用,但睡的还是不错。\u003c/p\u003e\n\u003ch2 id=\"大阪--东京\"\u003e大阪 东京\u003c/h2\u003e\n\u003ch3 id=\"08-24-东京和深夜动画\"\u003e08-24 东京和深夜动画\u003c/h3\u003e\n\u003cp\u003e在大阪只有天守阁一个打卡点,环球影城因为太远了就算了,我们两个啥b二次元就是来打卡的。于是24号JR全国通票生效的时候,我俩就打算去东京了。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_023131831_iOS.heic-20231117100315-1usumt9.jpg\" srcset=\"20230824_023131831_iOS.heic-20231117100315-1usumt9.jpg?size=small, 20230824_023131831_iOS.heic-20231117100315-1usumt9.jpg?size=medium 1.5x, 20230824_023131831_iOS.heic-20231117100315-1usumt9.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_023131831_iOS.heic\" data-alt=\"20230824_023131831_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e走的时候赶上了早高峰末潮,地铁上人不少,但是安静得可怕。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:……\u003c/p\u003e\n\u003cp\u003e阳哥:……\u003c/p\u003e\n\u003cp\u003e:你怎么这么有素质了\u003c/p\u003e\n\u003cp\u003e阳哥:❓\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_031726355_iOS.heic-20231117100436-5beoyls.jpg\" srcset=\"20230824_031726355_iOS.heic-20231117100436-5beoyls.jpg?size=small, 20230824_031726355_iOS.heic-20231117100436-5beoyls.jpg?size=medium 1.5x, 20230824_031726355_iOS.heic-20231117100436-5beoyls.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_031726355_iOS.heic\" data-alt=\"20230824_031726355_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_032639394_iOS.heic-20231117100445-o2c4sle.jpg\" srcset=\"20230824_032639394_iOS.heic-20231117100445-o2c4sle.jpg?size=small, 20230824_032639394_iOS.heic-20231117100445-o2c4sle.jpg?size=medium 1.5x, 20230824_032639394_iOS.heic-20231117100445-o2c4sle.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_032639394_iOS.heic\" data-alt=\"20230824_032639394_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_033835691_iOS.heic-20231117100509-lq6jstl.jpg\" srcset=\"20230824_033835691_iOS.heic-20231117100509-lq6jstl.jpg?size=small, 20230824_033835691_iOS.heic-20231117100509-lq6jstl.jpg?size=medium 1.5x, 20230824_033835691_iOS.heic-20231117100509-lq6jstl.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_033835691_iOS.heic\" data-alt=\"20230824_033835691_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_062458945_iOS.heic-20231117100521-8kpc2yu.jpg\" srcset=\"20230824_062458945_iOS.heic-20231117100521-8kpc2yu.jpg?size=small, 20230824_062458945_iOS.heic-20231117100521-8kpc2yu.jpg?size=medium 1.5x, 20230824_062458945_iOS.heic-20231117100521-8kpc2yu.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_062458945_iOS.heic\" data-alt=\"20230824_062458945_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e日本的云是真的好看,一块儿天空上各种类型的云都齐活了,看起来真的感觉云上还有一片陆地,还有一个国家。\u003c/p\u003e\n\u003cp\u003e然后到了东京:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_072450273_iOS.heic-20231117100645-gzxnjwv.jpg\" srcset=\"20230824_072450273_iOS.heic-20231117100645-gzxnjwv.jpg?size=small, 20230824_072450273_iOS.heic-20231117100645-gzxnjwv.jpg?size=medium 1.5x, 20230824_072450273_iOS.heic-20231117100645-gzxnjwv.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_072450273_iOS.heic\" data-alt=\"20230824_072450273_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_073026087_iOS.heic-20231117100733-s3eedha.jpg\" srcset=\"20230824_073026087_iOS.heic-20231117100733-s3eedha.jpg?size=small, 20230824_073026087_iOS.heic-20231117100733-s3eedha.jpg?size=medium 1.5x, 20230824_073026087_iOS.heic-20231117100733-s3eedha.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_073026087_iOS.heic\" data-alt=\"20230824_073026087_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e在东京民宿的电视上翻到了MyGO!和赛马娘,\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_084829970_iOS.heic-20231117100931-atwfyea.jpg\" srcset=\"20230824_084829970_iOS.heic-20231117100931-atwfyea.jpg?size=small, 20230824_084829970_iOS.heic-20231117100931-atwfyea.jpg?size=medium 1.5x, 20230824_084829970_iOS.heic-20231117100931-atwfyea.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_084829970_iOS.heic\" data-alt=\"20230824_084829970_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e果断点了个预约。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_105527536_iOS.heic-20231117101401-4vd5kfv.jpg\" srcset=\"20230824_105527536_iOS.heic-20231117101401-4vd5kfv.jpg?size=small, 20230824_105527536_iOS.heic-20231117101401-4vd5kfv.jpg?size=medium 1.5x, 20230824_105527536_iOS.heic-20231117101401-4vd5kfv.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_105527536_iOS.heic\" data-alt=\"20230824_105527536_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_132658919_iOS.heic-20231117101020-4fsdpzr.jpg\" srcset=\"20230824_132658919_iOS.heic-20231117101020-4fsdpzr.jpg?size=small, 20230824_132658919_iOS.heic-20231117101020-4fsdpzr.jpg?size=medium 1.5x, 20230824_132658919_iOS.heic-20231117101020-4fsdpzr.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_132658919_iOS.heic\" data-alt=\"20230824_132658919_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_132850673_iOS.heic-20231117101036-6lce6oa.jpg\" srcset=\"20230824_132850673_iOS.heic-20231117101036-6lce6oa.jpg?size=small, 20230824_132850673_iOS.heic-20231117101036-6lce6oa.jpg?size=medium 1.5x, 20230824_132850673_iOS.heic-20231117101036-6lce6oa.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_132850673_iOS.heic\" data-alt=\"20230824_132850673_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_141459503_iOS.heic-20231117101045-ddq7mvo.jpg\" srcset=\"20230824_141459503_iOS.heic-20231117101045-ddq7mvo.jpg?size=small, 20230824_141459503_iOS.heic-20231117101045-ddq7mvo.jpg?size=medium 1.5x, 20230824_141459503_iOS.heic-20231117101045-ddq7mvo.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_141459503_iOS.heic\" data-alt=\"20230824_141459503_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e晚上想着出去吃点啥,一出门就看见了天空树,作为地标建筑真的好看:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_101026254_iOS.heic-20231117100956-6sju6fm.jpg\" srcset=\"20230824_101026254_iOS.heic-20231117100956-6sju6fm.jpg?size=small, 20230824_101026254_iOS.heic-20231117100956-6sju6fm.jpg?size=medium 1.5x, 20230824_101026254_iOS.heic-20231117100956-6sju6fm.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_101026254_iOS.heic\" data-alt=\"20230824_101026254_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e在大众点评上找了家和牛,想着奢侈一把,结果店家可能知道我俩没几个钱,今天不开业:\u003c/p\u003e\n\u003cp\u003e​​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_101009379_iOS.heic-20231117101240-x5ivdl6.jpg\" srcset=\"20230824_101009379_iOS.heic-20231117101240-x5ivdl6.jpg?size=small, 20230824_101009379_iOS.heic-20231117101240-x5ivdl6.jpg?size=medium 1.5x, 20230824_101009379_iOS.heic-20231117101240-x5ivdl6.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_101009379_iOS.heic\" data-alt=\"20230824_101009379_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​\u003c/p\u003e\n\u003cp\u003e最后去吃拉面了。吃前忘记拍了,吃完了拍一张:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230824_103718227_iOS.heic-20231117101519-8lqbd45.jpg\" srcset=\"20230824_103718227_iOS.heic-20231117101519-8lqbd45.jpg?size=small, 20230824_103718227_iOS.heic-20231117101519-8lqbd45.jpg?size=medium 1.5x, 20230824_103718227_iOS.heic-20231117101519-8lqbd45.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230824_103718227_iOS.heic\" data-alt=\"20230824_103718227_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:你觉得这面正宗\u003c/p\u003e\n\u003cp\u003e阳哥:我又不是本地人,我咋知道\u003c/p\u003e\n\u003cp\u003e:你不是本地人❓\u003c/p\u003e\n\u003cp\u003e阳哥:❓\u003c/p\u003e\n\u003cp\u003e:我不好说,这面跟西电那家日式豚骨拉面一个味儿\u003c/p\u003e\n\u003cp\u003e阳哥:西电东京分校是吧\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e晚上啤酒烧烤时间。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_021336138_iOS.heic-20231117102045-515jw2e.jpg\" srcset=\"20230825_021336138_iOS.heic-20231117102045-515jw2e.jpg?size=small, 20230825_021336138_iOS.heic-20231117102045-515jw2e.jpg?size=medium 1.5x, 20230825_021336138_iOS.heic-20231117102045-515jw2e.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_021336138_iOS.heic\" data-alt=\"20230825_021336138_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e主打一个全靠带。\u003c/p\u003e\n\u003ch3 id=\"08-25-浅草寺---秋叶原---天空树\"\u003e08-25 浅草寺 - 秋叶原 - 天空树\u003c/h3\u003e\n\u003cp\u003e浅草寺人挺多,有不少求御守的。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:求一个?\u003c/p\u003e\n\u003cp\u003e阳哥:不如回去拜孙悟空\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_024846800_iOS.heic-20231117102210-mf8h64z.jpg\" srcset=\"20230825_024846800_iOS.heic-20231117102210-mf8h64z.jpg?size=small, 20230825_024846800_iOS.heic-20231117102210-mf8h64z.jpg?size=medium 1.5x, 20230825_024846800_iOS.heic-20231117102210-mf8h64z.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_024846800_iOS.heic\" data-alt=\"20230825_024846800_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:中午吃啥\u003c/p\u003e\n\u003cp\u003e阳哥:我不到啊\u003c/p\u003e\n\u003cp\u003e:我也不到啊\u003c/p\u003e\n\u003cp\u003e阳哥:mcd吃不吃\u003c/p\u003e\n\u003cp\u003e:你来日本就吃mcd❓\u003c/p\u003e\n\u003cp\u003e阳哥:你来日本还吃中餐呢\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_030152527_iOS.heic-20231117103015-ajk2ac7.jpg\" srcset=\"20230825_030152527_iOS.heic-20231117103015-ajk2ac7.jpg?size=small, 20230825_030152527_iOS.heic-20231117103015-ajk2ac7.jpg?size=medium 1.5x, 20230825_030152527_iOS.heic-20231117103015-ajk2ac7.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_030152527_iOS.heic\" data-alt=\"20230825_030152527_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e吃完午饭就该去秋叶原了,二次元天堂!\u003c/p\u003e\n\u003cp\u003e结果还没到秋叶原呢,路边看到了个二次元牌子,以为是什么展览,凑近一看:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_035329595_iOS.heic-20231117103208-69di5tl.jpg\" srcset=\"20230825_035329595_iOS.heic-20231117103208-69di5tl.jpg?size=small, 20230825_035329595_iOS.heic-20231117103208-69di5tl.jpg?size=medium 1.5x, 20230825_035329595_iOS.heic-20231117103208-69di5tl.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_035329595_iOS.heic\" data-alt=\"20230825_035329595_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_035340181_iOS.heic-20231117103320-fqm4182.jpg\" srcset=\"20230825_035340181_iOS.heic-20231117103320-fqm4182.jpg?size=small, 20230825_035340181_iOS.heic-20231117103320-fqm4182.jpg?size=medium 1.5x, 20230825_035340181_iOS.heic-20231117103320-fqm4182.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_035340181_iOS.heic\" data-alt=\"20230825_035340181_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e好家伙,消防队。\u003c/p\u003e\n\u003cp\u003e路上看到不少很二次元的店,这个好像是女仆咖啡厅:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_035158978_iOS.heic-20231117103121-4x65ux3.jpg\" srcset=\"20230825_035158978_iOS.heic-20231117103121-4x65ux3.jpg?size=small, 20230825_035158978_iOS.heic-20231117103121-4x65ux3.jpg?size=medium 1.5x, 20230825_035158978_iOS.heic-20231117103121-4x65ux3.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_035158978_iOS.heic\" data-alt=\"20230825_035158978_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e悄悄Google了一下价格,没敢进去。\u003c/p\u003e\n\u003cp\u003e然后到了秋叶原。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_035721161_iOS.heic-20231117103429-nmts54u.jpg\" srcset=\"20230825_035721161_iOS.heic-20231117103429-nmts54u.jpg?size=small, 20230825_035721161_iOS.heic-20231117103429-nmts54u.jpg?size=medium 1.5x, 20230825_035721161_iOS.heic-20231117103429-nmts54u.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_035721161_iOS.heic\" data-alt=\"20230825_035721161_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:怎么全是原神方舟星穹铁道\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e让bocchi酱站这儿属实太难为社恐了\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_041859475_iOS.heic-20231117103533-hw4cg29.jpg\" srcset=\"20230825_041859475_iOS.heic-20231117103533-hw4cg29.jpg?size=small, 20230825_041859475_iOS.heic-20231117103533-hw4cg29.jpg?size=medium 1.5x, 20230825_041859475_iOS.heic-20231117103533-hw4cg29.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_041859475_iOS.heic\" data-alt=\"20230825_041859475_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e整点专辑带回去:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_042932099_iOS.heic-20231117103544-f8rat5y.jpg\" srcset=\"20230825_042932099_iOS.heic-20231117103544-f8rat5y.jpg?size=small, 20230825_042932099_iOS.heic-20231117103544-f8rat5y.jpg?size=medium 1.5x, 20230825_042932099_iOS.heic-20231117103544-f8rat5y.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_042932099_iOS.heic\" data-alt=\"20230825_042932099_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_064047798_iOS.heic-20231117103738-q61x750.jpg\" srcset=\"20230825_064047798_iOS.heic-20231117103738-q61x750.jpg?size=small, 20230825_064047798_iOS.heic-20231117103738-q61x750.jpg?size=medium 1.5x, 20230825_064047798_iOS.heic-20231117103738-q61x750.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_064047798_iOS.heic\" data-alt=\"20230825_064047798_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_044630196_iOS.heic-20231117103623-4hhvq4x.jpg\" srcset=\"20230825_044630196_iOS.heic-20231117103623-4hhvq4x.jpg?size=small, 20230825_044630196_iOS.heic-20231117103623-4hhvq4x.jpg?size=medium 1.5x, 20230825_044630196_iOS.heic-20231117103623-4hhvq4x.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_044630196_iOS.heic\" data-alt=\"20230825_044630196_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e我超,________!\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_044400389_iOS.heic-20231117103608-q8e28bm.jpg\" srcset=\"20230825_044400389_iOS.heic-20231117103608-q8e28bm.jpg?size=small, 20230825_044400389_iOS.heic-20231117103608-q8e28bm.jpg?size=medium 1.5x, 20230825_044400389_iOS.heic-20231117103608-q8e28bm.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_044400389_iOS.heic\" data-alt=\"20230825_044400389_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e来霓虹不进机厅的人生是失败的:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_064656215_iOS.heic-20231117103805-95ra8o8.jpg\" srcset=\"20230825_064656215_iOS.heic-20231117103805-95ra8o8.jpg?size=small, 20230825_064656215_iOS.heic-20231117103805-95ra8o8.jpg?size=medium 1.5x, 20230825_064656215_iOS.heic-20231117103805-95ra8o8.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_064656215_iOS.heic\" data-alt=\"20230825_064656215_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e没带手套,手搓疼了。\u003c/p\u003e\n\u003cp\u003e一天的战利品:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_085442657_iOS.heic-20231117103901-81mcah2.jpg\" srcset=\"20230825_085442657_iOS.heic-20231117103901-81mcah2.jpg?size=small, 20230825_085442657_iOS.heic-20231117103901-81mcah2.jpg?size=medium 1.5x, 20230825_085442657_iOS.heic-20231117103901-81mcah2.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_085442657_iOS.heic\" data-alt=\"20230825_085442657_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e阳哥:你在日本买国内游戏周边❓\u003c/p\u003e\n\u003cp\u003e:可这是 Sweets Paradise 联名欸,国内又不卖\u003c/p\u003e\n\u003cp\u003e阳哥:sb二次元\u003c/p\u003e\n\u003cp\u003e:你给你手办扔了再说话\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e晚上随便对付了两口,打算去天空树。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e阳哥:看看地图咋走\u003c/p\u003e\n\u003cp\u003e:还用看地图?你看天上那个一直发光的是啥\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_103517144_iOS.heic-20231117104136-2407d96.jpg\" srcset=\"20230825_103517144_iOS.heic-20231117104136-2407d96.jpg?size=small, 20230825_103517144_iOS.heic-20231117104136-2407d96.jpg?size=medium 1.5x, 20230825_103517144_iOS.heic-20231117104136-2407d96.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_103517144_iOS.heic\" data-alt=\"20230825_103517144_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e看着好像挺近的,给我俩腿都快走断了。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_104025118_iOS.heic-20231117104221-p8hbk3c.jpg\" srcset=\"20230825_104025118_iOS.heic-20231117104221-p8hbk3c.jpg?size=small, 20230825_104025118_iOS.heic-20231117104221-p8hbk3c.jpg?size=medium 1.5x, 20230825_104025118_iOS.heic-20231117104221-p8hbk3c.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_104025118_iOS.heic\" data-alt=\"20230825_104025118_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_105710747_iOS.heic-20231117104225-m7l87lv.jpg\" srcset=\"20230825_105710747_iOS.heic-20231117104225-m7l87lv.jpg?size=small, 20230825_105710747_iOS.heic-20231117104225-m7l87lv.jpg?size=medium 1.5x, 20230825_105710747_iOS.heic-20231117104225-m7l87lv.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_105710747_iOS.heic\" data-alt=\"20230825_105710747_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e登塔要1200円的门票,由于在大晚上顶层不开放,只能坐到350m高的中层。\u003c/p\u003e\n\u003cp\u003e一眼望不到边际的城市,太震撼了。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_112233616_iOS.heic-20231117104353-h7yg0jh.jpg\" srcset=\"20230825_112233616_iOS.heic-20231117104353-h7yg0jh.jpg?size=small, 20230825_112233616_iOS.heic-20231117104353-h7yg0jh.jpg?size=medium 1.5x, 20230825_112233616_iOS.heic-20231117104353-h7yg0jh.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_112233616_iOS.heic\" data-alt=\"20230825_112233616_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e上面还设了一个许愿台\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_112348069_iOS.heic-20231117104438-sjegazz.jpg\" srcset=\"20230825_112348069_iOS.heic-20231117104438-sjegazz.jpg?size=small, 20230825_112348069_iOS.heic-20231117104438-sjegazz.jpg?size=medium 1.5x, 20230825_112348069_iOS.heic-20231117104438-sjegazz.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_112348069_iOS.heic\" data-alt=\"20230825_112348069_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e买了根带子,这布条上写字太难写了。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230825_113037714_iOS.heic-20231118105301-hwbjvgf.jpg\" srcset=\"20230825_113037714_iOS.heic-20231118105301-hwbjvgf.jpg?size=small, 20230825_113037714_iOS.heic-20231118105301-hwbjvgf.jpg?size=medium 1.5x, 20230825_113037714_iOS.heic-20231118105301-hwbjvgf.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230825_113037714_iOS.heic\" data-alt=\"20230825_113037714_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003ch3 id=\"08-26-明治神宫---涩谷---新宿---下北泽\"\u003e08-26 明治神宫 - 涩谷 - 新宿 - 下北泽\u003c/h3\u003e\n\u003cp\u003e今天约了一个在日本留学的高中同学一起,大概早上十点左右出发的,接近中午的时候到了明治神宫站。\u003c/p\u003e\n\u003cp\u003e去明治神宫的路上,坐地铁看到了一堆熟悉的番,似乎是卡牌游戏联动:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_025717934_iOS.heic-20231118105358-zn22dsf.jpg\" srcset=\"20230826_025717934_iOS.heic-20231118105358-zn22dsf.jpg?size=small, 20230826_025717934_iOS.heic-20231118105358-zn22dsf.jpg?size=medium 1.5x, 20230826_025717934_iOS.heic-20231118105358-zn22dsf.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_025717934_iOS.heic\" data-alt=\"20230826_025717934_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e看到了很有钱的二次元(羡慕死了)\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_031841179_iOS.heic-20231118105627-cxe6vzz.jpg\" srcset=\"20230826_031841179_iOS.heic-20231118105627-cxe6vzz.jpg?size=small, 20230826_031841179_iOS.heic-20231118105627-cxe6vzz.jpg?size=medium 1.5x, 20230826_031841179_iOS.heic-20231118105627-cxe6vzz.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_031841179_iOS.heic\" data-alt=\"20230826_031841179_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e刚出地铁站,就听见外面震天响,原来是有露天表演:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_032103969_iOS.heic-20231118105805-16bnpt2.jpg\" srcset=\"20230826_032103969_iOS.heic-20231118105805-16bnpt2.jpg?size=small, 20230826_032103969_iOS.heic-20231118105805-16bnpt2.jpg?size=medium 1.5x, 20230826_032103969_iOS.heic-20231118105805-16bnpt2.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_032103969_iOS.heic\" data-alt=\"20230826_032103969_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e本来应该先去明治神宫打个卡的,但是饿了,于是去了一个很二次元的街道\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_033550616_iOS.heic-20231118105853-ljjbsmv.jpg\" srcset=\"20230826_033550616_iOS.heic-20231118105853-ljjbsmv.jpg?size=small, 20230826_033550616_iOS.heic-20231118105853-ljjbsmv.jpg?size=medium 1.5x, 20230826_033550616_iOS.heic-20231118105853-ljjbsmv.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_033550616_iOS.heic\" data-alt=\"20230826_033550616_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_034209909_iOS.heic-20231118105858-i3x0ktf.jpg\" srcset=\"20230826_034209909_iOS.heic-20231118105858-i3x0ktf.jpg?size=small, 20230826_034209909_iOS.heic-20231118105858-i3x0ktf.jpg?size=medium 1.5x, 20230826_034209909_iOS.heic-20231118105858-i3x0ktf.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_034209909_iOS.heic\" data-alt=\"20230826_034209909_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e然后找到了一家和牛店。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_040355893_iOS.heic-20231118110030-5wgrrxu.jpg\" srcset=\"20230826_040355893_iOS.heic-20231118110030-5wgrrxu.jpg?size=small, 20230826_040355893_iOS.heic-20231118110030-5wgrrxu.jpg?size=medium 1.5x, 20230826_040355893_iOS.heic-20231118110030-5wgrrxu.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_040355893_iOS.heic\" data-alt=\"20230826_040355893_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e:我测,时薪65RMB,不要工作经验不要简历,会笑就行?\u003c/p\u003e\n\u003cp\u003e阳哥:我测\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_042005449_iOS.heic-20231118110139-0obx67z.jpg\" srcset=\"20230826_042005449_iOS.heic-20231118110139-0obx67z.jpg?size=small, 20230826_042005449_iOS.heic-20231118110139-0obx67z.jpg?size=medium 1.5x, 20230826_042005449_iOS.heic-20231118110139-0obx67z.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_042005449_iOS.heic\" data-alt=\"20230826_042005449_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_042245018_iOS.heic-20231118110144-2z2mb3v.jpg\" srcset=\"20230826_042245018_iOS.heic-20231118110144-2z2mb3v.jpg?size=small, 20230826_042245018_iOS.heic-20231118110144-2z2mb3v.jpg?size=medium 1.5x, 20230826_042245018_iOS.heic-20231118110144-2z2mb3v.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_042245018_iOS.heic\" data-alt=\"20230826_042245018_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e我跟牛聊两句都比这个熟.jpg\u003c/p\u003e\n\u003cp\u003e吃了正宗的日本和牛感觉其实也就那样,也可能是我山猪吃不了细糠。生肉口感怪怪的,希望第二天不会拉肚子(确实没拉)。\u003c/p\u003e\n\u003cp\u003e然后是明治神宫:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_045619018_iOS.heic-20231118110324-76ypsjs.jpg\" srcset=\"20230826_045619018_iOS.heic-20231118110324-76ypsjs.jpg?size=small, 20230826_045619018_iOS.heic-20231118110324-76ypsjs.jpg?size=medium 1.5x, 20230826_045619018_iOS.heic-20231118110324-76ypsjs.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_045619018_iOS.heic\" data-alt=\"20230826_045619018_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_050145216_iOS.heic-20231118110319-djbl2qf.jpg\" srcset=\"20230826_050145216_iOS.heic-20231118110319-djbl2qf.jpg?size=small, 20230826_050145216_iOS.heic-20231118110319-djbl2qf.jpg?size=medium 1.5x, 20230826_050145216_iOS.heic-20231118110319-djbl2qf.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_050145216_iOS.heic\" data-alt=\"20230826_050145216_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e路上见到了一只巨大的乌鸦,而且不怕人:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_050626686_iOS.heic-20231118110350-vpeq6rx.jpg\" srcset=\"20230826_050626686_iOS.heic-20231118110350-vpeq6rx.jpg?size=small, 20230826_050626686_iOS.heic-20231118110350-vpeq6rx.jpg?size=medium 1.5x, 20230826_050626686_iOS.heic-20231118110350-vpeq6rx.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_050626686_iOS.heic\" data-alt=\"20230826_050626686_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e本来想摸摸来着,但是它好像很有敌意,就没敢碰它。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e阳哥:乌鸦又不是啥好东西\u003c/p\u003e\n\u003cp\u003e:乌鸦在日本的含义好像是翻过来的,代表好运\u003c/p\u003e\n\u003cp\u003e阳哥:你小心它跟你屁股后面飞回国,就不是好运了\u003c/p\u003e\n\u003cp\u003e:❓\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_052045118_iOS.heic-20231118110525-us3y18q.jpg\" srcset=\"20230826_052045118_iOS.heic-20231118110525-us3y18q.jpg?size=small, 20230826_052045118_iOS.heic-20231118110525-us3y18q.jpg?size=medium 1.5x, 20230826_052045118_iOS.heic-20231118110525-us3y18q.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_052045118_iOS.heic\" data-alt=\"20230826_052045118_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e从明治神宫出来往北,到了一个很著名的高档餐厅 \u003ca href=\"https://www.robuchon.jp/en/shop-list/latable\" target=\"_blank\" rel=\"external nofollow noopener noreferrer\"\u003eLA TABLE de Joël Robuchon\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_060226211_iOS.heic-20231118110733-gtttaek.jpg\" srcset=\"20230826_060226211_iOS.heic-20231118110733-gtttaek.jpg?size=small, 20230826_060226211_iOS.heic-20231118110733-gtttaek.jpg?size=medium 1.5x, 20230826_060226211_iOS.heic-20231118110733-gtttaek.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_060226211_iOS.heic\" data-alt=\"20230826_060226211_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_060458670_iOS.heic-20231118110738-05xd78z.jpg\" srcset=\"20230826_060458670_iOS.heic-20231118110738-05xd78z.jpg?size=small, 20230826_060458670_iOS.heic-20231118110738-05xd78z.jpg?size=medium 1.5x, 20230826_060458670_iOS.heic-20231118110738-05xd78z.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_060458670_iOS.heic\" data-alt=\"20230826_060458670_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e在外面拍了两张照就跑了。\u003c/p\u003e\n\u003cp\u003e听说这餐厅得提前好久预约,花销不是一般人能负担的。\u003c/p\u003e\n\u003cp\u003e很繁华的涩谷:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_065539443_iOS.heic-20231118110850-ilr4mfz.jpg\" srcset=\"20230826_065539443_iOS.heic-20231118110850-ilr4mfz.jpg?size=small, 20230826_065539443_iOS.heic-20231118110850-ilr4mfz.jpg?size=medium 1.5x, 20230826_065539443_iOS.heic-20231118110850-ilr4mfz.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_065539443_iOS.heic\" data-alt=\"20230826_065539443_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e本来想去最高的那层楼看看,但是今天不开放,于是作罢,直接奔着下北泽去了。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_075026654_iOS.heic-20231118110926-2qvp58a.jpg\" srcset=\"20230826_075026654_iOS.heic-20231118110926-2qvp58a.jpg?size=small, 20230826_075026654_iOS.heic-20231118110926-2qvp58a.jpg?size=medium 1.5x, 20230826_075026654_iOS.heic-20231118110926-2qvp58a.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_075026654_iOS.heic\" data-alt=\"20230826_075026654_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e下北泽!\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_075033042_iOS.heic-20231118110935-6xyuulj.jpg\" srcset=\"20230826_075033042_iOS.heic-20231118110935-6xyuulj.jpg?size=small, 20230826_075033042_iOS.heic-20231118110935-6xyuulj.jpg?size=medium 1.5x, 20230826_075033042_iOS.heic-20231118110935-6xyuulj.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_075033042_iOS.heic\" data-alt=\"20230826_075033042_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e本多剧场!\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_075434668_iOS.heic-20231118110952-jjiez34.jpg\" srcset=\"20230826_075434668_iOS.heic-20231118110952-jjiez34.jpg?size=small, 20230826_075434668_iOS.heic-20231118110952-jjiez34.jpg?size=medium 1.5x, 20230826_075434668_iOS.heic-20231118110952-jjiez34.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_075434668_iOS.heic\" data-alt=\"20230826_075434668_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_075542515_iOS.heic-20231118111001-auak4jf.jpg\" srcset=\"20230826_075542515_iOS.heic-20231118111001-auak4jf.jpg?size=small, 20230826_075542515_iOS.heic-20231118111001-auak4jf.jpg?size=medium 1.5x, 20230826_075542515_iOS.heic-20231118111001-auak4jf.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_075542515_iOS.heic\" data-alt=\"20230826_075542515_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_075618796_iOS.heic-20231118111005-3d5mq1j.jpg\" srcset=\"20230826_075618796_iOS.heic-20231118111005-3d5mq1j.jpg?size=small, 20230826_075618796_iOS.heic-20231118111005-3d5mq1j.jpg?size=medium 1.5x, 20230826_075618796_iOS.heic-20231118111005-3d5mq1j.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_075618796_iOS.heic\" data-alt=\"20230826_075618796_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e‍\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_080430491_iOS.heic-20231118111024-fb3zj5h.jpg\" srcset=\"20230826_080430491_iOS.heic-20231118111024-fb3zj5h.jpg?size=small, 20230826_080430491_iOS.heic-20231118111024-fb3zj5h.jpg?size=medium 1.5x, 20230826_080430491_iOS.heic-20231118111024-fb3zj5h.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_080430491_iOS.heic\" data-alt=\"20230826_080430491_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_081159763_iOS.heic-20231118111044-7j7r0es.jpg\" srcset=\"20230826_081159763_iOS.heic-20231118111044-7j7r0es.jpg?size=small, 20230826_081159763_iOS.heic-20231118111044-7j7r0es.jpg?size=medium 1.5x, 20230826_081159763_iOS.heic-20231118111044-7j7r0es.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_081159763_iOS.heic\" data-alt=\"20230826_081159763_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e晚上去了歌舞伎厅一番街:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_091904664_iOS.heic-20231118111222-ta2w9li.jpg\" srcset=\"20230826_091904664_iOS.heic-20231118111222-ta2w9li.jpg?size=small, 20230826_091904664_iOS.heic-20231118111222-ta2w9li.jpg?size=medium 1.5x, 20230826_091904664_iOS.heic-20231118111222-ta2w9li.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_091904664_iOS.heic\" data-alt=\"20230826_091904664_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e腿都要逛断了。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e阳哥:腿快断了\u003c/p\u003e\n\u003cp\u003e:别啊,明天还要去七里浜呢\u003c/p\u003e\n\u003cp\u003e阳哥:你自己去,我动不了了\u003c/p\u003e\n\u003cp\u003e:❓麻衣学姐你都不去看看❓\u003c/p\u003e\n\u003cp\u003e阳哥:我又没看过那番\u003c/p\u003e\n\u003cp\u003e:❓你是不是二次元啊\u003c/p\u003e\n\u003cp\u003e阳哥:啥B二次元\u003c/p\u003e\n\u003cp\u003e:\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230826_133638812_iOS.heic-20231118111443-zu7fwqe.jpg\" srcset=\"20230826_133638812_iOS.heic-20231118111443-zu7fwqe.jpg?size=small, 20230826_133638812_iOS.heic-20231118111443-zu7fwqe.jpg?size=medium 1.5x, 20230826_133638812_iOS.heic-20231118111443-zu7fwqe.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230826_133638812_iOS.heic\" data-alt=\"20230826_133638812_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003ch3 id=\"08-27-镰仓---七里浜---踢你的肾不是\"\u003e08-27 镰仓 - 七里浜 - 踢你的肾(不是\u003c/h3\u003e\n\u003cp\u003e因为阳哥实在不想动,我就一个人出发了。坐中央-总武线到镰仓,然后再坐江之岛电铁去七里浜。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_023916507_iOS.heic-20231118114752-8zt2svh.jpg\" srcset=\"20230827_023916507_iOS.heic-20231118114752-8zt2svh.jpg?size=small, 20230827_023916507_iOS.heic-20231118114752-8zt2svh.jpg?size=medium 1.5x, 20230827_023916507_iOS.heic-20231118114752-8zt2svh.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_023916507_iOS.heic\" data-alt=\"20230827_023916507_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e我是从新日本桥上的车,然后听见车到东京了,觉得自己没坐错方向。结果坐了几站之后发现自己到了一个什么什么町站?草,这趟车到东京之后又掉头开回去了!\u003c/p\u003e\n\u003cp\u003e最终折腾了几趟,终于坐对了车,来到了镰仓。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_044705139_iOS.heic-20231118115101-bsj22pf.jpg\" srcset=\"20230827_044705139_iOS.heic-20231118115101-bsj22pf.jpg?size=small, 20230827_044705139_iOS.heic-20231118115101-bsj22pf.jpg?size=medium 1.5x, 20230827_044705139_iOS.heic-20231118115101-bsj22pf.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_044705139_iOS.heic\" data-alt=\"20230827_044705139_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e江之岛电铁上人挤人,排了两趟车才挤上去。\u003c/p\u003e\n\u003cp\u003e然后到了七里浜\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_051750732_iOS.heic-20231118115317-dukwmql.jpg\" srcset=\"20230827_051750732_iOS.heic-20231118115317-dukwmql.jpg?size=small, 20230827_051750732_iOS.heic-20231118115317-dukwmql.jpg?size=medium 1.5x, 20230827_051750732_iOS.heic-20231118115317-dukwmql.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_051750732_iOS.heic\" data-alt=\"20230827_051750732_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_052232001_iOS.heic-20231118115308-jwb5u60.jpg\" srcset=\"20230827_052232001_iOS.heic-20231118115308-jwb5u60.jpg?size=small, 20230827_052232001_iOS.heic-20231118115308-jwb5u60.jpg?size=medium 1.5x, 20230827_052232001_iOS.heic-20231118115308-jwb5u60.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_052232001_iOS.heic\" data-alt=\"20230827_052232001_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​​\u003c/p\u003e\n\u003cp\u003e七里浜站出来,旁边就是学姐的学校\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_052031568_iOS.heic-20231118115224-ptxtkcg.jpg\" srcset=\"20230827_052031568_iOS.heic-20231118115224-ptxtkcg.jpg?size=small, 20230827_052031568_iOS.heic-20231118115224-ptxtkcg.jpg?size=medium 1.5x, 20230827_052031568_iOS.heic-20231118115224-ptxtkcg.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_052031568_iOS.heic\" data-alt=\"20230827_052031568_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e可惜不让进,不过还是能看到一点教学楼和操场。\u003c/p\u003e\n\u003cp\u003e从七里浜站往前走,就是那个沙滩:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_062917601_iOS.heic-20231118115353-zjauvvo.jpg\" srcset=\"20230827_062917601_iOS.heic-20231118115353-zjauvvo.jpg?size=small, 20230827_062917601_iOS.heic-20231118115353-zjauvvo.jpg?size=medium 1.5x, 20230827_062917601_iOS.heic-20231118115353-zjauvvo.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_062917601_iOS.heic\" data-alt=\"20230827_062917601_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e内陆孩子这辈子第一次实际意义上的见大海,没想到是在这里。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_054929938_iOS.heic-20231118115409-krfcay5.jpg\" srcset=\"20230827_054929938_iOS.heic-20231118115409-krfcay5.jpg?size=small, 20230827_054929938_iOS.heic-20231118115409-krfcay5.jpg?size=medium 1.5x, 20230827_054929938_iOS.heic-20231118115409-krfcay5.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_054929938_iOS.heic\" data-alt=\"20230827_054929938_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e远处的江之岛:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_055450377_iOS.heic-20231118115609-4z2av2d.jpg\" srcset=\"20230827_055450377_iOS.heic-20231118115609-4z2av2d.jpg?size=small, 20230827_055450377_iOS.heic-20231118115609-4z2av2d.jpg?size=medium 1.5x, 20230827_055450377_iOS.heic-20231118115609-4z2av2d.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_055450377_iOS.heic\" data-alt=\"20230827_055450377_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e我从七里浜下车,沿着电铁线和海边慢慢往藤泽方向走,一路上打卡了很多经典场景。\u003c/p\u003e\n\u003cp\u003e学姐拍广告的地方:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_054027049_iOS.heic-20231118115504-te6grlw.jpg\" srcset=\"20230827_054027049_iOS.heic-20231118115504-te6grlw.jpg?size=small, 20230827_054027049_iOS.heic-20231118115504-te6grlw.jpg?size=medium 1.5x, 20230827_054027049_iOS.heic-20231118115504-te6grlw.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_054027049_iOS.heic\" data-alt=\"20230827_054027049_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_064931733_iOS.heic-20231118115706-fo9m2ja.jpg\" srcset=\"20230827_064931733_iOS.heic-20231118115706-fo9m2ja.jpg?size=small, 20230827_064931733_iOS.heic-20231118115706-fo9m2ja.jpg?size=medium 1.5x, 20230827_064931733_iOS.heic-20231118115706-fo9m2ja.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_064931733_iOS.heic\" data-alt=\"20230827_064931733_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e踢你的肾(不是\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_065855717_iOS.heic-20231118115747-lpbxx35.jpg\" srcset=\"20230827_065855717_iOS.heic-20231118115747-lpbxx35.jpg?size=small, 20230827_065855717_iOS.heic-20231118115747-lpbxx35.jpg?size=medium 1.5x, 20230827_065855717_iOS.heic-20231118115747-lpbxx35.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_065855717_iOS.heic\" data-alt=\"20230827_065855717_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e电铁在马路中央开:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_070615407_iOS.heic-20231118115840-6uwegmh.jpg\" srcset=\"20230827_070615407_iOS.heic-20231118115840-6uwegmh.jpg?size=small, 20230827_070615407_iOS.heic-20231118115840-6uwegmh.jpg?size=medium 1.5x, 20230827_070615407_iOS.heic-20231118115840-6uwegmh.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_070615407_iOS.heic\" data-alt=\"20230827_070615407_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e藤泽站:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_073113085_iOS.heic-20231118115858-rl2snkx.jpg\" srcset=\"20230827_073113085_iOS.heic-20231118115858-rl2snkx.jpg?size=small, 20230827_073113085_iOS.heic-20231118115858-rl2snkx.jpg?size=medium 1.5x, 20230827_073113085_iOS.heic-20231118115858-rl2snkx.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_073113085_iOS.heic\" data-alt=\"20230827_073113085_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e想在藤泽市找找学姐住的地方和那个“击股之交”的健身器材场,可惜对着番剧和地图找了一大圈,没找到。\u003c/p\u003e\n\u003cp\u003e于是回去了。\u003c/p\u003e\n\u003cp\u003e路上看到了天空树在云层上面发出的光。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_123107618_iOS.heic-20231118120040-t54zkj5.jpg\" srcset=\"20230827_123107618_iOS.heic-20231118120040-t54zkj5.jpg?size=small, 20230827_123107618_iOS.heic-20231118120040-t54zkj5.jpg?size=medium 1.5x, 20230827_123107618_iOS.heic-20231118120040-t54zkj5.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_123107618_iOS.heic\" data-alt=\"20230827_123107618_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e公园里有很多人在聚团玩烟花。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230827_123701992_iOS.heic-20231118120115-w23hqxz.jpg\" srcset=\"20230827_123701992_iOS.heic-20231118120115-w23hqxz.jpg?size=small, 20230827_123701992_iOS.heic-20231118120115-w23hqxz.jpg?size=medium 1.5x, 20230827_123701992_iOS.heic-20231118120115-w23hqxz.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230827_123701992_iOS.heic\" data-alt=\"20230827_123701992_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003ch2 id=\"东京--京都\"\u003e东京 京都\u003c/h2\u003e\n\u003ch3 id=\"08-28-京都---清水寺\"\u003e08-28 京都 - 清水寺\u003c/h3\u003e\n\u003cp\u003e一早就收拾东西退房去京都了。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230828_080148066_iOS.heic-20231118120802-nvq1q55.jpg\" srcset=\"20230828_080148066_iOS.heic-20231118120802-nvq1q55.jpg?size=small, 20230828_080148066_iOS.heic-20231118120802-nvq1q55.jpg?size=medium 1.5x, 20230828_080148066_iOS.heic-20231118120802-nvq1q55.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230828_080148066_iOS.heic\" data-alt=\"20230828_080148066_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230828_081002052_iOS.heic-20231118120810-kw70kfm.jpg\" srcset=\"20230828_081002052_iOS.heic-20231118120810-kw70kfm.jpg?size=small, 20230828_081002052_iOS.heic-20231118120810-kw70kfm.jpg?size=medium 1.5x, 20230828_081002052_iOS.heic-20231118120810-kw70kfm.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230828_081002052_iOS.heic\" data-alt=\"20230828_081002052_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e还有马厩:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230828_081201910_iOS.heic-20231118120819-7pb6kgv.jpg\" srcset=\"20230828_081201910_iOS.heic-20231118120819-7pb6kgv.jpg?size=small, 20230828_081201910_iOS.heic-20231118120819-7pb6kgv.jpg?size=medium 1.5x, 20230828_081201910_iOS.heic-20231118120819-7pb6kgv.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230828_081201910_iOS.heic\" data-alt=\"20230828_081201910_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e给父母买了点纪念品\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230828_085145101_iOS.heic-20231118120837-4l7ywhn.jpg\" srcset=\"20230828_085145101_iOS.heic-20231118120837-4l7ywhn.jpg?size=small, 20230828_085145101_iOS.heic-20231118120837-4l7ywhn.jpg?size=medium 1.5x, 20230828_085145101_iOS.heic-20231118120837-4l7ywhn.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230828_085145101_iOS.heic\" data-alt=\"20230828_085145101_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e还尝了尝抹茶\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230828_090353212_iOS.heic-20231118120847-8cj9k3b.jpg\" srcset=\"20230828_090353212_iOS.heic-20231118120847-8cj9k3b.jpg?size=small, 20230828_090353212_iOS.heic-20231118120847-8cj9k3b.jpg?size=medium 1.5x, 20230828_090353212_iOS.heic-20231118120847-8cj9k3b.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230828_090353212_iOS.heic\" data-alt=\"20230828_090353212_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e感觉……不好喝。\u003c/p\u003e\n\u003cp\u003e很像天气之子,立体感很强的云:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230828_093404251_iOS.heic-20231118120921-hdlidhd.jpg\" srcset=\"20230828_093404251_iOS.heic-20231118120921-hdlidhd.jpg?size=small, 20230828_093404251_iOS.heic-20231118120921-hdlidhd.jpg?size=medium 1.5x, 20230828_093404251_iOS.heic-20231118120921-hdlidhd.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230828_093404251_iOS.heic\" data-alt=\"20230828_093404251_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e叫蒟蒻的糖:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230828_153228342_iOS.heic-20231118120936-fkk5hay.jpg\" srcset=\"20230828_153228342_iOS.heic-20231118120936-fkk5hay.jpg?size=small, 20230828_153228342_iOS.heic-20231118120936-fkk5hay.jpg?size=medium 1.5x, 20230828_153228342_iOS.heic-20231118120936-fkk5hay.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230828_153228342_iOS.heic\" data-alt=\"20230828_153228342_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e可惜去的时候太晚了,御守并没有求到,打算第二天再去。\u003c/p\u003e\n\u003ch3 id=\"08-29-还是清水寺\"\u003e08-29 还是清水寺\u003c/h3\u003e\n\u003cp\u003e先去吃了个午饭,好像是什么什么面:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230829_053952209_iOS.heic-20231118121735-6puni2q.jpg\" srcset=\"20230829_053952209_iOS.heic-20231118121735-6puni2q.jpg?size=small, 20230829_053952209_iOS.heic-20231118121735-6puni2q.jpg?size=medium 1.5x, 20230829_053952209_iOS.heic-20231118121735-6puni2q.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230829_053952209_iOS.heic\" data-alt=\"20230829_053952209_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e结果尝了一口面,什么味道也没有,又尝了一口右下角碗里的汤,差点给我齁死,然后才恍然大悟,好像是蘸着面吃的。\u003c/p\u003e\n\u003cp\u003e还挺好吃。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230829_054228389_iOS.heic-20231118121825-bdlsch3.jpg\" srcset=\"20230829_054228389_iOS.heic-20231118121825-bdlsch3.jpg?size=small, 20230829_054228389_iOS.heic-20231118121825-bdlsch3.jpg?size=medium 1.5x, 20230829_054228389_iOS.heic-20231118121825-bdlsch3.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230829_054228389_iOS.heic\" data-alt=\"20230829_054228389_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e听说喝了会宾周发光的日本生可乐:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230829_061429868_iOS.heic-20231118121851-tce3wsh.jpg\" srcset=\"20230829_061429868_iOS.heic-20231118121851-tce3wsh.jpg?size=small, 20230829_061429868_iOS.heic-20231118121851-tce3wsh.jpg?size=medium 1.5x, 20230829_061429868_iOS.heic-20231118121851-tce3wsh.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230829_061429868_iOS.heic\" data-alt=\"20230829_061429868_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e喝完了没感觉出来和普通的可乐有什么区别,碳酸气更足了(?)\u003c/p\u003e\n\u003cp\u003e求了几个御守,回来的时候打算去吃咖喱饭,路上的晚霞很好看:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230829_090917939_iOS.heic-20231118121946-hi8rj0b.jpg\" srcset=\"20230829_090917939_iOS.heic-20231118121946-hi8rj0b.jpg?size=small, 20230829_090917939_iOS.heic-20231118121946-hi8rj0b.jpg?size=medium 1.5x, 20230829_090917939_iOS.heic-20231118121946-hi8rj0b.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230829_090917939_iOS.heic\" data-alt=\"20230829_090917939_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e草,强迫症要犯了\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230829_093107535_iOS.heic-20231118121958-pamf7k3.jpg\" srcset=\"20230829_093107535_iOS.heic-20231118121958-pamf7k3.jpg?size=small, 20230829_093107535_iOS.heic-20231118121958-pamf7k3.jpg?size=medium 1.5x, 20230829_093107535_iOS.heic-20231118121958-pamf7k3.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230829_093107535_iOS.heic\" data-alt=\"20230829_093107535_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e日本咖喱真不错:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230829_093527794_iOS.heic-20231118122016-e4rk1lc.jpg\" srcset=\"20230829_093527794_iOS.heic-20231118122016-e4rk1lc.jpg?size=small, 20230829_093527794_iOS.heic-20231118122016-e4rk1lc.jpg?size=medium 1.5x, 20230829_093527794_iOS.heic-20231118122016-e4rk1lc.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230829_093527794_iOS.heic\" data-alt=\"20230829_093527794_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e三彩团子:\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230829_125322871_iOS.heic-20231118122100-8x7zqyl.jpg\" srcset=\"20230829_125322871_iOS.heic-20231118122100-8x7zqyl.jpg?size=small, 20230829_125322871_iOS.heic-20231118122100-8x7zqyl.jpg?size=medium 1.5x, 20230829_125322871_iOS.heic-20231118122100-8x7zqyl.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230829_125322871_iOS.heic\" data-alt=\"20230829_125322871_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003ch2 id=\"京都--大阪--关西--回国\"\u003e京都 大阪 关西 ✈️ 回国\u003c/h2\u003e\n\u003cp\u003e是时候回到社会主义的怀抱了。\u003c/p\u003e\n\u003cp\u003e​\u003cimg loading=\"lazy\" src=\"https://blog.woooo.tech/posts/travel_jpn/20230830_080750531_iOS.heic-20231118122143-q3tbx30.jpg\" srcset=\"20230830_080750531_iOS.heic-20231118122143-q3tbx30.jpg?size=small, 20230830_080750531_iOS.heic-20231118122143-q3tbx30.jpg?size=medium 1.5x, 20230830_080750531_iOS.heic-20231118122143-q3tbx30.jpg?size=large 2x\" sizes=\"auto\" data-title=\"20230830_080750531_iOS.heic\" data-alt=\"20230830_080750531_iOS.heic\" style=\"background: url(/svg/loading.min.svg) no-repeat center;\" onload=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}this.dataset.lazyloaded=\u0026#39;\u0026#39;;\" onerror=\"this.title=this.dataset.title;this.alt=this.dataset.alt;for(const i of [\u0026#39;style\u0026#39;, \u0026#39;data-title\u0026#39;,\u0026#39;data-alt\u0026#39;,\u0026#39;onerror\u0026#39;,\u0026#39;onload\u0026#39;]){this.removeAttribute(i);}\"/\u003e​\u003c/p\u003e\n\u003cp\u003e‍\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/travel_jpn/"}]},{"name":"康师傅","email":"","uri":"https://blog.ksfu.top/","description":"太菜了","article":[{"title":"TeX Live 2023安装\u0026VSCode环境配置记录","time":"2023-11-22T15:00:39Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"TeX-Live-2023安装-amp-VSCode环境配置记录\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/8e96/#TeX-Live-2023%E5%AE%89%E8%A3%85-amp-VSCode%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E8%AE%B0%E5%BD%95\" class=\"headerlink\" title=\"TeX Live 2023安装\u0026amp;VSCode环境配置记录\"\u003e\u003c/a\u003eTeX Live 2023安装\u0026amp;VSCode环境配置记录\u003c/h1\u003e\u003cp\u003e整完了。\u003cdel\u003e还没写完,主要快断电了属于是)\u003c/del\u003e\u003c/p\u003e\u003cp\u003e系统信息: Windows 11 专业版 23H2 22635.2771。\u003c/p\u003e\u003cp\u003e之前机子上装过2021版本,但一直没咋用过)刚好后面要开始用这玩意了,就重新装了一下,顺便配一配环境。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e参考链接:\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://zhuanlan.zhihu.com/p/603669792\"\u003eLaTeX小白兔手册-配置篇 - 知乎 (zhihu.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://zhuanlan.zhihu.com/p/166523064\"\u003eVisual Studio Code (vscode)配置LaTeX - 知乎 (zhihu.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://yangyq.net/2022/05/latex-with-visual-studio-code.html\"\u003e配置Visual Studio Code和LaTex环境 - 老杨说话的地方 (yangyq.net)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://github.com/James-Yu/LaTeX-Workshop/wiki\"\u003eHome · James-Yu/LaTeX-Workshop Wiki (github.com)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"TeX-Live安装\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/8e96/#TeX-Live%E5%AE%89%E8%A3%85\" class=\"headerlink\" title=\"TeX Live安装\"\u003e\u003c/a\u003eTeX Live安装\u003c/h2\u003e\u003cp\u003e首先下载TeX Live 2023镜像,推荐清华镜像站:\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/?C=M\u0026amp;O=A\"\u003eIndex of /CTAN/systems/texlive/Images/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror\u003c/a\u003e \u003c/p\u003e\u003cp\u003e选择\u003ccode\u003etexlive2023.iso\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e下载完成后打开镜像,运行\u003ccode\u003einstall-tl-windows.bat\u003c/code\u003e,\u003c/p\u003e\u003cp\u003e图形界面,操作比较简单,注意选择好安装路径即可,大约需要 \u003cstrong\u003e8G\u003c/strong\u003e 的硬盘空间。\u003c/p\u003e\u003cp\u003e然后安装就行,安装时间比较长,50分钟左右?注意别点 \u003ccode\u003eAbort\u003c/code\u003e ,耐心等着就行。\u003c/p\u003e\u003cp\u003e最后提示 \u003ccode\u003e欢迎进入 Tex Live 的世界!\u003c/code\u003e ,就算是装完了。然后打开终端,输入 \u003ccode\u003e latex -v\u003c/code\u003e 查看版本信息,检查安装是否正常。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003epdfTeX \u003cspan class=\"token number\"\u003e3.141592653\u003c/span\u003e-2.6-1.40.25 \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eTeX Live \u003cspan class=\"token number\"\u003e2023\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003ekpathsea version \u003cspan class=\"token number\"\u003e6.3\u003c/span\u003e.5Copyright \u003cspan class=\"token number\"\u003e2023\u003c/span\u003e Han The Thanh \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003epdfTeX\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e et al.There is NO warranty. Redistribution of this software iscovered by the terms of both the pdfTeX copyright andthe Lesser GNU General Public License.For \u003cspan class=\"token function\"\u003emore\u003c/span\u003e information about these matters, see the \u003cspan class=\"token function\"\u003efile\u003c/span\u003enamed COPYING and the pdfTeX source.Primary author of pdfTeX: Han The Thanh \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003epdfTeX\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e et al.Compiled with libpng \u003cspan class=\"token number\"\u003e1.6\u003c/span\u003e.39\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e using libpng \u003cspan class=\"token number\"\u003e1.6\u003c/span\u003e.39Compiled with zlib \u003cspan class=\"token number\"\u003e1.2\u003c/span\u003e.13\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e using zlib \u003cspan class=\"token number\"\u003e1.2\u003c/span\u003e.13Compiled with xpdf version \u003cspan class=\"token number\"\u003e4.04\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch2 id=\"VSCode配置LaTex环境\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/8e96/#VSCode%E9%85%8D%E7%BD%AELaTex%E7%8E%AF%E5%A2%83\" class=\"headerlink\" title=\"VSCode配置LaTex环境\"\u003e\u003c/a\u003eVSCode配置LaTex环境\u003c/h2\u003e\u003ch3 id=\"LaTeX-Workshop插件配置\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/8e96/#LaTeX-Workshop%E6%8F%92%E4%BB%B6%E9%85%8D%E7%BD%AE\" class=\"headerlink\" title=\"LaTeX Workshop插件配置\"\u003e\u003c/a\u003eLaTeX Workshop插件配置\u003c/h3\u003e\u003cp\u003e打开VScode,在扩展搜索 \u003ccode\u003eLaTeX Workshop\u003c/code\u003e 进行安装。\u003c/p\u003e\u003cp\u003e打开\u003ccode\u003eLaTeX Workshop\u003c/code\u003e 的设置,之后在右上角选择 \u003ccode\u003e打开设置(json)\u003c/code\u003e 。因为配置项比较多,所以直接网上抄设置复制进json(毕竟有159个设置项……\u003c/p\u003e\u003cp\u003e\u003ccode\u003eLaTeX Workshop\u003c/code\u003e Wiki:\u003ca href=\"https://github.com/James-Yu/LaTeX-Workshop/wiki\"\u003eHome · James-Yu/LaTeX-Workshop Wiki (github.com)\u003c/a\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e根据Wiki内容:\u003ca href=\"https://github.com/James-Yu/LaTeX-Workshop/wiki/Install#settings\"\u003ehttps://github.com/James-Yu/LaTeX-Workshop/wiki/Install#settings\u003c/a\u003e\u003c/p\u003e\u003cp\u003eYou can modify settings through the menu of VS Code, \u003ccode\u003ePreferences \u0026gt; Settings\u003c/code\u003e. You can also modify settings by directly editing \u003ccode\u003esettings.json\u003c/code\u003e. See an \u003ca href=\"https://code.visualstudio.com/docs/getstarted/settings#_settings-file-locations\"\u003eofficial document\u003c/a\u003e for the location of \u003ccode\u003esettings.json\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eYou can also have different settings for each project with \u003ccode\u003e.vscode/settings.json\u003c/code\u003e at the root of each project workspace. See an \u003ca href=\"https://code.visualstudio.com/docs/getstarted/settings#_settings-file-locations\"\u003eofficial document\u003c/a\u003e.\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e有两种修改VSCode设置的方式,一种是直接修改,全局生效的这种。另一种是针对不同工程使用不同配置,需要在工程下建立名为 \u003ccode\u003e.vscode\u003c/code\u003e 的文件夹,建立 \u003ccode\u003esettings.json\u003c/code\u003e 进行设置。我们选择第一种。\u003c/p\u003e\u003cp\u003e注意编辑json文件时要注意格式,如果文件内有其他配置,跟后面就行,别直接复制进去给覆盖掉)然后记得配置复制到最外头的大括号里面( \u003cstrong\u003e\u003ccode\u003e{其他配置,你的配置}\u003c/code\u003e\u003c/strong\u003e )。\u003c/p\u003e\u003cp\u003e到处借鉴然后揉了点适合自己的配置:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token comment\"\u003e//---------LaTeX Workshop 配置开始-----------\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 设置是否自动编译,可选:\u0026#34;never\u0026#34;, \u0026#34;onSave\u0026#34;, \u0026#34;onFileChange\u0026#34;\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.latex.autoBuild.run\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;never\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//文件输出路径,会自动创建temp文件\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//\u0026#34;latex-workshop.latex.outDir\u0026#34;: \u0026#34;./temp\u0026#34;,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//右键菜单\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.showContextMenu\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token boolean\"\u003etrue\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//从使用的包中自动补全命令和环境\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.intellisense.package.enabled\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token boolean\"\u003etrue\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//编译出错时设置是否弹出气泡设置\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.message.error.show\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.message.warning.show\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 编译工具和命令\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.latex.tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;args\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-shell-escape\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//加上这句,以使用minted宏包\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-8bit\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//防止minted宏包转义特殊字符\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-synctex=1\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-interaction=nonstopmode\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-file-line-error\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//\u0026#34;-output-directory=temp\u0026#34;, //自定义辅助文件输出路径\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//\u0026#34;-outdir=%OUTDIR%\u0026#34;, //辅助文件输出路径\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;%DOCFILE%\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;args\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-shell-escape\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//加上这句,以使用minted宏包\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-8bit\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//防止minted宏包转义特殊字符\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-synctex=1\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-interaction=nonstopmode\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-file-line-error\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//\u0026#34;-output-directory=temp\u0026#34;, //自定义辅助文件输出路径\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//\u0026#34;-outdir=%OUTDIR%\u0026#34;, //辅助文件输出路径\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;%DOCFILE%\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;latexmk\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;latexmk\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;args\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-synctex=1\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-interaction=nonstopmode\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-file-line-error\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-pdf\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-outdir=%OUTDIR%\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;%DOCFILE%\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;bibtex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;command\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;bibtex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;args\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;%DOCFILE%\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 用于配置编译链\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.latex.recipes\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;XeLaTeX\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;XeLaTeX*2\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;PDFLaTeX\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;PDFLaTeX*2\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;BibTeX\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;bibtex\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;LaTeXmk\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;latexmk\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex -\u0026gt; bibtex -\u0026gt; xelatex*2\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;bibtex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xelatex\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex -\u0026gt; bibtex -\u0026gt; pdflatex*2\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;tools\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;bibtex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pdflatex\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//文件清理。此属性必须是字符串数组\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.latex.clean.fileTypes\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//\u0026#34;*.aux\u0026#34;,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.bbl\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.blg\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.idx\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.ind\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.lof\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.lot\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//\u0026#34;*.out\u0026#34;,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.toc\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.acn\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.acr\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.alg\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.glg\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.glo\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.gls\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.ist\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.fls\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.log\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;*.fdb_latexmk\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//设置为onFaild 在构建失败后清除辅助文件\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.latex.autoClean.run\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;onFailed\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 使用上次的recipe编译组合\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.latex.recipe.default\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;lastUsed\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 用于反向同步的内部查看器的键绑定。ctrl/cmd +点击(默认)或双击\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.view.pdf.internal.synctex.keybinding\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;double-click\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//设置查看PDF的工具,可选\u0026#34;browser\u0026#34;,\u0026#34;tab\u0026#34;,\u0026#34;external\u0026#34;\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;latex-workshop.view.pdf.viewer\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;tab\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//---------LaTeX Workshop 配置结束-----------\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"配置相关内容解释\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/8e96/#%E9%85%8D%E7%BD%AE%E7%9B%B8%E5%85%B3%E5%86%85%E5%AE%B9%E8%A7%A3%E9%87%8A\" class=\"headerlink\" title=\"配置相关内容解释\"\u003e\u003c/a\u003e配置相关内容解释\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e\u0026#34;latex-workshop.latex.tools\u0026#34;\u003c/code\u003e\u003c/strong\u003e :是编译使用的工具,\u003ccode\u003elatexmk\u003c/code\u003e、\u003ccode\u003exelatex\u003c/code\u003e、\u003ccode\u003epdflatex\u003c/code\u003e、\u003ccode\u003ebibtex\u003c/code\u003e 都是常用的编译命令,它们编译的方式不一样。\u003ccode\u003ebibtex\u003c/code\u003e 能用来生成参考文献,\u003ccode\u003elatexmk\u003c/code\u003e、\u003ccode\u003exelatex\u003c/code\u003e、\u003ccode\u003epdflatex\u003c/code\u003e 中只有 \u003ccode\u003exelatex\u003c/code\u003e 较好适合中文,但编译速度 \u003ccode\u003epdflatex\u003c/code\u003e 比 \u003ccode\u003exelatex\u003c/code\u003e 快。\u003ccode\u003eargs\u003c/code\u003e 里是一些参数,可以根据实际情况改,比如在 \u003ccode\u003exelatex\u003c/code\u003e、\u003ccode\u003epdflatex\u003c/code\u003e 的 \u003ccode\u003eargs\u003c/code\u003e 里加了一句\u003ccode\u003e”-shell-escape”\u003c/code\u003e,是为了支持使用 \u003ccode\u003eminted 宏包\u003c/code\u003e(用来代码高亮等)。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e\u0026#34;latex-workshop.latex.recipes\u0026#34;\u003c/code\u003e\u003c/strong\u003e 是编译使用的命令序列,就是 \u003ccode\u003elatexmk\u003c/code\u003e、\u003ccode\u003exelatex\u003c/code\u003e、\u003ccode\u003epdflatex\u003c/code\u003e、\u003ccode\u003ebibtex\u003c/code\u003e 的组合。首先要知道,编译一个\u003ccode\u003e.tex\u003c/code\u003e 文件,用一个编译命令是不够的,当要生成目录时,一般是要用 \u003ccode\u003epdflatex\u003c/code\u003e 或 \u003ccode\u003exelatex\u003c/code\u003e 等编译源代码 2 次,第 1 次生成了辅助文件记录目录等信息,第 2 次才会生成目录;当要生成参考文献时,要编译 4 次,第 1 次用 \u003ccode\u003epdflatex\u003c/code\u003e 或 \u003ccode\u003exelatex\u003c/code\u003e 等编译源代码,第 2 次用 \u003ccode\u003ebibtex\u003c/code\u003e 命令处理\u003ccode\u003e.aux\u003c/code\u003e 辅助文件记录的\u003cbr/\u003e参考文献格式、引用条目等信息,接下来再用 \u003ccode\u003epdflatex\u003c/code\u003e 或 \u003ccode\u003exelatex\u003c/code\u003e 等编译源代码 2 次读入参考文献并生成引用。我们这里定义、添加了 8 种方法:\u003c/p\u003e\u003col\u003e\u003cli\u003e一次 \u003ccode\u003eXeLaTeX\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003eXeLaTeX*2\u003c/code\u003e\u003c/li\u003e\u003cli\u003e一次 \u003ccode\u003ePDFLaTeX\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003ePDFLaTeX*2\u003c/code\u003e\u003c/li\u003e\u003cli\u003e一次 \u003ccode\u003eBibTeX\u003c/code\u003e\u003c/li\u003e\u003cli\u003e一次 \u003ccode\u003eLaTeXmk\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003exelatex -\u0026gt; bibtex -\u0026gt; xelatex*2\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003epdflatex -\u0026gt; bibtex -\u0026gt; pdflatex*2\u003c/code\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e其中第一个的是默认编译命令,因为处理中文文档,所以把一次 \u003ccode\u003eXeLaTeX\u003c/code\u003e 放在第一位。当你使用 TeXstudio 时你不必在乎这些,因为它会自动为你进行多次编译。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e\u0026#34;latex-workshop.view.pdf.viewer\u0026#34;\u003c/code\u003e\u003c/strong\u003e 是用来查看 PDF 的工具,我们这里采用 \u003ccode\u003e\u0026#34;tab\u0026#34;\u003c/code\u003e(内置阅读器)。如果选择 \u003ccode\u003eexternal\u003c/code\u003e(外部阅读器),需要添加其他配置,可以在参考链接中获取相关信息。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e\u0026#34;latex-workshop.latex.autoBuild.run\u0026#34;\u003c/code\u003e\u003c/strong\u003e 是控制是否自动编译,可以通过自动编译实现准实时预览,但是一来编译需要时间,特别是复杂文档编译时间往往漫长;二来边编译边输入很可能造成意想不到的错误,这种错误不能通过重新编译一遍解决,需要将辅助文件全部删除后重新编译。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e构建一份 PDF,除了 \u003ccode\u003e.tex\u003c/code\u003e 源文件,一般需要 \u003ccode\u003e.cls\u003c/code\u003e、\u003ccode\u003e.sty\u003c/code\u003e 文件,如果需要参考文献,还\u003cbr/\u003e需要 \u003ccode\u003e.bib\u003c/code\u003e、\u003ccode\u003e.bst\u003c/code\u003e 文件,具体如下:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e.cls\u003c/code\u003e,文档类文件,如内置的 \u003ccode\u003earticle.cls\u003c/code\u003e、\u003ccode\u003ebook.cls\u003c/code\u003e,文档类名称与文件名一致\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.sty\u003c/code\u003e,宏包文件,如 \u003ccode\u003ectex.sty\u003c/code\u003e,宏包名称与文件名一致\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.bst\u003c/code\u003e,\u003ccode\u003eBibTEX\u003c/code\u003e 参考文献样式文件,如内置的 \u003ccode\u003eplain.bst\u003c/code\u003e\u003c/li\u003e\u003cli\u003e.bib,\u003ccode\u003eBibTEX\u003c/code\u003e 参考文献数据库文件\u003cbr/\u003e编译过程中会生成许多辅助文件,有些中间辅助文件会自动清除,有些则不会,生\u003cbr/\u003e成的常见辅助文件有:\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.aux\u003c/code\u003e,主辅助文件,记录交叉引用、目录、参考文献的引用等\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.log\u003c/code\u003e,错误日志文件\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.toc\u003c/code\u003e,目录记录文件\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.synctex.gz\u003c/code\u003e,正反向搜索文件\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.bbl\u003c/code\u003e,\u003ccode\u003ebibtex\u003c/code\u003e 生成的参考文献记录文件\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.blg\u003c/code\u003e,\u003ccode\u003ebibtex\u003c/code\u003e 生成的日志文件\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.out\u003c/code\u003e,\u003ccode\u003ehyperref\u003c/code\u003e 宏包生成的 PDF 书签记录文件\u003c/li\u003e\u003cli\u003e\u003ccode\u003e.pyg\u003c/code\u003e,基于 \u003ccode\u003epygment\u003c/code\u003e 的 \u003ccode\u003eminted\u003c/code\u003e 宏包生成的文件\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e生成的辅助文件较多,建议一份文档单独一个文件夹(本来设置了,但调宏包有点问题,注释掉了又);因为要借助辅助文件,有时需要多次编译。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e\u0026#34;latex-workshop.showContextMenu\u0026#34;\u003c/code\u003e\u003c/strong\u003e 是 \u003ccode\u003etrue\u003c/code\u003e 时,你在 \u003ccode\u003e.tex\u003c/code\u003e 文件中右键时会出现一些便捷的命令。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e\u0026#34;latex-workshop.intellisense.package.enabled\u0026#34;\u003c/code\u003e\u003c/strong\u003e 是 \u003ccode\u003etrue\u003c/code\u003e,能够开启自动补全,比较方便。\u003c/p\u003e\u003cp\u003e**\u003ccode\u003e\u0026#34;latex-workshop.message.error.show\u0026#34;\u003c/code\u003e、\u003ccode\u003e\u0026#34;latex-workshop.message.warning.show\u0026#34;\u003c/code\u003e**是关于编译不好时的提醒、警告气泡,比较烦人,建议设置为 \u003ccode\u003efalse\u003c/code\u003e 不显示,错误信息还是可以通过其他方式得到的,比如找红色波浪线,鼠标放上面会有提示。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003e\u0026#34;latex-workshop.latex.clean.fileTypes\u0026#34;\u003c/code\u003e\u003c/strong\u003e 是用来清除编译过程中生成的辅助文件。如果注释掉,当存在参考文献等时,一次编译出错会导致原来编译四次才能生成的参考文献因为相关辅助文件被清除要重新编译四次。有些情况下辅助文件也会造成困扰,比如在源文件中改正确了,但辅助文件中的错误不会改过来,从而导致莫名其妙的编译失败,很多情况下这是一种直觉和经验,把辅助文件全删了重新编译就行,可以根据自己的习惯选择是否取消注释开启自动清除。\u003c/p\u003e\u003cp\u003e需要注意的是,\u003cstrong\u003e设置了辅助文件输出目录\u003c/strong\u003e,在调用一些宏包比如 \u003ccode\u003eminted\u003c/code\u003e 宏包时也需要申明辅助文件的路径,最后我没有设置辅助文件输出目录。\u003c/p\u003e\u003ch3 id=\"最后测试\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/8e96/#%E6%9C%80%E5%90%8E%E6%B5%8B%E8%AF%95\" class=\"headerlink\" title=\"最后测试\"\u003e\u003c/a\u003e最后测试\u003c/h3\u003e\u003ch4 id=\"minted-宏包设置\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/8e96/#minted-%E5%AE%8F%E5%8C%85%E8%AE%BE%E7%BD%AE\" class=\"headerlink\" title=\"minted 宏包设置\"\u003e\u003c/a\u003e\u003ccode\u003eminted\u003c/code\u003e 宏包设置\u003c/h4\u003e\u003cp\u003e代码高亮需要用到 \u003ccode\u003eminted\u003c/code\u003e宏包,需要再次折腾一下,就顺便记录一下:\u003c/p\u003e\u003cp\u003e首先确保有一个 \u003ccode\u003ePython\u003c/code\u003e 环境,我这里是 \u003ccode\u003ePython 3.10.1\u003c/code\u003e。(不过为了环境更好的切换,推荐使用 \u003ccode\u003econda\u003c/code\u003e)\u003c/p\u003e\u003cp\u003e\u003ccode\u003ePython\u003c/code\u003e 安装 \u003ccode\u003ePygments\u003c/code\u003e 库:\u003ccode\u003epip install Pygments\u003c/code\u003e\u003c/p\u003e\u003cp\u003e将路径添加环境变量,我的路径是: \u003ccode\u003eC:\\Users\\KSF\\AppData\\Roaming\\Python\\Python310\\Scripts\u003c/code\u003e ,打开系统设置,添加到 \u003ccode\u003e系统-系统信息-高级系统设置-高级-环境变量-系统变量\u003c/code\u003e ,选中变量 \u003ccode\u003ePath\u003c/code\u003e ,选择编辑,之后新建,将路径复制进去。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003cstrong\u003e如果设置了辅助文件夹\u003ccode\u003etemp\u003c/code\u003e:\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e如果在编译命令中在编译命令中加上\u003ccode\u003e\u0026#34;−output−directory=temp\u0026#34;\u003c/code\u003e、\u003ccode\u003e\u0026#34;−outdir=%OUTDIR%\u0026#34;\u003c/code\u003e 两句,即更改了辅助文件的输出位置,一些宏包的输出文件位置也需要申明,比如这里的 \u003ccode\u003eminted\u003c/code\u003e 宏包,需要在 \u003ccode\u003eminted\u003c/code\u003e 宏包的可选参数中申明 \u003ccode\u003eoutputdir=./temp\u003c/code\u003e,即\u003ccode\u003e\\usepackage [cache=false,outputdir=./temp] {minted}\u003c/code\u003e。\u003c/p\u003e\u003c/blockquote\u003e\u003ch4 id=\"效果测试\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/8e96/#%E6%95%88%E6%9E%9C%E6%B5%8B%E8%AF%95\" class=\"headerlink\" title=\"效果测试\"\u003e\u003c/a\u003e效果测试\u003c/h4\u003e\u003cp\u003e最后写一段看看效果:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-latex\" data-language=\"latex\"\u003e\u003ccode class=\"language-latex\"\u003e\u003cspan class=\"token comment\"\u003e% 导言区\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\documentclass\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003earticle\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e%article可以换为book, report, letter, 从而改变文档的整个结构\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\usepackage\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ectex\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e%使用ctex宏包,可以正常显示中文\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\usepackage\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eminted\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\title\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e题目114514\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\author\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e康师傅\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\date\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\today\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token comment\"\u003e%正文区(文稿区)\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\begin\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003edocument\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\maketitle\u003c/span\u003e哼哼嗯啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊\u003cspan class=\"token function selector\"\u003e\\begin\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eminted\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003eframe=single, linenos=true\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003epython\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u0026gt;\u0026gt;\u0026gt; import numpy as np\u0026gt;\u0026gt;\u0026gt; from scipy import stats\u0026gt;\u0026gt;\u0026gt; x = np.array(\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e61, 70, 69, 63, 75, 62, 70, 66\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e)\u0026gt;\u0026gt;\u0026gt; y = np.array(\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e55, 71, 67, 61, 70, 61, 71, 61\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e)\u0026gt;\u0026gt;\u0026gt; _, p = stats.ttest_1samp(x - y, 0)\u0026gt;\u0026gt;\u0026gt; p0.042982513619168904\u003cspan class=\"token function selector\"\u003e\\end\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eminted\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token function selector\"\u003e\\end\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003edocument\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e效果,整挺好:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/install_texlive/test.webp\" alt=\"test\"/\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/8e96/"},{"title":"合宙Air601连接阿里云物联网平台-MQTT协议学习","time":"2023-07-22T12:31:10Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"合宙Air601连接阿里云物联网平台-MQTT协议学习\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%90%88%E5%AE%99Air601%E8%BF%9E%E6%8E%A5%E9%98%BF%E9%87%8C%E4%BA%91%E7%89%A9%E8%81%94%E7%BD%91%E5%B9%B3%E5%8F%B0-MQTT%E5%8D%8F%E8%AE%AE%E5%AD%A6%E4%B9%A0\" class=\"headerlink\" title=\"合宙Air601连接阿里云物联网平台-MQTT协议学习\"\u003e\u003c/a\u003e合宙Air601连接阿里云物联网平台-MQTT协议学习\u003c/h1\u003e\u003cp\u003e开发板9块9包邮)买来玩玩。\u003c/p\u003e\u003cp\u003e首先赞美一下其他模块有现成AT/MQTT固件,因为Air601刚出来不久,现在还没有AT/MQTT固件,所以要TCP连接后手搓MQTT协议,就当学习了~\u003c/p\u003e\u003cp\u003e鼓捣了一晚上,记录记录过程~\u003c/p\u003e\u003cp\u003e一些官方介绍:\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eAir601-12F 是合宙通信推出的 Wi-Fi - BLE二合一通信模块;\u003cbr/\u003eAir601-12F采用合宙Air601芯片平台,支持Wi-Fi 802.11b/g/n协议,支持BLE 4.2协议;\u003cbr/\u003eAir601-12F 兼容业内主流12F封装(SMD-22),板载PCB天线,极致成本,满足小型化低成本需求;\u003cbr/\u003eAir601-12F 支持AT指令开发,指令集兼容,可无缝替换。\u003cbr/\u003eWi-Fi 安全支持 Wi-Fi WMM/WMM-PS/WPA/WPA2/WPS;\u003cbr/\u003e支持20/40MHz带宽,最高支持150Mbps速率;\u003cbr/\u003e支持 Station 、Station + SoftAP 、SoftAP 模式;\u003cbr/\u003e支持TLS加密通信,硬件加密模块加速,支持多路TLS连接;\u003cbr/\u003e支持fota空中升级;\u003cbr/\u003e支持低功耗休眠,休眠电流小于20 μA\u003c/p\u003e\u003cimg src=\"http://images.elecfans.top/uploads/20230717/3902cb10-2457-11ee-962d-dac502259ad0.png\" style=\"zoom: 25%;\"/\u003e\u003c/blockquote\u003e\u003ch2 id=\"准备工作\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C\" class=\"headerlink\" title=\"准备工作\"\u003e\u003c/a\u003e准备工作\u003c/h2\u003e\u003ch3 id=\"获取AT指令手册\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%8E%B7%E5%8F%96AT%E6%8C%87%E4%BB%A4%E6%89%8B%E5%86%8C\" class=\"headerlink\" title=\"获取AT指令手册\"\u003e\u003c/a\u003e获取AT指令手册\u003c/h3\u003e\u003cp\u003e\u003ca href=\"https://cdn.openluat-luatcommunity.openluat.com/attachment/20230717162214038_%E4%B8%8A%E6%B5%B7%E5%90%88%E5%AE%99WIFI%E6%A8%A1%E7%BB%84(Air601%E7%B3%BB%E5%88%97)AT%E5%91%BD%E4%BB%A4%E6%89%8B%E5%86%8CV1.0.3.pdf\"\u003e上海合宙WIFI模组(Air601系列)AT命令手册V1.0.3.pdf\u003c/a\u003e\u003c/p\u003e\u003cp\u003e因为直接买的开发板,所以开箱即用。使用type-c数据线,通过串口进行操作。\u003c/p\u003e\u003cp\u003e具体指令信息可以参考手册,这里只记录必要过程。\u003c/p\u003e\u003ch3 id=\"连接wifi\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%BF%9E%E6%8E%A5wifi\" class=\"headerlink\" title=\"连接wifi\"\u003e\u003c/a\u003e连接wifi\u003c/h3\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-none\"\u003e\u003ccode class=\"language-none\"\u003eAT+CWJAP=\u0026#34;WiFi名\u0026#34;,\u0026#34;WiFi密码\u0026#34;\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e若返回\u003ccode\u003eWIFI CONNECTED\u003c/code\u003e,则连接成功。\u003c/p\u003e\u003ch3 id=\"阿里云物联网平台创建好设备\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E9%98%BF%E9%87%8C%E4%BA%91%E7%89%A9%E8%81%94%E7%BD%91%E5%B9%B3%E5%8F%B0%E5%88%9B%E5%BB%BA%E5%A5%BD%E8%AE%BE%E5%A4%87\" class=\"headerlink\" title=\"阿里云物联网平台创建好设备\"\u003e\u003c/a\u003e阿里云物联网平台创建好设备\u003c/h3\u003e\u003cp\u003e比较简单就不演示了。\u003c/p\u003e\u003ch2 id=\"计算MQTT协议报文内容\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%AE%A1%E7%AE%97MQTT%E5%8D%8F%E8%AE%AE%E6%8A%A5%E6%96%87%E5%86%85%E5%AE%B9\" class=\"headerlink\" title=\"计算MQTT协议报文内容\"\u003e\u003c/a\u003e计算MQTT协议报文内容\u003c/h2\u003e\u003cp\u003eMQTT(消息队列遥测传输)是一个基于客户端-服务器的消息发布/订阅传输协议。\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://mcxiaoke.gitbooks.io/mqtt-cn/content/\"\u003eMQTT中文手册\u003c/a\u003e\u003c/p\u003e\u003ch3 id=\"MQTT控制报文\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#MQTT%E6%8E%A7%E5%88%B6%E6%8A%A5%E6%96%87\" class=\"headerlink\" title=\"MQTT控制报文\"\u003e\u003c/a\u003eMQTT控制报文\u003c/h3\u003e\u003cp\u003eMQTT控制报文由三部分组成:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e报文部分\u003c/th\u003e\u003cth\u003e描述\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003eFixed header\u003c/td\u003e\u003ctd\u003e固定报头,所有控制报文都包含\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eVariable header\u003c/td\u003e\u003ctd\u003e可变报头,部分控制报文包含\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003ePayload\u003c/td\u003e\u003ctd\u003e有效载荷,部分控制报文包含\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch3 id=\"CONNECT-报文结构\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#CONNECT-%E6%8A%A5%E6%96%87%E7%BB%93%E6%9E%84\" class=\"headerlink\" title=\"CONNECT 报文结构\"\u003e\u003c/a\u003eCONNECT 报文结构\u003c/h3\u003e\u003cp\u003e建立客户端(Client)到服务端(Server)的网络连接后,客户端发送给服务端的第一个报文必须是 CONNECT 报文(连接到服务端)。\u003cbr/\u003e并且在一次连接中,只能发送一次 CONNECT 报文,服务端会将客服端发送的第二个CONNECT报文当做协议违规处理并断开连接。\u003cbr/\u003eCONNECT报文结构为:\u003cstrong\u003e固定报头+可变报头+有效载荷。\u003c/strong\u003e\u003c/p\u003e\u003ch4 id=\"固定报头\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%9B%BA%E5%AE%9A%E6%8A%A5%E5%A4%B4\" class=\"headerlink\" title=\"固定报头\"\u003e\u003c/a\u003e固定报头\u003c/h4\u003e\u003ctable\u003e \u003ctbody\u003e\u003ctr\u003e \u003cth colspan=\"9\"\u003e\u003ccenter\u003e固定报文格式\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003eBit\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e7\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e6\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e5\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e4\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e3\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e2\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e1\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e0\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte1\u003c/center\u003e\u003c/td\u003e \u003ctd colspan=\"4\"\u003e\u003ccenter\u003eMQTT控制报文的类型(1)\u003c/center\u003e\u003c/td\u003e \u003ctd colspan=\"4\"\u003e\u003ccenter\u003eReserved 保留位\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte2...\u003c/center\u003e\u003c/td\u003e \u003ctd colspan=\"8\"\u003e\u003ccenter\u003e剩余长度\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e其中\u003cstrong\u003e剩余长度=可变报头长度+有效载荷长度\u003c/strong\u003e ,这个在最后计算。\u003c/p\u003e\u003ch5 id=\"剩余长度详解\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%89%A9%E4%BD%99%E9%95%BF%E5%BA%A6%E8%AF%A6%E8%A7%A3\" class=\"headerlink\" title=\"剩余长度详解\"\u003e\u003c/a\u003e剩余长度详解\u003c/h5\u003e\u003cp\u003e\u003cstrong\u003e位置:\u003c/strong\u003e从第2个字节开始。\u003c/p\u003e\u003cp\u003e剩余长度(Remaining Length)表示当前报文剩余部分的字节数,包括可变报头和负载的数据。剩余长度不包括用于编码剩余长度字段本身的字节数。\u003c/p\u003e\u003cp\u003e剩余长度字段使用一个变长度编码方案,对小于128的值它使用单字节编码。若剩余长度大于等于128字节,则使用双字节低端编码的方式(低八位 - 高八位),最多使用 4 个字节来表示长度:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth align=\"center\"\u003e字节数\u003c/th\u003e\u003cth align=\"center\"\u003e最小值\u003c/th\u003e\u003cth align=\"center\"\u003e最大值\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0 (0x00)\u003c/td\u003e\u003ctd align=\"center\"\u003e127 (0x7F)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003e2\u003c/td\u003e\u003ctd align=\"center\"\u003e128 (0x80, 0x01)\u003c/td\u003e\u003ctd align=\"center\"\u003e16 383 (0xFF, 0x7F)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003e3\u003c/td\u003e\u003ctd align=\"center\"\u003e16 384 (0x80, 0x80, 0x01)\u003c/td\u003e\u003ctd align=\"center\"\u003e2 097 151 (0xFF, 0xFF, 0x7F)\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003e4\u003c/td\u003e\u003ctd align=\"center\"\u003e2 097 152 (0x80, 0x80, 0x80, 0x01)\u003c/td\u003e\u003ctd align=\"center\"\u003e268 435 455 (0xFF, 0xFF, 0xFF, 0x7F)\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e其中,每个字节的低七位用于编码数据,第八位延续位用于指示是否有更多的字节。因此每个字节可以编码127个数值(0111 1111)和一个延续位。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e例:\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e小于128字节时:\u003c/p\u003e\u003cp\u003e剩余长度98个字节(0110 0010)转换成16进制为 0x62。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e大于128字节小于16384字节时\u003c/p\u003e\u003cp\u003e剩余长度300个字节时,按照低八位 - 高八位排列,低八位的最高位为1(延续位)。\u003c/p\u003e\u003cp\u003e300 = 1 0010 1100\u003c/p\u003e\u003cp\u003e低八位:1(固定)+300低7位(010 1100) -\u0026gt; 1010 1100\u003c/p\u003e\u003cp\u003e高八位:300低7位前(10) -\u0026gt; 0000 0010\u003c/p\u003e\u003cp\u003e所以剩余长度表示为 AC 02\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/blockquote\u003e\u003ch5 id=\"得到固定报头:\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%BE%97%E5%88%B0%E5%9B%BA%E5%AE%9A%E6%8A%A5%E5%A4%B4%EF%BC%9A\" class=\"headerlink\" title=\"得到固定报头:\"\u003e\u003c/a\u003e得到固定报头:\u003c/h5\u003e\u003cp\u003e16进制,后面均为16进制,不再说明:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e10\u003c/span\u003e ??\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e其中\u003ccode\u003e??\u003c/code\u003e为剩余长度,由最后计算获得。\u003c/p\u003e\u003ch4 id=\"可变报头\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%8F%AF%E5%8F%98%E6%8A%A5%E5%A4%B4\" class=\"headerlink\" title=\"可变报头\"\u003e\u003c/a\u003e可变报头\u003c/h4\u003e\u003cp\u003e某些MQTT控制报文包含一个可变报头部分。它在固定报头和负载之间。可变报头的内容根据报文类型的不同而不同。\u003c/p\u003e\u003cp\u003eCONNECT报文的可变报头按下列次序包含四个字段:协议名(Protocol Name),协议级别(Protocol Level),连接标志(Connect Flags)和保持连接(Keep Alive)。\u003c/p\u003e\u003ch5 id=\"协议名-Protocol-Name\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%8D%8F%E8%AE%AE%E5%90%8D-Protocol-Name\" class=\"headerlink\" title=\"协议名 Protocol Name\"\u003e\u003c/a\u003e协议名 Protocol Name\u003c/h5\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth align=\"center\"\u003e\u003c/th\u003e\u003cth align=\"center\"\u003e说明\u003c/th\u003e\u003cth align=\"center\"\u003e7\u003c/th\u003e\u003cth align=\"center\"\u003e6\u003c/th\u003e\u003cth align=\"center\"\u003e5\u003c/th\u003e\u003cth align=\"center\"\u003e4\u003c/th\u003e\u003cth align=\"center\"\u003e3\u003c/th\u003e\u003cth align=\"center\"\u003e2\u003c/th\u003e\u003cth align=\"center\"\u003e1\u003c/th\u003e\u003cth align=\"center\"\u003e0\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 1\u003c/td\u003e\u003ctd align=\"center\"\u003e长度 MSB (0)\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 2\u003c/td\u003e\u003ctd align=\"center\"\u003e长度 LSB (4)\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 3\u003c/td\u003e\u003ctd align=\"center\"\u003e‘M’\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 4\u003c/td\u003e\u003ctd align=\"center\"\u003e‘Q’\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 5\u003c/td\u003e\u003ctd align=\"center\"\u003e‘T’\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 6\u003c/td\u003e\u003ctd align=\"center\"\u003e‘T’\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e协议名是表示协议名 \u003cem\u003eMQTT\u003c/em\u003e 的UTF-8编码的字符串。MQTT规范的后续版本不会改变这个字符串的偏移和长度。\u003c/p\u003e\u003cp\u003e如果协议名不正确服务端\u003cstrong\u003e可以\u003c/strong\u003e断开客户端的连接,也\u003cstrong\u003e可以\u003c/strong\u003e按照某些其它规范继续处理CONNECT报文。对于后一种情况,按照本规范,服务端\u003cstrong\u003e不能\u003c/strong\u003e继续处理CONNECT报文。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e数据包检测工具,例如防火墙,可以使用协议名来识别MQTT流量。\u003c/p\u003e\u003c/blockquote\u003e\u003ch5 id=\"协议级别-Protocol-Level\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%8D%8F%E8%AE%AE%E7%BA%A7%E5%88%AB-Protocol-Level\" class=\"headerlink\" title=\"协议级别 Protocol Level\"\u003e\u003c/a\u003e协议级别 Protocol Level\u003c/h5\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth align=\"center\"\u003e\u003c/th\u003e\u003cth align=\"center\"\u003e说明\u003c/th\u003e\u003cth align=\"center\"\u003e7\u003c/th\u003e\u003cth align=\"center\"\u003e6\u003c/th\u003e\u003cth align=\"center\"\u003e5\u003c/th\u003e\u003cth align=\"center\"\u003e4\u003c/th\u003e\u003cth align=\"center\"\u003e3\u003c/th\u003e\u003cth align=\"center\"\u003e2\u003c/th\u003e\u003cth align=\"center\"\u003e1\u003c/th\u003e\u003cth align=\"center\"\u003e0\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 7\u003c/td\u003e\u003ctd align=\"center\"\u003eLevel(4)\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003ctd align=\"center\"\u003e0\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e客户端用8位的无符号值表示协议的修订版本。对于3.1.1版协议,协议级别字段的值是4(0x04)。如果发现不支持的协议级别,服务端\u003cstrong\u003e必须\u003c/strong\u003e给发送一个返回码为0x01(不支持的协议级别)的CONNACK报文响应CONNECT报文,然后断开客户端的连接。\u003c/p\u003e\u003ch5 id=\"连接标志-Connect-Flags\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%BF%9E%E6%8E%A5%E6%A0%87%E5%BF%97-Connect-Flags\" class=\"headerlink\" title=\"连接标志 Connect Flags\"\u003e\u003c/a\u003e连接标志 Connect Flags\u003c/h5\u003e\u003cp\u003e连接标志字节包含一些用于指定MQTT连接行为的参数。它还指出有效载荷中的字段是否存在。\u003c/p\u003e\u003ctable\u003e \u003ctbody\u003e\u003ctr\u003e \u003cth colspan=\"9\"\u003e\u003ccenter\u003e连接标志\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003eBit\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e7\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e6\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e5\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e4\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e3\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e2\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e1\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e0\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003e \u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eUser Name Flag\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003ePassword Flag\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eWill Retain\u003c/center\u003e\u003c/td\u003e \u003ctd colspan=\"2\"\u003e\u003ccenter\u003eWill QoS\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eWill Flag\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eClean Session\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eReserved\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 8\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e一共有6个:清理会话 Clean Session,遗嘱标志 Will Flag,遗嘱QoS Will QoS,遗嘱保留 Will Retain,密码标志 Password Flag,用户名标志 User Name Flag。\u003c/p\u003e\u003cp\u003e服务端\u003cstrong\u003e必须\u003c/strong\u003e验证CONNECT控制报文的保留标志位(第0位)是否为0,如果不为0必须断开客户端连接。\u003c/p\u003e\u003cp\u003e各个有效位的具体解释见参考文档\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e一般使用 1100 0010 (用户名、密码、清理会话),转换成16进制为:C2\u003c/strong\u003e\u003c/p\u003e\u003ch5 id=\"保持连接-Keep-Alive\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E4%BF%9D%E6%8C%81%E8%BF%9E%E6%8E%A5-Keep-Alive\" class=\"headerlink\" title=\"保持连接 Keep Alive\"\u003e\u003c/a\u003e保持连接 Keep Alive\u003c/h5\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth align=\"center\"\u003eBit\u003c/th\u003e\u003cth align=\"center\"\u003e7\u003c/th\u003e\u003cth align=\"center\"\u003e6\u003c/th\u003e\u003cth align=\"center\"\u003e5\u003c/th\u003e\u003cth align=\"center\"\u003e4\u003c/th\u003e\u003cth align=\"center\"\u003e3\u003c/th\u003e\u003cth align=\"center\"\u003e2\u003c/th\u003e\u003cth align=\"center\"\u003e1\u003c/th\u003e\u003cth align=\"center\"\u003e0\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 9\u003c/td\u003e\u003ctd align=\"center\"\u003e保持连接 Keep Alive MSB\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003ebyte 10\u003c/td\u003e\u003ctd align=\"center\"\u003e保持连接 Keep Alive LSB\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003ctd align=\"center\"\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e保持连接(Keep Alive)是一个以秒为单位的时间间隔,表示为一个16位的字,它是指在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允许空闲的最大时间间隔。客户端负责保证控制报文发送的时间间隔不超过保持连接的值。如果没有任何其它的控制报文可以发送,客户端\u003cstrong\u003e必须\u003c/strong\u003e发送一个PINGREQ报文。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e如:设置100s表示成16进制为 00 64\u003c/p\u003e\u003c/blockquote\u003e\u003ctable\u003e \u003ctbody\u003e\u003ctr\u003e \u003cth colspan=\"10\"\u003e\u003ccenter\u003e可变报头非规范示例\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003eDescription\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e7\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e6\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e5\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e4\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e3\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e2\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e1\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003cstrong\u003e0\u003c/strong\u003e\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003cth colspan=\"10\"\u003e\u003ccenter\u003eProtocol Name\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eLength MSB(0)\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 2\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eLength LSB(4)\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 3\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u0026#39;M\u0026#39;\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 4\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u0026#39;Q\u0026#39;\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 5\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u0026#39;T\u0026#39;\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 6\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u0026#39;T\u0026#39;\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003cth colspan=\"10\"\u003e\u003ccenter\u003eProtocol Level\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 7\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eLevel(4)\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003cth colspan=\"10\"\u003e\u003ccenter\u003eConnect Flags\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003ebyte 8\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eUser Name Flag(1)\u003c/center\u003e\u003c/td\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd rowspan=\"7\"\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ePassword Flag(1)\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003eWill Retain(0)\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003eWill QoS(01)\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003eWill Flag(1)\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003eClean Session(1)\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003eReserved(0)\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003cth colspan=\"10\"\u003e\u003ccenter\u003eKeep Alive\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 9\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eKeep Alive MSB(0)\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 10\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eKeep Alive LSB(10)\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch5 id=\"得到可变报头\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%BE%97%E5%88%B0%E5%8F%AF%E5%8F%98%E6%8A%A5%E5%A4%B4\" class=\"headerlink\" title=\"得到可变报头\"\u003e\u003c/a\u003e得到可变报头\u003c/h5\u003e\u003cp\u003e用户名、密码、清理回话,100s\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e04\u003c/span\u003e 4D \u003cspan class=\"token number\"\u003e51\u003c/span\u003e \u003cspan class=\"token number\"\u003e54\u003c/span\u003e \u003cspan class=\"token number\"\u003e54\u003c/span\u003e \u003cspan class=\"token number\"\u003e04\u003c/span\u003e C2 \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e64\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"有效载荷\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E6%9C%89%E6%95%88%E8%BD%BD%E8%8D%B7\" class=\"headerlink\" title=\"有效载荷\"\u003e\u003c/a\u003e有效载荷\u003c/h4\u003e\u003cblockquote\u003e\u003cp\u003e需要用到的工具:\u003c/p\u003e\u003cp\u003e\u003ca href=\"http://www.metools.info/code/c25.html\"\u003e在线HMAC计算-ME2在线工具 (metools.info)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.rapidtables.com/convert/number/hex-to-ascii.html\"\u003eHex to ASCII Text String Converter (rapidtables.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.rapidtables.com/convert/number/ascii-to-hex.html\"\u003eASCII to Hex | Text to Hex Code Converter (rapidtables.com)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e对于各参数的具体信息可以参考阿里云文档:\u003ca href=\"https://help.aliyun.com/zh/iot/user-guide/establish-mqtt-connections-over-tcp#section-llx-5ay-oma\"\u003eMQTT-TCP连接通信 (aliyun.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e有效载荷(payload)包含一个或多个以长度为前缀的字段,可变报头中的标志决定是否包含这些字段。如果包含的话,必须按这个顺序出现:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码,且每个字段必须使用UTF-8编码字符串(\u003cstrong\u003e需要在最前面添加表示长度的16进制字符\u003c/strong\u003e)\u003c/p\u003e\u003ctable\u003e \u003ctbody\u003e\u003ctr\u003e \u003cth colspan=\"2\"\u003e\u003ccenter\u003e每个字段示例\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003cth\u003e\u003ccenter\u003eBit\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e7 - 0\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e数据长度 MSB\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 2\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e数据长度 LSB\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 3...\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e数据长度大于0,这里就是数据部分\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e我们此时需要去阿里云获取三元组(我随便编一编):\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;ProductKey\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;ksf114514\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;DeviceName\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;Air601\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;DeviceSecret\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;ksf1145141919810dj15ltc137666\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e我们约定:\u003c/p\u003e\u003cul\u003e\u003cli\u003e#:ProductKey\u003c/li\u003e\u003cli\u003e*:DeviceName\u003c/li\u003e\u003cli\u003e\u0026amp;:DeviceSecret\u003c/li\u003e\u003c/ul\u003e\u003ch5 id=\"客户端标识符\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%A0%87%E8%AF%86%E7%AC%A6\" class=\"headerlink\" title=\"客户端标识符\"\u003e\u003c/a\u003e客户端标识符\u003c/h5\u003e\u003cp\u003e通用格式:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e*|securemode=\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003esignmethod=hmacsha1|\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e进行填充:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003eAir601|securemode=\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003esignmethod=hmacsha1|\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e转换为16进制:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e41\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e75\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 6D 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e33\u003c/span\u003e 2C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e67\u003c/span\u003e 6E 6D \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e74\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6D \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e添加长度(40 -\u0026gt; 00 28):\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e28\u003c/span\u003e \u003cspan class=\"token number\"\u003e41\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e75\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 6D 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e33\u003c/span\u003e 2C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e67\u003c/span\u003e 6E 6D \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e74\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6D \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch5 id=\"用户名\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E7%94%A8%E6%88%B7%E5%90%8D\" class=\"headerlink\" title=\"用户名\"\u003e\u003c/a\u003e用户名\u003c/h5\u003e\u003cp\u003e通用格式:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e*\u0026amp;#\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e进行填充:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003eAir601\u0026amp;ksf114514\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e转换为16进制\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-none\"\u003e\u003ccode class=\"language-none\"\u003e41 69 72 36 30 31 26 6B 73 66 31 31 34 35 31 34\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e添加长度(16 -\u0026gt; 00 10)\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-none\"\u003e\u003ccode class=\"language-none\"\u003e00 10 41 69 72 36 30 31 26 6B 73 66 31 31 34 35 31 34\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch5 id=\"密码\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%AF%86%E7%A0%81\" class=\"headerlink\" title=\"密码\"\u003e\u003c/a\u003e密码\u003c/h5\u003e\u003cp\u003e通用格式:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003eclientId*deviceName*productKey#\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e进行填充:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003eclientIdAir601deviceNameAir601productKeyksf114514\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e加密:\u003c/p\u003e\u003cp\u003e将填充后的内容\u003cstrong\u003e使用DeviceSecret做密钥\u003c/strong\u003e,进行\u003cstrong\u003eHmacSHA1加密\u003c/strong\u003e:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003ee4b931f38037ef7241455709458b4b630b22eac2\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e转为16进制:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e添加长度(40 -\u0026gt; 00 28)\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e28\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch5 id=\"合并,得到最终有效载荷\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%90%88%E5%B9%B6%EF%BC%8C%E5%BE%97%E5%88%B0%E6%9C%80%E7%BB%88%E6%9C%89%E6%95%88%E8%BD%BD%E8%8D%B7\" class=\"headerlink\" title=\"合并,得到最终有效载荷\"\u003e\u003c/a\u003e合并,得到最终有效载荷\u003c/h5\u003e\u003cp\u003e根据我们在可变报头中的选择:\u003cstrong\u003e最终有效载荷=客户端标识符+用户名+密码\u003c/strong\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e28\u003c/span\u003e \u003cspan class=\"token number\"\u003e41\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e75\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 6D 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e33\u003c/span\u003e 2C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e67\u003c/span\u003e 6E 6D \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e74\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6D \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e10\u003c/span\u003e \u003cspan class=\"token number\"\u003e41\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e26\u003c/span\u003e 6B \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e28\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"得到最终报文\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%BE%97%E5%88%B0%E6%9C%80%E7%BB%88%E6%8A%A5%E6%96%87\" class=\"headerlink\" title=\"得到最终报文\"\u003e\u003c/a\u003e得到最终报文\u003c/h4\u003e\u003cp\u003e首先计算固定报头中的剩余长度:\u003cstrong\u003e剩余长度=可变报头长度+有效载荷长度\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e可得剩余长度为:10+102=112 -\u0026gt; 70。(小于128,所以正常编码)\u003c/p\u003e\u003cp\u003e最终报文:\u003cstrong\u003e固定报头+可变报头+有效载荷\u003c/strong\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e10\u003c/span\u003e \u003cspan class=\"token number\"\u003e70\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e04\u003c/span\u003e 4D \u003cspan class=\"token number\"\u003e51\u003c/span\u003e \u003cspan class=\"token number\"\u003e54\u003c/span\u003e \u003cspan class=\"token number\"\u003e54\u003c/span\u003e \u003cspan class=\"token number\"\u003e04\u003c/span\u003e C2 \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e64\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e28\u003c/span\u003e \u003cspan class=\"token number\"\u003e41\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e75\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 6D 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e33\u003c/span\u003e 2C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e67\u003c/span\u003e 6E 6D \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e74\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6D \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e10\u003c/span\u003e \u003cspan class=\"token number\"\u003e41\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e26\u003c/span\u003e 6B \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e28\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e现在可以愉快的与阿里云物联网平台建立连接了~\u003c/p\u003e\u003ch2 id=\"与阿里云物联网平台建立连接\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E4%B8%8E%E9%98%BF%E9%87%8C%E4%BA%91%E7%89%A9%E8%81%94%E7%BD%91%E5%B9%B3%E5%8F%B0%E5%BB%BA%E7%AB%8B%E8%BF%9E%E6%8E%A5\" class=\"headerlink\" title=\"与阿里云物联网平台建立连接\"\u003e\u003c/a\u003e与阿里云物联网平台建立连接\u003c/h2\u003e\u003ch3 id=\"获取连接地址\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%8E%B7%E5%8F%96%E8%BF%9E%E6%8E%A5%E5%9C%B0%E5%9D%80\" class=\"headerlink\" title=\"获取连接地址\"\u003e\u003c/a\u003e获取连接地址\u003c/h3\u003e\u003cp\u003e直接在阿里云物联网平台的控制台就可以看见,比如我的(瞎编的):\u003ccode\u003eiot-ksf114514.mqtt.iothub.aliyuncs.com\u003c/code\u003e。\u003c/p\u003e\u003ch3 id=\"建立TCP连接\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%BB%BA%E7%AB%8BTCP%E8%BF%9E%E6%8E%A5\" class=\"headerlink\" title=\"建立TCP连接\"\u003e\u003c/a\u003e建立TCP连接\u003c/h3\u003e\u003cp\u003e使用串口助手发送:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003eAT+CIPSTART=\u003cspan class=\"token string\"\u003e\u0026#34;TCP\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;iot-ksf114514.mqtt.iothub.aliyuncs.com\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e1883\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e如果建立连接10s不上报消息,阿里云物联网平台会发送\u003ccode\u003eCLOSED\u003c/code\u003e,并断开连接,这时候需要我们关闭TCP连接然后重新建立连接。\u003c/p\u003e\u003cp\u003e关闭连接:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003eAT+CIPCLOSE\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"发送报文\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%8F%91%E9%80%81%E6%8A%A5%E6%96%87\" class=\"headerlink\" title=\"发送报文\"\u003e\u003c/a\u003e发送报文\u003c/h3\u003e\u003cp\u003e这里都是在单连接的情况(\u003ccode\u003eAT+CIPMUX=0\u003c/code\u003e)。\u003c/p\u003e\u003cp\u003e根据文档,有两种发送方式:\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003eAT+CIPSEND=\u0026lt;length\u0026gt;\u003c/code\u003e\u003c/p\u003e\u003cp\u003e需要指定发送长度,达到指定长度后自动发送。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003eAT+CIPSENDEX=\u0026lt;length\u0026gt;\u003c/code\u003e\u003c/p\u003e\u003cp\u003e指定发送长度,但可以使用字符串 \u003ccode\u003e \\0 (0x5c, 0x30 ASCII)\u003c/code\u003e 触发数据发送。\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e选择哪种?从实践来看,因为使用16进制发送CONNECT报文,报文中出现00同样会触发数据发送(emmmm),所以使用第一种指定长度的发送方式,毕竟报文已经提前算好了。\u003c/p\u003e\u003ch4 id=\"设置发送\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%AE%BE%E7%BD%AE%E5%8F%91%E9%80%81\" class=\"headerlink\" title=\"设置发送\"\u003e\u003c/a\u003e设置发送\u003c/h4\u003e\u003cp\u003e最终报文长度:114\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003eAT+CIPSEND=\u003cspan class=\"token number\"\u003e114\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"发送报文-1\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%8F%91%E9%80%81%E6%8A%A5%E6%96%87-1\" class=\"headerlink\" title=\"发送报文\"\u003e\u003c/a\u003e发送报文\u003c/h4\u003e\u003cp\u003e注意,这里要使用16进制(就是切换成HEX)进行发送:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e10\u003c/span\u003e \u003cspan class=\"token number\"\u003e70\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e04\u003c/span\u003e 4D \u003cspan class=\"token number\"\u003e51\u003c/span\u003e \u003cspan class=\"token number\"\u003e54\u003c/span\u003e \u003cspan class=\"token number\"\u003e54\u003c/span\u003e \u003cspan class=\"token number\"\u003e04\u003c/span\u003e C2 \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e64\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e28\u003c/span\u003e \u003cspan class=\"token number\"\u003e41\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e75\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 6D 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e33\u003c/span\u003e 2C \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e67\u003c/span\u003e 6E 6D \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e74\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6F \u003cspan class=\"token number\"\u003e64\u003c/span\u003e 3D \u003cspan class=\"token number\"\u003e68\u003c/span\u003e 6D \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e68\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e 7C \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e10\u003c/span\u003e \u003cspan class=\"token number\"\u003e41\u003c/span\u003e \u003cspan class=\"token number\"\u003e69\u003c/span\u003e \u003cspan class=\"token number\"\u003e72\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e26\u003c/span\u003e 6B \u003cspan class=\"token number\"\u003e73\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e28\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e66\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e31\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e37\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e39\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e35\u003c/span\u003e \u003cspan class=\"token number\"\u003e38\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e34\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e36\u003c/span\u003e \u003cspan class=\"token number\"\u003e33\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e \u003cspan class=\"token number\"\u003e62\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e \u003cspan class=\"token number\"\u003e65\u003c/span\u003e \u003cspan class=\"token number\"\u003e61\u003c/span\u003e \u003cspan class=\"token number\"\u003e63\u003c/span\u003e \u003cspan class=\"token number\"\u003e32\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"返回参数\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%BF%94%E5%9B%9E%E5%8F%82%E6%95%B0\" class=\"headerlink\" title=\"返回参数\"\u003e\u003c/a\u003e返回参数\u003c/h3\u003e\u003cp\u003e串口返回数据:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003eRx\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e02\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e12\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e09.437\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e 0D 0A 2B \u003cspan class=\"token number\"\u003e49\u003c/span\u003e \u003cspan class=\"token number\"\u003e50\u003c/span\u003e \u003cspan class=\"token number\"\u003e44\u003c/span\u003e 2C \u003cspan class=\"token number\"\u003e34\u003c/span\u003e 3A \u003cspan class=\"token number\"\u003e20\u003c/span\u003e \u003cspan class=\"token number\"\u003e02\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e 0D 0A\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e 末尾的\u003ccode\u003e0D\u003c/code\u003e 是回车符,\u003ccode\u003e0A\u003c/code\u003e是换行符,因为使用串口助手,这俩不可避免。\u003c/p\u003e\u003cp\u003e其中前面的 \u003ccode\u003e0D 0A 2B 49 50 44 2C 34 3A\u003c/code\u003e,是\u003ccode\u003e+IPD,4\u003c/code\u003e,我们只需要关注后面的字节:**\u003ccode\u003e20 02 00 00\u003c/code\u003e** 。\u003c/p\u003e\u003cp\u003e要知道这玩意的意思,首先要了解CONNACK – 确认连接请求。\u003c/p\u003e\u003ch2 id=\"CONNACK-–-确认连接请求\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#CONNACK-%E2%80%93-%E7%A1%AE%E8%AE%A4%E8%BF%9E%E6%8E%A5%E8%AF%B7%E6%B1%82\" class=\"headerlink\" title=\"CONNACK – 确认连接请求\"\u003e\u003c/a\u003eCONNACK – 确认连接请求\u003c/h2\u003e\u003cp\u003e服务端发送CONNACK报文响应从客户端收到的CONNECT报文。服务端发送给客户端的第一个报文\u003cstrong\u003e必须\u003c/strong\u003e是CONNACK。\u003c/p\u003e\u003ch3 id=\"固定报头-1\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%9B%BA%E5%AE%9A%E6%8A%A5%E5%A4%B4-1\" class=\"headerlink\" title=\"固定报头\"\u003e\u003c/a\u003e固定报头\u003c/h3\u003e\u003ctable\u003e \u003ctbody\u003e\u003ctr\u003e \u003cth colspan=\"9\"\u003e\u003ccenter\u003eCONNACK报文固定报头\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003cth\u003e\u003ccenter\u003eBit\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e7\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e6\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e5\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e4\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e3\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e2\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 1\u003c/center\u003e\u003c/td\u003e \u003ctd colspan=\"4\"\u003e\u003ccenter\u003eMQTT报文类型(2)\u003c/center\u003e\u003c/td\u003e \u003ctd colspan=\"4\"\u003e\u003ccenter\u003eReserved 保留位\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte 2...\u003c/center\u003e\u003c/td\u003e \u003ctd colspan=\"8\"\u003e\u003ccenter\u003e剩余长度(2)\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e\u003cstrong\u003e剩余长度字段:\u003c/strong\u003e表示可变报头的长度。对于CONNACK报文这个值等于2。\u003c/p\u003e\u003ch4 id=\"固定报头编码\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%9B%BA%E5%AE%9A%E6%8A%A5%E5%A4%B4%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"固定报头编码\"\u003e\u003c/a\u003e固定报头编码\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token number\"\u003e20\u003c/span\u003e \u003cspan class=\"token number\"\u003e02\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"可变报头-1\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%8F%AF%E5%8F%98%E6%8A%A5%E5%A4%B4-1\" class=\"headerlink\" title=\"可变报头\"\u003e\u003c/a\u003e可变报头\u003c/h3\u003e\u003ctable\u003e \u003ctbody\u003e\u003ctr\u003e \u003cth colspan=\"10\"\u003e\u003ccenter\u003eCONNACK报文可变报头\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003cth\u003e\u003ccenter\u003e\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e描述\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e7\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e6\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e5\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e4\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e3\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e2\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e1\u003c/center\u003e\u003c/th\u003e \u003cth\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/th\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd colspan=\"2\"\u003e\u003ccenter\u003e连接确认标志\u003c/center\u003e\u003c/td\u003e \u003ctd colspan=\"7\"\u003e\u003ccenter\u003eReserved 保留位\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eSP\u003csup\u003e1\u003csup\u003e\u003c/sup\u003e\u003c/sup\u003e\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte1\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e0\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd colspan=\"10\"\u003e\u003ccenter\u003e连接返回码\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003e\u003ccenter\u003ebyte2\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003e\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003ctd\u003e\u003ccenter\u003eX\u003c/center\u003e\u003c/td\u003e \u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch4 id=\"连接确认标志-Connect-Acknowledge-Flags\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%BF%9E%E6%8E%A5%E7%A1%AE%E8%AE%A4%E6%A0%87%E5%BF%97-Connect-Acknowledge-Flags\" class=\"headerlink\" title=\"连接确认标志 Connect Acknowledge Flags\"\u003e\u003c/a\u003e连接确认标志 Connect Acknowledge Flags\u003c/h4\u003e\u003cp\u003e第1个字节是 \u003cem\u003e连接确认标志\u003c/em\u003e,位7-1是保留位且\u003cstrong\u003e必须\u003c/strong\u003e设置为0。 第0 (SP)位 是当前会话(Session Present)标志。\u003c/p\u003e\u003ch5 id=\"当前会话-Session-Present\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%BD%93%E5%89%8D%E4%BC%9A%E8%AF%9D-Session-Present\" class=\"headerlink\" title=\"当前会话 Session Present\"\u003e\u003c/a\u003e当前会话 Session Present\u003c/h5\u003e\u003cp\u003e\u003cstrong\u003e位置:\u003c/strong\u003e连接确认标志的第0位。\u003c/p\u003e\u003cp\u003e如果服务端收到清理会话(CleanSession)标志为1的连接,除了将CONNACK报文中的返回码设置为0之外,还\u003cstrong\u003e必须\u003c/strong\u003e将CONNACK报文中的当前会话设置(Session Present)标志为0。\u003c/p\u003e\u003cp\u003e)我们在发送报文中清理会话标志位为1,所以返回码为0。(其他情况参阅资料)\u003c/p\u003e\u003ch4 id=\"连接返回码-Connect-Return-code\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E8%BF%9E%E6%8E%A5%E8%BF%94%E5%9B%9E%E7%A0%81-Connect-Return-code\" class=\"headerlink\" title=\"连接返回码 Connect Return code\"\u003e\u003c/a\u003e连接返回码 Connect Return code\u003c/h4\u003e\u003cp\u003e\u003cstrong\u003e位置:\u003c/strong\u003e可变报头的第2个字节。\u003c/p\u003e\u003cp\u003e连接返回码字段使用一个字节的无符号值,在下表中列出。\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e值\u003c/th\u003e\u003cth\u003e返回码响应\u003c/th\u003e\u003cth\u003e描述\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e0x00连接已接受\u003c/td\u003e\u003ctd\u003e连接已被服务端接受\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e1\u003c/td\u003e\u003ctd\u003e0x01连接已拒绝,不支持的协议版本\u003c/td\u003e\u003ctd\u003e服务端不支持客户端请求的MQTT协议级别\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e2\u003c/td\u003e\u003ctd\u003e0x02连接已拒绝,不合格的客户端标识符\u003c/td\u003e\u003ctd\u003e客户端标识符是正确的UTF-8编码,但服务端不允许使用\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e3\u003c/td\u003e\u003ctd\u003e0x03连接已拒绝,服务端不可用\u003c/td\u003e\u003ctd\u003e网络连接已建立,但MQTT服务不可用\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e4\u003c/td\u003e\u003ctd\u003e0x04连接已拒绝,无效的用户名或密码\u003c/td\u003e\u003ctd\u003e用户名或密码的数据格式无效\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e5\u003c/td\u003e\u003ctd\u003e0x05连接已拒绝,未授权\u003c/td\u003e\u003ctd\u003e客户端未被授权连接到此服务器\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e6-255\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003e保留\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e如果服务端收到一个合法的CONNECT报文,但出于某些原因无法处理它,服务端应该尝试发送一个包含非零返回码(表格中的某一个)的CONNACK报文。如果服务端发送了一个包含非零返回码的CONNACK报文,那么它\u003cstrong\u003e必须\u003c/strong\u003e关闭网络连接。\u003c/p\u003e\u003ch4 id=\"正确连接的可变报头\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E6%AD%A3%E7%A1%AE%E8%BF%9E%E6%8E%A5%E7%9A%84%E5%8F%AF%E5%8F%98%E6%8A%A5%E5%A4%B4\" class=\"headerlink\" title=\"正确连接的可变报头\"\u003e\u003c/a\u003e正确连接的可变报头\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-none\"\u003e\u003ccode class=\"language-none\"\u003e00 00\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"有效载荷-1\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E6%9C%89%E6%95%88%E8%BD%BD%E8%8D%B7-1\" class=\"headerlink\" title=\"有效载荷\"\u003e\u003c/a\u003e有效载荷\u003c/h3\u003e\u003cp\u003eCONNACK报文没有有效载荷。\u003c/p\u003e\u003ch2 id=\"最终结果\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E6%9C%80%E7%BB%88%E7%BB%93%E6%9E%9C\" class=\"headerlink\" title=\"最终结果\"\u003e\u003c/a\u003e最终结果\u003c/h2\u003e\u003cp\u003e串口返回数据:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003eRx\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e02\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e12\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e09.437\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e 0D 0A 2B \u003cspan class=\"token number\"\u003e49\u003c/span\u003e \u003cspan class=\"token number\"\u003e50\u003c/span\u003e \u003cspan class=\"token number\"\u003e44\u003c/span\u003e 2C \u003cspan class=\"token number\"\u003e34\u003c/span\u003e 3A \u003cspan class=\"token number\"\u003e20\u003c/span\u003e \u003cspan class=\"token number\"\u003e02\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e \u003cspan class=\"token number\"\u003e00\u003c/span\u003e 0D 0A\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e根据我们在串口看到的返回结果\u003ccode\u003e20 02 00 00\u003c/code\u003e,可知连接已经建立成功。\u003c/p\u003e\u003cp\u003e这时候在阿里云物联网平台的设备页面,我们看见我们的设备上线了!\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-markup\" data-language=\"markup\"\u003e\u003ccode class=\"language-markup\"\u003e最后上线时间 2023/07/23 02:12:13.847\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch2 id=\"参考链接\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/47a8/#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\" class=\"headerlink\" title=\"参考链接\"\u003e\u003c/a\u003e参考链接\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://doc.openluat.com/wiki/49\"\u003eLuat社区 (openluat.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://help.aliyun.com/zh/iot/user-guide/establish-mqtt-connections-over-tcp#section-llx-5ay-oma\"\u003eMQTT-TCP连接通信 (aliyun.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://mcxiaoke.gitbooks.io/mqtt-cn/content/\"\u003eMQTT中文手册\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.codenong.com/cs105877395/\"\u003eMQTT协议学习一、MQTT控制报文的结构与CONNECT报文构建 | 码农家园 (codenong.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introduction.html\"\u003e第一章 - MQTT介绍 · MQTT协议中文版 (gitbooks.io)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/weixin_52672120/article/details/112308318\"\u003eMQTT - CONNECT报文_mqtt_connect_Hebo42的博客-CSDN博客\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/cw_huang/article/details/105815349\"\u003eESP8266-12F AT指令连接阿里云_GEEK.攻城狮的博客-CSDN博客\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/huangcw/p/12778758.html\"\u003eESP8266-12F AT指令连接阿里云 - 黄豆爸 - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://baijiahao.baidu.com/s?id=1715575644678049062\u0026amp;wfr=spider\u0026amp;for=pc\"\u003eMQTT协议报文格式解析 (baidu.com)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/47a8/"},{"title":"STM32使用硬件IIC驱动SHT30温湿度传感器","time":"2023-07-13T16:37:34Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"STM32使用硬件IIC驱动SHT30温湿度传感器\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#STM32%E4%BD%BF%E7%94%A8%E7%A1%AC%E4%BB%B6IIC%E9%A9%B1%E5%8A%A8SHT30%E6%B8%A9%E6%B9%BF%E5%BA%A6%E4%BC%A0%E6%84%9F%E5%99%A8\" class=\"headerlink\" title=\"STM32使用硬件IIC驱动SHT30温湿度传感器\"\u003e\u003c/a\u003eSTM32使用硬件IIC驱动SHT30温湿度传感器\u003c/h1\u003e\u003cp\u003e\u003cdel\u003e喜报,终于写完了\u003c/del\u003e\u003c/p\u003e\u003cp\u003e当时网上 xjb乱逛,突然看见有人讨论小米温湿度传感器,我当时也买了个这玩意,于是突然感兴趣查了一下用的传感器——SHT30,协议是IIC。当时想着能不能自己也山寨一个小米温湿度传感器 \u003cdel\u003e,然后下单了SHT30之后就再也没动过\u003c/del\u003e 。这会放假了,想起来这玩意,就整一整吧,顺便再 \u003cstrong\u003e学习一遍IIC协议\u003c/strong\u003e 。图个方便,这次先用硬件IIC。\u003c/p\u003e\u003ch2 id=\"IIC-协议\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#IIC-%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"IIC 协议\"\u003e\u003c/a\u003eIIC 协议\u003c/h2\u003e\u003ch2 id=\"I2C协议介绍\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#I2C%E5%8D%8F%E8%AE%AE%E4%BB%8B%E7%BB%8D\" class=\"headerlink\" title=\"I2C协议介绍\"\u003e\u003c/a\u003eI2C协议介绍\u003c/h2\u003e\u003ch3 id=\"(1)I2C协议简介\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%881%EF%BC%89I2C%E5%8D%8F%E8%AE%AE%E7%AE%80%E4%BB%8B\" class=\"headerlink\" title=\"(1)I2C协议简介\"\u003e\u003c/a\u003e(1)I2C协议简介\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e【省流版】:\u003c/p\u003e\u003cp\u003e串行通信协议的一种,属于串行通信协议中的半双工同步通信。\u003c/p\u003e\u003cp\u003eIIC是一种被定义好的标准,采用二线制,一条数据线,一条时钟线;\u003c/p\u003e\u003cp\u003e数据线传输数据,一位一位传输;时钟线控制传输速率。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003eI2C总线是Philips公司在八十年代初推出的一种\u003cstrong\u003e串行、半双工的总线\u003c/strong\u003e,主要用于近距离、低速的芯片之间的通信。\u003c/p\u003e\u003cp\u003e每个IIC器件有两条线路:\u003c/p\u003e\u003cul\u003e\u003cli\u003eSDA是供主器件和节点发送和接收数据的线路。\u003c/li\u003e\u003cli\u003eSCL是承载时钟信号的线路。SCL总是由I2C主器件生成。规范对时钟信号的低相位和高相位有最短周期要求。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eI2C总线仅使用两条双向线路:每个器件的SDA和SCL用于简单的IC间通信。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/11.webp\" style=\"zoom:80%;\"/\u003e\u003cp\u003e硬件最重要的注意是在SDA和SCL上加入上拉电阻。I2C器件通过开集或开漏引脚连接到总线,将线路拉低。当没有数据传输时,I2C总线处于高电平空闲状态;线路被被动拉高。要传输数据,须切换线路,即先拉低再释放(又变为高电平)。数据位在时钟下降沿传输。\u003c/p\u003e\u003cp\u003e开漏输出需要一个上拉电阻(Rp)才能正确输出高电平。上拉电阻连接在输出引脚和高电平所需的输出电压(VDD)之间。\u003c/p\u003e\u003cp\u003e对于VCC和VDD (5 V)的典型值,4700 Ω是最常用的上拉电阻值。\u003c/p\u003e\u003cp\u003eI2C总线是一种主从结构(Master/Slave)总线, I2C总线上的每一个设备都可以作为主设备或者从设备,但一个总线上一般只有一个主设备,可以带多个从设备。其中主设备用来产生允许传输的时钟信号,并初始化总线的数据传输,所以主设备通常是CPU,而从设备只能被动响应主设备发起的通信请求,所以各种I2C接口芯片将作为从设备使用。\u003c/p\u003e\u003ch4 id=\"(2)I2C从设备地址\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%882%EF%BC%89I2C%E4%BB%8E%E8%AE%BE%E5%A4%87%E5%9C%B0%E5%9D%80\" class=\"headerlink\" title=\"(2)I2C从设备地址\"\u003e\u003c/a\u003e(2)I2C从设备地址\u003c/h4\u003e\u003cp\u003e因为一个I2C总线上可以有多个从设备,这样主设备需要通过地址来确定与哪个器件进行通信。I2C总线上每个从设备都有一个唯一的7bit地址物理识别,这个地址固化在芯片内部,并可以从芯片datasheet上找到。\u003c/p\u003e\u003cp\u003eI2C有16个保留地址。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/12.webp\" style=\"zoom:80%;\"/\u003e\u003cp\u003e其中I2C的从器件地址(本次SHT30只用到了7位的)的组成如下:\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e1byte = 7bit地址 + 1bit读写标志\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e注:1bit读写标志中,0-发送数据(写),1-请求数据(读)\u003c/p\u003e\u003cp\u003e有些时候一个总线上可能需要挂多个同一芯片,这样有些芯片还需要引出一个或几个引脚,由开发板设计电路来决定其具体地址,从而让不同芯片具有不同的7bit物理地址。\u003c/p\u003e\u003ch3 id=\"I2C通信时序\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#I2C%E9%80%9A%E4%BF%A1%E6%97%B6%E5%BA%8F\" class=\"headerlink\" title=\"I2C通信时序\"\u003e\u003c/a\u003eI2C通信时序\u003c/h3\u003e\u003cp\u003e在I2C总线上传送的每一位数据都由一个同步时钟脉冲相对应,即在SCL串行时钟的配合下,数据在SDA上从高位向低位依次串行传送每一位的数据。IIC通信时序图:\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/13.webp\" style=\"zoom:80%;\"/\u003e\u003ch4 id=\"(1)起始位\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%881%EF%BC%89%E8%B5%B7%E5%A7%8B%E4%BD%8D\" class=\"headerlink\" title=\"(1)起始位\"\u003e\u003c/a\u003e(1)起始位\u003c/h4\u003e\u003cp\u003eI2C总线在空闲时SDA和SCL都处于高电平状态(由上拉电阻拉成高电平),当主设备要开始一次I2C通信时就发送一个START(S)信号,这个起始位就可以告诉所有I2C从机, “我”要开始进行I2C通信了;当要结束一次I2C通信时,则发送一个STOP信号结束本次通信。\u003c/p\u003e\u003cp\u003eSTART(S):当SCL保持高电平时候,SDA出现下降沿,产生一个起始位,注意SCL一定要在高电平。\u003cbr/\u003eSTOP( P ):当SCL保持高电平时候,SDA出现上升沿,产生一个停止位,注意SCL一定要在高电平。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/14.webp\" style=\"zoom: 67%;\"/\u003e\u003ch4 id=\"(2)读写地址\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%882%EF%BC%89%E8%AF%BB%E5%86%99%E5%9C%B0%E5%9D%80\" class=\"headerlink\" title=\"(2)读写地址\"\u003e\u003c/a\u003e(2)读写地址\u003c/h4\u003e\u003cp\u003e主机在发送START信号之后,第2个时序应该立刻给出要通信的目标从机物理地址。此外,I2C总线是一种能够实现半双工通信的同步串行通信协议,站在主设备的角度来看应该具有读/写从设备的功能。\u003c/p\u003e\u003cp\u003e这时候I2C的读写地址除了7bit物理地址以外,还有1bit用来标识读/写方向位。这样I2C的从设备读写地址通常是一个字节,其中高7bit是上面描述的物理地址,最低位用来表示读写方向(0为写操作, 1为读操作)\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/15.webp\" style=\"zoom:67%;\"/\u003e\u003ch4 id=\"(3)I2C应答信号\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%883%EF%BC%89I2C%E5%BA%94%E7%AD%94%E4%BF%A1%E5%8F%B7\" class=\"headerlink\" title=\"(3)I2C应答信号\"\u003e\u003c/a\u003e(3)I2C应答信号\u003c/h4\u003e\u003cp\u003e主机往I2C总线上传输器件地址,所有的从机接收到这个地址后与自己的地址相比较若相同则发出一个应答ACK(Acknowledge)信号,主机收到这个应答信号后通讯连接建立成功,若未收到应答信号则表示寻址失败。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/16.webp\" style=\"zoom: 67%;\"/\u003e\u003cp\u003e此外,主/从机在之后的数据通信中,数据接收方(可能是主机也可能是从机)收到传输的一个字节数据后,需要给出响应,此时处在第九个时钟,发送端释放SDA线控制权,将SDA电平拉高,由接收方控制。\u003c/p\u003e\u003cul\u003e\u003cli\u003e若希望继续,则给出“应答(ACK, Acknowledge)”信号,即SDA为低电平\u003c/li\u003e\u003cli\u003e若不希望继续,则给出“非应答(NACK,Not Acknowledge) ”信号,即SDA为高电平\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"(4)数据位发送与接收\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%884%EF%BC%89%E6%95%B0%E6%8D%AE%E4%BD%8D%E5%8F%91%E9%80%81%E4%B8%8E%E6%8E%A5%E6%94%B6\" class=\"headerlink\" title=\"(4)数据位发送与接收\"\u003e\u003c/a\u003e(4)数据位发送与接收\u003c/h4\u003e\u003cp\u003e主机在收到从机的应答信号之后,开始给从机发送数据。SDA数据线上的每个字节必须是8位,每次传输的字节数量没有限制,每个字节发送完成之后,从机必须跟一个应答信号。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/17.webp\" style=\"zoom:67%;\"/\u003e\u003cp\u003eI2C总线通信时数据位传输采用MSB(最高位优先)方式发送,其中高电平表示数据位1,低电平表示数据位0。\u003c/p\u003e\u003cp\u003e当传输的数据位需要改变时(如上一个位发送的是1,下一个位要发送0),必须发生在SCL为低电平期间。另外在传输过程中, SDA上的数据位在SCL高电平期间必须保持稳定不变。\u003c/p\u003e\u003cp\u003e假设SCL在高电平,想一下是不是就会触发起始位或者终止位。想一想起始信号与停止信号是怎么发送的就会明白为什么SCL一定要在高电平才能改变SDA。\u003c/p\u003e\u003ch3 id=\"I2C协议主机收发数据流程\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#I2C%E5%8D%8F%E8%AE%AE%E4%B8%BB%E6%9C%BA%E6%94%B6%E5%8F%91%E6%95%B0%E6%8D%AE%E6%B5%81%E7%A8%8B\" class=\"headerlink\" title=\"I2C协议主机收发数据流程\"\u003e\u003c/a\u003eI2C协议主机收发数据流程\u003c/h3\u003e\u003ch4 id=\"(1)主机发送数据\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%881%EF%BC%89%E4%B8%BB%E6%9C%BA%E5%8F%91%E9%80%81%E6%95%B0%E6%8D%AE\" class=\"headerlink\" title=\"(1)主机发送数据\"\u003e\u003c/a\u003e(1)主机发送数据\u003c/h4\u003e\u003cp\u003e主机在检测到总线为“空闲状态”(即 SDA、SCL 线均为高电平)时,发送一个启动信号“S”,开始一次通信的开始;\u003c/p\u003e\u003cp\u003e主机接着发送一个从设备地址,它由7bit物理地址和1bit读写控制位R/W组成(此时R/W=0);\u003cbr/\u003e相对应的从机收到命令字节后向主机回馈应答信号 ACK(ACK=0);\u003c/p\u003e\u003cp\u003e主机收到从机的应答信号后开始发送第一个字节的数据;\u003c/p\u003e\u003cp\u003e从机收到数据后返回一个应答信号 ACK;\u003c/p\u003e\u003cp\u003e主机收到应答信号后再发送下一个数据字节;\u003c/p\u003e\u003cp\u003e当主机发送最后一个数据字节并收到从机的 ACK 后,通过向从机发送一个停止信号P结束本次通信并释放总线。从机收到P信号后也退出与主机之间的通信。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/18.webp\" style=\"zoom:67%;\"/\u003e\u003cblockquote\u003e\u003cp\u003e\u003ccode\u003e注意\u003c/code\u003e :\u003c/p\u003e\u003cul\u003e\u003cli\u003e主机通过发送地址码与对应的从机建立了通信关系,而挂接在总线上的其它从机虽然同时也收到了地址码,但因为与其自身的地址不相符合,因此提前退出与主机的通信;\u003c/li\u003e\u003cli\u003e主机的一次发送通信,其发送的数据数量不受限制。主机是通过 P 信号通知发送的结束,从机收到 P 信号后退出本次通信;\u003c/li\u003e\u003cli\u003e主机的每一次发送后都是通过从机的 ACK 信号了解从机的接收状况,如果应答错误则重发。\u003c/li\u003e\u003c/ul\u003e\u003c/blockquote\u003e\u003ch4 id=\"(2)主机接收数据\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%882%EF%BC%89%E4%B8%BB%E6%9C%BA%E6%8E%A5%E6%94%B6%E6%95%B0%E6%8D%AE\" class=\"headerlink\" title=\"(2)主机接收数据\"\u003e\u003c/a\u003e(2)主机接收数据\u003c/h4\u003e\u003cul\u003e\u003cli\u003e主机发送起始信号后,接着发送地址字节(其中R/W=1);\u003c/li\u003e\u003cli\u003e对应的从机收到地址字节后,返回一个应答信号并向主机发送数据;\u003c/li\u003e\u003cli\u003e主机收到数据后向从机反馈一个应答信号ACK;\u003c/li\u003e\u003cli\u003e从机收到应答信号后再向主机发送下一个数据;\u003c/li\u003e\u003cli\u003e当主机完成接收数据后,向从机发送一个NAK,从机收到非应答信号后便停止发送;\u003c/li\u003e\u003cli\u003e主机发送非应答信号后,再发送一个停止信号,释放总线结束通信。\u003c/li\u003e\u003c/ul\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/19.webp\" style=\"zoom:67%;\"/\u003e\u003cblockquote\u003e\u003cp\u003e\u003ccode\u003e注意\u003c/code\u003e :\u003c/p\u003e\u003cul\u003e\u003cli\u003e主机所接收数据的数量是由主机自身决定,当发送“非应答信号NAK”时从机便结束传送并释放总线。\u003c/li\u003e\u003cli\u003e非应答信号的两个作用:前一个数据接收成功,停止从机的再次发送。\u003c/li\u003e\u003c/ul\u003e\u003c/blockquote\u003e\u003ch2 id=\"SHT30-温湿度传感器\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#SHT30-%E6%B8%A9%E6%B9%BF%E5%BA%A6%E4%BC%A0%E6%84%9F%E5%99%A8\" class=\"headerlink\" title=\"SHT30 温湿度传感器\"\u003e\u003c/a\u003eSHT30 温湿度传感器\u003c/h2\u003e\u003cp\u003e\u003cdel\u003e)睡醒再写……\u003c/del\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003eSHT3X数据手册下载: \u003ca href=\"https://sensirion.com/media/documents/213E6A3B/63A5A569/Datasheet_SHT3x_DIS.pdf\"\u003e[Datasheet SHT3x-DIS]\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\u003ch3 id=\"SHT30简介\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#SHT30%E7%AE%80%E4%BB%8B\" class=\"headerlink\" title=\"SHT30简介\"\u003e\u003c/a\u003eSHT30简介\u003c/h3\u003e\u003cp\u003eSHT30数字温湿度传感器采用业内知名的瑞士Sensirion公司推出的新一代SHT30温湿度传感器芯片,它能够提供极高的可靠性和出色的长期稳定性,具有功耗低、反应快、抗干扰能力强等优点。IIC通讯,兼容3.3V/5V,可以非常容易的集成到智能楼宇、天气站、仓库存储、养殖、孵化等应用场景中,其中小米的温湿度传感器使用的也是SHT30。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/index.webp\" style=\"zoom: 50%;\"/\u003e\u003cul\u003e\u003cli\u003e高精度,内部自动校准,数字输出\u003c/li\u003e\u003cli\u003e低功耗、响应速度快、抗干扰能力强\u003c/li\u003e\u003cli\u003e兼容3.3V/5V控制器\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"SHT30工作原理\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#SHT30%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86\" class=\"headerlink\" title=\"SHT30工作原理\"\u003e\u003c/a\u003eSHT30工作原理\u003c/h3\u003e\u003cp\u003eSHT30 芯片有八个引脚,利用I2C进行数据传输,具有两个可选地址,宽电源电压从2.4V到5.5V。下面是引脚说明:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e管脚\u003c/th\u003e\u003cth\u003e名称\u003c/th\u003e\u003cth\u003e备注\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e1\u003c/td\u003e\u003ctd\u003eSDA\u003c/td\u003e\u003ctd\u003eI2C数据引脚,输入/输出\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e2\u003c/td\u003e\u003ctd\u003eADDR\u003c/td\u003e\u003ctd\u003e地址引脚,输入\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e3\u003c/td\u003e\u003ctd\u003eALENT\u003c/td\u003e\u003ctd\u003e报警引脚,输出;\u003cstrong\u003e不使用时悬空\u003c/strong\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e4\u003c/td\u003e\u003ctd\u003eSCL\u003c/td\u003e\u003ctd\u003eI2C时钟引脚,输入/输出\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e5\u003c/td\u003e\u003ctd\u003eVDD\u003c/td\u003e\u003ctd\u003e电源引脚,输入\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e6\u003c/td\u003e\u003ctd\u003enRESET\u003c/td\u003e\u003ctd\u003e复位引脚,输入\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e7\u003c/td\u003e\u003ctd\u003eR\u003c/td\u003e\u003ctd\u003e无用引脚,接地\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e8\u003c/td\u003e\u003ctd\u003eVSS\u003c/td\u003e\u003ctd\u003e接地引脚\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch4 id=\"SHT30地址选择\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#SHT30%E5%9C%B0%E5%9D%80%E9%80%89%E6%8B%A9\" class=\"headerlink\" title=\"SHT30地址选择\"\u003e\u003c/a\u003eSHT30地址选择\u003c/h4\u003e\u003cp\u003eSHT3x有两个地址,可以将\u003ccode\u003eADDR\u003c/code\u003e接到不同电平进行切换:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003eSHT3x-DIS\u003c/th\u003e\u003cth\u003eI2C地址\u003c/th\u003e\u003cth\u003e条件\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003eI2C地址A\u003c/td\u003e\u003ctd\u003e0x44(默认)\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eADDR\u003c/code\u003e引脚接\u003cstrong\u003e低\u003c/strong\u003e电平\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eI2C地址B\u003c/td\u003e\u003ctd\u003e0x45\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eADDR\u003c/code\u003e引脚接\u003cstrong\u003e高\u003c/strong\u003e电平\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch4 id=\"SHT3x电路图\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#SHT3x%E7%94%B5%E8%B7%AF%E5%9B%BE\" class=\"headerlink\" title=\"SHT3x电路图\"\u003e\u003c/a\u003eSHT3x电路图\u003c/h4\u003e\u003cp\u003e因为是开漏,所以记得将\u003ccode\u003eSDA\u003c/code\u003e,\u003ccode\u003eSCL\u003c/code\u003e两个引脚拉高。(因为直接买的模块,所以就不用操心了。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/20.webp\" alt=\"电路图\" style=\"zoom:67%;\"/\u003e\u003ch3 id=\"SHT30数据采集\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#SHT30%E6%95%B0%E6%8D%AE%E9%87%87%E9%9B%86\" class=\"headerlink\" title=\"SHT30数据采集\"\u003e\u003c/a\u003eSHT30数据采集\u003c/h3\u003e\u003cp\u003eSHT3x有单次测量命令数据采集模式和周期性测量命令数据采集模式,这里选择\u003cstrong\u003e周期性测量命令数据采集模式\u003c/strong\u003e。\u003c/p\u003e\u003ch4 id=\"定期数据采集模式的测量命令\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%AE%9A%E6%9C%9F%E6%95%B0%E6%8D%AE%E9%87%87%E9%9B%86%E6%A8%A1%E5%BC%8F%E7%9A%84%E6%B5%8B%E9%87%8F%E5%91%BD%E4%BB%A4\" class=\"headerlink\" title=\"定期数据采集模式的测量命令\"\u003e\u003c/a\u003e定期数据采集模式的测量命令\u003c/h4\u003e\u003cp\u003e在这种模式下,一个发出的测量命令会产生一个数据对流。每个数据对由一个16位温度值和一个16位湿度值(按此顺序)组成。在周期模式下,可以选择不同的测量命令。对应的16位命令如表9所示。它们在可重复性(低、中、高)和数据采集频率(每秒0.5、1、2、4和10次测量值,mps)方面存在差异。在此模式下不能选择时钟拉伸。数据采集频率和可重复性设置会影响传感器的测量持续时间和电流消耗。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/21.webp\" style=\"zoom:80%;\"/\u003e\u003cp\u003e根据表格的通信时序,主机发送起始信号,然后发送从机地址加写指令命令,等待从机应答,再发送命令的高位(MSB),等待从机应答,再发送命令的低位(LSB)。\u003c/p\u003e\u003ch4 id=\"周期模式下测量结果的读数\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%91%A8%E6%9C%9F%E6%A8%A1%E5%BC%8F%E4%B8%8B%E6%B5%8B%E9%87%8F%E7%BB%93%E6%9E%9C%E7%9A%84%E8%AF%BB%E6%95%B0\" class=\"headerlink\" title=\"周期模式下测量结果的读数\"\u003e\u003c/a\u003e周期模式下测量结果的读数\u003c/h4\u003e\u003cp\u003e\u003cstrong\u003e读数据的命令是: \u003ccode\u003e0xE000\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/22.webp\" style=\"zoom:67%;\"/\u003e\u003cp\u003e读数可以通过上表所示的命令启动。如果没有测量数据,I2C读取头用NACK而不是ACK(表中的位9)响应,通信停止。\u003c/p\u003e\u003cp\u003e空白的数据块是由32发送,黑色的数据块是由SHT30发送。\u003c/p\u003e\u003cp\u003e根据表中的通信时序,获取SHT30的温湿度数据,获取到的是16位的温度值和16位的湿度值,温度和湿度后都有CRC-8校验。\u003c/p\u003e\u003ch4 id=\"SHT30复位\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#SHT30%E5%A4%8D%E4%BD%8D\" class=\"headerlink\" title=\"SHT30复位\"\u003e\u003c/a\u003eSHT30复位\u003c/h4\u003e\u003cp\u003eSHT30的系统复位有两种方式,一种是发出命令(软重置),一种是通过外部向专用复位引脚(\u003ccode\u003enRESET\u003c/code\u003e)发送脉冲。我们选择\u003cstrong\u003e软重置\u003c/strong\u003e。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e软重置的命令是: \u003ccode\u003e0x30A2\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/23.webp\" style=\"zoom:67%;\"/\u003e\u003ch4 id=\"差错校验\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%B7%AE%E9%94%99%E6%A0%A1%E9%AA%8C\" class=\"headerlink\" title=\"差错校验\"\u003e\u003c/a\u003e差错校验\u003c/h4\u003e\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/f0c68eebb8a1\"\u003eCRC8校验 - 简书 (jianshu.com)\u003c/a\u003e \u003cdel\u003e(原理进行一个参考链接的抄)\u003c/del\u003e\u003c/p\u003e\u003cp\u003eCRC覆盖了先前传输的两个数据字节的内容。 为了计算校验和,仅使用这两个先前发送的数据字节。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/24.webp\" style=\"zoom:67%;\"/\u003e\u003ch4 id=\"温湿度转换\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E6%B8%A9%E6%B9%BF%E5%BA%A6%E8%BD%AC%E6%8D%A2\" class=\"headerlink\" title=\"温湿度转换\"\u003e\u003c/a\u003e温湿度转换\u003c/h4\u003e\u003cp\u003e测量数据始终以 16 位值(无符号整数)形式传输。 这些值已经线性化并补偿了温度和电源电压的影响。 可以使用以下公式将这些原始值转换为物理标度。\u003c/p\u003e\u003cp\u003e相对湿度换算公式(结果以%RH为单位):\u003c/p\u003e\u003cp\u003e$$RH=100\\times \\frac{S_{RH}}{2^{16}-1}$$\u003c/p\u003e\u003cp\u003e温度换算公式(结果以 °C 和 °F 为单位):\u003c/p\u003e\u003cp\u003e$$T[°C]=-45+175\\times\\frac{S_T}{2^{16}-1}$$\u003c/p\u003e\u003cp\u003e$$T[°F]=-49+315\\times\\frac{S_T}{2^{16}-1}$$\u003c/p\u003e\u003cp\u003e$S_{RH}$ 和 $S_{T}$ 分别表示湿度和温度的原始传感器输出。 仅当$S_{RH}$ 和 $S_{T}$ 以十进制表示形式使用时,这些公式才能正确工作。\u003c/p\u003e\u003ch2 id=\"代码驱动SHT30\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E4%BB%A3%E7%A0%81%E9%A9%B1%E5%8A%A8SHT30\" class=\"headerlink\" title=\"代码驱动SHT30\"\u003e\u003c/a\u003e代码驱动SHT30\u003c/h2\u003e\u003cp\u003e首先使用 STM32CubeMX进行一些常规配置,时钟,调试选项……\u003c/p\u003e\u003cp\u003e然后配置串口: \u003ca href=\"https://blog.ksfu.top/posts/b619/\"\u003eSTM32\u0026amp;UART串口通信(使用CubeMX)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e在I2C2中选择I2C,打开硬件I2C。\u003c/p\u003e\u003ch3 id=\"HAL库中I2C发送接收数据函数\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#HAL%E5%BA%93%E4%B8%ADI2C%E5%8F%91%E9%80%81%E6%8E%A5%E6%94%B6%E6%95%B0%E6%8D%AE%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"HAL库中I2C发送接收数据函数\"\u003e\u003c/a\u003eHAL库中I2C发送接收数据函数\u003c/h3\u003e\u003ch4 id=\"(1)HAL-I2C-Master-Transmit\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%EF%BC%881%EF%BC%89HAL-I2C-Master-Transmit\" class=\"headerlink\" title=\"(1)HAL_I2C_Master_Transmit()\"\u003e\u003c/a\u003e(1)HAL_I2C_Master_Transmit()\u003c/h4\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e函数原型\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token function\"\u003eHAL_I2C_Master_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eI2C_HandleTypeDef \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehi2c\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e DevAddress\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003epData\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e Size\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e Timeout\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e函数功能:IIC发送数据,主机需要将数据通过IIC发送过去\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e参数介绍:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e*hi2c\u003c/code\u003e 设置使用的是那个IIC\u003c/li\u003e\u003cli\u003e\u003ccode\u003eDevAddress\u003c/code\u003e 写入的地址,设置写入数据的地址\u003c/li\u003e\u003cli\u003e\u003ccode\u003e*pData\u003c/code\u003e 需要写入的数据\u003c/li\u003e\u003cli\u003e\u003ccode\u003eSize\u003c/code\u003e 要发送的字节数\u003c/li\u003e\u003cli\u003e\u003ccode\u003eTimeout\u003c/code\u003e 最大传输时间,超过传输时间将自动退出传输函数\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e使用到的函数参数讲解():\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token function\"\u003eHAL_I2C_Master_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehi2c2\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e SHT30_ADDR_WR\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e\u0026amp;hi2c2\u003c/code\u003e:我们使用的是:\u003ccode\u003ehi2c2\u003c/code\u003e,传地址\u003ccode\u003e\u0026amp;hi2c2\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003eSHT30_ADDR_WR\u003c/code\u003e:我们宏定义了写的地址,传写的地址\u003ccode\u003e#define SHT30_ADDR_WR (SHT30_ADDR\u0026lt;\u0026lt;1)\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003e(uint8_t*)buf\u003c/code\u003e:我们将需要传的数据保存在\u003ccode\u003ebuf\u003c/code\u003e中\u003c/li\u003e\u003cli\u003e\u003ccode\u003e2\u003c/code\u003e:传\u003ccode\u003e2\u003c/code\u003e个字节,\u003ccode\u003e16\u003c/code\u003e个位\u003c/li\u003e\u003cli\u003e\u003ccode\u003e0xFFFF\u003c/code\u003e超时:\u003ccode\u003e0xFFFF\u003c/code\u003e(4 294 967 295也就是无符号整型所能表示的最大值)\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"HAL-I2C-Master-Receive\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#HAL-I2C-Master-Receive\" class=\"headerlink\" title=\"HAL_I2C_Master_Receive()\"\u003e\u003c/a\u003eHAL_I2C_Master_Receive()\u003c/h4\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e函数原型\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token function\"\u003eHAL_I2C_Master_Receive\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eI2C_HandleTypeDef \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehi2c\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e DevAddress\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003epData\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e Size\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e Timeout\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e函数功能:IIC接收数据,从机发送给主机,主机需要将数据通过IIC接收\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e函数参数和HAL_I2C_Master_Transmit()大概是一样的,只是取到的数据保存在pData中。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e使用到的函数参数讲解():\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token function\"\u003eHAL_I2C_Master_Receive\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehi2c2\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e SHT30_ADDR_RD\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e buf\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e SHT30_DATA_SIZE\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e\u0026amp;hi2c2\u003c/code\u003e:我们使用的是:\u003ccode\u003ehi2c2\u003c/code\u003e,传地址\u003ccode\u003e\u0026amp;hi2c2\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003eSHT30_ADDR_RD\u003c/code\u003e:我们宏定义了读的地址,传读的地址\u003ccode\u003e#define SHT30_ADDR_RD ((SHT30_ADDR\u0026lt;\u0026lt;1) | 0x01)\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003ebuf\u003c/code\u003e:我们将获取到的数据保存在\u003ccode\u003ebuf\u003c/code\u003e中\u003c/li\u003e\u003cli\u003e\u003ccode\u003eSHT30_DATA_SIZE\u003c/code\u003e:宏定义,6个字节\u003ccode\u003e#define SHT30_DATA_SIZE 6\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003e0xFFFF\u003c/code\u003e超时:\u003ccode\u003e0xFFFF\u003c/code\u003e(4 294 967 295也就是无符号整型所能表示的最大值)\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"头文件-sht30-h\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%A4%B4%E6%96%87%E4%BB%B6-sht30-h\" class=\"headerlink\" title=\"头文件 sht30.h\"\u003e\u003c/a\u003e头文件 \u003ccode\u003esht30.h\u003c/code\u003e\u003c/h3\u003e\u003cp\u003e在头文件中我们提前定义好相关命令与函数原型。\u003c/p\u003e\u003cp\u003e\u003ccode\u003eenum\u003c/code\u003e用于定义枚举类型,它本质上是一种整数类型。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003eifndef\u003c/span\u003e \u003cspan class=\"token expression\"\u003eINC_SHT30_H_\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003eINC_SHT30_H_\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;stm32f4xx_hal.h\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003eSHT30_ADDR\u003c/span\u003e \u003cspan class=\"token expression\"\u003e\u003cspan class=\"token number\"\u003e0x44\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003eSHT30_ADDR_WR\u003c/span\u003e \u003cspan class=\"token expression\"\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eSHT30_ADDR\u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003eSHT30_ADDR_RD\u003c/span\u003e \u003cspan class=\"token expression\"\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eSHT30_ADDR\u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e|\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003eSHT30_DATA_SIZE\u003c/span\u003e \u003cspan class=\"token expression\"\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token keyword\"\u003etypedef\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eenum\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 软件复位命令 */\u003c/span\u003e SOFT_RESET_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x30A2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 单次测量模式 命名格式:Repeatability_CS_CMD CS: Clock stretching */\u003c/span\u003e HIGH_ENABLED_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2C06\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e MEDIUM_ENABLED_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2C0D\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e LOW_ENABLED_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2C10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e HIGH_DISABLED_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2400\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e MEDIUM_DISABLED_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x240B\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e LOW_DISABLED_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2416\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 周期测量模式 命名格式:Repeatability_MPS_CMD MPS:measurement per second */\u003c/span\u003e HIGH_0_5_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2032\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e MEDIUM_0_5_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2024\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e LOW_0_5_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x202F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e HIGH_1_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2130\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e MEDIUM_1_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2126\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e LOW_1_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x212D\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e HIGH_2_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2236\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e MEDIUM_2_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2220\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e LOW_2_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x222B\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e HIGH_4_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2334\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e MEDIUM_4_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2322\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e LOW_4_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2329\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e HIGH_10_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2737\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e MEDIUM_10_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2721\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e LOW_10_CMD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x272A\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 周期测量模式读取数据命令 */\u003c/span\u003e READOUT_FOR_PERIODIC_MODE \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xE000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e SHT30_CMD\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eextern\u003c/span\u003e \u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003esht30_soft_reset\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eextern\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eSHT30_Init\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eextern\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eSHT30_Read_Dat\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eextern\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eCheckCrc8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e \u003cspan class=\"token keyword\"\u003econst\u003c/span\u003e message\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e initial_value\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eextern\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eSHT30_Dat_To_Float\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e \u003cspan class=\"token keyword\"\u003econst\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e temperature\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e humidity\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003eendif\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* INC_SHT30_H_ */\u003c/span\u003e\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"主要文件-sht30-c\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E4%B8%BB%E8%A6%81%E6%96%87%E4%BB%B6-sht30-c\" class=\"headerlink\" title=\"主要文件 sht30.c\"\u003e\u003c/a\u003e主要文件 \u003ccode\u003esht30.c\u003c/code\u003e\u003c/h3\u003e\u003cp\u003e先包含主要的一些头文件\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;stdio.h\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;i2c.h\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;sht30.h\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"发送指令\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%8F%91%E9%80%81%E6%8C%87%E4%BB%A4\" class=\"headerlink\" title=\"发送指令\"\u003e\u003c/a\u003e发送指令\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e/** * @brief 向SHT30发送一条指令(16bit) * @param cmd —— SHT30指令(在SHT30_MODE中枚举定义) * @retval 成功返回HAL_OK*/\u003c/span\u003e\u003cspan class=\"token keyword\"\u003estatic\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e \u003cspan class=\"token function\"\u003esht30_send_cmd\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eSHT30_CMD cmd\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e buf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e cmd \u003cspan class=\"token operator\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e cmd\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_I2C_Master_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehi2c2\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e SHT30_ADDR_WR\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"复位SHT30\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%A4%8D%E4%BD%8DSHT30\" class=\"headerlink\" title=\"复位SHT30\"\u003e\u003c/a\u003e复位SHT30\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e/** * @brief 复位SHT30 * @param none * @retval none*/\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003esht30_soft_reset\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token function\"\u003esht30_send_cmd\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eSOFT_RESET_CMD\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_Delay\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"初始化SHT30\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%88%9D%E5%A7%8B%E5%8C%96SHT30\" class=\"headerlink\" title=\"初始化SHT30\"\u003e\u003c/a\u003e初始化SHT30\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-C\" data-language=\"C\"\u003e\u003ccode class=\"language-C\"\u003e/** * @brief 初始化SHT30 * @param none * @retval 成功返回HAL_OK * @note 周期测量模式*/uint8_t SHT30_Init(void) {return sht30_send_cmd(MEDIUM_2_CMD);}\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"读取数据\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E8%AF%BB%E5%8F%96%E6%95%B0%E6%8D%AE\" class=\"headerlink\" title=\"读取数据\"\u003e\u003c/a\u003e读取数据\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e/** * @brief 从SHT30读取一次数据 * @param dat —— 存储读取数据的地址(6个字节数组) * @retval 成功 —— 返回HAL_OK*/\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eSHT30_Read_Dat\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token function\"\u003esht30_send_cmd\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eREADOUT_FOR_PERIODIC_MODE\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_I2C_Master_Receive\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehi2c2\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e SHT30_ADDR_RD\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"CRC-8校验\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#CRC-8%E6%A0%A1%E9%AA%8C\" class=\"headerlink\" title=\"CRC-8校验\"\u003e\u003c/a\u003eCRC-8校验\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003eCRC8_POLYNOMIAL\u003c/span\u003e \u003cspan class=\"token expression\"\u003e\u003cspan class=\"token number\"\u003e0x31\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eCheckCrc8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e \u003cspan class=\"token keyword\"\u003econst\u003c/span\u003e message\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e initial_value\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e remainder\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//余数\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e i \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e j \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//循环变量\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 初始化 */\u003c/span\u003e remainder \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e initial_value\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ej \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e j \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ej\u003cspan class=\"token operator\"\u003e++\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e remainder \u003cspan class=\"token operator\"\u003e^=\u003c/span\u003e message\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ej\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 从最高位开始依次计算 */\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ei \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e i \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e i\u003cspan class=\"token operator\"\u003e++\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eremainder \u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x80\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e remainder \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eremainder \u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eCRC8_POLYNOMIAL\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e remainder \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eremainder \u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 返回计算的CRC码 */\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e remainder\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"温湿度转换-1\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E6%B8%A9%E6%B9%BF%E5%BA%A6%E8%BD%AC%E6%8D%A2-1\" class=\"headerlink\" title=\"温湿度转换\"\u003e\u003c/a\u003e温湿度转换\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e/** * @brief 将SHT30接收的6个字节数据进行CRC校验,并转换为温度值和湿度值 * @param dat —— 存储接收数据的地址(6个字节数组) * @retval 校验成功 —— 返回0 * 校验失败 —— 返回1,并设置温度值和湿度值为0*/\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eSHT30_Dat_To_Float\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e \u003cspan class=\"token keyword\"\u003econst\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e temperature\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e humidity\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e recv_temperature \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e recv_humidity \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 校验温度数据和湿度数据是否接收正确 */\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eCheckCrc8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e!=\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e||\u003c/span\u003e \u003cspan class=\"token function\"\u003eCheckCrc8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e!=\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 转换温度数据 */\u003c/span\u003e recv_temperature \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e|\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003etemperature \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e45\u003c/span\u003e \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e \u003cspan class=\"token number\"\u003e175\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003erecv_temperature\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e65535\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* 转换湿度数据 */\u003c/span\u003e recv_humidity \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e|\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehumidity \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e100\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003erecv_humidity \u003cspan class=\"token operator\"\u003e/\u003c/span\u003e \u003cspan class=\"token number\"\u003e65535\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"在main-c中使用SHT30\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%9C%A8main-c%E4%B8%AD%E4%BD%BF%E7%94%A8SHT30\" class=\"headerlink\" title=\"在main.c中使用SHT30\"\u003e\u003c/a\u003e在\u003ccode\u003emain.c\u003c/code\u003e中使用SHT30\u003c/h3\u003e\u003cp\u003e在\u003ccode\u003eint main()\u003c/code\u003e外定义格式化函数:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003ereport_tempRH_json\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003etemperature\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehumidity\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e在\u003ccode\u003eint main()\u003c/code\u003e的\u003ccode\u003ewhile (1)\u003c/code\u003e前定义相关变量与SHT30初始化:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e temperature \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0.0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e humidity \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0.0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003esht30_soft_reset\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eSHT30_Init\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e HAL_OK\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eprintf\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;sht30 init is ok!\\r\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eprintf\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;sht30 init is not ok!\\r\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e在\u003ccode\u003ewhile(1)\u003c/code\u003e内调用格式化函数,每次调用后进行适当延时。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token function\"\u003ereport_tempRH_json\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003etemperature\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehumidity\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_Delay\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"格式化函数\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E6%A0%BC%E5%BC%8F%E5%8C%96%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"格式化函数\"\u003e\u003c/a\u003e格式化函数\u003c/h4\u003e\u003cp\u003e将格式化函数写在 \u003ccode\u003e/* USER CODE BEGIN 4 */\u003c/code\u003e 与 \u003ccode\u003e/* USER CODE END 4 */\u003c/code\u003e 之中。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e字符串格式化输出 \u003ccode\u003esprintf()\u003c/code\u003e:\u003c/p\u003e\u003cp\u003e\u003ccode\u003eint sprintf(char * s, const char * format, ...);\u003c/code\u003e定义在\u003ccode\u003estdio.h\u003c/code\u003e中,适用于 \u003ccode\u003e string\u003c/code\u003e 版本的格式化输出,其目标不是控制台,而是一个字符串。\u003c/p\u003e\u003cp\u003e用\u003ccode\u003esprintf()\u003c/code\u003e 格式化一个字符串,例如:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e buf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e256\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003esprintf\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;Name:%s,Age:%d,Weight:%.2f\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;LiMing\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e30\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e1.68\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e运行后目标\u003ccode\u003ebuf\u003c/code\u003e格式化为:\u003ccode\u003eName:LiMing,Age:30,Weight:1.68\u003c/code\u003e\u003c/p\u003e\u003cp\u003e\u003ccode\u003esprintf()\u003c/code\u003e对于字符串的处理非常有用。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e将SHT30温湿度数据格式化并通过串口输出:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003ereport_tempRH_json\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003etemperature\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efloat\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehumidity\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eSHT30_Read_Dat\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e HAL_OK\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eSHT30_Dat_To_Float\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003edat\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003etemperature\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003ehumidity\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e HAL_OK\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e buf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e128\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003ememset\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003esizeof\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003esnprintf\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003esizeof\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;{\\\u0026#34;Temperature\\\u0026#34;:\\\u0026#34;%.2f\\\u0026#34;, \\\u0026#34;Humidity\\\u0026#34;:\\\u0026#34;%.2f\\\u0026#34;}\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003etemperature\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehumidity\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token function\"\u003estrlen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eprintf\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;sht30 check failed!\\r\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eprintf\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;sht30 read date failed!\\r\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch2 id=\"结果对比\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E7%BB%93%E6%9E%9C%E5%AF%B9%E6%AF%94\" class=\"headerlink\" title=\"结果对比\"\u003e\u003c/a\u003e结果对比\u003c/h2\u003e\u003cp\u003e随便复制几段单片机串口发过来的:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-json\" data-language=\"json\"\u003e\u003ccode class=\"language-json\"\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e24\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e53.824\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.36\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.92\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e24\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e55.818\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.34\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.85\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e24\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e57.818\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.41\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.88\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e24\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e59.815\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.33\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.98\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e01.809\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.40\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.89\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e03.808\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.38\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.96\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e05.804\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.38\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.94\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e07.799\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.38\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;54.02\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e09.796\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.36\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.84\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e11.807\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.37\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.82\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e00\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e13.788\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token property\"\u003e\u0026#34;Temperature\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;21.36\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token property\"\u003e\u0026#34;Humidity\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;53.71\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e手机上看一眼小米温湿度传感器的:\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/SHT30H/res.webp\" style=\"zoom:67%;\"/\u003e\u003cp\u003e还行。\u003c/p\u003e\u003ch2 id=\"参考链接\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/6c49/#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\" class=\"headerlink\" title=\"参考链接\"\u003e\u003c/a\u003e参考链接\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://www.analog.com/cn/analog-dialogue/articles/i2c-communication-protocol-understanding-i2c-primer-pmbus-and-smbus.html\"\u003eI2C通信协议:了解I2C Primer、 PMBus和SMBus | 亚德诺半导体 (analog.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/m0_51429770/article/details/127661382?spm=1001.2014.3001.5506\"\u003eI2C协议介绍以及HAL库实现I2C对SHT30温湿度采样_hal i2c_HaiQinyanAN的博客-CSDN博客\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/Yangtzey/article/details/129660763?spm=1001.2014.3001.5506\"\u003eIIC及配置应用(SHT30读取温湿度)_嵌不入的博客-CSDN博客\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/weixin_46251230/article/details/126722112?spm=1001.2014.3001.5506\"\u003eSTM32物联网项目-SHT30温湿度采集(IIC通信)_ONE_Day|的博客-CSDN博客\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://sensirion.com/media/documents/213E6A3B/63A5A569/Datasheet_SHT3x_DIS.pdf\"\u003e[Datasheet SHT3x-DIS]\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/f0c68eebb8a1\"\u003eCRC8校验 - 简书 (jianshu.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/\"\u003eSTM32\u0026amp;UART串口通信(使用CubeMX)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/6c49/"},{"title":"STM32温湿度测量与显示-单总线协议学习","time":"2023-05-18T15:55:06Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"STM32温湿度测量与显示-单总线协议学习\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#STM32%E6%B8%A9%E6%B9%BF%E5%BA%A6%E6%B5%8B%E9%87%8F%E4%B8%8E%E6%98%BE%E7%A4%BA-%E5%8D%95%E6%80%BB%E7%BA%BF%E5%8D%8F%E8%AE%AE%E5%AD%A6%E4%B9%A0\" class=\"headerlink\" title=\"STM32温湿度测量与显示-单总线协议学习\"\u003e\u003c/a\u003eSTM32温湿度测量与显示-单总线协议学习\u003c/h1\u003e\u003cp\u003e为了验收个小玩意用一晚上搓了一个,比较氵。 \u003cdel\u003e那就氵篇博客算了。\u003c/del\u003e \u003c/p\u003e\u003cp\u003e手头正好有个ST的板子,型号是STM32G431KBT6,主频170M。刚好拿过来用了。(真好用啊,就是做这个有点浪费。\u003c/p\u003e\u003cp\u003e温湿度传感器使用 \u003cstrong\u003eDHT11\u003c/strong\u003e (单总线协议),屏幕是个IIC的小OLED,还用到了串口来看数据是否正确。(没了,确实氵。\u003c/p\u003e\u003cp\u003e效果图:\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/DHT11/index.webp\" alt=\"效果图\" style=\"zoom: 33%;\"/\u003e\u003ch2 id=\"准备\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E5%87%86%E5%A4%87\" class=\"headerlink\" title=\"准备\"\u003e\u003c/a\u003e准备\u003c/h2\u003e\u003cp\u003e首先去官网下载 \u003cstrong\u003eSTM32G4xx\u003c/strong\u003e 的包。(\u003ca href=\"https://keilpack.azureedge.net/pack/Keil.STM32G4xx_DFP.1.5.0.pack\"\u003eKeil.STM32G4xx_DFP.1.5.0.pack\u003c/a\u003e)。官网直连下载很慢,很慢……\u003c/p\u003e\u003cp\u003e然后去CubeMX里面新建工程,因为是官方的板子,所以可以直接选择这块板子的模板创建。时钟设置170M(默认的)。选择一个没有中文的路径生成工程。\u003c/p\u003e\u003cp\u003e接下来的流程是:\u003c/p\u003e\u003cul\u003e\u003cli\u003e设置串口\u003c/li\u003e\u003cli\u003e驱动OLED屏幕\u003cul\u003e\u003cli\u003e重新配置延时函数\u003c/li\u003e\u003cli\u003e添加软件IIC\u003c/li\u003e\u003cli\u003e添加OLED驱动\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e驱动DHT11温湿度传感器(\u003cstrong\u003e单总线协议的学习\u003c/strong\u003e)\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e因为使用的OLED驱动比较特殊,添加之后无法使用原来的 \u003ccode\u003eHAL_Dealy()\u003c/code\u003e 函数,需要按照该驱动的要求重新配置延时函数,之后使用其提供的 \u003ccode\u003edelay_ms()\u003c/code\u003e 和 \u003ccode\u003edelay_us()\u003c/code\u003e 两个函数代替 \u003ccode\u003eHAL_Dealy()\u003c/code\u003e 函数,当然实际上是方便不少的,因为 \u003ccode\u003eHAL_Dealy()\u003c/code\u003e 是毫秒级延时,所以直接使用上面两个函数可以让自己少写一个微秒的延时函数,具体原理可以参考\u003ca href=\"https://blog.ksfu.top/posts/463a/\"\u003e之前的一篇博客\u003c/a\u003e。\u003c/p\u003e\u003ch2 id=\"具体实现\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E5%85%B7%E4%BD%93%E5%AE%9E%E7%8E%B0\" class=\"headerlink\" title=\"具体实现\"\u003e\u003c/a\u003e具体实现\u003c/h2\u003e\u003ch3 id=\"串口设置\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E4%B8%B2%E5%8F%A3%E8%AE%BE%E7%BD%AE\" class=\"headerlink\" title=\"串口设置\"\u003e\u003c/a\u003e串口设置\u003c/h3\u003e\u003cp\u003e串口的具体实现参考我之前的博客步骤:\u003ca href=\"https://blog.ksfu.top/posts/b619/\"\u003eSTM32\u0026amp;UART串口通信(使用CubeMX)\u003c/a\u003e 。因为这次没有用到收的功能,所以只需要设置好发送功能即可。\u003c/p\u003e\u003cp\u003e本次使用USART1。其实 \u003cstrong\u003e更推荐\u003c/strong\u003e 使用USART2的,因为官方的板子上本身就有串口芯片,使用的USART2,这样用一根USB线连电脑上就可以同时供电,下载和查看串口数据了,不用自己再连一个USB转串口的模块了,还能腾出来两个引脚,这STM32G431KBT6的引脚是真的少。 \u003cdel\u003e(还是官方板子好用,就是贵\u003c/del\u003e\u003c/p\u003e\u003chr/\u003e\u003cblockquote\u003e\u003cp\u003e\u003cdel\u003e)晚上要去重庆,剩下的具体流程就等下周回来再写了。\u003c/del\u003e\u003c/p\u003e\u003cp\u003e\u003cdel\u003e回来了,发现实习二面寄了,悲)\u003c/del\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003chr/\u003e\u003ch3 id=\"驱动OLED屏幕\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E9%A9%B1%E5%8A%A8OLED%E5%B1%8F%E5%B9%95\" class=\"headerlink\" title=\"驱动OLED屏幕\"\u003e\u003c/a\u003e驱动OLED屏幕\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003e这一节可以略过。\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e本次的驱动选自 \u003ca href=\"http://www.lcdwiki.com/zh/Main_Page\"\u003eLCD wiki\u003c/a\u003e 。\u003c/p\u003e\u003cp\u003e因为 LCD wiki 的驱动为gb2312编码,为了以后写的舒服,我先转换为了utf-8,具体可以参考:\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.ksfu.top/posts/2d8a/\"\u003e批量转换文件编码gb2312转utf-8\u003c/a\u003e 。但是注意,代码里有中文的地方,比如 \u003ccode\u003etest.c\u003c/code\u003e,\u003ccode\u003eoledfont.h\u003c/code\u003e等文件需要保持原来的gb2312。\u003cdel\u003e(看见编译时候的编码报错真是心累呐\u003c/del\u003e\u003c/p\u003e\u003cp\u003eLCD wiki 的驱动使用标准库编写,放入HAL库的项目中会狠狠报错,所以要进行修改)我自己修改了一下,以后写一下修改过程emmm(咕咕\u003c/p\u003e\u003ch4 id=\"重新配置延时函数\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E9%87%8D%E6%96%B0%E9%85%8D%E7%BD%AE%E5%BB%B6%E6%97%B6%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"重新配置延时函数\"\u003e\u003c/a\u003e重新配置延时函数\u003c/h4\u003e\u003cp\u003e添加 \u003ccode\u003esys.h\u003c/code\u003e , \u003ccode\u003esys.c\u003c/code\u003e , \u003ccode\u003edelay.h\u003c/code\u003e , \u003ccode\u003edelay.c\u003c/code\u003e ,注意修改里面包含的头文件为对应的 \u003ccode\u003e#include \u0026#34;stm32g4xx.h\u0026#34;\u003c/code\u003e\u003c/p\u003e\u003cp\u003e之后在 \u003ccode\u003emain.c\u003c/code\u003e 里面进行初始化: \u003ccode\u003edelay_init();\u003c/code\u003e 初始化完成后以后的延时就用 \u003ccode\u003edelay_ms()\u003c/code\u003e 和 \u003ccode\u003edelay_us()\u003c/code\u003e 。\u003c/p\u003e\u003ch4 id=\"添加软件IIC\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E6%B7%BB%E5%8A%A0%E8%BD%AF%E4%BB%B6IIC\" class=\"headerlink\" title=\"添加软件IIC\"\u003e\u003c/a\u003e添加软件IIC\u003c/h4\u003e\u003cp\u003e添加 \u003ccode\u003eiic.c\u003c/code\u003e , \u003ccode\u003eiic.h\u003c/code\u003e ,注意修改里面 \u003ccode\u003eSCL\u003c/code\u003e 与 \u003ccode\u003eSDA\u003c/code\u003e 的引脚。本次分别使用 \u003ccode\u003ePA1\u003c/code\u003e , \u003ccode\u003ePA0\u003c/code\u003e 。\u003c/p\u003e\u003ch4 id=\"添加OLED驱动\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E6%B7%BB%E5%8A%A0OLED%E9%A9%B1%E5%8A%A8\" class=\"headerlink\" title=\"添加OLED驱动\"\u003e\u003c/a\u003e添加OLED驱动\u003c/h4\u003e\u003cp\u003e添加 \u003ccode\u003ebmp.h\u003c/code\u003e , \u003ccode\u003egui.h\u003c/code\u003e , \u003ccode\u003egui.c\u003c/code\u003e , \u003ccode\u003eoled.c\u003c/code\u003e , \u003ccode\u003eoled.h\u003c/code\u003e , \u003ccode\u003eoledfont.h\u003c/code\u003e , \u003ccode\u003etest.c\u003c/code\u003e , \u003ccode\u003etest.h\u003c/code\u003e 。\u003c/p\u003e\u003cp\u003e这次所用的汉字取模保存至 \u003ccode\u003eoledfont.h\u003c/code\u003e 内,注意为gb2312编码。\u003c/p\u003e\u003cp\u003e取模使用 \u003ccode\u003ePCtoLCD2002\u003c/code\u003e ,为逐行式,顺向。考虑到屏幕大小,取模的大小为16×16。添加在 \u003ccode\u003econst typFNT_GB16 cfont16[]\u003c/code\u003e 的后面。如:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token string\"\u003e\u0026#34;康\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x80\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x3F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFE\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x80\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x2F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xF8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x88\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x3F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFE\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x88\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x2F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xF8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x28\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x80\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xC4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xA8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x44\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x90\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x48\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x88\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x92\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x86\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token comment\"\u003e/*\u0026#34;康\u0026#34;*/\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;师\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x08\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x0B\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFE\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x48\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x48\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x48\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x49\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFC\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x49\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x49\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x49\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x49\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x49\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x09\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x34\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x11\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x28\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x40\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token comment\"\u003e/*\u0026#34;师\u0026#34;*/\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;傅\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x08\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x50\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x08\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x48\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x0F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFE\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x40\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x17\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFC\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x34\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x44\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x37\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFC\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x54\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x44\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x97\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFC\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x14\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x44\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x08\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x1F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0xFE\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x12\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x08\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x11\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x08\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x11\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x28\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token comment\"\u003e/*\u0026#34;傅\u0026#34;*/\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e显示汉字使用 \u003ccode\u003eGUI_ShowCHinese(uint8_t x,uint8_t y,uint8_t hsize,uint8_t *str,uint8_t mode)\u003c/code\u003e ,使用实例如 \u003ccode\u003eGUI_ShowCHinese(40,2,16,\u0026#34;康师傅\u0026#34;,1);\u003c/code\u003e\u003c/p\u003e\u003cp\u003e该函数说明:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e/***************************************************************************** * @name :void GUI_ShowCHinese(uint8_t x,uint8_t y,uint8_t hsize,uint8_t *str,uint8_t mode) * @date :2018-08-27 * @function :Display Chinese strings * @parameters :x:the bebinning x coordinate of the Chinese strings y:the bebinning y coordinate of the Chinese stringssize:the size of Chinese stringsstr:the start address of the Chinese stringsmode:0-white background and black character 1-black background and white character * @retvalue :None******************************************************************************/\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e显示其他内容可以 结合\u003ccode\u003etest.c\u003c/code\u003e 中的实例与 \u003ccode\u003egui.c\u003c/code\u003e 里的函数说明学习。\u003c/p\u003e\u003cp\u003e为了分开gb2312与utf-8,我将显示中文的地方全部写在了一个文件里,我在 \u003ccode\u003emain.c\u003c/code\u003e 用到的时候直接调用。\u003c/p\u003e\u003ch3 id=\"驱动DHT11温湿度传感器(单总线协议的学习)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E9%A9%B1%E5%8A%A8DHT11%E6%B8%A9%E6%B9%BF%E5%BA%A6%E4%BC%A0%E6%84%9F%E5%99%A8%EF%BC%88%E5%8D%95%E6%80%BB%E7%BA%BF%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%AD%A6%E4%B9%A0%EF%BC%89\" class=\"headerlink\" title=\"驱动DHT11温湿度传感器(单总线协议的学习)\"\u003e\u003c/a\u003e驱动DHT11温湿度传感器(\u003cstrong\u003e单总线协议的学习\u003c/strong\u003e)\u003c/h3\u003e\u003cp\u003e)当时大二赶广和通项目的时候用的是 \u003ccode\u003eDS18B20\u003c/code\u003e 来着,是个单总线协议的温度传感器,网上找了段代码糊了一个,这次用 \u003ccode\u003eDHT11\u003c/code\u003e 学习学习单总线协议。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eDHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC\u003cbr/\u003e测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够\u003cbr/\u003e实时的采集本地湿度和温度。DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一\u003cbr/\u003e个 I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式\u003cbr/\u003e进行校验,有效的保证数据传输的准确性。DHT11 功耗很低,5V 电源电压下,工作平均最大\u003cbr/\u003e电流 0.5mA。DHT11 的技术参数:工作电压范围:3.3V-5.5V;工作电流 :平均 0.5mA;输出:单总线数字信号;测量范围:湿度 20\u003cdel\u003e90%RH,温度 0\u003c/del\u003e50℃;精度 :湿度±5%,温度±2℃;分辨率 :湿度 1%,温度 1℃;\u003c/p\u003e\u003c/blockquote\u003e\u003ch4 id=\"DHT11-数据传输格式\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#DHT11-%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93%E6%A0%BC%E5%BC%8F\" class=\"headerlink\" title=\"DHT11 数据传输格式\"\u003e\u003c/a\u003eDHT11 数据传输格式\u003c/h4\u003e\u003cp\u003eDHT11 数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由 40Bit 组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。\u003c/p\u003e\u003cp\u003eDHT11 的数据格式为:\u003cstrong\u003e8bit 湿度整数数据\u003c/strong\u003e + \u003cstrong\u003e8bit 湿度小数数据\u003c/strong\u003e + \u003cstrong\u003e8bit 温度整数数据\u003c/strong\u003e + \u003cstrong\u003e8bit 温度小数数据\u003c/strong\u003e + \u003cstrong\u003e8bit 校验和\u003c/strong\u003e。其中校验和数据为前四个字节相加。\u003cbr/\u003e传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。例如,某次从 DHT11 读到的数据如下表所示:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003ebyte4\u003c/th\u003e\u003cth\u003ebyte3\u003c/th\u003e\u003cth\u003ebyte2\u003c/th\u003e\u003cth\u003ebyte1\u003c/th\u003e\u003cth\u003ebyte0\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e0010 1101\u003c/td\u003e\u003ctd\u003e0000 0000\u003c/td\u003e\u003ctd\u003e0001 1100\u003c/td\u003e\u003ctd\u003e0000 0000\u003c/td\u003e\u003ctd\u003e0100 1001\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e湿度 \u003cstrong\u003e整数\u003c/strong\u003e 部分\u003c/td\u003e\u003ctd\u003e湿度 \u003cstrong\u003e小数\u003c/strong\u003e 部分\u003c/td\u003e\u003ctd\u003e温度 \u003cstrong\u003e整数\u003c/strong\u003e 部分\u003c/td\u003e\u003ctd\u003e温度 \u003cstrong\u003e小数\u003c/strong\u003e 部分\u003c/td\u003e\u003ctd\u003e校验和\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e由以上数据就可得到湿度和温度的值,计算方法:\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e湿度= byte4 . byte3=45.0 (%RH)\u003cbr/\u003e温度= byte2 . byte1=28.0 ( ℃)\u003cbr/\u003e校验= byte4+ byte3+ byte2+ byte1=73(=湿度+温度)(校验正确)\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003eDHT11 的数据格式是十分简单,DHT11 和 MCU 的一次通信最大为 3ms 左右,建议主机连续读取时间间隔不要小于 100ms。 下面,我们介绍一下 DHT11 的传输时序。\u003c/p\u003e\u003ch4 id=\"提前准备\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E6%8F%90%E5%89%8D%E5%87%86%E5%A4%87\" class=\"headerlink\" title=\"提前准备\"\u003e\u003c/a\u003e提前准备\u003c/h4\u003e\u003cp\u003e本次使用数据传输脚:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e// 数据传输脚 PA12\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003eDHT11_DQ_OUT\u003c/span\u003e \u003cspan class=\"token expression\"\u003eGPIO_PIN_12\u003c/span\u003e\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e设置数据传输脚为输出:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003eDHT11_IO_OUT\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e GPIO_InitTypeDef GPIO_InitStruct \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003eGPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ePin \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e DHT11_DQ_OUT\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003eGPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eMode \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e GPIO_MODE_OUTPUT_PP\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003eGPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ePull \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e GPIO_NOPULL\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003eGPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eSpeed \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e GPIO_SPEED_FREQ_LOW\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eGPIOA\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003eGPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e设置数据传输脚为输入:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003eDHT11_IO_IN\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e GPIO_InitTypeDef GPIO_InitStruct \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e GPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ePin \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e DHT11_DQ_OUT\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e GPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eMode \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e GPIO_MODE_INPUT\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e GPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ePull \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e GPIO_PULLUP\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_GPIO_Init\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eGPIOA\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003eGPIO_InitStruct\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"DHT11-的数据发送流程\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#DHT11-%E7%9A%84%E6%95%B0%E6%8D%AE%E5%8F%91%E9%80%81%E6%B5%81%E7%A8%8B\" class=\"headerlink\" title=\"DHT11 的数据发送流程\"\u003e\u003c/a\u003eDHT11 的数据发送流程\u003c/h4\u003e\u003cp\u003eDHT11 的数据发送流程如下图所示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/DHT11/DHT11-1.png\" alt=\"DHT11 的数据发送流程\"/\u003e\u003c/p\u003e\u003ch5 id=\"开始信号\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E5%BC%80%E5%A7%8B%E4%BF%A1%E5%8F%B7\" class=\"headerlink\" title=\"开始信号\"\u003e\u003c/a\u003e开始信号\u003c/h5\u003e\u003cp\u003e首先主机发送 \u003cstrong\u003e开始信号\u003c/strong\u003e,即:拉低数据线,保持 t1(至少 18ms)时间,然后 \u003cstrong\u003e拉高数据线\u003c/strong\u003e t2(20~ 40us)时间,然后读取 DHT11 的响应。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/DHT11/DHT11-2.png\" alt=\"DHT11 开始信号\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e复位DHT11\u003c/strong\u003e :\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-C\" data-language=\"C\"\u003e\u003ccode class=\"language-C\"\u003evoid DHT11_Rst(void) { DHT11_IO_OUT(); //SET OUTPUT HAL_GPIO_WritePin(GPIOA, DHT11_DQ_OUT, GPIO_PIN_RESET); delay_ms(20); //拉低至少18ms HAL_GPIO_WritePin(GPIOA, DHT11_DQ_OUT, GPIO_PIN_SET); delay_us(30); //主机拉高20~40us}\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch5 id=\"响应信号\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E5%93%8D%E5%BA%94%E4%BF%A1%E5%8F%B7\" class=\"headerlink\" title=\"响应信号\"\u003e\u003c/a\u003e响应信号\u003c/h5\u003e\u003cp\u003eDHT11的 \u003cstrong\u003e响应\u003c/strong\u003e :正常的话,DHT11 会 \u003cstrong\u003e拉低\u003c/strong\u003e 数据线,保持 t3(40~50us)时间,作为响应信号,然后 DHT11 \u003cstrong\u003e拉高\u003c/strong\u003e 数据线,保持 t4(40 ~50us)时间后,开始输出数据。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/DHT11/DHT11-3.png\" alt=\"DHT11 开始信号\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e检测DHT11的回应\u003c/strong\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e//返回1:未检测到DHT11的存在\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//返回0:存在\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eDHT11_Check\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e retry\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003eDHT11_IO_IN\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//SET INPUT\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//DHT11会拉低40~80us\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eGPIOA\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e DHT11_DQ_OUT\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e retry\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e100\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e++\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e\u0026gt;=\u003c/span\u003e\u003cspan class=\"token number\"\u003e100\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e retry\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//DHT11拉低后会再次拉高40~80us\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e!\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eGPIOA\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e DHT11_DQ_OUT\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u0026amp;\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e100\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e++\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e\u0026gt;=\u003c/span\u003e\u003cspan class=\"token number\"\u003e100\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch5 id=\"DHT11-发送数据\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#DHT11-%E5%8F%91%E9%80%81%E6%95%B0%E6%8D%AE\" class=\"headerlink\" title=\"DHT11 发送数据\"\u003e\u003c/a\u003eDHT11 发送数据\u003c/h5\u003e\u003cp\u003e总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据。\u003c/p\u003e\u003cp\u003e每一bit数据都以50us低电平时隙 \u003cstrong\u003e开始\u003c/strong\u003e ,\u003cstrong\u003e高电平的长短\u003c/strong\u003e 定了数据位是0还是1。\u003c/p\u003e\u003cp\u003e如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。\u003c/p\u003e\u003ch5 id=\"DHT11-发送-0\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#DHT11-%E5%8F%91%E9%80%81-0\" class=\"headerlink\" title=\"DHT11 发送 0\"\u003e\u003c/a\u003eDHT11 发送 0\u003c/h5\u003e\u003cp\u003e\u003cstrong\u003e高电平是26-28us就表示0。\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/DHT11/DHT11-4.png\" alt=\"DHT11 发送0\"/\u003e\u003c/p\u003e\u003ch5 id=\"DHT11-发送1\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#DHT11-%E5%8F%91%E9%80%811\" class=\"headerlink\" title=\"DHT11 发送1\"\u003e\u003c/a\u003eDHT11 发送1\u003c/h5\u003e\u003cp\u003e\u003cstrong\u003e高电平是70us表示1。\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/DHT11/DHT11-5.png\" alt=\"DHT11 发送0\"/\u003e\u003c/p\u003e\u003ch5 id=\"接收数据\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E6%8E%A5%E6%94%B6%E6%95%B0%E6%8D%AE\" class=\"headerlink\" title=\"接收数据\"\u003e\u003c/a\u003e接收数据\u003c/h5\u003e\u003cp\u003e主机只要读取等待50us低电平过去,然后再判断高电平长短就能收集数据了。\u003c/p\u003e\u003cp\u003e从DHT11读取一个位:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e//返回值:1/0\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eDHT11_Read_Bit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e retry\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eGPIOA\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e DHT11_DQ_OUT\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u0026amp;\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e100\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//等待变为低电平\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e++\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e!\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eGPIOA\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e DHT11_DQ_OUT\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u0026amp;\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e100\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//等待变高电平\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003eretry\u003cspan class=\"token operator\"\u003e++\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e40\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//等待40us\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_GPIO_ReadPin\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eGPIOA\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e DHT11_DQ_OUT\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e读取8次为一个字节:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e//返回值:读到的数据\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token function\"\u003eDHT11_Read_Byte\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e i \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003edat \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e++\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003edat \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e dat\u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e dat \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e dat \u003cspan class=\"token operator\"\u003e|\u003c/span\u003e \u003cspan class=\"token function\"\u003eDHT11_Read_Bit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e dat\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e一共5个字节:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e//temp:温度值(范围:0~50°)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//humi:湿度值(范围:20%~90%)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//返回值:0,正常;1,读取失败\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003eDHT11_Read_Data\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003etemp\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehumi\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e i\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e buf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003eDHT11_Rst\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eDHT11_Check\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e==\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e++\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//读取40位数据\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ei\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token function\"\u003eDHT11_Read_Byte\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e+\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e+\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e+\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e==\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehumi\u003cspan class=\"token operator\"\u003e=\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003etemp\u003cspan class=\"token operator\"\u003e=\u003c/span\u003ebuf\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e)不过为了显示的更精确可以小数位也传过去。\u003c/p\u003e\u003ch3 id=\"完成\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/e0ca/#%E5%AE%8C%E6%88%90\" class=\"headerlink\" title=\"完成\"\u003e\u003c/a\u003e完成\u003c/h3\u003e\u003cp\u003e到此,完成了串口通信,OLED屏幕驱动,温湿度数据的获取。之后在OLED屏幕上的显示布局可以自己设计~ \u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/e0ca/"},{"title":"6063/6064 公益慢火车运转","time":"2023-04-05T15:19:17Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"6063-x2F-6064-公益慢火车运转\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/54cd/#6063-x2F-6064-%E5%85%AC%E7%9B%8A%E6%85%A2%E7%81%AB%E8%BD%A6%E8%BF%90%E8%BD%AC\" class=\"headerlink\" title=\"6063/6064 公益慢火车运转\"\u003e\u003c/a\u003e6063/6064 公益慢火车运转\u003c/h1\u003e\u003cblockquote\u003e\u003cp\u003e群山如森海,慢车即航船。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e这是2022年8月初的事情了,那会正值暑假,因为防控原因我在学校呆到7月底才回家,顺便去运转了一下这趟公益慢火车。当时运转时这趟车还是非空调车,现在已经更换车底,成为空调车了。刚好赶在换车底前完成了这一趟。全程下来,还是很有意思的。\u003c/p\u003e\u003cp\u003e\u003cdel\u003e不过人是个懒狗,拖到这会才想起来写。后面想起来再更新。\u003c/del\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/54cd/"},{"title":"Hexo 注入器实践","time":"2023-04-04T20:39:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"Hexo-注入器实践\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5eba/#Hexo-%E6%B3%A8%E5%85%A5%E5%99%A8%E5%AE%9E%E8%B7%B5\" class=\"headerlink\" title=\"Hexo 注入器实践\"\u003e\u003c/a\u003eHexo 注入器实践\u003c/h1\u003e\u003ch2 id=\"前言\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5eba/#%E5%89%8D%E8%A8%80\" class=\"headerlink\" title=\"前言\"\u003e\u003c/a\u003e前言\u003c/h2\u003e\u003cp\u003e我博客首页飘的那个樱花看着花里胡哨,但是非常占用资源……而且因为是直接引进来的 \u003ccode\u003ejs\u003c/code\u003e ,所以每个页面都有这玩意,但是毕竟花里胡哨,也就对性能问题睁一只眼闭一只眼,刚才翻别人博客突然发现了注入器这个神奇玩意,于是问题解决了:只在首页显示樱花飘落的动画。\u003c/p\u003e\u003ch3 id=\"参考博客\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5eba/#%E5%8F%82%E8%80%83%E5%8D%9A%E5%AE%A2\" class=\"headerlink\" title=\"参考博客\"\u003e\u003c/a\u003e参考博客\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://gishai.top/blog/posts/1563abd8.html\"\u003e基于hexo的fluid主题的魔改汇总 - GISHAI\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://hexo.fluid-dev.com/docs/advance/#hexo-%E6%B3%A8%E5%85%A5%E4%BB%A3%E7%A0%81\"\u003e进阶用法 | Hexo Fluid 用户手册 (fluid-dev.com)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"具体实践\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5eba/#%E5%85%B7%E4%BD%93%E5%AE%9E%E8%B7%B5\" class=\"headerlink\" title=\"具体实践\"\u003e\u003c/a\u003e具体实践\u003c/h2\u003e\u003cp\u003e在 \u003cstrong\u003e\u003ca href=\"https://hexo.fluid-dev.com/docs/\"\u003eHexo Fluid 用户手册\u003c/a\u003e\u003c/strong\u003e 中说的比较清楚了:注入器可以将 HTML 片段注入生成页面的 \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e 和 \u003ccode\u003e\u0026lt;body\u0026gt;\u003c/code\u003e 节点中,而且可以选择注入的页面类型(比如我首页的樱花我可以选择只注入首页)。\u003c/p\u003e\u003cp\u003e编写注入代码,需要在博客的根目录下创建 \u003ccode\u003escripts\u003c/code\u003e 文件夹,然后在里面任意命名创建一个 js 文件即可。\u003c/p\u003e\u003cp\u003e我创建了一个 \u003ccode\u003e/Hexo/scripts/yinghua.js\u003c/code\u003e 了一个文件,内容为:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-javascript\" data-language=\"javascript\"\u003e\u003ccode class=\"language-javascript\"\u003ehexo\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eextend\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003einjector\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003eregister\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;body_end\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;\u0026lt;script src=\u0026#34;//must.best/assets/js/flower.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;home\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e上述代码会在生成的页面 \u003ccode\u003e\u0026lt;/body\u0026gt;\u003c/code\u003e 注入加载 \u003ccode\u003e//must.best/assets/js/flower.js\u003c/code\u003e 的代码。\u003c/p\u003e\u003cp\u003e这里发挥作用的是 \u003cstrong\u003e\u003ccode\u003eregister\u003c/code\u003e\u003c/strong\u003e 函数。\u003c/p\u003e\u003ch3 id=\"register-函数\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5eba/#register-%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"register 函数\"\u003e\u003c/a\u003e\u003ccode\u003eregister\u003c/code\u003e 函数\u003c/h3\u003e\u003cp\u003e\u003ccode\u003eregister\u003c/code\u003e 函数可接受三个参数。\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e\u003cstrong\u003e第一个参数\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e第一个参数是\u003cstrong\u003e代码片段注入的位置\u003c/strong\u003e,接受以下值:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003ehead_begin\u003c/code\u003e: 注入在 \u003ccode\u003e\u0026lt;head\u0026gt;\u003c/code\u003e 之后(默认)\u003c/li\u003e\u003cli\u003e\u003ccode\u003ehead_end\u003c/code\u003e: 注入在 \u003ccode\u003e\u0026lt;/head\u0026gt;\u003c/code\u003e 之前\u003c/li\u003e\u003cli\u003e\u003ccode\u003ebody_begin\u003c/code\u003e: 注入在 \u003ccode\u003e\u0026lt;body\u0026gt;\u003c/code\u003e 之后\u003c/li\u003e\u003cli\u003e\u003ccode\u003ebody_end\u003c/code\u003e: 注入在 \u003ccode\u003e\u0026lt;/body\u0026gt;\u003c/code\u003e 之前\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003cstrong\u003e第二个参数\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e第二个参数是注入的片段,可以是字符串,也可以是一个返回值为字符串的函数。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003cstrong\u003e第三个参数\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e第三个参数是注入的页面类型,接受以下值:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003edefault\u003c/code\u003e: 注入到每个页面(默认值)\u003c/li\u003e\u003cli\u003e\u003ccode\u003ehome\u003c/code\u003e: 只注入到主页(\u003ccode\u003eis_home()\u003c/code\u003e 为 \u003ccode\u003etrue\u003c/code\u003e 的页面)\u003c/li\u003e\u003cli\u003e\u003ccode\u003epost\u003c/code\u003e: 只注入到文章页面(\u003ccode\u003eis_post()\u003c/code\u003e 为 \u003ccode\u003etrue\u003c/code\u003e 的页面)\u003c/li\u003e\u003cli\u003e\u003ccode\u003epage\u003c/code\u003e: 只注入到独立页面(\u003ccode\u003eis_page()\u003c/code\u003e 为 \u003ccode\u003etrue\u003c/code\u003e 的页面)\u003c/li\u003e\u003cli\u003e\u003ccode\u003earchive\u003c/code\u003e: 只注入到归档页面(\u003ccode\u003eis_archive()\u003c/code\u003e 为 \u003ccode\u003etrue\u003c/code\u003e 的页面)\u003c/li\u003e\u003cli\u003e\u003ccode\u003ecategory\u003c/code\u003e: 只注入到分类页面(\u003ccode\u003eis_category()\u003c/code\u003e 为 \u003ccode\u003etrue\u003c/code\u003e 的页面)\u003c/li\u003e\u003cli\u003e\u003ccode\u003etag\u003c/code\u003e: 只注入到标签页面(\u003ccode\u003eis_tag()\u003c/code\u003e 为 \u003ccode\u003etrue\u003c/code\u003e 的页面)\u003c/li\u003e\u003cli\u003e或是其他自定义 layout 名称,例如在Fluid 主题中 \u003ccode\u003eabout\u003c/code\u003e 对应关于页、\u003ccode\u003elinks\u003c/code\u003e 对应友联页\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e比如上面我要樱花飘落的动画只在首页显示,所以选择 \u003ccode\u003ehome\u003c/code\u003e 这个参数。\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/5eba/"},{"title":"【有方杯总结】一个物联网小项目","time":"2023-04-04T19:31:50Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"【有方杯总结】一个物联网小项目\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/1b10/#%E3%80%90%E6%9C%89%E6%96%B9%E6%9D%AF%E6%80%BB%E7%BB%93%E3%80%91%E4%B8%80%E4%B8%AA%E7%89%A9%E8%81%94%E7%BD%91%E5%B0%8F%E9%A1%B9%E7%9B%AE\" class=\"headerlink\" title=\"【有方杯总结】一个物联网小项目\"\u003e\u003c/a\u003e【有方杯总结】一个物联网小项目\u003c/h1\u003e\u003ch2 id=\"前言\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/1b10/#%E5%89%8D%E8%A8%80\" class=\"headerlink\" title=\"前言\"\u003e\u003c/a\u003e前言\u003c/h2\u003e\u003cp\u003e这次的项目其实是比较简单的。相对于大二那会做的广和通物联网项目来说,这次的项目算是比较有条理的做了下来,能理清楚各部分的关系,在编写的过程中不断学习实践,各类传感器的整合,数据上报,云端数据的流转……收获很多。\u003c/p\u003e\u003cp\u003e不过总的来说,这个项目是单片机收集了一些传感器的数据,然后通过 \u003ccode\u003e有方N58\u003c/code\u003e 通信模块上报阿里云物联网平台,进而展示在前端页面上。\u003c/p\u003e\u003cp\u003e想想之前做广和通的时候没搞清楚这些关系,先是在服务器上运行了一个 \u003ccode\u003ec-socket\u003c/code\u003e 脚本,然后用广和通物联网模块去连接这个脚本,之后脚本将接收到的数据写入文件。网页前端是不断访问这个文件进行页面展示数据的更改。走了很多弯路,而且很不稳定,每次断掉之后得等服务器上那个端口空闲之后才能再次运行脚本……这次使用了 \u003ccode\u003ewebsocket\u003c/code\u003e 与阿里云物联网平台,可以说是又稳又快,用 \u003ccode\u003ejs\u003c/code\u003e 处理数据也方便的多。\u003c/p\u003e\u003cp\u003e\u003cdel\u003e用 \u003ccode\u003eC语言\u003c/code\u003e 处理字符串还是太折磨人了。\u003c/del\u003e\u003c/p\u003e\u003cp\u003e大概流程:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/neoway/2.png\"/\u003e\u003c/p\u003e\u003cp\u003e前端演示地址:\u003c/p\u003e\u003cp\u003e\u003ca href=\"http://neoway.ksfu.top/\"\u003ehttp://neoway.ksfu.top/\u003c/a\u003e\u003c/p\u003e\u003cp\u003e前端效果图:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/neoway/1.jpg\"/\u003e\u003c/p\u003e\u003chr/\u003e\u003cp\u003e具体内容的起来再写~\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/1b10/"},{"title":"2022 年终\u0026期末总结","time":"2023-01-03T08:53:20Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"2022-年终总结\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/3ff3/#2022-%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93\" class=\"headerlink\" title=\"2022 年终总结\"\u003e\u003c/a\u003e2022 年终总结\u003c/h1\u003e\u003cp\u003e\u003cdel\u003e因为这几天趁着冬促入了奥德赛,所以还在肝这玩意,先占个坑肝差不多了就写\u003c/del\u003e\u003c/p\u003e\u003cp\u003e\u003cdel\u003e奥德赛好长啊\u003c/del\u003e\u003c/p\u003e\u003cp\u003e去年还是太逆天了,不过终究是过来了。\u003c!--今年要准备考研了。--\u003e今年到目前来说还不错,追了很多场演唱会,也和同学组多参加了一些小比赛。不过压力也感觉大了起来,感觉自己现在也没啥技能,简历上没啥东西能写。学业上也不咋样。女朋友必然也是没有的(也没认识几个女生就是说。体重只能说保持的还不错。海浪会来,希望这学期的生活能冲淡去年的影响,等这学期大三总结和2022总结一起写吧。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/3ff3/"},{"title":"基于FPGA的ASK信号生成及测量分析技术-西电通院随机信号实验","time":"2022-11-04T19:55:20Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"基于FPGA的ASK信号生成及测量分析技术\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E5%9F%BA%E4%BA%8EFPGA%E7%9A%84ASK%E4%BF%A1%E5%8F%B7%E7%94%9F%E6%88%90%E5%8F%8A%E6%B5%8B%E9%87%8F%E5%88%86%E6%9E%90%E6%8A%80%E6%9C%AF\" class=\"headerlink\" title=\"基于FPGA的ASK信号生成及测量分析技术\"\u003e\u003c/a\u003e基于FPGA的ASK信号生成及测量分析技术\u003c/h1\u003e\u003cp\u003e) 随机信号实验选到了这个,就当学 \u003ccode\u003eVerilog\u003c/code\u003e 了。\u003c/p\u003e\u003cp\u003e(以下内容围绕西电通院随机信号实验:《基于FPGA的ASK信号生成及测量分析技术》展开。\u003c/p\u003e\u003ch2 id=\"模块框图\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E6%A8%A1%E5%9D%97%E6%A1%86%E5%9B%BE\" class=\"headerlink\" title=\"模块框图\"\u003e\u003c/a\u003e模块框图\u003c/h2\u003e\u003cp\u003e2ASK调制电路组成框图\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/%E8%AE%B0%E5%BD%95.png\"/\u003e\u003cp\u003e2ASK调制的FPGA程序框图\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/%E6%A1%86%E5%9B%BE.png\"/\u003e\u003ch2 id=\"模块分解\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E6%A8%A1%E5%9D%97%E5%88%86%E8%A7%A3\" class=\"headerlink\" title=\"模块分解\"\u003e\u003c/a\u003e模块分解\u003c/h2\u003e\u003cp\u003e梳理一下:\u003c/p\u003e\u003col\u003e\u003cli\u003e分频模块\u003c/li\u003e\u003cli\u003e载波产生模块\u003cul\u003e\u003cli\u003e八进制计数器\u003c/li\u003e\u003cli\u003eROM\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003em序列产生模块\u003c/li\u003e\u003cli\u003e键控开关\u003c/li\u003e\u003cli\u003eDAC输出模块(给了)\u003c/li\u003e\u003cli\u003e拓展输出口(给了)\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e所以需要编写5个模块。\u003c/p\u003e\u003ch3 id=\"1-分频模块设计\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#1-%E5%88%86%E9%A2%91%E6%A8%A1%E5%9D%97%E8%AE%BE%E8%AE%A1\" class=\"headerlink\" title=\"1. 分频模块设计\"\u003e\u003c/a\u003e1. 分频模块设计\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e2.1.1按原理2.1节设计分频器a(4分频、6分频、10分频等)将系统时钟sys_clk分频,作为载波产生模块的时钟,则载波频率为sys_clk/(分频值a*一个载波周期的存储点数n)(Hz)。(sys_clk=26MHz)\u003c/p\u003e\u003cp\u003e2.1.2按原理2.1节设计分频器b(分频值应设置为上步中a*n的整数倍)将系统时钟分频,作为m序列产生模块的时钟,则基带码元速率为sys_clk/b(bit/s)。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e可以知道要设计两个分频模块,其中主频为 \u003cstrong\u003e26MHz\u003c/strong\u003e。\u003c/p\u003e\u003cp\u003e分频模块端口示意图:\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/%E5%88%86%E9%A2%91%E6%A8%A1%E5%9D%97.png\" style=\"zoom: 50%;\"/\u003e\u003cblockquote\u003e\u003cp\u003eclk端为系统时钟信号输入,从out8、out16、out256可分别得到系统时钟的8分频、16分频和256分频信号。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e经历了一晚上的折磨,我终于悟出了:\u003cstrong\u003e所谓X分频,就是把时钟原来每一下变一次,变成现在是每X下变一次。\u003c/strong\u003e \u003cdel\u003e(有时候很明显的事情就是转不过来弯\u003c/del\u003e\u003c/p\u003e\u003cp\u003e所以就可以顺着这个思路编写 \u003ccode\u003efenpin.v\u003c/code\u003e :\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e fenpin \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e out8\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e out16\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e out256\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 所谓X分频,就是原来时钟是每一下变一次\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 现在是每X下变一次\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// lb(256) = 8\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e7\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter_256\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter_16\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter_8\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e counter_256 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e8\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e counter_16 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e4\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e counter_8 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out8 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out16 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out256 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 折中计数到一半就行\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 8分频\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter_8 \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e counter_8 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e counter_8 \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out8 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e out8\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e counter_8 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out8 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eout8\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 16分频\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter_16 \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e counter_16 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e counter_16 \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out16 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e out16\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e counter_16 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e4\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out16 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eout16\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 256分频\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter_256 \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e256\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e counter_256 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e counter_256 \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out256 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e out256\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e counter_256 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e8\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e out256 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eout256\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e\u003ccode\u003etestbench\u003c/code\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token constant\"\u003e`timescale\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e \u003cspan class=\"token function\"\u003etb_fenpin\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e out8\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e out16\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e out256\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#10\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003efenpin fenpin_inst\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eclk \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eout8 \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eout8\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eout16 \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eout16\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eout256 \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eout256\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e仿真波形:\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/%E5%88%86%E9%A2%91%E4%BB%BF%E7%9C%9F.png\"/\u003e\u003ch3 id=\"2-载波产生模块\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#2-%E8%BD%BD%E6%B3%A2%E4%BA%A7%E7%94%9F%E6%A8%A1%E5%9D%97\" class=\"headerlink\" title=\"2. 载波产生模块\"\u003e\u003c/a\u003e2. 载波产生模块\u003c/h3\u003e\u003cp\u003e载波产生模块示意图:\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/%E8%BD%BD%E6%B3%A2%E4%BA%A7%E7%94%9F%E6%A8%A1%E5%9D%97.png\"/\u003e\u003cblockquote\u003e\u003cp\u003e载波产生模块示意图如上图所示,其中clock为载波采样时钟,q[2:0]为计数器输出,q[7:0]输出为载波信号。载波产生模块由一个计数器和一个ROM构成,其中ROM中存储着一个载波周期的样点值,则计数器的进制设置为一个载波周期包含的样点数。本实验中一个载波周期取八个样点,计数器设置为八进制计数器,ROM和计数器均可使用IP核实现。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e结合示意图可以知道,载波产生模块又分为两部分:\u003cstrong\u003e八进制计数器\u003c/strong\u003e和\u003cstrong\u003eROM\u003c/strong\u003e。分开来写。\u003c/p\u003e\u003ch4 id=\"1)-八进制计数器\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#1%EF%BC%89-%E5%85%AB%E8%BF%9B%E5%88%B6%E8%AE%A1%E6%95%B0%E5%99%A8\" class=\"headerlink\" title=\"1) 八进制计数器\"\u003e\u003c/a\u003e1) 八进制计数器\u003c/h4\u003e\u003cp\u003eq 的值每个时钟加1,从0加到7。\u003c/p\u003e\u003cp\u003e\u003ccode\u003elpm_counter0.v\u003c/code\u003e :\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e lpm_counter0 \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e q\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e q \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eq \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u0026#39;b111\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e q \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e q \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e q \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e\u003ccode\u003etestbench\u003c/code\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token constant\"\u003e`timescale\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e \u003cspan class=\"token function\"\u003etb_lpm_counter0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e q\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#10\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003elpm_counter0 lpm_counter0_inst\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003eclk\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003eq\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eq\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e仿真波形\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/%E8%AE%A1%E6%95%B0%E5%99%A8%E4%BB%BF%E7%9C%9F.png\"/\u003e\u003ch4 id=\"2)ROM\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#2%EF%BC%89ROM\" class=\"headerlink\" title=\"2)ROM\"\u003e\u003c/a\u003e2)ROM\u003c/h4\u003e\u003cp\u003e使用 \u003cstrong\u003eIP核\u003c/strong\u003e ,照着野火的教程学了学。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://www.bilibili.com/video/BV17z411i7er/?p=46\"\u003e46-第二十六讲-ROM-IP核的调用(一)_哔哩哔哩_bilibili\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e经过大概分析,可以知道本实验使用 \u003cstrong\u003e单端口ROM\u003c/strong\u003e ,数据为 \u003cstrong\u003e8位宽\u003c/strong\u003e ,地址为 \u003cstrong\u003e3位宽\u003c/strong\u003e ,至少包含 \u003cstrong\u003e8个\u003c/strong\u003e 数据(采样了8个点),使用单时钟。\u003c/p\u003e\u003cp\u003e输出添加一个寄存器会延后两个周期输出。(原来延后一个,经过寄存器再延后一个。)\u003c/p\u003e\u003cp\u003e写操作是时钟的上升沿,读也是时钟的上升沿。\u003c/p\u003e\u003ch5 id=\"产生-mif-文件\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E4%BA%A7%E7%94%9F-mif-%E6%96%87%E4%BB%B6\" class=\"headerlink\" title=\"产生 mif 文件\"\u003e\u003c/a\u003e产生 mif 文件\u003c/h5\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/weixin_44939178/article/details/112314742\"\u003ematlab生成.mif文件 产生正弦信号数据_橘子FPGA的博客-CSDN博客_matlab生成正弦信号\u003c/a\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e本实验中一个载波周期取八个样点。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e本次使用 \u003ccode\u003epython\u003c/code\u003e 进行生成\u003cdel\u003e(就8个点手写也行\u003c/del\u003e。\u003c/p\u003e\u003cp\u003e根据 \u003ccode\u003e.mif\u003c/code\u003e 文件的格式一句一句打印出来。\u003c/p\u003e\u003cp\u003e一个普通余弦信号周期为 $2\\pi$ ,取样8个点,就是 $cos(2{\\pi}\\times\\frac{x}{8})$ ;\u003c/p\u003e\u003cp\u003e数据位宽为8位,所表示的数据在0~255之间,所以需要将 $cos(2{\\pi}\\times\\frac{x-1}{8})$ 的幅值**-1~+1变化到0~255**。\u003c/p\u003e\u003cp\u003e具体做法是将 $cos(2{\\pi}\\times\\frac{x}{8})\\times128+128$ 。就是将原幅值变换至-128~+128,然后加上128,范围变为0~256。 \u003c/p\u003e\u003cp\u003e\u003ccode\u003epython\u003c/code\u003e 代码:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-python\" data-language=\"python\"\u003e\u003ccode class=\"language-python\"\u003e\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e mathpi \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e math\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003epifilename \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;sin_8x8.mif\u0026#34;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewith\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efilename\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;w+\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003eencoding\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;utf-8\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eas\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;WIDTH=8;\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;DEEPTH=8;\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;ADDRESS_RADIX=UNS;\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;DATA_RADIX=UNS;\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;CONTENT BEGIN\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e i \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e \u003cspan class=\"token builtin\"\u003erange\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e x \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003eint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003emath\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ecos\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003epi\u003cspan class=\"token operator\"\u003e*\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token number\"\u003e128\u003c/span\u003e\u003cspan class=\"token operator\"\u003e+\u003c/span\u003e\u003cspan class=\"token number\"\u003e128\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e x \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e256\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e x \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e x\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string-interpolation\"\u003e\u003cspan class=\"token string\"\u003ef\u0026#34;\u003c/span\u003e\u003cspan class=\"token interpolation\"\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003ei\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token string\"\u003e:\u003c/span\u003e\u003cspan class=\"token interpolation\"\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003ex\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token string\"\u003e\\n\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;END;\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e效果(如果发现quartus报错就生成一个标准的mif文件然后把下面的复制进去替换:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-mif\" data-language=\"mif\"\u003e\u003ccode class=\"language-mif\"\u003eWIDTH=8;DEEPTH=8;ADDRESS_RADIX=UNS;DATA_RADIX=UNS;CONTENT BEGIN0:2551:2182:1283:374:05:376:1277:218END;\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/sin.png\"/\u003e\u003ch5 id=\"生成IP核\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E7%94%9F%E6%88%90IP%E6%A0%B8\" class=\"headerlink\" title=\"生成IP核\"\u003e\u003c/a\u003e生成IP核\u003c/h5\u003e\u003cp\u003e注意深度选择的时候下拉没有8深度的选择,但是可以手动输入。\u003c/p\u003e\u003cp\u003e\u003cdel\u003e)不过我在其他文件调用ip核的时候一直仿真失败emm,所以ip核就直接用了,等我找到问题再看看。\u003c/del\u003e\u003c/p\u003e\u003ch5 id=\"编写代码及仿真\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E7%BC%96%E5%86%99%E4%BB%A3%E7%A0%81%E5%8F%8A%E4%BB%BF%E7%9C%9F\" class=\"headerlink\" title=\"编写代码及仿真\"\u003e\u003c/a\u003e编写代码及仿真\u003c/h5\u003e\u003cp\u003e添加IP核,进行仿真。\u003c/p\u003e\u003cp\u003e\u003ccode\u003etestbench\u003c/code\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token constant\"\u003e`timescale\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e \u003cspan class=\"token function\"\u003etb_lpm_rom\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e address2\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e7\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e q\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e address2 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u0026#39;b000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#10\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#20\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e\u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eaddress2 \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u0026#39;b111\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003eaddress2 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u0026#39;b000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003eaddress2 \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e address2 \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003ecos_8x8cos_8x8_inst \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eaddress \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e address2 \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eclock \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e clk \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eq \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e q \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e仿真波形\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/cos%E4%BB%BF%E7%9C%9F.png\"/\u003e\u003ch3 id=\"3-m序列产生模块\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#3-m%E5%BA%8F%E5%88%97%E4%BA%A7%E7%94%9F%E6%A8%A1%E5%9D%97\" class=\"headerlink\" title=\"3.m序列产生模块\"\u003e\u003c/a\u003e3.m序列产生模块\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/weixin_45015947/article/details/89891757\"\u003em序列产生原理及其性质_Angelo_pj的博客-CSDN博客_m序列\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://zhuanlan.zhihu.com/p/377685193\"\u003e【verilog杂谈(一)】 2-16位长度的m序列发生器 - 知乎 (zhihu.com)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cblockquote\u003e\u003cp\u003e要求:按原理2.3节设计m序列产生模块,要求产生不同长度的m序列。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e代码根据实验要求修改自参考链接,可以产生2~16位的m序列。\u003c/p\u003e\u003cp\u003e\u003ccode\u003emxulie.v\u003c/code\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e mxulie#\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eparameter\u003c/span\u003e len \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e4\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// parameter range from 2 to 16\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e m_sequence \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003elen\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eassign\u003c/span\u003e m_sequence \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003elen\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e Q_r \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e \u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e Q_r \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// shift reg\u003c/span\u003e \u003cspan class=\"token function\"\u003ecase\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003elen\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token number\"\u003e2\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e4\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e5\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e6\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e7\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e8\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e7\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e9\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e9\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e11\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e12\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e11\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e7\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e13\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e12\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e11\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e9\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e14\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e13\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e12\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e7\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e14\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e13\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e14\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e12\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e^\u003c/span\u003eQ_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003edefault\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e Q_r\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eendcase\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e\u003ccode\u003etestbench\u003c/code\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token comment\"\u003e//~ `New testbench\u003c/span\u003e\u003cspan class=\"token constant\"\u003e`timescale\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens \u003cspan class=\"token operator\"\u003e/\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens \u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e tb_mxulie\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// M_series Parameters\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eparameter\u003c/span\u003e M_len \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// M_series Inputs\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// M_series Outputs\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e m_sequence \u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#10\u003c/span\u003e clk\u003cspan class=\"token operator\"\u003e=~\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003emxulie #\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003elen \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e M_len \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003emxulie_inst \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eclk \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003em_sequence \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003em_sequence\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e仿真波形\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/m%E5%BA%8F%E5%88%97.png\"/\u003e\u003ch3 id=\"4-键控开关\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#4-%E9%94%AE%E6%8E%A7%E5%BC%80%E5%85%B3\" class=\"headerlink\" title=\"4.键控开关\"\u003e\u003c/a\u003e4.键控开关\u003c/h3\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/%E9%94%AE%E6%8E%A7%E5%BC%80%E5%85%B3.png\" style=\"zoom:50%;\"/\u003e\u003cblockquote\u003e\u003cp\u003e键控开关示意图图上图所示,其中data[7:0]端输入载波信号,gate端输入基带码元,当gate信号为1时,载波信号通过,如果gate信号为0时,载波信号不能通过。模块的输出端q[7:0]输出2ASK已调信号。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003ccode\u003elpm_gate.v\u003c/code\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e \u003cspan class=\"token function\"\u003elpm_gate\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e gate\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e7\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e7\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e q\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e q \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e8\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways@\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003egate \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e q \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e data\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e q \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e8\u0026#39;b01111111\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// +127将0变换过去\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch2 id=\"整合以及整体仿真\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E6%95%B4%E5%90%88%E4%BB%A5%E5%8F%8A%E6%95%B4%E4%BD%93%E4%BB%BF%E7%9C%9F\" class=\"headerlink\" title=\"整合以及整体仿真\"\u003e\u003c/a\u003e整合以及整体仿真\u003c/h2\u003e\u003cp\u003e将以上各个模块添加进实验给定的模板,并生成原理图,然后连线。\u003c/p\u003e\u003cp\u003e要整体仿真,所以要先把原理图转换为 \u003ccode\u003eVerilog\u003c/code\u003e (File -\u0026gt; Create / Update -\u0026gt; Create HDL Design File from Current File…),之后从工程文件移除原理图,设置生成的 \u003ccode\u003everilog\u003c/code\u003e 文件为顶层文件进行编译,然后仿真。\u003c/p\u003e\u003cp\u003e通过对比编译出来的 RTL 视图,符合给定框图。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/twoask.png\"/\u003e\u003cp\u003e整体仿真,只要注意 \u003ccode\u003eclk\u003c/code\u003e , \u003ccode\u003em_squence\u003c/code\u003e , \u003ccode\u003etwo_ask[7...0]\u003c/code\u003e 这几个信号就行。 \u003ccode\u003etestbench\u003c/code\u003e 如下:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token constant\"\u003e`timescale\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e tb_sim\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e m_squence\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e7\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e two_ask\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#10\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003etwoask \u003cspan class=\"token function\"\u003etwoask_inst\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003eclk\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003em_squence\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003em_squence\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003etwo_ask\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etwo_ask\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e仿真波形:\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/2ASK/%E6%95%B4%E4%BD%93%E4%BB%BF%E7%9C%9F.jpg\"/\u003e\u003ch3 id=\"管脚分配\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E7%AE%A1%E8%84%9A%E5%88%86%E9%85%8D\" class=\"headerlink\" title=\"管脚分配\"\u003e\u003c/a\u003e管脚分配\u003c/h3\u003e\u003cp\u003e管脚分配啥的给的模板文件里已经分配好了,直接用就行。\u003c/p\u003e\u003ch2 id=\"总结\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/5f6b/#%E6%80%BB%E7%BB%93\" class=\"headerlink\" title=\"总结\"\u003e\u003c/a\u003e总结\u003c/h2\u003e\u003cp\u003e毕竟是主要是记录 \u003ccode\u003everilog\u003c/code\u003e 的一个学习过程,剩下的就不分析了,属于是实验报告里的活。这算是第一次用 \u003ccode\u003everilog\u003c/code\u003e 干这种比较综合的活?接触到了一些新玩意,IP核,mif文件之类的。也锻炼了从s一样实验指导手册里提炼信息的能力?\u003c/p\u003e\u003cp\u003e\u003cdel\u003e(然后细节和要补充的等后面想起来再说\u003c/del\u003e \u003c/p\u003e\u003cp\u003e \u003cdel\u003e(我超突然想起来线下验收完忘了拍时域波形\u003c/del\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/5f6b/"},{"title":"批量转换文件编码gb2312转utf-8","time":"2022-08-10T09:32:11Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"批量转换文件编码gb2312转utf-8\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/2d8a/#%E6%89%B9%E9%87%8F%E8%BD%AC%E6%8D%A2%E6%96%87%E4%BB%B6%E7%BC%96%E7%A0%81gb2312%E8%BD%ACutf-8\" class=\"headerlink\" title=\"批量转换文件编码gb2312转utf-8\"\u003e\u003c/a\u003e批量转换文件编码gb2312转utf-8\u003c/h1\u003e\u003cp\u003e\u003cdel\u003e锟斤拷烫烫烫\u003c/del\u003e\u003c/p\u003e\u003cp\u003e这几天网上找代码学习用vscode打开之后中文全是乱码,转换编码为 \u003ccode\u003egb2312\u003c/code\u003e 后才正常显示,之前也因为这玩意狠狠的踩坑( \u003ccode\u003eKeil\u003c/code\u003e 默认的编码对中文来说太坑了。但是一个工程里文件很多,所以就需要一个批量把这些文件转换为 \u003ccode\u003eutf-8\u003c/code\u003e 的脚本。\u003c/p\u003e\u003cimg src=\"https://yun.ksfu.top/blog/gb2312/1.webp\" style=\"zoom: 67%;\"/\u003e\u003ch2 id=\"参考博客\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/2d8a/#%E5%8F%82%E8%80%83%E5%8D%9A%E5%AE%A2\" class=\"headerlink\" title=\"参考博客\"\u003e\u003c/a\u003e参考博客\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/a417655340/article/details/124460824\"\u003e批量转换文件编码gb2312转utf-8_每天一罐可乐的博客-CSDN博客_批量转换编码格式\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_42336581/article/details/125776879\"\u003epython 递归遍历目录下的所有文件_Joy-\u0026gt;Boy的博客-CSDN博客_python递归获取文件夹下所有文件\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"关于文件编码\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/2d8a/#%E5%85%B3%E4%BA%8E%E6%96%87%E4%BB%B6%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"关于文件编码\"\u003e\u003c/a\u003e关于文件编码\u003c/h2\u003e\u003cp\u003eb站上找到的这个视频挺好。\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.bilibili.com/video/BV1U5411d7FB\"\u003e「烫烫屯屯锟斤拷」揭秘ASCII、GBK、UTF-8,B站独家,一听就懂\u003c/a\u003e\u003c/p\u003e\u003ciframe src=\"//player.bilibili.com/player.html?aid=468972234\u0026amp;bvid=BV1U5411d7FB\u0026amp;cid=715388833\u0026amp;page=1\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"\u003e \u003c/iframe\u003e\u003ch2 id=\"脚本\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/2d8a/#%E8%84%9A%E6%9C%AC\" class=\"headerlink\" title=\"脚本\"\u003e\u003c/a\u003e脚本\u003c/h2\u003e\u003cp\u003e其实网上随便一搜就有好多,试了一个效果不错,但是只能转换根目录下的文件。于是我稍微做了点修改。\u003c/p\u003e\u003cp\u003e效果还是不错的\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003e运行结果\u003c/summary\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\" language-bash\" data-language=\"bash\"\u003e\u003ccode class=\" language-bash\"\u003e请输入要转换编码的文件夹路径:C:\\Demo_OLED_STM32F103RCT6_Software_IIC===============================================================fileName fileEncoding===============================================================core_cm3.c GB18030core_cm3.h GB18030iic.c GB18030iic.h GB18030bmp.h GB18030oled.c GB18030oled.h GB18030oledfont.h GB18030RTE_Components.h GB18030misc.h GB18030stm32f10x_adc.h GB18030stm32f10x_bkp.h GB18030stm32f10x_can.h GB18030stm32f10x_cec.h GB18030stm32f10x_crc.h GB18030stm32f10x_dac.h GB18030stm32f10x_dbgmcu.h GB18030stm32f10x_dma.h GB18030stm32f10x_exti.h GB18030stm32f10x_flash.h GB18030stm32f10x_fsmc.h GB18030stm32f10x_gpio.h GB18030stm32f10x_i2c.h GB18030stm32f10x_iwdg.h GB18030stm32f10x_pwr.h GB18030stm32f10x_rcc.h GB18030stm32f10x_rtc.h GB18030stm32f10x_sdio.h GB18030stm32f10x_spi.h GB18030stm32f10x_tim.h GB18030stm32f10x_usart.h GB18030stm32f10x_wwdg.h GB18030misc.c GB18030stm32f10x_adc.c GB18030stm32f10x_bkp.c GB18030stm32f10x_can.c GB18030stm32f10x_cec.c GB18030stm32f10x_crc.c GB18030stm32f10x_dac.c GB18030stm32f10x_dbgmcu.c GB18030stm32f10x_dma.c GB18030stm32f10x_exti.c GB18030stm32f10x_flash.c GB18030stm32f10x_fsmc.c GB18030stm32f10x_gpio.c GB18030stm32f10x_i2c.c GB18030stm32f10x_iwdg.c GB18030stm32f10x_pwr.c GB18030stm32f10x_rcc.c GB18030stm32f10x_rtc.c GB18030stm32f10x_sdio.c GB18030stm32f10x_spi.c GB18030stm32f10x_tim.c GB18030stm32f10x_usart.c GB18030stm32f10x_wwdg.c GB18030delay.c GB18030delay.h GB18030sys.c GB18030sys.h GB18030gui.c GB18030gui.h GB18030main.c GB18030stm32f10x.h GB18030stm32f10x_conf.h GB18030stm32f10x_it.c GB18030stm32f10x_it.h GB18030system_stm32f10x.c GB18030system_stm32f10x.h GB18030test.c GB18030test.h GB18030---------错误统计------------共0个错误!-----------------------------\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003c/details\u003e\u003cimg src=\"https://yun.ksfu.top/blog/gb2312/2.webp\" style=\"zoom:67%;\"/\u003e\u003cp\u003e直接打开,舒服了\u003cspan class=\"diana_bixin\"\u003e\u003c/span\u003e\u003c/p\u003e\u003ch3 id=\"代码\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/2d8a/#%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"代码\"\u003e\u003c/a\u003e代码\u003c/h3\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-python\" data-language=\"python\"\u003e\u003ccode class=\"language-python\"\u003e\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e os\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e codecsgErrArray \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token keyword\"\u003edef\u003c/span\u003e \u003cspan class=\"token function\"\u003econvert\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efileName\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e filePath\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e out_enc\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;utf-8\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003etry\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e content \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e codecs\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efilePath\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;rb\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eread\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# 直接设置GB18030编码节省时间\u003c/span\u003e source_encoding \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;GB18030\u0026#39;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;{0:50}{1}\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token builtin\"\u003eformat\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efileName\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e source_encoding\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e source_encoding \u003cspan class=\"token operator\"\u003e!=\u003c/span\u003e \u003cspan class=\"token boolean\"\u003eNone\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e source_encoding \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e out_enc\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e content \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e content\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003edecode\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003esource_encoding\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eencode\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eout_enc\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e codecs\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efilePath\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;wb\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003econtent\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e gErrArray\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eappend\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;can not recgonize file encoding %s\u0026#34;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e%\u003c/span\u003e filePath\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eexcept\u003c/span\u003e Exception \u003cspan class=\"token keyword\"\u003eas\u003c/span\u003e err\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e gErrArray\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eappend\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;%s:%s\u0026#34;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e%\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efilePath\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e err\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003edef\u003c/span\u003e \u003cspan class=\"token function\"\u003eshow_files\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebase_path\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token triple-quoted-string string\"\u003e\u0026#34;\u0026#34;\u0026#34; 遍历当前目录所有py文件及文件夹 :param path: :param all_files: :return: \u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e file_list \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e os\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003elistdir\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebase_path\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# 准备循环判断每个元素是否是文件夹还是文件,是文件的话,把名称传入list,是文件夹的话,递归\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e \u003cspan class=\"token builtin\"\u003efile\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e file_list\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# 利用os.path.join()方法取得路径全名,并存入cur_path变量,否则每次只能遍历一层目录\u003c/span\u003e cur_path \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e os\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003epath\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ejoin\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebase_path\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token builtin\"\u003efile\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# 判断是否是文件夹\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e os\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003epath\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eisdir\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecur_path\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e show_files\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecur_path\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e suffix \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e os\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003epath\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003esplitext\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003efile\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e suffix \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;.h\u0026#39;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e suffix \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;.c\u0026#39;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e suffix \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;.cpp\u0026#39;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e suffix \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;.hpp\u0026#39;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e suffix \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;.bat\u0026#39;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e suffix \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;.java\u0026#39;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e suffix \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;.txt\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e convert\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003efile\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e cur_path\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003edef\u003c/span\u003e \u003cspan class=\"token function\"\u003emain\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token comment\"\u003e#explore(os.getcwd())\u003c/span\u003e filePath \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token builtin\"\u003einput\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;请输入要转换编码的文件夹路径: \\n\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;\\r\\n===============================================================\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;{0:50}{1}\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token builtin\"\u003eformat\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;fileName\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;fileEncoding\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;===============================================================\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e show_files\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efilePath\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;\\r\\n---------错误统计------------\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e index\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e item \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eenumerate\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003egErrArray\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eitem\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;\\r\\n共%d个错误!\u0026#39;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e%\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003elen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003egErrArray\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003elen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003egErrArray\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;请检查错误文件手动修改编码\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;\\r\\n-----------------------------\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e __name__ \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;__main__\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e main\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/2d8a/"},{"title":"STM32使用SysTick定时器延时","time":"2022-07-27T18:42:15Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"STM32使用SysTick定时器延时\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#STM32%E4%BD%BF%E7%94%A8SysTick%E5%AE%9A%E6%97%B6%E5%99%A8%E5%BB%B6%E6%97%B6\" class=\"headerlink\" title=\"STM32使用SysTick定时器延时\"\u003e\u003c/a\u003eSTM32使用SysTick定时器延时\u003c/h1\u003e\u003cp\u003e最近在学习Stm32 HAL库相关教程\u003cdel\u003e(之前都是xjb缝合,缺少点原理的理解\u003c/del\u003e,在看到TM1640(一个可以方便在数码管上显示内容的模块)驱动编写的过程需要用到us 级别的延时,而HAL 库的 \u003ccode\u003eHal_Dealy()\u003c/code\u003e 的函数是ms 级别的,所以需要自己手动编写一个更精准的延时函数。看教程里几行不知所云,在搜索过程中大概了解到了几种写发,但是感觉比较优雅的是使用 \u003cstrong\u003eSysTick定时器\u003c/strong\u003e 进行延时。但是几篇教程在原理处比较简略,所以根据个人理解学习了一下。\u003c/p\u003e\u003ch2 id=\"参考目录\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E5%8F%82%E8%80%83%E7%9B%AE%E5%BD%95\" class=\"headerlink\" title=\"参考目录\"\u003e\u003c/a\u003e参考目录\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e《ARM Cortex-M3 权威指南》第3版\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/Fireflycjd/p/14304902.html\"\u003eSTM32延时函数的四种方法 - Fireflycjd - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/xuqu607/p/13737040.html\"\u003eSTM32的SysTick延时方法 - 代码争霸 - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/Leisure_ksj/article/details/105273110\"\u003eSTM32学习心得九:Systick滴答定时器和延时函数解读_天亮继续睡的博客-CSDN博客\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/haha690/article/details/111053367\"\u003estm32的systick(滴答定时器)实现精准延时_haha690的博客-CSDN博客_stm32精准定时\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://weibo01.blog.csdn.net/article/details/81136564\"\u003eSTM32延时函数的四种方法:普通延时(2种)、SysTick 定时器延时(2种)_魏波-的博客-CSDN博客_delayms延时函数用法\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://waka-can.blog.csdn.net/article/details/106527001?spm=1001.2014.3001.5506\"\u003e关于STM32单片机延时微妙(delay_us)函数-hal库_好奇龙猫的博客-CSDN博客_delay_us\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/Firefly_cjd/article/details/106709259?spm=1001.2014.3001.5506\"\u003eSTM32延时函数的四种方法_strongercjd的博客-CSDN博客_stm32延时函数\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://shequ.stmicroelectronics.cn/forum.php?mod=viewthread\u0026amp;tid=628767\"\u003eSTM32高精度延时实验 (stmicroelectronics.cn)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"几种延时方法\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E5%87%A0%E7%A7%8D%E5%BB%B6%E6%97%B6%E6%96%B9%E6%B3%95\" class=\"headerlink\" title=\"几种延时方法\"\u003e\u003c/a\u003e几种延时方法\u003c/h2\u003e\u003cp\u003e第一种比较粗暴,就是让单片机做一些无关紧要的工作来打发时间,比如写点循环;\u003c/p\u003e\u003cp\u003e第二种是用汇编指令,和第一种大同小异;\u003c/p\u003e\u003cp\u003e第三种是使用SysTick滴答定时器,但是是采取 \u003cstrong\u003e中断\u003c/strong\u003e 的方式;\u003c/p\u003e\u003cp\u003e第四种是使用SysTick滴答定时器,但是是采取 \u003cstrong\u003e查询\u003c/strong\u003e 的方式,也就是 \u003cstrong\u003e本次使用的方法\u003c/strong\u003e ;\u003c/p\u003e\u003cp\u003e……(前三种可以在参考目录找到具体实现\u003c/p\u003e\u003ch2 id=\"SysTick-定时器\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#SysTick-%E5%AE%9A%E6%97%B6%E5%99%A8\" class=\"headerlink\" title=\"SysTick 定时器\"\u003e\u003c/a\u003eSysTick 定时器\u003c/h2\u003e\u003ch3 id=\"简介\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E7%AE%80%E4%BB%8B\" class=\"headerlink\" title=\"简介\"\u003e\u003c/a\u003e简介\u003c/h3\u003e\u003cp\u003e详细资料可以阅读 《ARM Cortex-M3 权威指南》第3版 9.5 SysTick 定时器。\u003c/p\u003e\u003cp\u003eSysTick 定时器是 Cortex-M 处理器内部集成的一个小型定时器,属于NVIC 的一部分,可以产生SysTick 异常。SysTick 为简单的向下计数的24位计数器,可以使用处理器时钟或者外部时钟。\u003c/p\u003e\u003cp\u003eSysTick 定时器可用作简单的定时器外设,用以产生周期性中断,延时或时间测量。\u003c/p\u003e\u003ch3 id=\"SyTick-定时器的寄存器\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#SyTick-%E5%AE%9A%E6%97%B6%E5%99%A8%E7%9A%84%E5%AF%84%E5%AD%98%E5%99%A8\" class=\"headerlink\" title=\"SyTick 定时器的寄存器\"\u003e\u003c/a\u003eSyTick 定时器的寄存器\u003c/h3\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e地址\u003c/th\u003e\u003cth\u003eCMSIS-Core 符号\u003c/th\u003e\u003cth\u003e寄存器\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e0xE000E010\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eSysTick -\u0026gt; CTRL\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eSysTick 控制和状态寄存器\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e0xE000E014\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eSysTick -\u0026gt; LOAD\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eSysTick 重装值寄存器\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e0xE000E018\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eSysTick -\u0026gt; VAL\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eSysTick 当前值寄存器\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e0xE000E01C\u003c/td\u003e\u003ctd\u003e\u003ccode\u003eSysTick -\u0026gt; CALIB\u003c/code\u003e\u003c/td\u003e\u003ctd\u003eSysTick 校准值寄存器\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch4 id=\"SysTick-控制和状态寄存器(SysTick-gt-CTRL)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#SysTick-%E6%8E%A7%E5%88%B6%E5%92%8C%E7%8A%B6%E6%80%81%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%88SysTick-gt-CTRL%EF%BC%89\" class=\"headerlink\" title=\"SysTick 控制和状态寄存器(SysTick -\u0026gt; CTRL)\"\u003e\u003c/a\u003eSysTick 控制和状态寄存器(\u003ccode\u003eSysTick -\u0026gt; CTRL\u003c/code\u003e)\u003c/h4\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e位段\u003c/th\u003e\u003cth\u003e名称\u003c/th\u003e\u003cth\u003e类型\u003c/th\u003e\u003cth\u003e复位值\u003c/th\u003e\u003cth\u003e描述\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e16\u003c/td\u003e\u003ctd\u003eCOUNTFLAG\u003c/td\u003e\u003ctd\u003eRO\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e当SYSTICK 定时器计数到0时,该位变成1,读取寄存器或清除计数器当前值会被清零\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e2\u003c/td\u003e\u003ctd\u003eCLKSOURCE\u003c/td\u003e\u003ctd\u003eR/W\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e0 = 外部参考时钟(STCLK);\u003cbr/\u003e1 = 使用内核时钟\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e1\u003c/td\u003e\u003ctd\u003eTOCKINT\u003c/td\u003e\u003ctd\u003eR/W\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e1 = SYSTICK 定时器计数减至0时产生异常 \u003cbr/\u003e0 = 不产生异常\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003eENABLE\u003c/td\u003e\u003ctd\u003eR/W\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003eSYSTICK 定时器使能\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch4 id=\"SysTick-重装值寄存器(SysTick-gt-LOAD)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#SysTick-%E9%87%8D%E8%A3%85%E5%80%BC%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%88SysTick-gt-LOAD%EF%BC%89\" class=\"headerlink\" title=\"SysTick 重装值寄存器(SysTick -\u0026gt; LOAD)\"\u003e\u003c/a\u003eSysTick 重装值寄存器(\u003ccode\u003eSysTick -\u0026gt; LOAD\u003c/code\u003e)\u003c/h4\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e位\u003c/th\u003e\u003cth\u003e名称\u003c/th\u003e\u003cth\u003e类型\u003c/th\u003e\u003cth\u003e复位值\u003c/th\u003e\u003cth\u003e描述\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e23: 0\u003c/td\u003e\u003ctd\u003eRELOAD\u003c/td\u003e\u003ctd\u003eR/W\u003c/td\u003e\u003ctd\u003e未定义\u003c/td\u003e\u003ctd\u003e定时器为0时的重装载值\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch4 id=\"SysTick-当前值寄存器(SysTick-gt-VAL)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#SysTick-%E5%BD%93%E5%89%8D%E5%80%BC%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%88SysTick-gt-VAL%EF%BC%89\" class=\"headerlink\" title=\"SysTick 当前值寄存器(SysTick -\u0026gt; VAL)\"\u003e\u003c/a\u003eSysTick 当前值寄存器(\u003ccode\u003eSysTick -\u0026gt; VAL\u003c/code\u003e)\u003c/h4\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e位\u003c/th\u003e\u003cth\u003e名称\u003c/th\u003e\u003cth\u003e类信\u003c/th\u003e\u003cth\u003e复位值\u003c/th\u003e\u003cth\u003e描述\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e23: 0\u003c/td\u003e\u003ctd\u003eCURRENT\u003c/td\u003e\u003ctd\u003eR/Wc\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e读出值位SYSTICK 定时器的当前数值。写入任何值都会清除寄存器,SYSTICK 控制和状态寄存器中的 COUNTFLAG 也会清零\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch4 id=\"SysTick-校准值寄存器(SysTick-gt-CALIB)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#SysTick-%E6%A0%A1%E5%87%86%E5%80%BC%E5%AF%84%E5%AD%98%E5%99%A8%EF%BC%88SysTick-gt-CALIB%EF%BC%89\" class=\"headerlink\" title=\"SysTick 校准值寄存器(SysTick -\u0026gt; CALIB)\"\u003e\u003c/a\u003eSysTick 校准值寄存器(\u003ccode\u003eSysTick -\u0026gt; CALIB\u003c/code\u003e)\u003c/h4\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e位\u003c/th\u003e\u003cth\u003e名称\u003c/th\u003e\u003cth\u003e类型\u003c/th\u003e\u003cth\u003e复位值\u003c/th\u003e\u003cth\u003e描述\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e31\u003c/td\u003e\u003ctd\u003eNOREF\u003c/td\u003e\u003ctd\u003eR\u003c/td\u003e\u003ctd\u003e-\u003c/td\u003e\u003ctd\u003e1 = 没有外部参考时钟(STCLK 不可用)\u003cbr/\u003e0 = 有外部参考时钟可供使用\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e30\u003c/td\u003e\u003ctd\u003eSKEW\u003c/td\u003e\u003ctd\u003eR\u003c/td\u003e\u003ctd\u003e-\u003c/td\u003e\u003ctd\u003e1= 校准值并非精准的 10ms\u003cbr/\u003e0 = 校准值准确\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e23: 0\u003c/td\u003e\u003ctd\u003eTENMS\u003c/td\u003e\u003ctd\u003eR/W\u003c/td\u003e\u003ctd\u003e0\u003c/td\u003e\u003ctd\u003e10毫秒校准值。芯片设计者应通过 Cortex-M3 的输入信号提供该数值,若读出为0,则表示校准值不可用。\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch3 id=\"使用-SysTick-定时器\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E4%BD%BF%E7%94%A8-SysTick-%E5%AE%9A%E6%97%B6%E5%99%A8\" class=\"headerlink\" title=\"使用 SysTick 定时器\"\u003e\u003c/a\u003e使用 SysTick 定时器\u003c/h3\u003e\u003ch4 id=\"主要流程\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E4%B8%BB%E8%A6%81%E6%B5%81%E7%A8%8B\" class=\"headerlink\" title=\"主要流程\"\u003e\u003c/a\u003e主要流程\u003c/h4\u003e\u003cp\u003e本次使用查询的方式。\u003c/p\u003e\u003col\u003e\u003cli\u003e将0写入 \u003ccode\u003eSysTick -\u0026gt; CTRL\u003c/code\u003e 禁止 SysTick 定时器,防止之前 SysTick 定时器在之前被使能过;\u003c/li\u003e\u003cli\u003e将新的重加载值写入 \u003ccode\u003eSysTick -\u0026gt; LOAD\u003c/code\u003e ,重加载值应为周期数减1(因为是倒数到0);\u003c/li\u003e\u003cli\u003e将任何数值写入 SysTick 当前值寄存器 \u003ccode\u003eSysTick -\u0026gt; VAL\u003c/code\u003e ,该寄存器会被清零;\u003c/li\u003e\u003cli\u003e写入 SysTick 控制和状态寄存器 \u003ccode\u003eSysTick -\u0026gt; CTRL\u003c/code\u003e 启动寄存器\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"延时原理\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E5%BB%B6%E6%97%B6%E5%8E%9F%E7%90%86\" class=\"headerlink\" title=\"延时原理\"\u003e\u003c/a\u003e延时原理\u003c/h4\u003e\u003cp\u003e利用SysTick 控制和状态寄存器 \u003ccode\u003eSysTick -\u0026gt; CTRL\u003c/code\u003e 中的 \u003cstrong\u003e计数标志位\u003c/strong\u003e 来确定定时器合适变为0.可以设置 \u003ccode\u003eSysTick -\u0026gt; LOAD\u003c/code\u003e 的值,然后等待计数标志位变为0,以此实现延时。\u003c/p\u003e\u003cp\u003e示例代码\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e//禁止 SysTick 定时器\u003c/span\u003eSysTick \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e CTRL \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//设置计数周期为256 (255~0)\u003c/span\u003eSysTick \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e LOAD \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0XFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 清零当前值寄存器\u003c/span\u003eSysTick \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e VAL \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 5 = b\u0026#39;101\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 位0 = 1 为使能SYSTICK定时器\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 位2 = 1 表示使用内核时钟\u003c/span\u003eSysTick \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e CTRL \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 0x00010000 = 1\u0026lt;\u0026lt;16\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 通过查询 SysTick -\u0026gt; CTRL 第16位标志位判断计数器是否计数到0\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eSysTick \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e CTRL \u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x00010000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//禁止 SysTick 定时器\u003c/span\u003eSysTick \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e CTRL \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"进行-us-级别延时\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E8%BF%9B%E8%A1%8C-us-%E7%BA%A7%E5%88%AB%E5%BB%B6%E6%97%B6\" class=\"headerlink\" title=\"进行 us 级别延时\"\u003e\u003c/a\u003e进行 us 级别延时\u003c/h3\u003e\u003ch4 id=\"关于时钟\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E5%85%B3%E4%BA%8E%E6%97%B6%E9%92%9F\" class=\"headerlink\" title=\"关于时钟\"\u003e\u003c/a\u003e关于时钟\u003c/h4\u003e\u003cp\u003e本次选用外部时钟。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e对于STM32,外部时钟源是HCLK(AHB总线时钟)的1/8,内核时钟是HCLK时钟\u003c/strong\u003e ;\u003c/p\u003e\u003cp\u003e)可以翻出来 CubeMX 的时钟树看一眼\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/mg995/4.webp\"/\u003e\u003c/p\u003e\u003cp\u003e以f103 为例,这里HCLK 为72MHz,那么SYSTICK 的时钟为9MHz,即 \u003cstrong\u003eSYSTICK定时器以9MHz的频率递减\u003c/strong\u003e 。\u003c/p\u003e\u003ch4 id=\"计算\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E8%AE%A1%E7%AE%97\" class=\"headerlink\" title=\"计算\"\u003e\u003c/a\u003e计算\u003c/h4\u003e\u003cp\u003e如果要获取 \u003cstrong\u003eN\u003c/strong\u003eus的延迟,那么我们需要计算出 \u003ccode\u003eSysTick -\u0026gt; LOAD\u003c/code\u003e ,即重加载值\u003c/p\u003e\u003cp\u003e容易得到:\u003c/p\u003e\u003cp\u003e$1s = 10^6us$\u003c/p\u003e\u003cp\u003e$$Nus=T\\times LOAD=\\frac{LOAD}{SYSTICK}\\times 10^6$$\u003c/p\u003e\u003cp\u003e$$LOAD=Nus\\times SysTick \\times 10^{-6}$$\u003c/p\u003e\u003cp\u003e已知有:\u003c/p\u003e\u003cp\u003e$HCLK=72MHz$\u003c/p\u003e\u003cp\u003e$SYSTICK=9MHz$\u003c/p\u003e\u003cp\u003e代入具体数值可以得到:\u003c/p\u003e\u003cp\u003e$LOAD=Nus\\times9\\times 10^6\\times 10^{-6}$\u003c/p\u003e\u003cp\u003e最后得到\u003c/p\u003e\u003cp\u003e$$LOAD=Nus\\times9$$\u003c/p\u003e\u003ch4 id=\"72M主频代码\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#72M%E4%B8%BB%E9%A2%91%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"72M主频代码\"\u003e\u003c/a\u003e72M主频代码\u003c/h4\u003e\u003cp\u003e\u003cdel\u003e)博客里面xjb找了一段\u003c/del\u003e\u003c/p\u003e\u003ch5 id=\"us级延时\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#us%E7%BA%A7%E5%BB%B6%E6%97%B6\" class=\"headerlink\" title=\"us级延时\"\u003e\u003c/a\u003eus级延时\u003c/h5\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e/*采用SysTick定时器位16标志位读取方式做延时(程序起始处)*/\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e nus\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//us级延时\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e temp\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eLOAD\u003cspan class=\"token operator\"\u003e=\u003c/span\u003enus\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token number\"\u003e9\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eVAL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//清空计数器\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//使能,减到零时无动作,采用外部时钟源\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 当计数器的值减小到 0 的时候, CRTL 寄存器的位 16 会置 1\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 当置 1 时,读取该位会清 0\u003c/span\u003e \u003cspan class=\"token keyword\"\u003edo\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e temp\u003cspan class=\"token operator\"\u003e=\u003c/span\u003eSysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etemp\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e!\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etemp\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 等待时间到达\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//关闭计数器\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eVal\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//清空计数器\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token comment\"\u003e/*采用SysTick定时器位16标志位读取方式做延时(程序结束处)*/\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch5 id=\"ms级延时\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#ms%E7%BA%A7%E5%BB%B6%E6%97%B6\" class=\"headerlink\" title=\"ms级延时\"\u003e\u003c/a\u003ems级延时\u003c/h5\u003e\u003cp\u003e循环1000次即可\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_ms\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e nms\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e i\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e++\u003c/span\u003ei\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003enms\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"更通用一点的代码\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E6%9B%B4%E9%80%9A%E7%94%A8%E4%B8%80%E7%82%B9%E7%9A%84%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"更通用一点的代码\"\u003e\u003c/a\u003e更通用一点的代码\u003c/h3\u003e\u003cp\u003e上面那个 \u003ccode\u003eSysTick-\u0026gt;LOAD=nus*9;\u003c/code\u003e 的9是手动算出来的,一般情况下主频是很容易知道的,那直接用主频自动算出这个数字就更方便了\u003c/p\u003e\u003cp\u003e再次回到上面的式子\u003c/p\u003e\u003cp\u003e记系统时钟 $SYSCLK \\ Mhz$\u003c/p\u003e\u003cp\u003e$SYSTICK=SYSCLK\\div9 \\ Mhz$\u003c/p\u003e\u003cp\u003e$$Nus=T\\times LOAD=\\frac{LOAD}{SYSTICK\\times10^6}\\times 10^6=\\frac{LOAD}{SYSTICK}$$\u003c/p\u003e\u003cp\u003e$$LOAD=Nus\\times SYSTICK$$\u003c/p\u003e\u003cp\u003e这样可以在代码中定义一个延时倍乘数 \u003ccode\u003efac_us\u003c/code\u003e\u003c/p\u003e\u003cp\u003e$fac_\\ us=SYSCLK\\div8$\u003c/p\u003e\u003ch3 id=\"代码\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"代码\"\u003e\u003c/a\u003e代码\u003c/h3\u003e\u003cp\u003e代码分为两步\u003c/p\u003e\u003col\u003e\u003cli\u003e配置 \u003ccode\u003eSYSTICK\u003c/code\u003e 为\u003ccode\u003eSYSCLK\u003c/code\u003e 的$\\frac{1}{8}$ ,并计算出延时倍乘数 \u003ccode\u003efac_us\u003c/code\u003e\u003c/li\u003e\u003cli\u003e采用SysTick定时器位16标志位读取方式做延时\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cstrong\u003e还要记得在头文件包含 \u003ccode\u003estm32f1xx.h\u003c/code\u003e\u003c/strong\u003e (以f103为例)\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003edealy.c\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003estatic\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e fac_us\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//us延时倍乘数\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 初始化延迟函数\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// SYSTICK的时钟固定为AHB时钟的1/8\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// SYSCLK:系统时钟频率\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_init\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e SYSCLK\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_SYSTICK_CLKSourceConfig\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eSYSTICK_CLKSOURCE_HCLK_DIV8\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//配置SYSTICK \u003c/span\u003efac_us\u003cspan class=\"token operator\"\u003e=\u003c/span\u003eSYSCLK\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e8\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//采用SysTick定时器位16标志位读取方式做延时(程序起始处)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//us级延时\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e nus\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e temp\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eLOAD\u003cspan class=\"token operator\"\u003e=\u003c/span\u003enus\u003cspan class=\"token operator\"\u003e*\u003c/span\u003efac_us\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eVAL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//清空计数器\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//使能,减到零时无动作,采用外部时钟源\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 当计数器的值减小到 0 的时候, CRTL 寄存器的位 16 会置 1\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 当置 1 时,读取该位会清 0\u003c/span\u003e \u003cspan class=\"token keyword\"\u003edo\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e temp\u003cspan class=\"token operator\"\u003e=\u003c/span\u003eSysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etemp\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e!\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etemp\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 等待时间到达\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//关闭计数器\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eVAL\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x00\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//清空计数器\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//采用SysTick定时器位16标志位读取方式做延时(程序结束处)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//ms级延时\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_ms\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e nms\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e i\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ei\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e++\u003c/span\u003ei\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003enms\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e\u003cstrong\u003e\u003ccode\u003edelay.h\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;stm32f1xx.h\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_init\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e SYSCLK\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_us\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e nus\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003edelay_ms\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e nms\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cblockquote\u003e\u003cp\u003e \u003cstrong\u003e函数 \u003ccode\u003eHAL_SYSTICK_CLKSourceConfig()\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e/** * @brief Configures the SysTick clock source. * @param CLKSource specifies the SysTick clock source. * This parameter can be one of the following values: * @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. * @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source. * @retval None */\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_SYSTICK_CLKSourceConfig\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e CLKSource\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* Check the parameters */\u003c/span\u003e \u003cspan class=\"token function\"\u003eassert_param\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token function\"\u003eIS_SYSTICK_CLK_SOURCE\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eCLKSource\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eCLKSource \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e SYSTICK_CLKSOURCE_HCLK\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL \u003cspan class=\"token operator\"\u003e|=\u003c/span\u003e SYSTICK_CLKSOURCE_HCLK\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e SysTick\u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003eCTRL \u003cspan class=\"token operator\"\u003e\u0026amp;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eSYSTICK_CLKSOURCE_HCLK\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003c/blockquote\u003e\u003ch2 id=\"总结\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/463a/#%E6%80%BB%E7%BB%93\" class=\"headerlink\" title=\"总结\"\u003e\u003c/a\u003e总结\u003c/h2\u003e\u003cp\u003e最后看下来就是 \u003cstrong\u003e设置重装载值,使能,检查标志位\u003c/strong\u003e 这三个步骤。\u003c/p\u003e\u003cp\u003e还有就是书上讲的是比较清楚详细的。\u003cspan class=\"diana_jiayou\"\u003e\u003c/span\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/463a/"},{"title":"使用FRP和OpenVPN实现校园网内网穿透","time":"2022-05-11T16:52:34Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"使用FRP和OpenVPN实现校园网内网穿透\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#%E4%BD%BF%E7%94%A8FRP%E5%92%8COpenVPN%E5%AE%9E%E7%8E%B0%E6%A0%A1%E5%9B%AD%E7%BD%91%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F\" class=\"headerlink\" title=\"使用FRP和OpenVPN实现校园网内网穿透\"\u003e\u003c/a\u003e使用FRP和OpenVPN实现校园网内网穿透\u003c/h1\u003e\u003cp\u003e)因为手头闲置了一台腾讯云小水管,树莓派3b也没啥任务,就准备尝试一下内网穿透校园网。(学校自己的VPN也能用。)\u003c/p\u003e\u003cul\u003e\u003cli\u003e公网云服务器:运行FRP服务端\u003c/li\u003e\u003cli\u003e公司内网服务器:运行FRP客户端、安装OpenVPN\u003c/li\u003e\u003cli\u003e手头的设备:安装OpenVPN客户端进行连接\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"参考链接\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\" class=\"headerlink\" title=\"参考链接\"\u003e\u003c/a\u003e参考链接\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://www.spacesafe.top/archives/1557\"\u003e使用FRP和OpenVPN实现内网穿透 – EI_’s Blog (spacesafe.top)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/kxwinxp/article/details/88428053\"\u003eCentOS下搭建Frp内网穿透服务_宁静致远kioye的博客-CSDN博客_centos frp\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.ywbj.cc/?p=663\"\u003eVPN设置,设置OpenVPN访问公司内网,图文详细 - 运维笔记(ywbj.cc)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"开个端口先\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#%E5%BC%80%E4%B8%AA%E7%AB%AF%E5%8F%A3%E5%85%88\" class=\"headerlink\" title=\"开个端口先\"\u003e\u003c/a\u003e开个端口先\u003c/h2\u003e\u003cp\u003e本次 frp 服务端监听 端口为 \u003cstrong\u003e\u003ccode\u003e11451\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\u003cp\u003eOpenVPN 使用端口为 \u003cstrong\u003e\u003ccode\u003e21194\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e所以 在腾讯云管理控制台先把这两个端口开了\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003efrp是一个可用于内网穿透的高性能的反向代理应用,支持tcp、udp协议,为http和https协议提供了额外的能力,且尝试性支持了点对点穿透。\u003c/p\u003e\u003cp\u003eFRP采用GO语言开发,支持windows linux MacOS 等多平台部署\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"安装-frp-服务端与客户端\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#%E5%AE%89%E8%A3%85-frp-%E6%9C%8D%E5%8A%A1%E7%AB%AF%E4%B8%8E%E5%AE%A2%E6%88%B7%E7%AB%AF\" class=\"headerlink\" title=\"安装 frp 服务端与客户端\"\u003e\u003c/a\u003e安装 frp 服务端与客户端\u003c/h2\u003e\u003cp\u003e因为网络问题选择先下载好再上传\u003c/p\u003e\u003cp\u003efrp 项目地址: \u003ca href=\"https://github.com/fatedier/frp/releases\"\u003eReleases · fatedier/frp (github.com)\u003c/a\u003e\u003c/p\u003e\u003ch3 id=\"服务端\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#%E6%9C%8D%E5%8A%A1%E7%AB%AF\" class=\"headerlink\" title=\"服务端\"\u003e\u003c/a\u003e服务端\u003c/h3\u003e\u003cp\u003e在云服务器上操作\u003c/p\u003e\u003cp\u003e找个地方解压出来,然后进入目录\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token function\"\u003etar\u003c/span\u003e zxf frp_0.42.0_linux_amd64.tar.gz\u003cspan class=\"token builtin class-name\"\u003ecd\u003c/span\u003e frp_0.42.0_linux_amd64/\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e修改 \u003ccode\u003efrps.ini\u003c/code\u003e 内容如下\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ecommon\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003ebind_port \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e11451\u003c/span\u003e\u003cspan class=\"token comment\"\u003e# 默认配置中监听的是 7000 端口,可根据自己实际情况修改。\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e启动 frp 服务端\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e./frps \u003cspan class=\"token parameter variable\"\u003e-c\u003c/span\u003e ./frps.ini\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"客户端\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#%E5%AE%A2%E6%88%B7%E7%AB%AF\" class=\"headerlink\" title=\"客户端\"\u003e\u003c/a\u003e客户端\u003c/h3\u003e\u003cp\u003e在树莓派上操作\u003c/p\u003e\u003cp\u003e找个地方解压出来,然后进入目录\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token function\"\u003etar\u003c/span\u003e zxf frp_0.42.0_linux_arm64.tar.gz\u003cspan class=\"token builtin class-name\"\u003ecd\u003c/span\u003e frp_0.42.0_linux_arm64/\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e修改 \u003ccode\u003efrps.ini\u003c/code\u003e 内容如下\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ecommon\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003eserver_addr \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e *.*.*.*\u003cspan class=\"token comment\"\u003e# * 改为 FRP 服务端的公网 IP\u003c/span\u003eserver_port \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e11451\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# 为 FRP 服务端监听端口 上面配置端口对应\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003evpn_test_tcp\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token builtin class-name\"\u003etype\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e tcp\u003cspan class=\"token comment\"\u003e#local_ip = 127.0.0.1\u003c/span\u003elocal_port \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1194\u003c/span\u003eremote_port \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e21194\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003evpn_test_udp\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token builtin class-name\"\u003etype\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e udp\u003cspan class=\"token comment\"\u003e#local_ip = 127.0.0.1\u003c/span\u003elocal_port \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1194\u003c/span\u003eremote_port \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e21194\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ecommon\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token comment\"\u003e# server_addr 为 FRP 服务端的公网 IP\u003c/span\u003eserver_addr \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e *.*.*.*\u003cspan class=\"token comment\"\u003e# server_port 为 FRP 服务端监听的端口\u003c/span\u003eserver_port \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e11451\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e启动 frp 客户端\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token comment\"\u003e# 先确保服务端启动了再启动客户端\u003c/span\u003e./frpc \u003cspan class=\"token parameter variable\"\u003e-c\u003c/span\u003e ./frpc.ini\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e这样 frp 服务端就可以建立一个客户端连接了\u003c/p\u003e\u003ch3 id=\"设置-frp-开机自启\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#%E8%AE%BE%E7%BD%AE-frp-%E5%BC%80%E6%9C%BA%E8%87%AA%E5%90%AF\" class=\"headerlink\" title=\"设置 frp 开机自启\"\u003e\u003c/a\u003e设置 frp 开机自启\u003c/h3\u003e\u003cp\u003e客户端服务端操作大同小异\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e注意:\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e客户端是 \u003cstrong\u003e\u003ccode\u003efrpc\u003c/code\u003e\u003c/strong\u003e 和 \u003cstrong\u003e\u003ccode\u003efrpc.ini\u003c/code\u003e\u003c/strong\u003e \u003c/p\u003e\u003cp\u003e服务端是 \u003cstrong\u003e\u003ccode\u003efrps\u003c/code\u003e\u003c/strong\u003e 和 \u003cstrong\u003e\u003ccode\u003efrps.ini\u003c/code\u003e\u003c/strong\u003e \u003c/p\u003e\u003cp\u003e创建后台启动模版(服务端为例)\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token function\"\u003evi\u003c/span\u003e /etc/systemd/system/frps.service\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e\u003ccode\u003eExecStart\u003c/code\u003e 根据自己放 \u003ccode\u003efrp\u003c/code\u003e 的目录选\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003eUnit\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token assign-left variable\"\u003eDescription\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003efrps\u003cspan class=\"token assign-left variable\"\u003eAfter\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003enetwork.target\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003eService\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token assign-left variable\"\u003eExecStart\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e/home/yk/frp/frps \u003cspan class=\"token parameter variable\"\u003e-c\u003c/span\u003e /home/yk/frp/frps.ini\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003eInstall\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token assign-left variable\"\u003eWantedBy\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003emulti-user.target\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token comment\"\u003e# 启动测试\u003c/span\u003esystemctl start frps.service\u003cspan class=\"token comment\"\u003e# 查看启动状态\u003c/span\u003esystemctl status frps.service\u003cspan class=\"token comment\"\u003e# 开机自启\u003c/span\u003esystemctl \u003cspan class=\"token builtin class-name\"\u003eenable\u003c/span\u003e frps.service\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch2 id=\"OpenVPN-配置\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#OpenVPN-%E9%85%8D%E7%BD%AE\" class=\"headerlink\" title=\"OpenVPN 配置\"\u003e\u003c/a\u003eOpenVPN 配置\u003c/h2\u003e\u003cp\u003e在树莓派上操作(与运行)\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e这里使用tun模式、tcp模式,比较容易搭建。手动搭建比较繁琐,我是直接使用一键搭建脚本。\u003c/p\u003e\u003cp\u003e脚本地址:\u003ca href=\"https://github.com/angristan/openvpn-install\"\u003ehttps://github.com/angristan/openvpn-install\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token function\"\u003ecurl\u003c/span\u003e \u003cspan class=\"token parameter variable\"\u003e-O\u003c/span\u003e https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh\u003cspan class=\"token function\"\u003echmod\u003c/span\u003e +x openvpn-install.sh\u003cspan class=\"token function\"\u003esudo\u003c/span\u003e ./openvpn-install.sh\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e因为这里我没截图,就用参考博客的图了\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/frp_openvpn/3.webp\" alt=\"3\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/frp_openvpn/4.webp\" alt=\"4\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/frp_openvpn/5.webp\" alt=\"5\"/\u003e\u003c/p\u003e\u003cp\u003e然后启动 OpenVPN\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-none\"\u003e\u003ccode class=\"language-none\"\u003e# 启动测试systemctl start openvpn.service# 查看启动状态systemctl status openvpn.service# 开机自启systemctl enable openvpn.service\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e在安装完成后,会生成一个以刚刚命名好的ovpn文件。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/frp_openvpn/6.webp\" alt=\"6\"/\u003e\u003c/p\u003e\u003cp\u003e把这玩意下载下来\u003c/p\u003e\u003cp\u003e然后用文本编辑器打开并修改一处(应该是第三行)\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003eremote xxx.xxx.xxx.xxx \u003cspan class=\"token number\"\u003e21194\u003c/span\u003e\u003cspan class=\"token comment\"\u003e#将默认的1194端口改成FRP转发端口21194(上面FRP客户端配置文件配置的)\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cblockquote\u003e\u003cp\u003e安装完成再次运行脚本,可选择 1)添加用户 2)移除已存在的用户 3)协助软件 4)退出\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"进行连接\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/24b6/#%E8%BF%9B%E8%A1%8C%E8%BF%9E%E6%8E%A5\" class=\"headerlink\" title=\"进行连接\"\u003e\u003c/a\u003e进行连接\u003c/h2\u003e\u003cp\u003e我是在手机上测试的\u003c/p\u003e\u003cp\u003e安装 OpenVPN 客户端,选择我们修改好的 ovpn 文件,连接\u003c/p\u003e\u003cp\u003e)就是速度嘛,理解万岁,看了看论坛还行\u003cspan class=\"carol_shuileshuile\"\u003e\u003c/span\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/24b6/"},{"title":"【fpga4fun】Music box","time":"2022-05-08T17:12:44Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"fpga4fun-Music-box\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#fpga4fun-Music-box\" class=\"headerlink\" title=\"[fpga4fun] Music box\"\u003e\u003c/a\u003e[fpga4fun] Music box\u003c/h1\u003e\u003cblockquote\u003e\u003cp\u003e还没整完。\u003c/p\u003e\u003cp\u003eUPDATE1 AT: 2022-12-22 继续完成了Music box 2 这一部分\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e因为在学校收了一块野火征途mini FPGA开发板,在看的是配套的视频教程。群里学长推荐我做一做 fpga4fun 上的东西,那就整一整 ~\u003c/p\u003e\u003ch2 id=\"简介\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#%E7%AE%80%E4%BB%8B\" class=\"headerlink\" title=\"简介\"\u003e\u003c/a\u003e简介\u003c/h2\u003e\u003cp\u003e这个项目是用 FPGA 驱动喇叭发出声音和音乐。\u003c/p\u003e\u003cp\u003e硬件连接为 FPGA 开发板,一个喇叭,一个 1kΩ 电阻。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://www.fpga4fun.com/images/MusicBox.jpg\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://www.fpga4fun.com/images/MusicBoxSchematic.gif\"/\u003e\u003c/p\u003e\u003ch2 id=\"Music-box-1-Simple-beep\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#Music-box-1-Simple-beep\" class=\"headerlink\" title=\"Music box 1 -Simple beep\"\u003e\u003c/a\u003eMusic box 1 -Simple beep\u003c/h2\u003e\u003ch3 id=\"计数与频率\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#%E8%AE%A1%E6%95%B0%E4%B8%8E%E9%A2%91%E7%8E%87\" class=\"headerlink\" title=\"计数与频率\"\u003e\u003c/a\u003e计数与频率\u003c/h3\u003e\u003cp\u003e一个16位的计数器,范围位 0 ~ 65535 共65536个值,如果板子的主频为 25M ,如果在上升沿计数(时钟是个方波),那么这个16位计数器最高位对应的频率便为 $25\\times10^6\\div65536=381Hz$ \u003cstrong\u003e(就是加到对应那一位变化之后算一次)\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e以此类推第15位为 $25\\times10^6\\div32768=762Hz$ , 第14位为 $25\\times10^6\\div16384=1525Hz$ …… 第2位为$25\\times10^6\\div4=6.25\\times10^6Hz$ , 第1位为$25\\times10^6\\div2=15.5\\times10^6Hz$\u003c/p\u003e\u003ch3 id=\"产生-A-的声音\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#%E4%BA%A7%E7%94%9F-A-%E7%9A%84%E5%A3%B0%E9%9F%B3\" class=\"headerlink\" title=\"产生 A 的声音\"\u003e\u003c/a\u003e产生 A 的声音\u003c/h3\u003e\u003cp\u003eA 的频率为 440Hz \u003c/p\u003e\u003cp\u003e以 25M 主频为例,产生440Hz可以先使用16位计数器,将 25M 分为 65536 份,此时计算出产生 440Hz 只需要计数到 56818 即可。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter\u003cspan class=\"token operator\"\u003e==\u003c/span\u003e\u003cspan class=\"token number\"\u003e56817\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e counter\u003cspan class=\"token operator\"\u003e+\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eassign\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e counter\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e但是这样的话,占空比就不是 50% 了,$b’1000\\ 0000\\ 0000\\ 0000=d’32768$ ,所以低电平为 0\u003cdel\u003e32767,高电平为 32768\u003c/del\u003e56818,占空比为42%\u003c/p\u003e\u003cp\u003e所以可以折中一下,然后每次翻转 \u003ccode\u003espeaker\u003c/code\u003e 的电平值 ,而且折中之后可以省一位计数器的值~\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e14\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter\u003cspan class=\"token operator\"\u003e==\u003c/span\u003e\u003cspan class=\"token number\"\u003e28408\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter\u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e counter\u003cspan class=\"token operator\"\u003e+\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter\u003cspan class=\"token operator\"\u003e==\u003c/span\u003e\u003cspan class=\"token number\"\u003e28408\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"实践\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#%E5%AE%9E%E8%B7%B5\" class=\"headerlink\" title=\"实践\"\u003e\u003c/a\u003e实践\u003c/h3\u003e\u003cp\u003e因为征途mini的主频为50M,所以用17位可以产生的时钟为 $(2\\times25\\times10^6)\\div(2\\times65536)=381Hz$\u003c/p\u003e\u003cp\u003e要产生440Hz,计数到 $56818\\times2=113636$ 即可。\u003c/p\u003e\u003cp\u003e使用翻转的方式,使用16位计数器,折中计数至 56818,同时加上了复位信号\u003c/p\u003e\u003cp\u003e主程序代码:\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token comment\"\u003e// music.v\u003c/span\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e music \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;d56817\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;d56817\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e仿真验证,\u003ccode\u003eTestbench\u003c/code\u003e 代码\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token comment\"\u003e// tb_music.v\u003c/span\u003e\u003cspan class=\"token constant\"\u003e`timescale\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e \u003cspan class=\"token function\"\u003etb_music\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e rst \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e#20\u003c/span\u003e rst \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#10\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003emusic music_inst\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eclk \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003erst \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003espeaker \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"仿真结果\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#%E4%BB%BF%E7%9C%9F%E7%BB%93%E6%9E%9C\" class=\"headerlink\" title=\"仿真结果\"\u003e\u003c/a\u003e仿真结果\u003c/h4\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/fpga4fun/0.png\" alt=\"0\"/\u003e\u003c/p\u003e\u003cp\u003e占空比 $4545450-3409090=1136360$ $3409090-2272730=1136360$ ,可以看出占空比确实为50% \u003c/p\u003e\u003cp\u003e频率 $\\frac{1}{4545450-2272730}\\times10^9=440Hz$\u003c/p\u003e\u003cp\u003e)因为我莫得喇叭,就先不上板子了……\u003c/p\u003e\u003chr/\u003e\u003cp\u003e\u003cdel\u003e剩下的等我学完……\u003c/del\u003e 下面的再更新一下 \u003cspan class=\"bella_beijixing\"\u003e\u003c/span\u003e\u003c/p\u003e\u003ch3 id=\"添加参数\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#%E6%B7%BB%E5%8A%A0%E5%8F%82%E6%95%B0\" class=\"headerlink\" title=\"添加参数\"\u003e\u003c/a\u003e添加参数\u003c/h3\u003e\u003cp\u003e添加了一个名字叫 \u003ccode\u003eclkdivider\u003c/code\u003e 的参数,方便之后的修改。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token comment\"\u003e// music.v\u003c/span\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e music #\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eparameter\u003c/span\u003e clkdivider \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e50000000\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e440\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e clkdivider\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e clkdivider\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token comment\"\u003e// testbench.v\u003c/span\u003e\u003cspan class=\"token constant\"\u003e`timescale\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e \u003cspan class=\"token function\"\u003etb_music\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eparameter\u003c/span\u003e clkdivider \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e50000000\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e440\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e rst \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e#20\u003c/span\u003e rst \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#10\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003emusic #\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003eclkdivider\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eclkdivider\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003emusic_inst \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eclk \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003erst \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003espeaker \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch2 id=\"Music-box-2-Ambulance-siren\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#Music-box-2-Ambulance-siren\" class=\"headerlink\" title=\"Music box 2 - Ambulance siren\"\u003e\u003c/a\u003eMusic box 2 - Ambulance siren\u003c/h2\u003e\u003cp\u003e这次在两种音调之间交替。首先使用24位计数器 \u003ccode\u003etone\u003c/code\u003e 来产生一个缓慢的方波,其最高位(MSB)以1.5Hz的频率进行切换。然后我们在这两个频率之间切换另一个计数器。这样就发出了类似救护车警报一类的声音。\u003c/p\u003e\u003cp\u003e先产生一个1.5Hz的信号 \u003ccode\u003etone\u003c/code\u003e ,此时计数器 \u003ccode\u003ecounter\u003c/code\u003e 为向下计数,当 \u003ccode\u003ecounter\u003c/code\u003e 为0时,如果 \u003ccode\u003etone\u003c/code\u003e 为1,继续产生440Hz的信号,当 \u003ccode\u003etone\u003c/code\u003e 为0时,产生220Hz。这两个频率的信号以1.5Hz的频率交替出现。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token comment\"\u003e// ambulance.v\u003c/span\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e music #\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eparameter\u003c/span\u003e clkdivider \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e50000000\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e440\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// MSB 1.5Hz变动一次\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e tone \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e25\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e tone \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e tone\u003cspan class=\"token operator\"\u003e+\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 计数器为0,说明当前频率已产生完毕,切换下一个\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 根据tone的MSB是否有值来确定\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 如果tone的MSB为0,则切换为220Hz的声音\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 如果tone的MSB为1,则切换为440Hz的声音\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token operator\"\u003e?\u003c/span\u003eclkdivider\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e clkdivider\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e-\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"Police-siren\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#Police-siren\" class=\"headerlink\" title=\"Police siren\"\u003e\u003c/a\u003ePolice siren\u003c/h3\u003e\u003cp\u003e接下来是生成一个听起来像警笛的声音。这个声音听着是又小逐渐变大的这种,之前声音像跳楼梯,这次的像上坡。\u003c/p\u003e\u003cp\u003e我们将音调计数器 \u003ccode\u003etone\u003c/code\u003e 的速度提高一倍,变为3Hz。\u003c/p\u003e\u003cp\u003e然后,就开始升频操作。我们提取音调计数器的16位到第22位:\u003ccode\u003etone[22:16]\u003c/code\u003e。这样我们得到了7bit,并且以一个中等速度从0~127,到达127后,再从127~0。\u003c/p\u003e\u003cp\u003e为了得到一个向下的斜坡,将其进行翻转(\u003ccode\u003e~tone[22:16]\u003c/code\u003e),此时从127~0。\u003c/p\u003e\u003cp\u003e为了切换上下这两个通道,同上面一样,我们根据 MSB \u003ccode\u003etone[23]\u003c/code\u003e 的值进行选择,3Hz切换一次。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e ramp \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e23\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e?\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cblockquote\u003e\u003cp\u003ewire表示直通,即只要输入有变化,输出马上无条件地反映;reg表示一定要有触发,输出才会反映输入。(\u003ca href=\"https://zhuanlan.zhihu.com/p/482748824\"\u003e【Verilog HDL】Verilog中wire与reg类型学习 - 知乎 (zhihu.com)\u003c/a\u003e)\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e这样做的意义:\u003ca href=\"https://www.fpga4fun.com/MusicBox_ramp_explanation.html\"\u003efpga4fun.com - Music box siren ramp\u003c/a\u003e 。\u003c/p\u003e\u003cp\u003e这个 \u003ccode\u003eramp\u003c/code\u003e 的值从 \u003ccode\u003e7\u0026#39;b0000000\u003c/code\u003e 到 \u003ccode\u003e7\u0026#39;b1111111\u003c/code\u003e 。为了得到一个可用的值产生声音,我们在他前面补2位 \u003ccode\u003e2\u0026#39;b01\u003c/code\u003e 后面补7位 \u003ccode\u003e7\u0026#39;b0000000\u003c/code\u003e 进行填充。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e clkdivider \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u0026#39;b01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e ramp\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e7\u0026#39;b0000000\u003c/span\u003e\u003cspan class=\"token operator\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e这样, \u003ccode\u003eclkdivider\u003c/code\u003e 的值从 \u003ccode\u003e16\u0026#39;b0100000000000000\u003c/code\u003e 到\u003ccode\u003e16\u0026#39;b01111110000000\u003c/code\u003e ,在50MHz的时钟下,相当于产生从765Hz到1525Hz的高音调警报器。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token comment\"\u003e// police\u003c/span\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e police #\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eparameter\u003c/span\u003e clkdivider \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e50000000\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e440\u003c/span\u003e\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// MSB 3Hz变动一次\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e23\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e tone \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e24\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e tone \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e tone\u003cspan class=\"token operator\"\u003e+\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 判断是上升还是下降\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e ramp \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e23\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e?\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// clkdivider 以3Hz为周期变动\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e clkdivider \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u0026#39;b01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e ramp\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e7\u0026#39;b0000000\u003c/span\u003e\u003cspan class=\"token operator\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e clkdivider\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e-\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"High-speed-pursuit\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/f804/#High-speed-pursuit\" class=\"headerlink\" title=\"High-speed pursuit\"\u003e\u003c/a\u003eHigh-speed pursuit\u003c/h3\u003e\u003cp\u003e要进行高速追击,警报声音有快有慢。\u003c/p\u003e\u003cp\u003e所以 \u003ccode\u003etone[22:16]\u003c/code\u003e 给我们一个快速的斜坡,而 \u003ccode\u003etone[25:19]\u003c/code\u003e 给我们一个缓慢的斜坡。\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e fastsweep \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e23\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e?\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e slowsweep \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e26\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e?\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e19\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e19\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e clkdivider \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u0026#39;b01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e28\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e?\u003c/span\u003e slowsweep \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e fastsweep\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e7\u0026#39;b0000000\u003c/span\u003e\u003cspan class=\"token operator\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e最终代码\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token comment\"\u003e// hign.v\u003c/span\u003e\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e hign \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003einput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eoutput\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e28\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e tone \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e25\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e tone \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e tone\u003cspan class=\"token operator\"\u003e+\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e fastsweep \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e23\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e?\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e slowsweep \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e26\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e?\u003c/span\u003e tone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e19\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e19\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e clkdivider \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u0026#39;b01\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etone\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e28\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e?\u003c/span\u003e slowsweep \u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e fastsweep\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e7\u0026#39;b0000000\u003c/span\u003e\u003cspan class=\"token operator\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e counter\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e clkdivider\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e counter \u003cspan class=\"token operator\"\u003e-\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways @\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eposedge\u003c/span\u003e clk \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enegedge\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token function\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ecounter \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e speaker \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e \u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e仿真\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-verilog\" data-language=\"verilog\"\u003e\u003ccode class=\"language-verilog\"\u003e\u003cspan class=\"token constant\"\u003e`timescale\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token operator\"\u003e/\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003ens\u003cspan class=\"token keyword\"\u003emodule\u003c/span\u003e \u003cspan class=\"token function\"\u003etb_hign\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e clk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ereg\u003c/span\u003e rst\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewire\u003c/span\u003e speaker\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//初始化输入信号\u003c/span\u003e\u003cspan class=\"token keyword\"\u003einitial\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ebegin\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e rst \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token number\"\u003e#20\u003c/span\u003e rst \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u0026#39;b1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eend\u003c/span\u003e\u003cspan class=\"token important\"\u003ealways\u003c/span\u003e \u003cspan class=\"token number\"\u003e#10\u003c/span\u003e clk \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token operator\"\u003e~\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003ehign hign_inst \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eclk \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eclk\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//input clk\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003erst \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003erst\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003espeaker \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003espeaker\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//output speaker\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eendmodule\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e\u003cimg src=\"https://yun.ksfu.top/blog/fpga4fun/1.png\" alt=\"1\"/\u003e\u003c/p\u003e\u003cp\u003e可以看出间隔确实是变化的,仿真波形图里第一个频率经过计算为912Hz,符合要求。\u003c/p\u003e\u003chr/\u003e\u003cp\u003e待续……\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/f804/"},{"title":"STM32\u0026UART串口通信(使用CubeMX)","time":"2022-05-08T14:54:19Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"STM32-UART通信\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#STM32-UART%E9%80%9A%E4%BF%A1\" class=\"headerlink\" title=\"STM32 UART通信\"\u003e\u003c/a\u003eSTM32 UART通信\u003c/h1\u003e\u003cp\u003e\u003cdel\u003e令人感慨,大二上学期不知道这玩意的我,是怎么把广和通项目糊出来的?\u003c/del\u003e\u003c/p\u003e\u003cp\u003e写完咯 ~ \u003cdel\u003e还没写完\u003c/del\u003e\u003c/p\u003e\u003ch2 id=\"参考链接\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\" class=\"headerlink\" title=\"参考链接\"\u003e\u003c/a\u003e参考链接\u003c/h2\u003e\u003cp\u003e研究原理啥的还是看看参考的博客的好~\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e[\u003ca href=\"https://www.emoe.xyz/bonjour-stm32-uart-communication/\"\u003eBonjour STM32] No.7-demo 4.串口通信 - Emoe-Studio\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.emoe.xyz/ee_tutorial_04/\"\u003e电子入门教程[04]-喂?zaima? - Emoe-Studio\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/menlsh/archive/2013/01/28/2880580.html\"\u003e串口通信与编程01:串口基础知识 - 依旧淡然 - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/ChurF-Lin/p/10793111.html\"\u003e基于STM32之UART串口通信协议(一)详解 - LLLIN000 - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/ChurF-Lin/p/10798193.html\"\u003e基于STM32之UART串口通信协议(二)发送 - LLLIN000 - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/ChurF-Lin/p/10809000.html\"\u003e基于STM32之UART串口通信协议(三)接收 - LLLIN000 - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/ChurF-Lin/p/11139901.html\"\u003e基于STM32之UART串口通信协议(四)Printf发送 - LLLIN000 - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/milton/p/14711577.html\"\u003eSTM32 printf 方法重定向到串口UART - Milton - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/ForeverIT/article/details/82263142\"\u003eSTM32 Uart 实现printf函数_ForeverIT的博客-CSDN博客_stm32 实现printf\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"串口通信\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E4%B8%B2%E5%8F%A3%E9%80%9A%E4%BF%A1\" class=\"headerlink\" title=\"串口通信\"\u003e\u003c/a\u003e串口通信\u003c/h2\u003e\u003cp\u003e串口是串行接口(serial port)的简称,也称为串行通信接口或COM接口。\u003c/p\u003e\u003cimg src=\"https://s2.ax1x.com/2020/02/11/1TKcqI.jpg\" style=\"zoom: 67%;\"/\u003e\u003cimg src=\"https://s2.ax1x.com/2020/02/11/1TKyMd.jpg\" style=\"zoom:67%;\"/\u003e\u003cp\u003e串口通信是指采用串行通信协议(serial communication)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。\u003c/p\u003e\u003cp\u003e串口按电气标准及协议来划分,包括RS-232-C、RS-422、RS485等。\u003c/p\u003e\u003cp\u003e在串行通信中,数据在1位宽的 \u003cstrong\u003e单条线路\u003c/strong\u003e 上进行传输,一个字节的数据要分为8次,由低位到高位按顺序一位一位的进行传送。\u003c/p\u003e\u003cp\u003e串行通信的数据是逐位传输的,发送方发送的每一位都具有固定的时间间隔,这就要求接收方也要按照发送方同样的时间间隔来接收每一位。不仅如此,接收方还必须能够确定一个信息组的开始和结束。\u003c/p\u003e\u003cp\u003e常用的两种基本串行通信方式包括同步通信和异步通信。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e然后剩下的可以去参考链接继续了解了~\u003c/strong\u003e \u003cspan class=\"diana_yiyanzhen\"\u003e\u003c/span\u003e\u003c/p\u003e\u003ch2 id=\"UART简介\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#UART%E7%AE%80%E4%BB%8B\" class=\"headerlink\" title=\"UART简介\"\u003e\u003c/a\u003eUART简介\u003c/h2\u003e\u003cp\u003e嵌入式开发中,UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),是 \u003cstrong\u003e异步串口通信协议\u003c/strong\u003e 的一种,工作原理是将传输数据的每个字符一位接一位地传输,它能将要传输的资料在串行通信与并行通信之间加以转换,能够灵活地与外部设备进行全双工数据交换。\u003cspan class=\"ava_datou\"\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003eUSART\u003c/strong\u003e 相当于UART的升级版,USART支持同步模式,因此USART 需要同步始终信号USART_CK(如STM32 单片机),通常情况同步信号很少使用,因此一般的单片机UART和USART使用方式是一样的,都使用异步模式。因为USART的使用方法上跟UART基本相同,所以在此就 \u003cstrong\u003e以UART\u003c/strong\u003e 来讲该通信协议了。\u003c/p\u003e\u003ch2 id=\"UART功能说明\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#UART%E5%8A%9F%E8%83%BD%E8%AF%B4%E6%98%8E\" class=\"headerlink\" title=\"UART功能说明\"\u003e\u003c/a\u003eUART功能说明\u003c/h2\u003e\u003cp\u003e接口通过三个引脚从外部连接到其它设备。任何 USART 双向通信均需要 至少两个引脚:接收数据输入引脚 (RX) 和发送数据引脚输出 (TX):\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e两个系统的GND必须连在一起\u003c/strong\u003e(因为需要有相同的参考电位)\u003c/p\u003e\u003cp\u003e\u003cstrong\u003eRX:\u003c/strong\u003e接收数据输入引脚就是串行数据输入引脚。过采样技术可区分有效输入数据和噪声,从而用于恢复数据。\u003cbr/\u003e\u003cstrong\u003eTX:\u003c/strong\u003e发送数据输出引脚。如果关闭发送器,该输出引脚模式由其 I/O 端口配置决定。如果使 能了发送器但没有待发送的数据,则 TX 引脚处于高电平。在单线和智能卡模式下,该 I/O 用于发送和接收数据(USART 电平下,随后在 SW_RX 上接收数据)。\u003c/p\u003e\u003chr/\u003e\u003cp\u003e具体原理留个坑,先大概了解到这,这次主要是通过 \u003cstrong\u003eCubeMX\u003c/strong\u003e 使用UART进行通信~\u003cspan class=\"diana_bixin\"\u003e\u003c/span\u003e\u003c/p\u003e\u003chr/\u003e\u003ch2 id=\"波特率\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E6%B3%A2%E7%89%B9%E7%8E%87\" class=\"headerlink\" title=\"波特率\"\u003e\u003c/a\u003e波特率\u003c/h2\u003e\u003cp\u003e波特率的单位是 \u003cstrong\u003eBits/s\u003c/strong\u003e,很好理解, \u003cstrong\u003e每一位的传输时间\u003c/strong\u003e 。这个参数决定了串口传输数据的速度,115200,这是串口常用的波特率里很快的一个速度了,但是计算一下,11.5kbits/s,除以8换算成字节,也就是不到2kBytes/s,每秒传输一千多个字节的数据,就是这样一个速度了——比较老的USB2.0的U盘拷贝文件的速度大概在几个MBytes到十几MBytes每秒之间,对比一下可见串口这玩意确实是一个在速度上十分落后的通信接口了。\u003c/p\u003e\u003cp\u003e如何计算?比如我们的波特率是9600,那么每一位传输的时间是1/9600 s,意思就是说如果接连不断地发送数据帧,按照11bit长度计算,1秒钟可以发送9600/11=872.7,也就是差不多872个数据帧,也就是872字节。按照ASCII字母来说,872个英文字母/s,够直观了8~\u003c/p\u003e\u003ch2 id=\"CubeMX配置\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#CubeMX%E9%85%8D%E7%BD%AE\" class=\"headerlink\" title=\"CubeMX配置\"\u003e\u003c/a\u003eCubeMX配置\u003c/h2\u003e\u003cp\u003e本次使用 STM32F405RGT6\u003c/p\u003e\u003ch3 id=\"配置时钟\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E9%85%8D%E7%BD%AE%E6%97%B6%E9%92%9F\" class=\"headerlink\" title=\"配置时钟\"\u003e\u003c/a\u003e配置时钟\u003c/h3\u003e\u003cp\u003e选择外部晶振,然后时钟拉到最高~\u003c/p\u003e\u003cp\u003e)用一张之前的图,意思差不多\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/mg995/0.webp\" style=\"zoom:80%;\"/\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/mg995/4.webp\" alt=\"4\"/\u003e\u003c/p\u003e\u003ch4 id=\"设置调试接口\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E8%AE%BE%E7%BD%AE%E8%B0%83%E8%AF%95%E6%8E%A5%E5%8F%A3\" class=\"headerlink\" title=\"设置调试接口\"\u003e\u003c/a\u003e设置调试接口\u003c/h4\u003e\u003cp\u003e)照着参考链接来\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/uart/0.webp\"/\u003e\u003c/p\u003e\u003ch3 id=\"配置串口\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E9%85%8D%E7%BD%AE%E4%B8%B2%E5%8F%A3\" class=\"headerlink\" title=\"配置串口\"\u003e\u003c/a\u003e配置串口\u003c/h3\u003e\u003cp\u003e先启用,选择异步通信;然后波特率保持默认的 115200 就行\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/uart/1.webp\" alt=\"1\"/\u003e\u003ch3 id=\"选择生成必要的代码\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E9%80%89%E6%8B%A9%E7%94%9F%E6%88%90%E5%BF%85%E8%A6%81%E7%9A%84%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"选择生成必要的代码\"\u003e\u003c/a\u003e选择生成必要的代码\u003c/h3\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/uart/2.webp\" alt=\"2\"/\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e1.Copy all used libraries into the project folder\u003c/p\u003e\u003cp\u003e将所有使用过的库复制到项目文件夹中。\u003c/p\u003e\u003cp\u003e不管你用,还是没有用到,都拷贝到你工程目录下。这样一来,你工程下文件就比较多。\u003c/p\u003e\u003cp\u003e2.Copy only the necessary library files \u003c/p\u003e\u003cp\u003e只复制必要的库文件。\u003c/p\u003e\u003cp\u003e这个相比上一个减少了很多文件。比如你没有使用CAN、SPI…等外设,就不会拷贝相关库文件到你工程下。\u003c/p\u003e\u003cp\u003e3.Add necessary library files as reference in the toolchain project configuration file \u003c/p\u003e\u003cp\u003e在工具链项目配置文件中添加必要的库文件作为参考。\u003c/p\u003e\u003cp\u003e这里没有复制HAL库文件,只添加了必要文件(如main.c)。相比上面,没有Drivers相关文件。\u003c/p\u003e\u003c/blockquote\u003e\u003cblockquote\u003e\u003cp\u003eGenerate peripheral initialization as a pair of’.c/.h’ files per peripheral\u003c/p\u003e\u003cp\u003e每个外设生成独立的’.c/.h’文件\u003c/p\u003e\u003cp\u003e不勾:所有初始化代码都生成在main.c\u003c/p\u003e\u003cp\u003e勾选:初始化代码生成在对应的外设文件。 如UART初始化代码生成在uart.c中。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e)其他配置啥的可以上网搜搜具体意思\u003c/p\u003e\u003ch2 id=\"UART-发送\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#UART-%E5%8F%91%E9%80%81\" class=\"headerlink\" title=\"UART 发送\"\u003e\u003c/a\u003eUART 发送\u003c/h2\u003e\u003cp\u003e主要使用到的函数为\u003c/p\u003e\u003cp\u003e在 \u003ccode\u003estm32f4xx_hal_uart.c\u003c/code\u003e 中\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003eHAL_StatusTypeDef \u003cspan class=\"token function\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eUART_HandleTypeDef \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ehuart\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003epData\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e Size\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint32_t\u003c/span\u003e Timeout\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cblockquote\u003e\u003cul\u003e\u003cli\u003ehuart :选择用来发送的UART串口\u003c/li\u003e\u003cli\u003epData :指向将要发送的数据的指针\u003c/li\u003e\u003cli\u003eSize :发送数据的大小\u003c/li\u003e\u003cli\u003eTimeout:超时时间\u003c/li\u003e\u003c/ul\u003e\u003c/blockquote\u003e\u003ch3 id=\"直接发送\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E7%9B%B4%E6%8E%A5%E5%8F%91%E9%80%81\" class=\"headerlink\" title=\"直接发送\"\u003e\u003c/a\u003e直接发送\u003c/h3\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e定义一个数组\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e//数组内十六进制代表“ABCDE”\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e uTx_Data\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x41\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x42\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x43\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x44\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x45\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e调用函数发送\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// UART发送,使用打开的第一个端口,发送定义的数组里的字符\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e uTx_Data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003esizeof\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003euTx_Data\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xffff\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 延迟1s\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_Delay\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"自己写发送函数\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E8%87%AA%E5%B7%B1%E5%86%99%E5%8F%91%E9%80%81%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"自己写发送函数\"\u003e\u003c/a\u003e自己写发送函数\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e前面的发送方式,不仅要传入句柄参数,还有数组、长度、超时时间参数。\u003c/p\u003e\u003cp\u003e为了简便发送,我们可以专门写一个字符串发送函数,可以直接传入一个数组即可发送,可以更简便地实现字符串发送。\u003c/p\u003e\u003cp\u003e优点是,发送数据更简便,能够一次性发送很长的数据数组。\u003c/p\u003e\u003cp\u003e但缺点就是不能控制发送的长度,会将整个数据数组发出。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e具体实现方式可以在参考链接中找到~\u003c/p\u003e\u003ch3 id=\"使用-printf-函数发送\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E4%BD%BF%E7%94%A8-printf-%E5%87%BD%E6%95%B0%E5%8F%91%E9%80%81\" class=\"headerlink\" title=\"使用 printf() 函数发送\"\u003e\u003c/a\u003e使用 printf() 函数发送\u003c/h3\u003e\u003cp\u003e\u003cdel\u003e好好好好好好好好好好好好好好好好好好\u003c/del\u003e\u003c/p\u003e\u003cp\u003e首先打开 \u003ccode\u003eusart.c\u003c/code\u003e,然后添加头文件 \u003ccode\u003e#include \u0026#34;stdio.h\u0026#34;\u003c/code\u003e\u003c/p\u003e\u003cp\u003e再加入\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e/* USER CODE BEGIN 1 */\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003eifdef\u003c/span\u003e \u003cspan class=\"token expression\"\u003e__GNUC__\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* With GCC/RAISONANCE, small printf (option LD Linker-\u0026gt;Libraries-\u0026gt;Small printf set to \u0026#39;Yes\u0026#39;) calls __io_putchar() */\u003c/span\u003e \u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003ePUTCHAR_PROTOTYPE\u003c/span\u003e \u003cspan class=\"token expression\"\u003e\u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e \u003cspan class=\"token function\"\u003e__io_putchar\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e ch\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003eelse\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003edefine\u003c/span\u003e \u003cspan class=\"token macro-name\"\u003ePUTCHAR_PROTOTYPE\u003c/span\u003e \u003cspan class=\"token expression\"\u003e\u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e \u003cspan class=\"token function\"\u003efputc\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e ch\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e FILE \u003cspan class=\"token operator\"\u003e*\u003c/span\u003ef\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token macro property\"\u003e\u003cspan class=\"token directive-hash\"\u003e#\u003c/span\u003e\u003cspan class=\"token directive keyword\"\u003eendif\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* __GNUC__ */\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"token comment\"\u003e/** * @brief Retargets the C library printf function to the USART. * @param None * @retval None */\u003c/span\u003ePUTCHAR_PROTOTYPE\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* Place your implementation of fputc here */\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ech\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ereturn\u003c/span\u003e ch\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token comment\"\u003e/* USER CODE END 1 */\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e然后再到 \u003ccode\u003emain.c\u003c/code\u003e 中添加头文件 \u003ccode\u003e#include \u0026#34;stdio.h\u0026#34;\u003c/code\u003e\u003c/p\u003e\u003cp\u003e然后就能愉快的用 \u003ccode\u003eprintf()\u003c/code\u003e 了~\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token function\"\u003eprintf\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;Hello World!\\n\\r\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"具体效果\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E5%85%B7%E4%BD%93%E6%95%88%E6%9E%9C\" class=\"headerlink\" title=\"具体效果\"\u003e\u003c/a\u003e具体效果\u003c/h3\u003e\u003cp\u003e)用这个板子是因为上面已经有 \u003ccode\u003eCH340\u003c/code\u003e 这个芯片了,电脑上装好驱动可以直接用~\u003c/p\u003e\u003cp\u003e如果莫得的话,买一个 \u003ccode\u003eUSB 转 TTL 模块\u003c/code\u003e 就行,几块钱~\u003c/p\u003e\u003cp\u003e主要代码\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e// 数组内十六进制代表 ABCDE\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e uTx_Data\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e0x41\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x42\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x43\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x44\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x45\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 直接发送\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e uTx_Data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token keyword\"\u003esizeof\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003euTx_Data\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xffff\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_Delay\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 使用 printf 发送\u003c/span\u003e \u003cspan class=\"token function\"\u003eprintf\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;Hello World!\\n\\r\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_Delay\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e然后连上,打开串口助手,打开串口\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/uart/3.gif\" alt=\"3\"/\u003e\u003c/p\u003e\u003ch2 id=\"UART-接收\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#UART-%E6%8E%A5%E6%94%B6\" class=\"headerlink\" title=\"UART 接收\"\u003e\u003c/a\u003eUART 接收\u003c/h2\u003e\u003cp\u003e\u003cdel\u003e)等我学完\u003c/del\u003e \u003cspan class=\"ava_datou\"\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e在之前文件的基础上,打开串口中断\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/uart/4.webp\" alt=\"4\" style=\"zoom:50%;\"/\u003e\u003cp\u003e如果开启了其他中断,要顺便设置一下中断优先级,如果没有默认即可\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/uart/5.webp\" alt=\"5\" style=\"zoom:67%;\"/\u003e\u003cp\u003e生成代码。\u003c/p\u003e\u003ch3 id=\"函数说明\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E5%87%BD%E6%95%B0%E8%AF%B4%E6%98%8E\" class=\"headerlink\" title=\"函数说明\"\u003e\u003c/a\u003e函数说明\u003c/h3\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e中断处理函数 \u003ccode\u003evoid USART1_IRQHandler(void)\u003c/code\u003e ,在 \u003ccode\u003estm32f4xx_it.c\u003c/code\u003e 中;\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003eHAL库函数 \u003ccode\u003eHAL_UART_Transmit\u003c/code\u003e ,用来发送数据;\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003eHAL库函数 \u003ccode\u003eHAL_UART_Receive\u003c/code\u003e ,用来接收函数\u003c/p\u003e\u003cp\u003e该函数能够通过huart串口接收Size位pData数据。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003cstrong\u003e参数说明:\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003ehuart\u003c/code\u003e :选择用来接收的UART串口\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003epData\u003c/code\u003e :指向将要存放数据的指针\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003eSize\u003c/code\u003e :接收数据的大小\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003eTimeout\u003c/code\u003e :超时时间\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/blockquote\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"接收方式\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E6%8E%A5%E6%94%B6%E6%96%B9%E5%BC%8F\" class=\"headerlink\" title=\"接收方式\"\u003e\u003c/a\u003e接收方式\u003c/h3\u003e\u003cp\u003e接收方式大概有三种,大致是\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e直接接收\u003c/p\u003e\u003cp\u003e这种方式为在 \u003ccode\u003ewhile\u003c/code\u003e 循环中不断判断是否接收成功,\u003cstrong\u003e会严重占用程序的进程\u003c/strong\u003e ,且接收较长的数据时,会发生接收错误。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e中断接收,接收一位发送一位\u003c/p\u003e\u003cp\u003e使用中断可以很大程度的避免不必要的资源浪费。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e在没有什么特别事件的时候,单片机会按照原本的程序运行着,等到有数据从UART串口发送过来时,会马上进入UART串口的中断处理函数中,完成相应的中断处理操作,完成后会退出中断函数,并继续原本在进行的程序,这样就不会占用单片机程序太多的进程了。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e但仍会发生前面直接接收方式的接收异常状况\u003c/strong\u003e ,主要原因是,在中断处理函数中,我们在接收了数据后并紧接着作出发送的操作,这会出现一个状况,还没来得及将上一次接收到的数据发送出去,就进入下一次接收的中断,然而导致失去了一些数据了。\u003c/p\u003e\u003c/blockquote\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e中断接收,全部接收完后再发送\u003c/p\u003e\u003cp\u003e这个方式以一定的资源换取了一定程度数据的完整。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e这种接收方式,是在方式2的基础上稍作改进的,较于前两种接收方式,是更好的一种接收方式,不会给原本的程序进程造成太大影响。还可以先接收全部数据(提示:通过定义一个较大的数组来存储),再将数据进行处理,这样能确保接收数据的完整性,并能将数据进行有效的处理、分析。\u003c/p\u003e\u003c/blockquote\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e以上 1, 2 两种方式可以在参考博客中找到实现方法,这里主要关注方法 3\u003c/p\u003e\u003ch3 id=\"中断接收,全部接收完后再发送\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E4%B8%AD%E6%96%AD%E6%8E%A5%E6%94%B6%EF%BC%8C%E5%85%A8%E9%83%A8%E6%8E%A5%E6%94%B6%E5%AE%8C%E5%90%8E%E5%86%8D%E5%8F%91%E9%80%81\" class=\"headerlink\" title=\"中断接收,全部接收完后再发送\"\u003e\u003c/a\u003e中断接收,全部接收完后再发送\u003c/h3\u003e\u003ch4 id=\"使能接收中断\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E4%BD%BF%E8%83%BD%E6%8E%A5%E6%94%B6%E4%B8%AD%E6%96%AD\" class=\"headerlink\" title=\"使能接收中断\"\u003e\u003c/a\u003e\u003cstrong\u003e使能接收中断\u003c/strong\u003e\u003c/h4\u003e\u003cp\u003e在 \u003ccode\u003eHAL_UART_MspInit\u003c/code\u003e(在 \u003ccode\u003eusart.c\u003c/code\u003e中)\u003cstrong\u003e使能接收中断\u003c/strong\u003e \u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_UART_MspInit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eUART_HandleTypeDef\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e uartHandle\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 省略掉的前面的一些配置\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* USER CODE BEGIN USART1_MspInit 1 */\u003c/span\u003e \u003cspan class=\"token function\"\u003e__HAL_UART_ENABLE_IT\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003euartHandle\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e UART_IT_RXNE\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* USER CODE END USART1_MspInit 1 */\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"编写接收中断服务程序\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E7%BC%96%E5%86%99%E6%8E%A5%E6%94%B6%E4%B8%AD%E6%96%AD%E6%9C%8D%E5%8A%A1%E7%A8%8B%E5%BA%8F\" class=\"headerlink\" title=\"编写接收中断服务程序\"\u003e\u003c/a\u003e编写接收中断服务程序\u003c/h4\u003e\u003cp\u003e \u003cstrong\u003e\u003ccode\u003eUSART1_IRQHandler\u003c/code\u003e\u003c/strong\u003e (在 \u003ccode\u003estm32f4xx_it.c\u003c/code\u003e 中)\u003c/p\u003e\u003cp\u003e定义三个静态变量\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e// 存储数组\u003c/span\u003e\u003cspan class=\"token keyword\"\u003estatic\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e uRx_Data\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1024\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 指向存储数组将要存储数据的位\u003c/span\u003e\u003cspan class=\"token keyword\"\u003estatic\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003e pRx_Data \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e uRx_Data\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 接收数据长度\u003c/span\u003e\u003cspan class=\"token keyword\"\u003estatic\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e uLength \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e调用HAL库的UART接收函数以及发送函数\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e2、3步都可以根据自身要求进行改进\u003c/p\u003e\u003cul\u003e\u003cli\u003e第2步:判断接收结束条件,这个可以根据自己想要接收何种类型的数据而定。本次使用 \u003ccode\u003e回车\u003c/code\u003e 作为判断条件\u003c/li\u003e\u003cli\u003e第3步:数据处理,可以在这一步执行自己想要对数据做的一些操作。本次为将接收到的数据重新发送出去。\u003c/li\u003e\u003c/ul\u003e\u003c/blockquote\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e// 1. 接收数据\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_UART_Receive\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e pRx_Data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 2. 判断数据结尾\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003epRx_Data \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token char\"\u003e\u0026#39;\\n\u0026#39;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e||\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003epRx_Data \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token char\"\u003e\u0026#39;\\r\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 3. 将接收成功的数据通过串口发出去\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e uRx_Data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e uLength\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xffff\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 4. 初始化指针和数据长度\u003c/span\u003e pRx_Data \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e uRx_Data\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//重新指向数组起始位置 uLength = 0; //长度清零\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token comment\"\u003e// 5. 若未结束,指针往下一位移动,长度自增1\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token operator\"\u003e++\u003c/span\u003epRx_Data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token operator\"\u003e++\u003c/span\u003euLength\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e完整中断服务程序\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e \u003cspan class=\"token function\"\u003eUSART1_IRQHandler\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* USER CODE BEGIN USART1_IRQn 0 */\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 存储数组\u003c/span\u003e \u003cspan class=\"token keyword\"\u003estatic\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e uRx_Data\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1024\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 指向存储数组将要存储数据的位\u003c/span\u003e \u003cspan class=\"token keyword\"\u003estatic\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003e pRx_Data \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e uRx_Data\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 接收数据长度\u003c/span\u003e \u003cspan class=\"token keyword\"\u003estatic\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"token keyword\"\u003echar\u003c/span\u003e uLength \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 接收数据\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_UART_Receive\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e pRx_Data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 判断数据结尾\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003epRx_Data \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token char\"\u003e\u0026#39;\\n\u0026#39;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e||\u003c/span\u003e \u003cspan class=\"token operator\"\u003e*\u003c/span\u003epRx_Data \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token char\"\u003e\u0026#39;\\r\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 将接收成功的数据通过串口发出去\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e uRx_Data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e uLength\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0xffff\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 初始化指针和数据长度\u003c/span\u003e pRx_Data \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e uRx_Data\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//重新指向数组起始位置\u003c/span\u003e uLength \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//长度清零\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 若未结束,指针往下一位移动,长度自增1\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token operator\"\u003e++\u003c/span\u003epRx_Data\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token operator\"\u003e++\u003c/span\u003euLength\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* USER CODE END USART1_IRQn 0 */\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_UART_IRQHandler\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehuart1\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* USER CODE BEGIN USART1_IRQn 1 */\u003c/span\u003e \u003cspan class=\"token comment\"\u003e/* USER CODE END USART1_IRQn 1 */\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"查看效果\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b619/#%E6%9F%A5%E7%9C%8B%E6%95%88%E6%9E%9C\" class=\"headerlink\" title=\"查看效果\"\u003e\u003c/a\u003e查看效果\u003c/h4\u003e\u003cp\u003e编译下载,使用串口查看\u003c/p\u003e\u003cp\u003e默认是不断发送之前的 \u003ccode\u003eHello World !\u003c/code\u003e ,在受到我们发送的数据后,将其再发送,结束后之前运行不受影响。(中断的好处)\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/uart/6.gif\" alt=\"6\" style=\"zoom:67%;\"/\u003e\u003chr/\u003e\u003cp\u003e发送与接收都完成咯,撒花 ~\u003c/p\u003e\u003cp\u003e)这算是搞明白了当时是如何操纵 \u003ccode\u003eStm32\u003c/code\u003e 使用 \u003ccode\u003eAT\u003c/code\u003e 指令与广和通 \u003ccode\u003eL610\u003c/code\u003e 通信了 ~\u003c/p\u003e\u003cp\u003e\u003cdel\u003e(当时没搞明白,对着例程xjb抄,发送功能糊出来了结果最后没有接收功能……令人感慨。\u003c/del\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/b619/"},{"title":"CubeMX初配置PWM\u0026驱动MG995舵机","time":"2022-05-02T12:32:45Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"CubeMX初配置PWM-amp-驱动MG995舵机\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#CubeMX%E5%88%9D%E9%85%8D%E7%BD%AEPWM-amp-%E9%A9%B1%E5%8A%A8MG995%E8%88%B5%E6%9C%BA\" class=\"headerlink\" title=\"CubeMX初配置PWM\u0026amp;驱动MG995舵机\"\u003e\u003c/a\u003eCubeMX初配置PWM\u0026amp;驱动MG995舵机\u003c/h1\u003e\u003cp\u003e\u003cdel\u003e最近在重学STM32,发现大二上整的像s一样\u003c/del\u003e\u003c/p\u003e\u003ch3 id=\"参考博客\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#%E5%8F%82%E8%80%83%E5%8D%9A%E5%AE%A2\" class=\"headerlink\" title=\"参考博客\"\u003e\u003c/a\u003e参考博客\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e[\u003ca href=\"https://www.emoe.xyz/bonjour-stm32-timer-cookbook/\"\u003eBonjour STM32] No.6-定时器简单理解与使用 - Emoe-Studio\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_42967008/article/details/89267010\"\u003e STM32CubeMX学习笔记1——PWM配置_夏沫不学习的博客-CSDN博客_cubemx配置pwm\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/6151e6d4b207\"\u003eHAL库函数之呼吸灯——PWM波 - 简书 (jianshu.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/he__yuan/article/details/79195435\"\u003e(37条消息) MG995舵机工作原理及基于STM32的驱动源代码_斜杠青年/的博客-CSDN博客_mg995舵机\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch3 id=\"PWM\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#PWM\" class=\"headerlink\" title=\"PWM\"\u003e\u003c/a\u003ePWM\u003c/h3\u003e\u003cp\u003e个人理解:PWM就是方波,具体使用的时候改变这玩意的占空比就行。 \u003cspan class=\"diana_biu\"\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://s2.ax1x.com/2019/09/12/nBut8s.gif\"/\u003e\u003c/p\u003e\u003ch3 id=\"配置PWM\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#%E9%85%8D%E7%BD%AEPWM\" class=\"headerlink\" title=\"配置PWM\"\u003e\u003c/a\u003e配置PWM\u003c/h3\u003e\u003cp\u003e要知道 \u003ccode\u003eCNT\u003c/code\u003e (计数器当前值), \u003ccode\u003eARR\u003c/code\u003e (自动重装载值), \u003ccode\u003eCCRx\u003c/code\u003e (捕获/比较寄存器值)\u003c/p\u003e\u003cp\u003e当 \u003ccode\u003eCNT\u003c/code\u003e 小于 \u003ccode\u003eCCRx\u003c/code\u003e 时,通道输出高电平;\u003c/p\u003e\u003cp\u003e当 \u003ccode\u003eCNT\u003c/code\u003e 等于或大于 \u003ccode\u003eCCRx\u003c/code\u003e 时,通道输出低电平;\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://s1.ax1x.com/2020/06/13/tjSq39.jpg\"/\u003e\u003c/p\u003e\u003cp\u003e因为目前使用 \u003ccode\u003eSTM32F103C8T6\u003c/code\u003e ,首先设置使用外部时钟,再设置时钟为72Mhz\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/mg995/0.webp\" alt=\"3\"/\u003e\u003c/p\u003e\u003cp\u003e直接输入 72 就行,CubeMX 会自动配置\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/mg995/4.webp\" alt=\"4\"/\u003e\u003c/p\u003e\u003cp\u003e然后贴一段参考博客里的: \u003cspan class=\"diana_bixin\"\u003e\u003c/span\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e确定时钟源频率后,我们就可以设置\u003cstrong\u003ePSC\u003c/strong\u003e和\u003cstrong\u003eARR\u003c/strong\u003e了。按照之前的要求,我们想让定时器的溢出频率为5Hz,则240MHz/5Hz=48M分频。我们知道,一个模值(“容量”)为48M的定时器即可完成此分频,可是我们的\u003cstrong\u003eCNT\u003c/strong\u003e寄存器只有16位,也就是说模值最大设置为65535,远远不够呀。这就是预分频器\u003cstrong\u003ePSC\u003c/strong\u003e存在的意义了,“时钟源太快了,\u003cstrong\u003eCNT\u003c/strong\u003e没有足够的容量来实现较长周期的定时,所以需要预分频器把时钟降慢一些”。所以说,我们把48M拆成2400*20000就可以了。注意实际填入\u003cstrong\u003ePSC\u003c/strong\u003e和\u003cstrong\u003eARR\u003c/strong\u003e都有一个“-1”,这是因为定时器是从0开始计数的,由0计到239正好是240次。总结一个定时器频率公式,就是这样:\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e$$f_{TIM}=\\frac{f_{CLK}}{(PSC+1)\\times(ARR+1)}$$\u003c/p\u003e\u003cp\u003e改变占空比只需要改变对应计时器的 CCRx 就行\u003c/p\u003e\u003cp\u003e$$Duty_x=\\frac{CCRx}{ARR}$$\u003c/p\u003e\u003cp\u003e因为 MG995 电机需要一个20ms的时基脉冲,所以需要频率50Hz,为我们设置 \u003ccode\u003ePSC=7200-1\u003c/code\u003e \u003ccode\u003eARR=200-1\u003c/code\u003e\u003c/p\u003e\u003cp\u003e\u003ccode\u003e72000000/7200/200=50\u003c/code\u003e\u003c/p\u003e\u003cp\u003e所以计数器每次 \u003ccode\u003e+1\u003c/code\u003e 的时间为 \u003ccode\u003e20ms/ARR=20ms/200=0.1ms\u003c/code\u003e\u003c/p\u003e\u003cp\u003e在CubeMX配置如下\u003c/p\u003e\u003cp\u003e设置 TIM3 定时器 ,只用一个通道就行,设置为 PWM模式,默认是 GPIOA16 管脚\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/mg995/5.webp\" alt=\"5\" style=\"zoom:80%;\"/\u003e\u003ch3 id=\"先点个灯\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#%E5%85%88%E7%82%B9%E4%B8%AA%E7%81%AF\" class=\"headerlink\" title=\"先点个灯\"\u003e\u003c/a\u003e先点个灯\u003c/h3\u003e\u003cp\u003e\u003cdel\u003e历时108个秒,我做出了苹果手机没有的功能,呼吸灯\u003c/del\u003e \u003cspan class=\"diana_yiyanzhen\"\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e呼吸灯的呼吸,就是灯的强弱状态,改变 PWM 的占空比便可调整\u003c/p\u003e\u003cp\u003e具体配置和前面差不多,这里设置为 \u003ccode\u003eARR=500\u003c/code\u003e\u003c/p\u003e\u003cp\u003e 改变 CRRx 的两种方式\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e//ld1_duty 为我们设置的CCRx具体数值\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//方法一,直接操作\u003c/span\u003eTIM3 \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e CCR1 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e ld1_duty\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e//方法二,使用库函数\u003c/span\u003e\u003cspan class=\"token function\"\u003e__HAL_TIM_SetCompare\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehtim3\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003eTIM_CHANNEL_1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003eld1_duty\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"主要代码为\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#%E4%B8%BB%E8%A6%81%E4%BB%A3%E7%A0%81%E4%B8%BA\" class=\"headerlink\" title=\"主要代码为\"\u003e\u003c/a\u003e主要代码为\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e \u003cspan class=\"token function\"\u003emain\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 省略一堆初始化函数\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 记录变强还是变弱\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e ld1_dir \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 相当于CNT\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint16_t\u003c/span\u003e ld1_duty \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 初始化,启动 TIM3 通道1的 PWM 模式 \u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_TIM_PWM_Start\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehtim3\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003eTIM_CHANNEL_1\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//PA6\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 变强状态\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eld1_dir \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e ld1_duty \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e \u003cspan class=\"token number\"\u003e20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 变弱状态\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eld1_dir \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e ld1_duty \u003cspan class=\"token operator\"\u003e-=\u003c/span\u003e \u003cspan class=\"token number\"\u003e20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 由强变弱\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eld1_duty \u003cspan class=\"token operator\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e500\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e ld1_dir \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 由弱变强\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eld1_duty \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e ld1_dir \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 使用库函数改变 TIM3 通道1 PWM 的占空比\u003c/span\u003e \u003cspan class=\"token function\"\u003e__HAL_TIM_SetCompare\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehtim3\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003eTIM_CHANNEL_1\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003eld1_duty\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//延时\u003c/span\u003e\u003cspan class=\"token function\"\u003eHAL_Delay\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e50\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"大概效果\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#%E5%A4%A7%E6%A6%82%E6%95%88%E6%9E%9C\" class=\"headerlink\" title=\"大概效果\"\u003e\u003c/a\u003e大概效果\u003c/h4\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/mg995/1.gif\" alt=\"1\"/\u003e\u003c/p\u003e\u003ch3 id=\"驱动MG995舵机\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#%E9%A9%B1%E5%8A%A8MG995%E8%88%B5%E6%9C%BA\" class=\"headerlink\" title=\"驱动MG995舵机\"\u003e\u003c/a\u003e驱动MG995舵机\u003c/h3\u003e\u003cp\u003e这玩意具体参数可以去参考的博客去看\u003c/p\u003e\u003ch4 id=\"控制原理\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#%E6%8E%A7%E5%88%B6%E5%8E%9F%E7%90%86\" class=\"headerlink\" title=\"控制原理\"\u003e\u003c/a\u003e控制原理\u003c/h4\u003e\u003cp\u003e舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例,那么对应的控制关系是这样的:\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e0.5ms————–0度;\u003cbr/\u003e1.0ms————45度;\u003cbr/\u003e1.5ms————90度;\u003cbr/\u003e2.0ms———–135度;\u003cbr/\u003e2.5ms———–180度;\u003c/p\u003e\u003c/blockquote\u003e\u003cimg src=\"https://img-blog.csdn.net/20180129143043496?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVfX3l1YW4=\" style=\"zoom:67%;\"/\u003e\u003cp\u003e既然前面已经配置好时钟了,可以直接写代码了\u003c/p\u003e\u003cp\u003e调上面的角度转换成对应高电平部分\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token comment\"\u003e// 对应角度 0 45 90 135 180\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e deg\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e启动 TIM3 通道1的 PWM 模式\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token function\"\u003eHAL_TIM_PWM_Start\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehtim3\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003eTIM_CHANNEL_1\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//PA6\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e所以主函数为\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-c\" data-language=\"c\"\u003e\u003ccode class=\"language-c\"\u003e\u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e \u003cspan class=\"token function\"\u003emain\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003evoid\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 省了略各种初始化函数\u003c/span\u003e \u003cspan class=\"token class-name\"\u003euint8_t\u003c/span\u003e deg\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e25\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 初始化,启动 TIM3 通道1的 PWM 模式\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_TIM_PWM_Start\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token operator\"\u003e\u0026amp;\u003c/span\u003ehtim3\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003eTIM_CHANNEL_1\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e//PA6\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 先正转,再反转\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e i \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e i \u003cspan class=\"token operator\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e++\u003c/span\u003ei\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 更新CCR1值,直接用寄存器操作\u003c/span\u003e TIM3 \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e CCR1 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e deg\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ei\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token comment\"\u003e// 延时,等舵机转过去\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_Delay\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eint\u003c/span\u003e i \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e3\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e i \u003cspan class=\"token operator\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token operator\"\u003e--\u003c/span\u003ei\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e TIM3 \u003cspan class=\"token operator\"\u003e-\u0026gt;\u003c/span\u003e CCR1 \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e deg\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ei\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token function\"\u003eHAL_Delay\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e1000\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"转动效果\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/cac5/#%E8%BD%AC%E5%8A%A8%E6%95%88%E6%9E%9C\" class=\"headerlink\" title=\"转动效果\"\u003e\u003c/a\u003e转动效果\u003c/h4\u003e\u003cp\u003e对了如果发现不转记得检查一下供电,最好插上电源线再测试。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/mg995/2.gif\" alt=\"2\"/\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/cac5/"},{"title":"D2550刷64位BIOS记录","time":"2022-05-01T17:20:28Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"D2550-刷64位BIOS记录\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/1eaf/#D2550-%E5%88%B764%E4%BD%8DBIOS%E8%AE%B0%E5%BD%95\" class=\"headerlink\" title=\"D2550 刷64位BIOS记录\"\u003e\u003c/a\u003eD2550 刷64位BIOS记录\u003c/h1\u003e\u003cp\u003e早知道,还是软路由 \u003cspan class=\"ava_datou\"\u003e\u003c/span\u003e\u003c/p\u003e\u003ch3 id=\"参考链接\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/1eaf/#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5\" class=\"headerlink\" title=\"参考链接\"\u003e\u003c/a\u003e参考链接\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://www.bilibili.com/video/BV1x441147zn?spm_id_from=333.880.my_history.page.click\"\u003e芯片级硬解64位系统限制!免费帮助网友解除d2550主板64位系统限制!刷bios轻松解决_哔哩哔哩_bilibili\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://yiniot.com/archives/48/\"\u003e编程夹刷写魔改BIOS ZTE CT320(D2550 cpu)支持64位系统 - 算云烟 (yiniot.com)\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch3 id=\"0x00\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/1eaf/#0x00\" class=\"headerlink\" title=\"0x00\"\u003e\u003c/a\u003e0x00\u003c/h3\u003e\u003cp\u003e目前的网络使用 k2p + N1 使用,比较碰巧这几天有个学弟在出 x86 软路由,就顺手收了过来\u003c/p\u003e\u003cp\u003eU 是 D2550 ,内存 ddr3 2G ,刚好垃圾之前捡的比较多(因为我刚进校的本子是 ddr3 内存),挑了一根4g 的顺便升级一下,至于硬盘多大,已经不重要了…… \u003cdel\u003e(因为后面我线接错给烧了)\u003c/del\u003e\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/d2550/2.webp\" alt=\"2\" style=\"zoom: 33%;\"/\u003e\u003ch3 id=\"0x01\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/1eaf/#0x01\" class=\"headerlink\" title=\"0x01\"\u003e\u003c/a\u003e0x01\u003c/h3\u003e\u003cp\u003e拿到手头试了试,速度还不错\u003cspan class=\"diana_bixin\"\u003e\u003c/span\u003e\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/d2550/6.png\" alt=\"6\" style=\"zoom: 67%;\"/\u003e\u003cp\u003e然后想顺便在 docker 里装一个 clash 顺便把我 N1 的活也代替了,但是安装的时候提示不支持……查了一下发现因为这玩意是32 位 BIOS ,但是我不晓得我这是个啥板子……看了点相关博客,决定赌一个 \u003ccode\u003e占美、实达D2550-64BIOS\u003c/code\u003e ,借了个编程器,开始我第一次刷这玩意\u003c/p\u003e\u003ch3 id=\"0x02\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/1eaf/#0x02\" class=\"headerlink\" title=\"0x02\"\u003e\u003c/a\u003e0x02\u003c/h3\u003e\u003cp\u003e先把主板拆出来,发现他的 BIOS 芯片在散热旁边,用夹子夹好一直识别不成功……于是决定拆下来,但是散热器挡着得先拆散热,就想着顺便把硅脂也换了。属于是歪打正着,这玩意硅脂已经硬的离谱了,我清理了半天才下来……\u003c/p\u003e\u003cp\u003e拆下来就这小玩意\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/d2550/3.jpg\" alt=\"3\" style=\"zoom:50%;\"/\u003e\u003cp\u003e整之前电脑上先把该装的 \u003cstrong\u003e驱动\u003c/strong\u003e 装了。\u003c/p\u003e\u003cp\u003e夹到夹子用 CH341A 识别挺快,先把原来的 BIOS 读取出来备份,然后按教程里的选 BIOS 刷入,但是我这一直报错\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/d2550/4.jpg\" alt=\"4\" style=\"zoom: 80%;\"/\u003e\u003cp\u003e试了好多次还是寄,我以为是夹子的锅,又把这玩意焊到了编程器了,但还是寄。\u003cspan class=\"diana_bengbuzhule\"\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e经过一番搜索,找到了大概原因是因为有的这玩意有保护,换用 \u003cstrong\u003e\u003ccode\u003eAsProgrammer\u003c/code\u003e\u003c/strong\u003e 刷入,非常顺利\u003c/p\u003e\u003cp\u003e最后开机查看BIOS,屏幕轻松点亮\u003c/p\u003e\u003cimg src=\"https://blog.ksfu.top/img/posts/d2550/5.webp\" alt=\"5\" style=\"zoom: 33%;\"/\u003e\u003ch3 id=\"一点小状况\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/1eaf/#%E4%B8%80%E7%82%B9%E5%B0%8F%E7%8A%B6%E5%86%B5\" class=\"headerlink\" title=\"一点小状况\"\u003e\u003c/a\u003e一点小状况\u003c/h3\u003e\u003cp\u003e)为什么莫得硬盘呢……纠结了半天最后发现是把电源线接错地方了\u003c/p\u003e\u003cp\u003e然后赶紧换了过来,好家伙一插上就关机……\u003c/p\u003e\u003cp\u003e烧咯……\u003cspan class=\"diana_qiaoda\"\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cdel\u003e画了60买了新盘,血亏\u003c/del\u003e\u003c/p\u003e\u003chr/\u003e\u003cp\u003e寄,买来硬盘要注意电源线的线序啊,差点又给我烧了。但是线坏了,又得花钱买线了……\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/1eaf/"},{"title":"2021_Summary","time":"2021-12-31T06:53:41Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"2021-年终总结\"\u003e\u003ca href=\"https://blog.ksfu.top/2021-Summary/#2021-%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93\" class=\"headerlink\" title=\"2021 年终总结\"\u003e\u003c/a\u003e2021 年终总结\u003c/h1\u003e\u003cp\u003e妈耶,一年这就结束了 ~ \u003c/p\u003e\u003cp\u003e今年过的算是不错,因为比较躺平所以也很容易满足~ \u003cdel\u003e(躺到写年终总结一时间不知道要写啥\u003c/del\u003e\u003c/p\u003e\u003cp\u003e学业方面差强人意?大一结束成绩没有很拉跨,得以在分流于后几名勉强进入通信工程专业。但是作为大类招生第一年的实验品,分流后这一学期学校课程安排的可以说非常拉跨,各种实验各种冲突各种大作业\u003cdel\u003ewdnmd\u003c/del\u003e。但好在还有一点自强不息的意识,身体挺好能熬夜,终于到了这学期结束。不过课程虽然拉跨但还是有合自己胃口的,单片机点亮个灯还是有意思的……不过大多数课真的是能混就混,然后天天早八对我这阴间作息的人来说属实离谱\u003cdel\u003e(怎么会是呢\u003c/del\u003e……\u003c/p\u003e\u003cp\u003e虽然没有太管得住嘴\u003cdel\u003e(还有缺德群友半夜发美食(我自己也发啊那没事了\u003c/del\u003e,但是腿倒是迈开了,每个月书院有一个5km马拉松的小活动,都参加了~虽然跑的挺慢\u003cdel\u003e(基本垫底)\u003c/del\u003e 但能跑下来还整挺好。体测虽然1km还差了几秒,但是过了 ~ 3km的成绩也在及格线里面了。体重只能说挺稳定……(不过这几天因为疫情只能待在宿舍,所以\u003cdel\u003e(xjb找理由就对了\u003c/del\u003e…… 身体健康!\u003cdel\u003e(20岁,四肢健全,大小便正常,下雨知道往家跑,一天可吃三顿饭,健康码绿色,未来可期!)\u003c/del\u003e\u003c/p\u003e\u003cdiv align=\"center\"\u003e \u003cimg src=\"https://blog.ksfu.top/img/posts/2021Summary/1.png\" alt=\"1\" style=\"zoom:70%;\"/\u003e\u003c/div\u003e\u003chr/\u003e\u003cp\u003e今年又认识了很多人\u003cdel\u003e(水群越来越勤快了)\u003c/del\u003e,又是被大伙继续关照的一年~也是兴趣爱好和技能继续扩展的一年。因为有大佬带飞,学到了挺多没接触过的东西。现在虽然没有学的很深入,但对于自己的一些想法总能曲曲折折找到一些实现的法子\u003cdel\u003e(让我也体验了一把收获的喜悦)\u003c/del\u003e。在交通群了解到了很多火车知识,顺便看时刻表发现平凉站一天十几趟车只有一趟不是25G……为了运转双层火车,将返校的车票分为两程,结果因为暴雨影响,第一趟车原路折返,改签之后遇到火车改道,在车上困了1天\u003cdel\u003e(一个难忘的国庆假期)\u003c/del\u003e。校庆纪念信封的发行,让我对集邮又有了更多的认识,顺便寄了不少纪念封给同学\u003cdel\u003e(邮政现在挺快哦\u003c/del\u003e。\u003c/p\u003e\u003cp\u003e暑假上海之行,因为疫情影响,火车接二连三被取消……不过到达之后属实大开眼界,各种高架,地铁站十几个出口balabalabala……不过因为建设的比较早,大多数地铁还是挺旧,有的还没报站\u003cdel\u003e(或者是我没发现?\u003c/del\u003e,跑起来挺颠簸。参观了几个公司\u003cdel\u003e(微软园区真不错)\u003c/del\u003e,逛了南京路,看了东方明珠塔,黄浦江漫步,晚上组团上网吧\u003cdel\u003e(交大周围环境真好)\u003c/del\u003e……吃的挺好,就是贵是真贵。然后因为疫情也没有活动很大范围。地方确实挺好,魔都哦~不过回去之后给我健康码变黄了……还好核酸之后打电话给我变回来了。\u003c/p\u003e\u003cdiv align=\"center\"\u003e \u003cimg src=\"https://blog.ksfu.top/img/posts/2021Summary/2.jpeg\" alt=\"1641069033334\" style=\"zoom: 50%;text-align: center;margin: 0 auto;\"/\u003e\u003c/div\u003e\u003chr/\u003e\u003cp\u003e大伙都一个一个脱单了,真不错 ~ 然后今年寡了一年\u003cdel\u003e(女生也没认识几个emm\u003c/del\u003e,人也是一如既往的怂\u003cdel\u003e(?\u003c/del\u003e。水群水的的飞起,底下尬聊还是尬聊。祝大伙脱单的长长久久 ~ \u003cdel\u003e没脱单的看看我(男桐不要)\u003c/del\u003e\u003c/p\u003e\u003cp\u003e一年就这么没心没肺下来了 ~ 今年感谢大伙!然后新年继续努力,多水几篇博客,好好学习\u003cdel\u003e吧?\u003c/del\u003e脚踏实地,继续深入学习学习技能。坚持跑步\u003cdel\u003e(减肥\u003c/del\u003e。多找几本书看看,今年好像没看多少书emm\u003cdel\u003e(写个年终中总结都憋不出来几句骚话)\u003c/del\u003e。多看几部电影,多看几部纪录片,多看几场演唱会 ~ 继续维持和大伙的关系,多多联系 ~ 女朋友尽量尽量尽量找\u003cdel\u003e(万一呢)\u003c/del\u003e。少整点阴间作息。情绪少波动一点,虽然说不要想太多,但还是喜欢乱想\u003cdel\u003e(果然还是闲的\u003c/del\u003e。虽说难免走入低谷,还是希望新年能够平稳一些 ~ \u003c/p\u003e\u003cp\u003e\u003cem\u003e♫后知后觉,又过了一个秋~\u003c/em\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e祝大伙新年快乐,踔厉奋发,笃行不怠!愿疫情早日过去!祝福国泰民安!\u003c/strong\u003e\u003c/p\u003e\u003cdiv align=\"center\"\u003e \u003cimg src=\"https://i.loli.net/2021/04/18/OQWE5NkgnGXdD2C.jpg\" style=\"zoom: 83%;text-align: center;margin: 0 auto;\"/\u003e\u003c/div\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/2021-Summary/"},{"title":"Deepin新增分辨率","time":"2021-10-09T14:04:03Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"Deepin-新增屏幕分辨率\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b368/#Deepin-%E6%96%B0%E5%A2%9E%E5%B1%8F%E5%B9%95%E5%88%86%E8%BE%A8%E7%8E%87\" class=\"headerlink\" title=\"Deepin 新增屏幕分辨率\"\u003e\u003c/a\u003eDeepin 新增屏幕分辨率\u003c/h1\u003e\u003cp\u003e因为最近同学送了半台 ThinkPad ,于是拿来装了 Deepin ,但是发现并没有适合自己屏幕的分辨率。\u003c/p\u003e\u003cp\u003e自己动手搜索解决,记录一下过程。\u003c/p\u003e\u003ch3 id=\"添加分辨率\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b368/#%E6%B7%BB%E5%8A%A0%E5%88%86%E8%BE%A8%E7%8E%87\" class=\"headerlink\" title=\"添加分辨率\"\u003e\u003c/a\u003e添加分辨率\u003c/h3\u003e\u003cp\u003e先查看推荐的配置,加入 \u003ccode\u003e-r\u003c/code\u003e 可以尽可能的减少黑边\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003exrandr \u003cspan class=\"token parameter variable\"\u003e-r\u003c/span\u003e \u003cspan class=\"token number\"\u003e1920\u003c/span\u003e \u003cspan class=\"token number\"\u003e1080\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e我的显示\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token comment\"\u003e# 1920x1080 59.93 Hz (CVT 2.07M9-R) hsync: 66.59 kHz; pclk: 138.50 MHz\u003c/span\u003eModeline \u003cspan class=\"token string\"\u003e\u0026#34;1920x1080R\u0026#34;\u003c/span\u003e \u003cspan class=\"token number\"\u003e138.50\u003c/span\u003e \u003cspan class=\"token number\"\u003e1920\u003c/span\u003e \u003cspan class=\"token number\"\u003e1968\u003c/span\u003e \u003cspan class=\"token number\"\u003e2000\u003c/span\u003e \u003cspan class=\"token number\"\u003e2080\u003c/span\u003e \u003cspan class=\"token number\"\u003e1080\u003c/span\u003e \u003cspan class=\"token number\"\u003e1083\u003c/span\u003e \u003cspan class=\"token number\"\u003e1088\u003c/span\u003e \u003cspan class=\"token number\"\u003e1111\u003c/span\u003e +hsync \u003cspan class=\"token parameter variable\"\u003e-vsync\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e查看输出的名字\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003exrandr \u003cspan class=\"token parameter variable\"\u003e-q\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e查出来我输出的名字叫 \u003ccode\u003eVGA-1\u003c/code\u003e\u003c/p\u003e\u003cp\u003e接下来执行(后面改成自己的)\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003exrandr \u003cspan class=\"token parameter variable\"\u003e--newmode\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;1920x1080R\u0026#34;\u003c/span\u003e \u003cspan class=\"token number\"\u003e138.50\u003c/span\u003e \u003cspan class=\"token number\"\u003e1920\u003c/span\u003e \u003cspan class=\"token number\"\u003e1968\u003c/span\u003e \u003cspan class=\"token number\"\u003e2000\u003c/span\u003e \u003cspan class=\"token number\"\u003e2080\u003c/span\u003e \u003cspan class=\"token number\"\u003e1080\u003c/span\u003e \u003cspan class=\"token number\"\u003e1083\u003c/span\u003e \u003cspan class=\"token number\"\u003e1088\u003c/span\u003e \u003cspan class=\"token number\"\u003e1111\u003c/span\u003e +hsync \u003cspan class=\"token parameter variable\"\u003e-vsync\u003c/span\u003exrandr \u003cspan class=\"token parameter variable\"\u003e--addmode\u003c/span\u003e VGA-1 1920x1080R\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch3 id=\"保存分辨率\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b368/#%E4%BF%9D%E5%AD%98%E5%88%86%E8%BE%A8%E7%8E%87\" class=\"headerlink\" title=\"保存分辨率\"\u003e\u003c/a\u003e保存分辨率\u003c/h3\u003e\u003cp\u003e这样修改之后重启就又没有了,所以保存配置\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token function\"\u003esudo\u003c/span\u003e \u003cspan class=\"token function\"\u003evi\u003c/span\u003e /etc/profile\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e在文件 \u003cstrong\u003e末尾\u003c/strong\u003e 加上\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003exrandr \u003cspan class=\"token parameter variable\"\u003e--newmode\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;1920x1080R\u0026#34;\u003c/span\u003e \u003cspan class=\"token number\"\u003e138.50\u003c/span\u003e \u003cspan class=\"token number\"\u003e1920\u003c/span\u003e \u003cspan class=\"token number\"\u003e1968\u003c/span\u003e \u003cspan class=\"token number\"\u003e2000\u003c/span\u003e \u003cspan class=\"token number\"\u003e2080\u003c/span\u003e \u003cspan class=\"token number\"\u003e1080\u003c/span\u003e \u003cspan class=\"token number\"\u003e1083\u003c/span\u003e \u003cspan class=\"token number\"\u003e1088\u003c/span\u003e \u003cspan class=\"token number\"\u003e1111\u003c/span\u003e +hsync \u003cspan class=\"token parameter variable\"\u003e-vsync\u003c/span\u003exrandr \u003cspan class=\"token parameter variable\"\u003e--addmode\u003c/span\u003e VGA-1 1920x1080R\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e\u003cstrong\u003e保存退出\u003c/strong\u003e\u003c/p\u003e\u003ch3 id=\"来点成品\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/b368/#%E6%9D%A5%E7%82%B9%E6%88%90%E5%93%81\" class=\"headerlink\" title=\"来点成品\"\u003e\u003c/a\u003e来点成品\u003c/h3\u003e\u003cimg src=\"https://i.loli.net/2021/10/09/sCnVyacZrL2oKxl.jpg\" alt=\"psc.jpg\" style=\"zoom:67%;\"/\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/b368/"},{"title":"MoeCTF 2021 WriteUp","time":"2021-09-21T12:15:45Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"MoeCTF-2021-WriteUp\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#MoeCTF-2021-WriteUp\" class=\"headerlink\" title=\"MoeCTF 2021 WriteUp\"\u003e\u003c/a\u003eMoeCTF 2021 WriteUp\u003c/h1\u003e\u003cp\u003e\u003cdel\u003e没想到摸鱼摸到第9了(感谢Hidden了的师傅们(逃\u003c/del\u003e\u003c/p\u003e\u003cp\u003e挺菜的边做边学。\u003c/p\u003e\u003cp\u003e这次主要做了做 \u003ccode\u003eMisc\u003c/code\u003e 和 \u003ccode\u003eWeb\u003c/code\u003e ,其他的就看了看前面几个开了开视野(\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e题目全部在 \u003ccode\u003eWindows 7\u003c/code\u003e 环境下做出\u003c/strong\u003e\u003c/p\u003e\u003ch2 id=\"目录\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#%E7%9B%AE%E5%BD%95\" class=\"headerlink\" title=\"目录\"\u003e\u003c/a\u003e目录\u003c/h2\u003e\u003ch3 id=\"Crypto(4-x2F-14)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Crypto%EF%BC%884-x2F-14%EF%BC%89\" class=\"headerlink\" title=\"Crypto(4/14)\"\u003e\u003c/a\u003eCrypto(4/14)\u003c/h3\u003e\u003col\u003e\u003cli\u003eCryptography入门指北(略)\u003c/li\u003e\u003cli\u003ebeginOfCrypto\u003c/li\u003e\u003cli\u003eBabyMultiple\u003c/li\u003e\u003cli\u003eLazyRSA\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"Reverse(2-x2F-14)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Reverse%EF%BC%882-x2F-14%EF%BC%89\" class=\"headerlink\" title=\"Reverse(2/14)\"\u003e\u003c/a\u003eReverse(2/14)\u003c/h3\u003e\u003col\u003e\u003cli\u003e逆向工程入门指北(略)\u003c/li\u003e\u003cli\u003ewelcome_to_the_world_of_re\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"Classical-Cryptography(1-x2F-6)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Classical-Cryptography%EF%BC%881-x2F-6%EF%BC%89\" class=\"headerlink\" title=\"Classical Cryptography(1/6)\"\u003e\u003c/a\u003eClassical Cryptography(1/6)\u003c/h3\u003e\u003col\u003e\u003cli\u003eAugustine’s Way\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"Bonus-0-x2F-1\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Bonus-0-x2F-1\" class=\"headerlink\" title=\"Bonus(0/1)\"\u003e\u003c/a\u003eBonus(0/1)\u003c/h3\u003e\u003ch3 id=\"MISC-12-x2F-12)之前是13个来着\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#MISC-12-x2F-12%EF%BC%89%E4%B9%8B%E5%89%8D%E6%98%AF13%E4%B8%AA%E6%9D%A5%E7%9D%80\" class=\"headerlink\" title=\"MISC(12/12)之前是13个来着\"\u003e\u003c/a\u003eMISC(12/12)\u003cdel\u003e之前是13个来着\u003c/del\u003e\u003c/h3\u003e\u003col\u003e\u003cli\u003eMisc入门指北(略)\u003c/li\u003e\u003cli\u003efind_me\u003c/li\u003e\u003cli\u003eMacross\u003c/li\u003e\u003cli\u003eHomework\u003c/li\u003e\u003cli\u003eflipflipflip\u003c/li\u003e\u003cli\u003eWhite Album\u003c/li\u003e\u003cli\u003ePhone Call\u003c/li\u003e\u003cli\u003e社工题\u003c/li\u003e\u003cli\u003e好 康 的\u003c/li\u003e\u003cli\u003eeasyForensics\u003c/li\u003e\u003cli\u003eR P G\u003c/li\u003e\u003cli\u003e诺亚的日记\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"Pwn(3-x2F-11)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Pwn%EF%BC%883-x2F-11%EF%BC%89\" class=\"headerlink\" title=\"Pwn(3/11)\"\u003e\u003c/a\u003ePwn(3/11)\u003c/h3\u003e\u003col\u003e\u003cli\u003ePwn入门指北(略)\u003c/li\u003e\u003cli\u003etest_your_nc\u003c/li\u003e\u003cli\u003eInt_overflow\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"Web(9-x2F-14)\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Web%EF%BC%889-x2F-14%EF%BC%89\" class=\"headerlink\" title=\"Web(9/14)\"\u003e\u003c/a\u003eWeb(9/14)\u003c/h3\u003e\u003col\u003e\u003cli\u003eWeb入门指北(略)\u003c/li\u003e\u003cli\u003eWeb安全入门指北—GET\u003c/li\u003e\u003cli\u003eWeb安全入门指北—小饼干\u003c/li\u003e\u003cli\u003e2048\u003c/li\u003e\u003cli\u003eWeb_Inc\u003c/li\u003e\u003cli\u003eezinclude\u003c/li\u003e\u003cli\u003ebabeRCE\u003c/li\u003e\u003cli\u003eDo you know HTTP?\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"问卷题-1-x2F-2\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#%E9%97%AE%E5%8D%B7%E9%A2%98-1-x2F-2\" class=\"headerlink\" title=\"问卷题(1/2)\"\u003e\u003c/a\u003e问卷题(1/2)\u003c/h3\u003e\u003col\u003e\u003cli\u003e信息统计(略)\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Crypto\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Crypto\" class=\"headerlink\" title=\"Crypto\"\u003e\u003c/a\u003eCrypto\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003ePython 真是绝绝子!\u003c/p\u003e\u003c/blockquote\u003e\u003ch3 id=\"02-beginOfCrypto\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#02-beginOfCrypto\" class=\"headerlink\" title=\"02 beginOfCrypto\"\u003e\u003c/a\u003e02 beginOfCrypto\u003c/h3\u003e\u003cp\u003e打开下载的文件发现下面有申必的数字,然后再看上面有 \u003ccode\u003eflag = xxx\u003c/code\u003e , 再看一眼代码,应该是把字符通过申必的方法转换成申必的数字,然后先赋值 \u003ccode\u003eflag = \u0026#34;moectf\u0026#34;\u003c/code\u003e 发现和前面几个数字对上了,然后用只能人工方法将26个字母和几个符号带进去都看了一遍值,找到了flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{c0me_on!begin_your_Crypt0_c4r33r}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"03-BabyMultiple\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#03-BabyMultiple\" class=\"headerlink\" title=\"03 BabyMultiple\"\u003e\u003c/a\u003e03 BabyMultiple\u003c/h3\u003e\u003cp\u003e和上一题一样,带进去不同字符经过处理变成其他申必字符,然后利用智能人工全部带了一遍,得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{y0u_4r3_gr34t_47_Mu17ic4ti0n}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e### 04 LazyRSA\u003cp\u003e去网上大概查了一下原理,然后对着教程里的代码改了一下\u003c/p\u003e\u003cp\u003e读的博客\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/hiwuchong/p/9069392.html\"\u003ehttps://www.cnblogs.com/hiwuchong/p/9069392.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/carroll_/article/details/79975226\"\u003ehttps://blog.csdn.net/carroll_/article/details/79975226\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/Ahuuua/article/details/108830834\"\u003ehttps://blog.csdn.net/Ahuuua/article/details/108830834\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/weixin_41818069/article/details/106532665\"\u003ehttps://blog.csdn.net/weixin_41818069/article/details/106532665\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/Higgerw/p/14289041.html\"\u003ehttps://www.cnblogs.com/Higgerw/p/14289041.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html\"\u003ehttp://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_41429081/article/details/103403957\"\u003ehttps://blog.csdn.net/qq_41429081/article/details/103403957\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/tinyzhao/article/details/52681634\"\u003ehttps://blog.csdn.net/tinyzhao/article/details/52681634\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-python\" data-language=\"python\"\u003e\u003ccode class=\"language-python\"\u003e\u003cspan class=\"token keyword\"\u003efrom\u003c/span\u003e Crypto\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eUtil\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003enumber \u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e gmpy2\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e binasciip \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e题目里的p\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003eq \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e题目里的q\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003ec \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e题目里的c\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e n \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e p\u003cspan class=\"token operator\"\u003e*\u003c/span\u003eqe \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x10001\u003c/span\u003ed \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e gmpy2\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003einvert\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ee\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ep\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e*\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eq\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003em \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token builtin\"\u003epow\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ec\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003ed\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003en\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e# c = pow(m,e,n)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003ehex\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003em\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebinascii\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eunhexlify\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003ehex\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003em\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003estrip\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;L\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{w0w_yOU_Know_h0w_70_d3crypt_th3_RSA}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch2 id=\"Reverse\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Reverse\" class=\"headerlink\" title=\"Reverse\"\u003e\u003c/a\u003eReverse\u003c/h2\u003e\u003ch3 id=\"02-welcome-to-the-world-of-re\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#02-welcome-to-the-world-of-re\" class=\"headerlink\" title=\"02 welcome_to_the_world_of_re\"\u003e\u003c/a\u003e02 welcome_to_the_world_of_re\u003c/h3\u003e\u003cp\u003e\u003cdel\u003e之前找简单软件注册码的法子\u003c/del\u003e\u003c/p\u003e\u003cp\u003e直接拖进 \u003ccode\u003eOD\u003c/code\u003e 能找到,拖进文本也行(\u003c/p\u003e\u003cimg src=\"https://i.loli.net/2021/09/21/RwJMH68qB2hKjIE.png\" alt=\"re1.PNG\" style=\"zoom:80%;\"/\u003e\u003cimg src=\"https://i.loli.net/2021/09/21/ZL6sevtD1lGIrzk.png\" alt=\"re2\" style=\"zoom:80%;\"/\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{W31C0Me_t0_m03CTF_2021_w0o0o0oooo0ooooo0o0oooo0!!!}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch2 id=\"Classical-Cryptography\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Classical-Cryptography\" class=\"headerlink\" title=\"Classical Cryptography\"\u003e\u003c/a\u003eClassical Cryptography\u003c/h2\u003e\u003cp\u003e\u003cdel\u003e看的时候离结束还有半天了,就看了第一个\u003c/del\u003e\u003c/p\u003e\u003ch3 id=\"01-Classical-Cryptography\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#01-Classical-Cryptography\" class=\"headerlink\" title=\"01 Classical Cryptography\"\u003e\u003c/a\u003e01 Classical Cryptography\u003c/h3\u003e\u003cp\u003e前几个和 \u003ccode\u003emoectf\u003c/code\u003e 对比了一下发现是每个字母后移了一位\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{e3sy_Au9u1ne!}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch2 id=\"Misc\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Misc\" class=\"headerlink\" title=\"Misc\"\u003e\u003c/a\u003eMisc\u003c/h2\u003e\u003ch3 id=\"02-find-me\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#02-find-me\" class=\"headerlink\" title=\"02 find_me\"\u003e\u003c/a\u003e02 find_me\u003c/h3\u003e\u003cp\u003e拖进 \u003ccode\u003e010 Editor\u003c/code\u003e\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{hs_g1v3_u_fl@g}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"03-Macross\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#03-Macross\" class=\"headerlink\" title=\"03 Macross\"\u003e\u003c/a\u003e03 Macross\u003c/h3\u003e\u003cp\u003e百度搜了半天不晓得这是啥,然后上 Google 搜出来是个记录鼠标移动的软件\u003cdel\u003e(Google真是绝绝子)\u003c/del\u003e,下载安装,然后打开 Windows 图画,运行文件,得到名画\u003c/p\u003e\u003cimg src=\"https://i.loli.net/2021/09/21/BNxQez71C68ObY9.png\" alt=\"Mar\" style=\"zoom:80%;\"/\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{Rec0rder_15_Funny}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"04-Homework\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#04-Homework\" class=\"headerlink\" title=\"04 Homework\"\u003e\u003c/a\u003e04 Homework\u003c/h3\u003e\u003cp\u003e先看了一遍啥也没找到,然后先全选清除格式发现半个flag,然后用 \u003ccode\u003e7-zip\u003c/code\u003e 解压出来直接看 \u003ccode\u003exml\u003c/code\u003e 里东西了,搜 \u003ccode\u003e}\u003c/code\u003e,找到后一半,当然在 Word 里搜 \u003ccode\u003e{\u003c/code\u003e 发现是个文本框,拿到后半段flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{0h_U_f1nd_m3!}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"05-flipflipflip\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#05-flipflipflip\" class=\"headerlink\" title=\"05 flipflipflip\"\u003e\u003c/a\u003e05 flipflipflip\u003c/h3\u003e\u003cp\u003e这个题可太折磨人了……\u003c/p\u003e\u003cp\u003e参考博客\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/1go0/p/9977359.html\"\u003ehttps://www.cnblogs.com/1go0/p/9977359.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/mq0036/p/6544055.html\"\u003ehttps://www.cnblogs.com/mq0036/p/6544055.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/csqazwsxedc/article/details/59186769?fps=1\u0026amp;locationNum=2\"\u003ehttps://blog.csdn.net/csqazwsxedc/article/details/59186769?fps=1\u0026amp;locationNum=2\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.it1352.com/904413.html\"\u003ehttps://www.it1352.com/904413.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnpython.com/qa/153478\"\u003ehttps://www.cnpython.com/qa/153478\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/h-zhang/p/10568028.html\"\u003ehttps://www.cnblogs.com/h-zhang/p/10568028.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/zuferj115/p/11547486.html\"\u003ehttps://www.cnblogs.com/zuferj115/p/11547486.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/u010065754/article/details/81710160\"\u003ehttps://blog.csdn.net/u010065754/article/details/81710160\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/erchun/p/11766408.html\"\u003ehttps://www.cnblogs.com/erchun/p/11766408.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/Blood_Seeker/article/details/81519426?utm_source=blogxgwz3\"\u003ehttps://blog.csdn.net/Blood_Seeker/article/details/81519426?utm_source=blogxgwz3\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/weixin_43742794/article/details/104210963\"\u003ehttps://blog.csdn.net/weixin_43742794/article/details/104210963\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/qsmyjz/p/11987815.html\"\u003ehttps://www.cnblogs.com/qsmyjz/p/11987815.html\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e我超,100多MB的字符串,刚开始没头绪最后xjb猜是base64,那么大文件得整个脚本,然后网上搜\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-python\" data-language=\"python\"\u003e\u003ccode class=\"language-python\"\u003e\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e base64\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e systext \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;C:\\\\Users(后面文件路径省略了)\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eread\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003elen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etext\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e%\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e text \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;==\u0026#34;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eelif\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token builtin\"\u003elen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etext\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token operator\"\u003e%\u003c/span\u003e\u003cspan class=\"token number\"\u003e3\u003c/span\u003e \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e text \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;=\u0026#34;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewith\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;C:\\\\Users\\\\Users(后面文件路径省略了)\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;wb\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eas\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ebase64\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eb64decode\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etext\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;success\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e第一遍看着解出来好东西了,然后第二遍解出来不知道一堆啥东西……然后又不会整了。\u003c/p\u003e\u003cp\u003e突然发现第一遍解出来的东西开头是 \u003ccode\u003e==\u003c/code\u003e ,再想想题目名字……base64倒过来了属于是,然后整了个反转的脚本\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-python\" data-language=\"python\"\u003e\u003ccode class=\"language-python\"\u003e\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e base64\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e systext \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;C:\\\\Users\\\\(后面路径省略)\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eread\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewith\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;C:\\\\Users\\\\(后面路径省略)\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;w\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eas\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003etext\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token operator\"\u003e-\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;success\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e然后就这么xjb整……遇见解出来不对劲的就反转……然后通过智能人工整了70多次。。。从100多MB整到1KB……得到flag\u003c/p\u003e\u003cimg src=\"https://i.loli.net/2021/09/21/3NzvcCOM6ZYuqRW.png\" alt=\"filp\" style=\"zoom:80%;\"/\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{fffffflipppppp}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"06-White-Album\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#06-White-Album\" class=\"headerlink\" title=\"06 White Album\"\u003e\u003c/a\u003e06 White Album\u003c/h3\u003e\u003cp\u003e看到 \u003ccode\u003e.png\u003c/code\u003e ,就猜要么是LSB要么是图片尺寸问题,试了一下果然是图片尺寸,在\u003ccode\u003e010 Editor\u003c/code\u003e 里改了下尺寸得到一个申必图案\u003c/p\u003e\u003cimg src=\"https://i.loli.net/2021/09/21/ZpC9ox3itfAJLQm.jpg\" alt=\"whilt\" style=\"zoom:80%;\"/\u003e\u003cp\u003e猜了下是条码,就搜了下条码图案,发现是 \u003ccode\u003epdf417\u003c/code\u003e ,想找个在线扫的发现很难找,最后找到个网站可以解这个\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://online-barcode-reader.inliteresearch.com/\"\u003ehttps://online-barcode-reader.inliteresearch.com/\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{WhY_@r3_u_s0_5K1ll3D}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"07-Phone-Call\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#07-Phone-Call\" class=\"headerlink\" title=\"07 Phone Call\"\u003e\u003c/a\u003e07 Phone Call\u003c/h3\u003e\u003cp\u003e参考博客\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"http://dyf.ink/crypto/classical/others/#_24\"\u003ehttp://dyf.ink/crypto/classical/others/#_24\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/cg1510167/article/details/114279633\"\u003ehttps://blog.csdn.net/cg1510167/article/details/114279633\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/weixin_33806914/article/details/91868832\"\u003ehttps://blog.csdn.net/weixin_33806914/article/details/91868832\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e就拖进AE看就行,手动一个一个解的,得到\u003cdel\u003e很臭的\u003c/del\u003eflag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{114514-1919810-7738-9634}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"08-社工题\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#08-%E7%A4%BE%E5%B7%A5%E9%A2%98\" class=\"headerlink\" title=\"08 社工题\"\u003e\u003c/a\u003e08 社工题\u003c/h3\u003e\u003cp\u003e这题可太草了,从假期整到开学……原来有4个博客2个仓库……\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://noahtie.github.io/\"\u003eNoahBox (noahtie.github.io)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://noahbox.github.io/\"\u003ehttps://noahbox.github.io/\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://nuoyazhicheng.lofter.com/\"\u003ehttps://nuoyazhicheng.lofter.com/\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://masternoah.lofter.com/\"\u003ehttps://masternoah.lofter.com/\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e在hexo博客点签订契约进入lofter博客,在lofter博客点一下上面 \u003cstrong\u003ei\u003c/strong\u003e 一样的标志找到另一个hexo博客,在里面留言板里找到了 HackerHS,最后找到第二个仓库根据意思在里面找到commits,发现莫斯电码,复制到在线网站解密,得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{HAHAHAHAH_NOAH_IS_A_VEGETABLE_CHICKEN}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"09-好-康-的\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#09-%E5%A5%BD-%E5%BA%B7-%E7%9A%84\" class=\"headerlink\" title=\"09 好 康 的\"\u003e\u003c/a\u003e09 好 康 的\u003c/h3\u003e\u003cimg src=\"https://i.loli.net/2021/09/21/qO3mhC6S4aAVXFL.png\" alt=\"rr1\" style=\"zoom:80%;\"/\u003e\u003cp\u003e(被骗一次,之后就会被骗第二次\u003c/p\u003e\u003cp\u003e太草了,放完发现后面有一段不能放,用 \u003ccode\u003emkvtoolnix\u003c/code\u003e 分离出来字幕,拖进\u003ccode\u003e010 Editor\u003c/code\u003e 直接搜索 \u003ccode\u003emoectf\u003c/code\u003e ,找到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{N3v3r_90tt@_L3t-y0U_dOwN~}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"10-easyForensics\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#10-easyForensics\" class=\"headerlink\" title=\"10 easyForensics\"\u003e\u003c/a\u003e10 easyForensics\u003c/h3\u003e\u003cp\u003e参考博客\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/luostudent/article/details/113786916?utm_term=base64%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BD%AC%E6%96%87%E4%BB%B6python\u0026amp;utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-1-113786916\u0026amp;spm=3001.4430\"\u003ehttps://blog.csdn.net/luostudent/article/details/113786916?utm_term=base64%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BD%AC%E6%96%87%E4%BB%B6python\u0026amp;utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-1-113786916\u0026amp;spm=3001.4430\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_37865996/article/details/87970732\"\u003ehttps://blog.csdn.net/qq_37865996/article/details/87970732\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"http://blog.sina.com.cn/s/blog_68f8a3370102vqv7.html\"\u003ehttp://blog.sina.com.cn/s/blog_68f8a3370102vqv7.html\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e找了半天,用 \u003ccode\u003eAccessData FTK Imager\u003c/code\u003e 打开,挂载,进入,翻目录找到 \u003ccode\u003eflag.mp4\u003c/code\u003e 一气呵成\u003c/p\u003e\u003cp\u003e打开 \u003ccode\u003eflag.mp4\u003c/code\u003e \u003c/p\u003e\u003cimg src=\"https://i.loli.net/2021/09/21/qO3mhC6S4aAVXFL.png\" alt=\"rr1\" style=\"zoom:80%;\"/\u003e\u003cp\u003e草\u003c/p\u003e\u003cp\u003e又经过了漫长的鼓捣,最后在 \u003ccode\u003eFTK\u003c/code\u003e 里发现一些被删除的文件夹还有一个python文件,都是申必的命名,全部导出来,读了代码发现是把一个文件转成base64了,这里要注意 \u003ccode\u003edata = data.replace(\u0026#34;/\u0026#34;, \u0026#34;_\u0026#34;)\u003c/code\u003e\u003c/p\u003e\u003cp\u003e写了个脚本把文件夹的名字提取了出来(发现写了两个,好像差不多,随便粘一个)\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-python\" data-language=\"python\"\u003e\u003ccode class=\"language-python\"\u003e\u003cspan class=\"token comment\"\u003e# -*- coding: utf-8 -*-\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e os\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e base64\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e sysfile_dir \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;C:\\\\Users\\\\(之后目录省略)\u0026#39;\u003c/span\u003es \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e root\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e dirs\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e files \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e os\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewalk\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efile_dir\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e var \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e root s \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e s \u003cspan class=\"token operator\"\u003e+\u003c/span\u003e var\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e54\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003es \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e s\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ereplace\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;_\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ewith\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;C:\\\\Users\\\\(之后目录省略)\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;w\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eas\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e file_object\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003es\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eprint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;success\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e然后用脚本把base64转文件,还搜了个大佬写的图形化工具,(最后发现是个word)得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{Th@_1s_N0t_U53FULL_@_4LL}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"11-R-P-G\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#11-R-P-G\" class=\"headerlink\" title=\"11 R P G\"\u003e\u003c/a\u003e11 R P G\u003c/h3\u003e\u003cp\u003e是游戏捏,按F12还能出来 DevTools 捏,本来想怎么改地图直接穿过去,发现不会整,然后又改了下等级,好像也没啥用,然后又整了一下一进去就是第二个,还是不会整,最后在\u003ccode\u003eMap002.json\u003c/code\u003e 里发现了好像base64的申必字符,然后复制出来,得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{Th3_w0rld_0f_G4m3}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"12-诺亚的日记\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#12-%E8%AF%BA%E4%BA%9A%E7%9A%84%E6%97%A5%E8%AE%B0\" class=\"headerlink\" title=\"12 诺亚的日记\"\u003e\u003c/a\u003e12 诺亚的日记\u003c/h3\u003e\u003cp\u003e\u003cdel\u003e我超,嘉心糖\u003c/del\u003e\u003c/p\u003e\u003cp\u003e参考博客\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qiuchi1975/article/details/106149854/\"\u003ehttps://blog.csdn.net/qiuchi1975/article/details/106149854/\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/u012388993/article/details/116395497\"\u003ehttps://blog.csdn.net/u012388993/article/details/116395497\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.codercto.com/a/109222.html\"\u003ehttps://www.codercto.com/a/109222.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.anquanke.com/post/id/85218\"\u003ehttps://www.anquanke.com/post/id/85218\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/ba9763ceb620\"\u003ehttps://www.jianshu.com/p/ba9763ceb620\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/756aa623c3b5\"\u003ehttps://www.jianshu.com/p/756aa623c3b5\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/ECJTUACM-873284962/p/9473808.html\"\u003ehttps://www.cnblogs.com/ECJTUACM-873284962/p/9473808.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/756aa623c3b5\"\u003ehttps://www.jianshu.com/p/756aa623c3b5\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/ECJTUACM-873284962/p/9473808.html\"\u003ehttps://www.cnblogs.com/ECJTUACM-873284962/p/9473808.html\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e是个流量包捏,随便翻了一下里面 \u003ccode\u003eHID Data\u003c/code\u003e 里好像有好东西捏,但怎么提取出来捏?看了上面的博客,先把流量包用 \u003ccode\u003etshark\u003c/code\u003e 转换成json,找到 \u003ccode\u003eHID Data\u003c/code\u003e 叫啥,然后再提出来\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003etshark.exe \u003cspan class=\"token parameter variable\"\u003e-T\u003c/span\u003e json \u003cspan class=\"token parameter variable\"\u003e-r\u003c/span\u003e pcapng.pcap \u003cspan class=\"token operator\"\u003e\u0026gt;\u003c/span\u003e test.json\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003etshark.exe \u003cspan class=\"token parameter variable\"\u003e-r\u003c/span\u003e pcapng.pcap \u003cspan class=\"token parameter variable\"\u003e-T\u003c/span\u003e fields \u003cspan class=\"token parameter variable\"\u003e-e\u003c/span\u003e usbhid.data \u003cspan class=\"token operator\"\u003e\u0026gt;\u003c/span\u003e usbdata.txt\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e然后看博客里面只有两位是有用的,然后就是对着表翻译。找了好多脚本都是错的,交了很多次……最后终于找到个有用的\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-python\" data-language=\"python\"\u003e\u003ccode class=\"language-python\"\u003e\u003cspan class=\"token comment\"\u003e# coding:utf-8\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e sys\u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e osusb_codes \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x04\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;aA\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x05\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;bB\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x06\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;cC\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x07\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;dD\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x08\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;eE\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x09\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;fF\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x0A\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;gG\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x0B\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;hH\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x0C\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;iI\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x0D\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;jJ\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x0E\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;kK\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x0F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;lL\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x10\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;mM\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x11\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;nN\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x12\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;oO\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x13\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;pP\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x14\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;qQ\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x15\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;rR\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;sS\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x17\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;tT\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x18\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;uU\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x19\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;vV\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x1A\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;wW\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x1B\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;xX\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x1C\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;yY\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x1D\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;zZ\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x1E\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;1!\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x1F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;2@\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x20\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;3#\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x21\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;4$\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x22\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;5%\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x23\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;6^\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x24\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;7\u0026amp;\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x25\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;8*\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x26\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;9(\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x27\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;0)\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2C\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2D\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;-_\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2E\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;=+\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x2F\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;[{\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x30\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;]}\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x32\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;#~\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x33\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;;:\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x34\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;\u0026#39;\\\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x36\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;,\u0026lt;\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x37\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;.\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x4f\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x50\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;\u0026lt;\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan class=\"token keyword\"\u003edef\u003c/span\u003e \u003cspan class=\"token function\"\u003ecode2chr\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efilepath\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e lines \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e pos \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e x \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003efilepath\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;r\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ereadlines\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e code \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ex\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e6\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# 即第三个字节\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e code \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003econtinue\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# newline or down arrow - move down\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e code \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x51\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eor\u003c/span\u003e code \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x28\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e pos \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e \u003cspan class=\"token keyword\"\u003econtinue\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# up arrow - move up\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e code \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e0x52\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e pos \u003cspan class=\"token operator\"\u003e-=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1\u003c/span\u003e \u003cspan class=\"token keyword\"\u003econtinue\u003c/span\u003e \u003cspan class=\"token comment\"\u003e# select the character based on the Shift key\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"token builtin\"\u003elen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003elines\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026lt;=\u003c/span\u003e pos\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e lines\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eappend\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e code \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e \u003cspan class=\"token builtin\"\u003erange\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token number\"\u003e4\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e81\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eint\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003ex\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e\u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token number\"\u003e16\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token number\"\u003e2\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e code \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e usb_codes\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e lines\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003epos\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e usb_codes\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ecode\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e lines\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003epos\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;\u0026lt;un\u0026gt;\u0026#34;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e code \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e usb_codes\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e lines\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003epos\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e usb_codes\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003ecode\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e\u003cspan class=\"token number\"\u003e0\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token keyword\"\u003eelse\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e lines\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003epos\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;\u0026lt;un\u0026gt;\u0026#34;\u003c/span\u003e result \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efor\u003c/span\u003e x \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e lines\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e result \u003cspan class=\"token operator\"\u003e+=\u003c/span\u003e x \u003cspan class=\"token comment\"\u003e# print(x)\u003c/span\u003e fout \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token builtin\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;C:\\\\Users\\\\(后面路径省略)\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#39;w\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e fout\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ewrite\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003eresult\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e fout\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eclose\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eif\u003c/span\u003e __name__ \u003cspan class=\"token operator\"\u003e==\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;__main__\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e:\u003c/span\u003e code2chr\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#39;C:\\\\Users\\\\(后面路径省略)\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{D@m3daNe_D4me_yoooooo}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch2 id=\"PWN\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#PWN\" class=\"headerlink\" title=\"PWN\"\u003e\u003c/a\u003ePWN\u003c/h2\u003e\u003ch3 id=\"02-test-your-nc\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#02-test-your-nc\" class=\"headerlink\" title=\"02 test_your_nc\"\u003e\u003c/a\u003e02 test_your_nc\u003c/h3\u003e\u003cp\u003e如题\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token function\"\u003enc\u003c/span\u003e pwn.blackbird.wang \u003cspan class=\"token number\"\u003e9500\u003c/span\u003e\u003cspan class=\"token function\"\u003els\u003c/span\u003e\u003cspan class=\"token function\"\u003ecat\u003c/span\u003e flag\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{enjoy_the_netcat_and_the_shell}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"03-Int-overflow\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#03-Int-overflow\" class=\"headerlink\" title=\"03 Int_overflow\"\u003e\u003c/a\u003e03 Int_overflow\u003c/h3\u003e\u003cp\u003e试着试着给了个 \u003ccode\u003e-1\u003c/code\u003e ,得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{y0ul0v3m3m3l0v3y0u_1nt0v3rfl0w}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch2 id=\"Web\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#Web\" class=\"headerlink\" title=\"Web\"\u003e\u003c/a\u003eWeb\u003c/h2\u003e\u003cp\u003e\u003cdel\u003ePHP真实绝绝子\u003c/del\u003e\u003c/p\u003e\u003ch3 id=\"02-Web安全入门指北—GET\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#02-Web%E5%AE%89%E5%85%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8C%97%E2%80%94GET\" class=\"headerlink\" title=\"02 Web安全入门指北—GET\"\u003e\u003c/a\u003e02 Web安全入门指北—GET\u003c/h3\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003ehttp://47.93.215.154:10000/?moe\u003cspan class=\"token operator\"\u003e=\u003c/span\u003eflag\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{We1c0me_t0_CTF_Web!}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"03-Web安全入门指北—POST\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#03-Web%E5%AE%89%E5%85%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8C%97%E2%80%94POST\" class=\"headerlink\" title=\"03 Web安全入门指北—POST\"\u003e\u003c/a\u003e03 Web安全入门指北—POST\u003c/h3\u003e\u003cp\u003e随便找个在线工具发POST就行\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{POST_1s_an_1mp0rtant_m3th0d!}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"04-Web安全入门指北—小饼干\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#04-Web%E5%AE%89%E5%85%A8%E5%85%A5%E9%97%A8%E6%8C%87%E5%8C%97%E2%80%94%E5%B0%8F%E9%A5%BC%E5%B9%B2\" class=\"headerlink\" title=\"04 Web安全入门指北—小饼干\"\u003e\u003c/a\u003e04 Web安全入门指北—小饼干\u003c/h3\u003e\u003cp\u003e浏览器F12 把cookies里值改成1,刷新\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{C00kie_1s_sw33t!}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"05-2048\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#05-2048\" class=\"headerlink\" title=\"05 2048\"\u003e\u003c/a\u003e05 2048\u003c/h3\u003e\u003cp\u003e审查元素大法好,找到代码\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-javascript\" data-language=\"javascript\"\u003e\u003ccode class=\"language-javascript\"\u003e\u003cspan class=\"token function-variable function\"\u003egetFlag\u003c/span\u003e\u003cspan class=\"token operator\"\u003e:\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efunction\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token keyword\"\u003evar\u003c/span\u003e req \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token keyword\"\u003enew\u003c/span\u003e \u003cspan class=\"token class-name\"\u003eXMLHttpRequest\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e req\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003eopen\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;GET\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;flag.php?score=\u0026#34;\u003c/span\u003e\u003cspan class=\"token operator\"\u003e+\u003c/span\u003eobj\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003escore\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token boolean\"\u003etrue\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e req\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function-variable function\"\u003eonload\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token keyword\"\u003efunction\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e \u003cspan class=\"token function\"\u003ealert\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token keyword\"\u003ethis\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eresponseText\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e req\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003e\u003cspan class=\"token function\"\u003esend\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e打开发现申必数字\u003ccode\u003e50000\u003c/code\u003e\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003ehttp://47.93.215.154:5001/flag.php?score\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token number\"\u003e50000\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e获得flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{2048_1s_intere5t1ng!}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003cp\u003e参考博客\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/CSDNiamcoming/article/details/108837347\"\u003e(6条消息) 总结ctf中 MD5 绕过的一些思路_y0un9er-CSDN博客_ctf md5绕过\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token assign-left variable\"\u003ea\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2\u003cspan class=\"token assign-left variable\"\u003eb\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{xdsec3gf9dfg62fh342}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"06-ezinclude\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#06-ezinclude\" class=\"headerlink\" title=\"06 ezinclude\"\u003e\u003c/a\u003e06 ezinclude\u003c/h3\u003e\u003cp\u003e参考博客\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/vhkjhwbs/article/details/99728785\"\u003ehttps://blog.csdn.net/vhkjhwbs/article/details/99728785\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_42181428/article/details/87090539\"\u003ehttps://blog.csdn.net/qq_42181428/article/details/87090539\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.leavesongs.com/PENETRATION/php-filter-magic.html\"\u003ehttps://www.leavesongs.com/PENETRATION/php-filter-magic.html\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/ichunqiu/p/10683379.html\"\u003ehttps://www.cnblogs.com/ichunqiu/p/10683379.html\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003ehttp://47.98.215.112:5000/?file\u003cspan class=\"token operator\"\u003e=\u003c/span\u003ephp://filter/read\u003cspan class=\"token operator\"\u003e=\u003c/span\u003econvert.base64-encode/resource\u003cspan class=\"token operator\"\u003e=\u003c/span\u003eflag.php\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e得到base64字符串,解码\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{xdsec6asdgas7ahfsfaxczc}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003ch3 id=\"07-babeRCE\"\u003e\u003ca href=\"https://blog.ksfu.top/posts/82c9/#07-babeRCE\" class=\"headerlink\" title=\"07 babeRCE\"\u003e\u003c/a\u003e07 babeRCE\u003c/h3\u003e\u003cp\u003e参考博客\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_44657899/article/details/107676580\"\u003ehttps://blog.csdn.net/qq_44657899/article/details/107676580\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e挺有意思,试了里面好多法子,最后试出来了然后还得每个字符之间都加\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003ehttp://47.93.215.154:5000/?rce\u003cspan class=\"token operator\"\u003e=\u003c/span\u003et\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003ea\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003ec\u003cspan class=\"token variable\"\u003e${\u003cspan class=\"token environment constant\"\u003eIFS\u003c/span\u003e}\u003c/span\u003ef\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003el\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003ea\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003eg\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003e\u003cspan class=\"token builtin class-name\"\u003e.\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003ep\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003eh\u003cspan class=\"token variable\"\u003e$@\u003c/span\u003ep\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003eoectf{Do_y0u_l1k3_Rcccccccccccccce?}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e### 08 Do you know HTTP?\u003cp\u003ephp真是绝绝子\u003c/p\u003e\u003cp\u003e用php+curl,查阅了文档,然后一步一步按题给的要求加东西\u003c/p\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-php\" data-language=\"php\"\u003e\u003ccode class=\"language-php\"\u003e\u003cspan class=\"token php language-php\"\u003e\u003cspan class=\"token delimiter important\"\u003e\u0026lt;?php\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$url\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token string single-quoted-string\"\u003e\u0026#39;http://47.93.215.154:5002\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$ch\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token function\"\u003ecurl_init\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$header\u003c/span\u003e \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token keyword\"\u003earray\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e \u003cspan class=\"token string double-quoted-string\"\u003e\u0026#34;Referer: www.ltyyds.com\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string double-quoted-string\"\u003e\u0026#34;X-Forwarded-For: 127.0.0.1\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string double-quoted-string\"\u003e\u0026#34;User-Agent: LT\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e \u003cspan class=\"token string double-quoted-string\"\u003e\u0026#34;Date: Dec, 26 Dec 2015 17:30:00 GMT\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003ecurl_setopt\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$ch\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token constant\"\u003eCURLOPT_URL\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$url\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003ecurl_setopt\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$ch\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token constant\"\u003eCURLOPT_CUSTOMREQUEST\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token string single-quoted-string\"\u003e\u0026#39;HS\u0026#39;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003ecurl_setopt\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$ch\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token constant\"\u003eCURLOPT_TIMEOUT\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e5\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token function\"\u003ecurl_setopt\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$ch\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token constant\"\u003eCURLOPT_RETURNTRANSFER\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token number\"\u003e1\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token comment\"\u003e#curl_setopt($ch,CURLOPT_HTTPHEADER,array(\u0026#34;X-Forwarded-For: 127.0.0.1\u0026#34;));\u003c/span\u003e\u003cspan class=\"token function\"\u003ecurl_setopt\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$ch\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token constant\"\u003eCURLOPT_HTTPHEADER\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$header\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$content\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e\u003cspan class=\"token function\"\u003ecurl_exec\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token variable\"\u003e$ch\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token keyword\"\u003eecho\u003c/span\u003e \u003cspan class=\"token variable\"\u003e$content\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e\u003cspan class=\"token delimiter important\"\u003e?\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003cspan aria-hidden=\"true\" class=\"line-numbers-rows\"\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003cp\u003e得到flag\u003c/p\u003e\u003cdetails\u003e\u003csummary\u003eFlag\u003c/summary\u003e\u003cp\u003e\u003cb\u003emoectf{HTTPHeaders_1s_s0_ea5y!}\u003c/b\u003e\u003c/p\u003e\u003c/details\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/82c9/"},{"title":"blogEncrypt","time":"2021-09-09T14:02:52Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cdiv class=\"hbe hbe-container\" id=\"hexo-blog-encrypt\" data-wpm=\"抱歉, 这个密码看着不太对, 请再试试.\" data-whm=\"抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.\"\u003e \u003cscript id=\"hbeData\" type=\"hbeData\" data-hmacdigest=\"4838c035240a77ed6a78693c026a2ff61b17c3551b0ee6366631d0ca6dcd57bb\"\u003eeefcb32dea6b1b3cf00a6005fbaeec13fe33249b90ab29d6586ecb398d0eca850144a02e601cd72ca042df0f6de4861b3b858d5692d5cde454c3b47084d3a78437917c5f5bbee81f8032aa9a1e29a844b0f4ca6e476c84a7eec435bf74a1be3edabb682d58c0e60af8baf6929662b069f5f11272f77a74d1b3477df7f4251f003c2801887418a7e0ad930d46f0a553d96a393a1222821cabf2e2e4e07db2017269ad22f352e61748bbb4b5c3e35a2cb0f9059ef4225ed713beae899374580e36163878e69f63c6c053ce0ca053c0c747\u003c/script\u003e \u003cdiv class=\"hbe hbe-content\"\u003e \u003cdiv class=\"hbe hbe-input hbe-input-xray\"\u003e \u003cinput class=\"hbe hbe-input-field hbe-input-field-xray\" type=\"password\" id=\"hbePass\"/\u003e \u003clabel class=\"hbe hbe-input-label hbe-input-label-xray\" for=\"hbePass\"\u003e \u003cspan class=\"hbe hbe-input-label-content hbe-input-label-content-xray\"\u003e这里需要密码.\u003c/span\u003e \u003c/label\u003e \u003csvg class=\"hbe hbe-graphic hbe-graphic-xray\" width=\"300%\" height=\"100%\" viewBox=\"0 0 1200 60\" preserveAspectRatio=\"none\"\u003e \u003cpath d=\"M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0\"\u003e\u003c/path\u003e \u003cpath d=\"M0,2.5c0,0,298.666,0,399.333,0C448.336,2.5,513.994,13,597,13c77.327,0,135-10.5,200.999-10.5c95.996,0,402.001,0,402.001,0\"\u003e\u003c/path\u003e \u003c/svg\u003e \u003c/div\u003e \u003c/div\u003e\u003c/div\u003e\u003cscript data-pjax=\"\" src=\"/lib/hbe.js\"\u003e\u003c/script\u003e\u003clink href=\"/css/hbe.style.css\" rel=\"stylesheet\" type=\"text/css\"/\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://blog.ksfu.top/posts/af/"}]},{"name":"Canxin Site","email":"","uri":"https://canxin121.github.io/","description":"Recent content on Canxin Site","article":[{"title":"屏幕 控制 电机(pid)","time":"2023-09-18T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/cover.png\" alt=\"Featured image of post 屏幕 控制 电机(pid)\"/\u003e\u003ch1 id=\"保命事项\"\u003e保命事项\u003c/h1\u003e\n\u003col\u003e\n\u003cli\u003eVCC等电压和GND接地千万不要接反! 否则板子升天, money打水漂.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"元器件列表\"\u003e元器件列表\u003c/h2\u003e\n\u003cp\u003e感谢物院实验室某佬倾情相借!\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eStm32 H750VBT6\u003c/li\u003e\n\u003cli\u003e轮趣科技 Tb6612 稳压版电机驱动\u003c/li\u003e\n\u003cli\u003e轮趣科技 MG513 霍尔解码器版电机\u003c/li\u003e\n\u003cli\u003eTJC3224K024 触控屏\u003c/li\u003e\n\u003cli\u003ePWlink2 lite版本 下载\\调试器\u003c/li\u003e\n\u003cli\u003e一块电池\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"使用工具\"\u003e使用工具\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eVscode + EIDE套装\u003c/li\u003e\n\u003cli\u003eKeil u5(\u003c/li\u003e\n\u003cli\u003eStm Cube MX\u003c/li\u003e\n\u003cli\u003eUSART HMI (TJC图形化编程工具)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"实践过程\"\u003e实践过程\u003c/h2\u003e\n\u003ch3 id=\"接线\"\u003e接线\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cem\u003e电机\u003c/em\u003e 和 \u003cem\u003e驱动板\u003c/em\u003e接线, 这里直接使用附赠的排线连接.\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e驱动板\u003c/em\u003e 和 \u003cem\u003eStm主板\u003c/em\u003e 接线 ( 可以按照自己喜欢的布局连接, 也可以参考驱动板厂家给出的示例.\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e显示屏\u003c/em\u003e 和 \u003cem\u003eStm主板\u003c/em\u003e 接线 (TX,RX对接就完了), 这里电池给显示屏供电, 所以直接接到了驱动板引出的5v和GND.\u003c/li\u003e\n\u003cli\u003e\u003cem\u003ePwlink2lite下载器\u003c/em\u003e 和 \u003cem\u003eStm主板\u003c/em\u003e 接线( 这里要单独接一个TX-\u0026gt;RX, 用来输出调试信息).\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e这里简单介绍下不同串口的接线意义:\u003c/p\u003e\n\u003ch4 id=\"驱动板和stm\"\u003e驱动板和Stm\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e驱动板的 E2A和E2B (这里的2代表用的第二个电机,也就是B电机,“A”,“B\u0026#34;代表编码器的A相和B相) 接 Stm 的 两个Pin设定同一个TIM并且将该TIM设定为Combined Mode下的Encoder Mode用来解码从电机获取的实际转速(这里实际是 固定时间的位移 正比于速度, 可以当成转速来用)\u003c/li\u003e\n\u003cli\u003e驱动板的 ADC 接口 (这里是用来读取电压) 接 Stm 的 Pin 设定为 ADC_IN.(呃呃,这里最后其实没把电压显示出来,所以没用上)\u003c/li\u003e\n\u003cli\u003e驱动板的 PWMB (这里的B就是代表B电机了) 接 Stm 的 Pin 设定为 TIM 并将对应 TIM 的 对应 CH 设定为PWM GENERATION CHx, 用来输出PWM信号\u003c/li\u003e\n\u003cli\u003e驱动版的 BIN1,2 接 Stm 的 Pin 设定为 GPIO OUTput, 用来设定电机旋转的模式\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e还有其他的使能,电源接口就不赘述了.可以查看 驱动板的使用说明\u003c/p\u003e\n\u003ch4 id=\"触控屏和stm\"\u003e触控屏和Stm\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e触控屏使用UART通信, TX,RX 和 Stm 对接(小白注意嗷,TX-\u0026gt;RX对接), Stm上的 两个Pin 设置RX,TX(这里用的USART), 并且要打开对应USART的NVIC (中断)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"stm和-pwlink2lite-下载器\"\u003eStm和 PwLink2lite 下载器\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e调试下载的直接对应相连, 电压接3v3, GND对接\u003c/li\u003e\n\u003cli\u003ePwlink2lite 的 Rx 接到Stm 的 Pin 设置为 USART TX, 用来发送调试信息(后面的代码部分会提到Printf的重定向)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"stm-cube-mx-配置\"\u003eStm Cube MX 配置\u003c/h3\u003e\n\u003cp\u003e这里的创建工程略过, 小白可以自己看看MX的教学视频\u003c/p\u003e\n\u003ch4 id=\"串口设定pin-out\"\u003e串口设定(Pin OUT)\u003c/h4\u003e\n\u003ch5 id=\"这里的串口要对应好自己的实际接线\"\u003e这里的串口要对应好自己的实际接线.\u003c/h5\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/pin_out.png\" width=\"1112\" height=\"989\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/pin_out_hu06611d6c8d4fc68f059f2a7211a156e7_199638_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/pin_out_hu06611d6c8d4fc68f059f2a7211a156e7_199638_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" class=\"gallery-image\" data-flex-grow=\"112\" data-flex-basis=\"269px\"/\u003e\u003c/p\u003e\n\u003ch4 id=\"串口相应功能设定\"\u003e串口相应功能设定\u003c/h4\u003e\n\u003cp\u003e这些功能要对应好你实际的串口设定\u003c/p\u003e\n\u003ch5 id=\"tim\"\u003eTIM\u003c/h5\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/rcc.png\" width=\"1417\" height=\"635\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/rcc_hu749d9b4ca982880304e14ae1d218a3b9_148125_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/rcc_hu749d9b4ca982880304e14ae1d218a3b9_148125_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"然后RCC设置给时钟HSE选择CCR源\" class=\"gallery-image\" data-flex-grow=\"223\" data-flex-basis=\"535px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/encoder.png\" width=\"964\" height=\"591\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/encoder_hu0cb4eaea236f392224f4bb2d886ce4cd_111946_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/encoder_hu0cb4eaea236f392224f4bb2d886ce4cd_111946_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"Encoder (E2A,E2B)\" class=\"gallery-image\" data-flex-grow=\"163\" data-flex-basis=\"391px\"/\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/pwm.png\" width=\"914\" height=\"577\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/pwm_hu536268e8857b5e7c97e540165974e99a_104347_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/pwm_hu536268e8857b5e7c97e540165974e99a_104347_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"Pwm (PwmB)\" class=\"gallery-image\" data-flex-grow=\"158\" data-flex-basis=\"380px\"/\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/time_control.png\" width=\"941\" height=\"875\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/time_control_hu4db4ca04e1c690adffb3211d5d5e5ab9_165813_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/time_control_hu4db4ca04e1c690adffb3211d5d5e5ab9_165813_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"TIM \" class=\"gallery-image\" data-flex-grow=\"107\" data-flex-basis=\"258px\"/\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/time_control1.png\" width=\"934\" height=\"709\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/time_control1_hud30bc67d88e4606d86734df99e013dba_183490_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/time_control1_hud30bc67d88e4606d86734df99e013dba_183490_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"续上图配置的周期(用于控制读Encoder并设定Pwm的间隔,这里调成了0.1秒多一次)\" class=\"gallery-image\" data-flex-grow=\"131\" data-flex-basis=\"316px\"/\u003e\u003c/p\u003e\n\u003ch5 id=\"adc\"\u003eADC\u003c/h5\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/adc.png\" width=\"910\" height=\"435\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/adc_hu76805e7ed3647cf5d90adcec01194c89_44184_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/adc_hu76805e7ed3647cf5d90adcec01194c89_44184_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"这里的ADC设置了Single-ended模式\" class=\"gallery-image\" data-flex-grow=\"209\" data-flex-basis=\"502px\"/\u003e\u003c/p\u003e\n\u003ch5 id=\"gpio\"\u003eGPIO\u003c/h5\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/gpio.png\" width=\"931\" height=\"1081\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/gpio_hu4620c1d6af36e037585fadb09c11ee09_156730_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/gpio_hu4620c1d6af36e037585fadb09c11ee09_156730_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"这里的GPIO的Bin1和Bin2可以打个标签区分一下, 同时两个都Pull Down(对应的状态是 电机停止)\" class=\"gallery-image\" data-flex-grow=\"86\" data-flex-basis=\"206px\"/\u003e\u003c/p\u003e\n\u003ch5 id=\"usart\"\u003eUSART\u003c/h5\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/screen_usart.png\" width=\"938\" height=\"785\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/screen_usart_hu3a00685f918a87810710b7d4b581c1cc_143248_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/screen_usart_hu3a00685f918a87810710b7d4b581c1cc_143248_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"触控屏接到的USART还要打开NVIC全局中断\" class=\"gallery-image\" data-flex-grow=\"119\" data-flex-basis=\"286px\"/\u003e\n![发送调试信息到Pwlink2lite的Usart把Mode打开成Async就好]\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/printf_usart.png\" width=\"937\" height=\"445\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/printf_usart_hufbbd1ce6f6e9d2cf426b2d4c66957dc5_52572_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/printf_usart_hufbbd1ce6f6e9d2cf426b2d4c66957dc5_52572_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"Alt text\" class=\"gallery-image\" data-flex-grow=\"210\" data-flex-basis=\"505px\"/\u003e\u003c/p\u003e\n\u003ch5 id=\"project-manager\"\u003eProject Manager\u003c/h5\u003e\n\u003cp\u003e然后配置一下生成代码的设置, 让它生成单独的c/h文件, 并且生成MDK(Keil)的源代码, 这样后面的VSC + EIDE可以直接以MDK项目格式导入进去,嘎嘎方便.\n\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/hc.png\" width=\"2557\" height=\"1260\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/hc_hub7ae0b88da0fd6eb5b9d150d279a9c1c_307450_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/hc_hub7ae0b88da0fd6eb5b9d150d279a9c1c_307450_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"生成单独c/h文件\" class=\"gallery-image\" data-flex-grow=\"202\" data-flex-basis=\"487px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/mdk.png\" width=\"2560\" height=\"1263\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/mdk_huf2c82dab1e6b106f83a5e1f661bb4c21_350215_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/mdk_huf2c82dab1e6b106f83a5e1f661bb4c21_350215_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"生成MDK项目\" class=\"gallery-image\" data-flex-grow=\"202\" data-flex-basis=\"486px\"/\u003e\u003c/p\u003e\n\u003ch3 id=\"usart-hmi-写刷-触控屏程序\"\u003eUSART HMI 写/刷 触控屏程序\u003c/h3\u003e\n\u003cp\u003e小白可以先看看这个系列教程了解一下这个 陶晶驰的图形化设计软件的使用方法\u003cbr/\u003e\n\u003c/p\u003e\u003cdiv class=\"video-wrapper\"\u003e\n\u003ciframe src=\"https://player.bilibili.com/player.html?as_wide=1\u0026amp;high_quality=1\u0026amp;page=1\u0026amp;bvid=BV16T4y127YE\u0026amp;autoplay=0\" scrolling=\"no\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"\u003e\n\u003c/iframe\u003e\n\u003c/div\u003e\n点击上面可以跳转到完整的系列视频⬆️⬆️⬆️\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e下面是正文⬇️⬇️⬇️\u003c/p\u003e\n\u003cp\u003e我设计的简陋的界面\n\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/home.png\" width=\"2072\" height=\"795\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/home_hu4d582b6e9de5983c6fdf2c2f2b1c7da8_247571_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/home_hu4d582b6e9de5983c6fdf2c2f2b1c7da8_247571_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"HOME\" class=\"gallery-image\" data-flex-grow=\"260\" data-flex-basis=\"625px\"/\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/about.png\" width=\"1978\" height=\"783\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/about_huac7dfe68c132b969493914a8117ee917_356200_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/about_huac7dfe68c132b969493914a8117ee917_356200_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"ABOUT\" class=\"gallery-image\" data-flex-grow=\"252\" data-flex-basis=\"606px\"/\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/func.png\" width=\"1873\" height=\"749\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/func_hu87881c4c4d9fd19bd5b5842f06b5fc53_263046_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/func_hu87881c4c4d9fd19bd5b5842f06b5fc53_263046_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"FUNC\" class=\"gallery-image\" data-flex-grow=\"250\" data-flex-basis=\"600px\"/\u003e\u003c/p\u003e\n\u003cp\u003e这里面唯一有用的就是func界面了(其他纯属引流嗷,建议别学我嗷\n\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/func_deatil.png\" width=\"687\" height=\"522\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/func_deatil_hu57adf9d35597e7a450a8e7d262e59fc3_255222_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/func_deatil_hu57adf9d35597e7a450a8e7d262e59fc3_255222_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"Func\" class=\"gallery-image\" data-flex-grow=\"131\" data-flex-basis=\"315px\"/\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e首先需要两个数字框(绑定数字键盘), 一个用来设定目标速度,一个用来设定目标圈数,并且设定了初始值\u003c/li\u003e\n\u003cli\u003e然后加个复选框来 选择 正转 or 反转\u003c/li\u003e\n\u003cli\u003e然后加两个按钮, 一个start 一个 stop, 本质都是用uart发一些数据\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e这里两个按钮需要自己定义一个简单的通信协议, 我这里是这样极其简陋乱写的\u003cbr/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/start.png\" width=\"193\" height=\"280\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/start_hub1ea8b066bc44846cdeb9988ecd989c4_20676_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/start_hub1ea8b066bc44846cdeb9988ecd989c4_20676_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"Start\" class=\"gallery-image\" data-flex-grow=\"68\" data-flex-basis=\"165px\"/\u003e\u003cimg src=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/stop.png\" width=\"344\" height=\"294\" srcset=\"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/stop_hu2a72a1dc7b1766df73c052fd9822e9e0_24339_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/images/stop_hu2a72a1dc7b1766df73c052fd9822e9e0_24339_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"Stop\" class=\"gallery-image\" data-flex-grow=\"117\" data-flex-basis=\"280px\"/\u003e\u003cbr/\u003e\n也就是 [-1,速度的整数,-2,圈数的整数,-3,复选框(正/反转)的整数]\u003c/p\u003e\n\u003cp\u003e搞定程序设计我们调试试一下效果,没有问题就可以把 屏幕用下载器接到电脑(自己简单对接可以)\u003c/p\u003e\n\u003ch3 id=\"vscode--eide\"\u003eVscode + EIDE\u003c/h3\u003e\n\u003ch4 id=\"环境配置\"\u003e环境配置\u003c/h4\u003e\n\u003cp\u003e小白直接看这个教程吧\n\u003c/p\u003e\u003cdiv class=\"video-wrapper\"\u003e\n\u003ciframe src=\"https://player.bilibili.com/player.html?as_wide=1\u0026amp;high_quality=1\u0026amp;page=1\u0026amp;bvid=BV1nr4y1R7Jb\u0026amp;autoplay=0\" scrolling=\"no\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"\u003e\n\u003c/iframe\u003e\n\u003c/div\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch4 id=\"控制代码\"\u003e控制代码\u003c/h4\u003e\n\u003cp\u003eEIDE 导入项目后 开始写代码\u003cbr/\u003e\n这里由于程序简单, 我直接全写在main.c了\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e这里注意一定要在 BEGIN 和 END 中间来写自己的代码, 否则CubeMX再次生成代码时, 会把你非用户代码区的代码删掉了.\u003c/em\u003e\u003cbr/\u003e\n\u003cem\u003e下面的代码中也只有 BEGIN 和 END 中间的代码是开发者自己写的,其他全部由CubeMX自动生成\u003c/em\u003e\u003c/p\u003e\n\u003ch5 id=\"include\"\u003einclude\u003c/h5\u003e\n\u003cp\u003e这里只用到了一个pid(这个代码分享在最后吧), 一个stdio(使用printf)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN Includes */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;pid.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;stdio.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END Includes */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch5 id=\"用uart重定向printf到调试器\"\u003e用uart重定向printf到调试器\u003c/h5\u003e\n\u003cp\u003e这个记住就好啦, 网上抄来的方法, 确实不错的方案\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003efputc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eFILE\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ef\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 使用HAL库函数HAL_UART_Transmit将字符ch发送到UART4串口\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart4\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 返回发送的字符,这通常不会有实际的影响,但是它需要返回发送的字符。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch5 id=\"main函数\"\u003emain函数\u003c/h5\u003e\n\u003col\u003e\n\u003cli\u003e初始化一些参数, 并初始化一个PID计算的结构体\u003c/li\u003e\n\u003cli\u003e把屏幕控制的USART打开来接受信息, 并且设置每接受六次产生一次中断(因为上面的串口屏是设定的发送6个整数)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e70\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 0 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 定义一个全局的PID结构体,用来计算PID的时候传参\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e \u003cspan class=\"n\"\u003epid\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 定义一个buf用来储存从屏幕的uart收到的消息(发了6个整数)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END 0 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief The application entry point.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @retval int\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 1 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END 1 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* MCU Configuration--------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* Reset of all peripherals, Initializes the Flash interface and the Systick. */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN Init */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END Init */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* Configure the system clock */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eSystemClock_Config\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN SysInit */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END SysInit */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* Initialize all configured peripherals */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_GPIO_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_TIM3_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_ADC1_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_TIM2_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_TIM4_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_UART4_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_USART1_UART_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 2 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这里是一个坑, 详情请看下面的PWM部分的Read_Encoder()\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM2\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eCNT\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x7FFF\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 把屏幕的UART的接受消息打开,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_Receive_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 把PID结构体初始化,这里的P I D参数要看自己选择合适的值, 可以根据实际情况适当调节.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KP\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KI\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KD\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 调用PID初始化函数(这个代码我放在结尾吧, 作者是物院实验室某佬)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 这里最后两个参数是限定I项的, 具体左右可以看代码\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003ePID_init\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003epid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KP\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KI\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KD\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END 2 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* Infinite loop */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN WHILE */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END WHILE */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 3 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END 3 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch5 id=\"屏幕串口的uart中断\"\u003e屏幕串口的UART中断\u003c/h5\u003e\n\u003cp\u003e我们通过重定义中断回调函数来实现对HAL的中断回调的使用\u003cbr/\u003e\n下面的代码 通过 屏幕串口USART中断来实现 不同状态下 激活/关闭 计时器和电机\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 74\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 75\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 76\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 77\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 78\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 79\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 80\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 81\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 82\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 83\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 84\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 85\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 86\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 87\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 88\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 89\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 90\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 91\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 92\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 93\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 94\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 95\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 96\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 97\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 98\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 99\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e100\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e101\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e102\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e103\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e104\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e105\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e106\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e107\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e108\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e109\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e110\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e111\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e112\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e113\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e114\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e115\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e116\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e117\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e118\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e119\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e120\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e121\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e122\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e123\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e124\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e125\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e126\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e127\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e128\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e129\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e130\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e131\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e132\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e133\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e134\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这里定义一些变量\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 电机转一圈所需的Encoder读数累和\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eEach_Circle\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1440\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 设定的目标速度 Encoder读出的真实速度\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 设定的目标位置总读数和 实际位置读数和\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 给电机的PWM设定的占空比数值(这里需要每次累加,因为使用的是增程式pid)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eStart_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Start Encoder tim 开启解码器时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_Encoder_Start\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_ALL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Start Time Control tim 开启定时控制的时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_Base_Start_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim4\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Start the pwm tim 开启pwm输出的时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_PWM_Start\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_3\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eStop_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 重置各种参数。 防止下次启动时有上次残留的值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eReality_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Stop Encoder tim 关闭解码器时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_Encoder_Stop\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_ALL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Stop Time Control tim 关闭定时控制的时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_Base_Stop_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim4\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Stop the pwm tim 关闭pwm输出的时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_PWM_Stop\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_3\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这个函数用来设定电机 正转/反转/不转/刹车\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eMoTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003emode\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这里需要对照你的接线来设定,BIN1和BIN2对应的不同状态状态可以在驱动的说明中找到\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 同时也要对应好 屏幕设定的 复选框 发送的0/1对应的正反转\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"cm\"\u003e/*\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e 1 foreward\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e 0 reversal\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e -1 stop\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e -2 brake\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eswitch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emode\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_SET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_SET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_SET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_SET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_RxCpltCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eUART_HandleTypeDef\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这是HAL库提供的UART接收完成回调函数,当UART接收完成时,该函数会被自动调用。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 判断是哪个UART触发了回调,这里使用了单个UART1,可以根据实际情况进行扩展。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 清除空闲中断标志位,UART通信中,空闲中断通常用于检测接收结束。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_CLEAR_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_CLEAR_IDLEF\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 禁用UART发送中断,以防止在处理接收数据时发送数据。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_DISABLE_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_IT_TXE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 检查接收到的数据是否符合预期的协议,如果传输中出错了,就直接跳过不执行,根据协议格式解析数据。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// -1 -2 -3\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFF\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFE\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFD\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 从接收到的数据中提取速度、圈数和模式信息。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003espeed\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ecircle\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003emode\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 检查速度和圈数是否都不为零,才需要转动。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003espeed\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003ecircle\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 如果目标速度和位置都为零,则说明当前没有进行任何动作,可以开始新的动作。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 设置目标速度和目标位置。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003espeed\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecircle\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eEach_Circle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 根据模式调用MoTo函数执行相应的操作。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// MoTo 函数定义时要把屏幕传过来的 (0/1) 和 真实转动的对应正确\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eMoTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emode\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 启动定时器,这样其他的中断才会发生。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eStart_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 如果速度或圈数为零,就说明要停下电机。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eMoTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 调用MoTo函数执行刹停电机。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 重置各种参数(防止下次启动时有上次残留的值) 并且 停止定时器。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eStop_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 重新启用UART发送中断,以便后续可以发送数据。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_ENABLE_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_IT_TXE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 重新启用UART接收中断,以便继续接收数据。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_Receive_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 清空UART的数据寄存器,以确保不会因为残留数据而触发接收中断。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_FLUSH_DRREGISTER\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 清除UART接收缓冲区非空标志位,以确保下一次接收可以正常触发中断。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_CLEAR_FLAG\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_FLAG_RXNE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch5 id=\"固定时间间隔的-中断控制\"\u003e固定时间间隔的 中断控制\u003c/h5\u003e\n\u003cp\u003e之所以要新开一个 tim, 固定时间的读取encoder并设定pwm, 是为了\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eencoder读出的实际可以理解为转动的总距离, 只有时间间隔固定, 我们才能将固定时间的 转动距离差 当作 速度来用\u003c/li\u003e\n\u003cli\u003e防止过快的设置pwm, 别把电机玩坏了(\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e52\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这里读取encoder有一个坑\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 由于这个encoder是一直累加(或减,取决于电机正反转)的, 它累加到最大值(减到0) 就自动重置了\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 因此你上一次读的数 不一定比 这次读的数大, 这样一算差值, 就可能出现一个极其大的负值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 为了防止这种情况, 我们就需要把这个 tim 的读数一开始(main里面就设置了)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 就设定到一个 中间数值(0和最大之间), 并且 每次读完之后都把它设定回去\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这样就能保证每次都得到一个 计算正确的 值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint16_t\u003c/span\u003e \u003cspan class=\"nf\"\u003eRead_Encoder\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint16_t\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_TIM_GET_COUNTER\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTIM2\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eCNT\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x7FFF\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e-=\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x7FFF\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这里因为电机 正传反转 有一种情况是累加,一种是累减, 所以有正有负\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 但是计算pid并设置pwm都是正值, 所以返回绝对值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 固定时间间隔的 中断控制, 每0.1秒多执行一次\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_PeriodElapsedCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eTIM_HandleTypeDef\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim4\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 读取实际转速(相当于转速)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003eRead_Encoder\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 转速累和相当于总距离(实际上转速使用这个总距离做差才算出来的,前面已经解释过了)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 每次先判断是不是已经到了设定的要转的总距离, 如果是, 刹车关定时器重置相关参数\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eReality_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 刹车\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eMoTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 停止计时器\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eStop_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 用PID算法计算出要设定的pwm值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"nf\"\u003ePID\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003epid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这里串口输出一下调试信息,方便查看\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;target: %d, real: %d, set: %d\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 设定pwm值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eSet_Pwm\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"相关代码分享\"\u003e相关代码分享\u003c/h2\u003e\n\u003ch3 id=\"pid\"\u003epid\u003c/h3\u003e\n\u003cp\u003e由某物院实验室佬手写\u003c/p\u003e\n\u003cp\u003epid.h\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#ifndef __PID_H_\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#define __PID_H_\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#define MAX_LEN 15\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eKP\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eKI\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eKD\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eMAX_LEN\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eMAX_I\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eLEN\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eis_first\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 解决D的首次误差减去0得到一个不正常的D值问题\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003etop_index\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003ePID_init\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003ekp\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eki\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003ekd\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003emax_i\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"nf\"\u003ePID\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003etar\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#endif\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003epid.c\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 74\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 75\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 76\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 77\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 78\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 79\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 80\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 81\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 82\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 83\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 84\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 85\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 86\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 87\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 88\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 89\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 90\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 91\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 92\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 93\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 94\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 95\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 96\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 97\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 98\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 99\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e100\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e101\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e102\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e103\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e104\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e105\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e106\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e107\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e108\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e109\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e110\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e111\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @file PID\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @author zl (2293721550@qq.com)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief 一个通用的PID函数,该PID接收返回数据全部为float类型\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * 使用时先构造PID_struct类型的结构体,再调用PID_init()函数初始化结构体,最后调用PID()函数得到PID的返回值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @version 0.1\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @date 2023-08-24\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @copyright Copyright (c) 2023\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;pid.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief 初始化PID结构体\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param pid_struct 想要初始化的PID结构体指针\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param kp P项比例系数\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param ki I项比例系数\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param kd D项比例系数\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param len I积分项长度(不能超过MAX_LEN的设定值)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param max_i I项最大输出量,防止出现积分量过大导致的过冲\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003ePID_init\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003ekp\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eki\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003ekd\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003emax_i\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eKP\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ekp\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eKI\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eki\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eKD\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ekd\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eLEN\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eMAX_I\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003emax_i\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eis_first\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eMAX_LEN\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief 求出积分项值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param pid_struct 想要处理的PID结构体指针\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @return float\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"nf\"\u003eerr_sum\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 获取I值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003ebuf\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eMAX_LEN\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ebuf\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ebuf\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief 求出微分项值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param pid_struct 想要处理的PID结构体指针\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @return float\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"nf\"\u003eerr_change\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 获取D值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003echange_speed\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eis_first\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003echange_speed\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eMAX_LEN\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003echange_speed\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eis_first\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003echange_speed\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief PID函数\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param pid_struct 想要处理的PID结构体指针\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param tar 目标值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param cur 当前值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @return float 返回PID计算后的值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"nf\"\u003ePID\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003etar\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003epid\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eerr\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etar\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ecur\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eP\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eI\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eD\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// PID数据先进先出\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eLEN\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eLEN\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eLEN\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eMAX_LEN\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eP\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 获取PID三值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eI\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003eerr_sum\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eD\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003eerr_change\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 数据头向前移动一个\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"n\"\u003eMAX_LEN\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etop_index\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eI\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eKI\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eMAX_I\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eI\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eMAX_I\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eKI\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eI\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eI\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 限制I的累计不可大于MAX_I\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003epid\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eP\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eKP\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eI\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eKI\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eD\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003epid_struct\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eKD\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 计算出PID的返回值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003epid\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"完整的mainc程序\"\u003e完整的main.c程序\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 74\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 75\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 76\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 77\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 78\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 79\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 80\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 81\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 82\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 83\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 84\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 85\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 86\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 87\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 88\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 89\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 90\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 91\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 92\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 93\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 94\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 95\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 96\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 97\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 98\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 99\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e100\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e101\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e102\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e103\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e104\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e105\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e106\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e107\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e108\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e109\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e110\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e111\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e112\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e113\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e114\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e115\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e116\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e117\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e118\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e119\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e120\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e121\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e122\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e123\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e124\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e125\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e126\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e127\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e128\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e129\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e130\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e131\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e132\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e133\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e134\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e135\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e136\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e137\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e138\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e139\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e140\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e141\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e142\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e143\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e144\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e145\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e146\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e147\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e148\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e149\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e150\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e151\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e152\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e153\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e154\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e155\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e156\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e157\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e158\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e159\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e160\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e161\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e162\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e163\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e164\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e165\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e166\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e167\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e168\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e169\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e170\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e171\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e172\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e173\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e174\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e175\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e176\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e177\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e178\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e179\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e180\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e181\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e182\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e183\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e184\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e185\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e186\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e187\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e188\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e189\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e190\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e191\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e192\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e193\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e194\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e195\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e196\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e197\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e198\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e199\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e200\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e201\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e202\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e203\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e204\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e205\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e206\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e207\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e208\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e209\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e210\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e211\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e212\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e213\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e214\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e215\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e216\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e217\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e218\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e219\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e220\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e221\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e222\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e223\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e224\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e225\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e226\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e227\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e228\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e229\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e230\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e231\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e232\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e233\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e234\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e235\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e236\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e237\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e238\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e239\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e240\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e241\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e242\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e243\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e244\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e245\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e246\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e247\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e248\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e249\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e250\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e251\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e252\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e253\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e254\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e255\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e256\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e257\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e258\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e259\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e260\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e261\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e262\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e263\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e264\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e265\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e266\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e267\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e268\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e269\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e270\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e271\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e272\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e273\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e274\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e275\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e276\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e277\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e278\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e279\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e280\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e281\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e282\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e283\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e284\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e285\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e286\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e287\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e288\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e289\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e290\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e291\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e292\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e293\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e294\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e295\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e296\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e297\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e298\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e299\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e300\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e301\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e302\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e303\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e304\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e305\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e306\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e307\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e308\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e309\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e310\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e311\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e312\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e313\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e314\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e315\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e316\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e317\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e318\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e319\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e320\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e321\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e322\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e323\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e324\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e325\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e326\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e327\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e328\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e329\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e330\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e331\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e332\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e333\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e334\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e335\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e336\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e337\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e338\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e339\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e340\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e341\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e342\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e343\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e344\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e345\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e346\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e347\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e348\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e349\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e350\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e351\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e352\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e353\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e354\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e355\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e356\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e357\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e358\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e359\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e360\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e361\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e362\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e363\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e364\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e365\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e366\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e367\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e368\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e369\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e370\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e371\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e372\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e373\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e374\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e375\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e376\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e377\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e378\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e379\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e380\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e381\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e382\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e383\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e384\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e385\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e386\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e387\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e388\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e389\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e390\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e391\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e392\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e393\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e394\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e395\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e396\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e397\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e398\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e399\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e400\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e401\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e402\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e403\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e404\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e405\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e406\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e407\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e408\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e409\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e410\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e411\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e412\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e413\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e414\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e415\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e416\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e417\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e418\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e419\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e420\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e421\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e422\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e423\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e424\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e425\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e426\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e427\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e428\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e429\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e430\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e431\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e432\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e433\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e434\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e435\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e436\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e437\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e438\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e439\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e440\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e441\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e442\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e443\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e444\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e445\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e446\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e447\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e448\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e449\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e450\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e451\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e452\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e453\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e454\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN Header */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e ******************************************************************************\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @file : main.c\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief : Main program body\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e ******************************************************************************\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @attention\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * Copyright (c) 2023 STMicroelectronics.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * All rights reserved.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * This software is licensed under terms that can be found in the LICENSE file\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * in the root directory of this software component.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * If no LICENSE file comes with this software, it is provided AS-IS.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e ******************************************************************************\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END Header */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* Includes ------------------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;main.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;adc.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;tim.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;usart.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;gpio.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* Private includes ----------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN Includes */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;pid.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026#34;stdio.h\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END Includes */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* Private typedef -----------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN PTD */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END PTD */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* Private define ------------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN PD */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END PD */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* Private macro -------------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN PM */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END PM */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* Private variables ---------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN PV */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END PV */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* Private function prototypes -----------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eSystemClock_Config\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN PFP */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END PFP */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* Private user code ---------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 0 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// redirect `printf`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003efputc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eFILE\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ef\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 使用HAL库函数HAL_UART_Transmit将字符ch发送到UART4串口\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart4\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 返回发送的字符,这通常不会有实际的影响,但是它需要返回发送的字符。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// uint16_t Get_adc(void)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// HAL_ADC_Start(\u0026amp;hadc1);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// HAL_ADC_PollForConversion(\u0026amp;hadc1, 2);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// if (HAL_IS_BIT_SET(HAL_ADC_GetState(\u0026amp;hadc1), HAL_ADC_STATE_REG_EOC))\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// return HAL_ADC_GetValue(\u0026amp;hadc1);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// else\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// return Get_adc();\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// uint16_t Get_adc_Average(uint8_t times)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// uint32_t sum = 0;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// for (uint8_t i = 0; i \u0026lt; times; i++)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// sum += Get_adc();\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// return sum / times;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// define pid struct\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"n\"\u003ePID_struct\u003c/span\u003e \u003cspan class=\"n\"\u003epid\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// the buf for screen usart\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END 0 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief The application entry point.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @retval int\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 1 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END 1 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* MCU Configuration--------------------------------------------------------*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* Reset of all peripherals, Initializes the Flash interface and the Systick. */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN Init */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END Init */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* Configure the system clock */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eSystemClock_Config\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN SysInit */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END SysInit */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* Initialize all configured peripherals */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_GPIO_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_TIM3_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_ADC1_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_TIM2_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_TIM4_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_UART4_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eMX_USART1_UART_Init\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这里是一个坑, 详情请看下面的PWM部分的Read_Encoder()\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM2\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eCNT\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x7FFF\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 把屏幕的UART的接受消息打开,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_Receive_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 把PID结构体初始化,这里的P I D参数要看自己选择合适的值, 可以根据实际情况适当调节.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kt\"\u003efloat\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KP\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KI\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KD\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 调用PID初始化函数(这个代码我放在结尾吧, 作者是物院实验室某佬)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 这里最后两个参数是限定I项的, 具体左右可以看代码\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003ePID_init\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003epid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KP\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KI\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIncremental_KD\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END 2 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* Infinite loop */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN WHILE */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END WHILE */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 3 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END 3 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief System Clock Configuration\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @retval None\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eSystemClock_Config\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitTypeDef\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitTypeDef\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Supply configuration update enable\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_PWREx_ConfigSupply\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ePWR_LDO_SUPPLY\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Configure the main internal regulator output voltage\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003e__HAL_PWR_VOLTAGESCALING_CONFIG\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ePWR_REGULATOR_VOLTAGE_SCALE3\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nf\"\u003e__HAL_PWR_GET_FLAG\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ePWR_FLAG_VOSRDY\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Initializes the RCC Oscillators according to the specified parameters\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * in the RCC_OscInitTypeDef structure.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOscillatorType\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_OSCILLATORTYPE_HSI\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eHSIState\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_HSI_DIV1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eHSICalibrationValue\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_HSICALIBRATION_DEFAULT\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLState\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_PLL_ON\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLSource\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_PLLSOURCE_HSI\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLM\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLN\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e9\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLP\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLQ\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLR\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLRGE\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_PLL1VCIRANGE_3\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLVCOSEL\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_PLL1VCOMEDIUM\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePLLFRACN\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3072\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nf\"\u003eHAL_RCC_OscConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003eRCC_OscInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003eHAL_OK\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eError_Handler\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Initializes the CPU, AHB and APB buses clocks\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eClockType\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_CLOCKTYPE_HCLK\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_CLOCKTYPE_SYSCLK\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_CLOCKTYPE_PCLK1\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_CLOCKTYPE_PCLK2\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_CLOCKTYPE_D3PCLK1\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_CLOCKTYPE_D1PCLK1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSYSCLKSource\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_SYSCLKSOURCE_PLLCLK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSYSCLKDivider\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_SYSCLK_DIV1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAHBCLKDivider\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_HCLK_DIV1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAPB3CLKDivider\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_APB3_DIV1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAPB1CLKDivider\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_APB1_DIV2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAPB2CLKDivider\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_APB2_DIV2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAPB4CLKDivider\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRCC_APB4_DIV1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nf\"\u003eHAL_RCC_ClockConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003eRCC_ClkInitStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eFLASH_LATENCY_1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003eHAL_OK\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eError_Handler\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 4 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这里定义一些变量\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 电机转一圈所需的Encoder读数累和\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eEach_Circle\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1440\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 设定的目标速度 Encoder读出的真实速度\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 设定的目标位置总读数和 实际位置读数和\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 给电机的PWM设定的占空比数值(这里需要每次累加,因为使用的是增程式pid)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eStart_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Start Encoder tim 开启解码器时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_Encoder_Start\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_ALL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Start Time Control tim 开启定时控制的时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_Base_Start_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim4\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Start the pwm tim 开启pwm输出的时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_PWM_Start\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_3\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eStop_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 重置各种参数。 防止下次启动时有上次残留的值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eReality_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Stop Encoder tim 关闭解码器时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_Encoder_Stop\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_ALL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Stop Time Control tim 关闭定时控制的时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_Base_Stop_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim4\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Stop the pwm tim 关闭pwm输出的时钟\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_PWM_Stop\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_3\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这个函数用来设定电机 正转/反转/不转/刹车\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eMoTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003emode\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这里需要对照你的接线来设定,BIN1和BIN2对应的不同状态状态可以在驱动的说明中找到\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 同时也要对应好 屏幕设定的 复选框 发送的0/1对应的正反转\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"cm\"\u003e/*\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e 1 foreward\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e 0 reversal\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e -1 stop\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e -2 brake\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eswitch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emode\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_SET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_SET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_SET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_SET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN1_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003eHAL_GPIO_WritePin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPIOB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBIN2_Pin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eGPIO_PIN_RESET\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_RxCpltCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eUART_HandleTypeDef\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这是HAL库提供的UART接收完成回调函数,当UART接收完成时,该函数会被自动调用。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 判断是哪个UART触发了回调,这里使用了单个UART1,可以根据实际情况进行扩展。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 清除空闲中断标志位,UART通信中,空闲中断通常用于检测接收结束。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_CLEAR_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_CLEAR_IDLEF\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 禁用UART发送中断,以防止在处理接收数据时发送数据。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_DISABLE_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_IT_TXE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 检查接收到的数据是否符合预期的协议,如果传输中出错了,就直接跳过不执行,根据协议格式解析数据。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// -1 -2 -3\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFF\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFE\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFD\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 从接收到的数据中提取速度、圈数和模式信息。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003espeed\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ecircle\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003emode\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 检查速度和圈数是否都不为零,才需要转动。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003espeed\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003ecircle\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 如果目标速度和位置都为零,则说明当前没有进行任何动作,可以开始新的动作。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 设置目标速度和目标位置。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003espeed\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecircle\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eEach_Circle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 根据模式调用MoTo函数执行相应的操作。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// MoTo 函数定义时要把屏幕传过来的 (0/1) 和 真实转动的对应正确\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eMoTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emode\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 启动定时器,这样其他的中断才会发生。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eStart_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 如果速度或圈数为零,就说明要停下电机。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eMoTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 调用MoTo函数执行刹停电机。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 重置各种参数(防止下次启动时有上次残留的值) 并且 停止定时器。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eStop_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 重新启用UART发送中断,以便后续可以发送数据。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_ENABLE_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_IT_TXE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 重新启用UART接收中断,以便继续接收数据。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_Receive_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 清空UART的数据寄存器,以确保不会因为残留数据而触发接收中断。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_FLUSH_DRREGISTER\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 清除UART接收缓冲区非空标志位,以确保下一次接收可以正常触发中断。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_UART_CLEAR_FLAG\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_FLAG_RXNE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这里读取encoder有一个坑\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 由于这个encoder是一直累加(或减,取决于电机正反转)的, 它累加到最大值(减到0) 就自动重置了\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 因此你上一次读的数 不一定比 这次读的数大, 这样一算差值, 就可能出现一个极其大的负值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 为了防止这种情况, 我们就需要把这个 tim 的读数一开始(main里面就设置了)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 就设定到一个 中间数值(0和最大之间), 并且 每次读完之后都把它设定回去\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 这样就能保证每次都得到一个 计算正确的 值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint16_t\u003c/span\u003e \u003cspan class=\"nf\"\u003eRead_Encoder\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint16_t\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003e__HAL_TIM_GET_COUNTER\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTIM2\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eCNT\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x7FFF\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e-=\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x7FFF\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这里因为电机 正传反转 有一种情况是累加,一种是累减, 所以有正有负\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 但是计算pid并设置pwm都是正值, 所以返回绝对值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eDead_Voltage\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e160\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eSet_Pwm\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eVelocity\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003e__HAL_TIM_SET_COMPARE\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTIM_CHANNEL_3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eVelocity\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eDead_Voltage\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 固定时间间隔的 中断控制, 每0.1秒多执行一次\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_PeriodElapsedCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eTIM_HandleTypeDef\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim4\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 读取实际转速(相当于转速)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003eRead_Encoder\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 转速累和相当于总距离(实际上转速使用这个总距离做差才算出来的,前面已经解释过了)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 每次先判断是不是已经到了设定的要转的总距离, 如果是, 刹车关定时器重置相关参数\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eReality_Position\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Position\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 刹车\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eMoTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 停止计时器\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eStop_TIM\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 用PID算法计算出要设定的pwm值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"nf\"\u003ePID\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003epid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这里串口输出一下调试信息,方便查看\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;target: %d, real: %d, set: %d\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTarget_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReality_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 设定pwm值\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nf\"\u003eSet_Pwm\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSet_Velocity\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* USER CODE END 4 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief This function is executed in case of error occurrence.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @retval None\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eError_Handler\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN Error_Handler_Debug */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* User can add his own implementation to report the HAL error return state */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nf\"\u003e__disable_irq\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END Error_Handler_Debug */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#ifdef USE_FULL_ASSERT\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @brief Reports the name of the source file and the source line number\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * where the assert_param error has occurred.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param file: pointer to the source file name\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @param line: assert_param error line source number\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @retval None\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eassert_failed\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003efile\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003euint32_t\u003c/span\u003e \u003cspan class=\"n\"\u003eline\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE BEGIN 6 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* User can add his own implementation to report the file name and line number,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e ex: printf(\u0026#34;Wrong parameters value: file %s on line %d\\r\\n\u0026#34;, file, line) */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/* USER CODE END 6 */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#endif \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* USE_FULL_ASSERT */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://canxin121.github.io/p/%E5%B1%8F%E5%B9%95-%E6%8E%A7%E5%88%B6-%E7%94%B5%E6%9C%BApid/"},{"title":"SparkGPT","time":"2023-09-10T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://canxin121.github.io/p/sparkgpt/cover.png\" alt=\"Featured image of post SparkGPT\"/\u003e\u003ch2 id=\"项目地址---spark-gpthttpsgithubcomcanxin121spark-gpt\"\u003e项目地址 -\u0026gt; \u003ca class=\"link\" href=\"https://github.com/canxin121/Spark-GPT\" target=\"_blank\" rel=\"noopener\"\u003eSpark-GPT\u003c/a\u003e\u003c/h2\u003e\n\u003ch2 id=\"feature\"\u003eFeature\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e使用Nonebot框架跨适配器实现,多聊天平台同步实现\u003c/li\u003e\n\u003cli\u003e支持 QQ, QQ频道, Kook, 飞书, Telegram, Discord\u003c/li\u003e\n\u003cli\u003e支持跨平台账户绑定,多平台账户统一数据\u003c/li\u003e\n\u003cli\u003e适配多来源语言模型, 多态模型\u003c/li\u003e\n\u003cli\u003e实现 多用户, 多会话窗口, 公共会话和私有会话\u003c/li\u003e\n\u003cli\u003e实现 流式输出 , 文转图, 文转网络剪切板链接\u003c/li\u003e\n\u003cli\u003e实现WebUi编辑配置,实时热更新\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"todo\"\u003eToDo\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e负载均衡\u003c/li\u003e\n\u003cli\u003e用户权限系统\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"模型来源支持情况\"\u003e模型来源支持情况\u003c/h2\u003e\n\u003cp\u003e✔️:支持 ❌:不支持\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e来源\u003c/th\u003e\n\u003cth\u003e传入文本\u003c/th\u003e\n\u003cth\u003e传入图片\u003c/th\u003e\n\u003cth\u003e输出文本\u003c/th\u003e\n\u003cth\u003e输出图片\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eNewbing\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePoe\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eChatGPT Api\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eChatGPT 网页\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eClaude.Ai\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSlack Claude\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003ePs: \u003ccode\u003e各来源的配置使用均在WebUi中已有详细说明\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"聊天平台支持情况\"\u003e聊天平台支持情况\u003c/h2\u003e\n\u003cp\u003e✔️:支持 ❌:不支持\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e来源\u003c/th\u003e\n\u003cth\u003e传入文本\u003c/th\u003e\n\u003cth\u003e传入图片\u003c/th\u003e\n\u003cth\u003e输出文本\u003c/th\u003e\n\u003cth\u003e输出图片\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eQQ\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eQQ频道\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKook\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e飞书\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e❌\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTelegram\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDiscord\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003ePs: \u003ccode\u003e各聊天平台接入,请查看对应的Nonebot适配器使用说明\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"教程\"\u003e教程\u003c/h2\u003e\n\u003ch3 id=\"基本概念说明\"\u003e基本概念说明\u003c/h3\u003e\n\u003ch4 id=\"会话-chat-\"\u003e会话( chat )\u003c/h4\u003e\n\u003cp\u003e在本插件中,\u003ccode\u003e会话\u003c/code\u003e指的是 一个独立的由指定\u003ccode\u003e模型\u003c/code\u003e驱动的聊天上下文\u003c/p\u003e\n\u003cp\u003e会话的分类如下:\u003c/p\u003e\n\u003cpre class=\"mermaid\"\u003egraph TD\nChat[\u0026#34;会话\u0026#34;]\nPrivateChat[\u0026#34;私有会话\u0026#34;]\nPublicChat[\u0026#34;公有会话\u0026#34;]\nQPrivateChat[\u0026#34;QQ的一个和好友的聊天窗口,\\n你们的对话时私有的,\\n别的用户没办法加入到你们的对话中来.\\n为了保证上下文的连贯性,\\n同一个会话必须一问一答.\u0026#34;]\nQPublicChat[\u0026#34;QQ的一个群聊窗口, \\n所有用户都可以使用.\\n但用户是提问者,\\n只有一个 语言模型 是回答者,\\n为了保证上下文的连贯性,\\n语言模型只能 一个一个顺序 回答问题,\\n 不能同时回答你们\u0026#34;]\nChat --\u0026gt; PrivateChat --\u0026gt; |\u0026#34;类似于\u0026#34;|QPrivateChat\nChat --\u0026gt; PublicChat --\u0026gt; |\u0026#34;类似于\u0026#34;|QPublicChat\n\u003c/pre\u003e\n\u003c!-- 模型开始 --\u003e\n\u003ch4 id=\"模型-model-\"\u003e模型( model )\u003c/h4\u003e\n\u003cp\u003e在本插件中,\u003ccode\u003e模型\u003c/code\u003e指的是驱动\u003ccode\u003e会话\u003c/code\u003e的实际的回复人\n\u003ccode\u003e模型\u003c/code\u003e需要在web ui中配置相关内容才可以启用\u003c/p\u003e\n\u003ch4 id=\"预设-prompt-\"\u003e预设( prompt )\u003c/h4\u003e\n\u003cp\u003e在本插件中,\u003ccode\u003e预设\u003c/code\u003e指每次新对话开始前,优先加载的\u003cstrong\u003e人格\u003c/strong\u003e\u003cbr/\u003e\n原理:\u003cbr/\u003e\n基本是在\u003ccode\u003e会话\u003c/code\u003e开始前,自动先向会话中发送预设文本,也有特殊的来源会使用其他方法\u003c/p\u003e\n\u003cp\u003e注意:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e预设\u003c/code\u003e 不一定对所有的\u003ccode\u003e模型\u003c/code\u003e都有效,因为有些模型本身会 阻止这种对模型输出行为的干预\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e预设\u003c/code\u003e 的字数不是越长越好, 字数也会有\u003cstrong\u003e上限\u003c/strong\u003e,各模型的上限不一, 超出上限会报错, 只能自行更改预设\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- 模型结束 --\u003e\n\u003c!-- 指令开始 --\u003e\n\u003ch4 id=\"指令-command-\"\u003e指令( command )\u003c/h4\u003e\n\u003cp\u003e在本插件中,\u003ccode\u003e指令\u003c/code\u003e指自动填充在问题前面的指令,可以用来命令\u003ccode\u003e模型\u003c/code\u003e一定的格式或者要求进行回复\u003c/p\u003e\n\u003cp\u003e原理:\n在发送用户的问题之前,现在用户的问题前面加上\u003ccode\u003e指令\u003c/code\u003e文本,然后再发送过去\n注意:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e指令\u003c/code\u003e字数有\u003cstrong\u003e上限\u003c/strong\u003e,各模型的上限不一, 超出上限会报错, 只能自行更改指令\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- 指令结束 --\u003e\n\u003c!-- 基本使用逻辑开始 --\u003e\n\u003ch3 id=\"基本使用逻辑说明\"\u003e基本使用逻辑说明\u003c/h3\u003e\n\u003cpre class=\"mermaid\"\u003egraph TD\nCU[\u0026#34;用户\u0026#34;]\nML[\u0026#34;获取模型列表\u0026#34;]\nPL[\u0026#34;获取预设列表\u0026#34;]\nCmdL[\u0026#34;获取指令列表\u0026#34;]\nCL[\u0026#34;获取可用会话 (公有 | 私有)\u0026#34;]\nCAprivate[\u0026#34;创建新的会话 (私有 | 公有 {仅管理员} ) \u0026#34;]\nCC[\u0026#34;使用会话\u0026#34;]\nCPC[\u0026#34;回复来继续会话\u0026#34;]\nCU --\u0026gt; CL\nCU --\u0026gt; ML\nCU --\u0026gt; CmdL\nCU --\u0026gt; PL\nML --\u0026gt; CAprivate\nCmdL --\u0026gt; CAprivate\nPL --\u0026gt; CAprivate\nCL --\u0026gt; CC\nCAprivate --\u0026gt; CC\nCC --\u0026gt; CPC\n\u003c/pre\u003e\n\u003c!-- 基本使用逻辑结束 --\u003e\n\u003ch3 id=\"部署教程\"\u003e部署教程\u003c/h3\u003e\n\u003ch4 id=\"部署nonebot\"\u003e部署Nonebot\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003e这里直接看Well404的教程吧,点击即可跳转到b站系列教程\u003c/strong\u003e\n\u003c/p\u003e\u003cdiv class=\"video-wrapper\"\u003e\n\u003ciframe src=\"https://player.bilibili.com/player.html?as_wide=1\u0026amp;high_quality=1\u0026amp;page=1\u0026amp;aid=608028309\u0026amp;autoplay=0\" scrolling=\"no\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"\u003e\n\u003c/iframe\u003e\n\u003c/div\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch4 id=\"部署各适配器\"\u003e部署各适配器\u003c/h4\u003e\n\u003cp\u003e在这里我直接贴出个适配器的官方使用文档或者合适的教程了\u003c/p\u003e\n\u003ch5 id=\"qqobv11\"\u003eQQ(OBV11)\u003c/h5\u003e\n\u003cp\u003e首先是qsign的部署,这个目前是 必须的\u003c/p\u003e\n\u003cdiv class=\"video-wrapper\"\u003e\n\u003ciframe src=\"https://player.bilibili.com/player.html?as_wide=1\u0026amp;high_quality=1\u0026amp;page=1\u0026amp;bvid=BV11W4y1o7u5\u0026amp;autoplay=0\" scrolling=\"no\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"\u003e\n\u003c/iframe\u003e\n\u003c/div\u003e\n\u003cp\u003e然后需要使用 gocq 的dev 版本,这里给出 gocq dev的action地址,可以自行在这里寻找合适的构建版本,\u003cbr/\u003e\n而连接到nb的方法在上面的 nonebot部署教程中已经又过了,这里不在放出地址\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://github.com/Mrs4s/go-cqhttp/actions/workflows/ci.yml\" target=\"_blank\" rel=\"noopener\"\u003egocq-dev Action CL\u003c/a\u003e\u003c/p\u003e\n\u003ch5 id=\"qqguid-qq频道\"\u003eQQGuid (QQ频道)\u003c/h5\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://github.com/nonebot/adapter-qqguild\" target=\"_blank\" rel=\"noopener\"\u003eQQ频道适配器 gh链接\u003c/a\u003e\u003c/p\u003e\n\u003ch5 id=\"kook开黑啦\"\u003eKOOK(开黑啦)\u003c/h5\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://github.com/Tian-que/nonebot-adapter-kaiheila\" target=\"_blank\" rel=\"noopener\"\u003eKOOK(开黑啦)适配器 gh链接\u003c/a\u003e\u003c/p\u003e\n\u003ch5 id=\"飞书\"\u003e飞书\u003c/h5\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://feishu.adapters.nonebot.dev/docs/guide/installation\" target=\"_blank\" rel=\"noopener\"\u003e飞书(Lark)适配器 gh链接\u003c/a\u003e\u003c/p\u003e\n\u003ch5 id=\"telegram\"\u003eTelegram\u003c/h5\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://github.com/nonebot/adapter-telegram\" target=\"_blank\" rel=\"noopener\"\u003eTelegram适配器 gh链接\u003c/a\u003e\u003c/p\u003e\n\u003ch5 id=\"discord\"\u003eDiscord\u003c/h5\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://github.com/nonebot/adapter-discord\" target=\"_blank\" rel=\"noopener\"\u003eDiscord适配器 gh链接\u003c/a\u003e\u003c/p\u003e\n\u003ch4 id=\"部署spark-gpt\"\u003e部署Spark GPT\u003c/h4\u003e\n\u003ch5 id=\"安装插件\"\u003e安装插件\u003c/h5\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enb plugin install spark_gpt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch5 id=\"配置相关信息\"\u003e配置相关信息\u003c/h5\u003e\n\u003col\u003e\n\u003cli\u003eSparkGPT 依赖 \u003ca class=\"link\" href=\"https://github.com/canxin121/nonebot_plugin_web_config\" target=\"_blank\" rel=\"noopener\"\u003enonebot_plugin_web_config\u003c/a\u003e 进行实时配置热更新,所以需要配置的相关信息(端口,账号密码),可以点击进入查看相关的env配置.\u003c/li\u003e\n\u003cli\u003eSparkGPT 的GPT来源需要手动配置相应的 auth 信息才可以使用,具体获取方式都均在web ui(默认\u003ca class=\"link\" href=\"http://127.0.0.1:8666\" target=\"_blank\" rel=\"noopener\"\u003ehttp://127.0.0.1:8666\u003c/a\u003e)中已经标出,并可以实时热更新.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"使用教程\"\u003e使用教程\u003c/h3\u003e\n\u003cp\u003e使用教程图片版可以使用 shelp 命令获取.\u003cbr/\u003e\n本插件 均采用\u003ca class=\"link\" href=\"https://github.com/nonebot/plugin-alconna\" target=\"_blank\" rel=\"noopener\"\u003eAlc\u003c/a\u003e命令形式 进行使用.\u003cbr/\u003e\n在下面的文本中,用\u003ccode\u003e{}\u003c/code\u003e来标志 需要替换的变量, 用\u003ccode\u003e()\u003c/code\u003e框起来的为 选填的变量\u003c/p\u003e\n\u003ch4 id=\"会话\"\u003e会话\u003c/h4\u003e\n\u003ch5 id=\"使用公有会话询问\"\u003e使用公有会话询问\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003epublic_command{chat_name} {question} ( {photo} )\u003c/code\u003e\u003cbr/\u003e\n参数:\u003c/p\u003e\n\u003cp\u003e必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003echat_name\u003c/code\u003e: 会话昵称\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003equestion\u003c/code\u003e: 问题\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e选填:\u003cbr/\u003e\n3. \u003ccode\u003ephoto\u003c/code\u003e: 需要识别的图片内容,只有model为bing时才可以使用,需要跟随文本信息一同发送\n4.\u003c/p\u003e\n\u003ch5 id=\"使用私有会话询问\"\u003e使用私有会话询问\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003eprivate_command{chat_name} {question} ( {photo} )\u003c/code\u003e\u003cbr/\u003e\n参数:\u003c/p\u003e\n\u003cp\u003e必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003echat_name\u003c/code\u003e: 会话昵称\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003equestion\u003c/code\u003e: 问题\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e选填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003ephoto\u003c/code\u003e: 需要识别的图片内容,只有model为bing时才可以使用,需要跟随文本信息一同发送\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"创建新的会话\"\u003e创建新的会话\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003echat add -n {chat_name} -m {model} ( -p {prompt} -c {command} -auto_pic {bool} -num_limit {int} -pic {bool} -url {bool} -stream {bool} -public )\u003c/code\u003e\u003cbr/\u003e\n参数:\u003c/p\u003e\n\u003cp\u003e必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003echat_name\u003c/code\u003e: 会话名称\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emodel\u003c/code\u003e: 使用的模型名称或者索引数字\n选填:\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eprompt\u003c/code\u003e:\u003cbr/\u003e\n使用本地预设,须在预设名称前加’.‘号\u003cbr/\u003e\n使用自定义预设,直接输入内容\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecommand\u003c/code\u003e:\u003cbr/\u003e\n使用本地指令,须在指令名称前加’.‘号\u003cbr/\u003e\n使用自定义指令,直接输入内容\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eauto_pic\u003c/code\u003e: 是否当字数过多时自动转图片\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enum_limit\u003c/code\u003e: 自动转图片的字数上限\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epic\u003c/code\u003e: 是否总是文字转图片\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eurl\u003c/code\u003e: 是否在图片或流式回复时发送全文链接\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estream\u003c/code\u003e: 是否流式输出,分段发送结果\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epublic\u003c/code\u003e: 是否是创建共有会话\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"修改新的会话\"\u003e修改新的会话\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003echat edit -on {old_name} \\n( -nn {new_name} -m {model} -p {prompt} -c {command} -auto_pic {bool} -num_limit {int} -pic {bool} -url {bool} -stream {bool} -public )\u003c/code\u003e\u003cbr/\u003e\n参数:\u003c/p\u003e\n\u003cp\u003e必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003eold_name\u003c/code\u003e: 原来的会话名称\n选填:\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enew_name\u003c/code\u003e: 原来的会话名称\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emodel\u003c/code\u003e: 使用的模型名称或者索引数字\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eprompt\u003c/code\u003e:\u003cbr/\u003e\n使用本地预设,须在预设名称前加’.‘号\u003cbr/\u003e\n使用自定义预设,直接输入内容\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecommand\u003c/code\u003e:\u003cbr/\u003e\n使用本地指令,须在指令名称前加’.‘号\u003cbr/\u003e\n使用自定义指令,直接输入内容\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eauto_pic\u003c/code\u003e: 是否当字数过多时自动转图片\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enum_limit\u003c/code\u003e: 自动转图片的字数上限\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epic\u003c/code\u003e: 是否总是文字转图片\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eurl\u003c/code\u003e: 是否在图片或流式回复时发送全文链接\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estream\u003c/code\u003e: 是否流式输出,分段发送结果\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epublic\u003c/code\u003e: 是否是修改共有会话\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"获取所有会话的列表\"\u003e获取所有会话的列表\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003echat list\u003c/code\u003e\u003c/p\u003e\n\u003ch5 id=\"删除一个会话\"\u003e删除一个会话\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003echat del -n {chat_name} ( -public )\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003echat_name\u003c/code\u003e: 会话名称\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e选填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003epublic\u003c/code\u003e: 是否是创建共有会话\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"模型\"\u003e模型\u003c/h4\u003e\n\u003ch5 id=\"获取可用模型列表\"\u003e获取可用模型列表\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003emodel list\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"预设\"\u003e预设\u003c/h4\u003e\n\u003ch5 id=\"添加一个新的预设\"\u003e添加一个新的预设\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003eprompt add -n {name} -c {content}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e参数:\u003cbr/\u003e\n必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ename: 预设名称\u003c/li\u003e\n\u003cli\u003econtent: 预设内容\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"删除一个预设\"\u003e删除一个预设\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003eprompt del -n {name}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e参数:\u003cbr/\u003e\n必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ename: 预设名称\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"查看预设列表\"\u003e查看预设列表\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003eprompt list ( -p {num} )\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e参数:\u003cbr/\u003e\n选填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003enum: 页数\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"查看特定预设具体内容\"\u003e查看特定预设具体内容\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003eprompt show -n {name}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e参数:\u003cbr/\u003e\n必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ename: 预设名称\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"指令\"\u003e指令\u003c/h4\u003e\n\u003ch5 id=\"添加一个新的指令\"\u003e添加一个新的指令\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003ecommand add -n {name} -c {content}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e参数:\u003cbr/\u003e\n必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ename: 指令名称\u003c/li\u003e\n\u003cli\u003econtent: 指令内容\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"删除一个指令\"\u003e删除一个指令\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003ecommand del -n {name}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e参数:\u003cbr/\u003e\n必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ename: 指令名称\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"查看指令列表\"\u003e查看指令列表\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003ecommand list ( -p {num} )\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e参数:\u003cbr/\u003e\n选填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003enum: 页数\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"查看特定指令具体内容\"\u003e查看特定指令具体内容\u003c/h5\u003e\n\u003cp\u003e格式: \u003ccode\u003ecommand show -n {name}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e参数:\u003cbr/\u003e\n必填:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ename: 指令名称\u003c/li\u003e\n\u003c/ol\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://canxin121.github.io/p/sparkgpt/"},{"title":"SparkGPT 思路分析","time":"2023-09-10T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"项目地址---spark-gpthttpsgithubcomcanxin121spark-gpt\"\u003e项目地址 -\u0026gt; \u003ca class=\"link\" href=\"https://github.com/canxin121/Spark-GPT\" target=\"_blank\" rel=\"noopener\"\u003eSpark-GPT\u003c/a\u003e\u003c/h2\u003e\n\u003ch2 id=\"nonebot框架\"\u003eNonebot框架\u003c/h2\u003e\n\u003cp\u003e由于SparkGPT由Python开发, 在Python中运行, 而Python目前最佳的bot框架为Nonebot框架,所以 目前2.0.0版本深度绑定Nonebot框架进行开发.\u003c/p\u003e\n\u003cp\u003e预计将在下个大版本 将SparkGPT独立实现协议, 再实现不同语言框架的协议对接\u003c/p\u003e\n\u003ch2 id=\"配置管理\"\u003e配置管理\u003c/h2\u003e\n\u003ch3 id=\"webui\"\u003ewebui\u003c/h3\u003e\n\u003cp\u003e实现了\u003ccode\u003eNonebot_plugin_web_config\u003c/code\u003e来是实现webui管理配置信息, 借助pydantic的\u003ccode\u003eBaseModel\u003c/code\u003e来实现序列化反序列化并持久储存和方便的存取.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eNonebot_plugin_web_config\u003c/code\u003e提供了一个父类给其他插件,直接继承并填写相关注释和属性即可实现持久储存和web编辑, 并且提供了从\u003ccode\u003eNonebot_plugin_web_config\u003c/code\u003e实时获取配置的方法,而无需重新反序列化.\u003c/p\u003e\n\u003cp\u003eToDo:\u003cbr/\u003e\n预计将会实现pydantic -\u0026gt; json schema的转换用于通信, 并重写前端页面\u003c/p\u003e\n\u003ch2 id=\"数据储存\"\u003e数据储存\u003c/h2\u003e\n\u003ch3 id=\"用户会话数据储存\"\u003e用户会话数据储存\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e使用pydantic的\u003ccode\u003eBaseModel\u003c/code\u003e方便 序列化和反序列化\u003c/li\u003e\n\u003cli\u003e使用\u003ccode\u003eNonebot_plugin_bind\u003c/code\u003e的统一id作为用户标志储存, 实现跨平台跨账户的数据共享\u003c/li\u003e\n\u003cli\u003e所有的会话数据以json形式储存在以用户id命名的文件中, 单用户单数据, 保证数据的隔断性\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"预设指令模型数据\"\u003e预设,指令,模型数据\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e继承自\u003ccode\u003eNonebot_plugin_web_config\u003c/code\u003e提供的父类, 直接实现了持久储存和webui编辑\u003c/li\u003e\n\u003cli\u003e实现了一个装饰器, 方便的给每个子类生成一个从\u003ccode\u003eNonebot_plugin_web_config\u003c/code\u003e获取数据的方法\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"消息事件处理\"\u003e消息事件处理\u003c/h2\u003e\n\u003ch3 id=\"消息接受\"\u003e消息接受\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e依赖\u003ccode\u003eNonebot_plugin_alconna\u003c/code\u003e进行命令形式的消息事件匹配,分发给不同的函数进行处理\u003c/li\u003e\n\u003cli\u003e实现\u003ccode\u003eNonebot_plugin_bind\u003c/code\u003e 进行不同账户(可跨平台)信息的绑定, 将同一人的所有聊天平台的数据统一起来\u003c/li\u003e\n\u003cli\u003e实现了会话的持久储存和一个从信息中获取会话依赖注入, 可以从一条信息中获取用户私有的或公有的会话, 分发给不同模型的Chatbot处理\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"回复生成\"\u003e回复生成\u003c/h3\u003e\n\u003ch4 id=\"模型回复\"\u003e模型回复\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e实现\u003ccode\u003eBaseChatBot\u003c/code\u003e父类, 实现使用 异步生成器 实现 流式发送(每次发送消息的两段左右,如果平台支持编辑消息,那么直接加到原来的消息后面,否则发送新的消息) 和 一次性发送(可以自适应长度文转图转链接, 也可以强制设定使用文字或图片回复), 这里其实就是消息发送的步骤.\u003c/li\u003e\n\u003cli\u003e所有的\u003ccode\u003eChatBot\u003c/code\u003e子类只需添加特有的属性(用于储存会话信息)和\u003ccode\u003eBaseChatBot\u003c/code\u003e父类要求的属性, 以及一个异步生成器方法(逆向或使用官方api)和一个刷新会话方法, 即可实现一个新的api的接入\u003c/li\u003e\n\u003cli\u003e涉及的实现的逆向工程的链接\u0026#34; \u003ca class=\"link\" href=\"https://github.com/canxin121/Async-Bing-Client\" target=\"_blank\" rel=\"noopener\"\u003eAsync-Bing-Client\u003c/a\u003e “, \u0026#34; \u003ca class=\"link\" href=\"https://github.com/canxin121/Async-Poe-Client\" target=\"_blank\" rel=\"noopener\"\u003eAsync-Poe-Client\u003c/a\u003e “, \u0026#34; \u003ca class=\"link\" href=\"https://github.com/canxin121/Async-Claude-Client\" target=\"_blank\" rel=\"noopener\"\u003eAsync-Claude-Client\u003c/a\u003e \u0026#34;\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"普通回复\"\u003e普通回复\u003c/h4\u003e\n\u003ch5 id=\"菜单和帮助\"\u003e菜单和帮助\u003c/h5\u003e\n\u003col\u003e\n\u003cli\u003e实现了Nonebot_plugin_templates, 提供一些模板和构造方法, 直接构造出菜单的html并用htmlrender渲染截图返回结果.\u003c/li\u003e\n\u003cli\u003e实现了一个Menu类来将 文本菜单 和 Nonebot_plugin_templates生成的菜单同时实现, 并且缓存图片, 减小开销, 提高效率\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch5 id=\"基本查看和管理\"\u003e基本查看和管理\u003c/h5\u003e\n\u003col\u003e\n\u003cli\u003echat的list在\u003ccode\u003e用户会话数据储存类\u003c/code\u003e的基础上加了一个方法, 并借助Nonebot_plugin_templates生成 会话的列表图片并缓存和动态更新, 减少开销, 提升效率\u003c/li\u003e\n\u003cli\u003eprompt和command的图片回复在\u003ccode\u003eNonebot_plugin_web_config\u003c/code\u003e的子类的基础上借助Nonebot_plugin_templates实现图片列表和具体展示\u003c/li\u003e\n\u003cli\u003e其他文本形式的回复直接发送即可\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"消息发送\"\u003e消息发送\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e依赖\u003ccode\u003eNonebot_plugin_saa\u003c/code\u003e进行跨适配器(跨聊天平台)的发送消息,可以实现图文发送\u003c/li\u003e\n\u003cli\u003e依赖\u003ccode\u003eNonebot_plugin_htmlrender\u003c/code\u003e进行文转图, 实质上就是使用playwright使用我的自制模板进行前端渲染并截图\u003c/li\u003e\n\u003cli\u003e使用 \u003ccode\u003edpaste.org\u003c/code\u003e 的 逆向api 进行文转网络剪切板链接, 方便用户拿去回答和信息\u003c/li\u003e\n\u003c/ol\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://canxin121.github.io/p/sparkgpt-%E6%80%9D%E8%B7%AF%E5%88%86%E6%9E%90/"},{"title":"SparkGPT 预览","time":"2023-09-10T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"项目地址---spark-gpthttpsgithubcomcanxin121spark-gpt\"\u003e项目地址 -\u0026gt; \u003ca class=\"link\" href=\"https://github.com/canxin121/Spark-GPT\" target=\"_blank\" rel=\"noopener\"\u003eSpark-GPT\u003c/a\u003e\u003c/h2\u003e\n\u003ch2 id=\"sparkgpt使用示例\"\u003eSparkGPT使用示例\u003c/h2\u003e\n\u003ch2 id=\"webui\"\u003eWebui\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/webui.png\" width=\"2560\" height=\"1363\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/webui_hudfc518bf0e3dff5f58a40d0e9292d707_109343_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/webui_hudfc518bf0e3dff5f58a40d0e9292d707_109343_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\"使用webui配置相关信息 \" class=\"gallery-image\" data-flex-grow=\"187\" data-flex-basis=\"450px\"/\u003e\u003c/p\u003e\n\u003ch2 id=\"帮助\"\u003e帮助\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/shelp.png\" width=\"576\" height=\"543\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/shelp_hu944c3e2c5f8f713cb74e42c3e320bf12_505859_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/shelp_hu944c3e2c5f8f713cb74e42c3e320bf12_505859_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 获取帮助说明 \" class=\"gallery-image\" data-flex-grow=\"106\" data-flex-basis=\"254px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/help.png\" width=\"1103\" height=\"1104\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/help_hu251595a42a1b5b8f82ad76b655cf6edf_1104940_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/help_hu251595a42a1b5b8f82ad76b655cf6edf_1104940_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 获取某个命令的子命令格式 \" class=\"gallery-image\" data-flex-grow=\"99\" data-flex-basis=\"239px\"/\u003e\u003c/p\u003e\n\u003ch2 id=\"模型\"\u003e模型\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/model_list.png\" width=\"573\" height=\"537\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/model_list_hu23029734091389392b7f3cc6c00ab338_504350_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/model_list_hu23029734091389392b7f3cc6c00ab338_504350_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 获取所有模型 \" class=\"gallery-image\" data-flex-grow=\"106\" data-flex-basis=\"256px\"/\u003e\u003c/p\u003e\n\u003ch2 id=\"会话\"\u003e会话\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_list.png\" width=\"659\" height=\"706\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_list_hu0073cb7dda307cc6b080e3dc900b34a8_691617_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_list_hu0073cb7dda307cc6b080e3dc900b34a8_691617_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 获取所有会话 \" class=\"gallery-image\" data-flex-grow=\"93\" data-flex-basis=\"224px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/private_chat.png\" width=\"655\" height=\"1100\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/private_chat_hud4482fb84500528454f3593a7514105d_1059521_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/private_chat_hud4482fb84500528454f3593a7514105d_1059521_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 创建一个新的私有会话并使用 \" class=\"gallery-image\" data-flex-grow=\"59\" data-flex-basis=\"142px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/public_chat.png\" width=\"639\" height=\"767\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/public_chat_hub91b792aa6ea24cd0e152fda59917491_555628_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/public_chat_hub91b792aa6ea24cd0e152fda59917491_555628_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 创建一个新的公有会话并使用 \" class=\"gallery-image\" data-flex-grow=\"83\" data-flex-basis=\"199px\"/\u003e\u003cbr/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_del.png\" width=\"653\" height=\"278\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_del_hu470a197b58cd883b82a911a603d25821_243419_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_del_hu470a197b58cd883b82a911a603d25821_243419_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 删除一个会话 \" class=\"gallery-image\" data-flex-grow=\"234\" data-flex-basis=\"563px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_edit.png\" width=\"657\" height=\"303\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_edit_hued1d147889be06e39648a664af08d1ad_225903_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/chat_edit_hued1d147889be06e39648a664af08d1ad_225903_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 编辑一个会话 \" class=\"gallery-image\" data-flex-grow=\"216\" data-flex-basis=\"520px\"/\u003e\u003c/p\u003e\n\u003ch2 id=\"预设\"\u003e预设\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_list.png\" width=\"636\" height=\"575\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_list_hu2a03ea50776fff542bb050407f9d74b3_517821_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_list_hu2a03ea50776fff542bb050407f9d74b3_517821_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 获取所有预设缩略信息 \" class=\"gallery-image\" data-flex-grow=\"110\" data-flex-basis=\"265px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_show.png\" width=\"645\" height=\"643\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_show_hue285e6203402b430e11d1ef58ecd77df_404262_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_show_hue285e6203402b430e11d1ef58ecd77df_404262_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 查看某个预设 \" class=\"gallery-image\" data-flex-grow=\"100\" data-flex-basis=\"240px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_add.png\" width=\"638\" height=\"294\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_add_hu8d9c1abd7b76c69a4f57521c2565bb16_195901_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_add_hu8d9c1abd7b76c69a4f57521c2565bb16_195901_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 添加新的预设 \" class=\"gallery-image\" data-flex-grow=\"217\" data-flex-basis=\"520px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_del.png\" width=\"646\" height=\"304\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_del_hu0c533b535e009a9a041576f870965eb8_279579_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/prompt_del_hu0c533b535e009a9a041576f870965eb8_279579_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 删除一个预设 \" class=\"gallery-image\" data-flex-grow=\"212\" data-flex-basis=\"510px\"/\u003e\u003c/p\u003e\n\u003ch2 id=\"指令\"\u003e指令\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_list.png\" width=\"658\" height=\"309\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_list_hudf42e09201443fce7f9a642b48866969_274942_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_list_hudf42e09201443fce7f9a642b48866969_274942_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 获取所有指令缩略信息 \" class=\"gallery-image\" data-flex-grow=\"212\" data-flex-basis=\"511px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_show.png\" width=\"636\" height=\"541\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_show_huaa6fe30c97db4a6fbb3f7b189f90ba8e_310978_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_show_huaa6fe30c97db4a6fbb3f7b189f90ba8e_310978_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 查看某个指令 \" class=\"gallery-image\" data-flex-grow=\"117\" data-flex-basis=\"282px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_add.png\" width=\"654\" height=\"315\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_add_hucf6b8b789b7e075a413aee63eed81613_210970_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_add_hucf6b8b789b7e075a413aee63eed81613_210970_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 添加新的指令 \" class=\"gallery-image\" data-flex-grow=\"207\" data-flex-basis=\"498px\"/\u003e\n\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_del.png\" width=\"649\" height=\"292\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_del_hu4ae45de794030bbc9548e0c4cd8cbc9e_260364_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/command_del_hu4ae45de794030bbc9548e0c4cd8cbc9e_260364_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" alt=\" 删除一个指令 \" class=\"gallery-image\" data-flex-grow=\"222\" data-flex-basis=\"533px\"/\u003e\u003c/p\u003e\n\u003ch2 id=\"群二维码\"\u003e群二维码\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/qrcode.png\" width=\"1284\" height=\"2283\" srcset=\"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/qrcode_hu51b203c4463a8d8fd4df1bc6f83211bb_239525_480x0_resize_box_3.png 480w, https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/images/qrcode_hu51b203c4463a8d8fd4df1bc6f83211bb_239525_1024x0_resize_box_3.png 1024w\" loading=\"lazy\" class=\"gallery-image\" data-flex-grow=\"56\" data-flex-basis=\"134px\"/\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://canxin121.github.io/p/sparkgpt-%E9%A2%84%E8%A7%88/"},{"title":"归档","time":"2022-03-06T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://canxin121.github.io/archives/"},{"title":"Led灯控制(Usart)","time":"0001-01-01T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"cpp中的重定向printf\"\u003eCPP中的重定向printf\u003c/h2\u003e\n\u003cp\u003ecpp不允许重定义 =\u0026gt; 不按照cpp规则编译即可\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eextern\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;C\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003efputc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eFILE\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ef\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eHAL_UART_Transmit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mh\"\u003e0xFFFF\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"led控制亮度--led-类\"\u003eLED控制亮度 =\u0026gt; LED 类\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 74\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 75\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 76\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 77\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 78\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 79\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 80\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 81\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 82\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 83\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 84\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 85\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 86\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 87\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 88\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 89\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 90\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 91\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 92\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 93\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 94\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 95\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 96\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 97\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 98\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 99\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e100\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e101\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e102\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e103\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e104\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e105\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e106\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e107\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e108\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e109\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e110\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e111\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e112\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e113\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e114\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e115\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e116\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e117\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e118\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e119\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e120\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e121\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e122\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e123\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e124\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e125\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e126\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e127\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e128\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e129\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e130\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e131\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e132\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e133\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e134\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e135\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e136\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e137\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e138\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e139\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e140\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e141\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e142\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e143\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eLed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eprivate\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTIM_HandleTypeDef\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003e__htim__\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003e__ch__\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003e__max__\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e255\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003e__diff__\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eCrtTask\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ecrt\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eLed\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eTIM_HandleTypeDef\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__htim__\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ehtim\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__ch__\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__HAL_TIM_SET_COMPARE\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e__htim__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003e__ch__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ecompare\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompare\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecompare\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompare\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003e__max__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecompare\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003e__max__\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecrt\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecompare\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__HAL_TIM_SetCompare\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e__htim__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003e__ch__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecompare\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtTask\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003etoggle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ecompare\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecrt\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompare\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"nf\"\u003eminus\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ediff\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecrt\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecrt\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ediff\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"nf\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ediff\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecrt\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003e__max__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecrt\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003ediff\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"nf\"\u003eTryBreath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ediff\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"n\"\u003ealways\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eswitch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ediff\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eminus\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ediff\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ealways\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003esetTask\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003etask\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtTask\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etask\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eexecTask\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eswitch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCrtTask\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e__diff__\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eminus\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e__diff__\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTryBreath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e__diff__\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtBreathStatus\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eTryBreath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e__diff__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"led类--led-array-类\"\u003eLED类 =\u0026gt; LED Array 类\u003c/h2\u003e\n\u003cp\u003e简单的将上面的LED用array来 遍历 控制。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e74\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003etemplate\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003esize_t\u003c/span\u003e \u003cspan class=\"n\"\u003eN\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eLedArray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003estd\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eN\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003e__size__\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eLedArray\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estd\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eN\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003eleds\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eleds\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"n\"\u003e__size__\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eN\u003c/span\u003e\u003cspan class=\"p\"\u003e){};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"n\"\u003eLedArray\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nl\"\u003eled\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eled\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eresetAll\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nl\"\u003eled\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eled\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eprintCompares\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nl\"\u003eled\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;index: %d, compare: %d\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eled\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecrt\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003esetCompares\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e[])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecustomAssert\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egetArrayLength\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"n\"\u003e__size__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eComparison\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eEqual\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nl\"\u003eled\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eled\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003etoggleLeds\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e[])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecustomAssert\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egetArrayLength\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"n\"\u003e__size__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eComparison\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eEqual\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nl\"\u003eled\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eled\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etoggle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003esetTasks\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e[])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecustomAssert\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egetArrayLength\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"n\"\u003e__size__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eComparison\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eEqual\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nl\"\u003eled\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eled\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esetTask\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eexecTasks\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eLed\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nl\"\u003eled\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eled\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexecTask\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"延时执行类-delay\"\u003e延时执行类 Delay\u003c/h2\u003e\n\u003cp\u003e为了实现 流水 效果, 需要延时(每隔几次运行一次)来执行\u003c/p\u003e\n\u003cp\u003ehpp\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eDelay\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003edelayTimes\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"n\"\u003efirst\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003ectn\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"nf\"\u003eexceed\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eprivate\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003e__delay_times__\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003e__crt_times__\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003ecpp\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003edelayTimes\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"n\"\u003efirst\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003e__delay_times__\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edelayTimes\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"n\"\u003e__crt_times__\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edelayTimes\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"o\"\u003e::~\u003c/span\u003e\u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__delay_times__\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__crt_times__\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003ectn\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__crt_times__\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"n\"\u003eDelay\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eexceed\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e__crt_times__\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"n\"\u003e__delay_times__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ectn\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e## 串口屏控制(状态控制和直接控制)\n这里的状态一是Crt_Main_Task, 也就写了个流水,二是每个灯独立的状态控制,用到的也就一个 呼吸。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e62\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003ereset_whole\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrt_Main_Task\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtLedIndex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eledarray\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eresetAll\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003edelay_20\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereset\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_UART_RxCpltCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eUART_HandleTypeDef\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__HAL_UART_CLEAR_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_CLEAR_IDLEF\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__HAL_UART_DISABLE_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_IT_TXE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrt_Main_Task\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eswitch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 全关复位\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x01\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ereset_whole\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 设置亮度\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x02\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eledarray\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esetCompares\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecompares\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 亮灭互转且设置亮度\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x03\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003etoggles\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003etoggles\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eledarray\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etoggleLeds\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etoggles\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 呼吸(逐渐亮/暗)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x04\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eledarray\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esetTasks\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 流水呼吸\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mh\"\u003e0x05\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrt_Main_Task\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 这个函数用来处理各led的顺序大小然后重新排序\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003esortVectorByValue\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBlink_Leds\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBlink_Cnt\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__HAL_UART_ENABLE_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_IT_TXE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eHAL_UART_Receive_IT\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erev_data\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e9\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__HAL_UART_FLUSH_DRREGISTER\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003e__HAL_UART_CLEAR_FLAG\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehuart1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUART_FLAG_RXNE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e上面的sortVectorByValue,这直接 Ai 写吧,先排个序然后再判断相邻的是不是相等就行了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003esortVectorByValue\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003euint8_t\u003c/span\u003e \u003cspan class=\"n\"\u003evec\u003c/span\u003e\u003cspan class=\"p\"\u003e[],\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003esize\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003esortedIndices\u003c/span\u003e\u003cspan class=\"p\"\u003e[][\u003c/span\u003e\u003cspan class=\"n\"\u003eMAX_SIZE\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eMAX_SIZE\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eMAX_SIZE\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003esortedIndices\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ePair\u003c/span\u003e \u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eMAX_SIZE\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esize\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003evec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003estd\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003esort\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003esize\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecompareByValue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003esubArray\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eMAX_SIZE\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003esubCount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eprevValue\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esize\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eprevValue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003esubArray\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003esubCount\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esubCount\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003esortedIndices\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esubArray\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003esubCount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003esubArray\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003esubCount\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eprevValue\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eindexedVec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esubCount\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003esortedIndices\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esubArray\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"定时执行执行状态对应的任务\"\u003e定时执行(执行状态对应的任务)\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eHAL_TIM_PeriodElapsedCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eTIM_HandleTypeDef\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ehtim2\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 执行Crt_Main_Task对应的任务,这个其实可以再拆一个 类 出来,但是没有更多功能要写,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 先扔这里了。\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eswitch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCrt_Main_Task\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 延时开启下一组led的呼吸任务\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edelay_20\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexceed\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCrtLedIndex\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"n\"\u003eBlink_Cnt\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtLedIndex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nl\"\u003eindex\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eBlink_Leds\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eCrtLedIndex\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003eindex\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eledarray\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003e__leds__\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003esetTask\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eCrtLedIndex\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 执行所有的led的任务\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eledarray\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexecTasks\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 隔一段时间输出一下led的状态\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edelay_30\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eexceed\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"n\"\u003eledarray\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eprintCompares\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://canxin121.github.io/p/led%E7%81%AF%E6%8E%A7%E5%88%B6usart/"},{"title":"链接","time":"0001-01-01T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://canxin121.github.io/%E9%93%BE%E6%8E%A5/"},{"title":"搜索","time":"0001-01-01T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://canxin121.github.io/search/"}]}],"update":"2024-04-07T10:25:36.523720995Z"} \ No newline at end of file