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

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

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

3天內不再提示

rt-thread 優化系列(六)啟動流程重構

出出 ? 來源:出出 ? 作者:出出 ? 2022-07-04 15:30 ? 次閱讀

前言

去年此時,筆者剛接觸 rt-thread 的時候,被它的初始化過程深深折服了。第一次打開一個 rt-thread 的項目,竟然沒找到多線程在哪兒初始化的,"main" 函數里沒有!
進而發現,"main" 函數不是我們認識的 "main" 函數了。在 rt-thread 里,程序進入 "main" 函數之前還有很長一段路。

目前的初始化流程

見下圖吧,一些主要的過程已經被列出來了。

poYBAGLCkJ2AZU2kAADj4Zq8UMY084.png

從圖中可以看出來:
1. 任務調度器啟動前,有很多的初始化工作。
2. `rt_components_board_init` 里還有很多隱含的外設初始化操作。這個時候沒有進入多線程環境。
3. 先創建了三個默認線程(如果啟用了軟定時器),但并未立馬運行,任務調度器啟動后從中選擇優先級最高的那個運行(可能是 "main" 可能是 "timer")。
4. "main" 線程啟動后,還有很多初始化工作,這個時候已經進入多線程環境。

這個流程存在的問題:
1. 堆申請被設計成多線程安全訪問,內部有加鎖動作,而鎖也是限于在線程上下文使用的。串口驅動申請緩存內存卻是在任務調度器啟動前!
2. 開啟 ulog 后,也有可能出現在任務調度器啟動之先使用鎖的現象。
3. 還有線程安全版 `rt_kprintf` ,這個也是考慮只在線程上下文使用,如果開啟了它,任務調度器啟動前的 `rt_kprintf` 需求被忽略了。

`rt_components_board_init` `rt_components_init` 兩個函數可能有很多隱含操作。但是因為 `rt_components_board_init` 處于非多任務環境中,它比 `rt_components_init` 更容易出問題。

例如,不能使用加鎖操作、不能使用 `rt_thread_mdelay` `rt_thread_delay` 等延時操作。

在之前的一篇文章里,[rt-thread 驅動篇(六)serialX弊端及解決方法]( http://www.1cnz.cn/d/1850548.html ) 比較全面的梳理了一下串口終端設備怎么用中斷發送模式。首先,任務調度器啟動前是不會有中斷的,用中斷發送,可能不會輸出數據,如果是阻塞模式,可能會永久卡死到這里;如果是非阻塞模式,可能有很多信息被扔掉。

**所以,任務調度器啟動前,串口終端輸出要么用輪詢輸出,要么給個很大的輸出緩存**,至于多大合適,這個誰也說不好。

還有一個折中的方法是降低任務調度器啟動前的打印輸出需求。怎么降低?調整初始化流程,先啟動一個無依賴的 idle 線程,把其它操作放到線程中。

新初始化流程設想

poYBAGLCkOyALohXAAC7C3LqP2U345.png

這樣一來,初始化注冊外設設備的過程也是在線程上下文環境了,這個時候想用加鎖操作也可以,申請堆內存也不會出現 `Function[rt_sem_take] shall not be used before scheduler start`

如果不開啟 RT_DEBUG,堆、pin、UART、控制臺初始化部分也可以放到 idle 線程里。一年前,筆者在 rt-thread 論壇上提出過這個設想——[
rt-thread 系統啟動及 SysTick 初始化流程優化可行性分析]( https://club.rt-thread.org/ask/article/ab1c5556dd9f186a.html )。
稍作修改,如下:
1. 配置系統時鐘,同時配置 SysTick(同前);
2. 初始化 rtt 系統調度器,定時器鏈表等全局變量;
3. 創建 idle 線程;
4. 啟動 idle 線程并啟動 rtt 系統調度;
5. 由 idle 線程啟用 SysTick 中斷;
6. 由 idle 線程初始化調試串口;
7. 由 idle 線程初始化內存堆;
8. 由 idle 線程調用執行 rt_components_board_init 初始化板級外設配置;
9. 由 idle 線程創建 main 和 soft timer 線程。
10. main 線程進行組件初始化配置,以及創建其它應用線程。

和上面鏈接里提到的流程,修改了開啟 systick 中斷節點。
同時如果放棄在初始化配置系統時鐘時調試輸出信息的想法,放棄創建 idle 線程過程中調試輸出錯誤信息的想法,放棄啟動系統任務調度器過程調試輸出錯誤信息的想法后,控制臺輸出信息也就全處于線程上下文了。

最起碼,我們有以下幾點收獲:
1. 任務調度器啟動前,不需要開全局中斷。
2. 申請堆內存的操作都可以是在線程上下文。
3. 控制臺串口輸出數據可以使用中斷或者 DMA 任意模式。

缺點:idle 線程棧可能比之前要大一些。而且,這些內存只有一次使用機會,切換到 “main” 線程后多了些“閑置”內存。

實踐驗證

目前,筆者在自己的項目上,使用 NUC970 系列芯片,驗證了上述想法,目前系統啟動過程未發現出現異常。

結束語

很多問題是時序的原因,打亂了某件東西本該有的操作 [#5584]( https://github.com/RT-Thread/rt-thread/issues/5584 )。
對系統啟動流程做些修改,我們發現很多概念可以理直氣壯的講出來,比如,鎖只能在線程上下文使用。當我們通過補丁的方式,使得在任務調度器啟動前進行了鎖操作而不出異常,那么這樣就讓人迷惑了。

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

    關注

    0

    文章

    14

    瀏覽量

    6485
  • RT-Thread
    +關注

    關注

    31

    文章

    1293

    瀏覽量

    40211
  • main
    +關注

    關注

    0

    文章

    38

    瀏覽量

    6170
收藏 人收藏

    評論

    相關推薦

    RT-Thread記錄(三、RT-Thread線程操作函數)

    講完了RT-Thread開發環境,啟動流程啟動以后當然是開始跑線程了,那么自然我們得學會如何創建線程以及線程的有關操作。
    的頭像 發表于 06-20 00:31 ?6882次閱讀
    <b class='flag-5'>RT-Thread</b>記錄(三、<b class='flag-5'>RT-Thread</b>線程操作函數)

    RT-Thread記錄(二、RT-Thread內核啟動流程

    在前面我們RT-Thread Studio工程基礎之上講一講RT-Thread內核啟動流程.
    的頭像 發表于 06-20 00:30 ?5054次閱讀
    <b class='flag-5'>RT-Thread</b>記錄(二、<b class='flag-5'>RT-Thread</b>內核<b class='flag-5'>啟動</b><b class='flag-5'>流程</b>)

    【原創精選】RT-Thread征文精選技術文章合集

    漂移問題分析rt-thread 優化系列(四)信號對 ipc 的影響rt-thread 優化系列
    發表于 07-26 14:56

    RT-Thread快速入門之了解內核啟動流程

    1、了解RT-Thread內核的啟動流程  內核是操作系統最基礎也是最重要的部分。從本文開始進入 RT-Thread 內核相關知識的學習。  首先了解內核的基礎知識,對
    發表于 09-05 17:01

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開發組(2015-03-31)。RT-Thread做為國內有較大影響力的開源實時操作系統,本文是RT-Thread實時操作系統的編程指南
    發表于 11-26 16:06 ?0次下載

    RT-Thread用戶手冊

    RT-Thread用戶手冊——本書是RT-Thread的編程手冊,用于指導在RT-Thread實時操作系統環境下如何進行編 程。
    發表于 11-26 16:16 ?0次下載

    RT-Thread全球技術大會:Kconfig在RT-Thread中的工作機制

    RT-Thread全球技術大會:Kconfig在RT-Thread中的工作機制 ? ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發表于 05-27 14:49 ?1551次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術大會:Kconfig在<b class='flag-5'>RT-Thread</b>中的工作機制

    RT-Thread全球技術大會:RT-Thread測試用例集合案例

    RT-Thread全球技術大會:RT-Thread測試用例集合案例 ? ? ? ? ? 審核編輯:彭靜
    的頭像 發表于 05-27 16:34 ?2111次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術大會:<b class='flag-5'>RT-Thread</b>測試用例集合案例

    RT-Thread學習筆記 RT-Thread的架構概述

    RT-Thread 簡介 作為一名 RTOS 的初學者,也許你對 RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會逐漸發現 RT-Thread 的魅力和它相較于其他同類型 RTOS
    的頭像 發表于 07-09 11:27 ?4567次閱讀
    <b class='flag-5'>RT-Thread</b>學習筆記 <b class='flag-5'>RT-Thread</b>的架構概述

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡介

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
    發表于 02-22 18:23 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    基于RT-Thread Studio學習

    前期準備:從官網下載 RT-Thread Studio,弄個賬號登陸,開啟rt-thread學習之旅。
    的頭像 發表于 05-15 11:00 ?3993次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio學習

    RT-Thread啟動流程RT-Thread如何支持不同開發板?

    一個開發板上的RT-Thread啟動流程可能是首先從bsp?當中鏈接腳本指定的startup_xxx.S?中的入口函數(ENTRY)或者復位異常處理函數(ResetHandler)開始運行,這部分我們在講?bsp?支持時會詳細
    的頭像 發表于 08-10 15:29 ?1619次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>啟動</b><b class='flag-5'>流程</b>?<b class='flag-5'>RT-Thread</b>如何支持不同開發板?

    RT-Thread v5.0.2 發布

    RT-Thread 代碼倉庫地址: ●? https://github.com/RT-Thread/rt-thread RT-Thread 5.0.2 版本發布日志詳情: ●? htt
    的頭像 發表于 10-10 18:45 ?1509次閱讀
    <b class='flag-5'>RT-Thread</b> v5.0.2 發布
    主站蜘蛛池模板: 日韩成人在线视频| 成人免费一级毛片在线播放视频| 97人人看碰人免费公开视频| 国产亚洲精品看片在线观看| 人人在线碰碰视频免费| 中文字幕午夜福利片| 国产人在线成免费视频| 青青草在现线免费观看| 中文字幕亚洲欧美日韩2019| 国产一区二区三区四区五在线观看| 日韩精品无码久久一区二区三 | 一个人色导航| 国产午夜精品片一区二区三区| 色多多旧版污污破解版| YELLOW日本免费观看播放| 暖暖 免费 高清 日本视频大全| 在线播放国产视频| 久久才是精品亚洲国产| 亚洲精品视频在线免费| 国产精品一区第二页| 少女开女包www| 大睾丸内射老师| 日本熟妇乱人伦A片精品软件| jizzjizz丝袜| 欧美重口绿帽video| jlzz中国jizz日本老师水多| 女女破视频在线观看| 99久久久A片无码国产精| 奶头被客人吸得又红又肿| 97视频在线观看免费视频| 久久亚洲伊人| 偷窥自拍性综合图区| 工口肉肉彩色不遮挡| 免费女性裸身照无遮挡网站| 中文无码熟妇人妻AV在线| 久久国语精品| 阴茎插入阴道| 久久人妻无码毛片A片麻豆| 在线黑人抽搐潮喷| 久热这里只有精品99国产6| 毛片TV网站无套内射TV网站|