女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RT-Thread記錄(二、RT-Thread內核啟動流程)

矜辰所致 ? 來源:矜辰所致 ? 作者:矜辰所致 ? 2022-06-20 00:30 ? 次閱讀
在上一篇文章中,我們了解了RT-Thread的版本以及開發環境,使用RT-Thread Studio成功創建了一個工程。
但是要了解一個操作系統,內核的了解是必不可少的,
我們今天就在前面我們RT-Thread Studio工程基礎之上講一講RT-Thread內核啟動流程

RT-Thread啟動流程

1、基礎介紹
2、源碼分析

2.1 匯編部分 — startup_xxxx.s說明
2.2 C部分 — rtthread_startup 說明
2.2.1 板級硬件初始化 — rt_hw_board_init
板級硬件初始化更新說明
2.2.2 RT-Thread 堆和棧空間說明(與FreeRTOS不同)
2.2.3 main線程創建 — rt_application_init
2.2.4 調度器說明

1、基礎介紹

在裸機程序中,一般在 .s 文件中就跳轉到 _main從而跳轉到 main()函數啟動,而 RT-Thread 啟動會先跳轉到其啟動函數 rtthread_startup()進行一系列的必要的初始化,最后才跳轉至 main()函數。

簡單來說就是: 程序啟動,通過 startup_xxxx.s 文件(匯編語言)跳轉到 RT-Thread啟動函數rtthread_startup() (C語言),再通過 rtthread_startup() 跳轉到 main()(C語言)函數。

官方的圖片很詳細的表明了這個流程:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_5,color_FFFFFF,t_70,g_se,x_16#pic_center

在 RT-Thread 中,會把 main()函數 當成是一個線程。這個在 rtthread_startup() 就會將 main() 創建成一個線程,除此之外,rtthread_startup() 還會創建timer 線程 和 空閑線程 這兩個線程。

結合上圖,下面我們通過上篇文章創建的示例代碼來說明一下這個流程。

2、源碼分析

2.1 匯編部分 — startup_xxxx.s說明

打開RT-Thread Studio工程,在哪里找到 startup_xxxx.s 文件呢,看下面一張圖:

在這里插入圖片描述

我們找到了啟動文件,可以打開查看,啟動文件的說明我在我在另一篇博文有詳細的介紹:

STM32的啟動過程 — startup_xxxx.s文件解析(更新GCC環境下的啟動文件分析)

已經講解的比較詳細了,這里我只把主要的簡單說明一下。在上面推薦的博文中講到過,GCC環境下面的啟動,需要兩個文件,一個是 startup_xxxx.s文件,還一個是 .ld鏈接文件,我們先看一下鏈接文件:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16



在以前講過,GCC下的鏈接文件主要制定了入口函數,堆棧大小和數據段的整體布局。在上圖中我們看到值定義了系統棧的大小,并沒有定義堆大小。

這里為什么只定義系統棧?
雖然我們在其他博文說過,如果不用 malloc函數,不需要用到堆,這里沒有定義是因為在后面初始化的時候會根據是否使用堆,來定義堆的大小。
在本文下面板級硬件初始化部分有介紹說明。

然后就簡單來看一下 startup_xxxx.s文件,首先我們找到上電執行的第一個指令 Reset_Handler(芯片剛上電,就是上電復位,直接就會觸發Reset_Handler):

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16


上圖中所進行的操作不理解的可以查看博文:

STM32的內存管理相關(內存架構,內存管理,map文件分析)

完成數據搬運以后,就是系統基本的初始化,如下圖:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16


完成基本初始化,MCU得以運行起來,就跳轉到我們上面基礎介紹里面說到的入口函數,如下圖:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

通過上面的步驟,最終就從 .s 中的匯編跳轉到了 C語言部分,通過入口函數跳轉到 rtthread_startup函數,我們通過下面的介紹說明一下,進入rtthread_startup函數 后,RT-Thread 確實做了哪些工作。

2.2 C部分 — rtthread_startup 說明

在本文第一節基礎介紹中通過官方的一張圖表示了進入rtthread_startup后,所會進行的操作,我們上面也說明了工程是怎么進入 rtthread_startup 函數的,那么進入 rtthread_startup函數 后執行了哪些操作,如下圖:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16


補充說明: 上圖中的SMP相關,是與多核處理器有關的設置。

上面的過程很好理解,主要有做了以下工作:

1、基本的硬件初始化;

2、一定會創建main現 線程;

3、根據是否使用軟件定時器創建 time r線程;

4、一定會創建 idle 線程;

5、初始化開啟調度器;

其中有一些初始化我們可以更加深入的看看具體的操作:

2.2.1 板級硬件初始化 — rt_hw_board_init

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

在上圖找那個,板級硬件初始化最后調用了rt_components_board_init()函數,這個函數如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

rt_components_board_init()函數會把所有 INIT_BOARD_EXPORT 的設備都初始化,這里暫時不介紹是如何實現的,但是有必要說明一下。

比如我們什么外設都沒使能,但是使用到了串口1作為打印LOG的設備,所以串口1 必定會被使能,那么這個初始化就是在這里完成的,我們可以在工程 drivers 文件夾里的drv_usart.c 文件中查看到串口相關的初始化代碼,我們可以看到如下圖所示部分(此部分串口1 的說明有待確認,因為后期加了其他串口以后回頭來看這個地方,并沒有發現下圖代碼……):

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_17,color_FFFFFF,t_70,g_se,x_16


板級硬件初始化更新說明

對于上圖提到的串口會使用 INIT_BOARD_EXPORT(rt_hw_usart_init),后續我反而并沒有找到圖示代碼,也不知道是因為版本問題還是什么原因,這里需要補充說明一下:

硬件設備的初始化是在hw_board_init函數中的:

pYYBAGKueT-AT5aBAADBiQQ3Pqo300.png

2.2.2 RT-Thread 堆和棧空間說明(與FreeRTOS不同)

在上圖中,有一點比較特殊,就是對 堆 空間的初始化,我們以前遇到的都是在啟動文件中定義好堆棧空間,而我們上面分析 RT-Thread 啟動文件的時候,只定義了棧空間,堆空間沒有定義,其實是放在了這個地方:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

剛開始看到這里還有個疑問,HEAP 把余下 所有的 RAM 都使用了,按照以前的理解,系統棧應該是在最后面的位置的,這里是怎么回事?

關于 系統棧位置的問題,可以參考博文:RTOS的 任務棧 和 系統棧

上面我們通過源碼看到的結論和 這篇博文說到的不一樣(當時是用裸機和 FreeRTOS作為例子說明的),然后在 RT-Thread 下,系統棧的位置在什么地方,于是乎回頭看了看定義數據段整體布局的鏈接文件:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_17,color_FFFFFF,t_70,g_se,x_16

通過鏈接文件我們可以推斷 .stack 的位置,那么為了確認一下,我們可以查看程序編譯過后的 .map文件:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

在 RAM 數據段我們可以查看數據存放的位置,找到關于 系統棧的位置部分:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

確認了在 RT-Thread 中,系統棧的位置是確實存放于 .data 段和 .bss 之間的,所以堆空間即便使用了余下全部的 ram 空間也是沒有問題的。

2.2.3 main線程創建 — rt_application_init

在 RT-Thread 中,創建了一個名字為 "main" 的線程來調用 main() 函數,就是在rtthread_startup函數中的rt_application_init(),如下圖:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

2.2.4 調度器說明

調度器是操作系統的核心知識,調度器是基于鏈表進行操作的,具體的原理將來會單獨寫一篇文章說明,這里我們就簡單的過一遍,知道函數的用意。

rtthread_startup函數中,使用rt_system_scheduler_init();初始化調度器,rt_system_scheduler_start();開啟調度器,開啟調度器之后,線程之間就會根據一定的規則進行切換(時間片,優先級):

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

開啟調度器后,會在就緒列表中找到最高優先級的線程,然后通過設置 線程指針(PSP),來跳轉到對應的位置執行:

線程指針什么意思,可以參考博文:FreeRTOS記錄(三、FreeRTOS任務調度原理解析_Systick、PendSV、SVC)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

至此,整個系統就正常跑起來了,然后用戶運行自己想要做的事情,可以在 main 中設計自己的應用代碼,或者創建線程。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1410

    瀏覽量

    41094
  • STM
    STM
    +關注

    關注

    1

    文章

    557

    瀏覽量

    42994
  • RT-Thread
    +關注

    關注

    32

    文章

    1370

    瀏覽量

    41508
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    RT-Thread記錄(一、版本開發環境及配合CubeMX)

    RT-Thread 學習記錄的第一篇文章,RT-Thread記錄(一、RT-Thread 版本、RT-T
    的頭像 發表于 06-20 00:28 ?5782次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>記錄</b>(一、版本開發環境及配合CubeMX)

    RT-Thread記錄(三、RT-Thread線程操作函數)

    講完了RT-Thread開發環境,啟動流程啟動以后當然是開始跑線程了,那么自然我們得學會如何創建線程以及線程的有關操作。
    的頭像 發表于 06-20 00:31 ?7657次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>記錄</b>(三、<b class='flag-5'>RT-Thread</b>線程操作函數)

    RT-Thread內核簡介

    RT-Thread 啟動流程5、RT-Thread 程序內存分布keil工程編譯內存分布RT-thread studio 工程編譯內存分布
    發表于 08-06 07:44

    【原創精選】RT-Thread征文精選技術文章合集

    及配合CubeMX)RT-Thread記錄RT-Thread內核啟動
    發表于 07-26 14:56

    RT-Thread快速入門之了解內核啟動流程

    1、了解RT-Thread內核啟動流程  內核是操作系統最基礎也是最重要的部分。從本文開始進入 RT-
    發表于 09-05 17:01

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開發組(2015-03-31)。RT-Thread做為國內有較大影響力的開源實時操作系統,本文是RT-Thread實時操作系統的編程指南
    發表于 11-26 16:06 ?0次下載

    RT-Thread 內核學習筆記 - 理解defunct僵尸線程

    RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記 -
    發表于 01-25 18:19 ?9次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>內核</b>學習筆記 - 理解defunct僵尸線程

    大佬帶你理解RT-Thread內核并上手實踐

    RT-Thread內核的相關概念和基礎知識,然后了解RT-Thread系統的啟動流程、內存分布情況以及
    發表于 06-30 17:10 ?1537次閱讀

    RT-Thread學習筆記 RT-Thread的架構概述

    RT-Thread 簡介 作為一名 RTOS 的初學者,也許你對 RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會逐漸發現 RT-Thread 的魅力和它相較于其他同類型 RTOS
    的頭像 發表于 07-09 11:27 ?4904次閱讀
    <b class='flag-5'>RT-Thread</b>學習筆記 <b class='flag-5'>RT-Thread</b>的架構概述

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡介

    RT-Thread文檔_內核基礎

    RT-Thread文檔_內核基礎
    發表于 02-22 18:28 ?1次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>內核</b>基礎

    RT-Thread文檔_內核移植

    RT-Thread文檔_內核移植
    發表于 02-22 18:31 ?4次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>內核</b>移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    基于RT-Thread Studio學習

    前期準備:從官網下載 RT-Thread Studio,弄個賬號登陸,開啟rt-thread學習之旅。
    的頭像 發表于 05-15 11:00 ?5013次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio學習

    RT-Thread v5.0.2 發布

    ://github.com/RT-Thread/rt-thread/releases/tag/v5.0.2 RT-Thread 迎來了全新的版本 v5.0.2,自 v5.0.0?版本發布以來,
    的頭像 發表于 10-10 18:45 ?1824次閱讀
    <b class='flag-5'>RT-Thread</b> v5.0.2 發布