在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在Windows平臺使用QEMU運行RT-Thread動態模塊

lPCU_elecfans ? 來源:未知 ? 作者:李倩 ? 2018-10-13 10:12 ? 次閱讀

摘要

本應用筆記描述了在 Windows 平臺使用 QEMU 運行 RT-Thread 動態模塊。

本文的目的和結構

本文的目的和背景

RT-Thread 動態模塊組件dlmodule提供了動態加載程序模塊的機制。dlmodule 組件更多的是一個 ELF 格式加載器,把單獨編譯的一個 elf 文件的代碼段,數據段加載到內存中,并對其中的符號進行解析,綁定到內核導出的 API 地址上。動態模塊 elf 文件主要放置于 RT-Thread 下的文件系統上。

RT-Thread 的動態模塊組件目前支持兩種格式:

.mo則是編譯出來時以.mo做為后綴名的可執行動態模塊。它可以被加載,并且系統中會自動創建一個主線程執行這個動態模塊中的main函數;同時這個main(int argc, char** argv)函數也可以接受命令行上的參數

.so則是編譯出來時以.so做為后綴名的動態庫。它可以被加載,并駐留在內存中,并提供一些函數集由其他程序(內核里的代碼或動態模塊)來使用。

本文主要講解了在 Windows 平臺使用 QEMU 運行 RT-Thread 動態模塊。

本文的結構

本文首先講解了如何使能 RT-Thread 動態模塊組件,然后講解了如何基于 QEMU 運行動態模塊及動態庫。

準備工作

下載 RT-Thread 源碼,推薦下載3.1.0及以上版本。

下載 RT-Thread Env 工具,推薦下載1.0.0及以上版本。

下載 rtthread-apps 源代碼。

下載鏈接:

https://github.com/RT-Thread/rtthread-apps(請復制至外部瀏覽器打開)

使能動態模塊組件

配置工程

在 Env 控制臺切換到 qemu-vexpress-a9 BSP 根目錄,然后輸入menuconfig命令打開配置菜單。

進入“ RT-Thread Components → POSIX layer and C standard library”菜單,按下圖箭頭所示打開 libc 和動態模塊的配置選項。

進入“RT-Thread Components → Device virtual file system”菜單打開文件系統的配置選項。退出 menuconfig 并保存配置。

編譯工程

使用scons命令編譯工程。

運行動態模塊命令

編譯完成后使用qemu.bat命令運行工程。按 Tab 鍵查看所有命令可以看到動態模塊的兩個命令list_module和list_symbols,表明動態模塊組件配置成功。

list_module命令可以查看當前正在運行的動態模塊。

list_symbols命令可以查看動態模塊可以使用的函數及其對應的內存地址。加載動態模塊的時候會對其中的符號進行解析,并綁定到對應的函數地址上。

生成動態模塊編譯依賴環境

關閉運行的程序,在 Env 控制臺使用scons --target=ua -s命令生成編譯動態模塊時需要包括的內核頭文件搜索路徑及全局宏定義。

運行動態模塊

運行最簡單的動態模塊

創建動態模塊

獲取示例

下載 RT-Thread 動態模塊工具庫rtthread-apps,rtthread-apps 的 tools 目錄放置了編譯動態模塊需要使用到的 Python 和 SConscript 腳本。hello 目錄下的 main.c 是一個簡單的動態模塊使用示例,源代碼如下所示。

#include int main(int argc, char *argv[]) { printf("Hello, world "); return 0; }

這段代碼實現了一個最簡單的 main 函數,打印字符串“Hello world”。

設置環境變量

在 Env 控制臺切換到 rtthread-apps 根目錄(目錄所在全路徑不包含空格和中文字符),然后通過下面 2 條命令設置環境變量。

set RTT_ROOT=d: epository t-thread,設置 RTT_ROOT 為 RT-Thread 源代碼根目錄。

set BSP_ROOT=d: epository t-threadspqemu-vexpress-a9,設置 BSP_ROOT 為 qemu-vexpress-a9 BSP 根目錄。

編譯動態模塊

使用scons --app=hello命令編譯動態模塊。

在 rtthread-apps/hello 目錄下會生成動態模塊文件 hello.mo。

將動態模塊放入文件系統

編譯好的動態模塊 hello.mo 需要放到文件系統下。qemu-vexpress-a9 BSP 會使用一個虛擬的 sd 卡設備 sd.bin,我們需要把動態模塊放到這個虛擬的 sd 卡里面。對于物理設備來說,直接將動態模塊添加到文件系統管理的存儲設備中就可以。這里需要使用到 Env 工具里面的一個小工具 fatdisk,它位于 Env 的 tools 目錄下,里面也提供了一份 fatdisk 的使用說明。這里使用 fatdisk 用于把 PC 上本地的一個目錄轉換成 sd.bin 映像文件,這個映像文件是做為一個 fat 文件系統而存在。

新建目錄

在 fatdisk 目錄下新建一個 sd 目錄,并復制剛剛編譯的動態模塊 hello.mo 文件到 sd 目錄。

修改配置文件

按照下面的配置修改 fatdisk 目錄下的配置文件 fatdisk.xml。

映像文件空間大小 disk_size 配置為了 5120Kbytes(大小可根據需要配置)。

映像文件的扇區大小 sector_size 需要配置為 512 KBytes。

要轉換目錄名 root_dir 配置為 sd,表示當前目錄下的 sd 目錄。

指定生成的映像文件名稱 output 配置為 sd.bin。

strip 需要配置為 0。

5120 512 sd sd.bin 0

生成映像文件

在 Env 控制臺切換到 fatdisk 根目錄,運行fatdisk命令則會按照配置文件 fatdisk.xml 中的配置,把里面指定的目錄轉換成 flash 映像文件。

運行成功則會在 fatdisk 目錄生成一個 sd.bin 文件,大小為 5MB。

生成的映像文件 sd.bin 需要復制到 qemu-vexpress-a9 BSP 目錄。

運行動態模塊

在 Env 控制臺切換到 qemu-vexpress-a9 BSP 根目錄輸入qemu.bat命令運行工程。

系統運行起來后會看到文件系統初始化成功信息 “file system initialization done!”。

使用ls命令可以看到根目錄下的動態模塊文件hello.mo。

輸入hello命令運行動態模塊 hello.mo。可以看到動態模塊main函數打印的字符串“Hello,world”

使用動態模塊組件運行動態模塊的主要原理如下圖所示:

動態模塊的初始化和清理函數

動態模塊組件提供了2個擴展的函數供用戶使用,分別是module_init()和module_cleanup()。

module_init()函數會在動態模塊運行前被執行,用戶可以根據需要做一些初始化工作。

module_cleanup()函數會在動態模塊運行結束后在 idle 線程里回調一次,執行用戶設置的清理工作。

RT-Thread 系統會自動創建一個線程執行動態模塊中的 main 函數,同時這個main(int argc, char* argv[])函數也可以接受命令行上的參數。這個線程默認的優先級等同空閑線程的優先級,線程堆棧默認為2048字節。用戶可以在module_init()函數里修改這個線程的優先級和堆棧。

示例代碼

基于前面簡單的動態模塊示例代碼 main.c 增加module_init()和module_cleanup()函數的使用,示例代碼如下所示。

#include #include /* 動態模塊的初始化函數 */ void module_init(struct rt_dlmodule *module) { module->priority = 8; module->stack_size = 4096; printf("this is module %s initial function! ",module->parent.name); } /* 動態模塊的清理函數 */ void module_cleanup(struct rt_dlmodule *module) { printf("this is module %s cleanup function! ",module->parent.name); } int main(int argc, char *argv[]) { int i; printf("hello world from RTT::dynamic module! "); /* 打印命令行參數 */ for(i = 0;i < argc;i ++) ? ?{ ? ? ? ?printf("argv[%d]:%s ",i,argv[i]); ? ?} ? ?return 0; }

示例代碼主要實現了如下功能:

在動態模塊的初始化函數里可以設置這個線程的優先級和堆棧。

清理函數簡單的打印信息。

main 函數解析命令行參數并打印出來。

請參考前面小節將此示例代碼生成的動態模塊文件放到文件系統里,并將生成的映像文件 sd.bin 復制到 qemu-vexpress-a9 BSP 目錄。

運行結果

在 Env 控制臺切換到 qemu-vexpress-a9 BSP 根目錄輸入qemu.bat命令運行工程。

系統運行起來后會看到文件系統初始化成功信息 “file system initialization done!”。

使用ls命令可以看到根目錄下的動態模塊文件hello.mo。

輸入hello this is rt-thread!命令運行動態模塊 hello.mo。hello 后面的字符串為參數。

執行到動態模塊初始化函數module_init時會打印字符串 "this is module hello initial function!"。

執行動態模塊的 main 函數時會打印字符串 “hello world from RTT::dynamic module!”,命令行參數也依次打印了出來。

動態模塊運行結束后又執行清理函數module_cleanup,打印字符串 "this is module hello cleanup function!"。

運行動態庫

創建動態庫

獲取示例

下載 RT-Thread 動態模塊工具庫rtthread-apps,rtthread-apps 的 lib 目錄下有一個簡單的動態庫示例的 lib.c,源代碼如下所示,它實現了 2 個簡單的函數供使用。

#include int lib_func(void) { printf("hello world from RTT::dynamic library! "); return 0; } int add_func(int a, int b) { return (a + b); }

編譯動態庫

編譯動態庫之前需要先設置環境變量。然后使用scons --lib=lib命令編譯動態庫。

在 rtthread-apps/lib 目錄下會生成動態庫文件 lib.so。

請參考前面小節將動態庫文件 lib.so 放到文件系統里,并將生成的映像文件 sd.bin 復制到 qemu-vexpress-a9 BSP 目錄。

運行動態庫

添加示例代碼

將以下示例代碼添加到 qemu-vexpress-a9 BSP applications 目錄下的 main.c 里。

#include #include #include /* 動態庫文件路徑 */ #define APP_PATH "/lib.so" /* 函數指針類型 */ typedef int (*add_func_t)(int, int); typedef void (*lib_func_t)(void); int dlmodule_sample(void) { void* handle; lib_func_t lib_function; add_func_t add_function; /* 以RTLD_LAZY模式打開動態庫文件,并獲取動態庫操作句柄 */ handle = dlopen(APP_PATH,RTLD_LAZY); if(!handle) { printf("dlopen %s failed! ",APP_PATH); return -1; } /* 根據動態庫操作句柄handle,返回動態庫函數lib_func()對應的地址 */ lib_function = (lib_func_t)dlsym(handle,"lib_func"); if(!lib_function) { printf("dlsym %p failed! ",handle); return -1; } /* 運行動態庫函數 */ lib_function(); /* 根據動態庫操作句柄handle,返回動態庫函數add_func()對應的地址 */ add_function = (add_func_t)dlsym(handle,"add_func"); if(!add_function) { printf("dlsym %p failed! ",handle); return -1; } /* 運行動態庫函數計算 3+4 并打印結果 */ printf("add_function result is:%d ",add_function(3,4)); /* 運行完畢根據操作句柄handle關閉動態庫 */ dlclose(handle); return 0; } MSH_CMD_EXPORT(dlmodule_sample, dlmodule sample); int main(void) { printf("hello rt-thread! "); return 0; }

RT-Thread 動態模塊組件也支持 POSIX 標準的 libdl API,此示例代碼調用 libdl API 運行動態庫。示例代碼首先根據動態庫的路徑打開動態庫文件 lib.so,然后獲取動態庫的 lib_func() 函數的地址并運行此函數。之后獲取動態庫的 add_func() 函數的地址,并傳入參數 3 和 4 運行函數計算結果。最后關閉動態庫。

運行動態庫

在 Env 控制臺切換到 qemu-vexpress-a9 BSP 根目錄,輸入scons命令重新編譯工程。編譯完成后輸入qemu.bat命令運行工程。按 Tab 鍵可以看到新增的示例代碼命令dlmodule_Sample。

使用ls命令可以看到根目錄下的動態庫文件 lib.so,輸入dlmodule_sample命令就可以運行動態庫示例代碼。

第一行運行了 lib_func() 函數打印了字符串 “hello world from RTT::dynamic library!”

第二行運行了 add_func() 函數計算了 3+4 并打印了相加結果 7。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • WINDOWS
    +關注

    關注

    3

    文章

    3545

    瀏覽量

    88707
  • 函數
    +關注

    關注

    3

    文章

    4331

    瀏覽量

    62622

原文標題:一文解析使用QEMU運行RT-Thread動態模塊(干貨分享)

文章出處:【微信號:elecfans,微信公眾號:電子發燒友網】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    RT-Thread學習筆記】如何優雅地退出QEMU模擬器?

    RT-Thread學習筆記】如何優雅地退出QEMU模擬器?我想重新編譯源碼,再次運行新的代碼,怎么辦呢?如何才能退出這個QEMU命令行控制臺?
    的頭像 發表于 07-26 04:06 ?5968次閱讀
    【<b class='flag-5'>RT-Thread</b>學習筆記】如何優雅地退出<b class='flag-5'>QEMU</b>模擬器?

    如何在windows和linux平臺使用RT-Thread QEMU BSP,并運行RT-ThreadGUI示例

    開發板的情況下體驗RT-ThreadRT-Thread使用QEMU模擬了ARM vexpress A9開發板,并提供了相關的板級支持包(BSP)。本文主要介紹
    的頭像 發表于 02-08 08:50 ?1.4w次閱讀
    如何在<b class='flag-5'>windows</b>和linux<b class='flag-5'>平臺</b>使用<b class='flag-5'>RT-Thread</b> <b class='flag-5'>QEMU</b> BSP,并<b class='flag-5'>運行</b><b class='flag-5'>RT</b>-ThreadGUI示例

    如何在Ubuntu平臺使用QEMU運行RT-Threadqemu-vexpress-a9BSP工程?

    本文描述了如何在 Ubuntu 平臺使用 QEMU 運行 RT-Thread qemu-vexpress-a9 BSP 工程。
    發表于 03-30 07:40

    如何使用QEMU運行RT-Thread動態模塊組件?

    本文描述了 Windows 平臺使用 QEMU 運行 RT-Thread
    發表于 03-30 07:40

    怎么使用Eclipse開發RT-Thread

    Windows 平臺使用 Eclipse 開發 RT-Thread qemu-vexpress-a9 BSP 工程的時候怎么使用 Ecl
    發表于 04-02 07:48

    Windows上使用VS Code開發RT-Thread qemu-vexpress-a9 BSP工程

    了。本文描述了 Windows 平臺使用 VS Code 開發 RT-Thread qemu-vexpress-a9 BSP 工程。
    發表于 03-31 18:07

    Ubuntu平臺開發RT-Thread文檔中步驟搭建QEMU環境

    NimBLE 可在 QEMU 環境下搭配藍牙 Control 芯片運行,目前 Ubuntu 18.04 下運行成功。QEMU 環境搭建主要
    發表于 07-27 11:19

    如何在Window及Ubuntu平臺使用QEMU運行 RT-Thread qemu-vexpress-a9 BSP工程

    體驗 RT-ThreadRT-Thread 提供了 QEMU 模擬的 ARM vexpress A9 開發板的板級支持包 (BSP)。本文主要介紹 Window
    發表于 10-26 15:19

    Windows平臺使用VSCode調試 RT-Thread qemu-vexpress-a9 BSP工程

    摘要本應用筆記描述了 Windows 平臺使用 VS Code 調試 RT-Thread qemu-vexpress-a9 BSP 工程。
    發表于 10-26 15:25

    Windows平臺使用Eclipse調試RT-Thread qemu-vexpress-a9 BSP工程

    \\qemu-vexpress-a9 切換到 RT-Thread 源碼文件夾下的 qemu-vexpress-a9 BSP 根目錄,然后輸入 scons 命令編譯工程,如果編譯正確無誤,會在 BSP 目錄下生成
    發表于 10-26 15:31

    RT-Thread BSP qemu-virt64-aarch64文件系統

      前言   前面大體上搭建了 RT-Thread BSP qemu-virt64-aarch64 的交叉編譯環境,運行后發現,文件系統沒有掛載上,感覺是沒有 mkfs。   通過RT-Thr
    發表于 05-16 10:29

    RT-Thread軟件包定義和使用

    RT-Thread軟件包是運行RT-Thread物聯網操作系統平臺上,面向不同應用領域的通用軟件組件 。RT-Thread 同時提供了開放
    的頭像 發表于 05-21 11:29 ?1w次閱讀
    <b class='flag-5'>RT-Thread</b>軟件包定義和使用

    RT-Thread開源作品秀】基于RT-Thread的星務平臺研究

    本作品為了驗證星務軟件RT-Thread系統運行的可行性,底層是否能夠驅動星務軟件,同時擴展RT-Thread應用范圍。ART-Pi作為衛星下位機,...
    發表于 01-25 18:26 ?6次下載
    【<b class='flag-5'>RT-Thread</b>開源作品秀】基于<b class='flag-5'>RT-Thread</b>的星務<b class='flag-5'>平臺</b>研究

    RT-Thread qemu mps2-an385 bsp移植制作 :環境搭建篇

    最近打算系統地研究一下 RT-Thread,包括 RT-Thread BSP 的移植,由于一直使用 QEMU 進行一些軟件功能的驗證,qemu
    的頭像 發表于 08-02 14:45 ?648次閱讀
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>qemu</b> mps2-an385 bsp移植制作 :環境搭建篇

    QEMU系列】不用開發板運行RT-Thread指南-ARM架構

    成為一個門檻。本文將詳細介紹如何在QEMU虛擬機的Vexpress-A9平臺運行RT-Thread,幫助開發者沒有實際硬件開發板的情況下
    的頭像 發表于 08-09 08:35 ?938次閱讀
    【<b class='flag-5'>QEMU</b>系列】不用開發板<b class='flag-5'>運行</b><b class='flag-5'>RT-Thread</b>指南-ARM架構
    主站蜘蛛池模板: 午夜免费免费啪视频观看| 色老成人精品视频在线观看| 日韩免费观看视频| 丁香视频在线观看播放| 久久久久久久国产精品影院| 老师解胸罩喂我吃奶| 欧美性狂猛bbbbbxxxxx| 亚色在线观看| 一区二区三区亚洲视频| 手机毛片| 午夜视| 亚洲一区在线视频| 三级理论在线播放大全| 亚洲 欧美 日韩 丝袜 另类| 在线亚洲一区二区| 日本成人一级片| 天堂网传媒| 久久久久国产精品免费网站| 免费视频爰爱太爽了| 看片午夜| 亚洲香蕉毛片久久网站老妇人| 国模最新私拍视频在线观看| 色多多18免费观看| 夜夜摸天天操| 欧美aⅴ| 天堂在线看| 久草免费新视频| 国产亚洲小视频| 天堂中文字幕在线| 午夜特级毛片| 精品国产成人三级在线观看| 黄色大全片| 男人日女人免费视频| 欧美在线精品一区二区三区| 奇米影视久久| 泰剧天堂| 日韩精品在线第一页| 性69交片免费看| 天天舔夜夜操| 亚洲一级毛片免费在线观看| 2021韩国理论片ok电影天堂 |