亚洲免费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网站| 国产欧美日本亚洲精品一4区| 国产免费播放一区二区| 99RE6在线观看国产精品| 日本骚色老妇视频网站| 国产亚洲一区二区精品| 国内自拍速发福利免费在线观看 | 国产精品亚洲二区在线观看 | 91久久精品国产综合另类专区 | 久久亚洲欧美国产精品| 久久中文精品无码中文字幕下载| 亚洲熟妇丰满大屁股熟妇| 99视频全部免费精品全部四虎| 中文字幕天天躁日日躁狠狠| 亚洲av永久综合网站美女| 国产午夜精品视频观看| 久久成人国产精品一区二区| 99久久精品免费观看国产| 大香伊蕉国产av| 视频一区欧美| 亚洲无码中文字幕日韩无码| 蜜臀精品一区二区三区| 国产亚洲精品视频一区二区三区| 国产熟妇与子伦hd| 中文字字幕在线精品乱码| 亚洲人成网站77777在线观看| 成人午夜视频一区二区无码| 日本午夜一区二区视频| 与漂亮的女邻居少妇好爽| 欧美变态另类刺激| 大地资源在线播放观看mv| 一本一本久久久久a久久综合激情| 蜜桃av夺取一区二区三区| 成人av资源在线播放| 人人妻人人澡人人爽精品日本 | 人妻献身系列第54部| 国产真人无遮挡免费视频| 极品美女销魂一区二区三| 夜夜高潮夜夜爽免费观看| 免费观看交性大片| 日日碰狠狠躁久久躁|