999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

入門物聯網操作系統(上)

2019-09-10 13:47:13
電腦報 2019年26期
關鍵詞:環境

一般嵌入式操作系統因為它的特殊性,往往和硬件平臺密切相關,具體的嵌入式操作系統往往只能在特定的硬件上運行。對于剛接觸 RT-Thread 操作系統的讀者來說并不容易馬上就獲得一個和 RT-Thread 操作系統相配套的硬件模塊,但隨著計算機技術的發展,我們可以采用軟件方式來模擬一個能夠運行 RT-Thread 操作系統的硬件模塊,這就是 ARM 公司的 MDK-ARM 仿真模擬環境。

MDK-ARM(MDK-ARM Micro

controller Development Kit)軟件是一套完整的集成開發環境(IDE),它出自 ARM 公司,包括了針對 ARM 芯片(ARM7、ARM9、Cortex-M 系列、Cortex-R 系列等)的高效 C/C++ 編譯器;針對各類 ARM 設備、評估板的工程向導、工程管理;用于軟件模擬運行硬件平臺的模擬器;以及與市面上常見的如 ST-Link、JLink 等在線仿真器相連接以配合調試目標板的調試器。MDK-ARM 軟件中的軟件仿真模擬器,采用完全軟件模擬方式解釋執行 ARM 的機器指令,并實現外圍的一些外設邏輯,從而構成一套完整的虛擬硬件環境,使得用戶能夠不借助真實的硬件平臺就能夠在電腦上執行相應的目標程序。

MDK-ARM 集成開發環境因為其完全的 STM32F103 軟件仿真環境,也讓我們有機會在不使用真實硬件環境的情況下直接在電腦上運行目標代碼。這套軟件仿真模擬器能夠完整地虛擬出 ARM Cortex-M3 的各種運行模式、外設,如中斷異常、時鐘定時器、串口等,這幾乎和真實的硬件環境完全一致。實踐也證明,本文使用到的這份 RT-Thread 入門例程,在編譯成二進制代碼后,不僅能夠在模擬器上實現軟件模擬運行,也能夠不需要修改而在真實硬件平臺上正常運行。

下面我們將選擇 MDK-ARM 集成開發環境作為目標硬件平臺來觀察 RT-Thread 操作系統是如何運行的。

一、準備工作

MDK 開發環境:需要安裝 MDK-ARM 5.24 (正式版或評估版,5.14 版本及以上版本均可),這個版本也是當前比較新的版本,它能夠提供相對比較完善的調試功能。安裝方法可以參考Keil MDK安裝。

Keil MDK安裝鏈接:

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

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

二、初識 RT-Thread

作為一個操作系統,RT-Thread 的代碼規模怎么樣呢?我們找到RT-Thread壓縮包文件,將它解壓,我們這里解壓到 D盤,解壓完成后的目錄結構如圖1所示:

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

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

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

現在我們點擊一下窗口上方工具欄中的按鈕,對該工程進行編譯,如圖5所示:

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

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

三、系統啟動代碼

一般了解一份代碼大多從啟動部分開始,同樣這里也采用這種方式,先尋找啟動的源頭。以 MDK-ARM 為例,MDK-ARM 的用戶程序入口為 main() 函數,位于 main.c 文件中。系統啟動后先從匯編代碼 startup_stm32f103xe.s 開始運行,然后跳轉到 C 代碼,進行 RT-Thread 系統功能初始化,最后進入用戶程序入口 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函數僅僅調用了rtthread_startup()函數。RT-Thread 支持多種平臺和多種編譯器,而rtthread_startup()函數是 RT-Thread 規定的統一入口,所以$Sub$$main函數只需調用rtthread_startup()函數即可。例如采用 GNU GCC 編譯器編譯的 RT-Thread,就是直接從匯編啟動代碼部分跳轉到rtthread_startup()函數中,并開始第一個 C 代碼的執行的。在 components.c 的代碼中找到rtthread_startup()函數,我們將可以看到 RT-Thread 的啟動流程:

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}

這部分啟動代碼,大致可以分為四個部分:

初始化與系統相關的硬件;

初始化系統內核對象,例如定時器、調度器;

初始化系統設備,這個主要是為 RT-Thread 的設備框架做的初始化;

初始化各個應用線程,并啟動調度器。

四、用戶入口代碼

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

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

五、跑馬燈的例子

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

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

六、跑馬燈例子

1/*

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

3*

4*跑馬燈大概是最簡單的例子,就類似于每種編程語言中程序員接觸的第一個程序

5*Hello World 一樣,所以這個例子就從跑馬燈開始。創建一個線程,讓它定時地對

6*LED進行更新(關或滅)

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(“led on,count:%d”,count);

19rt_thread_mdelay(500);

20

21rt_pin_write(LED_PIN,PIN_LO

W);

22rt_kprintf(“led off

”);

23rt_thread_mdelay(500);

24}

25return 0;

26}

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

七、常見問題

出現如下編譯錯誤

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………

原因:這類問題基本上都是因為安裝了 ADS 導致,ADS 與 keil共存,va_start 所在的頭文件指向了 ADS 的文件夾。

八、解決辦法

1.刪除 ADS 環境變量;

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

猜你喜歡
環境
長期鍛煉創造體內抑癌環境
一種用于自主學習的虛擬仿真環境
孕期遠離容易致畸的環境
不能改變環境,那就改變心境
環境與保護
環境
孕期遠離容易致畸的環境
高等院校環境類公選課的實踐和探討
掌握“三個三” 兜底環境信訪百分百
我國環境會計初探
中國商論(2016年33期)2016-03-01 01:59:38
主站蜘蛛池模板: 伊人网址在线| 久久久久无码精品| 日韩在线播放欧美字幕| 亚洲无码日韩一区| 国产 日韩 欧美 第二页| 国产久草视频| 直接黄91麻豆网站| 国产男女免费完整版视频| 精品三级网站| 久久久久久久久亚洲精品| 国产三级国产精品国产普男人| 成人一级黄色毛片| 福利小视频在线播放| 久久精品午夜视频| 国产手机在线小视频免费观看 | 国产av剧情无码精品色午夜| 亚洲精品不卡午夜精品| 色丁丁毛片在线观看| 欧美日韩中文字幕二区三区| 少妇被粗大的猛烈进出免费视频| 亚洲欧洲日韩综合色天使| 尤物成AV人片在线观看| 亚洲国内精品自在自线官| 无码一区二区波多野结衣播放搜索| 国产精品国产三级国产专业不| 国产一区二区色淫影院| 91亚洲精品国产自在现线| 久久永久免费人妻精品| 五月丁香在线视频| 99精品高清在线播放| 国产91在线|中文| 欧美综合激情| 青草娱乐极品免费视频| 午夜啪啪福利| yjizz视频最新网站在线| 国产高清自拍视频| 日韩毛片在线播放| 亚洲另类色| 日韩色图在线观看| 亚洲欧洲自拍拍偷午夜色| 亚洲h视频在线| 亚洲 欧美 偷自乱 图片| 亚洲人成人无码www| 久久精品人人做人人爽| 国产精品一区二区无码免费看片| a在线亚洲男人的天堂试看| 亚洲日韩精品欧美中文字幕| 国产无码性爱一区二区三区| 极品性荡少妇一区二区色欲| 日韩欧美在线观看| 国内精品一区二区在线观看| 伊人激情综合网| 青青草原偷拍视频| 亚洲三级视频在线观看| a级毛片免费播放| 大陆国产精品视频| 58av国产精品| 天堂亚洲网| 伊人中文网| 试看120秒男女啪啪免费| 亚洲国产成人久久精品软件| 伊人大杳蕉中文无码| 国产日韩欧美在线播放| 国产精品2| 亚洲三级成人| 亚洲综合一区国产精品| 国产精品私拍在线爆乳| 国产一区成人| 国产成人91精品| 婷婷色中文网| 午夜a级毛片| 日韩高清中文字幕| 成人国产精品一级毛片天堂| 国产激情无码一区二区APP| 国产99视频精品免费观看9e| 亚洲中文字幕手机在线第一页| 91在线国内在线播放老师| 米奇精品一区二区三区| 国产精品香蕉| 香蕉久久国产超碰青草| 黄色网页在线观看| 国产免费黄|