RT-Thread 自动初始化详解

论坛 期权论坛     
选择匿名的用户   2021-5-23 02:01   0   0
<p id="main-toc"><strong>目录</strong></p>
<p id="%E4%B8%80%E3%80%81%E5%89%8D%E8%A8%80-toc" style="margin-left:0px;"><a href="https://blog.csdn.net/yang1111111112/article/details/93982354#%E4%B8%80%E3%80%81%E5%89%8D%E8%A8%80">一、前言</a></p>
<p id="1.1%E3%80%81%E4%B8%80%E8%88%AC%E6%83%85%E5%86%B5%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96%E8%B0%83%E7%94%A8-toc" style="margin-left:40px;"><a href="https://blog.csdn.net/yang1111111112/article/details/93982354#1.1%E3%80%81%E4%B8%80%E8%88%AC%E6%83%85%E5%86%B5%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96%E8%B0%83%E7%94%A8">1.1、一般情况的初始化调用</a></p>
<p id="1.2%E3%80%81%E4%BD%BF%E7%94%A8%E8%87%AA%E5%8A%A8%E5%88%9D%E5%A7%8B%E5%8C%96%E5%90%8E-toc" style="margin-left:40px;"><a href="https://blog.csdn.net/yang1111111112/article/details/93982354#1.2%E3%80%81%E4%BD%BF%E7%94%A8%E8%87%AA%E5%8A%A8%E5%88%9D%E5%A7%8B%E5%8C%96%E5%90%8E">1.2、使用自动初始化后</a></p>
<p id="%E4%BA%8C%E3%80%81%E5%BC%95%E5%85%A5-toc" style="margin-left:0px;"><a href="https://blog.csdn.net/yang1111111112/article/details/93982354#%E4%BA%8C%E3%80%81%E5%BC%95%E5%85%A5">二、引入</a></p>
<p id="%E4%B8%89%E3%80%81%E8%87%AA%E5%8A%A8%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8E%9F%E7%90%86-toc" style="margin-left:0px;"><a href="https://blog.csdn.net/yang1111111112/article/details/93982354#%E4%B8%89%E3%80%81%E8%87%AA%E5%8A%A8%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8E%9F%E7%90%86">三、自动初始化原理</a></p>
<p id="3.1%E3%80%816%E4%B8%AA%E8%87%AA%E5%8A%A8%E5%88%9D%E5%A7%8B%E5%8C%96%E5%AE%8F%E7%9A%84%E5%AE%9A%E4%B9%89-toc" style="margin-left:40px;"><a href="https://blog.csdn.net/yang1111111112/article/details/93982354#3.1%E3%80%816%E4%B8%AA%E8%87%AA%E5%8A%A8%E5%88%9D%E5%A7%8B%E5%8C%96%E5%AE%8F%E7%9A%84%E5%AE%9A%E4%B9%89">3.1、6个自动初始化宏的定义</a></p>
<p id="3.2%E3%80%81%E8%87%AA%E5%8A%A8%E5%88%9D%E5%A7%8B%E5%8C%96%E8%BF%87%E7%A8%8B-toc" style="margin-left:40px;"><a href="https://blog.csdn.net/yang1111111112/article/details/93982354#3.2%E3%80%81%E8%87%AA%E5%8A%A8%E5%88%9D%E5%A7%8B%E5%8C%96%E8%BF%87%E7%A8%8B">3.2、自动初始化过程</a></p>
<p id="3.2.1%E3%80%81%E4%B8%A4%E4%B8%AA%E5%87%BD%E6%95%B0%E7%9A%84%E5%AE%9E%E7%8E%B0-toc" style="margin-left:80px;"><a href="https://blog.csdn.net/yang1111111112/article/details/93982354#3.2.1%E3%80%81%E4%B8%A4%E4%B8%AA%E5%87%BD%E6%95%B0%E7%9A%84%E5%AE%9E%E7%8E%B0">3.2.1、两个函数的实现</a></p>
<p id="3.2.1%E3%80%81%E5%88%92%E5%88%86-toc" style="margin-left:80px;"><a href="https://blog.csdn.net/yang1111111112/article/details/93982354#3.2.1%E3%80%81%E5%88%92%E5%88%86">3.2.2、划分</a></p>
<p id="3.2.3%E3%80%81%E7%A4%BA%E4%BE%8B-toc" style="margin-left:80px;"><a href="https://blog.csdn.net/yang1111111112/article/details/93982354#3.2.3%E3%80%81%E7%A4%BA%E4%BE%8B">3.2.3、示例</a></p>
<hr id="hr-toc">
<h1 id="%E4%B8%80%E3%80%81%E5%89%8D%E8%A8%80">一、前言</h1>
<p>在学RT-Thread时,经常能听到这个词:<strong>自动初始化</strong>。用起来也非常容易,一个宏就解决了,但是原理是什么呢?</p>
<p>官网文档提及到了,(他们的文档在这里:<a href="https://www.rt-thread.org/document/site/programming-manual/basic/basic/#rt-thread_3">https://www.rt-thread.org/document/site/programming-manual/basic/basic/#rt-thread_3</a>),但是写的只是概念层面上的,看完后会使用但原理还是不太清楚。之前研究过,今天把它总结下,写出来分享。</p>
<p> </p>
<h2 id="1.1%E3%80%81%E4%B8%80%E8%88%AC%E6%83%85%E5%86%B5%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96%E8%B0%83%E7%94%A8">1.1、一般情况的初始化调用</h2>
<p>一般情况下,系统中的初始化会这样做,应该再熟悉不过了:</p>
<pre class="blockcode"><code class="language-cpp">//伪代码

void main(void)
{
    uart_init();
    led_init();
    ...
   
   
    while(1)
    {
        //func1
        //func2
    }
}</code></pre>
<p>这样的显式调用初始化函数,有时可能多达 十几到几十 个,看起来非常非常繁杂。但是好像没啥问题,因为已经看习惯了。</p>
<p> </p>
<h2 id="1.2%E3%80%81%E4%BD%BF%E7%94%A8%E8%87%AA%E5%8A%A8%E5%88%9D%E5%A7%8B%E5%8C%96%E5%90%8E">1.2、使用自动初始化后</h2>
<p>举例一个自动初始化的用法如下:</p>
<pre class="blockcode"><code class="language-cpp">//这是led.c文件

int led_init(void)
{
    //省略
}
INIT_APP_EXPORT(led_init)</code></pre>
<pre class="blockcode"><code class="language-cpp">//这是 main.c 文件
int main(void)
{
   
}</code></pre>
<p>这样,使用一个宏,初始化函数就会被自动初始化,不用在其他地方显式调用 led_init() 。代码瞬间清爽很多。咦~~~有点心动哦~~~怎么办</p>
<p> </p>
<h1 id="%E4%BA%8C%E3%80%81%E5%BC%95%E5%85%A5">二、引入</h1>
<p>当然也不用担心一个初始化必须在另一个初始化之前的问题,因为这里有6个自动初始化等级可供选择。</p>
<p>我抠了一张RT-Thread官网文档的图,该图是RT-Thread代码的启动流程图,该图中的蓝色方框部分就是自动初始化的6个等级以及初始化的先后顺序。从图中可以看出这6部分的初始化是由函数 rt_components_board_init() 与 rt_components_init() 完成的。</p>
<p><img alt="" height="618" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/c
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP