亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        入門物聯(lián)網(wǎng)操作系統(tǒng)(上)

        2019-09-10 13:47:13
        電腦報(bào) 2019年26期
        關(guān)鍵詞:例子模擬器代碼

        一般嵌入式操作系統(tǒng)因?yàn)樗奶厥庑?,往往和硬件平臺(tái)密切相關(guān),具體的嵌入式操作系統(tǒng)往往只能在特定的硬件上運(yùn)行。對(duì)于剛接觸 RT-Thread 操作系統(tǒng)的讀者來說并不容易馬上就獲得一個(gè)和 RT-Thread 操作系統(tǒng)相配套的硬件模塊,但隨著計(jì)算機(jī)技術(shù)的發(fā)展,我們可以采用軟件方式來模擬一個(gè)能夠運(yùn)行 RT-Thread 操作系統(tǒng)的硬件模塊,這就是 ARM 公司的 MDK-ARM 仿真模擬環(huán)境。

        MDK-ARM(MDK-ARM Micro

        controller Development Kit)軟件是一套完整的集成開發(fā)環(huán)境(IDE),它出自 ARM 公司,包括了針對(duì) ARM 芯片(ARM7、ARM9、Cortex-M 系列、Cortex-R 系列等)的高效 C/C++ 編譯器;針對(duì)各類 ARM 設(shè)備、評(píng)估板的工程向?qū)А⒐こ坦芾?;用于軟件模擬運(yùn)行硬件平臺(tái)的模擬器;以及與市面上常見的如 ST-Link、JLink 等在線仿真器相連接以配合調(diào)試目標(biāo)板的調(diào)試器。MDK-ARM 軟件中的軟件仿真模擬器,采用完全軟件模擬方式解釋執(zhí)行 ARM 的機(jī)器指令,并實(shí)現(xiàn)外圍的一些外設(shè)邏輯,從而構(gòu)成一套完整的虛擬硬件環(huán)境,使得用戶能夠不借助真實(shí)的硬件平臺(tái)就能夠在電腦上執(zhí)行相應(yīng)的目標(biāo)程序。

        MDK-ARM 集成開發(fā)環(huán)境因?yàn)槠渫耆?STM32F103 軟件仿真環(huán)境,也讓我們有機(jī)會(huì)在不使用真實(shí)硬件環(huán)境的情況下直接在電腦上運(yùn)行目標(biāo)代碼。這套軟件仿真模擬器能夠完整地虛擬出 ARM Cortex-M3 的各種運(yùn)行模式、外設(shè),如中斷異常、時(shí)鐘定時(shí)器、串口等,這幾乎和真實(shí)的硬件環(huán)境完全一致。實(shí)踐也證明,本文使用到的這份 RT-Thread 入門例程,在編譯成二進(jìn)制代碼后,不僅能夠在模擬器上實(shí)現(xiàn)軟件模擬運(yùn)行,也能夠不需要修改而在真實(shí)硬件平臺(tái)上正常運(yùn)行。

        下面我們將選擇 MDK-ARM 集成開發(fā)環(huán)境作為目標(biāo)硬件平臺(tái)來觀察 RT-Thread 操作系統(tǒng)是如何運(yùn)行的。

        一、準(zhǔn)備工作

        MDK 開發(fā)環(huán)境:需要安裝 MDK-ARM 5.24 (正式版或評(píng)估版,5.14 版本及以上版本均可),這個(gè)版本也是當(dāng)前比較新的版本,它能夠提供相對(duì)比較完善的調(diào)試功能。安裝方法可以參考Keil MDK安裝。

        Keil MDK安裝鏈接:

        https://www.rt-thread.org/docum

        ent/site/tutorial/quick-start/keil/keil/

        二、初識(shí) RT-Thread

        作為一個(gè)操作系統(tǒng),RT-Thread 的代碼規(guī)模怎么樣呢?我們找到RT-Thread壓縮包文件,將它解壓,我們這里解壓到 D盤,解壓完成后的目錄結(jié)構(gòu)如圖1所示:

        各個(gè)目錄所包含的文件類型的描述如圖2所示:

        在目錄下,有一個(gè) project.uvprojx 文件,它是本文內(nèi)容所引述的例程中的一個(gè) MDK5 工程文件,雙擊 “project.uvprojx” 圖標(biāo),打開此工程文件(圖3):

        在工程主窗口的左側(cè) “Project” 欄里可以看到該工程的文件列表,這些文件被分別存放到如下幾個(gè)組內(nèi),分別是(圖4):

        現(xiàn)在我們點(diǎn)擊一下窗口上方工具欄中的按鈕,對(duì)該工程進(jìn)行編譯,如圖5所示:

        編譯的結(jié)果顯示在窗口下方的 “Build” 欄中,沒什么意外的話,最后一行會(huì)顯示“0 Error(s), * Warning(s).”,即無任何錯(cuò)誤和警告。

        在編譯完 RT-Thread/STM32 后,我們可以通過 MDK-ARM 的模擬器來仿真運(yùn)行 RT-Thread。點(diǎn)擊窗口右上方的按鈕或直接按 “Ctrl+F5” 進(jìn)入仿真界面,再按 F5 開始運(yùn)行,然后點(diǎn)擊該圖工具欄中的按鈕或者選擇菜單欄中的 “View→Serial Windows→UART#1”,打開串口 1 窗口,可以看到串口的輸出只顯示了 RT-Thread 的 LOGO,這是因?yàn)橛脩舸a是空的,其模擬運(yùn)行的結(jié)果如圖6、7所示:

        三、系統(tǒng)啟動(dòng)代碼

        一般了解一份代碼大多從啟動(dòng)部分開始,同樣這里也采用這種方式,先尋找啟動(dòng)的源頭。以 MDK-ARM 為例,MDK-ARM 的用戶程序入口為 main() 函數(shù),位于 main.c 文件中。系統(tǒng)啟動(dòng)后先從匯編代碼 startup_stm32f103xe.s 開始運(yùn)行,然后跳轉(zhuǎn)到 C 代碼,進(jìn)行 RT-Thread 系統(tǒng)功能初始化,最后進(jìn)入用戶程序入口 main()。

        下面我們來看看在 components.c 中定義的這段代碼:

        1//components.c中定義

        2/*re-define main function */

        3int $Sub$$main(void)

        4{

        5rt_hw_interrupt_disable();

        6rtthread_startup();

        7return 0;

        8}

        在這里$Sub$$main函數(shù)僅僅調(diào)用了rtthread_startup()函數(shù)。RT-Thread 支持多種平臺(tái)和多種編譯器,而rtthread_startup()函數(shù)是 RT-Thread 規(guī)定的統(tǒng)一入口,所以$Sub$$main函數(shù)只需調(diào)用rtthread_startup()函數(shù)即可。例如采用 GNU GCC 編譯器編譯的 RT-Thread,就是直接從匯編啟動(dòng)代碼部分跳轉(zhuǎn)到rtthread_startup()函數(shù)中,并開始第一個(gè) C 代碼的執(zhí)行的。在 components.c 的代碼中找到rtthread_startup()函數(shù),我們將可以看到 RT-Thread 的啟動(dòng)流程:

        1int rtthread_startup(void)

        2{

        3rt_hw_interrupt_disable();

        4

        5/*board level initalization

        6*NOTE:please initialize heap inside board initialization.

        7*/

        8rt_hw_board_init();

        9

        10/*show RT-Thread version?*/

        11 rt_show_version();

        12

        13/*timer system initialization*/

        14rt_system_timer_init();

        15

        16/*scheduler system initializati on*/

        17rt_system_scheduler_init();

        18

        19#ifdef RT_USING_SIGNALS

        20/*signal system initialization */

        21rt_system_signal_init();

        22#endif

        23

        24/* create init_thread */

        25rt_application_init();

        26

        27/* timer thread initialization*/

        28rt_system_timer_thread_init();

        29

        30/* idle thread initialization*/

        31rt_thread_idle_init();

        32

        33/* start scheduler */

        34rt_system_scheduler_start();

        35

        36/* never reach here */

        37return 0;

        38}

        這部分啟動(dòng)代碼,大致可以分為四個(gè)部分:

        初始化與系統(tǒng)相關(guān)的硬件;

        初始化系統(tǒng)內(nèi)核對(duì)象,例如定時(shí)器、調(diào)度器;

        初始化系統(tǒng)設(shè)備,這個(gè)主要是為 RT-Thread 的設(shè)備框架做的初始化;

        初始化各個(gè)應(yīng)用線程,并啟動(dòng)調(diào)度器。

        四、用戶入口代碼

        上面的啟動(dòng)代碼基本上可以說都是和 RT-Thread 系統(tǒng)相關(guān)的,那么用戶如何加入自己的應(yīng)用程序的初始化代碼呢?RT-Thread 將 main 函數(shù)作為了用戶代碼入口,只需要在 main 函數(shù)里添加自己的代碼即可。

        1int main(void)

        2{

        3/* user app entry*/

        4return 0;

        5}

        ARM教程鏈接:

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

        五、跑馬燈的例子

        對(duì)于從事電子方面開發(fā)的技術(shù)工程師來說,跑馬燈大概是最簡(jiǎn)單的例子,就類似于每種編程語(yǔ)言中程序員接觸的第一個(gè)程序 Hello World 一樣,所以這個(gè)例子就從跑馬燈開始。讓它定時(shí)地對(duì) LED 進(jìn)行更新(關(guān)或滅)。

        我們 在UART#1 中輸入 msh 命令:led 然后回車就可以運(yùn)行起來了,如圖8所示:

        六、跑馬燈例子

        1/*

        2*程序清單:跑馬燈例程

        3*

        4*跑馬燈大概是最簡(jiǎn)單的例子,就類似于每種編程語(yǔ)言中程序員接觸的第一個(gè)程序

        5*Hello World 一樣,所以這個(gè)例子就從跑馬燈開始。創(chuàng)建一個(gè)線程,讓它定時(shí)地對(duì)

        6*LED進(jìn)行更新(關(guān)或滅)

        7*/

        8

        9int led(void)

        10{

        11 rt_uint8_t count;

        12

        13rt_pin_mode(LED_PIN,PIN_MODE_OUTPUT);

        14

        15for(count=0;count<10;count++)

        16{

        17rt_pin_write(LED_PIN,PIN_HIG

        H);

        18rt_kprintf(“l(fā)ed on,count:%d”,count);

        19rt_thread_mdelay(500);

        20

        21rt_pin_write(LED_PIN,PIN_LO

        W);

        22rt_kprintf(“l(fā)ed off

        ”);

        23rt_thread_mdelay(500);

        24}

        25return 0;

        26}

        27MSH_CMD_EXPORT(led,RT-Thread first led sample);

        七、常見問題

        出現(xiàn)如下編譯錯(cuò)誤

        1rt-threadsrckservice.c(823):error:#929:incorrect use of vaarg fieldwidth=aarg(args,int);

        2rt-threadsrckservice.c(842):error:#929:incorrect use of vaarg precision=aarg(args,int);

        3………

        原因:這類問題基本上都是因?yàn)榘惭b了 ADS 導(dǎo)致,ADS 與 keil共存,va_start 所在的頭文件指向了 ADS 的文件夾。

        八、解決辦法

        1.刪除 ADS 環(huán)境變量;

        2.卸載 ADS 和Keil,重啟電腦,重裝Keil。

        猜你喜歡
        例子模擬器代碼
        飛行模擬器大揭秘
        航空世界(2022年3期)2022-06-01 06:13:42
        了不起的安檢模擬器
        盲盒模擬器
        劃船模擬器
        《團(tuán)圓之后》:“戲改”的“一個(gè)鮮明的例子”
        中華戲曲(2020年1期)2020-02-12 02:29:00
        創(chuàng)世代碼
        創(chuàng)世代碼
        創(chuàng)世代碼
        創(chuàng)世代碼
        初中英語(yǔ)課堂妙用“舉例子”
        日韩av午夜在线观看| av中文码一区二区三区| 一区二区三区在线观看人妖| 精品国产精品三级精品av网址| 大肉大捧一进一出视频出来呀| 456亚洲老头视频| 国产一区二区三区涩涩涩| 日本av一区二区三区在线| 区二区三区玖玖玖| 人妻无码视频| 久久综合这里只有精品| 成人免费自拍视频在线观看| 亚洲综合精品伊人久久 | 麻豆精品国产免费av影片| 99riav国产精品视频| 国产成人久久精品77777综合| 无码区a∨视频体验区30秒| 中文字幕人妻av四季| 国产激情一区二区三区| 九九九精品成人免费视频小说| 亚洲中文字幕不卡无码| 久久蜜桃资源一区二区| 中文字幕乱码亚洲精品一区| 国产特级全黄一级毛片不卡| 日韩乱码精品中文字幕不卡| 我和丰满妇女激情视频| 色播久久人人爽人人爽人人片av| 久久亚洲成a人片| 在线人妻va中文字幕| 无码精品人妻一区二区三区av| 午夜探花在线观看| 日本一区二区高清视频在线| 真人做爰试看120秒| 午夜精品久久久久久中宇| 日本做受高潮好舒服视频| 亚洲精品成人av观看| 国产亚洲中文字幕久久网| 小辣椒福利视频导航| 欧美精品黄页在线观看视频| 用力草我小逼视频在线播放| 公和我做好爽添厨房|