<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>有意栽花花满枝</title>
    <link>https://blog.hjroyal.top/</link>
    <description>Recent content on 有意栽花花满枝</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Sun, 21 Apr 2024 16:55:01 +0800</lastBuildDate><atom:link href="https://blog.hjroyal.top/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Logseq Digital Garden</title>
      <link>https://blog.hjroyal.top/posts/notes/2024-04-21-logseq-digital-garden/</link>
      <pubDate>Sun, 21 Apr 2024 16:55:01 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2024-04-21-logseq-digital-garden/</guid>
      <description>基于 logseq 知识图谱打造数字花园</description>
    </item>
    
    <item>
      <title>我的博客搭建经验</title>
      <link>https://blog.hjroyal.top/posts/tools/2022-09-myblog/</link>
      <pubDate>Sat, 10 Sep 2022 00:00:00 +0000</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/tools/2022-09-myblog/</guid>
      <description>All in One! All about my bitter tears 😭 </description>
    </item>
    
    <item>
      <title>Hugo &#43; Logseq</title>
      <link>https://blog.hjroyal.top/posts/notes/2024-04-20-hugo-logseq/</link>
      <pubDate>Sat, 20 Apr 2024 00:00:00 +0000</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2024-04-20-hugo-logseq/</guid>
      <description>近期较忙，也没有持续写作了。博主开始思考，如何减少步骤，输出高质量文章，最大限度节约时间。目前，主力软件为logseq，发现一款插件可以将logseq笔记导出为hugo格式，这样就可基于logseq中关联主题输出高信息密度总结文章成为可能。 重构博客流程 0 目标 提高效率 文章删减 less is more 结合hugo 与logseq 1 环境准备 windows 11 git 软件安装 Git - Downloads (git-scm.com) 环境配置 查看环境 git config -l 配置用户名 git config &amp;ndash;global user.name “你的用户名” 配置邮箱 git config &amp;ndash;global user.email “你的邮箱” 配置github ssh连接 创建远程github仓库 本地生成密匙 ssh-keygen -t rsa -C &amp;ldquo;github注册时电子邮箱&amp;rdquo; 复制密匙 一般路径为 C:\Users***.ssh\id_rsa.pub 在新建远程仓库Deploy keys设置生产的密匙 克隆远程仓库到本地 git clone XXX clone 主题模块 git submodule update &amp;ndash;init &amp;ndash;recursive hugo 下载软件 Releases · gohugoio/hugo (github.com) 添加环境变量 logseq 安装插件 logseq-schrodinger vscode 2 尝试感悟 依靠插件将文档导出成hugo格式，网站内笔记双链效果并不能实现，可以在logseq写作内发布高质量文章，本地图谱作为素材来源。</description>
    </item>
    
    <item>
      <title>基于模型的设计方法</title>
      <link>https://blog.hjroyal.top/posts/notes/2024-04-01-model-based_design/</link>
      <pubDate>Mon, 01 Apr 2024 20:38:06 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2024-04-01-model-based_design/</guid>
      <description>-- -- var swiper = new Swiper(&#39;.swiper-container&#39;, { pagination: &#39;.swiper-pagination&#39;, paginationClickable: true, autoHeight: true, keyboardControl: true, mousewheelControl: true, lazyLoading: true, lazyLoadingInPrevNext: true, loop: true, }); -- 形式化建模技术一直是一个有潜力的研究方向，但缺乏高效建模工具和大规模实际部署实践，发展一直很缓慢。博主在搜寻自动生成代码工具的过程中，发现了一个在嵌入式领域基于模型的设计工具QP（Quantum LeaPs）。基于UML类图构建状态机，状态以函数定义，可以生成可部署的代码。据称已经被NASA采用。 复现实例的过程中，感觉还是半自动的。但通过这个例子可以理解面向对象的思想，并在C语言中实现，生成特定状态机代码。 通过QP的学习，期望掌握C代码工程的工具编译链。面向对象编程，抽象建模的能力。</description>
    </item>
    
    <item>
      <title>碎片化信息聚合流程</title>
      <link>https://blog.hjroyal.top/posts/notes/2023-11-workflow/</link>
      <pubDate>Fri, 17 Nov 2023 22:08:34 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2023-11-workflow/</guid>
      <description>-- -- var swiper = new Swiper(&#39;.swiper-container&#39;, { pagination: &#39;.swiper-pagination&#39;, paginationClickable: true, autoHeight: true, keyboardControl: true, mousewheelControl: true, lazyLoading: true, lazyLoadingInPrevNext: true, loop: true, }); -- 为了更加高效地处理和整合信息，博主整理了目前使用的主力软件。 img { max-width: 100%; display: block; } figure.figurefx { width: 100%; height: 100%; -o-object-fit: cover; object-fit: cover; transform: scale(0.8); overflow: hidden; margin: -40px auto; } figure.figurefx figcaption { display: block; box-sizing: border-box; text-align: center; font-family: &#34;Montserrat&#34;; width: 100%; max-height: 100%; left: 0; color: #999; font-size: 0.90rem; } figure.figurefx figcaption a { text-decoration: none; } 个人工作流 信息输入主要来自浏览器搜索引擎，社交软件，Chatgpt等，文件格式主要是pdf，word，excel，md。相关软件和平台有： edge、chrome、firefox chatgpt、new bing、文心一言 qq、微信、钉钉、飞书、github&amp;hellip; 信息处理以cubox为中介，收集碎片化文章、博客、临时笔记，汇总到logseq深度处理，碎片化信息完毕之后在cubox中归档。对于需要整理的知识点和体系知识，视展示需求，可在xmind中绘制思维导图，zotero管理论文文献，在logseq中深度阅读做笔记，之后在vscode中进行latex写作，输出格式规整的pdf文档。对应一些阶段性的学习感悟总结，也在vscode中写md文档，生成博客文章。相关软件有： cubox，浏览器 logseq、xmind、zotero、obsidian vscode、notion、adobe pdf&amp;hellip; 信息输出主要是文档、网页、思维导图、绘图，通过博客展示，提交文档共享给他人。 microsoft office blog 、notion、obsidian excalidraw、drawio、xmind 博主计划按照此方式实践，完成知识体系的搭建和丰富。实践过程中，不断丰富和补充。后续将根据logseq知识图谱重构/丰富之前的文章，提升文章质量。</description>
    </item>
    
    <item>
      <title>漫步花开海上</title>
      <link>https://blog.hjroyal.top/posts/photos/2023-11-down-by-the-sally-gardens/</link>
      <pubDate>Tue, 07 Nov 2023 10:02:59 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/photos/2023-11-down-by-the-sally-gardens/</guid>
      <description>愿你如风自在，亦有温暖港湾鲜花盛开</description>
    </item>
    
    <item>
      <title>ZYNQ7000</title>
      <link>https://blog.hjroyal.top/posts/notes/2023-10-zynq7000/</link>
      <pubDate>Tue, 24 Oct 2023 22:42:07 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2023-10-zynq7000/</guid>
      <description>Xilinx多核异构工业级SoC核心板</description>
    </item>
    
    <item>
      <title>崇明岛|第一个400km</title>
      <link>https://blog.hjroyal.top/posts/photos/2023-10-chongming-cycling/</link>
      <pubDate>Tue, 17 Oct 2023 08:16:22 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/photos/2023-10-chongming-cycling/</guid>
      <description>骑行x摄影x环岛x日出</description>
    </item>
    
    <item>
      <title>AI嵌入式系统</title>
      <link>https://blog.hjroyal.top/posts/readings/2023-10-ai%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%BB%9F/</link>
      <pubDate>Mon, 16 Oct 2023 08:17:24 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/readings/2023-10-ai%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%BB%9F/</guid>
      <description>算法优化与实现</description>
    </item>
    
    <item>
      <title>DSP芯片体验</title>
      <link>https://blog.hjroyal.top/posts/notes/2023-10-tidsp-tms320f28377/</link>
      <pubDate>Thu, 12 Oct 2023 13:43:57 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2023-10-tidsp-tms320f28377/</guid>
      <description>TMS320F28377DPTPQ</description>
    </item>
    
    <item>
      <title>C语言面向对象实现</title>
      <link>https://blog.hjroyal.top/posts/notes/2023-09-oop-c/</link>
      <pubDate>Fri, 29 Sep 2023 10:44:19 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2023-09-oop-c/</guid>
      <description>面向对象是一种设计思想与方法，特点为封装、继承和多态。一般认为C语言是面向过程的语言，C++是面向对象的语言。但是在资源限制的嵌入式系统中，使用C语言面向对象编程，程序运行效率更高1。 封装 封装的思想为把数据和操作数据的函数放到一个类中。C语言中结构体用来保存数据，含结构体指针作为形参的函数操作数据，结构体定义和函数声明放到.h，函数实现放到.c，.h与.c文件可放到一个文件夹下作为一个功能模块。 shape.h /*文件名称shape.h*/ #ifndef SHAPE_H #define SHAPE_H #include &amp;lt;stdint.h&amp;gt; // Shape 的属性 typedef struct { int16_t x; int16_t y; } Shape; // Shape 的操作函数，接口函数 void Shape_ctor(Shape * const me, int16_t x, int16_t y); void Shape_moveBy(Shape * const me, int16_t dx, int16_t dy); int16_t Shape_getX(Shape const * const me); int16_t Shape_getY(Shape const * const me); #endif /* SHAPE_H */shape.c /*文件名称shape.c*/ #include &amp;#34;shape.h&amp;#34; // 构造函数 void Shape_ctor(Shape * const me, int16_t x, int16_t y) { me-&amp;gt;x = x; me-&amp;gt;y = y; } void Shape_moveBy(Shape * const me, int16_t dx, int16_t dy) { me-&amp;gt;x += dx; me-&amp;gt;y += dy; } // 获取属性值函数 int16_t Shape_getX(Shape const * const me) { return me-&amp;gt;x; } int16_t Shape_getY(Shape const * const me) { return me-&amp;gt;y; } main.c /*文件名称 main.c*/ #include &amp;#34;shape.h&amp;#34; /* Shape class interface */#include &amp;lt;stdio.h&amp;gt; /* for printf() */int main() { Shape s1, s2; /* multiple instances of Shape */ Shape_ctor(&amp;amp;s1, 0, 1); Shape_ctor(&amp;amp;s2, -1, 2); printf(&amp;#34;Shape s1(x=%d,y=%d)\n&amp;#34;, Shape_getX(&amp;amp;s1), Shape_getY(&amp;amp;s1)); printf(&amp;#34;Shape s2(x=%d,y=%d)\n&amp;#34;, Shape_getX(&amp;amp;s2), Shape_getY(&amp;amp;s2)); Shape_moveBy(&amp;amp;s1, 2, -4); Shape_moveBy(&amp;amp;s2, 1, -2); printf(&amp;#34;Shape s1(x=%d,y=%d)\n&amp;#34;, Shape_getX(&amp;amp;s1), Shape_getY(&amp;amp;s1)); printf(&amp;#34;Shape s2(x=%d,y=%d)\n&amp;#34;, Shape_getX(&amp;amp;s2), Shape_getY(&amp;amp;s2)); return 0; } 继承 继承指的是基于现有的类定义新类。C语言实现，通过把基类放到继承类的第一个数据成员的位置实现。 rect.h /*文件名称 rect.h*/ #ifndef RECT_H #define RECT_H #include &amp;#34;shape.h&amp;#34; // 基类接口 // 矩形的属性 typedef struct { Shape super; // 继承 Shape // 自己的属性 uint16_t width; uint16_t height; } Rectangle; // 构造函数 void Rectangle_ctor(Rectangle * const me, int16_t x, int16_t y, uint16_t width, uint16_t height); #endif /* RECT_H */rect.c /*文件名称 rect.c*/ #include &amp;#34;rect.h&amp;#34;// 构造函数 void Rectangle_ctor(Rectangle * const me, int16_t x, int16_t y, uint16_t width, uint16_t height) { /* first call superclass’ ctor */ Shape_ctor(&amp;amp;me-&amp;gt;super, x, y); /* next, you initialize the attributes added by this subclass... */ me-&amp;gt;width = width; me-&amp;gt;height = height; } main.c /*文件名称 main.c*/ #include &amp;#34;rect.h&amp;#34; #include &amp;lt;stdio.h&amp;gt; int main() { Rectangle r1, r2; // 实例化对象 Rectangle_ctor(&amp;amp;r1, 0, 2, 10, 15); Rectangle_ctor(&amp;amp;r2, -1, 3, 5, 8); printf(&amp;#34;Rect r1(x=%d,y=%d,width=%d,height=%d)\n&amp;#34;, Shape_getX(&amp;amp;r1.super), Shape_getY(&amp;amp;r1.super), r1.width, r1.height); printf(&amp;#34;Rect r2(x=%d,y=%d,width=%d,height=%d)\n&amp;#34;, Shape_getX(&amp;amp;r2.super), Shape_getY(&amp;amp;r2.super), r2.width, r2.height); // 注意，这里有两种方式，一是强转类型，二是直接使用成员地址 Shape_moveBy((Shape *)&amp;amp;r1, -2, 3); Shape_moveBy(&amp;amp;r2.super, 2, -1); printf(&amp;#34;Rect r1(x=%d,y=%d,width=%d,height=%d)\n&amp;#34;, Shape_getX(&amp;amp;r1.super), Shape_getY(&amp;amp;r1.super), r1.width, r1.height); printf(&amp;#34;Rect r2(x=%d,y=%d,width=%d,height=%d)\n&amp;#34;, Shape_getX(&amp;amp;r2.super), Shape_getY(&amp;amp;r2.super), r2.width, r2.height); return 0; } 多态 C++使用虚函数实现多态。C语言实现稍显复杂。多态以封装和继承为前提，不同的子类对象调用相同的方法，产生不同的执行结果。 嵌入式 C 语言的高级用法，面向对象&amp;#160;&amp;#x21a9;&amp;#xfe0e;</description>
    </item>
    
    <item>
      <title>Latex使用记录</title>
      <link>https://blog.hjroyal.top/posts/tools/2023-09-latex/</link>
      <pubDate>Wed, 27 Sep 2023 13:41:27 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/tools/2023-09-latex/</guid>
      <description>为什么学以及如何学Latex？ 参考： cs自学指南 环境配置 .bilibili_shortcodes { position: relative; width: 100%; height: 0; padding-bottom: 66%; margin: auto; overflow: hidden; text-align: center; } .bilibili_shortcodes iframe { position: absolute; width: 100%; height: 100%; left: 0; top: 0; } -- 安装配置指南 LaTex基础教学 使用记录 文献引用命令 \cite{} 默认引用格式 \upcite{} 右上角引用格式 \nocite{} 不出现在正文，出现在参考文献列表</description>
    </item>
    
    <item>
      <title>嵌入式Linux</title>
      <link>https://blog.hjroyal.top/posts/notes/2023-09-eai-stm32mp157/</link>
      <pubDate>Sun, 24 Sep 2023 16:59:01 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2023-09-eai-stm32mp157/</guid>
      <description>STM32MP157D</description>
    </item>
    
    <item>
      <title>源码分析工具</title>
      <link>https://blog.hjroyal.top/posts/notes/2023-09-source-analysis/</link>
      <pubDate>Mon, 11 Sep 2023 10:53:54 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2023-09-source-analysis/</guid>
      <description>Scitools Understand 拿到一个陌生的项目想要快速知道程序的控制流和数据流，对程序进行一个全局性的理解，代码分析工具scitools understand就能满足上述需求。掌握这个工具也可以验证代码实现逻辑，尤其对于大型项目，变得非常有用。 官网：https://scitools.com/ 关系图说明1 Butterfly：如果两个实体间存在关系，就显示这两个实体间的调用和被调用关系 Calls：展示从你选择的这个方法开始的整个调用链条 Called By：展示了这个实体被哪些代码调用，这个结构图是从底部向上看或者从右到左看 Calls Relationship/Calledby Relationship:展示了两个实体之间的调用和被调用关系，操作方法：首先右键你要选择的第一个实体，然后点击另一个你要选择的实体，如果选择错误，可以再次点击其他正确即可，然后点击ok Contains:展示一个实体中的层级图，也可以是一个文件，一条连接线读作”x includes y“ Extended By:展示这个类被哪些类所继承 Extends:展示这个类继承自那个类 Control Flow:展示函数内部执行流程 Cluster Control Flow:展示一个实体的流程图或者类似实体类型，这个比上一个更具有交互性 UML Class Diagram:展示这个项目中或者一个文件中定义的类以及与这个类关联的类 UML Sequence Diagram:展示两个实体之间的时序关系图 自动代码格式注释 doxygen可以查看函数调用图，按照特定格式注释，还能得到说明文档。详细操作及介绍参考博客2介绍。开源项目《算法导论》中算法的C++实现也在使用该工具添加注释。 静态代码分析 PC-lint是一种静态代码检测工具，可以查出许多逻辑错误，对于检查代码bug，早期排错很有用，但不免费。另一款开源软件TscanCode，使用简单，支持C++、Lua、C#，也是博主偏爱的。 http://codemx.cn/2016/04/30/Understand01/index.html&amp;#160;&amp;#x21a9;&amp;#xfe0e; https://blog.csdn.net/benkaoya/article/details/79763668&amp;#160;&amp;#x21a9;&amp;#xfe0e;</description>
    </item>
    
    <item>
      <title>东极岛|跳岛环游极限拉练</title>
      <link>https://blog.hjroyal.top/posts/photos/2023-08-dongji-island/</link>
      <pubDate>Thu, 31 Aug 2023 18:09:06 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/photos/2023-08-dongji-island/</guid>
      <description>Special forces style Dongji Island tour.</description>
    </item>
    
    <item>
      <title>正则表达式</title>
      <link>https://blog.hjroyal.top/posts/notes/2023-08-learn-regex/</link>
      <pubDate>Tue, 08 Aug 2023 22:11:05 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2023-08-learn-regex/</guid>
      <description>工作中学习，学习中不断提升工作能力！当需要搜索特定格式的变量时，使用正则表达式可以快速准确的给出结果，否则，采取笨办法就会既废眼睛又费时间。然而，时间就是金钱，时间就是生命。 Github上面有一个高赞开源项目，正好用来入门学习，并且提供了在线参考练习。 ■ 仓库地址：learn-regex ■ 在线练习：regular expresssions 正则表达式在VSCode中使用 正则表达式在python中应用</description>
    </item>
    
    <item>
      <title>沪上高校游记</title>
      <link>https://blog.hjroyal.top/posts/photos/2023-07-ecnu-ecupl/</link>
      <pubDate>Sun, 16 Jul 2023 21:42:19 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/photos/2023-07-ecnu-ecupl/</guid>
      <description>交大x华师x华政x对外经贸x上海外国语</description>
    </item>
    
    <item>
      <title>江苏常熟虞山行</title>
      <link>https://blog.hjroyal.top/posts/photos/2023-07-yushan/</link>
      <pubDate>Fri, 07 Jul 2023 11:16:00 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/photos/2023-07-yushan/</guid>
      <description>开始环沪特种兵旅游</description>
    </item>
    
    <item>
      <title>Cloudflare Pages </title>
      <link>https://blog.hjroyal.top/posts/tools/2023-07-blog-deployment-changes/</link>
      <pubDate>Fri, 07 Jul 2023 08:24:29 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/tools/2023-07-blog-deployment-changes/</guid>
      <description>博客域名在备案的情况下，采用Github Pages + 又拍云存储 + 又拍云CDN模式，应该是免费方案里最好的了。优点是国内访问速度快，又拍云免费空间可做图床，方便图片存储。缺点就是备案手续需要时间，个人信息也在网上裸奔。 考虑不备案的话，又拍云服务就不能使用了。博主采取了Github Pages + Netlify的替代方式，博客访问速度依然不是很理想。 机缘巧合下，刷到了利用CloudFlare部署的文章1，正好跟着教程调整了部署方式，速度表现上有一定的提高。因为部署方式没有采用Github Pages了，直接拉取普通仓库到CloudFlare部署。然后迁移绑定自定义域名，也就完成了本次博客部署方式的调整。 https://immmmm.com/hi-cloudflare/&amp;#160;&amp;#x21a9;&amp;#xfe0e;</description>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.hjroyal.top/about/</link>
      <pubDate>Wed, 05 Jul 2023 14:57:28 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/about/</guid>
      <description>大以致远  微以致精 饮水思源</description>
    </item>
    
    <item>
      <title>沪上高校游记</title>
      <link>https://blog.hjroyal.top/posts/photos/2023-06-shanghai-university-tour-sjtu-fdu-tju/</link>
      <pubDate>Mon, 26 Jun 2023 23:25:48 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/photos/2023-06-shanghai-university-tour-sjtu-fdu-tju/</guid>
      <description>交医x复旦x同济</description>
    </item>
    
    <item>
      <title>XML vs. JSON</title>
      <link>https://blog.hjroyal.top/posts/notes/2023-06-xml-json/</link>
      <pubDate>Mon, 26 Jun 2023 21:42:50 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2023-06-xml-json/</guid>
      <description>在网络中进行数据传输，目前比较流行的两种数据格式：json和xml。 数据传输的方向有两个，一个是从前端传到后端，再一个就是从后端转向前端。设想一下我们的运行环境。我们有数据库存放数据。我们有程序来读写数据库。对于程序以外的程序来说，这些数据都是放在黑盒子里面的。程序数据出了黑盒子以后，就需要有一个传输的格式让各种程序都可以理解。这就是json和xml在网络传输中的用途1。 JSON的定义 一种轻量级的数据交换格式，具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案（有点类似于正则表达式 ，获得了当今大部分语言的支持），从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式，同时也具备类似于C语言体系的行为。 XML的定义 扩展标记语言 (Extensible Markup Language, XML) ，用于标记电子文件使其具有结构性的标记语言，可以用来标记数据、定义数据类型，是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 (SGML) 的子集，非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。 JSON 和 XML 优缺点的比较2 1、可读性：JSON和XML的可读性可谓不相上下，一边是建议的语法，一边是规范的标签形式，很难分出胜负。 2、体积：JSON相对于XML来说, 数据的体积小,传递速度更快。 3、速度：传递速度方面,JSON的速度要远远快于xml。 4、解码难度：XML的解析得考虑子节点父节点，让人头昏眼花，而JSON的解析难度几乎为0。 XML使用 一个描述书籍的XML文档可能如下： &amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34; ?&amp;gt; &amp;lt;!DOCTYPE note SYSTEM &amp;#34;book.dtd&amp;#34;&amp;gt; &amp;lt;book id=&amp;#34;1&amp;#34;&amp;gt; &amp;lt;name&amp;gt;Java核心技术&amp;lt;/name&amp;gt; &amp;lt;author&amp;gt;Cay S. Horstmann&amp;lt;/author&amp;gt; &amp;lt;isbn lang=&amp;#34;CN&amp;#34;&amp;gt;1234567&amp;lt;/isbn&amp;gt; &amp;lt;tags&amp;gt; &amp;lt;tag&amp;gt;Java&amp;lt;/tag&amp;gt; &amp;lt;tag&amp;gt;Network&amp;lt;/tag&amp;gt; &amp;lt;/tags&amp;gt; &amp;lt;pubDate/&amp;gt; &amp;lt;/book&amp;gt; XML有固定的结构，首行必定是&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;，可以加上可选的编码。紧接着，如果以类似&amp;lt;!DOCTYPE note SYSTEM &amp;quot;book.dtd&amp;quot;&amp;gt;声明的是文档定义类型（DTD：Document Type Definition），DTD是可选的。接下来是XML的文档内容，一个XML文档有且仅有一个根元素，根元素可以包含任意个子元素，元素可以包含属性，例如，&amp;lt;isbn lang=&amp;quot;CN&amp;quot;&amp;gt;1234567&amp;lt;/isbn&amp;gt;包含一个属性lang=&amp;ldquo;CN&amp;rdquo;，且元素必须正确嵌套。如果是空元素，可以用&amp;lt;tag/&amp;gt;表示3。 XML使用嵌套结构的数据表示方式，支持格式验证；XML常用于配置文件、网络消息传输等。 JSON是JavaScript Object Notation的缩写，它去除了所有JavaScript执行代码，只保留JavaScript的对象格式。一个典型的JSON如下： { &amp;#34;id&amp;#34;: 1, &amp;#34;name&amp;#34;: &amp;#34;Java核心技术&amp;#34;, &amp;#34;author&amp;#34;: { &amp;#34;firstName&amp;#34;: &amp;#34;Abc&amp;#34;, &amp;#34;lastName&amp;#34;: &amp;#34;Xyz&amp;#34; }, &amp;#34;isbn&amp;#34;: &amp;#34;1234567&amp;#34;, &amp;#34;tags&amp;#34;: [&amp;#34;Java&amp;#34;, &amp;#34;Network&amp;#34;] } JSON是轻量级的数据表示方式，常用于Web应用。 https://zhuanlan.zhihu.com/p/78991307&amp;#160;&amp;#x21a9;&amp;#xfe0e; https://blog.csdn.net/qqw666666/article/details/123838490&amp;#160;&amp;#x21a9;&amp;#xfe0e; https://www.liaoxuefeng.com/wiki/1252599548343744/1305161429418018&amp;#160;&amp;#x21a9;&amp;#xfe0e;</description>
    </item>
    
    <item>
      <title>嵌入式C语言基础知识</title>
      <link>https://blog.hjroyal.top/posts/notes/2023-06-embedded-c/</link>
      <pubDate>Mon, 26 Jun 2023 21:35:25 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2023-06-embedded-c/</guid>
      <description>一、C语言入门 程序结构 //file: main.c #include&amp;lt;stdio.h&amp;gt; int main() { printf(&amp;#34;Hello World&amp;#34;); return 0; } 一个C程序由若干头文件和函数组成。 #include &amp;lt;stdio.h&amp;gt;是一条预处理命令, 它的作用是通知C语言编译系统，在对C程序进行正式编译之前需做一些预处理工作。函数是实现代码逻辑的一个小的单元。 编程规范 Google C++ Style Guide 注释 参考STM32CubeMX生成的模版程序 /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2023 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include &amp;#34;main.h&amp;#34;#include &amp;#34;tim.h&amp;#34;#include &amp;#34;gpio.h&amp;#34; /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include &amp;#34;driver_tim_pwm.h&amp;#34;/* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ if(IS_ENGINEERING_BOOT_MODE()) { /* Configure the system clock */ SystemClock_Config(); } /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM2_Init(); /* USER CODE BEGIN 2 */ TIM_LED3_PWM_Start(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSIDivValue = RCC_HSI_DIV1; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; RCC_OscInitStruct.PLL2.PLLState = RCC_PLL_NONE; RCC_OscInitStruct.PLL3.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL3.PLLSource = RCC_PLL3SOURCE_HSI; RCC_OscInitStruct.PLL3.PLLM = 4; RCC_OscInitStruct.PLL3.PLLN = 26; RCC_OscInitStruct.PLL3.PLLP = 2; RCC_OscInitStruct.PLL3.PLLQ = 2; RCC_OscInitStruct.PLL3.PLLR = 2; RCC_OscInitStruct.PLL3.PLLRGE = RCC_PLL3IFRANGE_1; RCC_OscInitStruct.PLL3.PLLFRACV = 1024; RCC_OscInitStruct.PLL3.PLLMODE = RCC_PLL_FRACTIONAL; RCC_OscInitStruct.PLL4.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&amp;amp;RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** RCC Clock Config */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_ACLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2 |RCC_CLOCKTYPE_PCLK3|RCC_CLOCKTYPE_PCLK4 |RCC_CLOCKTYPE_PCLK5; RCC_ClkInitStruct.AXISSInit.AXI_Clock = RCC_AXISSOURCE_HSI; RCC_ClkInitStruct.AXISSInit.AXI_Div = RCC_AXI_DIV1; RCC_ClkInitStruct.MCUInit.MCU_Clock = RCC_MCUSSOURCE_PLL3; RCC_ClkInitStruct.MCUInit.MCU_Div = RCC_MCU_DIV1; RCC_ClkInitStruct.APB4_Div = RCC_APB4_DIV1; RCC_ClkInitStruct.APB5_Div = RCC_APB5_DIV1; RCC_ClkInitStruct.APB1_Div = RCC_APB1_DIV2; RCC_ClkInitStruct.APB2_Div = RCC_APB2_DIV2; RCC_ClkInitStruct.APB3_Div = RCC_APB3_DIV2; if (HAL_RCC_ClockConfig(&amp;amp;RCC_ClkInitStruct) != HAL_OK) { Error_Handler(); } } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf(&amp;#34;Wrong parameters value: file %s on line %d\r\n&amp;#34;, file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ 标识符 C语言规定，标识符可以是字母(A～Z，a～z)、数字(0～9)、下划线_组成的字符串，并且第一个字符必须是字母或下划线。 其他注意点： 标识符的长度最好不要超过8位，因为在某些版本的C中规定标识符前8位有效 标识符是严格区分大小写的 见名思意，不使用中文 不能使用关键字 下划线开头标识符一般定义为特殊含义变量 变量及赋值 使用变量之前必须先定义变量，要区分变量名和变量值是两个不同的概念。 注意:在定义中不允许连续赋值，如int a=b=c=5;是不合法的。 基本数据类型 格式化输出 int a = 10; float b = 66.6; char x = &amp;#39;c&amp;#39;; printf(&amp;#34;整数：%d,小数：%f,字符:%c&amp;#34;,a ,b, x); 不可改变常量 字面量 整型常量 13、0、-13； 实型常量：13.33、-24.4； 字符常量：‘a’、‘M’ 字符串常量：”I love moon!” 符号常量 #define 标识符 常量值 类型转换 自动转换发生在不同数据类型运算时，在编译的时候自动完成。 字节小的可以向字节大的自动转换，但字节大的不能向字节小的自动转换。 char可以转换为int，int可以转换为double，char可以转换为double。但是不可以反向。 运算符 自增与自减运算符 关系运算符 &amp;gt; 、 &amp;gt;= 、 &amp;lt; 、 &amp;lt;= 、 == 、 != 关系表达式的值是真和假，在C程序用整数1和0表示。注意：&amp;gt;=, &amp;lt;=, ==, !=这种符号之间不能存在空格。 逻辑运算符 &amp;amp;&amp;amp;、|| 、！ 三目运算符 表达式1 ? 表达式2 : 表达式3; 先判断表达式1的值是否为真，如果是真的话执行表达式2；如果是假的话执行表达式3。 #include &amp;lt;stdio.h&amp;gt;int main() { double money =12.0 ; double cost =11.5 ; printf(&amp;#34;小编能不能打车回家呢：&amp;#34;); //输出y小编就打车回家了，输出n小编就不能打车回家 printf(&amp;#34;%c\n&amp;#34;,money &amp;gt;= cost ? &amp;#39;y&amp;#39; : &amp;#39;n&amp;#39; ); return 0; } 分支结构 if(表达式) { 执行代码块; } if(表达式) { 执行代码块1; } else { 执行代码块2; } switch(表达式) { case 常量表达式1： 执行代码块1; break； case 常量表达式2： 执行代码块2; break； //... default: 执行代码块n+1; } 注意： 在case后的各常量表达式的值不能相同，否则会出现错误。 在case子句后如果没有break;会一直往后执行一直到遇到break;才会跳出switch语句。 switch后面的表达式语句只能是整型或者字符类型。 在case后，允许有多个语句，可以不用{}括起来。 各case和default子句的先后顺序可以变动，而不会影响程序执行结果。 default子句可以省略不用。 #include &amp;lt;stdio.h&amp;gt; int main() { /* 定义需要计算的日期 */ int date = 0; int year = 2008; int month = 8; int day = 8; switch(month) { case 12: date+=30; case 11: date+=31; case 10: date+=30; case 9: date+=31; case 8: date+=31; case 7: date+=30; case 6: date+=31; case 5: date+=30; case 4: date+=31; case 3: if((year%4==0&amp;amp;&amp;amp;year%100!=0)||year%400==0) { date+=29; } else { date+=28; } case 2: date+=31; case 1: date += day; printf(&amp;#34;%d年%d月%d日是该年的第%d天&amp;#34;,year,month,day,date); break; default: printf(&amp;#34;error&amp;#34;); break; } return 0; } 循环结构 while(表达式) { 执行代码块 } do { 执行代码块 }while(表达式); for(表达式1；表达式2；表达式3) { 执行代码块 } do-while ： 先执行循环中的执行代码块，然后再判断while中表达式是否为真，如果为真则继续循环；如果为假，则终止循环。因此，do-while循环至少要执行一次循环语句。 在for循环中: 表达式1是一个或多个赋值语句，它用来控制变量的初始值； 表达式2是一个关系表达式，它决定什么时候退出循环； 表达式3是循环变量的步进值，定义控制循环变量每循环一次后按什么方式变化。 在知道循环次数的情况下更适合使用for循环;在不知道循环次数的情况下适合使用while或者do-while循环:在不知道循环次数的情况下适合使用while或者do-while循环，如果至少循环一次应考虑使用do-while循环。 结束语句之break语句 在没有循环结构的情况下，break不能用在单独的if-else语句中。在多层循环中，一个break语句只跳出当前循环。 结束语句之continue语句 continue语句的作用是结束本次循环开始执行下一次循环。 break是跳出当前整个循环，continue是结束本次循环开始下一次循环。 自创函数 格式： [数据类型说明] 函数名称 ([参数]) { 变量定义部分 语句部分 return(表达式)； } 自定义函数放在main函数后面的话, 需要在main函数之前先声明自定义函数。声明格式： [数据类型说明] 函数名称 ([参数]); 函数调用 函数名称 ([参数]); 有参与无参 形参与实参 函数的返回值 return 表达式; return (表达式); 递归函数 局部变量和全局变量 全局变量、静态全局变量、静态局部变量和普通局部变量的区别 静态关键字static的三种用法总结 C语言中的变量，按作用域范围可分为两种，即局部变量和全局变量。局部变量也称为内部变量。全局变量也称为外部变量，它是在函数外部定义的变量。 C语言根据变量的生存周期来划分，可以分为静态存储方式和动态存储方式。静态存储方式：是指在程序运行期间分配固定的存储空间的方式。静态存储区中存放了在整个程序执行过程中都存在的变量，如全局变量。动态存储方式：是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储区中存放的变量是根据程序运行的需要而建立和释放的，通常包括：函数形式参数；自动变量；函数调用时的现场保护和返回地址等。 1、全局变量在整个工程文件内都有效。 2、静态全局变量只在定义它的文件内有效。 3、静态局部变量只在定义它的函数内有效，且程序仅分配一次内存，函数返回后，该变量不会消失；局部变量在定义它的函数内有效，但是函数返回后失效。 4、全局变量和静态变量如果没有手工初始化，则由编译器初始化为0。局部变量的值不可知。 5、静态局部变量与全局变量共享全局数据区，但静态局部变量只在定义它的函数中可见。静态局部变量与局部变量在存储位置上不同，使得其存在的时限也不同，导致对这两者操作的运行结果也不同。 #include &amp;lt;stdio.h&amp;gt;void func();//函数声明，主要是因为被调用的函数定义写在了main函数后面了 int n = 1; //全局变量 int main(void) { static int a; // 静态局部变量,但静态局部变量只在定义它的函数中可见,并且只初始化一次 int b = -10; // 局部变量 printf(&amp;#34;main: a=%d, b=%d, n=%d\n&amp;#34;,a,b,n); b += 4; func(); printf(&amp;#34;main: a=%d, b=%d, n=%d\n&amp;#34;,a,b,n); n += 10; func(); printf(&amp;#34;main: a=%d, b=%d, n=%d\n&amp;#34;,a,b,n); } void func() { static int a = 2; // 静态局部变量 int b = 5; // 局部变量 a += 2; n += 12; b += 5; printf(&amp;#34;func: a=%d, b=%d, n=%d\n&amp;#34;,a,b,n); } static在文件作用域和代码块作用域的意义是不同的：在文件作用域用于限定函数和变量的外部链接性(能否被其它文件访问), 在代码块作用域则用于将变量分配到静态存储区。 外部变量 程序的编译单位是源程序文件，一个源文件可以包含一个或若干个函数。在函数内定义的变量是局部变量，而在函数之外定义的变量则称为外部变量，外部变量也就是我们所讲的全局变量。它的存储方式为静态存储，其生存周期为整个程序的生存周期。全局变量可以为本文件中的其他函数所共用，它的有效范围为从定义变量的位置开始到本源文件结束1。 如果全局变量不在文件的开头定义，有效的作用范围将只限于其定义处到文件结束。如果在定义点之前的函数想引用该全局变量，则应该在引用之前用关键字 extern 对该变量作“外部变量声明”，表示该变量是一个已经定义的外部变量。有了此声明，就可以从“声明”处起，合法地使用该外部变量。 如果整个工程由多个源文件组成，在一个源文件中想引用另外一个源文件中已经定义的外部变量，同样只需在引用变量的文件中用 extern 关键字加以声明即可。 变量存储类别 C语言中存储类别又分为四类： 自动（auto） 静态（static） 寄存器的（register） 外部的（extern） 字符串与数组 c语言获取数组长度 int length = sizeof(arr)/sizeof(arr[0]); #include &amp;lt;stdio.h&amp;gt;int main() { double arr[]={1.78, 1.77, 1.82, 1.79, 1.85, 1.75, 1.86, 1.77, 1.81, 1.80}; int i,j; printf(&amp;#34;\n************排队前*************\n&amp;#34;); for(i=0;i&amp;lt;10;i++) { if(i != 9) printf(&amp;#34;%1.2f, &amp;#34;, arr[i]); //%1.2f表示小数点前一位，小数点后精确到两位 else printf(&amp;#34;%1.2f&amp;#34;, arr[i]); //%1.2f表示小数点前一位，小数点后精确到两位 } for(i=8; i&amp;gt;=0; i--) { for(j=0;j&amp;lt;=i;j++) { if( arr[j]&amp;gt;arr[j+1]) //当前面的数比后面的数大时 { double temp; //定义临时变量temp temp=arr[j];//将前面的数赋值给temp arr[j]=arr[j+1]; //前后之数颠倒位置 arr[j+1]=temp;//将较大的数放在后面 } } } printf(&amp;#34;\n************排队后*************\n&amp;#34;); for(i=0;i&amp;lt;10;i++) { if(i != 9) printf(&amp;#34;%1.2f, &amp;#34;, arr[i]); //%1.2f表示小数点前一位，小数点后精确到两位 else printf(&amp;#34;%1.2f&amp;#34;, arr[i]); //%1.2f表示小数点前一位，小数点后精确到两位 } return 0; } C语言中，是没有办法直接定义字符串数据类型的，但是我们可以使用数组来定义我们所要的字符串。一般有以下两种格式： char 字符串名称[长度] = &amp;ldquo;字符串值&amp;rdquo;; char 字符串名称[长度] = {&amp;lsquo;字符1&amp;rsquo;,&amp;lsquo;字符2&amp;rsquo;,&amp;hellip;,&amp;lsquo;字符n&amp;rsquo;,&#39;\0&#39;}; 采用第2种方式的时候最后一个元素必须是&#39;\0&#39;，&#39;\0&amp;rsquo;表示字符串的结束标志； 字符串处理函数 易变变量 关键字 volatile 告诉编译器，它后面所定义的变量为“易失性变量”，随时都有可能被修改，因此编译器必须确保每次使用变量时都要主动从内存中、根据存储变量的地址读取数据，而不是使用寄存器中的缓存值。 宏定义 #define __IO volatile 的作用是将标记为 “__IO” 的变量设置成可读可写的，具有在任何时候均可读写的权限，本质上，它是一个缩写，意味着变量可以在不需要在代码中显式标明 “volatile” 的情况下使用2。 typedef unsigned int uint32_t; #define __IO volatile /* defines &amp;#39;read / write&amp;#39; permissions */void Delay(__IO uint32_t nCount) //简单的延时函数 { for(; nCount != 0; nCount--); } 二、嵌入式C开发基础 关键字 sizeof sizeof是C语言的关键字，它用来计算变量（或数据类型）在当前系统中占用内存的字节数3。sizeof不是函数，sizeof有两种写法： 用于数据类型 sizeof(数据类型); 数据类型必须用括号括住。 printf(&amp;#34;字符型变量占用的内存是=%d\n&amp;#34;,sizeof(char)); // 输出：字符型变量占用的内存是=1 printf(&amp;#34;整型变量占用的内存是=%d\n&amp;#34;,sizeof(int)); // 输出：整型变量占用的内存是=4 用于变量 sizeof(变量名); sizeof 变量名; 变量名可以不用括号括住，带括号的用法更普遍，大多数程序员采用这种形式。 sizeof(结构体) /* * 程序名：book90.c，此程序用于演示C语言的结构体占用内存的情况 * 作者：C语言技术网(www.freecplus.net) 日期：20190525 */ #include &amp;lt;stdio.h&amp;gt; // #pragma pack(1) # 告诉编译器内存按1字节对齐。 struct st_girl { char name[50]; // 姓名 int age; // 年龄 int height; // 身高，单位：厘米cm char sc[30]; // 身材，火辣；普通；飞机场。 char yz[30]; // 颜值，漂亮；一般；歪瓜裂枣。 }; int main() { struct st_girl queen; printf(&amp;#34;sizeof(struct st_girl) %d\n&amp;#34;,sizeof(struct st_girl)); printf(&amp;#34;sizeof(queen) %d\n&amp;#34;,sizeof(queen)); } 数据类型 内存管理和存储架构 //main.c #include &amp;lt;stdio.h&amp;gt;#include &amp;lt;stdlib.h&amp;gt; static int st_val; //静态全局变量 -- 静态存储区 int ex_val; //全局变量 -- 静态存储区 int main(void) { int a = 0; //局部变量 -- 栈上申请 int *ptr = NULL; //指针变量 static int local_st_val = 0; //静态变量 local_st_val += 1; a = local_st_val; ptr = (int *)malloc(sizeof(int)); //从堆上申请空间 if(ptr != NULL) { printf(&amp;#34;*p value:%d&amp;#34;, *ptr); free(ptr); ptr = NULL; //free后需要将ptr置空，否则会导致后续ptr的校验失效，出现野指针 } } 指针和数组 结构类型和对齐 typedef enum { spring = 1, summer, autumn, winter }season; season s1 = summer; typedef union{ char c; short s; int i; }UNION_VAL; UNION_VAL val; 结构体则是将具有共通特征的变量组成的集合，比起C++的类来说，它没有安全访问的限制，不支持直接内部带函数，但通过自定义数据类型，函数指针，仍然能够实现很多类似于类的操作，对于大部分嵌入式项目来说，结构化处理数据对于优化整体架构以及后期维护大有便利。 typedef int (*pfunc)(int, int); typedef struct{ int num; int profit; pfunc get_total; }STRUCT_VAL; int GetTotalProfit(int a, int b) { return a*b; } int main(void){ STRUCT_VAL Val; STRUCT_VAL *pVal; Val.get_total = GetTotalProfit; Val.num = 1; Val.profit = 10; printf(&amp;#34;Total:%d\n&amp;#34;, Val.get_total(Val.num, Val.profit)); //变量访问 pVal = &amp;amp;Val; printf(&amp;#34;Total:%d\n&amp;#34;, pVal-&amp;gt;get_total(pVal-&amp;gt;num, pVal-&amp;gt;profit)); //指针访问 } C语言的结构体支持指针和变量的方式访问，通过转换可以解析任意内存的数据(如我们之前提到的通过指针强制转换解析协议)，另外通过将数据和函数指针打包，在通过指针传递，是实现驱动层实接口切换的重要基础，有着重要的实践意义，另外基于位域，联合体，结构体，可以实现另一种位操作，这对于封装底层硬件寄存器具有重要意义，实践如下： typedef unsigned char uint8_t; union reg { struct { uint8_t bit0:1; uint8_t bit1:1; uint8_t bit2_6:5; uint8_t bit7:1; }bit; uint8_t all; }; int main(void) { union reg RegData; RegData.all = 0; RegData.bit.bit0 = 1; RegData.bit.bit7 = 1; printf(&amp;#34;0x%x\n&amp;#34;, RegData.all); RegData.bit.bit2_6 = 0x3; printf(&amp;#34;0x%x\n&amp;#34;, RegData.all); } 通过联合体和位域操作，可以实现对数据内bit的访问，这在寄存器以及内存受限的平台，提供了简便且直观的处理方式。 预处理机制 模块化编程 一般项目结构，采用模块化思想组织项目。.c 文件主要负责实现，定义函数；.h 文件主要负责声明，比如函数声明、宏定义等。若采用面向对象编程思想，.h文件存放数据（结构体）和数据操作接口（函数）,.c文件负责实现具体的功能函数。 project module1 inc header1.h header2.h src func1.c func2.c module2 inc src main.c config.xml docs 设计自己的库 1、原则 每个库有一个自己的主题 要考虑通用性 2、设计库接口和函数实现 接口/头文件（.h） //file:random.h //随机函数库的头文件 #ifndef _random_h #define _random_h //函数：RandomInit //用法：RandomInit() //作用：此函数初始化随机数发生器，需要用随机数的程序在第一次生成随机数前，必须先调用一次本函数 void RandomInit(); //函数：RandomInteger //用法：n = RandomInteger(int low, int high); //作用：此函数返回一个low到hign之间的随机数，包括low和high int RandomInteger(int low, int high); //函数：RandomDouble //用法：n = RandomDouble(low, high) //作用：此函数返回一个大于等于low，且小于high的随机实数 double RandomDouble(double low,double high); #endif 实现/源代码(.c) //file:random.cpp //该文件实现了random库 #include &amp;lt;cstdlib&amp;gt;#include &amp;lt;ctime&amp;gt;#include &amp;lt;random.h&amp;gt; //函数：RandomInit //该函数取当前系统时间作为随机数发生器种子 void RandomInit() { srand(time(NULL)); } //函数：RandomInteger //该函数将0到RAND_MAX的区间划分成high-low+1个子区间 //当产生的随机数逻在第一个子区间时，则映射成low。当落在最后一个子区间时， //则映射成high。当落在第i个子区间时（i从0到high-low），则映射到low+1 int RandomInteger(int low, int high) { return (low + (high - low + 1)*rand() / (RAND_MAX +1)); } //函数：RandomDouble //该函数将产生的随机数映射为[0,1]之间的实数，然后转换到区间[low,high] double RandomDouble(double low, double high) { double d = (double rand() / (RAND_MAX + 1)); return (low + (high - low +1) * d); } 三、嵌入式系统基础 嵌入式系统基础 通信基础 在嵌入式中，通信将主控芯片与传感器、存储芯片、外围控制芯片等连接了起来，使得功能不再受限于主控本身。主控既从其它设备获取信息，也将自己的信息传递给其它设备。如果通信没处理好，将直接影响整个系统的功能，由此可见通信技术的重要性4。 相关概念有： 串行/并行 全双工/半双工/单工 同步/异步 同步通信的做法是加一个时钟信号，发送方和接收方在这个时钟的节拍下传输数据，比如常见的 SPI、I2C。而异步通信的做法是对数据进行封装，在数据开头加上起始信号，在数据结尾加上终止信号，双方就按这个规则传输数据，比如 UART、1-Wire。因此，可以通过是否有时钟信号，初步判断是何种数据同步方式。 对于同步通信，通信速率由时钟信号决定，时钟信号越快，传输速度就越快。对于异步通信，需要收发双方提前统一通信速率，这也就是我们串口调试时，波特率不对显示乱码的原因。 电平标准 说到串口，经常提到 TTL、RS232、RS422、RS485，简单的说，就是为了适应不同的环境条件，使用了不同的电平标准。假如微处理器和板载的蓝牙透传模块通信时，一般就使用 TTL 电平，引脚直接连接即可。假如微处理器在工业现场，需要连接一个几十米外的装置，则应该考虑将 TTL 电平转为 RS232、</description>
    </item>
    
    <item>
      <title>Visual Studio Code 编辑器</title>
      <link>https://blog.hjroyal.top/posts/readings/2023-06-vscode%E6%9D%83%E5%A8%81%E6%8C%87%E5%8D%97/</link>
      <pubDate>Fri, 09 Jun 2023 08:39:59 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/readings/2023-06-vscode%E6%9D%83%E5%A8%81%E6%8C%87%E5%8D%97/</guid>
      <description>VSCode开发环境搭建，打造成高效的IDE，应对小型项目。</description>
    </item>
    
    <item>
      <title>摄影学习笔记</title>
      <link>https://blog.hjroyal.top/posts/readings/2023-05-%E6%91%84%E5%BD%B1%E7%AC%94%E8%AE%B0-%E5%AE%81%E6%80%9D%E6%BD%87%E6%BD%87/</link>
      <pubDate>Sun, 28 May 2023 13:56:09 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/readings/2023-05-%E6%91%84%E5%BD%B1%E7%AC%94%E8%AE%B0-%E5%AE%81%E6%80%9D%E6%BD%87%E6%BD%87/</guid>
      <description>学习曝光三要素:光圈、快门、感光度，以及构图基础。</description>
    </item>
    
    <item>
      <title>Objectives and Key Results in Logseq</title>
      <link>https://blog.hjroyal.top/posts/tools/2023-05-okr-gtd-note-logseq/</link>
      <pubDate>Tue, 16 May 2023 10:47:52 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/tools/2023-05-okr-gtd-note-logseq/</guid>
      <description>Logseq中实现了四象限每日任务划分，还不会高级查询语句，仅对部分实现进行总结记录。 关键操作如下 1、新建模板页面，比如一个page页面 [[template]]，存放下面的代码。 #.v-eisenhower-matrix template:: 今日目标 ### [[📅 在做计划事项]] ### [[🌞 待做计划事项]] ### [[⏰ 在做其他事项]] ### [[🚮 待做其他事项]] 2、自定义主题文件custom.css中添加样式代码。 custom.css /* /* Theme custom css start /* https://raw.githack.com/dracula/logseq/master/custom.css */ @import url(&amp;#34;https://fonts.googleapis.com/css2?family=Fira+Code:wght@300;400;500;700&amp;amp;family=Fira+Sans:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700&amp;amp;display=swap&amp;#34;); :root { --background: #282a36; --light-background: #343746; --lighter-background: #424450; --dark-background: #21222c; --darker-background: #191a21; --foreground: #f8f8f2; --current-line: #44475a; --comment: #6272a4; --white: var(--foreground); --white-hover: #f8f8f280; --red: #ff5555; --orange: #ffb86c; --yellow: #1a1eda; --green: #50fa7b; --purple: #bd93f9; --purple-hover: #bf93f980; --cyan: #051aa0; --cyan-hover: #8be9fd80; --pink: #ff79c6; --pink-hover: #ff79c680; --ls-tag-text-opacity: 0.8; --ls-tag-text-hover-opacity: 0.8; --ls-page-text-size: 16px; --ls-page-title-size: 36px; --ls-font-family: &amp;#34;Fira Sans&amp;#34;; --ls-font-weight: 300; --ls-font-letter-spacing: 0.002em; --ls-font-line-height: 1.5; --ls-border-radius-low: 3px; --ls-border-radius-medium: 6px; } .dark-theme, html[data-theme=&amp;#34;dark&amp;#34;] { --ls-primary-background-color: var(--background); --ls-secondary-background-color: var(--dark-background); --ls-tertiary-background-color: var(--light-background); --ls-quaternary-background-color: var(--light-background); --ls-quinary-background-color: var(--darker-background); --ls-active-primary-color: var(--foreground); --ls-active-secondary-color: var(--foreground); --ls-primary-text-color: var(--foreground); --ls-secondary-text-color: var(--white-hover); --ls-search-background-color: var(--background); --ls-border-color: var(--comment); --ls-secondary-border-color: var(--ls-border-color); --ls-menu-hover-color: var(--light-background); --ls-table-tr-even-background-color: var(--light-background); --ls-head-text-color: var(--foreground); --ls-title-text-color: var(--foreground); --ls-link-text-color: var(--pink); --ls-link-text-hover-color: var(--pink-hover); --ls-link-ref-text-color: var(--pink); --ls-link-ref-text-hover-color: var(--pink-hover); --ls-block-ref-link-text-color: var(--ls-border-color); --ls-tag-text-color: var(--purple); --ls-tag-text-hover-color: var(--purple-hover); --ls-block-bullet-border-color: var(--current-line); --ls-block-bullet-color: var(--foreground); --ls-block-highlight-color: var(--current-line); --ls-block-properties-background-color: var(--light-background); --ls-page-checkbox-color: transparent; --ls-page-checkbox-border-color: var(--comment); --ls-page-blockquote-color: var(--foreground); --ls-page-blockquote-bg-color: var(--light-background); --ls-page-blockquote-border-color: var(--yellow); --ls-page-inline-code-color: var(--orange); --ls-page-inline-code-bg-color: var(--background); --ls-scrollbar-background-color: var(--background); --ls-scrollbar-foreground-color: var(--darker-background); --ls-scrollbar-thumb-hover-color: var(--light-background); --ls-icon-color: var(--white-hover); --ls-search-icon-color: var(--white-hover); --ls-a-chosen-bg: var(--light-background); --ls-right-sidebar-code-bg-color: var(--light-background); --ls-selection-background-color: var(--comment); --ls-slide-background-color: var(--ls-primary-background-color); --ls-guideline-color: var(--ls-border-color); } html, body { font-weight: var(--ls-font-weight); letter-spacing: var(--ls-font-letter-spacing); line-height: var(--ls-font-line-height); font-size: var(--ls-page-text-size); background-color: #282a36; } i { color: var(--yellow); } b { color: var(--orange); } mark { background-color: var(--yellow); } .bg-orange-400 { background-color: var(--orange); } .bg-green-600 { background-color: var(--green); } .bg-red-500 { background-color: var(--red); } .dark-theme .form-checkbox { border: 1px solid var(--ls-page-checkbox-border-color) !important; border-radius: var(--ls-border-radius-low) !important; } .external-link { color: var(--cyan); text-decoration: none; border-bottom: none; } .external-link:hover { color: var(--cyan-hover); } h1.title, .ls-block h1, .ls-block h2, .ls-block h3, .ls-block h4, .ls-block h5, .ls-block h6 { font-weight: 400; } /* Priority tag styling */ .priority { color: var(--ls-tag-text-color); opacity: 1 !important; } .priority:hover, a.tooltip-priority:hover { color: var(--ls-tag-text-hover-color); opacity: 0.5; } a.tooltip-priority { color: var(--ls-tag-text-color); } .Tooltip__label { background: var(--ls-quinary-background-color); } .Tooltip__label::after { border-bottom-color: var(--ls-quinary-background-color); } .page-reference .bracket { color: var(--ls-border-color); opacity: 0.8; } /* Name: Dracula for CodeMirror Author: Michael Kaminsky (http://github.com/mkaminsky11) Adapted by: Sly Bouhafs Original dracula color scheme by Zeno Rocha (https://github.com/zenorocha/dracula-theme) Adapted for logseq */ .CodeMirror { font-family: &amp;#34;FiraCode Nerd Font&amp;#34;, &amp;#34;Fire Code&amp;#34;, monospace; line-height: 1.2; background: var(--background); } .cm-s-default.CodeMirror, .cm-s-default .CodeMirror-gutters { background-color: transparent; color: var(--white) !important; border: none; } .extensions__code-lang { background: var(--light-background); } .cm-s-default.CodeMirror { border: 5px solid var(--light-background); } .cm-s-default .CodeMirror-gutters { color: var(--background); } .cm-s-default .CodeMirror-cursor { border-left: solid thin var(--white); } .cm-s-default .CodeMirror-linenumber { color: var(--comment); } .cm-s-default .CodeMirror-selected { background: rgba(255, 255, 255, 0.1); } .cm-s-default .CodeMirror-line { box-shadow: none; } .cm-s-default .CodeMirror-line::selection, .cm-s-default .CodeMirror-line &amp;gt; span::selection, .cm-s-default .CodeMirror-line &amp;gt; span &amp;gt; span::selection { background: rgba(255, 255, 255, 0.1); } .cm-s-default .CodeMirror-line::-moz-selection, .cm-s-default .CodeMirror-line &amp;gt; span::-moz-selection, .cm-s-default .CodeMirror-line &amp;gt; span &amp;gt; span::-moz-selection { background: rgba(255, 255, 255, 0.1); } .cm-s-default span.cm-comment { color: var(--comment); } .cm-s-default span.cm-string, .cm-s-default span.cm-string-2 { color: var(--yellow); } .cm-s-default span.cm-number { color: var(--purle); } .cm-s-default span.cm-variable { color: var(--green); } .cm-s-default span.cm-variable-2 { color: var(--white); } .cm-s-default span.cm-def { color: var(--green); } .cm-s-default span.cm-operator { color: var(--pink); } .cm-s-default span.cm-keyword { color: var(--pink); } .cm-s-default span.cm-atom { color: var(--purple); } .cm-s-default span.cm-meta { color: var(--white); } .cm-s-default span.cm-tag { color: var(--pink); } .cm-s-default span.cm-attribute { color: var(--green); } .cm-s-default span.cm-qualifier { color: var(--green); } .cm-s-default span.cm-property { color: var(--cyan); } .cm-s-default span.cm-builtin { color: var(--green); } .cm-s-default span.cm-variable-3, .cm-s-default span.cm-type { color: var(--orange); } .cm-s-default .CodeMirror-activeline-background { background: rgba(255, 255, 255, 0.409); } .cm-s-default .CodeMirror-matchingbracket { text-decoration: underline; color: var(--white) !important; } #right-sidebar pre.CodeMirror-line { background: transparent; } /* /* Theme custom css end /* /* WIP css eisenhower matrix by cannibalox v202100306 */ /* works best with the `v-eisenhower` template */ /* activate with: `/template v-eisenhower */ /* or tag a block with `#.v-eisenhower-matrix` */ /* define vars */ @media only screen and (min-width: 768px) { [data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;]{ --eisen-caption-color: #fff; --eisen-caption-bg: #0000; --eisen-scrollbar-width: 2px; --eisen-scrollbar-thumb: #3d39399e; --eisen-scrollbar-track: #0000; --eisen-outercaption-color: #979797b8; --eisen-todo-bgcolor: #4bad00a8; --eisen-decide-bgcolor: #0067beb8; --eisen-delegate-bgcolor:#bf8300c7; --eisen-eliminate-bgcolor:#9c003ecc; --eisen-bullet-color : #282a37; --eisen-clover-borderstyle: 1px solid grey; /*eg: 3px solid white */ font-size:14px; } /* optionnal : add captions around the diagram */ div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children:before { content: &amp;#34;↑ 重要&amp;#34;; position: absolute; color: var(--eisen-outercaption-color); font-size: 12px; left: 45%; top: -1.5rem; } div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children:after { content: &amp;#34;紧急 ←&amp;#34;; position: absolute; color: var(--eisen-outercaption-color); font-size: 12px; left: -3rem; top: 48%; } div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;]:before { content: &amp;#34;↓ 不重要&amp;#34;; position: absolute; color: var(--eisen-outercaption-color); font-size: 12px; left: 46%; bottom: -1rem; } div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;]:after { content: &amp;#34;→ 不紧急&amp;#34;; position: absolute; color: var(--eisen-outercaption-color); font-size: 12px; right: -1rem; top: 50%; } /* blocks / col */ div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children &amp;gt; div.ls-block { display: inline-block; width: 46%; overflow: hidden; margin: 5px; height: 22rem; } /* remove matrix left border*/ div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children-left-border { visibility: hidden } div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children &amp;gt; div.ls-block { border:var(--eisen-clover-borderstyle);} div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children &amp;gt; div.ls-block:nth-last-child(4) {} div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children &amp;gt; .ls-block:nth-last-child(3) {} div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children &amp;gt; .ls-block:nth-last-child(2) {} div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children &amp;gt; .ls-block:nth-last-child(1) {} /*background-color: var(--eisen-eliminate-bgcolor);*/ /* clover contents */ div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children &amp;gt; .ls-block &amp;gt; .block-children-container &amp;gt; .block-children { overflow: auto; height: 18rem; } div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children &amp;gt; .ls-block &amp;gt; .block-children-container &amp;gt; .block-children .bullet { background-color:var(--eisen-bullet-color) !important; } /* scrollbar for each block */ div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children &amp;gt; .ls-block &amp;gt; .block-children-container &amp;gt; .block-children::-webkit-scrollbar {width:var(--eisen-scrollbar-width);} div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children &amp;gt; .ls-block &amp;gt; .block-children-container &amp;gt; .block-children::-webkit-scrollbar-thumb {background-color:var(--eisen-scrollbar-thumb); border-radius: 0px;} div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children &amp;gt; .ls-block &amp;gt; .block-children-container &amp;gt; .block-children::-webkit-scrollbar-track {background:var(--eisen-scrollbar-track); } /* block titles */ div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children &amp;gt; div.ls-block &amp;gt; div &amp;gt; div:nth-child(2) { font-size: 0.7rem; text-align: center; margin-left: -1rem; margin-top: 4px; } div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children &amp;gt; div.ls-block &amp;gt; .flex-1.flex-row &amp;gt; div &amp;gt; .block-content .page-reference { background:var(--eisen-caption-bg); border-radius: 3px; } div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children &amp;gt; div.ls-block &amp;gt; .flex-1.flex-row &amp;gt; div &amp;gt; .block-content .page-ref { color:var(--eisen-caption-color); } /* remove bullet of the block title */ div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children &amp;gt; div.ls-block &amp;gt; div &amp;gt; div .bullet { visibility: hidden } /* remove indent line ~ margin-left of table cells */ div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children &amp;gt; .ls-block &amp;gt; .block-children-container &amp;gt; .block-children-left-border { visibility: hidden } div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] &amp;gt; .block-children-container &amp;gt; .block-children-container &amp;gt; .block-children { border:none; margin: 0px 0px 0 30px !important; } div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] .dsl-query &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div.content { display: none; } div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] .block-body &amp;gt; div &amp;gt; div &amp;gt; div.initial { margin-top: -32px; margin-left: -20px; margin-right: 20px; } div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] .block-body &amp;gt; div &amp;gt; div &amp;gt; div.initial &amp;gt; div &amp;gt; div &amp;gt; div { margin-top: 0px !important; margin-bottom: 0px !important; } div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] .dsl-query &amp;gt; div &amp;gt; div &amp;gt; div.initial &amp;gt; div.content { margin-right:1rem; margin-left:-1rem !important; margin-top:-1rem !important; } div[data-refs-self*=&amp;#34;eisenhower-matrix&amp;#34;] .custom-query-title { display: none; } /* =============== END OF EISENHOWER MATRIX =====================*/ } /* vismode icon component by cannibalox */ /* part of the ls-vizmods-suite */ a.tag[data-ref*=&amp;#34;.v-&amp;#34;]:before { content:&amp;#34;🚩今日目标&amp;#34;; font-size: 0.75rem; line-height: 0.75rem; } a.tag[data-ref*=&amp;#34;.v-&amp;#34;]:hover:before { padding-right:0.3rem; } a.tag[data-ref*=&amp;#34;.v-&amp;#34;]:hover { font-size: 0.75rem; line-height: 0.75rem; } a.tag[data-ref*=&amp;#34;.v-&amp;#34;]{ font-size: 0px; font-family: iosevka, fira code, consolas, source code pro; color: #88e165; background-color: #2b5ce2; /*border: 1px solid #a1c65d; border-radius: 3px;*/ padding: 0 2px; } 参考资料： OKR + GTD + Note =&amp;gt; Logseq</description>
    </item>
    
    <item>
      <title>Xmind思维导图 </title>
      <link>https://blog.hjroyal.top/posts/tools/2023-05-xmind/</link>
      <pubDate>Wed, 10 May 2023 22:00:31 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/tools/2023-05-xmind/</guid>
      <description>使用思维导图将文字浓缩整理，便于清晰展示和演讲。</description>
    </item>
    
    <item>
      <title>Connected Papers Connected Ideas</title>
      <link>https://blog.hjroyal.top/posts/notes/2023-05-connected-papers/</link>
      <pubDate>Mon, 08 May 2023 21:33:47 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2023-05-connected-papers/</guid>
      <description>方便写综述和把握研究方向</description>
    </item>
    
    <item>
      <title>黄山 | 说走就走的旅行</title>
      <link>https://blog.hjroyal.top/posts/photos/2023-05-may-day-record/</link>
      <pubDate>Thu, 04 May 2023 12:47:51 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/photos/2023-05-may-day-record/</guid>
      <description>难得的五天假期，作为一个毕业旅行，继往开来。</description>
    </item>
    
    <item>
      <title>Chatgpt：STAR x SMART</title>
      <link>https://blog.hjroyal.top/posts/notes/2023-04-star-smart-rule/</link>
      <pubDate>Fri, 21 Apr 2023 22:03:31 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2023-04-star-smart-rule/</guid>
      <description>一次借助ChatGpt学习已有经验法则的过程。</description>
    </item>
    
    <item>
      <title>学车记录 | 上海C1手动挡经验 </title>
      <link>https://blog.hjroyal.top/posts/notes/2023-04-driving-license/</link>
      <pubDate>Fri, 07 Apr 2023 11:30:41 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2023-04-driving-license/</guid>
      <description>记录博主的考驾照过程，主打一个框架感。</description>
    </item>
    
    <item>
      <title>Logseq Plugins</title>
      <link>https://blog.hjroyal.top/posts/tools/2023-04-logseq-plugins/</link>
      <pubDate>Wed, 05 Apr 2023 20:39:30 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/tools/2023-04-logseq-plugins/</guid>
      <description>插件丰富了Logseq的功能，带来了许多方便的功能。下面盘点博主使用的几款logseq插件。 1. Text Wrap 创建自定义文字包围/替换及快捷键，默认提供了一组实用的配置。 安装这个插件，可以像word中那样右键设置文字格式，比如高亮、颜色等。 2. PDF Export Plugin 可将页面导出为PDF格式，可以自定义输出样式。 3. Todo list 显示、添加所有的TODO代办事项。 4. logseq-wordcount-plugin 统计block下面的总字数。 5. Heatmap 一种类似Github上面的记笔记的热力图，越记越多之后，有小成就。 6. Bullet Threading 使得缩进更好看一点。 7. GPT-3 OpenAI 利用GPT生成和总结文本。 8. Agenda 日程管理：官方教程 https://haydenull.github.io/logseq-plugin-agenda/zh/ 写工作日记、周报、工作项目的有用利器。工作相关可以专门开一张图谱记录。 9. logseq-kanban-plugin 看板插件，可以设置多个栏目的事件列表。 10. Tags 查看所有标签。 11. Logseq Markmap 思维导图模式，大纲型文字转换为树形结构图展示。</description>
    </item>
    
    <item>
      <title>Zotero × Logseq</title>
      <link>https://blog.hjroyal.top/posts/tools/2023-04-zotero_logseq/</link>
      <pubDate>Wed, 05 Apr 2023 09:16:39 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/tools/2023-04-zotero_logseq/</guid>
      <description>Zotero的免费WebDAV存储方案与Logseq联动介绍</description>
    </item>
    
    <item>
      <title>Hugo相册</title>
      <link>https://blog.hjroyal.top/posts/notes/2023-03-hugo-gallery/</link>
      <pubDate>Sat, 25 Mar 2023 18:18:41 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2023-03-hugo-gallery/</guid>
      <description>-- -- var swiper = new Swiper(&#39;.swiper-container&#39;, { pagination: &#39;.swiper-pagination&#39;, paginationClickable: true, autoHeight: true, keyboardControl: true, mousewheelControl: true, lazyLoading: true, lazyLoadingInPrevNext: true, loop: true, }); -- 博客的多图片展示，一开始依靠的是hugo-easy-gallery，但是不方便显示和查看照片，希望有更舒适的方式支持图片展示。找到了几个符合想象的样例后，咨询使用者，得到了用插件处理的解决方案。跟着大佬的教程完成了操作：Hugo博客添加相册功能。 一开始按照教程，实现不了，推断是我魔改代码其他地方影响了。无奈，重新拉取了Sulv博主的源码，重新按照自己的搭建教程，很快就修复好了。使用方式利用如下代码： [comment]: &amp;lt;&amp;gt; 使用的时候去掉{ {&amp;lt;之间的空格 { {&amp;lt; galleries &amp;gt;}} { {&amp;lt; gallery src=&amp;#34;https://pic.huangjia.site/blog-images//2023-01-photos/shouxiguo.png&amp;#34; title=&amp;#34;七餐寿喜锅&amp;#34;&amp;gt;}} { {&amp;lt; gallery src=&amp;#34;https://pic.huangjia.site/blog-images//2023-01-photos/malatang.png&amp;#34; title=&amp;#34;玉兰苑麻辣烫&amp;#34;&amp;gt;}} { {&amp;lt; gallery src=&amp;#34;https://pic.huangjia.site/blog-images//2023-01-photos/donghumianguan.png&amp;#34; title=&amp;#34;东湖面馆&amp;#34;&amp;gt;}} { {&amp;lt; galleries &amp;gt;}} 另外，解决了页脚又拍云图片和文字在一行居中的问题。在blank.css中添加了如下代码，不知道怎么的就成功了。 /* 页脚图像文字同行 */ .satisDiv span, img { padding-left: 0; vertical-align: middle; display: inline-block; float: none; } 文字图像同行显示代码： · 本站由&amp;lt;a href=&amp;#34;https://www.upyun.com/?utm_source=lianmeng&amp;amp;utm_medium=referral&amp;#34; target=&amp;#34;_blank&amp;#34;&amp;gt; &amp;lt;img src=&amp;#34;/img/又拍云_logo5.png&amp;#34; height=&amp;#34;30&amp;#34; align=&amp;#34;center&amp;#34; style=&amp;#34;float:center;margin: 0px 0px 8px 0px;&amp;#34;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;span&amp;gt;提供 CDN 加速/云存储服务&amp;lt;/span&amp;gt;</description>
    </item>
    
    <item>
      <title>青龙古寺| 第一个100km</title>
      <link>https://blog.hjroyal.top/posts/notes/2023-03-sjtu-cycling/</link>
      <pubDate>Thu, 23 Mar 2023 17:51:12 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/notes/2023-03-sjtu-cycling/</guid>
      <description>骑行活动回顾</description>
    </item>
    
    <item>
      <title>Logseq管理知识库</title>
      <link>https://blog.hjroyal.top/posts/tools/2023-01-logseq/</link>
      <pubDate>Sun, 22 Jan 2023 11:32:31 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/tools/2023-01-logseq/</guid>
      <description>具有日程、日历、日记、脑图、记忆闪卡等功能</description>
    </item>
    
    <item>
      <title>Git学习记录</title>
      <link>https://blog.hjroyal.top/posts/tools/2022-05-learn_git/</link>
      <pubDate>Mon, 19 Dec 2022 19:09:22 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/tools/2022-05-learn_git/</guid>
      <description>小白实操快速上手Git</description>
    </item>
    
    <item>
      <title>博客写作常用Markdown语法</title>
      <link>https://blog.hjroyal.top/posts/tools/2022-11-markdown/</link>
      <pubDate>Sat, 19 Nov 2022 00:00:00 +0000</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/tools/2022-11-markdown/</guid>
      <description>写作所用语法命令汇总备查，边用边记！</description>
    </item>
    
    <item>
      <title>矢量图编辑器Inkscape</title>
      <link>https://blog.hjroyal.top/posts/tools/2022-10-inkscape/</link>
      <pubDate>Thu, 20 Oct 2022 20:57:53 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/tools/2022-10-inkscape/</guid>
      <description>使用Inkscape编辑svg矢量图</description>
    </item>
    
    <item>
      <title>文献管理工具Zotero介绍</title>
      <link>https://blog.hjroyal.top/posts/tools/2022-09-zotero/</link>
      <pubDate>Sun, 18 Sep 2022 20:32:07 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/posts/tools/2022-09-zotero/</guid>
      <description>使用Zotero管理学术研究文献库</description>
    </item>
    
    <item>
      <title>🤝友链</title>
      <link>https://blog.hjroyal.top/links/</link>
      <pubDate>Sat, 06 Nov 2021 15:15:53 +0800</pubDate>
      
      <guid>https://blog.hjroyal.top/links/</guid>
      <description></description>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.hjroyal.top/copyright/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://blog.hjroyal.top/copyright/</guid>
      <description>♾️ 版权说明 ♾️ 本站（blog.hjroyal.top）文章均为原创文章，如有转载皆已注明。 本站采用 CC BY-NC-ND 4.0 协议，转载时请遵守以下条款： 保留署名 hjroyal 保留原文链接 不将本作品用于商业目的 禁止演绎，即您将不能在内容上进行混合、修改以及二次创作 本站图片来自我个人制作以及免费正版图片网站：unsplash.com, piqsels.com 如有任何内容不慎侵犯您的版权，请与我联系 hjroyal@foxmail.com</description>
    </item>
    
    
    
  </channel>
</rss>
