From 15a004e029ca0b021c9a32bb2eea6ab2db86d3b5 Mon Sep 17 00:00:00 2001 From: HalfSweet <60973476+HalfSweet@users.noreply.github.com> Date: Thu, 15 Feb 2024 10:41:33 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20HalfSwee?= =?UTF-8?q?t/Blog@48cd0b5a76a4b57198c5a0119079a83658bd53f7=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 404.html | 8 ++++---- about/index.html | 10 +++++----- article/index.html | 6 +++--- assets/{404.html-4drF9Evk.js => 404.html-DqB0uKRU.js} | 2 +- assets/{app-D-9x6QI5.js => app-CyNvHrTn.js} | 8 ++++---- assets/{arc-DABM7gY-.js => arc-DMRZBz_L.js} | 2 +- ...6-DMC-87Vi.js => blockDiagram-6b2b5046-AW2mnaFV.js} | 2 +- ...cdbb-msuuym5b.js => c4Diagram-b947cdbb-Bw00fpFg.js} | 2 +- assets/channel--gEAuDyl.js | 1 - assets/channel-B6V0Xavv.js | 1 + ...8-BIElS0CV.js => classDiagram-35230388-DIC9uu4d.js} | 2 +- ...XqrR-uJ.js => classDiagram-v2-412acd34-C4bxtkOK.js} | 2 +- assets/clone-D0ql2Bl4.js | 1 - assets/clone-DLl9TIHj.js | 1 + ...ditor-CP6j8PKR.js => codemirror-editor-CeymiSNG.js} | 2 +- ...8c9-A46DVPe0.js => createText-423428c9-CT7tVdQD.js} | 2 +- ...d417c7a0-CGghquq6.js => edges-d417c7a0-CFu7d-7I.js} | 2 +- ...3325-B1KvVqyH.js => erDiagram-0ea73325-DnsR5qyI.js} | 2 +- ...35e309a-BiuMpBKd.js => flowDb-d35e309a-CIlC8C_B.js} | 2 +- ...c1-46OnZScI.js => flowDiagram-d949d7c1-Ck-WpGt2.js} | 2 +- assets/flowDiagram-v2-49332944-DpB1o9Rk.js | 1 - assets/flowDiagram-v2-49332944-gWQnXuwP.js | 1 + ...s => flowchart-elk-definition-27cc417a-CJU1FHZd.js} | 2 +- ...b-T4vQOL_h.js => ganttDiagram-5c869e3b-DT7l6kX5.js} | 2 +- ...hrqmYDu.js => gitGraphDiagram-b9d81de9-CckPDPKR.js} | 2 +- assets/{graph-CuGlSLC7.js => graph-D5cjGHfx.js} | 2 +- ...8fae9850-lGecbVBV.js => index-8fae9850-Cngs626s.js} | 2 +- .../{index.html-JEmOVTCg.js => index.html-365dUKCI.js} | 2 +- .../{index.html-BIgkksOW.js => index.html-3SwqUsny.js} | 2 +- .../{index.html-Bhi0Eybb.js => index.html-BJxeWnaQ.js} | 2 +- .../{index.html-Hnwh8jig.js => index.html-BMfCwbMR.js} | 2 +- .../{index.html-D5B1IhJf.js => index.html-BPJZZFSA.js} | 2 +- .../{index.html-ACKTrq7U.js => index.html-BPWGypHL.js} | 2 +- .../{index.html-B-Edw71p.js => index.html-BTPB963G.js} | 2 +- .../{index.html-B4cHw0eK.js => index.html-BXqVfKKJ.js} | 2 +- .../{index.html-DDJKmshG.js => index.html-BZ0xt4Va.js} | 2 +- assets/index.html-Bo40qQBe.js | 1 - assets/index.html-BpD-P2T0.js | 1 - assets/index.html-BpmWWYAE.js | 1 + assets/index.html-Br0Mae8G.js | 1 - assets/index.html-BwM69ms8.js | 1 + assets/index.html-ByI9bp9e.js | 1 - assets/index.html-C2n54uF-.js | 1 + assets/index.html-C2vCwla0.js | 1 - assets/index.html-C4Lu8mH0.js | 1 - assets/index.html-C8jiYMp9.js | 1 - .../{index.html-BTxZ0LNa.js => index.html-CE_jJq4R.js} | 2 +- assets/index.html-CEzhFPYB.js | 1 - .../{index.html-DjnCJ-2t.js => index.html-CFzZKXLQ.js} | 2 +- assets/index.html-CJfjjnCk.js | 1 - assets/index.html-CLR8RZpv.js | 1 + assets/index.html-CNsgnhx1.js | 1 + assets/index.html-CRuCjIm6.js | 1 - assets/index.html-CSHqKRb_.js | 1 + assets/index.html-CXfh7_y1.js | 1 - .../{index.html-DPQfOISO.js => index.html-Ca2CLs25.js} | 2 +- assets/index.html-CfeG_oP9.js | 1 - assets/index.html-ClupMHz0.js | 1 - .../{index.html-CKJ264Dw.js => index.html-CmO2-53R.js} | 2 +- assets/index.html-Cs6r-sWz.js | 1 + assets/index.html-CvBa7NM4.js | 1 + assets/index.html-CvjFBXB1.js | 1 + assets/index.html-CwJV7lWb.js | 1 + assets/index.html-CxIVsmOO.js | 1 - assets/index.html-D-NMGG6a.js | 1 + assets/index.html-D3ySOvnr.js | 1 + assets/index.html-D5grrDYO.js | 1 - assets/index.html-D8d7LSCr.js | 1 + assets/index.html-DA-yXm38.js | 1 + assets/index.html-DA3_mYjB.js | 1 + assets/index.html-DJIvQo8P.js | 1 + assets/index.html-DL2NUgBQ.js | 1 + assets/index.html-DP8xckuS.js | 1 - assets/index.html-DRUYRxaH.js | 1 - assets/index.html-DRyBvRas.js | 1 - assets/index.html-DTiy5heK.js | 1 - assets/index.html-DULHtOFk.js | 1 - assets/index.html-DUbb3VhI.js | 1 + .../{index.html-ULxoTZDw.js => index.html-DUwCsd_Z.js} | 2 +- assets/index.html-DVBTp-Dg.js | 1 + assets/index.html-DW7_SZS0.js | 1 - assets/index.html-DWmPWUTD.js | 1 - .../{index.html-B1MISigO.js => index.html-Db9htIlG.js} | 2 +- assets/index.html-DfHktAw7.js | 1 + .../{index.html-BL2SQyLf.js => index.html-DgC4z35O.js} | 2 +- assets/index.html-DhUmNd-W.js | 1 - assets/index.html-DkF1l2TE.js | 1 + assets/index.html-DqyW-lPU.js | 1 + assets/index.html-DsxsIaoo.js | 1 - assets/index.html-Duq__jSq.js | 1 - assets/index.html-DvbFduSK.js | 1 + assets/index.html-DzH0Q7ag.js | 1 - assets/index.html-EKv1X2Ln.js | 1 - assets/index.html-HmsrUyra.js | 1 + assets/index.html-IK237U9M.js | 1 - assets/index.html-OkFvvXao.js | 1 + assets/index.html-P08J81ss.js | 1 + assets/index.html-QrKDo04c.js | 1 + assets/index.html-WNdfu53v.js | 1 - assets/index.html-Z2g0J8gX.js | 1 - assets/index.html-aJq4TWQz.js | 1 + assets/index.html-cLRKpNoH.js | 1 - .../{index.html-LDlhaGJn.js => index.html-ccEaKqwA.js} | 2 +- assets/index.html-cwTB87Bb.js | 1 + assets/index.html-hrOM8Uyk.js | 1 + assets/index.html-izc8SwoG.js | 1 - assets/index.html-j9lO7ahQ.js | 1 + .../{index.html-lMiy0Zjd.js => index.html-knekWKTU.js} | 2 +- assets/index.html-lNOakYRB.js | 1 - assets/index.html-n8ixZQAO.js | 1 + .../{index.html-CUoJCeLu.js => index.html-neww_7IA.js} | 2 +- assets/index.html-yRv7RuYj.js | 1 + ...fc-CihONRlf.js => infoDiagram-db7b18fc-B3xdg3Tr.js} | 2 +- ...CcjAAUp9.js => journeyDiagram-d5636530-XKD6QSjs.js} | 2 +- assets/{layout-BlZbNqLs.js => layout-CZYSZrfG.js} | 2 +- assets/{line-DjIvMmdC.js => line-Ck3SUyS5.js} | 2 +- assets/{linear-Bgkl6eeM.js => linear-DMxY9tbX.js} | 2 +- ...rmaid.core-Q7Nqzyqv.js => mermaid.core-BWHcSHhP.js} | 8 ++++---- ...DlXd.js => mindmap-definition-377f8f1f-C2wo4-4G.js} | 2 +- ...e96-CSBHQXFu.js => pieDiagram-b0208e96-C_TViHsV.js} | 2 +- ...W2dMtDx.js => quadrantDiagram-0332be45-CoPBAmuE.js} | 2 +- ...0gt1.js => requirementDiagram-bf7890df-V0Whc73B.js} | 2 +- ...-BRjkepza.js => sankeyDiagram-0acdec17-DVNH3iwZ.js} | 2 +- ...3gir1_y.js => sequenceDiagram-c18d009d-BrFzdcJq.js} | 2 +- ...0-7x1XxchH.js => stateDiagram-43596fc0-Chqf3NIe.js} | 2 +- ...drrDjcY.js => stateDiagram-v2-2ead4f9c-DB6TZE-g.js} | 2 +- ...860f46c-XcLcIVWU.js => styles-6860f46c--5XDv-Y0.js} | 2 +- ...383a064-Cj1tyYUi.js => styles-7383a064-BgvNDPWl.js} | 2 +- ...2c874b6-6ECvoxGn.js => styles-b2c874b6-DxJULLs3.js} | 2 +- ...-DvtmcXqY.js => svgDrawCommon-0ee1b4e9-hPCzxMGR.js} | 2 +- ...Kz_.js => timeline-definition-d977decf-I2v5SeUS.js} | 2 +- assets/{vue-repl-DwxvpZCS.js => vue-repl-BGH_41JB.js} | 2 +- ...BsvWlAd6.js => xychartDiagram-e50adddc-DbkB7LMu.js} | 2 +- category/ai/index.html | 6 +++--- category/index.html | 6 +++--- category/posts/index.html | 6 +++--- .../\345\215\225\347\211\207\346\234\272/index.html" | 6 +++--- .../\345\242\250\346\260\264\345\261\217/index.html" | 6 +++--- "category/\347\275\221\347\253\231/index.html" | 6 +++--- friends/index.html | 6 +++--- index.html | 6 +++--- posts/Air32-Clion/index.html | 6 +++--- posts/Air32-HAL-HighFreq/index.html | 6 +++--- posts/Air32-HAL-MCO/index.html | 6 +++--- posts/Empedded-CI-CD/index.html | 6 +++--- posts/EpdTraps1/index.html | 6 +++--- posts/HelloWorld/index.html | 6 +++--- posts/MDK6-Dev/index.html | 6 +++--- posts/SEGGER-RTT/index.html | 6 +++--- posts/STC_CoreMark/index.html | 6 +++--- posts/conda_novelai/index.html | 6 +++--- posts/embedded_fmtlib/index.html | 6 +++--- posts/index.html | 6 +++--- sitemap.xml | 2 +- star/index.html | 6 +++--- tag/air001/index.html | 6 +++--- tag/air32/index.html | 6 +++--- tag/arduino/index.html | 6 +++--- tag/cicd/index.html | 6 +++--- tag/clion/index.html | 6 +++--- tag/conda/index.html | 6 +++--- tag/coremark/index.html | 6 +++--- tag/depg0750rwu790f30/index.html | 6 +++--- tag/esp-idf/index.html | 6 +++--- tag/esp32/index.html | 6 +++--- tag/esp8266/index.html | 6 +++--- tag/fmtlib/index.html | 6 +++--- tag/helloworld/index.html | 6 +++--- tag/index.html | 6 +++--- tag/mco/index.html | 6 +++--- tag/novelai/index.html | 6 +++--- tag/platformio/index.html | 6 +++--- tag/stc32/index.html | 6 +++--- tag/stc8/index.html | 6 +++--- tag/uc8179/index.html | 6 +++--- .../index.html" | 6 +++--- "tag/\345\220\210\345\256\231/index.html" | 6 +++--- "tag/\345\242\250\346\260\264\345\261\217/index.html" | 6 +++--- "tag/\345\265\214\345\205\245\345\274\217/index.html" | 6 +++--- "tag/\346\227\245\345\277\227/index.html" | 6 +++--- "tag/\350\266\205\351\242\221/index.html" | 6 +++--- .../index.html" | 6 +++--- timeline/index.html | 6 +++--- 183 files changed, 260 insertions(+), 260 deletions(-) rename assets/{404.html-4drF9Evk.js => 404.html-DqB0uKRU.js} (71%) rename assets/{app-D-9x6QI5.js => app-CyNvHrTn.js} (97%) rename assets/{arc-DABM7gY-.js => arc-DMRZBz_L.js} (96%) rename assets/{blockDiagram-6b2b5046-DMC-87Vi.js => blockDiagram-6b2b5046-AW2mnaFV.js} (98%) rename assets/{c4Diagram-b947cdbb-msuuym5b.js => c4Diagram-b947cdbb-Bw00fpFg.js} (99%) delete mode 100644 assets/channel--gEAuDyl.js create mode 100644 assets/channel-B6V0Xavv.js rename assets/{classDiagram-35230388-BIElS0CV.js => classDiagram-35230388-DIC9uu4d.js} (97%) rename assets/{classDiagram-v2-412acd34-CXqrR-uJ.js => classDiagram-v2-412acd34-C4bxtkOK.js} (92%) delete mode 100644 assets/clone-D0ql2Bl4.js create mode 100644 assets/clone-DLl9TIHj.js rename assets/{codemirror-editor-CP6j8PKR.js => codemirror-editor-CeymiSNG.js} (99%) rename assets/{createText-423428c9-A46DVPe0.js => createText-423428c9-CT7tVdQD.js} (99%) rename assets/{edges-d417c7a0-CGghquq6.js => edges-d417c7a0-CFu7d-7I.js} (99%) rename assets/{erDiagram-0ea73325-B1KvVqyH.js => erDiagram-0ea73325-DnsR5qyI.js} (99%) rename assets/{flowDb-d35e309a-BiuMpBKd.js => flowDb-d35e309a-CIlC8C_B.js} (99%) rename assets/{flowDiagram-d949d7c1-46OnZScI.js => flowDiagram-d949d7c1-Ck-WpGt2.js} (97%) delete mode 100644 assets/flowDiagram-v2-49332944-DpB1o9Rk.js create mode 100644 assets/flowDiagram-v2-49332944-gWQnXuwP.js rename assets/{flowchart-elk-definition-27cc417a-BxYb5UWY.js => flowchart-elk-definition-27cc417a-CJU1FHZd.js} (99%) rename assets/{ganttDiagram-5c869e3b-T4vQOL_h.js => ganttDiagram-5c869e3b-DT7l6kX5.js} (99%) rename assets/{gitGraphDiagram-b9d81de9-BhrqmYDu.js => gitGraphDiagram-b9d81de9-CckPDPKR.js} (99%) rename assets/{graph-CuGlSLC7.js => graph-D5cjGHfx.js} (99%) rename assets/{index-8fae9850-lGecbVBV.js => index-8fae9850-Cngs626s.js} (96%) rename assets/{index.html-JEmOVTCg.js => index.html-365dUKCI.js} (98%) rename assets/{index.html-BIgkksOW.js => index.html-3SwqUsny.js} (99%) rename assets/{index.html-Bhi0Eybb.js => index.html-BJxeWnaQ.js} (71%) rename assets/{index.html-Hnwh8jig.js => index.html-BMfCwbMR.js} (99%) rename assets/{index.html-D5B1IhJf.js => index.html-BPJZZFSA.js} (99%) rename assets/{index.html-ACKTrq7U.js => index.html-BPWGypHL.js} (71%) rename assets/{index.html-B-Edw71p.js => index.html-BTPB963G.js} (71%) rename assets/{index.html-B4cHw0eK.js => index.html-BXqVfKKJ.js} (71%) rename assets/{index.html-DDJKmshG.js => index.html-BZ0xt4Va.js} (99%) delete mode 100644 assets/index.html-Bo40qQBe.js delete mode 100644 assets/index.html-BpD-P2T0.js create mode 100644 assets/index.html-BpmWWYAE.js delete mode 100644 assets/index.html-Br0Mae8G.js create mode 100644 assets/index.html-BwM69ms8.js delete mode 100644 assets/index.html-ByI9bp9e.js create mode 100644 assets/index.html-C2n54uF-.js delete mode 100644 assets/index.html-C2vCwla0.js delete mode 100644 assets/index.html-C4Lu8mH0.js delete mode 100644 assets/index.html-C8jiYMp9.js rename assets/{index.html-BTxZ0LNa.js => index.html-CE_jJq4R.js} (99%) delete mode 100644 assets/index.html-CEzhFPYB.js rename assets/{index.html-DjnCJ-2t.js => index.html-CFzZKXLQ.js} (99%) delete mode 100644 assets/index.html-CJfjjnCk.js create mode 100644 assets/index.html-CLR8RZpv.js create mode 100644 assets/index.html-CNsgnhx1.js delete mode 100644 assets/index.html-CRuCjIm6.js create mode 100644 assets/index.html-CSHqKRb_.js delete mode 100644 assets/index.html-CXfh7_y1.js rename assets/{index.html-DPQfOISO.js => index.html-Ca2CLs25.js} (99%) delete mode 100644 assets/index.html-CfeG_oP9.js delete mode 100644 assets/index.html-ClupMHz0.js rename assets/{index.html-CKJ264Dw.js => index.html-CmO2-53R.js} (59%) create mode 100644 assets/index.html-Cs6r-sWz.js create mode 100644 assets/index.html-CvBa7NM4.js create mode 100644 assets/index.html-CvjFBXB1.js create mode 100644 assets/index.html-CwJV7lWb.js delete mode 100644 assets/index.html-CxIVsmOO.js create mode 100644 assets/index.html-D-NMGG6a.js create mode 100644 assets/index.html-D3ySOvnr.js delete mode 100644 assets/index.html-D5grrDYO.js create mode 100644 assets/index.html-D8d7LSCr.js create mode 100644 assets/index.html-DA-yXm38.js create mode 100644 assets/index.html-DA3_mYjB.js create mode 100644 assets/index.html-DJIvQo8P.js create mode 100644 assets/index.html-DL2NUgBQ.js delete mode 100644 assets/index.html-DP8xckuS.js delete mode 100644 assets/index.html-DRUYRxaH.js delete mode 100644 assets/index.html-DRyBvRas.js delete mode 100644 assets/index.html-DTiy5heK.js delete mode 100644 assets/index.html-DULHtOFk.js create mode 100644 assets/index.html-DUbb3VhI.js rename assets/{index.html-ULxoTZDw.js => index.html-DUwCsd_Z.js} (98%) create mode 100644 assets/index.html-DVBTp-Dg.js delete mode 100644 assets/index.html-DW7_SZS0.js delete mode 100644 assets/index.html-DWmPWUTD.js rename assets/{index.html-B1MISigO.js => index.html-Db9htIlG.js} (71%) create mode 100644 assets/index.html-DfHktAw7.js rename assets/{index.html-BL2SQyLf.js => index.html-DgC4z35O.js} (87%) delete mode 100644 assets/index.html-DhUmNd-W.js create mode 100644 assets/index.html-DkF1l2TE.js create mode 100644 assets/index.html-DqyW-lPU.js delete mode 100644 assets/index.html-DsxsIaoo.js delete mode 100644 assets/index.html-Duq__jSq.js create mode 100644 assets/index.html-DvbFduSK.js delete mode 100644 assets/index.html-DzH0Q7ag.js delete mode 100644 assets/index.html-EKv1X2Ln.js create mode 100644 assets/index.html-HmsrUyra.js delete mode 100644 assets/index.html-IK237U9M.js create mode 100644 assets/index.html-OkFvvXao.js create mode 100644 assets/index.html-P08J81ss.js create mode 100644 assets/index.html-QrKDo04c.js delete mode 100644 assets/index.html-WNdfu53v.js delete mode 100644 assets/index.html-Z2g0J8gX.js create mode 100644 assets/index.html-aJq4TWQz.js delete mode 100644 assets/index.html-cLRKpNoH.js rename assets/{index.html-LDlhaGJn.js => index.html-ccEaKqwA.js} (76%) create mode 100644 assets/index.html-cwTB87Bb.js create mode 100644 assets/index.html-hrOM8Uyk.js delete mode 100644 assets/index.html-izc8SwoG.js create mode 100644 assets/index.html-j9lO7ahQ.js rename assets/{index.html-lMiy0Zjd.js => index.html-knekWKTU.js} (99%) delete mode 100644 assets/index.html-lNOakYRB.js create mode 100644 assets/index.html-n8ixZQAO.js rename assets/{index.html-CUoJCeLu.js => index.html-neww_7IA.js} (99%) create mode 100644 assets/index.html-yRv7RuYj.js rename assets/{infoDiagram-db7b18fc-CihONRlf.js => infoDiagram-db7b18fc-B3xdg3Tr.js} (98%) rename assets/{journeyDiagram-d5636530-CcjAAUp9.js => journeyDiagram-d5636530-XKD6QSjs.js} (98%) rename assets/{layout-BlZbNqLs.js => layout-CZYSZrfG.js} (99%) rename assets/{line-DjIvMmdC.js => line-Ck3SUyS5.js} (93%) rename assets/{linear-Bgkl6eeM.js => linear-DMxY9tbX.js} (99%) rename assets/{mermaid.core-Q7Nqzyqv.js => mermaid.core-BWHcSHhP.js} (98%) rename assets/{mindmap-definition-377f8f1f-DjGxDlXd.js => mindmap-definition-377f8f1f-C2wo4-4G.js} (99%) rename assets/{pieDiagram-b0208e96-CSBHQXFu.js => pieDiagram-b0208e96-C_TViHsV.js} (98%) rename assets/{quadrantDiagram-0332be45-CW2dMtDx.js => quadrantDiagram-0332be45-CoPBAmuE.js} (99%) rename assets/{requirementDiagram-bf7890df-CWDp0gt1.js => requirementDiagram-bf7890df-V0Whc73B.js} (98%) rename assets/{sankeyDiagram-0acdec17-BRjkepza.js => sankeyDiagram-0acdec17-DVNH3iwZ.js} (99%) rename assets/{sequenceDiagram-c18d009d-D3gir1_y.js => sequenceDiagram-c18d009d-BrFzdcJq.js} (99%) rename assets/{stateDiagram-43596fc0-7x1XxchH.js => stateDiagram-43596fc0-Chqf3NIe.js} (97%) rename assets/{stateDiagram-v2-2ead4f9c-DdrrDjcY.js => stateDiagram-v2-2ead4f9c-DB6TZE-g.js} (90%) rename assets/{styles-6860f46c-XcLcIVWU.js => styles-6860f46c--5XDv-Y0.js} (99%) rename assets/{styles-7383a064-Cj1tyYUi.js => styles-7383a064-BgvNDPWl.js} (97%) rename assets/{styles-b2c874b6-6ECvoxGn.js => styles-b2c874b6-DxJULLs3.js} (99%) rename assets/{svgDrawCommon-0ee1b4e9-DvtmcXqY.js => svgDrawCommon-0ee1b4e9-hPCzxMGR.js} (95%) rename assets/{timeline-definition-d977decf-DMhBAKz_.js => timeline-definition-d977decf-I2v5SeUS.js} (99%) rename assets/{vue-repl-DwxvpZCS.js => vue-repl-BGH_41JB.js} (99%) rename assets/{xychartDiagram-e50adddc-BsvWlAd6.js => xychartDiagram-e50adddc-DbkB7LMu.js} (99%) diff --git a/404.html b/404.html index 8e8cf7e..f543c6d 100644 --- a/404.html +++ b/404.html @@ -30,11 +30,11 @@ HalfSweet's Blog - - + + -
跳至主要內容

404

页面不存在

看起来你访问了一个失效的链接

- +
跳至主要內容

404

页面不存在

我们是怎么来到这儿的?

+ diff --git a/about/index.html b/about/index.html index 9c4dd43..00b6d96 100644 --- a/about/index.html +++ b/about/index.html @@ -28,13 +28,13 @@ document.documentElement.setAttribute("data-theme", "dark"); } - 关于 | HalfSweet's Blog + 关于 | HalfSweet's Blog - - + + -
跳至主要內容

关于

HalfSweet小于 1 分钟

自我介绍

  • 我是半糖,19岁,事学生
  • 爱好电子,精通(看过)多种单片机使用方法以及编程语言
  • 最喜欢的屏幕是墨水屏
  • 计划学习更多有关ee和cs的内容,并希望今后从事类似的工作

会的东西

编程语言

  • 略懂C/CPP语言

TODO

单片机

  • 基于Arduino平台的AVR系列
  • 基于Arduino/ESP-IDF/Micropython的ESP32系列 (其实是个连idf都不会装的菜鸡)
  • 基于HAL库的STM32系列
  • 8051/80251(特指STC32)
  • CCS的安装与卸载

其它

初次之外半糖略懂一些关于墨水屏的知识,以及能在有详细文档的参考下做出一些有意思的东西(比如说这个博客)。

联系方式

- +
跳至主要內容

关于

HalfSweet小于 1 分钟

自我介绍

  • 我是半糖,19岁,事学生
  • 爱好电子,精通(看过)多种单片机使用方法以及编程语言
  • 最喜欢的屏幕是墨水屏
  • 计划学习更多有关ee和cs的内容,并希望今后从事类似的工作

会的东西

编程语言

  • 略懂C/CPP语言

TODO

单片机

  • 基于Arduino平台的AVR系列
  • 基于Arduino/ESP-IDF/Micropython的ESP32系列 (其实是个连idf都不会装的菜鸡)
  • 基于HAL库的STM32系列
  • 8051/80251(特指STC32)
  • CCS的安装与卸载

其它

初次之外半糖略懂一些关于墨水屏的知识,以及能在有详细文档的参考下做出一些有意思的东西(比如说这个博客)。

联系方式

+ diff --git a/article/index.html b/article/index.html index f1befdc..4f93ae9 100644 --- a/article/index.html +++ b/article/index.html @@ -30,8 +30,8 @@ 文章 | HalfSweet's Blog - - + +
跳至主要內容
嵌入式中的 CI/CD

对于传统的嵌入式开发来说,我们一般常用的IDE都是诸如Keil、IAR等。这些IDE在方便了我们的开发的同时,也存在很多问题,例如在之前Keil-MDK5是不能跨平台的,仅限在Windows平台运行,并且它的授权也是一个老大难的问题。这样我们在团队协作的时候往往就会遇到很多问题,无法像是互联网的开发那样有一套完整的CI/CD流程。但是MDK6的更新解决了这个问题,第一它是跨平台的,这样在Windows、Linux以及MacOS上都能运行;并且也支持了很多命令行的操作,避免了繁琐的GUI操作,这样也更有利于自动化脚本的编写。

@@ -49,6 +49,6 @@

其中上面一张图为我自己做的波形,第二张为使用的OTP波形,但是无一例外,都出现了刷新的问题。抱着也许是驱动板出问题了的想法,我重新lay了一次板子,焊接好之后发现问题确实有所改善,但是并不佳。后续在更换过程中发现采用cd32封装的68uH的电感刷新效果会更好一些,但是依旧存在刷新问题,特别是在UI中有竖着的线条的时候,特别影响观感。


HalfSweet大约 7 分钟墨水屏墨水屏UC8179DEPG0750RWU790F30遇到的坑
- + diff --git a/assets/404.html-4drF9Evk.js b/assets/404.html-DqB0uKRU.js similarity index 71% rename from assets/404.html-4drF9Evk.js rename to assets/404.html-DqB0uKRU.js index a575bdc..114164f 100644 --- a/assets/404.html-4drF9Evk.js +++ b/assets/404.html-DqB0uKRU.js @@ -1 +1 @@ -import{_ as e}from"./plugin-vue_export-helper-DlAUqK2U.js";import{o as t,c}from"./app-D-9x6QI5.js";const o={};function r(_,n){return t(),c("div")}const f=e(o,[["render",r],["__file","404.html.vue"]]);export{f as default}; +import{_ as e}from"./plugin-vue_export-helper-DlAUqK2U.js";import{o as t,c}from"./app-CyNvHrTn.js";const o={};function r(_,n){return t(),c("div")}const f=e(o,[["render",r],["__file","404.html.vue"]]);export{f as default}; diff --git a/assets/app-D-9x6QI5.js b/assets/app-CyNvHrTn.js similarity index 97% rename from assets/app-D-9x6QI5.js rename to assets/app-CyNvHrTn.js index 5f4e630..a704604 100644 --- a/assets/app-D-9x6QI5.js +++ b/assets/app-CyNvHrTn.js @@ -14,7 +14,7 @@ * @vue/runtime-dom v3.4.19 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/const D1="http://www.w3.org/2000/svg",F1="http://www.w3.org/1998/Math/MathML",Wt=typeof document<"u"?document:null,ss=Wt&&Wt.createElement("template"),H1={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const l=t==="svg"?Wt.createElementNS(D1,e):t==="mathml"?Wt.createElementNS(F1,e):Wt.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&l.setAttribute("multiple",r.multiple),l},createText:e=>Wt.createTextNode(e),createComment:e=>Wt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Wt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,l,o){const a=n?n.previousSibling:t.lastChild;if(l&&(l===o||l.nextSibling))for(;t.insertBefore(l.cloneNode(!0),n),!(l===o||!(l=l.nextSibling)););else{ss.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const i=ss.content;if(r==="svg"||r==="mathml"){const u=i.firstChild;for(;u.firstChild;)i.appendChild(u.firstChild);i.removeChild(u)}t.insertBefore(i,n)}return[a?a.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Nt="transition",Qn="animation",Vn=Symbol("_vtc"),Xt=(e,{slots:t})=>s(Wd,pc(e),t);Xt.displayName="Transition";const dc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},V1=Xt.props=Me({},ji,dc),rn=(e,t=[])=>{Z(e)?e.forEach(n=>n(...t)):e&&e(...t)},is=e=>e?Z(e)?e.some(t=>t.length>1):e.length>1:!1;function pc(e){const t={};for(const V in e)V in dc||(t[V]=e[V]);if(e.css===!1)return t;const{name:n="v",type:r,duration:l,enterFromClass:o=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:i=`${n}-enter-to`,appearFromClass:u=o,appearActiveClass:c=a,appearToClass:f=i,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:v=`${n}-leave-to`}=e,g=N1(l),E=g&&g[0],w=g&&g[1],{onBeforeEnter:y,onEnter:T,onEnterCancelled:b,onLeave:S,onLeaveCancelled:M,onBeforeAppear:C=y,onAppear:W=T,onAppearCancelled:F=b}=t,O=(V,te,Ie)=>{jt(V,te?f:i),jt(V,te?c:a),Ie&&Ie()},H=(V,te)=>{V._isLeaving=!1,jt(V,d),jt(V,v),jt(V,p),te&&te()},J=V=>(te,Ie)=>{const ke=V?W:T,G=()=>O(te,V,Ie);rn(ke,[te,G]),cs(()=>{jt(te,V?u:o),Pt(te,V?f:i),is(ke)||us(te,r,E,G)})};return Me(t,{onBeforeEnter(V){rn(y,[V]),Pt(V,o),Pt(V,a)},onBeforeAppear(V){rn(C,[V]),Pt(V,u),Pt(V,c)},onEnter:J(!1),onAppear:J(!0),onLeave(V,te){V._isLeaving=!0;const Ie=()=>H(V,te);Pt(V,d),hc(),Pt(V,p),cs(()=>{V._isLeaving&&(jt(V,d),Pt(V,v),is(S)||us(V,r,w,Ie))}),rn(S,[V,Ie])},onEnterCancelled(V){O(V,!1),rn(b,[V])},onAppearCancelled(V){O(V,!0),rn(F,[V])},onLeaveCancelled(V){H(V),rn(M,[V])}})}function N1(e){if(e==null)return null;if(Se(e))return[jl(e.enter),jl(e.leave)];{const t=jl(e);return[t,t]}}function jl(e){return qf(e)}function Pt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Vn]||(e[Vn]=new Set)).add(t)}function jt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Vn];n&&(n.delete(t),n.size||(e[Vn]=void 0))}function cs(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let z1=0;function us(e,t,n,r){const l=e._endId=++z1,o=()=>{l===e._endId&&r()};if(n)return setTimeout(o,n);const{type:a,timeout:i,propCount:u}=vc(e,t);if(!a)return r();const c=a+"end";let f=0;const d=()=>{e.removeEventListener(c,p),o()},p=v=>{v.target===e&&++f>=u&&d()};setTimeout(()=>{f(n[g]||"").split(", "),l=r(`${Nt}Delay`),o=r(`${Nt}Duration`),a=fs(l,o),i=r(`${Qn}Delay`),u=r(`${Qn}Duration`),c=fs(i,u);let f=null,d=0,p=0;t===Nt?a>0&&(f=Nt,d=a,p=o.length):t===Qn?c>0&&(f=Qn,d=c,p=u.length):(d=Math.max(a,c),f=d>0?a>c?Nt:Qn:null,p=f?f===Nt?o.length:u.length:0);const v=f===Nt&&/\b(transform|all)(,|$)/.test(r(`${Nt}Property`).toString());return{type:f,timeout:d,propCount:p,hasTransform:v}}function fs(e,t){for(;e.lengthds(n)+ds(e[r])))}function ds(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function hc(){return document.body.offsetHeight}function j1(e,t,n){const r=e[Vn];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const gr=Symbol("_vod"),c6={beforeMount(e,{value:t},{transition:n}){e[gr]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Xn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t==!n&&(e.style.display===e[gr]||!t)||(r?t?(r.beforeEnter(e),Xn(e,!0),r.enter(e)):r.leave(e,()=>{Xn(e,!1)}):Xn(e,t))},beforeUnmount(e,{value:t}){Xn(e,t)}};function Xn(e,t){e.style.display=t?e[gr]:"none"}const U1=Symbol(""),q1=/(^|;)\s*display\s*:/;function G1(e,t,n){const r=e.style,l=ae(n),o=r.display;let a=!1;if(n&&!l){if(t&&!ae(t))for(const i in t)n[i]==null&&bo(r,i,"");for(const i in n)i==="display"&&(a=!0),bo(r,i,n[i])}else if(l){if(t!==n){const i=r[U1];i&&(n+=";"+i),r.cssText=n,a=q1.test(n)}}else t&&e.removeAttribute("style");gr in e&&(e[gr]=a?r.display:"",r.display=o)}const ps=/\s*!important$/;function bo(e,t,n){if(Z(n))n.forEach(r=>bo(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=W1(e,t);ps.test(n)?e.setProperty(en(r),n.replace(ps,""),"important"):e[r]=n}}const vs=["Webkit","Moz","ms"],Ul={};function W1(e,t){const n=Ul[t];if(n)return n;let r=lt(t);if(r!=="filter"&&r in e)return Ul[t]=r;r=Er(r);for(let l=0;lql||(Z1.then(()=>ql=0),ql=Date.now());function tp(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;ut(np(r,n.value),t,5,[r])};return n.value=e,n.attached=ep(),n}function np(e,t){if(Z(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>l=>!l._stopped&&r&&r(l))}else return t}const ys=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,rp=(e,t,n,r,l,o,a,i,u)=>{const c=l==="svg";t==="class"?j1(e,r,c):t==="style"?G1(e,n,r):_r(t)?Mo(t)||Q1(e,t,n,r,a):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):lp(e,t,r,c))?Y1(e,t,r,o,a,i,u):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),K1(e,t,r,c))};function lp(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&ys(t)&&le(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const l=e.tagName;if(l==="IMG"||l==="VIDEO"||l==="CANVAS"||l==="SOURCE")return!1}return ys(t)&&ae(n)?!1:t in e}const mc=new WeakMap,gc=new WeakMap,dl=Symbol("_moveCb"),bs=Symbol("_enterCb"),yc={name:"TransitionGroup",props:Me({},V1,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=mn(),r=zi();let l,o;return Gi(()=>{if(!l.length)return;const a=e.moveClass||`${e.name||"v"}-move`;if(!up(l[0].el,n.vnode.el,a))return;l.forEach(sp),l.forEach(ip);const i=l.filter(cp);hc(),i.forEach(u=>{const c=u.el,f=c.style;Pt(c,a),f.transform=f.webkitTransform=f.transitionDuration="";const d=c[dl]=p=>{p&&p.target!==c||(!p||/transform$/.test(p.propertyName))&&(c.removeEventListener("transitionend",d),c[dl]=null,jt(c,a))};c.addEventListener("transitionend",d)})}),()=>{const a=fe(e),i=pc(a);let u=a.tag||qe;l=o,o=t.default?Qo(t.default()):[];for(let c=0;cdelete e.mode;yc.props;const ap=yc;function sp(e){const t=e.el;t[dl]&&t[dl](),t[bs]&&t[bs]()}function ip(e){gc.set(e,e.el.getBoundingClientRect())}function cp(e){const t=mc.get(e),n=gc.get(e),r=t.left-n.left,l=t.top-n.top;if(r||l){const o=e.el.style;return o.transform=o.webkitTransform=`translate(${r}px,${l}px)`,o.transitionDuration="0s",e}}function up(e,t,n){const r=e.cloneNode(),l=e[Vn];l&&l.forEach(i=>{i.split(/\s+/).forEach(u=>u&&r.classList.remove(u))}),n.split(/\s+/).forEach(i=>i&&r.classList.add(i)),r.style.display="none";const o=t.nodeType===1?t:t.parentNode;o.appendChild(r);const{hasTransform:a}=vc(r);return o.removeChild(r),a}const _s=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Z(t)?n=>tl(t,n):t};function fp(e){e.target.composing=!0}function Es(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Gl=Symbol("_assign"),u6={created(e,{modifiers:{lazy:t,trim:n,number:r}},l){e[Gl]=_s(l);const o=r||l.props&&l.props.type==="number";Cn(e,t?"change":"input",a=>{if(a.target.composing)return;let i=e.value;n&&(i=i.trim()),o&&(i=io(i)),e[Gl](i)}),n&&Cn(e,"change",()=>{e.value=e.value.trim()}),t||(Cn(e,"compositionstart",fp),Cn(e,"compositionend",Es),Cn(e,"change",Es))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:l}},o){if(e[Gl]=_s(o),e.composing)return;const a=l||e.type==="number"?io(e.value):e.value,i=t??"";a!==i&&(document.activeElement===e&&e.type!=="range"&&(n||r&&e.value.trim()===i)||(e.value=i))}},dp=["ctrl","shift","alt","meta"],pp={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>dp.some(n=>e[`${n}Key`]&&!t.includes(n))},f6=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(l,...o)=>{for(let a=0;a{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=l=>{if(!("key"in l))return;const o=en(l.key);if(t.some(a=>a===o||vp[a]===o))return e(l)})},hp=Me({patchProp:rp},H1);let Wl,ws=!1;function mp(){return Wl=ws?Wl:b1(hp),ws=!0,Wl}const gp=(...e)=>{const t=mp().createApp(...e),{mount:n}=t;return t.mount=r=>{const l=bp(r);if(l)return n(l,!0,yp(l))},t};function yp(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function bp(e){return ae(e)?document.querySelector(e):e}const _p="modulepreload",Ep=function(e){return"/"+e},As={},L=function(t,n,r){let l=Promise.resolve();if(n&&n.length>0){const o=document.getElementsByTagName("link");l=Promise.all(n.map(a=>{if(a=Ep(a),a in As)return;As[a]=!0;const i=a.endsWith(".css"),u=i?'[rel="stylesheet"]':"";if(!!r)for(let d=o.length-1;d>=0;d--){const p=o[d];if(p.href===a&&(!i||p.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${a}"]${u}`))return;const f=document.createElement("link");if(f.rel=i?"stylesheet":_p,i||(f.as="script",f.crossOrigin=""),f.href=a,document.head.appendChild(f),i)return new Promise((d,p)=>{f.addEventListener("load",d),f.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${a}`)))})}))}return l.then(()=>t()).catch(o=>{const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=o,window.dispatchEvent(a),!a.defaultPrevented)throw o})},wp={"v-8daa1a0e":()=>L(()=>import("./index.html-YnGjn801.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-74bc627b":()=>L(()=>import("./index.html-B1MISigO.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-fc52599a":()=>L(()=>import("./index.html-rkpo-dpD.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-8197c92e":()=>L(()=>import("./index.html-DminVLnj.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-229a901a":()=>L(()=>import("./index.html-BqDwfIfp.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-2ad883b1":()=>L(()=>import("./index.html-Cc8CZ2b2.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-4b1249e9":()=>L(()=>import("./index.html-vxQ13J85.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-4851ae62":()=>L(()=>import("./index.html-DZ7KH50q.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-ffc566d2":()=>L(()=>import("./index.html-CGdAT42t.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-85a2b380":()=>L(()=>import("./index.html-xU4RfV_r.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-d360ae00":()=>L(()=>import("./index.html-Cd9id5Lt.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-07433603":()=>L(()=>import("./index.html-DuHPlahO.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-f8ef3d60":()=>L(()=>import("./index.html-ZmrB-z7w.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-585caf94":()=>L(()=>import("./index.html-BdVmRdhD.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-3706649a":()=>L(()=>import("./404.html-CDhQvs-h.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-e1e3da16":()=>L(()=>import("./index.html-BIuYPCqX.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-5bc93818":()=>L(()=>import("./index.html-CxlHUG3E.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-744d024e":()=>L(()=>import("./index.html-DwWDdaB1.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-e52c881c":()=>L(()=>import("./index.html-We9rVu8G.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-154dc4c4":()=>L(()=>import("./index.html-D36oWUrv.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-01560935":()=>L(()=>import("./index.html-CEJuI0-D.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-58e487ec":()=>L(()=>import("./index.html-BpgbOtCm.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-46a84018":()=>L(()=>import("./index.html-C2nfolIp.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-5e41dbce":()=>L(()=>import("./index.html-D9aIsv7Z.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-53c1fbce":()=>L(()=>import("./index.html-CTBsTpxv.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-8df47658":()=>L(()=>import("./index.html-BTJ0JeSp.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-b30b8df8":()=>L(()=>import("./index.html-15U-eV0v.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-3d1829ef":()=>L(()=>import("./index.html-DT0LnDQI.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-f817a9be":()=>L(()=>import("./index.html-D2aA2aXX.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-e203ab1c":()=>L(()=>import("./index.html-lJCfprC6.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-081167c8":()=>L(()=>import("./index.html-DBc-Hz9i.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-2929030b":()=>L(()=>import("./index.html-LyOOgEwE.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-50c6924c":()=>L(()=>import("./index.html-B4JQqY7G.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-94867796":()=>L(()=>import("./index.html-DOCPMHCf.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-3f86ae44":()=>L(()=>import("./index.html-D6r4kAGu.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-cd1830fc":()=>L(()=>import("./index.html-BoI-SeON.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-6f4cd36e":()=>L(()=>import("./index.html-B5xailVh.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-0e939c41":()=>L(()=>import("./index.html-DQej_ZxT.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-37e97688":()=>L(()=>import("./index.html-C-nvcTCa.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-2923f955":()=>L(()=>import("./index.html-CPZyDxVy.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-60c4d130":()=>L(()=>import("./index.html-BBq26iiN.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-0e124c9d":()=>L(()=>import("./index.html-khfQ_4UI.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-37244d97":()=>L(()=>import("./index.html-BPcXkc8Y.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-229104ce":()=>L(()=>import("./index.html-C7qAW4nw.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-3f2deb44":()=>L(()=>import("./index.html-CZn7jrfX.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-562927a8":()=>L(()=>import("./index.html-CbSAxiU7.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-6544f7d0":()=>L(()=>import("./index.html-DD1Ed2oa.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-5734f872":()=>L(()=>import("./index.html-BUA7NQRQ.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-6eae3e46":()=>L(()=>import("./index.html-CC0DRb0J.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-8e628b4c":()=>L(()=>import("./index.html-DwtwVQLJ.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-2842903a":()=>L(()=>import("./index.html-BasCLiPi.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-59d0051e":()=>L(()=>import("./index.html-CxUy8vKd.js"),__vite__mapDeps([])).then(({data:e})=>e)},Ap=JSON.parse(`{"base":"/","lang":"zh-CN","title":"HalfSweet's Blog","description":"半糖的博客","head":[],"locales":{}}`);var Cp=([e,t,n])=>e==="meta"&&t.name?`${e}.${t.name}`:["title","base"].includes(e)?e:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,t,n]),Sp=e=>{const t=new Set,n=[];return e.forEach(r=>{const l=Cp(r);t.has(l)||(t.add(l),n.push(r))}),n},Tp=e=>e[0]==="/"?e:`/${e}`,bc=e=>e[e.length-1]==="/"||e.endsWith(".html")?e:`${e}/`,gn=e=>/^(https?:)?\/\//.test(e),kp=/.md((\?|#).*)?$/,pl=(e,t="/")=>!!(gn(e)||e.startsWith("/")&&!e.startsWith(t)&&!kp.test(e)),_c=e=>/^[a-z][a-z0-9+.-]*:/.test(e),kl=e=>Object.prototype.toString.call(e)==="[object Object]",na=e=>e[e.length-1]==="/"?e.slice(0,-1):e,Ec=e=>e[0]==="/"?e.slice(1):e,xp=(e,t)=>{const n=Object.keys(e).sort((r,l)=>{const o=l.split("/").length-r.split("/").length;return o!==0?o:l.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"};const wc={"v-8daa1a0e":X(()=>L(()=>import("./index.html-izc8SwoG.js"),__vite__mapDeps([0,1]))),"v-74bc627b":X(()=>L(()=>import("./index.html-CKJ264Dw.js"),__vite__mapDeps([2,1]))),"v-fc52599a":X(()=>L(()=>import("./index.html-JEmOVTCg.js"),__vite__mapDeps([3,1]))),"v-8197c92e":X(()=>L(()=>import("./index.html-CUoJCeLu.js"),__vite__mapDeps([4,1]))),"v-229a901a":X(()=>L(()=>import("./index.html-BL2SQyLf.js"),__vite__mapDeps([5,1]))),"v-2ad883b1":X(()=>L(()=>import("./index.html-Hnwh8jig.js"),__vite__mapDeps([6,1]))),"v-4b1249e9":X(()=>L(()=>import("./index.html-BIgkksOW.js"),__vite__mapDeps([7,1]))),"v-4851ae62":X(()=>L(()=>import("./index.html-D5B1IhJf.js"),__vite__mapDeps([8,1]))),"v-ffc566d2":X(()=>L(()=>import("./index.html-DPQfOISO.js"),__vite__mapDeps([9,1]))),"v-85a2b380":X(()=>L(()=>import("./index.html-DDJKmshG.js"),__vite__mapDeps([10,1]))),"v-d360ae00":X(()=>L(()=>import("./index.html-lMiy0Zjd.js"),__vite__mapDeps([11,1]))),"v-07433603":X(()=>L(()=>import("./index.html-BTxZ0LNa.js"),__vite__mapDeps([12,1]))),"v-f8ef3d60":X(()=>L(()=>import("./index.html-ULxoTZDw.js"),__vite__mapDeps([13,1]))),"v-585caf94":X(()=>L(()=>import("./index.html-DjnCJ-2t.js"),__vite__mapDeps([14,1]))),"v-3706649a":X(()=>L(()=>import("./404.html-4drF9Evk.js"),__vite__mapDeps([15,1]))),"v-e1e3da16":X(()=>L(()=>import("./index.html-LDlhaGJn.js"),__vite__mapDeps([16,1]))),"v-5bc93818":X(()=>L(()=>import("./index.html-Bhi0Eybb.js"),__vite__mapDeps([17,1]))),"v-744d024e":X(()=>L(()=>import("./index.html-WNdfu53v.js"),__vite__mapDeps([18,1]))),"v-e52c881c":X(()=>L(()=>import("./index.html-Z2g0J8gX.js"),__vite__mapDeps([19,1]))),"v-154dc4c4":X(()=>L(()=>import("./index.html-ClupMHz0.js"),__vite__mapDeps([20,1]))),"v-01560935":X(()=>L(()=>import("./index.html-Duq__jSq.js"),__vite__mapDeps([21,1]))),"v-58e487ec":X(()=>L(()=>import("./index.html-DzH0Q7ag.js"),__vite__mapDeps([22,1]))),"v-46a84018":X(()=>L(()=>import("./index.html-ByI9bp9e.js"),__vite__mapDeps([23,1]))),"v-5e41dbce":X(()=>L(()=>import("./index.html-C8jiYMp9.js"),__vite__mapDeps([24,1]))),"v-53c1fbce":X(()=>L(()=>import("./index.html-B4cHw0eK.js"),__vite__mapDeps([25,1]))),"v-8df47658":X(()=>L(()=>import("./index.html-C2vCwla0.js"),__vite__mapDeps([26,1]))),"v-b30b8df8":X(()=>L(()=>import("./index.html-DsxsIaoo.js"),__vite__mapDeps([27,1]))),"v-3d1829ef":X(()=>L(()=>import("./index.html-CRuCjIm6.js"),__vite__mapDeps([28,1]))),"v-f817a9be":X(()=>L(()=>import("./index.html-BpD-P2T0.js"),__vite__mapDeps([29,1]))),"v-e203ab1c":X(()=>L(()=>import("./index.html-DW7_SZS0.js"),__vite__mapDeps([30,1]))),"v-081167c8":X(()=>L(()=>import("./index.html-D5grrDYO.js"),__vite__mapDeps([31,1]))),"v-2929030b":X(()=>L(()=>import("./index.html-DWmPWUTD.js"),__vite__mapDeps([32,1]))),"v-50c6924c":X(()=>L(()=>import("./index.html-B-Edw71p.js"),__vite__mapDeps([33,1]))),"v-94867796":X(()=>L(()=>import("./index.html-DhUmNd-W.js"),__vite__mapDeps([34,1]))),"v-3f86ae44":X(()=>L(()=>import("./index.html-EKv1X2Ln.js"),__vite__mapDeps([35,1]))),"v-cd1830fc":X(()=>L(()=>import("./index.html-ACKTrq7U.js"),__vite__mapDeps([36,1]))),"v-6f4cd36e":X(()=>L(()=>import("./index.html-Bo40qQBe.js"),__vite__mapDeps([37,1]))),"v-0e939c41":X(()=>L(()=>import("./index.html-DTiy5heK.js"),__vite__mapDeps([38,1]))),"v-37e97688":X(()=>L(()=>import("./index.html-Br0Mae8G.js"),__vite__mapDeps([39,1]))),"v-2923f955":X(()=>L(()=>import("./index.html-cLRKpNoH.js"),__vite__mapDeps([40,1]))),"v-60c4d130":X(()=>L(()=>import("./index.html-CXfh7_y1.js"),__vite__mapDeps([41,1]))),"v-0e124c9d":X(()=>L(()=>import("./index.html-CEzhFPYB.js"),__vite__mapDeps([42,1]))),"v-37244d97":X(()=>L(()=>import("./index.html-C4Lu8mH0.js"),__vite__mapDeps([43,1]))),"v-229104ce":X(()=>L(()=>import("./index.html-DRyBvRas.js"),__vite__mapDeps([44,1]))),"v-3f2deb44":X(()=>L(()=>import("./index.html-CfeG_oP9.js"),__vite__mapDeps([45,1]))),"v-562927a8":X(()=>L(()=>import("./index.html-DP8xckuS.js"),__vite__mapDeps([46,1]))),"v-6544f7d0":X(()=>L(()=>import("./index.html-IK237U9M.js"),__vite__mapDeps([47,1]))),"v-5734f872":X(()=>L(()=>import("./index.html-lNOakYRB.js"),__vite__mapDeps([48,1]))),"v-6eae3e46":X(()=>L(()=>import("./index.html-DRUYRxaH.js"),__vite__mapDeps([49,1]))),"v-8e628b4c":X(()=>L(()=>import("./index.html-CxIVsmOO.js"),__vite__mapDeps([50,1]))),"v-2842903a":X(()=>L(()=>import("./index.html-DULHtOFk.js"),__vite__mapDeps([51,1]))),"v-59d0051e":X(()=>L(()=>import("./index.html-CJfjjnCk.js"),__vite__mapDeps([52,1])))};var Lp=Symbol(""),Ac=Symbol(""),Ip=vn({key:"",path:"",title:"",lang:"",frontmatter:{},headers:[]}),ie=()=>{const e=se(Ac);if(!e)throw new Error("pageData() is called without provider.");return e},Cc=Symbol(""),be=()=>{const e=se(Cc);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},Sc=Symbol(""),Pp=()=>{const e=se(Sc);if(!e)throw new Error("usePageHead() is called without provider.");return e},$p=Symbol(""),Tc=Symbol(""),ra=()=>{const e=se(Tc);if(!e)throw new Error("usePageLang() is called without provider.");return e},kc=Symbol(""),Op=()=>{const e=se(kc);if(!e)throw new Error("usePageLayout() is called without provider.");return e},Rp=q(wp),la=Symbol(""),kt=()=>{const e=se(la);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},Tn=q(Ap),xc=()=>Tn,Lc=Symbol(""),kr=()=>{const e=se(Lc);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},Bp=Symbol(""),Mp="Layout",Dp="NotFound",$t=wr({resolveLayouts:e=>e.reduce((t,n)=>({...t,...n.layouts}),{}),resolvePageData:async e=>{const t=Rp.value[e];return await(t==null?void 0:t())??Ip},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,n)=>{const r=ae(t.description)?t.description:n.description,l=[...Z(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:r}]];return Sp(l)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter(n=>!!n).join(" | "),resolvePageLang:(e,t)=>e.lang||t.lang||"en-US",resolvePageLayout:(e,t)=>{let n;if(e.path){const r=e.frontmatter.layout;ae(r)?n=r:n=Mp}else n=Dp;return t[n]},resolveRouteLocale:(e,t)=>xp(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),xl=$({name:"ClientOnly",setup(e,t){const n=q(!1);return me(()=>{n.value=!0}),()=>{var r,l;return n.value?(l=(r=t.slots).default)==null?void 0:l.call(r):null}}}),oa=$({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=ie(),n=_(()=>wc[e.pageKey||t.value.key]);return()=>n.value?s(n.value):s("div","404 Not Found")}}),bt=(e={})=>e,Le=e=>gn(e)?e:`/${Ec(e)}`;const Fp={};/*! +**/const D1="http://www.w3.org/2000/svg",F1="http://www.w3.org/1998/Math/MathML",Wt=typeof document<"u"?document:null,ss=Wt&&Wt.createElement("template"),H1={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const l=t==="svg"?Wt.createElementNS(D1,e):t==="mathml"?Wt.createElementNS(F1,e):Wt.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&l.setAttribute("multiple",r.multiple),l},createText:e=>Wt.createTextNode(e),createComment:e=>Wt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Wt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,l,o){const a=n?n.previousSibling:t.lastChild;if(l&&(l===o||l.nextSibling))for(;t.insertBefore(l.cloneNode(!0),n),!(l===o||!(l=l.nextSibling)););else{ss.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const i=ss.content;if(r==="svg"||r==="mathml"){const u=i.firstChild;for(;u.firstChild;)i.appendChild(u.firstChild);i.removeChild(u)}t.insertBefore(i,n)}return[a?a.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Nt="transition",Qn="animation",Vn=Symbol("_vtc"),Xt=(e,{slots:t})=>s(Wd,pc(e),t);Xt.displayName="Transition";const dc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},V1=Xt.props=Me({},ji,dc),rn=(e,t=[])=>{Z(e)?e.forEach(n=>n(...t)):e&&e(...t)},is=e=>e?Z(e)?e.some(t=>t.length>1):e.length>1:!1;function pc(e){const t={};for(const V in e)V in dc||(t[V]=e[V]);if(e.css===!1)return t;const{name:n="v",type:r,duration:l,enterFromClass:o=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:i=`${n}-enter-to`,appearFromClass:u=o,appearActiveClass:c=a,appearToClass:f=i,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:v=`${n}-leave-to`}=e,g=N1(l),E=g&&g[0],w=g&&g[1],{onBeforeEnter:y,onEnter:T,onEnterCancelled:b,onLeave:S,onLeaveCancelled:M,onBeforeAppear:C=y,onAppear:W=T,onAppearCancelled:F=b}=t,O=(V,te,Ie)=>{jt(V,te?f:i),jt(V,te?c:a),Ie&&Ie()},H=(V,te)=>{V._isLeaving=!1,jt(V,d),jt(V,v),jt(V,p),te&&te()},J=V=>(te,Ie)=>{const ke=V?W:T,G=()=>O(te,V,Ie);rn(ke,[te,G]),cs(()=>{jt(te,V?u:o),Pt(te,V?f:i),is(ke)||us(te,r,E,G)})};return Me(t,{onBeforeEnter(V){rn(y,[V]),Pt(V,o),Pt(V,a)},onBeforeAppear(V){rn(C,[V]),Pt(V,u),Pt(V,c)},onEnter:J(!1),onAppear:J(!0),onLeave(V,te){V._isLeaving=!0;const Ie=()=>H(V,te);Pt(V,d),hc(),Pt(V,p),cs(()=>{V._isLeaving&&(jt(V,d),Pt(V,v),is(S)||us(V,r,w,Ie))}),rn(S,[V,Ie])},onEnterCancelled(V){O(V,!1),rn(b,[V])},onAppearCancelled(V){O(V,!0),rn(F,[V])},onLeaveCancelled(V){H(V),rn(M,[V])}})}function N1(e){if(e==null)return null;if(Se(e))return[jl(e.enter),jl(e.leave)];{const t=jl(e);return[t,t]}}function jl(e){return qf(e)}function Pt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Vn]||(e[Vn]=new Set)).add(t)}function jt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Vn];n&&(n.delete(t),n.size||(e[Vn]=void 0))}function cs(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let z1=0;function us(e,t,n,r){const l=e._endId=++z1,o=()=>{l===e._endId&&r()};if(n)return setTimeout(o,n);const{type:a,timeout:i,propCount:u}=vc(e,t);if(!a)return r();const c=a+"end";let f=0;const d=()=>{e.removeEventListener(c,p),o()},p=v=>{v.target===e&&++f>=u&&d()};setTimeout(()=>{f(n[g]||"").split(", "),l=r(`${Nt}Delay`),o=r(`${Nt}Duration`),a=fs(l,o),i=r(`${Qn}Delay`),u=r(`${Qn}Duration`),c=fs(i,u);let f=null,d=0,p=0;t===Nt?a>0&&(f=Nt,d=a,p=o.length):t===Qn?c>0&&(f=Qn,d=c,p=u.length):(d=Math.max(a,c),f=d>0?a>c?Nt:Qn:null,p=f?f===Nt?o.length:u.length:0);const v=f===Nt&&/\b(transform|all)(,|$)/.test(r(`${Nt}Property`).toString());return{type:f,timeout:d,propCount:p,hasTransform:v}}function fs(e,t){for(;e.lengthds(n)+ds(e[r])))}function ds(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function hc(){return document.body.offsetHeight}function j1(e,t,n){const r=e[Vn];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const gr=Symbol("_vod"),c6={beforeMount(e,{value:t},{transition:n}){e[gr]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Xn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t==!n&&(e.style.display===e[gr]||!t)||(r?t?(r.beforeEnter(e),Xn(e,!0),r.enter(e)):r.leave(e,()=>{Xn(e,!1)}):Xn(e,t))},beforeUnmount(e,{value:t}){Xn(e,t)}};function Xn(e,t){e.style.display=t?e[gr]:"none"}const U1=Symbol(""),q1=/(^|;)\s*display\s*:/;function G1(e,t,n){const r=e.style,l=ae(n),o=r.display;let a=!1;if(n&&!l){if(t&&!ae(t))for(const i in t)n[i]==null&&bo(r,i,"");for(const i in n)i==="display"&&(a=!0),bo(r,i,n[i])}else if(l){if(t!==n){const i=r[U1];i&&(n+=";"+i),r.cssText=n,a=q1.test(n)}}else t&&e.removeAttribute("style");gr in e&&(e[gr]=a?r.display:"",r.display=o)}const ps=/\s*!important$/;function bo(e,t,n){if(Z(n))n.forEach(r=>bo(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=W1(e,t);ps.test(n)?e.setProperty(en(r),n.replace(ps,""),"important"):e[r]=n}}const vs=["Webkit","Moz","ms"],Ul={};function W1(e,t){const n=Ul[t];if(n)return n;let r=lt(t);if(r!=="filter"&&r in e)return Ul[t]=r;r=Er(r);for(let l=0;lql||(Z1.then(()=>ql=0),ql=Date.now());function tp(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;ut(np(r,n.value),t,5,[r])};return n.value=e,n.attached=ep(),n}function np(e,t){if(Z(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>l=>!l._stopped&&r&&r(l))}else return t}const ys=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,rp=(e,t,n,r,l,o,a,i,u)=>{const c=l==="svg";t==="class"?j1(e,r,c):t==="style"?G1(e,n,r):_r(t)?Mo(t)||Q1(e,t,n,r,a):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):lp(e,t,r,c))?Y1(e,t,r,o,a,i,u):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),K1(e,t,r,c))};function lp(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&ys(t)&&le(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const l=e.tagName;if(l==="IMG"||l==="VIDEO"||l==="CANVAS"||l==="SOURCE")return!1}return ys(t)&&ae(n)?!1:t in e}const mc=new WeakMap,gc=new WeakMap,dl=Symbol("_moveCb"),bs=Symbol("_enterCb"),yc={name:"TransitionGroup",props:Me({},V1,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=mn(),r=zi();let l,o;return Gi(()=>{if(!l.length)return;const a=e.moveClass||`${e.name||"v"}-move`;if(!up(l[0].el,n.vnode.el,a))return;l.forEach(sp),l.forEach(ip);const i=l.filter(cp);hc(),i.forEach(u=>{const c=u.el,f=c.style;Pt(c,a),f.transform=f.webkitTransform=f.transitionDuration="";const d=c[dl]=p=>{p&&p.target!==c||(!p||/transform$/.test(p.propertyName))&&(c.removeEventListener("transitionend",d),c[dl]=null,jt(c,a))};c.addEventListener("transitionend",d)})}),()=>{const a=fe(e),i=pc(a);let u=a.tag||qe;l=o,o=t.default?Qo(t.default()):[];for(let c=0;cdelete e.mode;yc.props;const ap=yc;function sp(e){const t=e.el;t[dl]&&t[dl](),t[bs]&&t[bs]()}function ip(e){gc.set(e,e.el.getBoundingClientRect())}function cp(e){const t=mc.get(e),n=gc.get(e),r=t.left-n.left,l=t.top-n.top;if(r||l){const o=e.el.style;return o.transform=o.webkitTransform=`translate(${r}px,${l}px)`,o.transitionDuration="0s",e}}function up(e,t,n){const r=e.cloneNode(),l=e[Vn];l&&l.forEach(i=>{i.split(/\s+/).forEach(u=>u&&r.classList.remove(u))}),n.split(/\s+/).forEach(i=>i&&r.classList.add(i)),r.style.display="none";const o=t.nodeType===1?t:t.parentNode;o.appendChild(r);const{hasTransform:a}=vc(r);return o.removeChild(r),a}const _s=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Z(t)?n=>tl(t,n):t};function fp(e){e.target.composing=!0}function Es(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Gl=Symbol("_assign"),u6={created(e,{modifiers:{lazy:t,trim:n,number:r}},l){e[Gl]=_s(l);const o=r||l.props&&l.props.type==="number";Cn(e,t?"change":"input",a=>{if(a.target.composing)return;let i=e.value;n&&(i=i.trim()),o&&(i=io(i)),e[Gl](i)}),n&&Cn(e,"change",()=>{e.value=e.value.trim()}),t||(Cn(e,"compositionstart",fp),Cn(e,"compositionend",Es),Cn(e,"change",Es))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:l}},o){if(e[Gl]=_s(o),e.composing)return;const a=l||e.type==="number"?io(e.value):e.value,i=t??"";a!==i&&(document.activeElement===e&&e.type!=="range"&&(n||r&&e.value.trim()===i)||(e.value=i))}},dp=["ctrl","shift","alt","meta"],pp={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>dp.some(n=>e[`${n}Key`]&&!t.includes(n))},f6=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(l,...o)=>{for(let a=0;a{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=l=>{if(!("key"in l))return;const o=en(l.key);if(t.some(a=>a===o||vp[a]===o))return e(l)})},hp=Me({patchProp:rp},H1);let Wl,ws=!1;function mp(){return Wl=ws?Wl:b1(hp),ws=!0,Wl}const gp=(...e)=>{const t=mp().createApp(...e),{mount:n}=t;return t.mount=r=>{const l=bp(r);if(l)return n(l,!0,yp(l))},t};function yp(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function bp(e){return ae(e)?document.querySelector(e):e}const _p="modulepreload",Ep=function(e){return"/"+e},As={},L=function(t,n,r){let l=Promise.resolve();if(n&&n.length>0){const o=document.getElementsByTagName("link");l=Promise.all(n.map(a=>{if(a=Ep(a),a in As)return;As[a]=!0;const i=a.endsWith(".css"),u=i?'[rel="stylesheet"]':"";if(!!r)for(let d=o.length-1;d>=0;d--){const p=o[d];if(p.href===a&&(!i||p.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${a}"]${u}`))return;const f=document.createElement("link");if(f.rel=i?"stylesheet":_p,i||(f.as="script",f.crossOrigin=""),f.href=a,document.head.appendChild(f),i)return new Promise((d,p)=>{f.addEventListener("load",d),f.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${a}`)))})}))}return l.then(()=>t()).catch(o=>{const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=o,window.dispatchEvent(a),!a.defaultPrevented)throw o})},wp={"v-8daa1a0e":()=>L(()=>import("./index.html-YnGjn801.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-74bc627b":()=>L(()=>import("./index.html-Db9htIlG.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-fc52599a":()=>L(()=>import("./index.html-rkpo-dpD.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-8197c92e":()=>L(()=>import("./index.html-DminVLnj.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-229a901a":()=>L(()=>import("./index.html-BqDwfIfp.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-2ad883b1":()=>L(()=>import("./index.html-Cc8CZ2b2.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-4b1249e9":()=>L(()=>import("./index.html-vxQ13J85.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-4851ae62":()=>L(()=>import("./index.html-DZ7KH50q.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-ffc566d2":()=>L(()=>import("./index.html-CGdAT42t.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-85a2b380":()=>L(()=>import("./index.html-xU4RfV_r.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-d360ae00":()=>L(()=>import("./index.html-Cd9id5Lt.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-07433603":()=>L(()=>import("./index.html-DuHPlahO.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-f8ef3d60":()=>L(()=>import("./index.html-ZmrB-z7w.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-585caf94":()=>L(()=>import("./index.html-BdVmRdhD.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-3706649a":()=>L(()=>import("./404.html-CDhQvs-h.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-e1e3da16":()=>L(()=>import("./index.html-BIuYPCqX.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-5bc93818":()=>L(()=>import("./index.html-CxlHUG3E.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-744d024e":()=>L(()=>import("./index.html-DwWDdaB1.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-e52c881c":()=>L(()=>import("./index.html-We9rVu8G.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-154dc4c4":()=>L(()=>import("./index.html-D36oWUrv.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-01560935":()=>L(()=>import("./index.html-CEJuI0-D.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-58e487ec":()=>L(()=>import("./index.html-BpgbOtCm.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-46a84018":()=>L(()=>import("./index.html-C2nfolIp.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-5e41dbce":()=>L(()=>import("./index.html-D9aIsv7Z.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-53c1fbce":()=>L(()=>import("./index.html-CTBsTpxv.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-8df47658":()=>L(()=>import("./index.html-BTJ0JeSp.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-b30b8df8":()=>L(()=>import("./index.html-15U-eV0v.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-3d1829ef":()=>L(()=>import("./index.html-DT0LnDQI.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-f817a9be":()=>L(()=>import("./index.html-D2aA2aXX.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-e203ab1c":()=>L(()=>import("./index.html-lJCfprC6.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-081167c8":()=>L(()=>import("./index.html-DBc-Hz9i.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-2929030b":()=>L(()=>import("./index.html-LyOOgEwE.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-50c6924c":()=>L(()=>import("./index.html-B4JQqY7G.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-94867796":()=>L(()=>import("./index.html-DOCPMHCf.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-3f86ae44":()=>L(()=>import("./index.html-D6r4kAGu.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-cd1830fc":()=>L(()=>import("./index.html-BoI-SeON.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-6f4cd36e":()=>L(()=>import("./index.html-B5xailVh.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-0e939c41":()=>L(()=>import("./index.html-DQej_ZxT.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-37e97688":()=>L(()=>import("./index.html-C-nvcTCa.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-2923f955":()=>L(()=>import("./index.html-CPZyDxVy.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-60c4d130":()=>L(()=>import("./index.html-BBq26iiN.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-0e124c9d":()=>L(()=>import("./index.html-khfQ_4UI.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-37244d97":()=>L(()=>import("./index.html-BPcXkc8Y.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-229104ce":()=>L(()=>import("./index.html-C7qAW4nw.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-3f2deb44":()=>L(()=>import("./index.html-CZn7jrfX.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-562927a8":()=>L(()=>import("./index.html-CbSAxiU7.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-6544f7d0":()=>L(()=>import("./index.html-DD1Ed2oa.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-5734f872":()=>L(()=>import("./index.html-BUA7NQRQ.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-6eae3e46":()=>L(()=>import("./index.html-CC0DRb0J.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-8e628b4c":()=>L(()=>import("./index.html-DwtwVQLJ.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-2842903a":()=>L(()=>import("./index.html-BasCLiPi.js"),__vite__mapDeps([])).then(({data:e})=>e),"v-59d0051e":()=>L(()=>import("./index.html-CxUy8vKd.js"),__vite__mapDeps([])).then(({data:e})=>e)},Ap=JSON.parse(`{"base":"/","lang":"zh-CN","title":"HalfSweet's Blog","description":"半糖的博客","head":[],"locales":{}}`);var Cp=([e,t,n])=>e==="meta"&&t.name?`${e}.${t.name}`:["title","base"].includes(e)?e:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,t,n]),Sp=e=>{const t=new Set,n=[];return e.forEach(r=>{const l=Cp(r);t.has(l)||(t.add(l),n.push(r))}),n},Tp=e=>e[0]==="/"?e:`/${e}`,bc=e=>e[e.length-1]==="/"||e.endsWith(".html")?e:`${e}/`,gn=e=>/^(https?:)?\/\//.test(e),kp=/.md((\?|#).*)?$/,pl=(e,t="/")=>!!(gn(e)||e.startsWith("/")&&!e.startsWith(t)&&!kp.test(e)),_c=e=>/^[a-z][a-z0-9+.-]*:/.test(e),kl=e=>Object.prototype.toString.call(e)==="[object Object]",na=e=>e[e.length-1]==="/"?e.slice(0,-1):e,Ec=e=>e[0]==="/"?e.slice(1):e,xp=(e,t)=>{const n=Object.keys(e).sort((r,l)=>{const o=l.split("/").length-r.split("/").length;return o!==0?o:l.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"};const wc={"v-8daa1a0e":X(()=>L(()=>import("./index.html-j9lO7ahQ.js"),__vite__mapDeps([0,1]))),"v-74bc627b":X(()=>L(()=>import("./index.html-CmO2-53R.js"),__vite__mapDeps([2,1]))),"v-fc52599a":X(()=>L(()=>import("./index.html-365dUKCI.js"),__vite__mapDeps([3,1]))),"v-8197c92e":X(()=>L(()=>import("./index.html-neww_7IA.js"),__vite__mapDeps([4,1]))),"v-229a901a":X(()=>L(()=>import("./index.html-DgC4z35O.js"),__vite__mapDeps([5,1]))),"v-2ad883b1":X(()=>L(()=>import("./index.html-BMfCwbMR.js"),__vite__mapDeps([6,1]))),"v-4b1249e9":X(()=>L(()=>import("./index.html-3SwqUsny.js"),__vite__mapDeps([7,1]))),"v-4851ae62":X(()=>L(()=>import("./index.html-BPJZZFSA.js"),__vite__mapDeps([8,1]))),"v-ffc566d2":X(()=>L(()=>import("./index.html-Ca2CLs25.js"),__vite__mapDeps([9,1]))),"v-85a2b380":X(()=>L(()=>import("./index.html-BZ0xt4Va.js"),__vite__mapDeps([10,1]))),"v-d360ae00":X(()=>L(()=>import("./index.html-knekWKTU.js"),__vite__mapDeps([11,1]))),"v-07433603":X(()=>L(()=>import("./index.html-CE_jJq4R.js"),__vite__mapDeps([12,1]))),"v-f8ef3d60":X(()=>L(()=>import("./index.html-DUwCsd_Z.js"),__vite__mapDeps([13,1]))),"v-585caf94":X(()=>L(()=>import("./index.html-CFzZKXLQ.js"),__vite__mapDeps([14,1]))),"v-3706649a":X(()=>L(()=>import("./404.html-DqB0uKRU.js"),__vite__mapDeps([15,1]))),"v-e1e3da16":X(()=>L(()=>import("./index.html-ccEaKqwA.js"),__vite__mapDeps([16,1]))),"v-5bc93818":X(()=>L(()=>import("./index.html-cwTB87Bb.js"),__vite__mapDeps([17,1]))),"v-744d024e":X(()=>L(()=>import("./index.html-OkFvvXao.js"),__vite__mapDeps([18,1]))),"v-e52c881c":X(()=>L(()=>import("./index.html-CvjFBXB1.js"),__vite__mapDeps([19,1]))),"v-154dc4c4":X(()=>L(()=>import("./index.html-CSHqKRb_.js"),__vite__mapDeps([20,1]))),"v-01560935":X(()=>L(()=>import("./index.html-DkF1l2TE.js"),__vite__mapDeps([21,1]))),"v-58e487ec":X(()=>L(()=>import("./index.html-hrOM8Uyk.js"),__vite__mapDeps([22,1]))),"v-46a84018":X(()=>L(()=>import("./index.html-DqyW-lPU.js"),__vite__mapDeps([23,1]))),"v-5e41dbce":X(()=>L(()=>import("./index.html-DA-yXm38.js"),__vite__mapDeps([24,1]))),"v-53c1fbce":X(()=>L(()=>import("./index.html-DVBTp-Dg.js"),__vite__mapDeps([25,1]))),"v-8df47658":X(()=>L(()=>import("./index.html-BpmWWYAE.js"),__vite__mapDeps([26,1]))),"v-b30b8df8":X(()=>L(()=>import("./index.html-BXqVfKKJ.js"),__vite__mapDeps([27,1]))),"v-3d1829ef":X(()=>L(()=>import("./index.html-D8d7LSCr.js"),__vite__mapDeps([28,1]))),"v-f817a9be":X(()=>L(()=>import("./index.html-CNsgnhx1.js"),__vite__mapDeps([29,1]))),"v-e203ab1c":X(()=>L(()=>import("./index.html-D-NMGG6a.js"),__vite__mapDeps([30,1]))),"v-081167c8":X(()=>L(()=>import("./index.html-DL2NUgBQ.js"),__vite__mapDeps([31,1]))),"v-2929030b":X(()=>L(()=>import("./index.html-CLR8RZpv.js"),__vite__mapDeps([32,1]))),"v-50c6924c":X(()=>L(()=>import("./index.html-D3ySOvnr.js"),__vite__mapDeps([33,1]))),"v-94867796":X(()=>L(()=>import("./index.html-C2n54uF-.js"),__vite__mapDeps([34,1]))),"v-3f86ae44":X(()=>L(()=>import("./index.html-QrKDo04c.js"),__vite__mapDeps([35,1]))),"v-cd1830fc":X(()=>L(()=>import("./index.html-BPWGypHL.js"),__vite__mapDeps([36,1]))),"v-6f4cd36e":X(()=>L(()=>import("./index.html-CwJV7lWb.js"),__vite__mapDeps([37,1]))),"v-0e939c41":X(()=>L(()=>import("./index.html-CvBa7NM4.js"),__vite__mapDeps([38,1]))),"v-37e97688":X(()=>L(()=>import("./index.html-P08J81ss.js"),__vite__mapDeps([39,1]))),"v-2923f955":X(()=>L(()=>import("./index.html-DfHktAw7.js"),__vite__mapDeps([40,1]))),"v-60c4d130":X(()=>L(()=>import("./index.html-n8ixZQAO.js"),__vite__mapDeps([41,1]))),"v-0e124c9d":X(()=>L(()=>import("./index.html-DA3_mYjB.js"),__vite__mapDeps([42,1]))),"v-37244d97":X(()=>L(()=>import("./index.html-DUbb3VhI.js"),__vite__mapDeps([43,1]))),"v-229104ce":X(()=>L(()=>import("./index.html-DJIvQo8P.js"),__vite__mapDeps([44,1]))),"v-3f2deb44":X(()=>L(()=>import("./index.html-BJxeWnaQ.js"),__vite__mapDeps([45,1]))),"v-562927a8":X(()=>L(()=>import("./index.html-aJq4TWQz.js"),__vite__mapDeps([46,1]))),"v-6544f7d0":X(()=>L(()=>import("./index.html-BTPB963G.js"),__vite__mapDeps([47,1]))),"v-5734f872":X(()=>L(()=>import("./index.html-HmsrUyra.js"),__vite__mapDeps([48,1]))),"v-6eae3e46":X(()=>L(()=>import("./index.html-BwM69ms8.js"),__vite__mapDeps([49,1]))),"v-8e628b4c":X(()=>L(()=>import("./index.html-DvbFduSK.js"),__vite__mapDeps([50,1]))),"v-2842903a":X(()=>L(()=>import("./index.html-yRv7RuYj.js"),__vite__mapDeps([51,1]))),"v-59d0051e":X(()=>L(()=>import("./index.html-Cs6r-sWz.js"),__vite__mapDeps([52,1])))};var Lp=Symbol(""),Ac=Symbol(""),Ip=vn({key:"",path:"",title:"",lang:"",frontmatter:{},headers:[]}),ie=()=>{const e=se(Ac);if(!e)throw new Error("pageData() is called without provider.");return e},Cc=Symbol(""),be=()=>{const e=se(Cc);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},Sc=Symbol(""),Pp=()=>{const e=se(Sc);if(!e)throw new Error("usePageHead() is called without provider.");return e},$p=Symbol(""),Tc=Symbol(""),ra=()=>{const e=se(Tc);if(!e)throw new Error("usePageLang() is called without provider.");return e},kc=Symbol(""),Op=()=>{const e=se(kc);if(!e)throw new Error("usePageLayout() is called without provider.");return e},Rp=q(wp),la=Symbol(""),kt=()=>{const e=se(la);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},Tn=q(Ap),xc=()=>Tn,Lc=Symbol(""),kr=()=>{const e=se(Lc);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},Bp=Symbol(""),Mp="Layout",Dp="NotFound",$t=wr({resolveLayouts:e=>e.reduce((t,n)=>({...t,...n.layouts}),{}),resolvePageData:async e=>{const t=Rp.value[e];return await(t==null?void 0:t())??Ip},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,n)=>{const r=ae(t.description)?t.description:n.description,l=[...Z(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:r}]];return Sp(l)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter(n=>!!n).join(" | "),resolvePageLang:(e,t)=>e.lang||t.lang||"en-US",resolvePageLayout:(e,t)=>{let n;if(e.path){const r=e.frontmatter.layout;ae(r)?n=r:n=Mp}else n=Dp;return t[n]},resolveRouteLocale:(e,t)=>xp(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),xl=$({name:"ClientOnly",setup(e,t){const n=q(!1);return me(()=>{n.value=!0}),()=>{var r,l;return n.value?(l=(r=t.slots).default)==null?void 0:l.call(r):null}}}),oa=$({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=ie(),n=_(()=>wc[e.pageKey||t.value.key]);return()=>n.value?s(n.value):s("div","404 Not Found")}}),bt=(e={})=>e,Le=e=>gn(e)?e:`/${Ec(e)}`;const Fp={};/*! * vue-router v4.2.5 * (c) 2023 Eduardo San Martin Morote * @license MIT @@ -36,10 +36,10 @@ ${e} __echarts_config__={width,height,option}; } return __echarts_config__; -`)(n):Promise.resolve({option:JSON.parse(e)});var g4=$({name:"ECharts",props:{config:{type:String,required:!0},id:{type:String,required:!0},title:{type:String,default:""},type:{type:String,default:"json"}},setup(e){const t=p4(),n=q(!0),r=Ce();let l;return Pe("resize",iu(()=>l==null?void 0:l.resize(),100)),me(()=>{Promise.all([L(()=>import("./index-DA4axBLK.js"),__vite__mapDeps([])),new Promise(o=>setTimeout(o,800))]).then(async([o])=>{var u;await((u=t.setup)==null?void 0:u.call(t)),l=o.init(r.value);const{option:a,...i}=await m4(Zt(e.config),e.type,l);l.resize(i),l.setOption({...t.option,...a}),n.value=!1})}),Kn(()=>{l==null||l.dispose()}),()=>[e.title?s("div",{class:"echarts-title"},decodeURIComponent(e.title)):null,s("div",{class:"echarts-wrapper"},[s("div",{ref:r,class:"echarts-container",id:e.id}),n.value?s(Ft,{class:"echarts-loading",height:360}):null])]}}),ba={x:0,y:0,"line-width":2,"line-length":40,"text-margin":8,"font-size":14,"font-color":"#8DA1AC","line-color":"#8DA1AC","element-color":"black",fill:"white","yes-text":"Yes","no-text":"No","arrow-end":"block",scale:1},y4={...ba,symbols:{start:{class:"start-element","font-color":"#fff",fill:"#595959","line-width":"0px"},end:{class:"end-element","font-color":"#fff",fill:"#595959","line-width":"0px"},operation:{class:"operation-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"},inputoutput:{class:"inputoutput-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"},subroutine:{class:"subroutine-element","font-color":"#fff",fill:"#FF485E","element-color":"#fff","line-color":"red"},condition:{class:"condition-element","font-color":"#fff",fill:"#FF485E","line-width":"0px"},parallel:{class:"parallel-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"}}},b4={...ba,"line-width":1,symbols:{start:{class:"start-element",fill:"#ccc","line-color":"#5c6ac4","font-color":"#000"},end:{class:"end-element",fill:"#ccc","line-color":"#5c6ac4","font-color":"#000"},operation:{class:"operation-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},inputoutput:{class:"inputoutput-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},subroutine:{class:"subroutine-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},condition:{class:"condition-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},parallel:{class:"parallel-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"}}},_4={...ba,symbols:{start:{class:"start-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"},end:{class:"end-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"},operation:{class:"operation-element","font-color":"#fff",fill:"#00BC7D","line-width":"0px"},inputoutput:{class:"inputoutput-element","font-color":"#fff",fill:"#EB4D5D","line-width":"0px"},subroutine:{class:"subroutine-element","font-color":"#fff",fill:"#937AC4","element-color":"#fff","line-color":"red"},condition:{class:"condition-element","font-color":"#fff",fill:"#FFB500","line-width":"0px"},parallel:{class:"parallel-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"}}};const ei={ant:y4,vue:_4,pie:b4};let E4={};const xu=Symbol(""),w4=()=>se(xu),A4=e=>{e.provide(xu,E4)};let C4={};const Lu=Symbol(""),S4=()=>se(Lu),T4=e=>{e.provide(Lu,C4)},k4={showCompileOutput:!1,clearConsole:!1,ssr:!1};let x4=k4;const Iu=Symbol(""),L4=()=>se(Iu),I4=e=>{e.provide(Iu,x4)};var P4=$({name:"FlowChart",props:{code:{type:String,required:!0},id:{type:String,required:!0},preset:{type:String,default:"vue"}},setup(e){let t=null;const n=Ce(),r=q(!0),l=q(1),o=_(()=>ei[e.preset]||(console.warn(`[md-enhance:flowchart] Unknown preset: ${e.preset}`),ei.vue)),a=i=>i<419?.8:i>1280?1:.9;return me(()=>{Promise.all([L(()=>import("./flowchart-966sEcGG.js"),__vite__mapDeps([])),new Promise(i=>setTimeout(i,800))]).then(([{parse:i}])=>{t=i(Zt(e.code)),l.value=a(window.innerWidth),r.value=!1,t.draw(e.id,{...o.value,scale:l.value})}),Pe("resize",iu(()=>{if(t){const i=a(window.innerWidth);l.value!==i&&(l.value=i,t.draw(e.id,{...o.value,scale:i}))}},100))}),()=>[r.value?s(Ft,{class:"flowchart-loading",height:192}):null,s("div",{ref:n,class:["flowchart-wrapper",e.preset],id:e.id,style:{display:r.value?"none":"block"}})]}});const $4=()=>{Pe("beforeprint",()=>{document.querySelectorAll("details").forEach(e=>{e.open=!0})})},An={useMaxWidth:!1},O4=e=>({dark:e,background:e?"#1e1e1e":"#fff",primaryColor:e?"#389d70":"#4abf8a",primaryBorderColor:e?"#389d70":"#4abf8a",primaryTextColor:e?"#fff":"#000",secondaryColor:"#ffb500",secondaryBorderColor:e?"#fff":"#000",secondaryTextColor:e?"#ddd":"#333",tertiaryColor:e?"#282828":"#efeef4",tertiaryBorderColor:e?"#bbb":"#242424",tertiaryTextColor:e?"#ddd":"#333",noteBkgColor:e?"#f6d365":"#fff5ad",noteTextColor:"#242424",noteBorderColor:e?"#f6d365":"#333",lineColor:e?"#d3d3d3":"#333",textColor:e?"#fff":"#242424",mainBkg:e?"#389d70":"#4abf8a",errorBkgColor:"#eb4d5d",errorTextColor:"#fff",nodeBorder:e?"#389d70":"#4abf8a",nodeTextColor:e?"#fff":"#242424",signalTextColor:e?"#9e9e9e":"#242424",classText:"#fff",labelColor:"#fff",attributeBackgroundColorEven:e?"#0d1117":"#fff",attributeBackgroundColorOdd:e?"#161b22":"#f8f8f8",fillType0:e?"#cf1322":"#f1636e",fillType1:"#f39c12",fillType2:"#2ecc71",fillType3:"#fa541c",fillType4:"#25a55b",fillType5:"#13c2c2",fillType6:"#096dd9",fillType7:"#aa6fe9"});var R4=$({name:"Mermaid",props:{id:{type:String,required:!0},code:{type:String,required:!0},title:{type:String,default:""}},setup(e){const{themeVariables:t,...n}=w4(),r=Ce(),l=_(()=>Zt(e.code)),o=q(""),a=q(!1);let i=!1;const u=async()=>{const[{default:d}]=await Promise.all([L(()=>import("./mermaid.core-Q7Nqzyqv.js").then(p=>p.b6),__vite__mapDeps([])),i?Promise.resolve():(i=!0,new Promise(p=>setTimeout(p,800)))]);d.initialize({theme:"base",themeVariables:{...O4(a.value),...u2(t)?t(a.value):t},flowchart:An,sequence:An,journey:An,gantt:An,er:An,pie:An,...n,startOnLoad:!1}),o.value=(await d.render(e.id,l.value)).svg},c=()=>{const{body:d}=document,p=document.createElement("div");p.classList.add("mermaid-preview"),p.innerHTML=o.value,d.appendChild(p),p.addEventListener("click",()=>{d.removeChild(p)})},f=()=>{const d=`data:image/svg+xml;charset=utf8,${o.value.replace(/
/g,"
").replace(/%/g,"%25").replace(/"/g,"%22").replace(/'/g,"%27").replace(/&/g,"%26").replace(/#/g,"%23").replace(/{/g,"%7B").replace(/}/g,"%7D").replace(//g,"%3E")}`,p=document.createElement("a");p.setAttribute("href",d),p.setAttribute("download",`${e.title?Zt(e.title):e.id}.svg`),p.click()};return me(()=>{a.value=ml(),u(),fu(document.documentElement,()=>{a.value=ml()},{attributeFilter:["class","data-theme"],attributes:!0}),de(a,()=>u())}),()=>[s("div",{class:"mermaid-actions"},[s("button",{class:"preview-button",onClick:()=>c(),title:"preview",innerHTML:''}),s("button",{class:"download-button",onClick:()=>f(),title:"download",innerHTML:''})]),s("div",{ref:r,class:"mermaid-wrapper"},o.value?s("div",{class:"mermaid-content",innerHTML:o.value}):s(Ft,{class:"mermaid-loading",height:96}))]}});const Pu=({title:e="",link:t})=>s("div",{class:"vp-playground"},[s("div",{class:"vp-playground-header"},[e?s("div",{class:"vp-playground-title"},decodeURIComponent(e)):null,s("div",{class:"vp-playground-actions"},[s("a",{class:"vp-playground-action",href:decodeURIComponent(t),target:"_blank",innerHTML:Wv})])]),s("div",{class:"vp-playground-container"},s("iframe",{src:decodeURIComponent(t)}))]);Pu.displayName="Playground";const B4=()=>[L(()=>import("./reveal.esm-9nNZbZvi.js"),__vite__mapDeps([])),L(()=>import("./markdown.esm-BG2Xu2Hd.js"),__vite__mapDeps([]))];var M4=$({name:"RevealJs",props:{id:{type:String,required:!0},code:{type:String,required:!0},theme:{type:String,default:"auto"}},setup(e){const t=S4(),n=be(),r=q(""),l=q(!0),o=Ce();let a=null;const i=async u=>{const c=[new Promise(v=>setTimeout(v,800)),...B4()],[,f,...d]=await Promise.all(c),p=new f.default(u,{backgroundTransition:"slide",hash:n.value.layout==="Slide",mouseWheel:n.value.layout==="Slide",transition:"slide",slideNumber:!0,...t,...n.value.revealJs||{},embedded:n.value.layout!=="Slide",markdown:{separator:`^\r?\\n---\r? +`)(n):Promise.resolve({option:JSON.parse(e)});var g4=$({name:"ECharts",props:{config:{type:String,required:!0},id:{type:String,required:!0},title:{type:String,default:""},type:{type:String,default:"json"}},setup(e){const t=p4(),n=q(!0),r=Ce();let l;return Pe("resize",iu(()=>l==null?void 0:l.resize(),100)),me(()=>{Promise.all([L(()=>import("./index-DA4axBLK.js"),__vite__mapDeps([])),new Promise(o=>setTimeout(o,800))]).then(async([o])=>{var u;await((u=t.setup)==null?void 0:u.call(t)),l=o.init(r.value);const{option:a,...i}=await m4(Zt(e.config),e.type,l);l.resize(i),l.setOption({...t.option,...a}),n.value=!1})}),Kn(()=>{l==null||l.dispose()}),()=>[e.title?s("div",{class:"echarts-title"},decodeURIComponent(e.title)):null,s("div",{class:"echarts-wrapper"},[s("div",{ref:r,class:"echarts-container",id:e.id}),n.value?s(Ft,{class:"echarts-loading",height:360}):null])]}}),ba={x:0,y:0,"line-width":2,"line-length":40,"text-margin":8,"font-size":14,"font-color":"#8DA1AC","line-color":"#8DA1AC","element-color":"black",fill:"white","yes-text":"Yes","no-text":"No","arrow-end":"block",scale:1},y4={...ba,symbols:{start:{class:"start-element","font-color":"#fff",fill:"#595959","line-width":"0px"},end:{class:"end-element","font-color":"#fff",fill:"#595959","line-width":"0px"},operation:{class:"operation-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"},inputoutput:{class:"inputoutput-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"},subroutine:{class:"subroutine-element","font-color":"#fff",fill:"#FF485E","element-color":"#fff","line-color":"red"},condition:{class:"condition-element","font-color":"#fff",fill:"#FF485E","line-width":"0px"},parallel:{class:"parallel-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"}}},b4={...ba,"line-width":1,symbols:{start:{class:"start-element",fill:"#ccc","line-color":"#5c6ac4","font-color":"#000"},end:{class:"end-element",fill:"#ccc","line-color":"#5c6ac4","font-color":"#000"},operation:{class:"operation-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},inputoutput:{class:"inputoutput-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},subroutine:{class:"subroutine-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},condition:{class:"condition-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},parallel:{class:"parallel-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"}}},_4={...ba,symbols:{start:{class:"start-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"},end:{class:"end-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"},operation:{class:"operation-element","font-color":"#fff",fill:"#00BC7D","line-width":"0px"},inputoutput:{class:"inputoutput-element","font-color":"#fff",fill:"#EB4D5D","line-width":"0px"},subroutine:{class:"subroutine-element","font-color":"#fff",fill:"#937AC4","element-color":"#fff","line-color":"red"},condition:{class:"condition-element","font-color":"#fff",fill:"#FFB500","line-width":"0px"},parallel:{class:"parallel-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"}}};const ei={ant:y4,vue:_4,pie:b4};let E4={};const xu=Symbol(""),w4=()=>se(xu),A4=e=>{e.provide(xu,E4)};let C4={};const Lu=Symbol(""),S4=()=>se(Lu),T4=e=>{e.provide(Lu,C4)},k4={showCompileOutput:!1,clearConsole:!1,ssr:!1};let x4=k4;const Iu=Symbol(""),L4=()=>se(Iu),I4=e=>{e.provide(Iu,x4)};var P4=$({name:"FlowChart",props:{code:{type:String,required:!0},id:{type:String,required:!0},preset:{type:String,default:"vue"}},setup(e){let t=null;const n=Ce(),r=q(!0),l=q(1),o=_(()=>ei[e.preset]||(console.warn(`[md-enhance:flowchart] Unknown preset: ${e.preset}`),ei.vue)),a=i=>i<419?.8:i>1280?1:.9;return me(()=>{Promise.all([L(()=>import("./flowchart-966sEcGG.js"),__vite__mapDeps([])),new Promise(i=>setTimeout(i,800))]).then(([{parse:i}])=>{t=i(Zt(e.code)),l.value=a(window.innerWidth),r.value=!1,t.draw(e.id,{...o.value,scale:l.value})}),Pe("resize",iu(()=>{if(t){const i=a(window.innerWidth);l.value!==i&&(l.value=i,t.draw(e.id,{...o.value,scale:i}))}},100))}),()=>[r.value?s(Ft,{class:"flowchart-loading",height:192}):null,s("div",{ref:n,class:["flowchart-wrapper",e.preset],id:e.id,style:{display:r.value?"none":"block"}})]}});const $4=()=>{Pe("beforeprint",()=>{document.querySelectorAll("details").forEach(e=>{e.open=!0})})},An={useMaxWidth:!1},O4=e=>({dark:e,background:e?"#1e1e1e":"#fff",primaryColor:e?"#389d70":"#4abf8a",primaryBorderColor:e?"#389d70":"#4abf8a",primaryTextColor:e?"#fff":"#000",secondaryColor:"#ffb500",secondaryBorderColor:e?"#fff":"#000",secondaryTextColor:e?"#ddd":"#333",tertiaryColor:e?"#282828":"#efeef4",tertiaryBorderColor:e?"#bbb":"#242424",tertiaryTextColor:e?"#ddd":"#333",noteBkgColor:e?"#f6d365":"#fff5ad",noteTextColor:"#242424",noteBorderColor:e?"#f6d365":"#333",lineColor:e?"#d3d3d3":"#333",textColor:e?"#fff":"#242424",mainBkg:e?"#389d70":"#4abf8a",errorBkgColor:"#eb4d5d",errorTextColor:"#fff",nodeBorder:e?"#389d70":"#4abf8a",nodeTextColor:e?"#fff":"#242424",signalTextColor:e?"#9e9e9e":"#242424",classText:"#fff",labelColor:"#fff",attributeBackgroundColorEven:e?"#0d1117":"#fff",attributeBackgroundColorOdd:e?"#161b22":"#f8f8f8",fillType0:e?"#cf1322":"#f1636e",fillType1:"#f39c12",fillType2:"#2ecc71",fillType3:"#fa541c",fillType4:"#25a55b",fillType5:"#13c2c2",fillType6:"#096dd9",fillType7:"#aa6fe9"});var R4=$({name:"Mermaid",props:{id:{type:String,required:!0},code:{type:String,required:!0},title:{type:String,default:""}},setup(e){const{themeVariables:t,...n}=w4(),r=Ce(),l=_(()=>Zt(e.code)),o=q(""),a=q(!1);let i=!1;const u=async()=>{const[{default:d}]=await Promise.all([L(()=>import("./mermaid.core-BWHcSHhP.js").then(p=>p.b6),__vite__mapDeps([])),i?Promise.resolve():(i=!0,new Promise(p=>setTimeout(p,800)))]);d.initialize({theme:"base",themeVariables:{...O4(a.value),...u2(t)?t(a.value):t},flowchart:An,sequence:An,journey:An,gantt:An,er:An,pie:An,...n,startOnLoad:!1}),o.value=(await d.render(e.id,l.value)).svg},c=()=>{const{body:d}=document,p=document.createElement("div");p.classList.add("mermaid-preview"),p.innerHTML=o.value,d.appendChild(p),p.addEventListener("click",()=>{d.removeChild(p)})},f=()=>{const d=`data:image/svg+xml;charset=utf8,${o.value.replace(/
/g,"
").replace(/%/g,"%25").replace(/"/g,"%22").replace(/'/g,"%27").replace(/&/g,"%26").replace(/#/g,"%23").replace(/{/g,"%7B").replace(/}/g,"%7D").replace(//g,"%3E")}`,p=document.createElement("a");p.setAttribute("href",d),p.setAttribute("download",`${e.title?Zt(e.title):e.id}.svg`),p.click()};return me(()=>{a.value=ml(),u(),fu(document.documentElement,()=>{a.value=ml()},{attributeFilter:["class","data-theme"],attributes:!0}),de(a,()=>u())}),()=>[s("div",{class:"mermaid-actions"},[s("button",{class:"preview-button",onClick:()=>c(),title:"preview",innerHTML:''}),s("button",{class:"download-button",onClick:()=>f(),title:"download",innerHTML:''})]),s("div",{ref:r,class:"mermaid-wrapper"},o.value?s("div",{class:"mermaid-content",innerHTML:o.value}):s(Ft,{class:"mermaid-loading",height:96}))]}});const Pu=({title:e="",link:t})=>s("div",{class:"vp-playground"},[s("div",{class:"vp-playground-header"},[e?s("div",{class:"vp-playground-title"},decodeURIComponent(e)):null,s("div",{class:"vp-playground-actions"},[s("a",{class:"vp-playground-action",href:decodeURIComponent(t),target:"_blank",innerHTML:Wv})])]),s("div",{class:"vp-playground-container"},s("iframe",{src:decodeURIComponent(t)}))]);Pu.displayName="Playground";const B4=()=>[L(()=>import("./reveal.esm-9nNZbZvi.js"),__vite__mapDeps([])),L(()=>import("./markdown.esm-BG2Xu2Hd.js"),__vite__mapDeps([]))];var M4=$({name:"RevealJs",props:{id:{type:String,required:!0},code:{type:String,required:!0},theme:{type:String,default:"auto"}},setup(e){const t=S4(),n=be(),r=q(""),l=q(!0),o=Ce();let a=null;const i=async u=>{const c=[new Promise(v=>setTimeout(v,800)),...B4()],[,f,...d]=await Promise.all(c),p=new f.default(u,{backgroundTransition:"slide",hash:n.value.layout==="Slide",mouseWheel:n.value.layout==="Slide",transition:"slide",slideNumber:!0,...t,...n.value.revealJs||{},embedded:n.value.layout!=="Slide",markdown:{separator:`^\r?\\n---\r? $`,verticalSeparator:`^\r? --\r? -$`},plugins:[...d.map(({default:v})=>v),...t.plugins??[]]});return await p.initialize(),p};return me(async()=>{const u=o.value;u&&(r.value=Zt(e.code),u.setAttribute("id",e.id),u.setAttribute("data-theme",e.theme),a=await i(u),l.value=!1)}),Kn(()=>{a==null||a.destroy()}),()=>s("div",{class:"vp-reveal"},[s("div",{ref:o,class:["reveal","reveal-viewport"]},s("div",{class:"slides",innerHTML:`
AI 分类 | HalfSweet's Blog - - + + - + diff --git a/category/index.html b/category/index.html index e3eb418..f8112ac 100644 --- a/category/index.html +++ b/category/index.html @@ -30,11 +30,11 @@ 分类 | HalfSweet's Blog - - + + - + diff --git a/category/posts/index.html b/category/posts/index.html index 3e08347..f11728f 100644 --- a/category/posts/index.html +++ b/category/posts/index.html @@ -30,12 +30,12 @@ posts 分类 | HalfSweet's Blog - - + +
跳至主要內容
在嵌入式设备上使用fmtlib

众所周知,在c++20以上的标准已经支持了std::format进行格式化输出,不过显而易见,嵌入式领域想要得到支持显然遥遥无期。但是我们已经厌倦了使用sprintf等方式来格式化字符串,c++的流特性又显得不够优雅,怎么才能用上类似于Python中format这样的方式来格式化并输出想要的字符串呢。


HalfSweet大约 5 分钟postsfmtlib嵌入式ESP8266ESP32ArduinoPlatformIOESP-IDF
- + diff --git "a/category/\345\215\225\347\211\207\346\234\272/index.html" "b/category/\345\215\225\347\211\207\346\234\272/index.html" index ad0dc27..cd71153 100644 --- "a/category/\345\215\225\347\211\207\346\234\272/index.html" +++ "b/category/\345\215\225\347\211\207\346\234\272/index.html" @@ -30,8 +30,8 @@ 单片机 分类 | HalfSweet's Blog - - + +
跳至主要內容
嵌入式中的 CI/CD

对于传统的嵌入式开发来说,我们一般常用的IDE都是诸如Keil、IAR等。这些IDE在方便了我们的开发的同时,也存在很多问题,例如在之前Keil-MDK5是不能跨平台的,仅限在Windows平台运行,并且它的授权也是一个老大难的问题。这样我们在团队协作的时候往往就会遇到很多问题,无法像是互联网的开发那样有一套完整的CI/CD流程。但是MDK6的更新解决了这个问题,第一它是跨平台的,这样在Windows、Linux以及MacOS上都能运行;并且也支持了很多命令行的操作,避免了繁琐的GUI操作,这样也更有利于自动化脚本的编写。

@@ -43,6 +43,6 @@

HalfSweet大约 3 分钟单片机Air001合宙日志
不服来跑个分?将 CoreMark 移植到 STC 上试试

最近维护的 Air001 准备上线了,为了衬托出其强大的性价比,因此我想来做点缺德的事,让我们来和同样以高打性价比的 STC 系列单片机来对比下 CoreMark 的跑分吧,本文将会详细介绍移植过程以及跑分结果。测试的 MCU 为降龙棍 STC32G12K128打狗棒 STC8H8K64U

通用,本文同样适用于 Arm-Cortex M 架构的 MCU。


HalfSweet大约 5 分钟单片机STC32STC8嵌入式CoreMark
- + diff --git "a/category/\345\242\250\346\260\264\345\261\217/index.html" "b/category/\345\242\250\346\260\264\345\261\217/index.html" index b72d2a5..b281e0b 100644 --- "a/category/\345\242\250\346\260\264\345\261\217/index.html" +++ "b/category/\345\242\250\346\260\264\345\261\217/index.html" @@ -30,8 +30,8 @@ 墨水屏 分类 | HalfSweet's Blog - - + +
跳至主要內容
墨水屏的坑——7.5寸墨水屏刷新为何出现条纹

前言

@@ -39,6 +39,6 @@

其中上面一张图为我自己做的波形,第二张为使用的OTP波形,但是无一例外,都出现了刷新的问题。抱着也许是驱动板出问题了的想法,我重新lay了一次板子,焊接好之后发现问题确实有所改善,但是并不佳。后续在更换过程中发现采用cd32封装的68uH的电感刷新效果会更好一些,但是依旧存在刷新问题,特别是在UI中有竖着的线条的时候,特别影响观感。


HalfSweet大约 7 分钟墨水屏墨水屏UC8179DEPG0750RWU790F30遇到的坑
- + diff --git "a/category/\347\275\221\347\253\231/index.html" "b/category/\347\275\221\347\253\231/index.html" index 8359a5c..97f91cd 100644 --- "a/category/\347\275\221\347\253\231/index.html" +++ "b/category/\347\275\221\347\253\231/index.html" @@ -30,13 +30,13 @@ 网站 分类 | HalfSweet's Blog - - + + - + diff --git a/friends/index.html b/friends/index.html index b202b57..421094e 100644 --- a/friends/index.html +++ b/friends/index.html @@ -30,8 +30,8 @@ 友情链接 | HalfSweet's Blog - - + +
跳至主要內容

友情链接

大约 1 分钟

友情链接

这是一个友链页面,欢迎大家私聊我或者评论留言添加自己的友链,留言的话需要以下内容:

  • 你的名称
  • 你的博客链接
  • 你的一段简介(可选)
  • 你的头像资源文件或者链接(可选)
title: 晨旭
@@ -85,6 +85,6 @@
 link: https://blog.lss233.com
 color: rgba(253, 230, 138, 0.15)
 
- + diff --git a/index.html b/index.html index b3f5d8e..3d166eb 100644 --- a/index.html +++ b/index.html @@ -30,8 +30,8 @@ HalfSweet's Blog | HalfSweet's Blog - - + +
跳至主要內容
HalfSweet's Blog

HalfSweet's Blog

Try to create some value.

嵌入式中的 CI/CD

对于传统的嵌入式开发来说,我们一般常用的IDE都是诸如Keil、IAR等。这些IDE在方便了我们的开发的同时,也存在很多问题,例如在之前Keil-MDK5是不能跨平台的,仅限在Windows平台运行,并且它的授权也是一个老大难的问题。这样我们在团队协作的时候往往就会遇到很多问题,无法像是互联网的开发那样有一套完整的CI/CD流程。但是MDK6的更新解决了这个问题,第一它是跨平台的,这样在Windows、Linux以及MacOS上都能运行;并且也支持了很多命令行的操作,避免了繁琐的GUI操作,这样也更有利于自动化脚本的编写。

@@ -49,6 +49,6 @@

其中上面一张图为我自己做的波形,第二张为使用的OTP波形,但是无一例外,都出现了刷新的问题。抱着也许是驱动板出问题了的想法,我重新lay了一次板子,焊接好之后发现问题确实有所改善,但是并不佳。后续在更换过程中发现采用cd32封装的68uH的电感刷新效果会更好一些,但是依旧存在刷新问题,特别是在UI中有竖着的线条的时候,特别影响观感。


HalfSweet大约 7 分钟墨水屏墨水屏UC8179DEPG0750RWU790F30遇到的坑
- + diff --git a/posts/Air32-Clion/index.html b/posts/Air32-Clion/index.html index 674b6cf..553f72b 100644 --- a/posts/Air32-Clion/index.html +++ b/posts/Air32-Clion/index.html @@ -30,13 +30,13 @@ 使用 Clion 来进行 Air32 的开发 | HalfSweet's Blog - - + +
跳至主要內容

使用 Clion 来进行 Air32 的开发

HalfSweet大约 3 分钟单片机Air32合宙Clion

在上几篇文章中,我们将 HAL 库移植给了 Air32,但是我们的开发环境还是使用的 Keil,这样就会导致一些问题,比如 Keil 的代码提示不够友好,而且 Keil 的代码补全也不够完善,因此我们可以使用一个更好的开发环境,比如 Clion。

本文如没有特殊说明,均以 Clion 的新 UI 为例

前置条件

  1. 需要 Clio 你软件(废话
  2. 需要安装arm-none-eabi-gcc,windows 用户建议通过MSYS2的包管理工具安装,在此不多赘述
  3. 我们推荐使用PyOCD作为调试器
  4. 安装STM32CubeMX生成工程模板,当然这一步不是必须的,你也可以用我们文末提供的模板

提示

MinGW 和 Cmake 工具链目前最新版的 Clion 自带,我们无需在意

新建工程

打开 Clion 软件,点击左上角的☰-文件-新建-项目按钮

选择左边嵌入式列表中的STM32CubeMX,路径自定

选择在 STM32CubeMX 中打开

默认采用了STM32F030F4Px,点击顶上面包屑导航的STM32F030F4P6修改为STM32F103CBTx

点击Start Project,进入配置界面

接下来是常规配置,可以参考 [发挥全部实力!Air32 在 HAL 库环境下运行最高主频](./发挥全部实力!Air32 在 HAL 库环境下运行最高主频。md) 中的配置,这里不再赘述

生成代码

生成代码的时候,在Project Manage中的Toolchain / IDE中选择STM32CubeIDE,注意检查路径是否正确

点击右上角的Generate Code按钮,等待生成完成

生成 Cmake 工程

回到 Clion 中,打开.ioc目录下的工程,会自动生成 Cmake 工程,我们点击一下构建按钮,此时应该可以自动编译完成。

提示

记得安装arm-none-eabi-gcc环境

下载工程

我们使用pyOCD下载,首先我们需要安装pyOCD的环境,这里我们选择安装develop版本,因为目前内置 Air32 的版本还没正式发布。

在我们有 Python 环境的前提下,只需要

pip install --pre -U git+https://github.com/pyocd/pyOCD.git@develop
 

即可安装。

接下来我们需要配置运行参数,我们点击上方的运行/调试配置按钮,然后点击编辑配置

可执行文件中,修改为pyOCD的路径,如果找不到可以用which pyocd命令查看。

命令实参中,加入

flash --erase chip --target air32f103xb $CMakeCurrentBuildDir$/Air32F103_Clion.hex
 

芯片型号和具体的 hex 文件可以根据实际情况进行修改。

此时点击运行按钮,即可下载程序到 Air32 中。

配置调试器

点击运行/调试配置按钮,然后点击编辑配置,点击弹出窗口的左上角的+按钮,选择嵌入式 GDB 调试器

target remote中填入localhost:65533,或者端口自定,不冲突即可。

GDB 服务器中填入 pyOCD 的可执行文件路径

GDB 服务器实参中填入gdbserver -p 65533 -t air32f103xb -f 10M,端口号和芯片型号自定,如果连不上可适当降低频率。

最后点击确认即可

把运行配置切换到刚才设置的调试选项卡中,点击调试按钮即可进行调试

附录

此工程开源在https://github.com/Air-duino/Air32-Clion-Templateopen in new window

- + diff --git a/posts/Air32-HAL-HighFreq/index.html b/posts/Air32-HAL-HighFreq/index.html index e466ae9..cb8e610 100644 --- a/posts/Air32-HAL-HighFreq/index.html +++ b/posts/Air32-HAL-HighFreq/index.html @@ -30,8 +30,8 @@ 发挥全部实力!Air32 在 HAL 库环境下运行最高主频 | HalfSweet's Blog - - + +
跳至主要內容

发挥全部实力!Air32 在 HAL 库环境下运行最高主频

HalfSweet大约 6 分钟单片机Air32合宙超频

最近打算把 Air32 也吃上 Arduino,发挥全部性能,就不用像是 Air001 那样束手束脚了,但是问题是 Arduino 的库是基于 HAL 的,那要用上 Arduino 就必定得先适配 HAL 库,那我们就来先尝试在 HAL 下让 Air32 跑到最高主频吧。

初始化工程

首先我们需要先初始化一个工程,就单纯点灯和和串口打印,这里我偷懒用了STM32CubeMX,我们勾上串口和外部时钟,为了方便我们顺便把 SWD 也选上。大概就是这样

CubeMX
CubeMX

然后生成代码即可。

修改时钟

因为我们要跑高主频,原先的 PLL 倍频数不满足,用到了新的一些配置,因此我们需要修改芯片头文件以及hal_rcc_ex.h中的一些宏定义,首先是芯片的头文件,我们这里以air32f103xb.h为例,我们需要修改的地方如下

#define RCC_CFGR_PLLMULL16_Pos               (19U)                             
@@ -219,6 +219,6 @@
   /* USER CODE END 3 */
 }
 

编译下载,打开串口调试助手,可以观察到:

串口输出无乱码,主频正确,我们已经成功在 HAL 中跑到了最高主频。

附录

本文的工程开源在https://github.com/Air-duino/Air32F103-HAL-RCCopen in new window,用到的 HAL 库源码在https://github.com/Air-duino/Arduino-Air32F103-Driversopen in new window

- + diff --git a/posts/Air32-HAL-MCO/index.html b/posts/Air32-HAL-MCO/index.html index 80d102e..765cd8c 100644 --- a/posts/Air32-HAL-MCO/index.html +++ b/posts/Air32-HAL-MCO/index.html @@ -30,8 +30,8 @@ Air32 的 HAL 改造——适配 MCO | HalfSweet's Blog - - + +
跳至主要內容

Air32 的 HAL 改造——适配 MCO

HalfSweet大约 3 分钟单片机Air32合宙MCO

上篇文章 中,我们把 HAL 库移植给了 Air32,那现在让我们尝试添加一些 HAL 库特有的功能吧,比如这篇文章中描述的MCO

关于

MCO 全称为Microcontroller clock output,即微控制器时钟输出,它可以将主时钟输出到某个引脚上,这样我们就可以在不消耗任何资源的情况下得到一些特定的时钟信号。

在 STM32F103 中,MCO 对于 PLL 的输出有两种选择,分别是 PLL/2 和 PLL/3,但是这对于主频高达 256M 的 Air32 来说显然是不够的,因为其 GPIO 输出最大仅 50M。因此 Air32 有了专属的一个寄存器来控制 MCO 的输出,这个寄存器就是RCC_MCO_VAL,其相对 RCC 的偏移量为0x30

添加寄存器地址

因为这个寄存器是 Air32 独有的,因此我们需要单独添加。我们在芯片的头文件中的RCC_TypeDef结构体中进行添加,我们此处以air32f103xb.h为例,添加的代码如下:

typedef struct
@@ -130,6 +130,6 @@
 }
 

至此,我们就完成了对 MCO 的添加,接下来我们就可以在 HAL 库中使用 MCO 了。我们只需要调用HAL_RCC_MCOConfig即可使用 MCO 输出,例如:

HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLLCLK_DIV16, RCC_MCODIV_1);
 

即可以 16 分频输出 PLL 的时钟信号。

附录

测试的代码可以参考https://github.com/Air-duino/Air32F103-HAL-RCCopen in new window

- + diff --git a/posts/Empedded-CI-CD/index.html b/posts/Empedded-CI-CD/index.html index 756de56..2d5d95b 100644 --- a/posts/Empedded-CI-CD/index.html +++ b/posts/Empedded-CI-CD/index.html @@ -30,8 +30,8 @@ 嵌入式中的 CI/CD | HalfSweet's Blog - - + +
跳至主要內容

嵌入式中的 CI/CD

HalfSweet大约 5 分钟单片机Air001合宙CI/CD

对于传统的嵌入式开发来说,我们一般常用的IDE都是诸如Keil、IAR等。这些IDE在方便了我们的开发的同时,也存在很多问题,例如在之前Keil-MDK5是不能跨平台的,仅限在Windows平台运行,并且它的授权也是一个老大难的问题。这样我们在团队协作的时候往往就会遇到很多问题,无法像是互联网的开发那样有一套完整的CI/CD流程。但是MDK6的更新解决了这个问题,第一它是跨平台的,这样在Windows、Linux以及MacOS上都能运行;并且也支持了很多命令行的操作,避免了繁琐的GUI操作,这样也更有利于自动化脚本的编写。

CI/CD是什么

CI/CD是指持续集成(Continuous Integration)和持续交付(Continuous Delivery),是一种软件开发实践,通过使用自动化的软件工具来加快软件开发的流程,这样可以更快的交付高质量的软件。CI/CD的核心是持续集成,即在开发过程中,频繁的将代码集成到主干上,这样可以更快的发现错误,更快的修复错误。而持续交付则是在持续集成的基础上,将集成后的代码部署到生产环境中,这样可以更快的将新功能交付给用户。

简单来说,就是作为开发者的我们,只需要关注代码的编写,而不需要关注代码的编译、测试、部署等等,这些都可以通过自动化的脚本来完成。如果有多人协作的场景下,最终产物的编译和交付也可以通过自动化的脚本来完成,而不是传统的需要人工来完成。

在本文中,我们采用Github Actions来完成CI/CD的流程。我假设本文的读者已经对Github Actions有一定的了解,如果没有的话也没关系,可以参考官方文档open in new window,并且本文也会对一些关键的地方进行说明。

一些前置条件

  1. 一个基于Keil-MDK的工程,无论你之前是否配置过MDK6
  2. 你的工程需要用AC6的编译器编译通过
  3. 一个Github账号
  4. 一定的学习能力

编写Github Actions脚本

我们假定你的这个工程在Github上已经新建了一个仓库,如果没有需要先新建一个仓库。然后在仓库的根目录下新建一个.github/workflows文件夹,然后在这个文件夹下新建一个release.yml文件,这个文件就是我们的Github Actions脚本。它的名称无所谓,但是后缀必须是.yml,这是YAML文件的后缀。

我们略去一些基础的Action的操作,直接进入到关键的一些步骤。

安装 vcpkg

vcpkg是微软开发的一个C/C++的包管理工具,类似于Python的pip、Node.js的npm、Java的maven等等。在MDK6中它被用来作为很重要的包管理器,因此我们需要保证先安装好它。安装非常简单,只需要:

. <(curl https://aka.ms/vcpkg-init.sh -L)
@@ -50,6 +50,6 @@
 

这样我们就可以直接用fromelf命令来转换了

fromelf --bin --output="out/CoreMark/Project/CoreMark.bin" "out/CoreMark/Project/CoreMark.axf"
 fromelf --i32 --output="out/CoreMark/Project/CoreMark.hex" "out/CoreMark/Project/CoreMark.axf"
 

Release

这个时候我们将最终文件上传到release中就好了,这里我用的是ncipollo/release-action这个插件。具体的操作可以看演示仓库。

FAQ

有问题可以评论区留言,遇到的问题可以更新在FAQ里。

演示仓库

https://github.com/Air-duino/Air001-CoreMarkopen in new window

- + diff --git a/posts/EpdTraps1/index.html b/posts/EpdTraps1/index.html index 13dff3e..4eae211 100644 --- a/posts/EpdTraps1/index.html +++ b/posts/EpdTraps1/index.html @@ -30,11 +30,11 @@ 墨水屏的坑——7.5寸墨水屏刷新为何出现条纹 | HalfSweet's Blog - - + +
跳至主要內容

墨水屏的坑——7.5寸墨水屏刷新为何出现条纹

HalfSweet大约 7 分钟墨水屏墨水屏UC8179DEPG0750RWU790F30遇到的坑

前言

之前在我群里的同学应该都还记得,之前有朋友送给半糖两块7.5寸的墨水屏,其中一块是黑白双色的,标签型号是DEPG0750RWU790F30,驱动芯片则是UC8179。这块屏确实蛮好的,有着高达800*480的分辨率,并且因为是7.5寸所以可视面积非常大,但是在调试的过程中半糖发现了一个问题:这个屏幕的刷新过程中怎么会出现白色条纹,并且刷完的颜色非常怪?

其中上面一张图为我自己做的波形,第二张为使用的OTP波形,但是无一例外,都出现了刷新的问题。抱着也许是驱动板出问题了的想法,我重新lay了一次板子,焊接好之后发现问题确实有所改善,但是并不佳。后续在更换过程中发现采用cd32封装的68uH的电感刷新效果会更好一些,但是依旧存在刷新问题,特别是在UI中有竖着的线条的时候,特别影响观感。

大佬相助

时间过得飞快,到了前几天,想着我解决不了这个问题就拉帮手的想法,我将这块屏寄给了滚筒洗衣机open in new window大佬,然后在我的威逼利诱强烈要求下,我们开始了新一轮的测试。

果不其然,在他移植了我之前写的程序的时候,问题便复现了。

经过一系列的检查,排除了是取模方式等的因素,我们惊讶地发现…大连佳显的官方例程里面给的图片可以完美显示?紧接着我们又试了下全0xAA以及0x55的数据,理论上这样推上去的图像将是完整的一条条1像素的黑白条纹,结果……非常完美。既然横条没问题,那么竖条呢?出现了一点小问题。那么棋盘格呢?问题大了,屏幕甚至想要拒绝刷新。紧接着尝试了别的图像,结果出现了非常奇怪的效果,如果黑色比较少,分得比较开,那么刷出来没有任何问题,但是刷图片类似的比较复杂的形状又会炸掉。难道是内存出现了什么毛病?

紧接着检查,发现了一个我们之前忽视的点,硬件驱动电路!

可以看出,与常规的墨水屏驱动电路相比,该电路的高压部分电容均为10uF,并且boost电荷泵部分的电容为4.7uF,会是这个原因吗?于是大佬开始了他的飞线操作。

不得不说大佬技艺高超,很快就把缺失的电容补上了,那么,工作正常了吗?

事实证明还是有所效果,刷图的质量明显好了不少,像素棋盘格也能正常显示了,这下刷图片总没有问题了吧?

没有意外的话现在就要出意外了,令人惊讶的是棋盘格能显示,但是刷的图片还是依旧炸裂。这就奇了怪了,刷全白正常,刷全黑正常,刷条纹正常,甚至刷棋盘格也正常,但是刷区区一张图片竟然出现了问题?难道是芯片设计的bug吗。

初寻端倪

TCON SETTING

经过了一系列的尝试,我们将重心转移到了寄存器的配置上。首先我注意到了一个0x60的寄存器,这个寄存器的描述为“TCON SETTING”,内容为“This command defines non-overlap period of Gate and Source.”是因为内部的时序问题才导致的刷新不正常吗?但是在修改之后未果,故障依旧。同时参考了同芯片的微雪的屏幕驱动代码,该寄存器的设置的值并不一致,但是修改后故障依旧。

修改PLL

我们联想到,如果是时序导致的出错,那么降低频率是否会好一些?于是我们便尝试了修改屏幕的PLL参数,该寄存器地址为0x30。神奇的事发生了,在大佬降低PLL到5Hz之后,发现之前刷新炸掉的图片竟然能正常刷新了!除了刷的很慢之外并没有什么多余的问题。紧接着又尝试了4灰度使用内部OTP波形进行刷新,发现依然能正常刷新。

难道是因为屏幕厂商的内部布线问题,导致时钟开太高会有干扰?想想便感觉非常不合理,还是说难道屏厂在测试的时候使用的都是比较简单的图片,因此并没有发现刷新的问题?不管什么样的解释,显得都非常牵强,但是目前我们也找不到更好的解决方案,因此便告一段落,并一致认为大概率是屏厂设计导致的硬件问题。

真凶在此

在闲聊中,我们发现威锋有一款5.83寸的屏幕与这块屏幕采用了同款驱动芯片,于是大佬便决定把5.83屏幕的初始化代码搬过来试试。令人意想不到的情况出现了,竟然……好了?在这样的初始化代码下,屏幕的刷新竟然无比的丝滑顺畅,似乎本该如此,可是,为什么呢?

幸而5.83屏的初始化代码非常简洁,我们很轻易就可以发现不同点:主要便是0x06这个寄存器。

5.83屏幕的初始化代码
5.83屏幕的初始化代码

那么,这个寄存器是做什么用的呢?

虽然描述寥寥,但是我们依稀能看出是与boost升压有关,并且第三个数据默认值为0x17,而5.83屏幕的初始化代码中为0x28,是否就是这个寄存器导致的呢?我们将这段初始化代码复制了过去。

意想不到的事出现了,正常了,彻底正常了!没有讨厌的条纹,没有刷新后掉色,屏幕安安静静刷新出一帧的画面,自然又好看。

虽然我找了下相同芯片的在GxEpd2库下方的代码,发现或多或少都对这个寄存器进行了配置,有0x17,0x17,0x28的,有0xC7,0xCC,0x28的,还有0x17,0x17,0x39,0x17的,大家都没有采用默认的四个0x17的值。不知道大佬佳显是抱着怎样的想法,漏掉了这个至关重要的寄存器,也许是屏厂给的测试代码就没有。

这个寄存器没有具体的描述,在SSD芯片中也有类似的寄存器,但是同样额米有具体的文字描述,根据名字来看,或许和boost有关,并且不同的值应该与驱动能力有关,但是具体有什么用,ABC相有什么区别,我不得而知,如果有知道的同学可以告诉我,不胜感激()

总结

总而言之,经过了一晚上的忙活,查找了各种原因,结果发现是一个寄存器没有配置。虽然问题不大,但是蛮折磨人的,并且也不知道是具体原因。不过有了这次的经验,在下次遇到类似的故障的时候,想必找到问题出现的原因会更加轻松。

备注

DEPG0750RWU790F30这块屏幕请记住,一定要配置0x06的寄存器!!!相同尺寸的相同驱动芯片的屏幕应该也大致如此,希望能帮到更多遇到类似问题的同学。

- + diff --git a/posts/HelloWorld/index.html b/posts/HelloWorld/index.html index bbf8bf0..83cebe6 100644 --- a/posts/HelloWorld/index.html +++ b/posts/HelloWorld/index.html @@ -30,11 +30,11 @@ HelloWorld | HalfSweet's Blog - - + + - + diff --git a/posts/MDK6-Dev/index.html b/posts/MDK6-Dev/index.html index ba26755..cea898b 100644 --- a/posts/MDK6-Dev/index.html +++ b/posts/MDK6-Dev/index.html @@ -30,11 +30,11 @@ 更现代的开发方式?使用 MDK6 进行开发 | HalfSweet's Blog - - + +
跳至主要內容

更现代的开发方式?使用 MDK6 进行开发

HalfSweet大约 2 分钟单片机Air001Air32合宙

今日,在千呼万唤中,Arm 的 MDK6 桌面端终于出来了,本想作为第一批吃螃蟹的开发者,但是当时 Air32 和 Air001 的烧录均有问题,最后在 Arm 官方的支持下,终于可以正常使用了,那么现在我们就来尝试一下。

安装 MDK6

MDK6 实际上是 VSCode 的一个插件,这看起来很荒谬,实际上也确实很荒谬。所以首先我们需要安装 VSCode,这里不多赘述。

安装完成后,我们打开插件的主页https://marketplace.visualstudio.com/items?itemName=Arm.keil-studio-packopen in new window,点击install,即可跳转到 VSCode 中自动安装。这个过程中会安装一大堆依赖的奇奇怪怪的很多插件,甚至可能有 AC6 编译器,请耐心等待。

转换工程

因为目前 MDK6 的工程创建还很辣鸡,因此我们选择把原来 MDK5 的工程转换过来,这里我们以 Air001 为例。

我们随便找一个例子,我们这里以 GPIO 下的GPIO_Toggle为例,首先我们先复制粘贴一份,然后重命名为GPIO_Toggle_MDK6。打开其中的MDK-ARM文件夹,然后选择在 VSCode 中打开。

这是我们会发现出现了一个Convert μVision project Project.uvprojx to csolution?的弹窗,点击convert即可。

convert
convert

此时会自动转换,稍等即可。

目前仅支持转换 AC6 的工程,如果是 AC5 编译器的工程需要自行修改

编译工程

点击左边的CMSIS按钮,点击action列表中的build即可开始编译。

烧录程序

首先我们插入调试器,然后点击左边的Device Manage按钮,然后点击Add device,然后选择实际使用的调试器,我这里使用的是 ST-Link。然后点击左边列表中的铅笔图标,也就是Edit Device

  1. 修改名称,可以修改成自己喜欢的,此处我们保存默认,直接按Enter键即可
  2. 选择 pack 包,我们输入本地最新的 pack 包路径,我这里为D:\GitHub\luatos-soc-air001\PACK\Keil.AIR001_DFP.1.1.0.pack
    pack
  3. 选择芯片,我们这里选择AIR001Dev即可

点击左边的CMSIS按钮,点击action列表中的RUN按钮即可下载。

提示

目前 MDK6 还不能修改调试器的速度,因此默认的 10M 对于 Air001 来说太高了,建议使用别的调试器进行烧录。

如果出现ERROR: Cannot attain state requested. (RDDI-ERROR 52)这样的报错,就是说明速率太高无法下载。

默认下载完不会自动复位,我们可能需要手动按一下 RST 按钮

至此,我们就完成了一个简单的工程的编译与烧录。

- + diff --git a/posts/SEGGER-RTT/index.html b/posts/SEGGER-RTT/index.html index e08ef32..ddcfac7 100644 --- a/posts/SEGGER-RTT/index.html +++ b/posts/SEGGER-RTT/index.html @@ -30,8 +30,8 @@ 更高效的日志查看方式——使用SEGGER-RTT | HalfSweet's Blog - - + +
跳至主要內容

更高效的日志查看方式——使用SEGGER-RTT

HalfSweet大约 3 分钟单片机Air001合宙日志

在日常的开发中,我们免不了使用各种各样的日志打印方式,使用调试器固然好用,但是无法直接打印局部变量以及会打断整个运行状态。并且对于众多Arduino的用户来说,直接打印日志显然是更直观的做法。但是直接使用串口打印的话需要一定的资源,并且速度会稍慢,并且可能会占用一个串口,对于资源就不多的MCU,我们有没有更方便的方法呢?

调试方式

使用SWO

对于这个问题,众多厂商也有着相同的需求,于是Arm公司便提出了一种叫做Serial Wire Output的协议,我们将其简称为SWO。简单来说,它是一种用于调试的接口协议。SWO是在ARM Cortex-M微控制器上实现的,它允许调试器通过单个引脚输出数据,而不需要占用其他引脚。使用SWO接口,可以在运行时输出调试信息,例如程序状态、变量值、函数返回值等,从而帮助开发人员进行调试。

STM32微处理器的编程中,我们只需要在STM32CubeMX软件中打开异步跟踪模式即可使用SWO进行输出调试,相比与串口的打印,使用SWO明显效率更高,占用的引脚更少。

但是遗憾的是,采用SWO的日志输出依然会占用一个IO,并且只能和SWD/JTAG等调试口联用。那么我们有没有一种方法,可以做到只使用调试接口就可以输出日志,并且拥有相似甚至更高的效率呢?

SEGGER-RTT

在此基础上,伟大的SEGGER Microcontroller公司便推出了一种新的日志打印方式,称之为Real-Time Transfer,也就是简称的RTT。什么?你没听过这个公司?那你总用过J-Link吧,是的,它们出自于一家公司。

SEGGER-RTT 的原理是通过在目标设备上的专用软件库,将实时数据通过 JTAG/SWD 接口传输到 Host 端。这个过程中不需要额外的硬件支持,只需要使用 SEGGER 的调试器和它的支持的 IDE(如SEGGER's Embedded Studio或其他兼容IDE)。SEGGER-RTT 通过利用调试器的访问权限,从调试目标设备的内部缓冲区中读取数据,并将这些数据发送到 Host 端进行处理和显示。同时也可以在 Host 端向目标设备发送数据,以便执行一些控制操作或者更改程序的状态。由于 SEGGER-RTT 可以非常快速地传输大量数据,因此它通常被用于实时性要求较高的应用程序中。

移植SEGGER-RTT

我们来尝试在Air001单片机上移植SEGGER-RTT。移植好的工程开源链接:

https://github.com/Air-duino/Air001-SEGGER-RTT-Keilopen in new window

第一步,我们先下载一个Jlink全家桶open in new window,然后安装。
然后在如图所示的安装目录下,我们应该可以看到这样的一个压缩文件:

解压它,备用。

0x02 加入Keil工程

我们将xxx/JLink\Samples\RTT\SEGGER_RTT_V788a\下的RTTConfig文件夹复制到我们的工程目录下,并加入到Keil工程中,别忘了添加头文件。

0x03 初始化并调用

main.c文件中include头文件,并初始化。

int main(void)
@@ -51,6 +51,6 @@
   }
 }
 

因为我们使用的是DAPLink,Jlink的软件无法识别,因此我们使用了一个第三方的软件:
https://github.com/XIVN1987/RTTViewopen in new window

打印出了预期的结果。

后记

  • 思考:效率是否能进一步提高呢?
- + diff --git a/posts/STC_CoreMark/index.html b/posts/STC_CoreMark/index.html index 8b317d1..370b749 100644 --- a/posts/STC_CoreMark/index.html +++ b/posts/STC_CoreMark/index.html @@ -30,8 +30,8 @@ 不服来跑个分?将 CoreMark 移植到 STC 上试试 | HalfSweet's Blog - - + +
跳至主要內容

不服来跑个分?将 CoreMark 移植到 STC 上试试

HalfSweet大约 5 分钟单片机STC32STC8嵌入式CoreMark

最近维护的 Air001 准备上线了,为了衬托出其强大的性价比,因此我想来做点缺德的事,让我们来和同样以高打性价比的 STC 系列单片机来对比下 CoreMark 的跑分吧,本文将会详细介绍移植过程以及跑分结果。测试的 MCU 为降龙棍 STC32G12K128打狗棒 STC8H8K64U

通用,本文同样适用于 Arm-Cortex M 架构的 MCU。

STC32G12K128

开启 USB-CDC 打印 Log

我买到的降龙棍开发板非常的 HiFi,整个板子上外设除了 LED 和芯片就没什么了,下载程序都是用的自带的 USB-HID 的 bootloader,然后我又懒得接一个串口模块,因此我们可不可以利用原生的 USB,走 CDC 虚拟串口来打印跑分后的数据呢?

答案当然是肯定的,STC 非常的贴心,自带了一个写好的 USB 库,其中包含了 HID 和 CDC 两类主要的操作。那我们就先尝试去移植吧。

下载库文件

STC 的 USB 库文件下载链接为https://stcai.com/filedownload/656048open in new window,下载后会发现是一个压缩文件,我们将其解压备用。

创建工程

打开 Keil,新建一个工程,芯片选择STC32G12K128,然后我们复制刚才解压的文件中的stc32_stc8_usb.hstc_usb_cdc_32g.lib到我们新建的工程的目录下,并添加进自己的工程中。

编写初始化代码

我们在 main.c 中添加如下的代码:

#include "stc32g.h"
@@ -119,6 +119,6 @@
 #define SAMPLE_TIME_IMPLEMENTATION 1
 #define EE_TICKS_PER_SEC           (NSECS_PER_SEC / TIMER_RES_DIVIDER)
 

注意

请注意,这时候编译器可能会有很多报错,是因为和关键字重复了,建议查看 commit 记录查看修改了什么

烧录

使用 STC-ISP 软件烧录,其中 IRC 频率修改为最高 35M,等待烧录后打开串口查看跑分结果。

提示

STC32 的 CoreMark 跑分工程开源仓库为https://github.com/HalfSweet/STC32G-CoreMarkopen in new window

注意

目前的工程只能出现跑分的时间,CRC 校验不通过。如果有修复的方法欢迎在评论区或者仓库提出 QwQ。

- + diff --git a/posts/conda_novelai/index.html b/posts/conda_novelai/index.html index dd181f2..fcd7eb2 100644 --- a/posts/conda_novelai/index.html +++ b/posts/conda_novelai/index.html @@ -30,8 +30,8 @@ 基于conda进行手动配置novelAI | HalfSweet's Blog - - + +
跳至主要內容

基于conda进行手动配置novelAI

HalfSweet大约 6 分钟AI人工智能novelAIconda

最近大家应该都玩过novelAI了,出来的图片质量都非常棒,但是b站大佬给的配置只是打包了的bat文件,但是这显然不符合我们的折腾精神,于是我们来尝试使用conda来进行纯手工配置。

前置条件

  • git
  • conda(在win上使用miniconda或者anconda均可,建议使用miniconda,体积更小)
  • nvida的cuda驱动
  • 合适的磁力链接下载软件
  • 适当的访问外网方式,您可能需要配置命令行、conda等工具,以及您可能需要对pip/conda等工具进行换源,在此不多赘述。

安装stable-diffusion-webui

stable-diffusion-webuiopen in new window是一个基于用于稳定扩散的 Gradio 库的浏览器界面,作用是将泄露出来的novelAI模型以一个可视化比较好的方式进行训练与导出。

这里我们采用git clone的方式来进行下载,同时也更方便我们后期的升级等操作。在命令行中输入

git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
@@ -122,6 +122,6 @@
 
 Stable diffusion model failed to load, exiting
 

经过b站一位大佬open in new window发的Hash对照来看,发现是使用比特彗星下载的文件的Hash不对,但是很神奇的是stable-diffusion-webui的计算的8位正确。

经过重新检查文件完整性的操作,问题修复。

- + diff --git a/posts/embedded_fmtlib/index.html b/posts/embedded_fmtlib/index.html index a566eb4..fe20e44 100644 --- a/posts/embedded_fmtlib/index.html +++ b/posts/embedded_fmtlib/index.html @@ -30,8 +30,8 @@ 在嵌入式设备上使用fmtlib | HalfSweet's Blog - - + +
跳至主要內容

在嵌入式设备上使用fmtlib

HalfSweet大约 5 分钟postsfmtlib嵌入式ESP8266ESP32ArduinoPlatformIOESP-IDF

众所周知,在c++20以上的标准已经支持了std::format进行格式化输出,不过显而易见,嵌入式领域想要得到支持显然遥遥无期。但是我们已经厌倦了使用sprintf等方式来格式化字符串,c++的流特性又显得不够优雅,怎么才能用上类似于Python中format这样的方式来格式化并输出想要的字符串呢。

通过去fmtlib的官网open in new window查看,我们不难发现,想要使用fmtlib,仅仅需要编译器支持C++11即可,如果版本不够,甚至最低只需要C++98。那么万事俱备只欠东风,让我们来尝试移植吧。

PlatformIO平台

使用Arduino作为框架

ESP8266芯片

移植{fmt}库

首先我们下载fmtlib的包,这里我们使用了最新的版本(9.1.0),下载完成之后将其解压到工程目录下的/lib/文件夹中。不过解压好之后不能直接使用,因为在PlatformIO平台下,所以我们需要先在fmtlib库的根目录下添加一个library.json文件。这里我们可以参考下面的书写方式:

{
@@ -163,6 +163,6 @@
 Restarting in 0 seconds...
 Restarting now.
 
- + diff --git a/posts/index.html b/posts/index.html index 2993451..0ac6a96 100644 --- a/posts/index.html +++ b/posts/index.html @@ -30,11 +30,11 @@ Posts | HalfSweet's Blog - - + + - + diff --git a/sitemap.xml b/sitemap.xml index c9ce6b1..3949e72 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1,3 +1,3 @@ -https://halfsweet.cn/2023-08-19T04:37:32.000Zdailyhttps://halfsweet.cn/about/2024-02-15T06:21:21.000Zdailyhttps://halfsweet.cn/friends/2024-01-05T12:10:17.000Zdailyhttps://halfsweet.cn/posts/Air32-HAL-MCO/2023-08-20T15:34:38.000Zdailyhttps://halfsweet.cn/posts/HelloWorld/2023-08-19T04:15:51.000Zdailyhttps://halfsweet.cn/posts/STC_CoreMark/2024-01-23T08:46:34.000Zdailyhttps://halfsweet.cn/posts/Air32-Clion/2023-09-01T14:34:52.000Zdailyhttps://halfsweet.cn/posts/Air32-HAL-HighFreq/2023-08-20T13:18:29.000Zdailyhttps://halfsweet.cn/posts/embedded_fmtlib/2023-08-19T04:15:51.000Zdailyhttps://halfsweet.cn/posts/conda_novelai/2023-08-19T04:15:51.000Zdailyhttps://halfsweet.cn/posts/EpdTraps1/2023-08-19T04:15:51.000Zdailyhttps://halfsweet.cn/posts/Empedded-CI-CD/2024-01-07T05:17:29.000Zdailyhttps://halfsweet.cn/posts/MDK6-Dev/2023-08-19T04:15:28.000Zdailyhttps://halfsweet.cn/posts/SEGGER-RTT/2023-08-19T04:15:51.000Zdaily \ No newline at end of file +https://halfsweet.cn/2023-08-19T04:37:32.000Zdailyhttps://halfsweet.cn/about/2024-02-15T10:37:21.000Zdailyhttps://halfsweet.cn/friends/2024-01-05T12:10:17.000Zdailyhttps://halfsweet.cn/posts/Air32-HAL-MCO/2023-08-20T15:34:38.000Zdailyhttps://halfsweet.cn/posts/HelloWorld/2023-08-19T04:15:51.000Zdailyhttps://halfsweet.cn/posts/STC_CoreMark/2024-01-23T08:46:34.000Zdailyhttps://halfsweet.cn/posts/Air32-Clion/2023-09-01T14:34:52.000Zdailyhttps://halfsweet.cn/posts/Air32-HAL-HighFreq/2023-08-20T13:18:29.000Zdailyhttps://halfsweet.cn/posts/embedded_fmtlib/2023-08-19T04:15:51.000Zdailyhttps://halfsweet.cn/posts/conda_novelai/2023-08-19T04:15:51.000Zdailyhttps://halfsweet.cn/posts/EpdTraps1/2023-08-19T04:15:51.000Zdailyhttps://halfsweet.cn/posts/Empedded-CI-CD/2024-01-07T05:17:29.000Zdailyhttps://halfsweet.cn/posts/MDK6-Dev/2023-08-19T04:15:28.000Zdailyhttps://halfsweet.cn/posts/SEGGER-RTT/2023-08-19T04:15:51.000Zdaily \ No newline at end of file diff --git a/star/index.html b/star/index.html index 5b00cb8..da75b61 100644 --- a/star/index.html +++ b/star/index.html @@ -30,11 +30,11 @@ 收藏 | HalfSweet's Blog - - + + - + diff --git a/tag/air001/index.html b/tag/air001/index.html index ad06618..0d6e2c7 100644 --- a/tag/air001/index.html +++ b/tag/air001/index.html @@ -30,14 +30,14 @@ 标签: Air001 | HalfSweet's Blog - - + +
跳至主要內容
嵌入式中的 CI/CD

对于传统的嵌入式开发来说,我们一般常用的IDE都是诸如Keil、IAR等。这些IDE在方便了我们的开发的同时,也存在很多问题,例如在之前Keil-MDK5是不能跨平台的,仅限在Windows平台运行,并且它的授权也是一个老大难的问题。这样我们在团队协作的时候往往就会遇到很多问题,无法像是互联网的开发那样有一套完整的CI/CD流程。但是MDK6的更新解决了这个问题,第一它是跨平台的,这样在Windows、Linux以及MacOS上都能运行;并且也支持了很多命令行的操作,避免了繁琐的GUI操作,这样也更有利于自动化脚本的编写。


HalfSweet大约 5 分钟单片机Air001合宙CI/CD
更现代的开发方式?使用 MDK6 进行开发

今日,在千呼万唤中,Arm 的 MDK6 桌面端终于出来了,本想作为第一批吃螃蟹的开发者,但是当时 Air32 和 Air001 的烧录均有问题,最后在 Arm 官方的支持下,终于可以正常使用了,那么现在我们就来尝试一下。


HalfSweet大约 2 分钟单片机Air001Air32合宙
更高效的日志查看方式——使用SEGGER-RTT

在日常的开发中,我们免不了使用各种各样的日志打印方式,使用调试器固然好用,但是无法直接打印局部变量以及会打断整个运行状态。并且对于众多Arduino的用户来说,直接打印日志显然是更直观的做法。但是直接使用串口打印的话需要一定的资源,并且速度会稍慢,并且可能会占用一个串口,对于资源就不多的MCU,我们有没有更方便的方法呢?


HalfSweet大约 3 分钟单片机Air001合宙日志
- + diff --git a/tag/air32/index.html b/tag/air32/index.html index c87cb62..0a1f099 100644 --- a/tag/air32/index.html +++ b/tag/air32/index.html @@ -30,8 +30,8 @@ 标签: Air32 | HalfSweet's Blog - - + +
跳至主要內容
使用 Clion 来进行 Air32 的开发

在上几篇文章中,我们将 HAL 库移植给了 Air32,但是我们的开发环境还是使用的 Keil,这样就会导致一些问题,比如 Keil 的代码提示不够友好,而且 Keil 的代码补全也不够完善,因此我们可以使用一个更好的开发环境,比如 Clion。

@@ -39,6 +39,6 @@

HalfSweet大约 3 分钟单片机Air32合宙MCO
发挥全部实力!Air32 在 HAL 库环境下运行最高主频

最近打算把 Air32 也吃上 Arduino,发挥全部性能,就不用像是 Air001 那样束手束脚了,但是问题是 Arduino 的库是基于 HAL 的,那要用上 Arduino 就必定得先适配 HAL 库,那我们就来先尝试在 HAL 下让 Air32 跑到最高主频吧。


HalfSweet大约 6 分钟单片机Air32合宙超频
更现代的开发方式?使用 MDK6 进行开发

今日,在千呼万唤中,Arm 的 MDK6 桌面端终于出来了,本想作为第一批吃螃蟹的开发者,但是当时 Air32 和 Air001 的烧录均有问题,最后在 Arm 官方的支持下,终于可以正常使用了,那么现在我们就来尝试一下。


HalfSweet大约 2 分钟单片机Air001Air32合宙
- + diff --git a/tag/arduino/index.html b/tag/arduino/index.html index 4770ae8..05ccfe8 100644 --- a/tag/arduino/index.html +++ b/tag/arduino/index.html @@ -30,12 +30,12 @@ 标签: Arduino | HalfSweet's Blog - - + +
跳至主要內容
在嵌入式设备上使用fmtlib

众所周知,在c++20以上的标准已经支持了std::format进行格式化输出,不过显而易见,嵌入式领域想要得到支持显然遥遥无期。但是我们已经厌倦了使用sprintf等方式来格式化字符串,c++的流特性又显得不够优雅,怎么才能用上类似于Python中format这样的方式来格式化并输出想要的字符串呢。


HalfSweet大约 5 分钟postsfmtlib嵌入式ESP8266ESP32ArduinoPlatformIOESP-IDF
- + diff --git a/tag/cicd/index.html b/tag/cicd/index.html index c99c811..70299a3 100644 --- a/tag/cicd/index.html +++ b/tag/cicd/index.html @@ -30,12 +30,12 @@ 标签: CI/CD | HalfSweet's Blog - - + +
跳至主要內容
嵌入式中的 CI/CD

对于传统的嵌入式开发来说,我们一般常用的IDE都是诸如Keil、IAR等。这些IDE在方便了我们的开发的同时,也存在很多问题,例如在之前Keil-MDK5是不能跨平台的,仅限在Windows平台运行,并且它的授权也是一个老大难的问题。这样我们在团队协作的时候往往就会遇到很多问题,无法像是互联网的开发那样有一套完整的CI/CD流程。但是MDK6的更新解决了这个问题,第一它是跨平台的,这样在Windows、Linux以及MacOS上都能运行;并且也支持了很多命令行的操作,避免了繁琐的GUI操作,这样也更有利于自动化脚本的编写。


HalfSweet大约 5 分钟单片机Air001合宙CI/CD
- + diff --git a/tag/clion/index.html b/tag/clion/index.html index fd3ca76..f22c488 100644 --- a/tag/clion/index.html +++ b/tag/clion/index.html @@ -30,12 +30,12 @@ 标签: Clion | HalfSweet's Blog - - + + - + diff --git a/tag/conda/index.html b/tag/conda/index.html index 8134cb2..f702f14 100644 --- a/tag/conda/index.html +++ b/tag/conda/index.html @@ -30,12 +30,12 @@ 标签: conda | HalfSweet's Blog - - + + - + diff --git a/tag/coremark/index.html b/tag/coremark/index.html index cb860d3..f3f67d6 100644 --- a/tag/coremark/index.html +++ b/tag/coremark/index.html @@ -30,13 +30,13 @@ 标签: CoreMark | HalfSweet's Blog - - + +
跳至主要內容
不服来跑个分?将 CoreMark 移植到 STC 上试试

最近维护的 Air001 准备上线了,为了衬托出其强大的性价比,因此我想来做点缺德的事,让我们来和同样以高打性价比的 STC 系列单片机来对比下 CoreMark 的跑分吧,本文将会详细介绍移植过程以及跑分结果。测试的 MCU 为降龙棍 STC32G12K128打狗棒 STC8H8K64U

通用,本文同样适用于 Arm-Cortex M 架构的 MCU。


HalfSweet大约 5 分钟单片机STC32STC8嵌入式CoreMark
- + diff --git a/tag/depg0750rwu790f30/index.html b/tag/depg0750rwu790f30/index.html index 02f6c25..48fca91 100644 --- a/tag/depg0750rwu790f30/index.html +++ b/tag/depg0750rwu790f30/index.html @@ -30,8 +30,8 @@ 标签: DEPG0750RWU790F30 | HalfSweet's Blog - - + +
跳至主要內容
墨水屏的坑——7.5寸墨水屏刷新为何出现条纹

前言

@@ -39,6 +39,6 @@

其中上面一张图为我自己做的波形,第二张为使用的OTP波形,但是无一例外,都出现了刷新的问题。抱着也许是驱动板出问题了的想法,我重新lay了一次板子,焊接好之后发现问题确实有所改善,但是并不佳。后续在更换过程中发现采用cd32封装的68uH的电感刷新效果会更好一些,但是依旧存在刷新问题,特别是在UI中有竖着的线条的时候,特别影响观感。


HalfSweet大约 7 分钟墨水屏墨水屏UC8179DEPG0750RWU790F30遇到的坑
- + diff --git a/tag/esp-idf/index.html b/tag/esp-idf/index.html index b9d6229..13973f1 100644 --- a/tag/esp-idf/index.html +++ b/tag/esp-idf/index.html @@ -30,12 +30,12 @@ 标签: ESP-IDF | HalfSweet's Blog - - + +
跳至主要內容
在嵌入式设备上使用fmtlib

众所周知,在c++20以上的标准已经支持了std::format进行格式化输出,不过显而易见,嵌入式领域想要得到支持显然遥遥无期。但是我们已经厌倦了使用sprintf等方式来格式化字符串,c++的流特性又显得不够优雅,怎么才能用上类似于Python中format这样的方式来格式化并输出想要的字符串呢。


HalfSweet大约 5 分钟postsfmtlib嵌入式ESP8266ESP32ArduinoPlatformIOESP-IDF
- + diff --git a/tag/esp32/index.html b/tag/esp32/index.html index 163bfdb..9fea83a 100644 --- a/tag/esp32/index.html +++ b/tag/esp32/index.html @@ -30,12 +30,12 @@ 标签: ESP32 | HalfSweet's Blog - - + +
跳至主要內容
在嵌入式设备上使用fmtlib

众所周知,在c++20以上的标准已经支持了std::format进行格式化输出,不过显而易见,嵌入式领域想要得到支持显然遥遥无期。但是我们已经厌倦了使用sprintf等方式来格式化字符串,c++的流特性又显得不够优雅,怎么才能用上类似于Python中format这样的方式来格式化并输出想要的字符串呢。


HalfSweet大约 5 分钟postsfmtlib嵌入式ESP8266ESP32ArduinoPlatformIOESP-IDF
- + diff --git a/tag/esp8266/index.html b/tag/esp8266/index.html index ce6e6a8..4a177a8 100644 --- a/tag/esp8266/index.html +++ b/tag/esp8266/index.html @@ -30,12 +30,12 @@ 标签: ESP8266 | HalfSweet's Blog - - + +
跳至主要內容
在嵌入式设备上使用fmtlib

众所周知,在c++20以上的标准已经支持了std::format进行格式化输出,不过显而易见,嵌入式领域想要得到支持显然遥遥无期。但是我们已经厌倦了使用sprintf等方式来格式化字符串,c++的流特性又显得不够优雅,怎么才能用上类似于Python中format这样的方式来格式化并输出想要的字符串呢。


HalfSweet大约 5 分钟postsfmtlib嵌入式ESP8266ESP32ArduinoPlatformIOESP-IDF
- + diff --git a/tag/fmtlib/index.html b/tag/fmtlib/index.html index 823266a..b964481 100644 --- a/tag/fmtlib/index.html +++ b/tag/fmtlib/index.html @@ -30,12 +30,12 @@ 标签: fmtlib | HalfSweet's Blog - - + +
跳至主要內容
在嵌入式设备上使用fmtlib

众所周知,在c++20以上的标准已经支持了std::format进行格式化输出,不过显而易见,嵌入式领域想要得到支持显然遥遥无期。但是我们已经厌倦了使用sprintf等方式来格式化字符串,c++的流特性又显得不够优雅,怎么才能用上类似于Python中format这样的方式来格式化并输出想要的字符串呢。


HalfSweet大约 5 分钟postsfmtlib嵌入式ESP8266ESP32ArduinoPlatformIOESP-IDF
- + diff --git a/tag/helloworld/index.html b/tag/helloworld/index.html index c5794e9..05bba1a 100644 --- a/tag/helloworld/index.html +++ b/tag/helloworld/index.html @@ -30,13 +30,13 @@ 标签: HelloWorld | HalfSweet's Blog - - + + - + diff --git a/tag/index.html b/tag/index.html index 6bc495c..f6f1236 100644 --- a/tag/index.html +++ b/tag/index.html @@ -30,11 +30,11 @@ 标签 | HalfSweet's Blog - - + + - + diff --git a/tag/mco/index.html b/tag/mco/index.html index 2406fb8..864b719 100644 --- a/tag/mco/index.html +++ b/tag/mco/index.html @@ -30,12 +30,12 @@ 标签: MCO | HalfSweet's Blog - - + + - + diff --git a/tag/novelai/index.html b/tag/novelai/index.html index bb23e24..c964c64 100644 --- a/tag/novelai/index.html +++ b/tag/novelai/index.html @@ -30,12 +30,12 @@ 标签: novelAI | HalfSweet's Blog - - + + - + diff --git a/tag/platformio/index.html b/tag/platformio/index.html index c21ce91..3dfa32a 100644 --- a/tag/platformio/index.html +++ b/tag/platformio/index.html @@ -30,12 +30,12 @@ 标签: PlatformIO | HalfSweet's Blog - - + +
跳至主要內容
在嵌入式设备上使用fmtlib

众所周知,在c++20以上的标准已经支持了std::format进行格式化输出,不过显而易见,嵌入式领域想要得到支持显然遥遥无期。但是我们已经厌倦了使用sprintf等方式来格式化字符串,c++的流特性又显得不够优雅,怎么才能用上类似于Python中format这样的方式来格式化并输出想要的字符串呢。


HalfSweet大约 5 分钟postsfmtlib嵌入式ESP8266ESP32ArduinoPlatformIOESP-IDF
- + diff --git a/tag/stc32/index.html b/tag/stc32/index.html index 17d4da2..54735cb 100644 --- a/tag/stc32/index.html +++ b/tag/stc32/index.html @@ -30,13 +30,13 @@ 标签: STC32 | HalfSweet's Blog - - + +
跳至主要內容
不服来跑个分?将 CoreMark 移植到 STC 上试试

最近维护的 Air001 准备上线了,为了衬托出其强大的性价比,因此我想来做点缺德的事,让我们来和同样以高打性价比的 STC 系列单片机来对比下 CoreMark 的跑分吧,本文将会详细介绍移植过程以及跑分结果。测试的 MCU 为降龙棍 STC32G12K128打狗棒 STC8H8K64U

通用,本文同样适用于 Arm-Cortex M 架构的 MCU。


HalfSweet大约 5 分钟单片机STC32STC8嵌入式CoreMark
- + diff --git a/tag/stc8/index.html b/tag/stc8/index.html index 0371b0f..42aaf45 100644 --- a/tag/stc8/index.html +++ b/tag/stc8/index.html @@ -30,13 +30,13 @@ 标签: STC8 | HalfSweet's Blog - - + +
跳至主要內容
不服来跑个分?将 CoreMark 移植到 STC 上试试

最近维护的 Air001 准备上线了,为了衬托出其强大的性价比,因此我想来做点缺德的事,让我们来和同样以高打性价比的 STC 系列单片机来对比下 CoreMark 的跑分吧,本文将会详细介绍移植过程以及跑分结果。测试的 MCU 为降龙棍 STC32G12K128打狗棒 STC8H8K64U

通用,本文同样适用于 Arm-Cortex M 架构的 MCU。


HalfSweet大约 5 分钟单片机STC32STC8嵌入式CoreMark
- + diff --git a/tag/uc8179/index.html b/tag/uc8179/index.html index ac1aa47..1861659 100644 --- a/tag/uc8179/index.html +++ b/tag/uc8179/index.html @@ -30,8 +30,8 @@ 标签: UC8179 | HalfSweet's Blog - - + +
跳至主要內容
墨水屏的坑——7.5寸墨水屏刷新为何出现条纹

前言

@@ -39,6 +39,6 @@

其中上面一张图为我自己做的波形,第二张为使用的OTP波形,但是无一例外,都出现了刷新的问题。抱着也许是驱动板出问题了的想法,我重新lay了一次板子,焊接好之后发现问题确实有所改善,但是并不佳。后续在更换过程中发现采用cd32封装的68uH的电感刷新效果会更好一些,但是依旧存在刷新问题,特别是在UI中有竖着的线条的时候,特别影响观感。


HalfSweet大约 7 分钟墨水屏墨水屏UC8179DEPG0750RWU790F30遇到的坑
- + diff --git "a/tag/\344\272\272\345\267\245\346\231\272\350\203\275/index.html" "b/tag/\344\272\272\345\267\245\346\231\272\350\203\275/index.html" index 367cb27..a7d77ff 100644 --- "a/tag/\344\272\272\345\267\245\346\231\272\350\203\275/index.html" +++ "b/tag/\344\272\272\345\267\245\346\231\272\350\203\275/index.html" @@ -30,12 +30,12 @@ 标签: 人工智能 | HalfSweet's Blog - - + + - + diff --git "a/tag/\345\220\210\345\256\231/index.html" "b/tag/\345\220\210\345\256\231/index.html" index e86c652..61947ed 100644 --- "a/tag/\345\220\210\345\256\231/index.html" +++ "b/tag/\345\220\210\345\256\231/index.html" @@ -30,8 +30,8 @@ 标签: 合宙 | HalfSweet's Blog - - + +
跳至主要內容
嵌入式中的 CI/CD

对于传统的嵌入式开发来说,我们一般常用的IDE都是诸如Keil、IAR等。这些IDE在方便了我们的开发的同时,也存在很多问题,例如在之前Keil-MDK5是不能跨平台的,仅限在Windows平台运行,并且它的授权也是一个老大难的问题。这样我们在团队协作的时候往往就会遇到很多问题,无法像是互联网的开发那样有一套完整的CI/CD流程。但是MDK6的更新解决了这个问题,第一它是跨平台的,这样在Windows、Linux以及MacOS上都能运行;并且也支持了很多命令行的操作,避免了繁琐的GUI操作,这样也更有利于自动化脚本的编写。

@@ -41,6 +41,6 @@

HalfSweet大约 6 分钟单片机Air32合宙超频
更现代的开发方式?使用 MDK6 进行开发

今日,在千呼万唤中,Arm 的 MDK6 桌面端终于出来了,本想作为第一批吃螃蟹的开发者,但是当时 Air32 和 Air001 的烧录均有问题,最后在 Arm 官方的支持下,终于可以正常使用了,那么现在我们就来尝试一下。


HalfSweet大约 2 分钟单片机Air001Air32合宙
更高效的日志查看方式——使用SEGGER-RTT

在日常的开发中,我们免不了使用各种各样的日志打印方式,使用调试器固然好用,但是无法直接打印局部变量以及会打断整个运行状态。并且对于众多Arduino的用户来说,直接打印日志显然是更直观的做法。但是直接使用串口打印的话需要一定的资源,并且速度会稍慢,并且可能会占用一个串口,对于资源就不多的MCU,我们有没有更方便的方法呢?


HalfSweet大约 3 分钟单片机Air001合宙日志
- + diff --git "a/tag/\345\242\250\346\260\264\345\261\217/index.html" "b/tag/\345\242\250\346\260\264\345\261\217/index.html" index 5462298..69bd822 100644 --- "a/tag/\345\242\250\346\260\264\345\261\217/index.html" +++ "b/tag/\345\242\250\346\260\264\345\261\217/index.html" @@ -30,8 +30,8 @@ 标签: 墨水屏 | HalfSweet's Blog - - + +
跳至主要內容
墨水屏的坑——7.5寸墨水屏刷新为何出现条纹

前言

@@ -39,6 +39,6 @@

其中上面一张图为我自己做的波形,第二张为使用的OTP波形,但是无一例外,都出现了刷新的问题。抱着也许是驱动板出问题了的想法,我重新lay了一次板子,焊接好之后发现问题确实有所改善,但是并不佳。后续在更换过程中发现采用cd32封装的68uH的电感刷新效果会更好一些,但是依旧存在刷新问题,特别是在UI中有竖着的线条的时候,特别影响观感。


HalfSweet大约 7 分钟墨水屏墨水屏UC8179DEPG0750RWU790F30遇到的坑
- + diff --git "a/tag/\345\265\214\345\205\245\345\274\217/index.html" "b/tag/\345\265\214\345\205\245\345\274\217/index.html" index b90eddd..de8c54b 100644 --- "a/tag/\345\265\214\345\205\245\345\274\217/index.html" +++ "b/tag/\345\265\214\345\205\245\345\274\217/index.html" @@ -30,14 +30,14 @@ 标签: 嵌入式 | HalfSweet's Blog - - + +
跳至主要內容
不服来跑个分?将 CoreMark 移植到 STC 上试试

最近维护的 Air001 准备上线了,为了衬托出其强大的性价比,因此我想来做点缺德的事,让我们来和同样以高打性价比的 STC 系列单片机来对比下 CoreMark 的跑分吧,本文将会详细介绍移植过程以及跑分结果。测试的 MCU 为降龙棍 STC32G12K128打狗棒 STC8H8K64U

通用,本文同样适用于 Arm-Cortex M 架构的 MCU。


HalfSweet大约 5 分钟单片机STC32STC8嵌入式CoreMark
在嵌入式设备上使用fmtlib

众所周知,在c++20以上的标准已经支持了std::format进行格式化输出,不过显而易见,嵌入式领域想要得到支持显然遥遥无期。但是我们已经厌倦了使用sprintf等方式来格式化字符串,c++的流特性又显得不够优雅,怎么才能用上类似于Python中format这样的方式来格式化并输出想要的字符串呢。


HalfSweet大约 5 分钟postsfmtlib嵌入式ESP8266ESP32ArduinoPlatformIOESP-IDF
- + diff --git "a/tag/\346\227\245\345\277\227/index.html" "b/tag/\346\227\245\345\277\227/index.html" index d13cfb9..97274a2 100644 --- "a/tag/\346\227\245\345\277\227/index.html" +++ "b/tag/\346\227\245\345\277\227/index.html" @@ -30,12 +30,12 @@ 标签: 日志 | HalfSweet's Blog - - + +
跳至主要內容
更高效的日志查看方式——使用SEGGER-RTT

在日常的开发中,我们免不了使用各种各样的日志打印方式,使用调试器固然好用,但是无法直接打印局部变量以及会打断整个运行状态。并且对于众多Arduino的用户来说,直接打印日志显然是更直观的做法。但是直接使用串口打印的话需要一定的资源,并且速度会稍慢,并且可能会占用一个串口,对于资源就不多的MCU,我们有没有更方便的方法呢?


HalfSweet大约 3 分钟单片机Air001合宙日志
- + diff --git "a/tag/\350\266\205\351\242\221/index.html" "b/tag/\350\266\205\351\242\221/index.html" index aeba1ae..a9b14bc 100644 --- "a/tag/\350\266\205\351\242\221/index.html" +++ "b/tag/\350\266\205\351\242\221/index.html" @@ -30,12 +30,12 @@ 标签: 超频 | HalfSweet's Blog - - + + - + diff --git "a/tag/\351\201\207\345\210\260\347\232\204\345\235\221/index.html" "b/tag/\351\201\207\345\210\260\347\232\204\345\235\221/index.html" index cf910d1..5c76dd9 100644 --- "a/tag/\351\201\207\345\210\260\347\232\204\345\235\221/index.html" +++ "b/tag/\351\201\207\345\210\260\347\232\204\345\235\221/index.html" @@ -30,8 +30,8 @@ 标签: 遇到的坑 | HalfSweet's Blog - - + +
跳至主要內容
墨水屏的坑——7.5寸墨水屏刷新为何出现条纹

前言

@@ -39,6 +39,6 @@

其中上面一张图为我自己做的波形,第二张为使用的OTP波形,但是无一例外,都出现了刷新的问题。抱着也许是驱动板出问题了的想法,我重新lay了一次板子,焊接好之后发现问题确实有所改善,但是并不佳。后续在更换过程中发现采用cd32封装的68uH的电感刷新效果会更好一些,但是依旧存在刷新问题,特别是在UI中有竖着的线条的时候,特别影响观感。


HalfSweet大约 7 分钟墨水屏墨水屏UC8179DEPG0750RWU790F30遇到的坑
- + diff --git a/timeline/index.html b/timeline/index.html index 007e9d3..b434602 100644 --- a/timeline/index.html +++ b/timeline/index.html @@ -30,11 +30,11 @@ 时间轴 | HalfSweet's Blog - - + + - +