0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

從安裝到使用,RT-Thread Nano最全教程看完不信你還不會(huì)使用

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來源:未知 ? 作者:佚名 ? 2017-09-26 06:39 ? 次閱讀
小編 說RT-Thread Nano發(fā)布以來,小編收到不少開發(fā)者詢問RT-Thread Nano的配套教程實(shí)例,官方發(fā)布過一篇:從裸機(jī)開始,創(chuàng)建一個(gè)RT-Thread Nano系統(tǒng)工程,但對(duì)廣大開發(fā)者來說還是遠(yuǎn)遠(yuǎn)不夠,幸得RT-Thread開發(fā)者燕十三大作一篇講解實(shí)戰(zhàn) RT-Thread Nano ,算是手把手教學(xué)了。嗯,連我這個(gè)不懂技術(shù)的小白看了也會(huì)了。歡迎給RT-Thread投稿,獲贈(zèng)RT-Thread T恤一件。

征稿 | 你寫不寫,福利就在這里~~

何為RT-Thread Nano?大家知道,Keil5以后采用pack形式管理芯片及各種相關(guān)組件的。RT-Thread Nano就是通過Keil pack方式發(fā)布,在保持原有RT-Thread基本功能的情況下,實(shí)現(xiàn)了極小的Flash和Ram占用。默認(rèn)配置下,F(xiàn)lash可小至2.5K, Ram可以小至1K。

目前pack包含有kernel、shell(msh)、device drivers三部分功能,這3個(gè)功能可按實(shí)際使用情況按需加載。本次使用的主芯片為GD32F150C8T6,資源為Flash:64K,RAM:8K。

一、RT-Thread Nano Pack下載安裝

1.在Keil5主界面上點(diǎn)擊“Pack Install”按鈕,即可進(jìn)入Pack Install界面

圖1:Keil5主界面

2.在Pack Install界面下,RT-Thread Pack在右邊欄中。如未下載,可點(diǎn)擊“Install”下載;如已安裝,版本有更新,將提示“Update”可更新。

圖2:RT-ThreadPack下載

3.如在圖2界面“Packs”欄中未發(fā)現(xiàn)“RT-Thread”,可先在菜單“Packs”下點(diǎn)擊“Check for Updates”。Update完成后,將可看到RT-Thread Pack。

圖3:Pack Update

4.Pack下載完成后,Keil將自動(dòng)彈出Pack安裝界面,按步驟依次完成安裝。

二、裸機(jī)最小系統(tǒng)工程建立

1.本次工程使用的是芯片是GD32F150C8T6,64KFlash、8KRam。Keil5下開發(fā)須先在官網(wǎng)下載Keil Pack (GigaDevice.GD32F1x0_DFP.pack),并正確安裝。

2.先按照裸機(jī)Keil工程流程搭建工程,為測試Flash及Ram大小,最小工程只包含必須的Libraries文件,main函數(shù)也未作任何多余處理。

圖4:GD32F150C8T6最小工程

3.編譯完成后,默認(rèn)配置Flash:1112字節(jié)、Ram:2144字節(jié)

4.修改默認(rèn)啟動(dòng)文件startup_gd32f1x0.s定義堆和棧大小:默認(rèn)堆為0x400,棧為0x400。后續(xù)我們將采用RT-Thread管理內(nèi)存堆,所有堆設(shè)置為0;??砂凑誱ain函數(shù)應(yīng)用需求調(diào)整為0x100或以上。

圖5:啟動(dòng)文件棧和堆修改

啟動(dòng)文件修改后,Ram大小為352字節(jié)

圖6:修改堆和棧后Flash和棧占用大小

三、kernel加載與應(yīng)用

1.加載RT-Thread Kernel:在主界面點(diǎn)擊“ManageRun-Time Environment”按鈕即可進(jìn)入加載頁。

圖7:ManageRun-Time Environment

在“RTOS”一欄中選中“RT-Thread”,并在列表中選中“kernel”,當(dāng)前版本為2.1.2。

圖8:RT-Thread kernel選擇

2.確定后,keil界面上會(huì)加載RT-Thread的kernel文件,更根據(jù)當(dāng)前選擇芯片類型加入已移植完成的M3芯片內(nèi)核代碼、配置文件等。

圖9:RT-Thread kernel文件

其中:

Kernel文件包括:

  • clock.c

  • components.c

  • device.c

  • idle.c

  • ipc.c

  • irq.c

  • kservice.c

  • mem.c

  • object.c

  • scheduler.c

  • thread.c

  • timer.c

Cortex-m3芯片內(nèi)核移植代碼:

  • cpuport.c

  • context_rvds.s

應(yīng)用代碼及配置文件:

  • board.c

  • rtconfig.h

3.此時(shí)再次編譯工程,編譯器會(huì)提示有函數(shù)被重復(fù)定義了。需按照如下方式做一些修改:

a) 修改gd32f10x_it.c文件,刪除如下函數(shù):

  • void HardFault_Handler(void)

  • void PendSV_Handler(void)

  • void SysTick_Handler(void)

b) 按照board.c上的說明,依次完成如下操作:

圖10:board.c修改流程說明

  • 修改24行:#include “gd32f1x0.h”

  • 修改48行:在rt_hw_board_init()函數(shù)內(nèi)開啟SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);

  • 修改66行:voidSysTick_Handler(void)

4.修改main.c:

  • 加入#include

  • 在while循環(huán)中加入rt_thread_dealy(100);

5.再次編譯順利通過,下載至芯片運(yùn)行可看到main函數(shù)中每1s可中斷一次。RT-Thread任務(wù)調(diào)度器已經(jīng)正常運(yùn)行。

圖11:RT-Thread正常運(yùn)行

通過查看.map文件可獲取當(dāng)前各文件資源占用情況。在未開啟任何優(yōu)化的情況下,可以看到RT-Thread內(nèi)核各文件資源占用情況。

圖12:資源占用表

6.可在main函數(shù)內(nèi)添加RT-Thread支持的任務(wù)、定時(shí)器信號(hào)量等功能。Nano默認(rèn)rtconfig.h配置只支持靜態(tài)任務(wù)、信號(hào)量創(chuàng)建。在靜態(tài)模式下,不能使用rt_thread_create/rt_thread_delete/rt_sem_create/rt_sem_delete/rt_malloc/rt_free與動(dòng)態(tài)創(chuàng)建、刪除有關(guān)的接口。如需動(dòng)態(tài)創(chuàng)建,需開啟RT_USING_HEAP項(xiàng),詳見本篇第五部分:《RT-Thread配置》

四、RT-Thrad啟動(dòng)流程分析

這次創(chuàng)建的keil工程雖然應(yīng)用了RT-Thread嵌入式操作系統(tǒng),但開發(fā)流程無不帶os開發(fā)幾乎沒有差別。都是將main作為入口,完成硬件初始化、應(yīng)用代碼添加,而且可以直接應(yīng)用RT-Thread的各種功能完成產(chǎn)品開發(fā)。但是我們沒有添加RT-Thread相關(guān)初始化、啟動(dòng)等代碼到我們的工程里面,但實(shí)際情況是調(diào)度器已經(jīng)正常運(yùn)行了,這是怎么實(shí)現(xiàn)的呢?

01

RT-Thread入口

我們可以在components.c文件的140行看到#ifdef RT_USING_USER_MAIN宏定義判斷,這個(gè)宏是定義在rtconfig.h文件內(nèi)的,而且處于開啟狀態(tài)。同時(shí)我們可以在146行看到#if defined (__CC_ARM)的宏定義判斷,__CC_ARM就是指keil的交叉編譯器名稱。

我們可以在這里看到定義了2個(gè)函數(shù):$$Sub$$main()和$$Super$$main()函數(shù);這里通過$$Sub$$main()函數(shù)在程序就如主程序之前插入一個(gè)例程,實(shí)現(xiàn)在不改變?cè)创a的情況下擴(kuò)展函數(shù)功能。鏈接器通過調(diào)用$$Sub$$Main()函數(shù)取代main(),然后通過$$Super$$main再次回到main()

#if defined (__CC_ARM)

extern int $Super$$main(void);

/* re-define main function */

int $Sub$$main(void)

{

rt_hw_interrupt_disable();

rtthread_startup();

return 0;

}

在$$Sub$$main函數(shù)內(nèi)調(diào)用了rt_hw_interrutp_disable()和rtthread_startup()兩個(gè)函數(shù)。熟悉RT-Thread開發(fā)流程的,一看就知道這是標(biāo)準(zhǔn)的RT-Thread的啟動(dòng)入口。

其中:

  • rt_hw_interrupt_disable():關(guān)中斷操作,

  • rtthread_startup():完成systick配置、timer初始化/啟動(dòng)、idle任務(wù)創(chuàng)建、應(yīng)用線程初始化、調(diào)度器啟動(dòng)等工作。

int rtthread_startup(void)

{

rt_hw_interrupt_disable();

/* board level initalization

* NOTE: please initialize heap insideboard initialization.

*/

rt_hw_board_init();

/* show RT-Thread version */

rt_show_version();

/* timer system initialization */

rt_system_timer_init();

/* scheduler system initialization */

rt_system_scheduler_init();

/* create init_thread */

rt_application_init();

/* timer thread initialization */

rt_system_timer_thread_init();

/* idle thread initialization */

rt_thread_idle_init();

/* start scheduler */

rt_system_scheduler_start();

/* never reach here */

return 0;

}

  • rt_hw_board_init():該函數(shù)定義在board.c文件內(nèi),需要修改systick配置

  • rt_system_timer_init()/rt_system_timer_thread_init():timer初始化/啟動(dòng)

  • rt_thread_idle_init():idle任務(wù)創(chuàng)建

  • rt_application_init():應(yīng)用線程初始化

  • rt_system_scheduler_start():調(diào)度器啟動(dòng)

02

應(yīng)用線程入口

rt_application_init()

void rt_application_init(void)

{

rt_thread_t tid;

#ifdef RT_USING_HEAP

tid = rt_thread_create("main",main_thread_entry, RT_NULL,

RT_MAIN_THREAD_STACK_SIZE,RT_THREAD_PRIORITY_MAX / 3, 20);

RT_ASSERT(tid != RT_NULL);

#else

rt_err_t result;

tid = &main_thread;

result = rt_thread_init(tid,"main", main_thread_entry, RT_NULL,main_stack, sizeof(main_stack),RT_THREAD_PRIORITY_MAX / 3, 20);

RT_ASSERT(result == RT_EOK);

#endif

rt_thread_startup(tid);

}

在這里,我們可以看到應(yīng)用線程創(chuàng)建了一個(gè)名為main_thread_entry的任務(wù),并且已經(jīng)啟動(dòng)了該任務(wù)。我們?cè)俅蝸砜匆幌耺an_thread_entry任務(wù)。

/* the system main thread */

void main_thread_entry(void*parameter)

{

extern int main(void);

extern int $Super$$main(void);

/* RT-Thread components initialization */

rt_components_init();

/* invoke system main function */

#if defined (__CC_ARM)

$Super$$main(); /* for ARMCC. */

#elif defined(__ICCARM__) ||defined(__GNUC__)

main();

#endif

}

man_thread_entry任務(wù)完成了2個(gè)工作:調(diào)用rt_components_init()、進(jìn)入應(yīng)用代碼真正的main函數(shù)。

在這里我們看到了$$Super$$main()的調(diào)用,在前面我們講了調(diào)用該函數(shù)可用來回到main()的。

圖13:RT-Thread初始化及啟動(dòng)流程

從以上分析可以,正是由于在rtconfig.h內(nèi)開啟了RT_USING_USER_MAIN選項(xiàng),編譯器在main之前插入了$$Sub$$main(),完成了RT-Thread初始化及調(diào)度器啟動(dòng)工作。并且通過創(chuàng)建main_thread_entry任務(wù),并通過$$Super$$main()回到main()函數(shù)。這樣看來main()函數(shù)其實(shí)只是RT-Thread的一個(gè)任務(wù),該任務(wù)的優(yōu)先級(jí)為 RT_THREAD_PRIORITY_MAX / 3,任務(wù)棧為RT_MAIN_THREAD_STACK_SIZE。

圖14:RT_USING_USER_MAIN選項(xiàng)

五、RT-Thread配置(rtconfig.h)

RT-Thread是一個(gè)高度可配置的嵌入式實(shí)時(shí)操作系統(tǒng),配置通過rtconfig.h文件實(shí)現(xiàn)。Nano就是在rtconfig.h配置下實(shí)現(xiàn)了2.5KFlash,1KRam的內(nèi)核應(yīng)用,但是由于Nano未開啟RT_USING_HEAP選項(xiàng),故只支持靜態(tài)方式創(chuàng)建任務(wù)及信號(hào)量。下面分步開啟rtconfig.h配置常用選項(xiàng)。

01

RT_USING_HEAP:開啟heap

根據(jù)芯片型號(hào)在board.c第37行,修改SARM_SIZE大小,默認(rèn)為8,GD32F150C8T6正好也為8K。

圖15:SRAM_SIZE配置

開啟RT_USING_HEAP選項(xiàng)后,在board.c的rt_hw_board_init()內(nèi)將調(diào)用rt_system_heap_init()

#if defined(RT_USING_USER_MAIN)&& defined(RT_USING_HEAP)

rt_system_heap_init((void*)HEAP_BEGIN,(void*)SRAM_END);

#endif

其中:

SRAM_END:根據(jù)宏定義為0x20000000 +SRAM_SIZE * 1024

HEAP_BEGIN:

圖16:HEAP_BEGIN定義

其中Image$$RW_IRAM1$$ZI$$Limit是鏈接器導(dǎo)出符號(hào),表示ZI段的結(jié)束地址。

配置完成后,就可通過動(dòng)態(tài)創(chuàng)建任務(wù)、信號(hào)量等方式開發(fā)軟件了。

02

RT_USING_TIMER_SOFT:開啟軟件定時(shí)器

Nano默認(rèn)配置未開啟軟件定時(shí)器功能。開啟軟件定時(shí)器功能后,可創(chuàng)建多個(gè)軟件定時(shí)器,定時(shí)器精度為Systick觸發(fā)精度。

圖17:軟件定時(shí)器開啟

- End -


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • rt_thread
    +關(guān)注

    關(guān)注

    2

    文章

    13

    瀏覽量

    14658

原文標(biāo)題:手把手教你實(shí)戰(zhàn)RT-Thread Nano,不信都這樣了你還不會(huì)

文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RT-Thread最新推出Nano極簡版

    RT-Thread適時(shí)推出第一個(gè)RT-Thread Nano極簡版,適用于家電、消費(fèi)電子、醫(yī)療設(shè)備、工控等領(lǐng)域大量使用的32位ARM入門級(jí)MCU的場合,支持多任務(wù)處理、信號(hào)量和郵箱等相對(duì)完整的實(shí)時(shí)操作系統(tǒng)特性。
    發(fā)表于 07-31 11:35 ?5364次閱讀

    移植RT-Thread nano到CW32L083

    移植RT-Thread Nano到CW32L083開發(fā)板上,并成功運(yùn)行。
    的頭像 發(fā)表于 07-03 09:04 ?2.2w次閱讀
    移植<b class='flag-5'>RT-Thread</b> <b class='flag-5'>nano</b>到CW32L083

    i.MX RT1170:VGLite移植RT-Thread Nano過程講解(下)

    上篇介紹了如何移植 RT-Thread Nano 內(nèi)核與 Finsh 控制臺(tái)到 RT1170。本篇繼續(xù)介紹如何將 NXP 官方的 VGLite API 移植到 RT-Thread
    的頭像 發(fā)表于 11-09 11:22 ?931次閱讀

    手把手教你實(shí)戰(zhàn)RT-Thread Nano,不信都這樣了還不會(huì)

    手把手教你實(shí)戰(zhàn)RT-Thread Nano,不信都這樣了還不會(huì)
    發(fā)表于 11-23 10:30

    基于 Keil MDK 移植 RT-Thread Nano

    Pack 了。另外,如果需要安裝其他版本,則需要展開 RealThread::RT-Thread,進(jìn)行選擇。 方法二:手動(dòng)安裝 我們也可以官網(wǎng)下載
    發(fā)表于 03-29 06:58

    RT-Thread Nano 簡介

    RT-Thread Nano 是一個(gè)極簡版的硬實(shí)時(shí)內(nèi)核,它是由 C 語言開發(fā),采用面向?qū)ο蟮木幊趟季S,具有良好的代碼風(fēng)格,是一款可裁剪的、搶占式實(shí)時(shí)多任務(wù)的 RTOS。其內(nèi)存資源占用極小,功能包括
    發(fā)表于 05-14 10:22

    基于 Keil MDK 移植 RT-Thread Nano

    ,進(jìn)行選擇。方法二:手動(dòng)安裝我們也可以官網(wǎng)下載安裝文件,RT-Thread Nano 離線安裝
    發(fā)表于 05-14 10:32

    基于 CubeMX 移植 RT-Thread Nano

    RT-Thread Nano pack 安裝包進(jìn)行安裝。在基礎(chǔ)工程中添加 RT-Thread Nano
    發(fā)表于 05-14 16:09

    RT-Thread Studio 上使用 RT-Thread Nano

    本文介紹了如何在 RT-Thread Studio 上使用 RT-Thread Nano,并以創(chuàng)建 stm32f103RB 的 Nano 工程為例。準(zhǔn)備工作
    發(fā)表于 05-18 15:59

    基于 Keil MDK 移植 RT-Thread Nano

    ,進(jìn)行選擇。方法二:手動(dòng)安裝我們也可以官網(wǎng)下載安裝文件,RT-Thread Nano 離線安裝
    發(fā)表于 05-19 18:15

    pack的安裝rt-thread的使用

    的F407探索者,軟件是Keil 5.26, RT-Threadnano 3.1.3,參考的是《正點(diǎn)原子RT-Thread環(huán)境快速搭建入門教程》。nano pack有兩種
    發(fā)表于 08-24 06:50

    【國產(chǎn)MCU系列】在 HK32F030 上移植 RT-Thread Nano

    如需下載相關(guān)開源資料請(qǐng)點(diǎn)擊閱讀原文這是一個(gè)航順 HK32F030 的 RT-Thread Nano 移植示例,記錄了在 Keil 裸機(jī)工程的基礎(chǔ)上進(jìn)行 RT-Thread Nano
    發(fā)表于 11-21 18:51 ?42次下載
    【國產(chǎn)MCU系列】在 HK32F030 上移植 <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Nano</b>

    RT-Thread Nano入門學(xué)習(xí)筆記

    RT-Thread Nano入門學(xué)習(xí)筆記
    發(fā)表于 11-26 12:36 ?20次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Nano</b>入門學(xué)習(xí)筆記

    基于 Keil MDK 移植 RT-Thread Nano

    本文介紹如何基于 Keil MDK 移植 RT-Thread Nano ,并以一個(gè) stm32f103 的基礎(chǔ)工程作為示例進(jìn)行講解。 RT-Thread Nano 已集成在 Keil
    發(fā)表于 01-26 17:04 ?16次下載
    基于 Keil MDK 移植 <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Nano</b>

    如何創(chuàng)建RT-Thread Nano工程

    本文將嘗試使用國產(chǎn)的嵌入式實(shí)時(shí)操作系統(tǒng)RT-Thread,相比較于FreeRTOS,RT-Thread還是有很多有點(diǎn)的,比如有Fish命令行界面,國產(chǎn)開源免費(fèi),Nano版本代碼量極小,移植起來非常
    的頭像 發(fā)表于 03-19 12:13 ?3801次閱讀