RT-Thread學習筆記+2.RTT的啟動分析

2020-12-06 電子芯吧客

摘要本文主要介紹RT-Thread剛剛入手,以及RTT的上電啟動過程分析。

系統移植

關於RTT的系統移植,我覺得還是很簡單的,之前我做過針對自己的

開發板

做了一款BSP。參考RTT官網提供的BSP製作教程,一次性成功,唯一的是要花點時間。

而本次我準備使用使用的正點原子的戰艦V3的板子來學習RTT,因為這個板子上的板載資源要豐富一些。當我準備按照之前的經驗,做一款戰艦V3的BSP的時候才發現,原來已經有成品了。那就本著拿來主義,先用用吧。

最終我在從官網下載的壓縮包裡面找到正點原子戰艦V3的BSP。

個人推薦,可以把用不到的BSP刪了,畢竟這個源碼壓縮包解壓之後有700多M,還是蠻佔用空間的。然後在rt-thread\bsp\stm32\libraries目錄下,把其他用不到的庫文件也刪掉,只保留了F1的庫文件夾即可。

最後強調一下:學習RTT,板子不是關鍵,不論是正點原子、野火、安富萊,還是F1、F4、F7都是可以的,不要糾結板子,最主要的了解RTT的使用方法。

程序下載進去之後,我使用的Xshell5軟體,將板載的USB串口與PC連接:

Main.C文件的代碼十分簡單,就一個閃燈程序。

RTT的系統初始化,以及空閒任務等啟動系統啟動,都不見蹤影,這不得不讓我想一探究竟。

代碼框架分析

首先,看了下啟動文件startup_stm32f103xe.s,這個文件還是使用的是hal庫提供的標準文件,RTT並沒在這個上面做文章。

啟動代碼還是沒有變,流程還是一樣:

166行:將SystemInit()函數的入口地址放到R0寄存器

167行:跳轉到R0地址的,開始執行SystemInit()函數,這個函數還是ST官方提供的函數。

168行,將

main函數的入口地址給到R0169行:跳轉到

main函數,開始執行。

需要注意的是__main()是編譯系統提供的一個函數,負責完成庫函數的初始化和初始化應用程式執行環境,最後自動跳轉到main()。

所以說,前者是庫函數,後者就是我們自己編寫的main()主函數;

但是RTT的啟動函數呢?

經過一番查找,RTT的啟動用到了MDK提供的$Super$$和$Sub$$「補丁」函數的功能,這個是在__CC_ARM編譯器環境中,編譯器提供的一個功能。下圖為MDK提供官方原文:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0377g/pge1362065967698.html

其意思是,以下文中的示例代碼為例:

int$Sub$$main(void)

{

補丁函數();

$Super$$main();

return0;

}

在進入main()之前,會先執行$Sub$$main(void)函數中的內容,

是以,補丁函數();得以優先運行。

最後當執行到$Super$$main()函數時,程序才開始跳轉到main()函數,去執行main()函數的內容。

而RTT也就是用的這種「補丁」的方式,也下面我將整個RTT的初始化流程做成了一個簡單的流程示意圖,方便大家更明白的了解RTT的啟動流程。

程序從啟動文件的__main函數執行完畢之後,在準備進入main()函數之前,會優先執行$Sub$$main()函數,該函數包含了RTT的初始化過程,如下圖所示。

在rtthread_startup()函數中完成對RTT的所有初始化。

另外需要額外的說明,在rt_application_init()函數中,定義了一個「main」線程。

這個main線程的入口函數是main_thread_entry(),就是我們的正主,main函數的跳轉入口,$Super$$main()。

程序執行到rt_application_init()時,並沒有真正意義上的執行到$Super$$main(),而是將含有$Super$$main()的這個任務線程放置到就緒狀態。

最後,當程序執行到rt_system_scheduler_start()函數後,此刻任務調度器已經啟動了,這個含有$Super$$main()的線程會立即得到執行,從而轉入到我們的main函數。

所以,這就是為什麼,我們看到這個main()函數這麼簡潔的原因。

不用我多說,相信大家也知道這樣設計的好處:盡最大的可能,保證hal庫,與RTT的文件保持獨立,又能很好的相互銜接。降低RTT的移植難度。

Shell串口初始化

這個串口也就是我使用Xshell5連接的調試串口,為什麼我要單獨的把它拿出來說?因為,在我們設計新的硬體的時候,由於布線方便的原因,有時候會使用其他的串口作為調試串口。

所以,針對這個串口的初始化,我重點了看了下RTT的調試串口初始化,方便以後項目中需要調整的時候,進行調整。

我也是找了很久才看明白RTT是如何初始化調試串口的。

在說RTT的調試串口初始化之前,我建議先看看單純使用HAL庫的時候,串口是如何進行初始化的,我做了截圖,如下圖所示:

在HAL庫中,先對UartHandle結構體進行賦值,在HAL_UART_Init(&UartHandle)函數中完成串口引腳的初始化,和串口外設的配置(波特率、數據位等等)。

好了,說到了這裡,在回頭RTT的代碼吧!根據上文,RTT是在rt_hw_board_init()函數中的rt_hw_usart_init()函數中進行串口初始化。

在rt_hw_usart_init()函數中,需要重點注意stm32_uart_ops結構體

這個stm32_configure就是我們調試串口的初始化,至於這個.configure=stm32_configure的寫法,意思是,將stm32_configure賦值給configure,這裡我不多做解釋。

繼續查看stm32_configure函數,就可以看如下圖所示:

這裡已經和單獨使用HAL庫,初始串口的流程一樣了,在HAL_UART_Init(&uart->handle)函數中,將會對調試串口的引腳、以及外設參數進行配置。

結語從RTT的代碼中,能看到很對linux嵌入式開發的影子,同時,其又能和ST的HAL進行兼容與配套,如果有興趣的朋友可以研究下,每當看了一段時間RTT的代碼,不禁發出感嘆「原來如此!」。總之,學習RTT一定會讓你有所收穫!

相關焦點

  • 玩轉RT-Thread之荔枝派Nano(全志F1C100S)一、新手上路
    更詳細信息及開發文檔可在官網https://www.rt-thread.org獲取。RT-Thread代碼開源在github及國內的碼雲,2個倉庫同步更新。2018年3月底最新版本為3.0.3。RT-Thread下載RT-Thread官方github地址為:https://github.com/RT-Thread/rt-thread。在Env工具下使用:git clone https://github.com/RT-Thread/rt-thread.git。
  • 【RT-Thread】線程的基本知識
    線程創建實例創建一個靜態線程1、確定線程棧2、定義線程控制塊3、創建線程函數。(void* parameter){    rt_uint32_t i = 0;    rt_kprintf("This is static thread!
  • 《rt-thread驅動框架分析》-i2c驅動
    軟體I2C驅動總結:rt-thread的軟體I2C,如果要對接其他平臺,只需要對接好結構體:struct rt_i2c_bit_ops。而軟體I2C的邏輯完全不用理會,全部由bit_opt層管理。作者為了簡單說明,寫了個例子(簡單粗暴的例子):struct rt_i2c_bus_device i2c1_bus;I2C_HandleTypeDef hi2c1;static rt_err_t i2c_hw_init(void){ hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000;
  • 一文詳解RT-Thread自動初始化
    官網文檔提及到了, (他們的文檔在這裡:https://www.rt-thread.org/document/site/programming-manual/basic/basic/#rt-thread_3),但是寫的只是概念層面上的,看完後會使用但原理還是不太清楚。之前研究過,今天把它總結下,寫出來分享。
  • RT-Thread AT 組件應用筆記 - 客戶端篇
    1.2 本文的結構本應用筆記將從以下幾個方面來介紹 RT-Thread AT 組件:AT 組件介紹AT Client 配置與使用AT Socket 配置與使用2 問題闡述本應用筆記將圍繞下面幾個問題來介紹 RT-Thread AT 組件。什麼是 AT 命令? AT 組件的主要功能是什麼?
  • RT-Thread教程一之Linux下開發環境及QEMU配置
    RT-Thread原始碼Linux下安裝git後在工程目錄下(比~/Workplace)執行git clone https://github.com/RT-Thread/rt-thread我們看一下樹目錄結構rt-thread git:(master) tree . -L 1.
  • RT-Thread多線程學習後的總結
    RT-Thread多線程學習後的總結 RTThread物聯網操作 發表於 2021-01-13 16:34:03 多線程是實時作業系統裡面最重要的知識點之一,要學習RTOS,多線程是必須(沒錯,是必須)要熟練掌握的內容
  • rt-thread內核對象標誌(object.flag)總結
    1 前言 在前面介紹rt-thread內核對象時(http://blog.csdn.net/flydream0? 從前面的博文中我們可以知道,rt-thread的內核對象有定時器,線程,信號量,互斥鎖,事件,郵箱,消息隊列,內存堆,設備,模塊,這些內核對象都繼承了內核對象的成員,其中也就包含了內核對象的flag成員,因此,內核對象成員flag在這些不同的場合是具體不同的含義的,下面總結一下: 2 object.flag在定時器中的含義 object.flag在定時器中的各位如下定義
  • 國產開源物聯網作業系統RT-Thread Smart正式上線(附原始碼下載地址)
    353EETC-電子工程專輯而如今,官方消息透露,RT-Thread Smart 已正式上線,目前原始碼可在Github、Gitee下載,採用Apache License 2.0。353EETC-電子工程專輯RT-Thread Smart(以下簡稱為rt-smart) 是基於RT-Thread作業系統衍生的新分支——混合微內核作業系統,主要面向帶 MMU(內存管理單元Memory Management Unit)的中高端處理器,為眾多領域提供更具競爭力的作業系統基礎軟體平臺,具備快速啟動、兼容POSIX 接口、
  • RISC-V單片機快速入門02-移植RT_Thread Nano
    經過11年的累積發展,RT-Thread已經擁有一個國內最大的嵌入式開源社區,同時被廣泛應用於能源、車載、醫療、消費電子等多個行業,累積裝機量超過2億臺,成為國人自主開發、國內最成熟穩定和裝機量最大的開源RTOS。
  • 在rt-thread下實現OTA在線固件更新功能
    如果有效電平沒有持續超過 10S 則繼續進行 2.2 小節中介紹的啟動步驟。在搬運的過程中 Bootloader 可以對固件進行校驗、解密、解壓縮等操作。搬運完畢後,保持 factory 分區中的固件不變。重啟系統跳轉到 app 分區中的固件運行,Bootloader 運行結束。
  • RT-Thread Studio V1.1 新版本發布
    【官網下載地址】https://www.rt-thread.org/page/studio.html(或點擊文末閱讀原文下載) 亮點功能4: 編譯信息輸出信息增加了簡潔模式,如果想看詳細編譯信息可以通過編譯窗口按鈕切換輸出模式,同時增加了ROM,RAM使用數據分析列印,每次編譯完都可以方便看到ROM,RAM佔用情況。
  • RT Thread v2.1.0 正式版發布
    RT-Thread 2.1.0  正式版發布了!
  • RISC-V單片機快速入門03-基於RT_Thread Nano添加控制臺
    (2) 實現 rt_hw_console_output在gd32vf102c_start.c文件中,實現rt_hw_console_output如下:void rt_hw_console_output(const char str){ rt_enter_critical(); while(str !
  • 人生苦短,用 RT-Thread MicroPython 享受編程的樂趣
    在校學生或者業餘愛好者都可以通過 MicroPython 快速的開發一些好玩的項目,在開發的過程中學習編程思想,提高動手能力。適合創客 DIY 創意項目MicroPython 設置簡單,無需特別的軟體環境和額外的硬體,使用任何文本編輯器就可以進行編程。大部分硬體功能,使用一個命令就能驅動,因此不需要了解硬體底層就能快速開發。
  • 實操RT-Thread系統CPU利用率功能添加
    除了在空閒任務可以設置鉤子函數,還有可能在任務切換、系統啟動、任務創建等等關鍵的地方設置,當然了,這裡的每一個鉤子函數都是一個單獨的函數指針。這樣,這個值比較準確,但是如果一開始這個值計算錯了,那麼後面的計算肯定也是有問題的,而且如果系統啟動後長時間既不啟動任務,也不響應中斷,肯定對系統有一定的影響。但是好處是,系統消耗更少,因為他只計算一次。而動態計算,則是在空閒任務中,當這個值為零時,計算一次,之後只會在空閒任務自加的變量值超過這個數時,才會更新這個值,這樣一來,最終還是能準確反映CPU利用率的。
  • 開發,從未如此簡單——RT-Thread 4.0版本IoT OS
    他們需要學習卷積神經網絡、機器學習、AI訓練方法、以及如何將系統行為劃分為AI和算法域等課題。當系統的關鍵操作特性是派生的到且未定義的,且其中間操作是隱蔽的,以至於不能用傳統的軟體去分析系統時,他們還需要知道如何測試、調試和驗證系統行為。而且,AI將引發嵌入式系統設計方式的大規模轉變,開發人員現在就應該著手準備,這種轉變不會一蹴而就,它也不會以同樣的方式影響所有的嵌入式系統,因此行業有時間適應。
  • RT-Thread Studio開發環境搭建
    前言從今天開始,我們學習使用RT-Thread Studio IDE開發STM32程序,RT-Thread Studio是一站式的 RT-Thread 開發工具,通過簡單易用的圖形化配置系統以及豐富的軟體包和組件資源,讓物聯網開發變得簡單和高效
  • 基於RT-Thread 使用 wireshark 抓取 HTTPS 數據包
    ("random_c or master is null\n");21 return;22 }2324 host = (struct hostent *) gethostbyname(ip);25 if(host == RT_NULL)26 {27 rt_kprintf("Get host by name failed!
  • RT-Thread V4.0.2 正式發布,優化 BSP、多核等方面體驗
    下面就根據目前的更改情況,對v4.0.x的優化迭代部分做個總結:● 優化部分主要體現在BSP上,我們支持了更多的晶片、板子,也完善了驅動;     ◕ v4.0.2還對 NXP i.MXRT BSP 進行了重構,這也是攜手NXP公司,並聯合他們的工程師一起推動完成的;●