色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

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

嵌入式物聯網開發 ? 2022-07-26 04:06 ? 次閱讀

1 問題場景

相信很多人也跟我一樣,剛接觸RT-Thread不久,正在學習RT-Thread的路上,然而學習一款嵌入式實時操作系統,沒有一個硬件開發板,在我之前的認知里面,這應該很難把RTOS的內核代碼調試起來吧?

直到了解了RT-Thread,我才知道原來有QEMU模擬器這么個東西。

所以我很快就參考相關教程,把QEMU給裝起來了,結合RT-Thread編譯bsp的方法,很快我選擇的qemu-vexpress-a9固件很快就編譯出來了。

看了bsp目錄下有好幾個啟動腳本:

  1. bsp/qemu-vexpress-a9$ ls -al *.sh
  2. -rwxr-xr-x 1 recan system 168 Sep 6 10:43 qemu-dbg.sh
  3. -rwxr-xr-x 1 recan system 187 Oct 22 17:41 qemu-nographic.sh
  4. -rwxr-xr-x 1 recan system 166 Sep 6 10:43 qemu.sh

我逐個嘗試,發現在我的環境下,只有./qemu-nographic.sh能夠跑起來。

  1. bsp/qemu-vexpress-a9$ ./qemu-nographic.sh
  2. qemu-system-arm: -no-quit is only valid for GTK and SDL, ignoring option
  3. WARNING: Image format was not specified for 'sd.bin' and probing guessed raw.
  4. Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
  5. Specify the 'raw' format explicitly to remove the restrictions.
  6. ALSA lib confmisc.c:767:(parse_card) cannot find card '0'
  7. ALSA lib conf.c:4732:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
  8. ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings
  9. ALSA lib conf.c:4732:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
  10. ALSA lib confmisc.c:1246:(snd_func_refer) error evaluating name
  11. ALSA lib conf.c:4732:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
  12. ALSA lib conf.c:5220:(snd_config_expand) Evaluate error: No such file or directory
  13. ALSA lib pcm.c:2642:(snd_pcm_open_noupdate) Unknown PCM default
  14. alsa: Could not initialize DAC
  15. alsa: Failed to open `default':
  16. alsa: Reason: No such file or directory
  17. ALSA lib confmisc.c:767:(parse_card) cannot find card '0'
  18. ALSA lib conf.c:4732:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
  19. ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings
  20. ALSA lib conf.c:4732:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
  21. ALSA lib confmisc.c:1246:(snd_func_refer) error evaluating name
  22. ALSA lib conf.c:4732:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
  23. ALSA lib conf.c:5220:(snd_config_expand) Evaluate error: No such file or directory
  24. ALSA lib pcm.c:2642:(snd_pcm_open_noupdate) Unknown PCM default
  25. alsa: Could not initialize DAC
  26. alsa: Failed to open `default':
  27. alsa: Reason: No such file or directory
  28. audio: Failed to create voice `lm4549.out'
  29. \ | /
  30. - RT - Thread Operating System
  31. / | \ 4.0.4 build Nov 5 2021
  32. 2006 - 2021 Copyright by rt-thread team
  33. lwIP-2.1.2 initialized!
  34. [I/sal.skt] Socket Abstraction Layer initialize success.
  35. [I/SDIO] SD card capacity 65536 KB.
  36. [I/SDIO] switching card to high speed failed!
  37. hello rt-thread 99, 99
  38. 1, 2
  39. 1, 2
  40. 1, 2
  41. msh />

不過問題來了,我想重新編譯源碼,再次運行新的代碼,怎么辦呢?如何才能退出這個QEMU命令行控制臺?

2 嘗試解決

2.1 牛刀小試

大家都知道,Linux退出一個控制臺啟動的程序,使用CTRL+C就可以把它退出來,我試了一下,發現它壓根就不認CTRL+C,只是一直輸出一些亂碼符號。

在這里插入圖片描述

2.2 我放大招

既然CTRL+C不能,那我用killall-9xxx總可以吧?難不成你還能逃脫Linux內核對你的管控?

于是另開一個控制臺,直接killall-9qemu-system-arm,結果一試,的確可以退出QEMU(連進程都退出來了)。

但是問題來了,退出QEMU之后,這個控制臺感覺亂來了,我一瞧回車,它都不好好換行了,你看看!

在這里插入圖片描述

這就很讓人難受了,控制臺沒法用了,而且這個時候敲命令進去還不能回顯,也不知道你敲對了沒有,只好退出命令行,重新登入,控制臺得以恢復。

在這里插入圖片描述

2.3 黔驢技窮

上面的這種情況,顯示是我不能接受的,這個我倒是想了一下,QEMU不可能不支持退出吧,會不會什么啟動參數我搞錯了,于是qemu-system-arm-h,找了幾個看似跟這個問題相關的參數:

  1. qemu-system-arm -h
  2. ...
  3. -no-quit disable SDL window close capability
  4. ...
  5. -no-reboot exit instead of rebooting
  6. ...
  7. -no-shutdown stop before shutdown

于是在qemu-nographic.sh添加來嘗試:

  1. if [ ! -f "sd.bin" ]; then
  2. dd if=/dev/zero of=sd.bin bs=1024 count=65536
  3. fi
  4. qemu-system-arm -M vexpress-a9 -smp cpus=2 -kernel rtthread.bin -nographic -sd sd.bin -no-shutdown -no-quit -no-reboot

運行之后,同樣在另一個控制臺使用killall-9qemu-system-arm退出,發現有的時候退出QEMU的控制臺可以好好的,有的時候換行問題依然存在,沒有找到規律,實在沒辦法,就不了了之了。

3 終極方案

3.1 發現新大陸

直到今天,我偶然翻到RT-Thread的官方文檔,對RT-Thread Smart版本的介紹的時候,有一個章節是介紹使用QEMU模擬環境進行代碼調試運行的,里面居然提到了如何退出QEMU!

在這里插入圖片描述

Word天吶,那種感覺簡直像是發現新大陸一樣。 馬上登入QEMU開發環境做測試,果然,操作竟是如此的絲滑,就一個字!

在這里插入圖片描述

真的像是歷史難題被解決的那種感覺。

3.2 扒一扒到底誰讓QEMU退出了

第一感覺是不是RT-Thread的Finsh組件處理了這個CTRL+A,X? 于是找了Finsh的關鍵代碼:

  1. void finsh_thread_entry(void *parameter)
  2. {
  3. int ch;
  4. /* normal is echo mode */
  5. #ifndef FINSH_ECHO_DISABLE_DEFAULT
  6. shell->echo_mode = 1;
  7. #else
  8. shell->echo_mode = 0;
  9. #endif
  10. #if !defined(RT_USING_POSIX) && defined(RT_USING_DEVICE)
  11. /* set console device as shell device */
  12. if (shell->device == RT_NULL)
  13. {
  14. rt_device_t console = rt_console_get_device();
  15. if (console)
  16. {
  17. finsh_set_device(console->parent.name);
  18. }
  19. }
  20. #endif
  21. #ifdef FINSH_USING_AUTH
  22. /* set the default password when the password isn't setting */
  23. if (rt_strlen(finsh_get_password()) == 0)
  24. {
  25. if (finsh_set_password(FINSH_DEFAULT_PASSWORD) != RT_EOK)
  26. {
  27. rt_kprintf("Finsh password set failed.\n");
  28. }
  29. }
  30. /* waiting authenticate success */
  31. finsh_wait_auth();
  32. #endif
  33. rt_kprintf(FINSH_PROMPT);
  34. while (1)
  35. {
  36. ch = (int)finsh_getchar();
  37. if (ch < 0)
  38. {
  39. continue;
  40. }
  41. /*
  42. * handle control key
  43. * up key : 0x1b 0x5b 0x41
  44. * down key: 0x1b 0x5b 0x42
  45. * right key:0x1b 0x5b 0x43
  46. * left key: 0x1b 0x5b 0x44
  47. */
  48. if (ch == 0x1b)
  49. {
  50. shell->stat = WAIT_SPEC_KEY;
  51. continue;
  52. }
  53. else if (shell->stat == WAIT_SPEC_KEY)
  54. {
  55. if (ch == 0x5b)
  56. {
  57. shell->stat = WAIT_FUNC_KEY;
  58. continue;
  59. }
  60. shell->stat = WAIT_NORMAL;
  61. }
  62. else if (shell->stat == WAIT_FUNC_KEY)
  63. {
  64. shell->stat = WAIT_NORMAL;
  65. if (ch == 0x41) /* up key */
  66. {
  67. #ifdef FINSH_USING_HISTORY
  68. /* prev history */
  69. if (shell->current_history > 0)
  70. shell->current_history --;
  71. else
  72. {
  73. shell->current_history = 0;
  74. continue;
  75. }
  76. /* copy the history command */
  77. memcpy(shell->line, &shell->cmd_history[shell->current_history][0],
  78. FINSH_CMD_SIZE);
  79. shell->line_curpos = shell->line_position = strlen(shell->line);
  80. shell_handle_history(shell);
  81. #endif
  82. continue;
  83. }
  84. else if (ch == 0x42) /* down key */
  85. {
  86. #ifdef FINSH_USING_HISTORY
  87. /* next history */
  88. if (shell->current_history < shell->history_count - 1)
  89. shell->current_history ++;
  90. else
  91. {
  92. /* set to the end of history */
  93. if (shell->history_count != 0)
  94. shell->current_history = shell->history_count - 1;
  95. else
  96. continue;
  97. }
  98. memcpy(shell->line, &shell->cmd_history[shell->current_history][0],
  99. FINSH_CMD_SIZE);
  100. shell->line_curpos = shell->line_position = strlen(shell->line);
  101. shell_handle_history(shell);
  102. #endif
  103. continue;
  104. }
  105. else if (ch == 0x44) /* left key */
  106. {
  107. if (shell->line_curpos)
  108. {
  109. rt_kprintf("\b");
  110. shell->line_curpos --;
  111. }
  112. continue;
  113. }
  114. else if (ch == 0x43) /* right key */
  115. {
  116. if (shell->line_curpos < shell->line_position)
  117. {
  118. rt_kprintf("%c", shell->line[shell->line_curpos]);
  119. shell->line_curpos ++;
  120. }
  121. continue;
  122. }
  123. }
  124. /* received null or error */
  125. if (ch == '\0' || ch == 0xFF) continue;
  126. /* handle tab key */
  127. else if (ch == '\t')
  128. {
  129. int i;
  130. /* move the cursor to the beginning of line */
  131. for (i = 0; i < shell->line_curpos; i++)
  132. rt_kprintf("\b");
  133. /* auto complete */
  134. shell_auto_complete(&shell->line[0]);
  135. /* re-calculate position */
  136. shell->line_curpos = shell->line_position = strlen(shell->line);
  137. continue;
  138. }
  139. /* handle backspace key */
  140. else if (ch == 0x7f || ch == 0x08)
  141. {
  142. /* note that shell->line_curpos >= 0 */
  143. if (shell->line_curpos == 0)
  144. continue;
  145. shell->line_position--;
  146. shell->line_curpos--;
  147. if (shell->line_position > shell->line_curpos)
  148. {
  149. int i;
  150. rt_memmove(&shell->line[shell->line_curpos],
  151. &shell->line[shell->line_curpos + 1],
  152. shell->line_position - shell->line_curpos);
  153. shell->line[shell->line_position] = 0;
  154. rt_kprintf("\b%s \b", &shell->line[shell->line_curpos]);
  155. /* move the cursor to the origin position */
  156. for (i = shell->line_curpos; i <= shell->line_position; i++)
  157. rt_kprintf("\b");
  158. }
  159. else
  160. {
  161. rt_kprintf("\b \b");
  162. shell->line[shell->line_position] = 0;
  163. }
  164. continue;
  165. }
  166. /* handle end of line, break */
  167. if (ch == '\r' || ch == '\n')
  168. {
  169. #ifdef FINSH_USING_HISTORY
  170. shell_push_history(shell);
  171. #endif
  172. if (shell->echo_mode)
  173. rt_kprintf("\n");
  174. msh_exec(shell->line, shell->line_position);
  175. rt_kprintf(FINSH_PROMPT);
  176. memset(shell->line, 0, sizeof(shell->line));
  177. shell->line_curpos = shell->line_position = 0;
  178. continue;
  179. }
  180. /* it's a large line, discard it */
  181. if (shell->line_position >= FINSH_CMD_SIZE)
  182. shell->line_position = 0;
  183. /* normal character */
  184. if (shell->line_curpos < shell->line_position)
  185. {
  186. int i;
  187. rt_memmove(&shell->line[shell->line_curpos + 1],
  188. &shell->line[shell->line_curpos],
  189. shell->line_position - shell->line_curpos);
  190. shell->line[shell->line_curpos] = ch;
  191. if (shell->echo_mode)
  192. rt_kprintf("%s", &shell->line[shell->line_curpos]);
  193. /* move the cursor to new position */
  194. for (i = shell->line_curpos; i < shell->line_position; i++)
  195. rt_kprintf("\b");
  196. }
  197. else
  198. {
  199. shell->line[shell->line_position] = ch;
  200. if (shell->echo_mode)
  201. rt_kprintf("%c", ch);
  202. }
  203. ch = 0;
  204. shell->line_position ++;
  205. shell->line_curpos++;
  206. if (shell->line_position >= FINSH_CMD_SIZE)
  207. {
  208. /* clear command line */
  209. shell->line_position = 0;
  210. shell->line_curpos = 0;
  211. }
  212. } /* end of device read */
  213. }

通讀代碼之后,發現它并沒有處理這個CTRL+A,X輸入,那么到底是誰接管了這個指令呢? 看到QEMU退出的時候,有提示``,這個關鍵字給了我線索,于是我開始懷疑是QEMU自己接管的這個命令,于是下面的一頓操作終于把它揪出來了。

  1. bsp/qemu-vexpress-a9$ whereis qemu-system-arm
  2. qemu-system-arm: /usr/bin/qemu-system-arm /usr/share/man/man1/qemu-system-arm.1.gz
  3. bsp/qemu-vexpress-a9$
  4. bsp/qemu-vexpress-a9$ cp /usr/bin/qemu-system-arm .
  5. bsp/qemu-vexpress-a9$
  6. bsp/qemu-vexpress-a9$ grep -rsn "Terminated"
  7. Binary file qemu-system-arm matches
  8. bsp/qemu-vexpress-a9$
  9. bsp/qemu-vexpress-a9$ hexdump -C qemu-system-arm | grep -n "Terminated"
  10. 699798:00b2b4a0 4d 55 3a 20 54 65 72 6d 69 6e 61 74 65 64 0a 0d |MU: Terminated..|
  11. bsp/qemu-vexpress-a9$
  12. bsp/qemu-vexpress-a9$ hexdump -C qemu-system-arm > hexdump.log
  13. bsp/qemu-vexpress-a9$
  14. bsp/qemu-vexpress-a9$ head -699797 hexdump.log | tail -1
  15. 00b2b490 73 20 68 65 6c 70 0a 0d 00 43 2d 25 63 00 51 45 |s help...C-%c.QE|
  16. bsp/qemu-vexpress-a9$
  17. bsp/qemu-vexpress-a9$ head -699798 hexdump.log | tail -1
  18. 00b2b4a0 4d 55 3a 20 54 65 72 6d 69 6e 61 74 65 64 0a 0d |MU: Terminated..|
  19. bsp/qemu-vexpress-a9$

大致的流程就是對可執行文件qemu-system-arm進行grep檢索,發現居然找到了Terminated這個關鍵log,證明這行退出的log正在qemu-system-arm打出來的,這也就從側面證實了這個退出命令是被它接管了,并且處理了,然后才退出的。

在這里插入圖片描述

4 經驗教訓

這個問題真的困擾了我至少2個月,每次一用QEMU,我就吐槽這個問題,沒想到居然還是RT-Thread的指導文檔拯救了我。

所以啊,凡事先查查別人已經整理好的問題,真的會事半功倍!

各位老鐵,RT-Thread的文檔中心,給我擼起來!!!

5 更多分享

架構師李肯

一個專注于嵌入式IoT領域的架構師。有著近10年的嵌入式一線開發經驗,深耕IoT領域多年,熟知IoT領域的業務發展,深度掌握IoT領域的相關技術棧,包括但不限于主流RTOS內核的實現及其移植、硬件驅動移植開發、網絡通訊協議開發、編譯構建原理及其實現、底層匯編及編譯原理、編譯優化及代碼重構、主流IoT云平臺的對接、嵌入式IoT系統的架構設計等等。擁有多項IoT領域的發明專利,熱衷于技術分享,有多年撰寫技術博客的經驗積累,連續多月獲得RT-Thread官方技術社區原創技術博文優秀獎,榮獲CSDN博客專家、CSDN物聯網領域優質創作者、2021年度CSDN&RT-Thread技術社區之星、RT-Thread官方嵌入式開源社區認證專家、RT-Thread 2021年度論壇之星TOP4、華為云云享專家(嵌入式物聯網架構設計師)等榮譽。堅信【知識改變命運,技術改變世界】!

歡迎關注我的github倉庫01workstation,日常分享一些開發筆記和項目實戰,歡迎指正問題。

同時也非常歡迎關注我的專欄;有問題的話,可以跟我討論,知無不答,謝謝大家。

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

    關注

    2

    文章

    875

    瀏覽量

    43208
  • RT-Thread
    +關注

    關注

    31

    文章

    1285

    瀏覽量

    40089
  • qemu
    +關注

    關注

    0

    文章

    57

    瀏覽量

    5354
收藏 人收藏

    評論

    相關推薦

    RT-Thread上CAN實踐

    開箱測試RT-Thread官方已完成了對英飛凌XMC7200EVK的移植,通過shell可以看到做好了uart3的console。本文將介紹如何進行RT-ThreadCan移植。接下來我們要完成CAN_FD的驅動移植,并正常啟動RT-T
    的頭像 發表于 11-13 01:03 ?1146次閱讀
    <b class='flag-5'>RT-Thread</b>上CAN實踐

    開源共生 商業共贏 | RT-Thread 2024開發者大會報名啟動!

    親愛的RT-Thread開發者我們很高興地宣布,一年一度的RDC(RT-ThreadDeveloperConference,RT-Thread開發者大會)正式啟動報名!2024RT-Threa
    的頭像 發表于 10-29 08:06 ?376次閱讀
    開源共生 商業共贏 | <b class='flag-5'>RT-Thread</b> 2024開發者大會報名啟動!

    【大連】9月7日RT-Thread巡回線下培訓-OpenMV機器視覺

    親愛的RT-Thread社區成員們:2024年RT-Thread全球開發者線下培訓拉開帷幕啦!24年全球巡回培訓將覆蓋超10座城市及國家,為開發者提供一個深入學習RT-Thread嵌入
    的頭像 發表于 09-01 08:02 ?1391次閱讀
    【大連】9月7日<b class='flag-5'>RT-Thread</b>巡回線下培訓-OpenMV機器視覺

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

    成為一個門檻。本文將詳細介紹如何在QEMU虛擬機的Vexpress-A9平臺上運行RT-Thread,幫助開發者在沒有實際硬件開發板的情況下,輕松體驗和學習RT-Th
    的頭像 發表于 08-09 08:35 ?907次閱讀
    【<b class='flag-5'>QEMU</b>系列】不用開發板運行<b class='flag-5'>RT-Thread</b>指南-ARM架構

    2024 RT-Thread全球巡回 線下培訓火熱來襲!

    親愛的RT-Thread社區成員們:我們非常高興地宣布,2024年RT-Thread全球開發者線下培訓即將拉開帷幕!24年全球巡回培訓將覆蓋超10座城市及國家,為開發者提供一個深入學習RT-T
    的頭像 發表于 08-07 08:35 ?1177次閱讀
    2024 <b class='flag-5'>RT-Thread</b>全球巡回 線下培訓火熱來襲!

    RT-Thread Studio中新建的stm32f407-atk-explorer工程運行qemu失敗,是什么原因引起的?

    RT-Thread Studio中新建的stm32f407-atk-explorer工程運行qemu失敗,是什么原因引起的?該如何修改? 工程創建的配置如下: 運行結果如下:
    發表于 07-16 06:08

    RT-Thread 新里程碑達成——GitHub Star 破萬!

    RT-Thread實時操作系統開源項目在GitHub上的star數量突破一萬!截止發文,RT-Thread作為實時操作系統在業界Star數量排名第一!倉庫地址:https://github.com
    的頭像 發表于 07-04 08:35 ?472次閱讀
    <b class='flag-5'>RT-Thread</b> 新里程碑達成——GitHub Star 破萬!

    6月6日杭州站RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    6月6日下午我們將在杭州舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發表于 05-28 08:35 ?442次閱讀
    6月6日杭州站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    2024 RT-Thread 全球技術大會演講議程發布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技術大會)致力于圍繞RT-Thread基礎軟件技術發展、實踐創新、開發者能力
    的頭像 發表于 05-16 08:34 ?542次閱讀
    2024 <b class='flag-5'>RT-Thread</b> 全球技術大會演講議程發布!

    新書發布——《實時操作系統應用技術:RT-Thread與ARM編程實踐》

    ——王宜懷的教授繼《嵌入式實時操作系統——基于RT-Thread的EAI&IoT系統開發》之后的又一力作,不僅內容豐富實用,而且講解方式深入淺出,適合不同層次的學習
    的頭像 發表于 05-11 08:35 ?793次閱讀
    新書發布——《實時操作系統應用技術:<b class='flag-5'>RT-Thread</b>與ARM編程實踐》

    RT-Thread混合部署Workshop北京站來啦!

    4月25日,下午我們將在北京舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發表于 04-19 08:34 ?437次閱讀
    <b class='flag-5'>RT-Thread</b>混合部署Workshop北京站來啦!

    4月25日北京站RT-Thread線下workshop,探索RT-Thread混合部署新模式

    4月25日,下午我們將在北京舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發表于 04-16 08:35 ?417次閱讀
    4月25日北京站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    4月10日深圳場RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    4月10日我們將在深圳福田舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深嵌入式軟件工程師農曉明老師為您講
    的頭像 發表于 03-27 11:36 ?815次閱讀
    4月10日深圳場<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月10日深圳場RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    4月10日我們將在深圳福田舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發表于 03-27 08:34 ?527次閱讀
    4月10日深圳場<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    恩智浦半導體正式加入RT-Thread全球合作伙伴計劃!

    前不久,恩智浦半導體正式加入RT-Thread全球合作伙伴計劃,成為RT-Thread高級會員合作伙伴。同時,RT-Thread現已成為恩智浦注冊合作伙伴(RT-Thread| 簡介合
    的頭像 發表于 03-14 10:40 ?615次閱讀
    恩智浦半導體正式加入<b class='flag-5'>RT-Thread</b>全球合作伙伴計劃!
    主站蜘蛛池模板: 久青草国产97香蕉在线视频| 久久91精品国产91| 国产精品视频国产永久视频| 国产精品一区二区四区| 精品国产乱码久久久久久软件| 久久精品电影网| 欧美精品九九99久久在免费线 | 男人桶女人j的视频在线观看| 欧美手机在线播放| 无限资源在线观看高清| 亚洲国产精品一区二区久久第| 玉娇龙续集春雪瓶txt免费阅读 | 中文字幕 人妻熟女| 99视频免费观看| 国产国语在线播放视频| 精品人伦一区二区三区潘金莲| 麻豆久久婷婷五月国产| 色迷迷导航| 在线观看视频一区| 处破女免费播放| 护士WC女子撒尿| 欧美白人战黑吊| 亚洲a免费| 99久久亚洲精品影院| 国产精品熟女人妻| 美国一级大黄一片免费的网站| 日韩中文字幕亚洲无线码| 亚洲一区在线视频观看| caoporn 超碰在线视频| 国产原创剧情麻豆在线| 欧美一级做a爰片免费| 亚洲精品国产在线网站| 99久久免费国产精品特黄| 国产免费人视频在线观看免费| 旧里番ovaの催○セイ活指导| 十8禁用B站在线看漫画| 中国老太性色xxxxxhd| 国产精品www视频免费看| 美女胸禁止18以下看| 亚洲不卡一卡2卡三卡4卡5卡| 99热在线观看精品|