﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-独望枫-随笔分类-学习笔记 </title><link>http://www.cppblog.com/LT450196683/category/21229.html</link><description>人在尘世间，有缘自相见，变化千千万，未开窍，已迷恋</description><language>zh-cn</language><lastBuildDate>Tue, 29 Mar 2022 21:31:20 GMT</lastBuildDate><pubDate>Tue, 29 Mar 2022 21:31:20 GMT</pubDate><ttl>60</ttl><item><title>如何生成单元覆盖率之覆盖率生成脚本化处理</title><link>http://www.cppblog.com/LT450196683/archive/2022/03/29/229263.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 29 Mar 2022 15:21:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2022/03/29/229263.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/229263.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2022/03/29/229263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/229263.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/229263.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文将生成覆盖率脚本化处理过程。<br><br>设计思路：通过脚本对qt工程进行编译并运行，然后再通过脚本收集必要的受关注的覆盖率信息进行生成覆盖率报告，最后查看报告。<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2022/03/29/229263.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/229263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2022-03-29 23:21 <a href="http://www.cppblog.com/LT450196683/archive/2022/03/29/229263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何生成单元覆盖率之生成单元测试覆盖率</title><link>http://www.cppblog.com/LT450196683/archive/2022/03/29/229262.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 29 Mar 2022 15:16:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2022/03/29/229262.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/229262.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2022/03/29/229262.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/229262.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/229262.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前文提到添加了编译参数 -fprofile-arcs 、 -ftest-coverage 已经生成了gcno文件，单元测试运行后也产生了gcda文件。<br><br>并且我们已经安装好lcov，那么该如何使用lcov来生成覆盖率报告呢？<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2022/03/29/229262.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/229262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2022-03-29 23:16 <a href="http://www.cppblog.com/LT450196683/archive/2022/03/29/229262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何生成单元覆盖率之lcov的介绍及安装</title><link>http://www.cppblog.com/LT450196683/archive/2022/03/29/229261.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 29 Mar 2022 15:11:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2022/03/29/229261.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/229261.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2022/03/29/229261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/229261.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/229261.html</trackback:ping><description><![CDATA[<p style="margin-top:5pt;margin-bottom:5pt;line-height:16pt;font-size:10.5pt"><a href="http://ltp.sourceforge.net/coverage/lcov.php"><span style="font-family: Calibri">lcov</span></a><span style="font-family:SimSun">的页面简介如下：</span></p>  <div style="direction:ltr">  <table border="0" cellpadding="0" cellspacing="0" valign="top" style="direction:ltr;  border-collapse:collapse;border-style:solid;border-color:#A3A3A3;border-width:  0pt">  <tbody><tr>   <td style="border-width:0pt;background-color:#E2F5FE;vertical-align:top;   width:8.4791in;padding:4pt 4pt 4pt 4pt">   <p style="margin-top:5pt;margin-bottom:5pt;line-height:16pt;font-family:Calibri;   font-size:10.5pt">LCOV is a graphical front-end for GCC's coverage   testing tool&nbsp;<a href="http://gcc.gnu.org/onlinedocs/gcc/Gcov.html">gcov</a>.   It collects gcov data for multiple source files and creates HTML pages   containing the source code annotated with coverage information. </p>   </td>  </tr> </tbody></table>  </div>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:16pt;font-size:10.5pt"><span style="font-family:SimSun">第一句就很明确的告诉我们，</span><span style="font-family:Calibri">lcov</span><span style="font-family:SimSun">是</span><span style="font-family:Calibri">GCC</span><span style="font-family:SimSun">覆盖率测试工具</span><span style="font-family:Calibri">gcov</span><span style="font-family:SimSun">的前端图形工具。</span></p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:16pt;font-size:10.5pt"><span style="font-family:SimSun">有些</span><span style="font-family:Calibri">Linux</span><span style="font-family:SimSun">版本的源提供了包直接安装，可以尝试使用对应包管理命令行直接安装</span></p>  <div style="direction:ltr">  <table border="0" cellpadding="0" cellspacing="0" valign="top" style="direction:ltr;  border-collapse:collapse;border-style:solid;border-color:#A3A3A3;border-width:  0pt">  <tbody><tr>   <td style="border-width:0pt;background-color:#E2F5FE;vertical-align:top;   width:8.759in;padding:4pt 4pt 4pt 4pt">   <p style="margin-top:5pt;margin-bottom:5pt;line-height:16pt;font-size:10.5pt"><span style="font-family:SimSun">一般情况下为</span> <span style="font-weight:bold;font-family:Calibri;background:yellow;">sudo apt install lcov</span> <span style="font-family:SimSun">或者</span> <span style="font-weight:bold;font-family:Calibri;background:yellow;">yum install lcov<br /></span><span style="font-family: Calibri; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial;"><em>(ps:直接用包安装的貌似没有firefox命令)</em></span></p>   </td>  </tr> </tbody></table>  </div>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:16pt;font-size:10.5pt"><span style="font-family:SimSun">如果源没有对应的</span><span style="font-family:Calibri">lcov</span><span style="font-family:SimSun">版本可以直接安装，那么就需要我们通过源码进行编译安装了。</span></p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:16pt;font-size:10.5pt"><span style="font-family:Calibri">lcov</span><span style="font-family:SimSun">项目可以从</span><a href="http://ltp.sourceforge.net/coverage/lcov.php"><span style="font-family: Calibri">sourceforge</span></a><span style="font-family:SimSun">下载，也可以从</span><a href="https://github.com/linux-test-project/lcov.git"><span style="font-family: Calibri">github</span></a><span style="font-family:SimSun">上下载。当前最新的版本是</span><span style="font-family:Calibri">1.15</span><span style="font-family:SimSun">，上述两个网址中，</span><span style="font-family:Calibri">sourceforge</span><span style="font-family:SimSun">只提供到</span><span style="font-family:Calibri">1.14</span><span style="font-family:SimSun">版本</span><span style="font-family:Calibri">(rpm</span><span style="font-family:SimSun">包及源码</span><span style="font-family:Calibri">)</span><span style="font-family:SimSun">的下载，</span><span style="font-family:Calibri">GitHub</span><span style="font-family:SimSun">则提供了最新</span><span style="font-family:Calibri">1.15</span><span style="font-family:SimSun">版本</span><span style="font-family:Calibri">(rpm</span><span style="font-family:SimSun">包及源码</span><span style="font-family:Calibri">)</span><span style="font-family:SimSun">。</span></p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:16pt;font-size:10.5pt"><span style="font-family:SimSun">可以直接下载</span><span style="font-family:Calibri">rpm</span><span style="font-family:SimSun">包进行安装，但技术人本着生命不息折腾不止的研</span><span style="font-family: Calibri">(zuo)</span><span style="font-family:SimSun">究</span><span style="font-family:Calibri">(si)</span><span style="font-family:SimSun">精神，偏向虎山行&#8212;&#8212;咱源码编译！</span></p>  <ol type="1" style="margin-left: 0.5833in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in; font-family: SimSun; font-size: 10.5pt;">  <li value="1" style="margin-top:0;margin-bottom:0;vertical-align:middle;      margin-top:5pt;margin-bottom:5pt;line-height:16pt;color:#767676"><span style="font-size: 10.5pt; color: black;">下载源码完成，解压后参照</span><span style="font-family: Calibri; font-size: 10.5pt; color: black;">README</span><span style="font-size: 10.5pt; color: black;">文档，进入到</span><span style="font-family: Calibri; font-size: 10.5pt; color: black;">lcov</span><span style="font-size: 10.5pt; color: black;">的目录<br /><img src="http://www.cppblog.com/images/cppblog_com/lt450196683/img/frame/gtest/coverage/lcov/lcov_dir.png" border="0" alt="" /><br /></span></li> </ol>  <ol type="1" style="margin-left: 0.5833in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in; font-family: Calibri; font-size: 10.5pt;">  <li value="2" style="margin-top:0;margin-bottom:0;vertical-align:middle;      margin-top:5pt;margin-bottom:5pt;line-height:16pt"><span style="font-family: SimSun; font-size: 10.5pt;">直接</span><span style="font-size: 10.5pt;">make install</span><span style="font-family: SimSun; font-size: 10.5pt;">一下<br /><img src="http://www.cppblog.com/images/cppblog_com/lt450196683/img/frame/gtest/coverage/lcov/make_install_failed.png" border="0" alt="" /><br /></span></li> </ol>  <ol type="1" style="margin-left: 0.5833in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in; font-family: Calibri; font-size: 10.5pt;">  <li value="3" style="margin-top:0;margin-bottom:0;vertical-align:middle;      margin-top:5pt;margin-bottom:5pt;line-height:16pt"><span style="font-family: SimSun; font-size: 10.5pt;">增加权限再</span><span style="font-size: 10.5pt;">make install</span><span style="font-family: SimSun; font-size: 10.5pt;">一下<br /><img src="http://www.cppblog.com/images/cppblog_com/lt450196683/img/frame/gtest/coverage/lcov/sudo_make_install_ok.png" border="0" alt="" /><br /></span></li> </ol>  <ol type="1" style="margin-left: 0.5833in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in; font-family: Calibri; font-size: 10.5pt;">  <li value="4" style="margin-top:0;margin-bottom:0;vertical-align:middle;      margin-top:5pt;margin-bottom:5pt;line-height:16pt"><span style="font-weight: bold; font-size: 10.5pt;">Done.</span>&nbsp;<span style="font-family: SimSun; font-size: 10.5pt;">成功了！</span><span style="font-size: 10.5pt;">so easy</span><span style="font-family: SimSun; font-size: 10.5pt;">。全文&#8230;&#8230;卒</span></li></ol><img src ="http://www.cppblog.com/LT450196683/aggbug/229261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2022-03-29 23:11 <a href="http://www.cppblog.com/LT450196683/archive/2022/03/29/229261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何生成单元覆盖率之gcov的介绍及启用</title><link>http://www.cppblog.com/LT450196683/archive/2022/03/29/229260.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 29 Mar 2022 15:07:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2022/03/29/229260.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/229260.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2022/03/29/229260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/229260.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/229260.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: gcov是一个代码覆盖率统计的工具。不用单独下载，伴随GCC一起发布(即你安装有GCC，也就有了gcov这个工具)。与GCC协同使用、分析被测代码，有助于创建更稳健的代码，并能发现程序中未经测试的部分。<br><br>基于gcov是隶属于GCC，所以其仅适用于使用GCC编译的代码……<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2022/03/29/229260.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/229260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2022-03-29 23:07 <a href="http://www.cppblog.com/LT450196683/archive/2022/03/29/229260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Gtest场景案例之函数有其他对象非虚函数如何单元测试</title><link>http://www.cppblog.com/LT450196683/archive/2022/03/27/229255.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Sun, 27 Mar 2022 14:47:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2022/03/27/229255.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/229255.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2022/03/27/229255.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/229255.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/229255.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 随着事物的接触越来越多，了解的越来越深入，我们总会发现一些新的问题或者不足。<br>就像前文提到的一样，我们在面对有对象的虚函数依赖的时候，可以使用gmock框架来为我们提供方便的模拟期望值，以便我们能撇除外界的影响(依赖)从逻辑上设计单元测试并持续的进行，但是并非所有对象的函数都设计成了虚函数，那么我们在面对依赖对象的非虚函数这个问题时，又该如何解决？<br>这个问题，已经有先行者遇到并且提出了解决方案：手动打桩、使用hook技术。<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2022/03/27/229255.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/229255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2022-03-27 22:47 <a href="http://www.cppblog.com/LT450196683/archive/2022/03/27/229255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Gtest场景案例之函数有其他对象虚函数依赖如何单元测试</title><link>http://www.cppblog.com/LT450196683/archive/2022/03/27/229254.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Sun, 27 Mar 2022 14:37:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2022/03/27/229254.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/229254.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2022/03/27/229254.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/229254.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/229254.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在面向对象的开发过程中，由于需要将各种属性或者事物按一定的规律抽象为独立的一个对象，然后按需进行调用，如此一来，对象之间的依赖便无可避免，设计不好更会产生双向依赖、交叉依赖等困境，那么我们在面对这种对象间依赖的情况下，该如何进行单元测试呢？&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2022/03/27/229254.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/229254.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2022-03-27 22:37 <a href="http://www.cppblog.com/LT450196683/archive/2022/03/27/229254.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Gtest场景案例之private成员函数如何单元测试</title><link>http://www.cppblog.com/LT450196683/archive/2022/03/27/229253.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Sun, 27 Mar 2022 14:31:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2022/03/27/229253.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/229253.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2022/03/27/229253.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/229253.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/229253.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 类的private函数相比public函数，测试套件定义的对象无法直接访问；相比protected函数，亦无法通过前文提到的FRIENT_TEST来使用，那么我们要怎么才能解决这个问题呢？&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2022/03/27/229253.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/229253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2022-03-27 22:31 <a href="http://www.cppblog.com/LT450196683/archive/2022/03/27/229253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Gtest场景案例之protected成员函数如何单元测试</title><link>http://www.cppblog.com/LT450196683/archive/2022/03/27/229252.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Sun, 27 Mar 2022 14:04:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2022/03/27/229252.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/229252.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2022/03/27/229252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/229252.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/229252.html</trackback:ping><description><![CDATA[<p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-size:11.0pt"><span style="font-family:SimSun">类的</span><span style="font-family:Calibri">protected</span><span style="font-family:SimSun">函数相比</span><span style="font-family:Calibri">public</span><span style="font-family:SimSun">函数，测试套件定义的对象无法直接访问，</span><span style="font-family: Calibri">gtest</span><span style="font-family:SimSun">提供了一个宏</span><span style="font-family:Calibri">FRIENT_TEST</span><span style="font-family:SimSun">，这个宏定义如下：</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><strong><span style="color:#C586C0">#define</span><span style="color:#569CD6"> FRIEND_TEST(</span><span style="color:#72A1BA">test_case_name</span><span style="color:#569CD6">, </span><span style="color:#72A1BA">test_name</span><span style="color:#569CD6">)</span><span style="color:#AB9464">\</span></strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><strong><span style="color:#569CD6">friend</span> <span style="color:#569CD6">class</span> <span style="color:#47B7A0">test_case_name</span><span style="color:#72A1BA">##_##test_name##_Test</span></strong></p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-size:11.0pt"><span style="font-family:SimSun">可以见到其实现，主要是将测试用例名及测试名链接起来当成是被测类的友元类</span><span style="font-family:Calibri">[gtest</span><span style="font-family:SimSun">在运行时会自动将每个用例生成一个类进行运行</span><span style="font-family:Calibri">]</span><span style="font-family:SimSun">。</span></p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-family:Calibri; font-size:11.0pt;color:#767676">&nbsp;</p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-size:11.0pt"><span style="font-family:SimSun">继续使用</span><a href="http://www.cppblog.com/LT450196683/archive/2022/03/27/229251.html"><span style="font-family:SimSun">前文</span></a><span style="font-family: SimSun">使用到的</span><span style="font-family:Calibri">model</span><span style="font-family:SimSun">作为例子，此处增加一个</span><span style="font-family: Calibri">protected</span><span style="font-family:SimSun">的成员方法</span><span style="font-family:Calibri">F</span><span style="font-family:SimSun">actorial(</span><span style="font-family: SimSun">该方法同样借用自</span><span style="font-family:SimSun">gtest</span><span style="font-family:SimSun">官方示例</span><span style="font-family:SimSun">)</span><span style="font-family:SimSun">：</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#569CD6">class</span> <span style="color:#47B7A0">model</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797">{</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#569CD6">private:</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#47B7A0">device</span><span style="color:#979797">* </span><span style="color:#72A1BA">_pdevice</span><span style="color:#979797">;</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#47B7A0">network</span><span style="color:#979797">* </span><span style="color:#72A1BA">_pnetwork</span><span style="color:#979797">;</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#569CD6">public:</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#989875">model</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#989875">~model</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">void</span> <span style="color:#989875">printmodelinfo</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">void</span> <span style="color:#989875">printmodelverion</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">void</span> <span style="color:#989875">printmodeldeviceinfo</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">void</span> <span style="color:#989875">printmodeldeviceversion</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">void</span> <span style="color:#989875">printmodeldeviceserial</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">void</span> <span style="color:#989875">printallinfo</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797">&nbsp; &nbsp; </p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">bool</span> <span style="color:#989875">showImg</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">bool</span> <span style="color:#989875">showData</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">bool</span> <span style="color:#989875">IsPrime</span><span style="color:#979797">(</span><span style="color:#569CD6">int</span> <span style="color:#72A1BA">n</span><span style="color:#979797">);</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#569CD6"><strong>protected:</strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><strong><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">int</span> <span style="color:#989875">Factorial</span><span style="color:#979797">(</span><span style="color:#569CD6">int</span> <span style="color:#72A1BA">n</span><span style="color:#979797">);</span></strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797">};</p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-family:Calibri; font-size:11.0pt;color:#767676">&nbsp;</p>  <p style="margin:0in;font-family:&quot;Microsoft YaHei&quot;;font-size:11.0pt">下面来看看具体如何实施。</p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-size:11.0pt"><span style="font-family:Calibri">1.</span><span style="font-family:SimSun">首先构建测试套件，定义一个继承自</span><span style="font-family:Calibri">testing::Test</span><span style="font-family:SimSun">的类</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#569CD6">class</span> <span style="color:#47B7A0">modelTest</span><span style="color:#979797"> : </span><span style="color:#569CD6">public</span> <span style="color:#47B7A0">testing</span><span style="color:#979797">::</span><span style="color:#47B7A0">Test</span><span style="color:#979797"> {</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#569CD6">protected:</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797">};</p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-size:11.0pt"><span style="font-family:Calibri">2.</span><span style="font-family:SimSun">同样需要复写</span><span style="font-family:Calibri">SetUp/TearDown</span><span style="font-family:SimSun">两个函数</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#569CD6">class</span> <span style="color:#47B7A0">modelTest</span><span style="color:#979797"> : </span><span style="color:#569CD6">public</span> <span style="color:#47B7A0">testing</span><span style="color:#979797">::</span><span style="color:#47B7A0">Test</span><span style="color:#979797"> {</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#569CD6">protected:</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><strong><span style="color:#569CD6">void</span> <span style="color:#989875">SetUp</span><span style="color:#979797">() </span><span style="color:#569CD6">override</span><span style="color:#979797"> {</span></strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797"><strong>&nbsp; &nbsp; &nbsp; &nbsp; </strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797"><strong>&nbsp; &nbsp; }</strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><strong><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">void</span> <span style="color:#989875">TearDown</span><span style="color:#979797">() </span><span style="color:#569CD6">override</span><span style="color:#979797"> {</span></strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797"><strong>&nbsp; &nbsp; &nbsp; &nbsp; </strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797"><strong>&nbsp; &nbsp; }</strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797">};</p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-size:11.0pt"><span style="font-family:Calibri">3.</span><span style="font-family:SimSun">定义想要测试单元测试需要用到的数据，并在</span><span style="font-family:Calibri">SetUp</span><span style="font-family:SimSun">进行初始化，在</span><span style="font-family:Calibri">TearDown</span><span style="font-family:SimSun">中进行清理或析构。</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#569CD6">class</span> <span style="color:#47B7A0">modelTest</span><span style="color:#979797"> : </span><span style="color:#569CD6">public</span> <span style="color:#47B7A0">testing</span><span style="color:#979797">::</span><span style="color:#47B7A0">Test</span><span style="color:#979797"> {</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#569CD6">protected:</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">void</span> <span style="color:#989875">SetUp</span><span style="color:#979797">() </span><span style="color:#569CD6">override</span><span style="color:#979797"> {</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; &nbsp; &nbsp; </span><strong><span style="color:#72A1BA">pm</span><span style="color:#979797"> = </span><span style="color:#C586C0">new</span> <span style="color:#47B7A0">model</span><span style="color:#979797">;</span></strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797">&nbsp; &nbsp; }</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">void</span> <span style="color:#989875">TearDown</span><span style="color:#979797">() </span><span style="color:#569CD6">override</span><span style="color:#979797"> {</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; &nbsp; &nbsp; </span><strong><span style="color:#C586C0">if</span><span style="color:#979797"> (</span><span style="color:#72A1BA">pm</span><span style="color:#979797">) {</span></strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><strong><span style="color:#979797">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color:#C586C0">delete</span> <span style="color:#72A1BA">pm</span><span style="color:#979797">;</span></strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><strong><span style="color:#979797">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color:#72A1BA">pm</span><span style="color:#979797"> = </span><span style="color:#569CD6">NULL</span><span style="color:#979797">;</span></strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797"><strong>&nbsp; &nbsp; &nbsp; &nbsp; }</strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797">&nbsp; &nbsp; }</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><strong><span style="color:#47B7A0">model</span><span style="color:#979797">* </span><span style="color:#72A1BA">pm</span><span style="color:#979797">;</span></strong></p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-family:Calibri; font-size:11.0pt">};</p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-size:11.0pt"><span style="font-family:Calibri">4.</span><span style="font-family:SimSun">通过</span><span style="font-family:Calibri">TEST_F</span><span style="font-family:SimSun">宏定义想要测试的类的</span><span style="font-family:Calibri">protected</span><span style="font-family:SimSun">函数的测试用例</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#6A9955">// Tests factorial of negative numbers.</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#569CD6">TEST_F</span><span style="color:#979797">(</span><span style="color:#47B7A0">modelTest</span><span style="color:#979797">, Negative) {</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#6A9955">&nbsp; // This test is named "Negative", and belongs to the "FactorialTest"</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#6A9955">&nbsp; // test case.</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">&nbsp;<span style="color:#569CD6">EXPECT_EQ</span><span style="color:#979797">(</span><span style="color:#899C7F">1</span><span style="color:#979797">, </span><span style="color:#72A1BA">pm</span><span style="color:#979797">-&gt;</span><span style="color:#989875">Factorial</span><span style="color:#979797">(-</span><span style="color:#899C7F">5</span><span style="color:#979797">));</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">&nbsp;<span style="color:#569CD6">EXPECT_EQ</span><span style="color:#979797">(</span><span style="color:#899C7F">1</span><span style="color:#979797">, </span><span style="color:#72A1BA">pm</span><span style="color:#979797">-&gt;</span><span style="color:#989875">Factorial</span><span style="color:#979797">(-</span><span style="color:#899C7F">1</span><span style="color:#979797">));</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">&nbsp;<span style="color:#569CD6">EXPECT_GT</span><span style="color:#979797">(</span><span style="color:#72A1BA">pm</span><span style="color:#979797">-&gt;</span><span style="color:#989875">Factorial</span><span style="color:#979797">(-</span><span style="color:#899C7F">10</span><span style="color:#979797">), </span><span style="color:#899C7F">0</span><span style="color:#979797">);</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797">}</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#6A9955">// Tests factorial of 0.</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#569CD6">TEST_F</span><span style="color:#979797">(</span><span style="color:#47B7A0">modelTest</span><span style="color:#979797">, Zero) {</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">&nbsp;<span style="color:#569CD6">EXPECT_EQ</span><span style="color:#979797">(</span><span style="color:#899C7F">1</span><span style="color:#979797">, </span><span style="color:#72A1BA">pm</span><span style="color:#979797">-&gt;</span><span style="color:#989875">Factorial</span><span style="color:#979797">(</span><span style="color:#899C7F">0</span><span style="color:#979797">));</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797">}</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#6A9955">// Tests factorial of positive numbers.</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#569CD6">TEST_F</span><span style="color:#979797">(</span><span style="color:#47B7A0">modelTest</span><span style="color:#979797">, Positive) {</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">&nbsp;<span style="color:#569CD6">EXPECT_EQ</span><span style="color:#979797">(</span><span style="color:#899C7F">1</span><span style="color:#979797">, </span><span style="color:#72A1BA">pm</span><span style="color:#979797">-&gt;</span><span style="color:#989875">Factorial</span><span style="color:#979797">(</span><span style="color:#899C7F">1</span><span style="color:#979797">));</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">&nbsp;<span style="color:#569CD6">EXPECT_EQ</span><span style="color:#979797">(</span><span style="color:#899C7F">2</span><span style="color:#979797">, </span><span style="color:#72A1BA">pm</span><span style="color:#979797">-&gt;</span><span style="color:#989875">Factorial</span><span style="color:#979797">(</span><span style="color:#899C7F">2</span><span style="color:#979797">));</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">&nbsp;<span style="color:#569CD6">EXPECT_EQ</span><span style="color:#979797">(</span><span style="color:#899C7F">6</span><span style="color:#979797">, </span><span style="color:#72A1BA">pm</span><span style="color:#979797">-&gt;</span><span style="color:#989875">Factorial</span><span style="color:#979797">(</span><span style="color:#899C7F">3</span><span style="color:#979797">));</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">&nbsp;<span style="color:#569CD6">EXPECT_EQ</span><span style="color:#979797">(</span><span style="color:#899C7F">40320</span><span style="color:#979797">, </span><span style="color:#72A1BA">pm</span><span style="color:#979797">-&gt;</span><span style="color:#989875">Factorial</span><span style="color:#979797">(</span><span style="color:#899C7F">8</span><span style="color:#979797">));</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797">}</p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-family:SimSun; font-size:11.0pt">此时运行的话，系统会报错：</p>  <p style="margin:0in;font-family:&quot;Microsoft YaHei&quot;;font-size:11.0pt"><img src="http://www.cppblog.com/images/cppblog_com/lt450196683/img/frame/gtest/protected_func/err_func_is_protected.png" border="0" alt="" />&nbsp;</p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-size:11.0pt"><span style="font-family:SimSun">面对这个问题，第一，我们可以先尝试应用</span><span style="font-family: Calibri">gtest</span><span style="font-family:SimSun">提供的宏</span><span style="font-family:Calibri">FRIEND_TEST</span><span style="font-family:SimSun">：</span></p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-size:11.0pt"><span style="font-family:SimSun">首先，我们需要在被测类</span><span style="font-family:Calibri">model</span><span style="font-family:SimSun">中，使用</span><span style="font-family:Calibri">FRIEND_TEST</span><span style="font-family:SimSun">将我们需要使用到的</span><span style="font-family:Calibri">testname</span><span style="font-family:SimSun">注册进来</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#569CD6">class</span> <span style="color:#47B7A0">model</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797">{</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#569CD6">private:</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#47B7A0">device</span><span style="color:#979797">* </span><span style="color:#72A1BA">_pdevice</span><span style="color:#979797">;</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#47B7A0">network</span><span style="color:#979797">* </span><span style="color:#72A1BA">_pnetwork</span><span style="color:#979797">;</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#569CD6">public:</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#989875">model</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#989875">~model</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">void</span> <span style="color:#989875">printmodelinfo</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">void</span> <span style="color:#989875">printmodelverion</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">void</span> <span style="color:#989875">printmodeldeviceinfo</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">void</span> <span style="color:#989875">printmodeldeviceversion</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">void</span> <span style="color:#989875">printmodeldeviceserial</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">void</span> <span style="color:#989875">printallinfo</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797">&nbsp; &nbsp; </p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">bool</span> <span style="color:#989875">showImg</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">bool</span> <span style="color:#989875">showData</span><span style="color:#979797">();</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">bool</span> <span style="color:#989875">IsPrime</span><span style="color:#979797">(</span><span style="color:#569CD6">int</span> <span style="color:#72A1BA">n</span><span style="color:#979797">);</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#569CD6">protected:</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#979797">&nbsp; &nbsp; </span><span style="color:#569CD6">int</span> <span style="color:#989875">Factorial</span><span style="color:#979797">(</span><span style="color:#569CD6">int</span> <span style="color:#72A1BA">n</span><span style="color:#979797">);</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">&nbsp;</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><strong><span style="color:#989875">FRIEND_TEST</span><span style="color:#979797">(</span><span style="color:#47B7A0">modelTest</span><span style="color:#979797">, </span><span style="color:#47B7A0">Negative</span><span style="color:#979797">);</span></strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><strong><span style="color:#989875">FRIEND_TEST</span><span style="color:#979797">(</span><span style="color:#47B7A0">modelTest</span><span style="color:#979797">, </span><span style="color:#47B7A0">Zero</span><span style="color:#979797">);</span></strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><strong><span style="color:#989875">FRIEND_TEST</span><span style="color:#979797">(</span><span style="color:#47B7A0">modelTest</span><span style="color:#979797">, </span><span style="color:#47B7A0">Positive</span><span style="color:#979797">);</span></strong></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#979797">};</p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-size:11.0pt"><span style="font-family:SimSun">其次，我们需要将</span><span style="font-family:Calibri">FRIEND_TEST</span><span style="font-family:SimSun">宏定义的头文件包含进来</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#C586C0">#include</span> <span style="color:#CB8F76">"gtest/gtest_prod.h"</span></p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-family:SimSun; font-size:11.0pt">最后，运行测试用例，成功运行<br /><br /><img src="http://www.cppblog.com/images/cppblog_com/lt450196683/img/frame/gtest/protected_func/protected_func_unittest_runok.png" border="0" alt="" /></p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-size:11.0pt"><span style="font-family:SimSun">由于需要改动到非测试的源码，而我们工程源码中不一定有包含到</span><span style="font-family:SimSun">gtest</span><span style="font-family: SimSun">相关的内容，很有可能会导致源工程编译出错，所以我们可以在</span><span style="font-family: Calibri">*.pro</span><span style="font-family:SimSun">文件中，增加一个宏定义</span></p>  <div style="direction:ltr">  <table border="0" cellpadding="0" cellspacing="0" valign="top" style="direction:ltr;  border-collapse:collapse;border-style:solid;border-color:#A3A3A3;border-width:  0pt">  <tbody><tr>   <td style="border-width:0pt;background-color:#E2F5FE;vertical-align:top;   width:8.4791in;padding:4pt 4pt 4pt 4pt">   <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-family:Calibri;   font-size:11.0pt">DEFINES += UT </p>   </td>  </tr> </tbody></table>  </div>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-size:11.0pt"><span style="font-family:SimSun">然后再在被测试类</span><span style="font-family:Calibri">model</span><span style="font-family:SimSun">中，对新增的</span><span style="font-family:Calibri">FRIEND_TEST</span><span style="font-family:SimSun">及其头文件，可以使用预编译处理</span></p>  <div style="direction:ltr">  <table border="0" cellpadding="0" cellspacing="0" valign="top" style="direction:ltr;  border-collapse:collapse;border-style:solid;border-color:#A3A3A3;border-width:  0pt">  <tbody><tr>   <td style="border-width:0pt;background-color:#E2F5FE;vertical-align:top;   width:8.7729in;padding:4pt 4pt 4pt 4pt">   <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#C586C0">#ifdef</span><span style="color:#569CD6"> UT</span></p>   <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#C586C0">#include</span> <span style="color:#CB8F76">"gtest/gtest_prod.h"</span></p>   <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#C586C0">#endif</span><span style="color:#6A9955"> &nbsp;// UT</span></p>   <p style="margin:0in;font-family:SimSun;font-size:10.5pt;color:#6A9955">&nbsp;</p>   <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#C586C0">#ifdef</span><span style="color:#569CD6"> UT</span></p>   <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#989875">FRIEND_TEST</span><span style="color:#979797">(</span><span style="color:#47B7A0">modelTest</span><span style="color:#979797">, </span><span style="color:#47B7A0">Negative</span><span style="color:#979797">);</span></p>   <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#989875">FRIEND_TEST</span><span style="color:#979797">(</span><span style="color:#47B7A0">modelTest</span><span style="color:#979797">, </span><span style="color:#47B7A0">Zero</span><span style="color:#979797">);</span></p>   <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#989875">FRIEND_TEST</span><span style="color:#979797">(</span><span style="color:#47B7A0">modelTest</span><span style="color:#979797">, </span><span style="color:#47B7A0">Positive</span><span style="color:#979797">);</span></p>   <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#C586C0">#endif</span><span style="color:#6A9955"> &nbsp;// UT</span></p>   </td>  </tr> </tbody></table>  </div>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-family:SimSun; font-size:11.0pt">这样就可以使得源工程编译不受单元测试新增处理的影响。但是</p>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-family:SimSun; font-size:11.0pt">这里要说但是了&#8230;&#8230;这样的测试会改动到我们的源码，是侵入式的，很令人不爽。所以这里可以使用一种更取巧的方式：</p>  <div style="direction:ltr">  <table border="0" cellpadding="0" cellspacing="0" valign="top" style="direction:ltr;  border-collapse:collapse;border-style:solid;border-color:#A3A3A3;border-width:  0pt">  <tbody><tr>   <td style="border-width:0pt;background-color:#E2F5FE;vertical-align:top;   width:9.0666in;padding:4pt 4pt 4pt 4pt">   <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#C586C0">#ifdef</span><span style="color:#569CD6"> UT</span></p>   <p style="margin:0in;font-family:Calibri;font-size:10.5pt;color:#C586C0">#define protected public</p>   <p style="margin:0in;font-family:Calibri;font-size:10.5pt;color:#C586C0">#define private public</p>   <p style="margin:0in;font-family:SimSun;font-size:10.5pt"><span style="color:#C586C0">#endif</span><span style="color:#6A9955"> &nbsp;// UT</span></p>   </td>  </tr> </tbody></table>  </div>  <p style="margin-top:5pt;margin-bottom:5pt;line-height:17pt;font-family:SimSun; font-size:11.0pt">简单、直接、粗暴&#8230;&#8230;但有效，而且修改不影响到原有类，可以统一在某个都引用到的头文件中，那么一次添加，后人乘凉啊</p>  <p style="margin:0in;font-family:Calibri;font-size:11.0pt;color:#767676">&nbsp;</p>  <span style="font-family:SimSun">对应的</span><span style="font-family:Calibri">demo</span><span style="font-family:SimSun">源码</span><span style="font-family:Calibri">,</span><span style="font-family:SimSun">请点击</span><a href="https://github.com/git45016683/utdemo/tree/protected"><span style="font-family:Calibri">protectedFunc</span></a><img src ="http://www.cppblog.com/LT450196683/aggbug/229252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2022-03-27 22:04 <a href="http://www.cppblog.com/LT450196683/archive/2022/03/27/229252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Gtest场景案例之public成员函数如何单元测试</title><link>http://www.cppblog.com/LT450196683/archive/2022/03/27/229251.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Sun, 27 Mar 2022 13:36:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2022/03/27/229251.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/229251.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2022/03/27/229251.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/229251.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/229251.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 类的public函数在面向对象编程中是最常见亦是最常规的函数，但是其单元测试的展开跟普通函数并无二致[这里指的是没有其他对象依赖的情况，有依赖的场景请参考本系列的有依赖对象的场景文章]，下面来看看具体如何实施。&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2022/03/27/229251.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/229251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2022-03-27 21:36 <a href="http://www.cppblog.com/LT450196683/archive/2022/03/27/229251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Gtest场景案例之普通函数如何单元测试</title><link>http://www.cppblog.com/LT450196683/archive/2022/03/27/229250.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Sun, 27 Mar 2022 13:17:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2022/03/27/229250.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/229250.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2022/03/27/229250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/229250.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/229250.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 普通函数在该 [gtest场景案例] 系列中,指的是普通的全局函数,既没有public等权限关键字,也没有static/const等关键字.&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2022/03/27/229250.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/229250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2022-03-27 21:17 <a href="http://www.cppblog.com/LT450196683/archive/2022/03/27/229250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Gtest场景案例系列</title><link>http://www.cppblog.com/LT450196683/archive/2022/03/27/229249.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Sun, 27 Mar 2022 12:34:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2022/03/27/229249.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/229249.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2022/03/27/229249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/229249.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/229249.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 新的单位有推进单元测试的项目，计划选中的框架刚好是以前有用到的gtest。<br><br>于是将以前零碎记录的文章整理一下，按单元测试中常见的、典型的场景进行分类，针对不同场景下如何使用gtest进行展开，如有纰漏，欢迎各位交流及指出。<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2022/03/27/229249.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/229249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2022-03-27 20:34 <a href="http://www.cppblog.com/LT450196683/archive/2022/03/27/229249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RTOS调研学习系列汇总</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217759.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 18:41:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217759.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217759.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217759.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217759.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217759.html</trackback:ping><description><![CDATA[<h4>RTOS尝试的缘由</h4>
公司转型新能源已有两年多，不说整个BCM的模块拓扑的变更迭代组合，软件方面的框架也由第一年的纯手写代码迭代到第二年的手写驱动外加搭建业务功能模型的方式实现，但了解越深就越发觉距离实际车企开发的流程/框架/方式等都还有越来越远的差距，就别提距离实际产品量产的天文距离了。 <br />
因为车企所认可的AUTOSAR/OSEK电子系统架构都是有实时系统相关的重要组成部分，于是在新能源的第三年，计划引入RTOS相关的内容，作为一个预研的尝试方向。 <br />
<br />
<h4>选型问题</h4>
本次RTOS的选型调研系列，主要定在了RT-Thread和FreeRTOS，一个是国内出品社区发展良好的实时系统，另一个则是世界知名的开源实时系统了。至于为什么不用AUTOSAR/OSEK体系内认可的实时系统？ <br />
一是实时系统的原理及思想基本上是统一的，学习上述两个，相关的知识点基本可以学习了解到； <br />
二是，预研阶段，能达成学习认知了解的基本目标，就先不投入额外的金钱成本&#8230;&#8230;除非产品目标已经非常明确。<br />
三是一个是新近创建的实时系统(2011年发布)，一个则是老牌知名实时系统(2002年发布)了，可以通过两者了解对比，观摩一下大型开源系统的迭代历史<br />
<br />
<h4>RT-Thread入门体验系列</h4>
RT-Thread Chapter 1 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/13/217740.html">入门体验</a><br />
RT-Thread Chapter 2 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/13/217742.html">添加命令行组件(Finsh)</a><br />
RT-Thread Chapter 3 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217743.html">线程间同步之互斥量</a><br />
RT-Thread Chapter 4 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217744.html">线程间同步之信号量</a><br />
RT-Thread Chapter 5 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217745.html">线程间同步之事件集</a><br />
RT-Thread Chapter 6 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217746.html">线程间通信之邮箱</a><br />
RT-Thread Chapter 7 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217747.html">线程间通信之消息队列</a><br />
RT-Thread Chapter 8 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217748.html">定时器</a><br />
RT-Thread Chapter 9 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217749.html">线程池</a><br />
<br />
<h4>FreeRTOS入门体验系列</h4>
FreeRTOS Chapter 1 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217750.html">入门体验</a><br />
FreeRTOS Chapter 2 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217751.html">添加命令行实现</a><br />
FreeRTOS Chapter 3 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217752.html">线程间同步之互斥量</a><br />
FreeRTOS Chapter 4 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217753.html">线程间同步之临界区</a><br />
FreeRTOS Chapter 5 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217754.html">线程间通信之信号量</a><br />
FreeRTOS Chapter 6 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217755.html">线程间通信之消息队列</a><br />
FreeRTOS Chapter 7 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217756.html">线程间通信之事件</a><br />
FreeRTOS Chapter 8 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217757.html">线程间通信之任务通知</a><br />
FreeRTOS Chapter 9 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217758.html">定时器</a><br />
<br />
<h4>示例资源集合</h4>
<h6 id="toc_0">RT-Thread类</h6>
<ul>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/rtt_try_to_experience.zip">RT-Thread入门体验</a></li>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/rtt_finsh.zip">RT-Thread添加命令行组件(Finsh)</a></li>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/rtt_sync_metux.zip">RT-Thread线程间同步之互斥量</a></li>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/rtt_sync_semaphore.zip">RT-Thread线程间同步之信号量</a></li>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/rtt_sync_event.zip">RT-Thread线程间同步之事件集</a></li>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/rtt_communication_mailbox.zip">RT-Thread线程间通信之邮箱</a></li>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/rtt_communication_msgque.zip">RT-Thread线程间通信之消息队列</a></li>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/rtt_threadpool.zip">RT-Thread线程池</a></li>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/rtt_timer.zip">RT-Thread定时器</a></li>
</ul>
<h6 id="toc_1">FreeRTOS类</h6>
<ul>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/freertos_try_to_experience.zip">FreeRTOS入门体验</a></li>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/freertos_command_line.zip">FreeRTOS添加命令行实现</a></li>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/freertos_sync_critical.zip">FreeRTOS线程间同步之临界区</a></li>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/freertos_sync_metux.zip">FreeRTOS线程间同步之互斥量</a></li>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/freertos_sync_semaphore.zip">FreeRTOS线程间同步之信号量</a></li>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/freertos_communication_event.zip">FreeRTOS线程间通信之事件</a></li>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/freertos_communication_notify.zip">FreeRTOS线程间通信之任务通知</a></li>
     <li><a href="https://github.com/git45016683/RtosExPro/archive/refs/tags/freertos_timer.zip">FreeRTOS定时器</a></li>
</ul><img src ="http://www.cppblog.com/LT450196683/aggbug/217759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 02:41 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeRTOS 定时器</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217758.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 18:29:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217758.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217758.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217758.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217758.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 主要是FreeRTOS的定时器使用示例，及过程中的一些错误解决。<br>定时器实现方式包含动态、静态。&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/14/217758.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 02:29 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeRTOS 线程间通信之任务通知</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217757.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 18:24:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217757.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217757.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217757.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217757.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 任务通知<br>> 每个RTOS任务都有一个32位的通知值，任务创建时，这个值被初始化为0。RTOS任务通知相当于直接向任务发送一个事件，接收到通知的任务可以解除阻塞状态，前提是这个阻塞事件是因等待通知而引起的。发送通知的同时，也可以可选的改变接收任务的通知值。<br>   可以通过下列方法向接收任务更新通知：<br>○ 不覆盖接收任务的通知值<br>○ 覆盖接收任务的通知值<br>○ 设置接收任务通知值的某些位<br>○ 增加接收任务的通知值&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/14/217757.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 02:24 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeRTOS 线程间通信之事件</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217756.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 18:20:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217756.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217756.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217756.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217756.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217756.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: FreeRTOS线程间通信的方式之一，事件。<br>事件依赖于动态申请内存，只要开启了该宏，事件相关的功能同时被开启，但如果要使用事件相关的宏/函数，还需要添加对应的头文件……&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/14/217756.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 02:20 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeRTOS 线程间通信之消息队列</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217755.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 18:17:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217755.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217755.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217755.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217755.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: FreeRTOS的线程间通信方式之一，消息队列。<br>demo示例包含动态和静态创建消息队列……&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/14/217755.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 02:17 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeRTOS 线程间通信之信号量</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217754.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 18:12:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217754.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217754.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217754.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217754.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217754.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: FreeRTOS的线程间通信方式之一，信号量。<br>信号量包含二值信号量、计数信号量的使用示例……&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/14/217754.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 02:12 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeRTOS 线程间同步之临界区</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217753.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 18:07:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217753.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217753.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217753.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217753.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217753.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: FreeRTOS的线程间同步方式之一，临界区。<br>临界区是提供互斥功能的一种原始方式，可以简单粗暴的实现线程之间的互斥，确保线程间数据同步是稳定可信的<br>> 临界区有两种，一种是关闭中断及系统任务的<br>taskENTER_CRITICAL();<br>taskEXIT_CRITICAL();<br>另一种是关闭系统任务调度(禁止系统任务调度，直到重新开启任务调度)的<br>vTaskSuspendScheduler(); / vTaskSuspendAll();<br>vTaskResumeScheduler(); / vTaskResumeAll();&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/14/217753.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217753.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 02:07 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217753.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeRTOS 线程间同步之互斥量</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217752.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 18:04:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217752.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217752.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217752.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217752.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217752.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: FreeRTOS线程间同步的方式之一，互斥量<br>互斥量是一种特殊的信号量！！！<br>- 所以其句柄依然是xSemaphoreHandle类型&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/14/217752.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 02:04 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217752.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeRTOS 添加命令行实现</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217751.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 18:01:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217751.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217751.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217751.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217751.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: FreeRTOS从移植实现命令行功能的过程记录&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/14/217751.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 02:01 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeRTOS 入门体验</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217750.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 17:41:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217750.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217750.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217750.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217750.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217750.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 基于STM32CubeMX生成的STM32 MDK工程，移植FreeRTOS源码<br>并通过动态和静态创建线程(任务)的过程&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/14/217750.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217750.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 01:41 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217750.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RT-Thread Nano 线程池示例</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217749.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 17:31:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217749.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217749.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217749.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217749.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: RT-Thread提供了线程池的实现，为用户的线程频繁的创建使用场景下提供了更友好更有效率的方式<br>Nano版配置文件没有线程池相关的选项可配置，默认关闭该功能，如果需要开启，需要添加 'RT_USING_MEMPOOL'  的宏定义&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/14/217749.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 01:31 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RT-Thread Nano 定时器示例</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217748.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 17:28:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217748.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217748.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217748.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217748.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: RT-Thread Nano定时器的使用示例<br>定时器分为周期性定时器和一次性定时器<br>文中的示例包括了两种定时器的使用示例展示……&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/14/217748.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 01:28 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RT-Thread Nano 线程间通信之消息队列</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217747.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 17:27:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217747.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217747.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217747.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217747.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217747.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: RT-Thread Nano线程间通信的方式之一，消息队列<br>消息队列默认关闭，如果需要启用，需要在rtconfig.h中开启<br>文章记录了消息队列的动态、静态创建以及展示了通信的过程&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/14/217747.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 01:27 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RT-Thread Nano 线程间通信之邮箱</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217746.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 17:24:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217746.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217746.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217746.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217746.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217746.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: RT-Thread Nano线程间通信的方式之一，邮箱<br>邮箱功能默认打开，如果需要关闭，需要在rtconfig.h头文件中注释掉/删掉<br>文章记录了邮箱的动态、静态创建以及展示了通信的过程&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/14/217746.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 01:24 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RT-Thread Nano 线程间同步之事件集</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217745.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 17:21:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217745.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217745.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217745.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217745.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: RT-Thread Nano的线程间同步方式之一，事件集<br>事件默认关闭，如果需要使用事件，则需要在rtconfig.h头文件中启用事件<br>事件是一种灵活的线程同步机制，每个线程由一个32位的无符号整型来表示一个事件集，一个事件集包含32个事件，由此可以实现事件与线程的一对多或者多对多……&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/14/217745.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 01:21 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RT-Thread Nano 线程间同步之信号量</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217744.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 17:17:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217744.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217744.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217744.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217744.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: RT-Thread Nano的线程间同步方式之一，信号量。<br>记录了动态、静态创建信号量的简单使用示例<br>信号量默认开启，如果需要关闭，需要在rtconfig.h头文件将其对应的宏定义注释掉/删掉&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/14/217744.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 01:17 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RT-Thread Nano 线程间同步之互斥量</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/14/217743.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 17:06:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/14/217743.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217743.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/14/217743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217743.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217743.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: RT-Thread Nano的线程间同步方式之一，互斥量。<br>记录了动态、静态创建互斥量的简单使用示例&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/14/217743.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-14 01:06 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/14/217743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RT-Thread Nano 添加Finsh组件</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/13/217742.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 10:48:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/13/217742.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217742.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/13/217742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217742.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217742.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 基于STM32CubeMX生成的STM32 MDK工程，添加RTT的命令行组件Finsh<br>以及添加自定义命令行，<br>官方参考链接：……&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/13/217742.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-13 18:48 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/13/217742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STM32CubeMX创建MDK工程</title><link>http://www.cppblog.com/LT450196683/archive/2021/07/13/217741.html</link><dc:creator>小菜枫</dc:creator><author>小菜枫</author><pubDate>Tue, 13 Jul 2021 10:40:00 GMT</pubDate><guid>http://www.cppblog.com/LT450196683/archive/2021/07/13/217741.html</guid><wfw:comment>http://www.cppblog.com/LT450196683/comments/217741.html</wfw:comment><comments>http://www.cppblog.com/LT450196683/archive/2021/07/13/217741.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LT450196683/comments/commentRss/217741.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LT450196683/services/trackbacks/217741.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 基于STM32CubeMX生成的STM32 MDK工程，包含配置时钟、调试串口、工程配置等&nbsp;&nbsp;<a href='http://www.cppblog.com/LT450196683/archive/2021/07/13/217741.html'>阅读全文</a><img src ="http://www.cppblog.com/LT450196683/aggbug/217741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LT450196683/" target="_blank">小菜枫</a> 2021-07-13 18:40 <a href="http://www.cppblog.com/LT450196683/archive/2021/07/13/217741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>