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

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

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

3天內不再提示

Raspberry pico處理器的移植SMP教程

海闊天空的專欄 ? 來源: RTThread物聯網操作系統 ? 作者: RTThread物聯網操作 ? 2022-06-07 15:48 ? 次閱讀

Raspberry pico 是一款雙核cortex-m0的處理器,在RT-Thread提供的bsp中目前是默認采用libcpu/arm/cortex-m0,其并沒有對多核進行支持。在Coremark的測試中pico的性能很一般,只用一個核心實在是太浪費了,所以下面用一種不太優雅的方式基本實現Pico的SMP,簡單測試沒有問題,當然由于萌新對于內核的理解程度有限,總是可能存在一些問題,不過總算跑起來了不是~

移植SMP

在這之前,官方的文件完全沒有支持Cortex-M的多核。


首先是幾個基本的函數對接:


rt_hw_cpu_id:最首先需要實現的一個也是最容易的實現的一個,直接訪問pico的sio就可以

pYYBAGKfAZGAYpnRAAAPWE5KVHA827.png


rt_hw_interrupt_disable/enable: 在SMP框架當中,關閉中斷不只是屏蔽中斷,其還要通過spinlock來保證對資源訪問的互斥,對于此rtt在rthw通過宏定義將其替換,并且重新命名原來的中斷控制函數

pYYBAGKfAZWADMwMAAAo4IVVu8M631.png


rt_hw_spin_lock_xxx:自旋鎖,用于多核之間的資源保護,在rp2040中芯片提供硬件spinlock使用,這一部分同樣使用pico-sdk的api即可,選擇unsafe版本

poYBAGKfAa-Ae5bvAAAvbiJTgAk844.png

rt_hw_secondary_cpu_up:在主CPU啟動后,運行調度器,調度器會調用main線程運行,main線程運行前會首先調用該api來啟動第二個核心。Rp2040兩個核心其實是上電以后同時啟動的,CPU-1會在bootrom中被攔截下來進入等待狀態,我們可以通過sio的fifo來喚醒第二個核心,pico-sdk中提供了api,可以直接指定CPU-1喚醒后執行的函數。在喚醒過程中同時使能兩個CPU的SIO中斷,用來進行IPI_Handler.

pYYBAGKfAbKAXWJFAABi3t4GKe8377.png


在需要調度的時候,CPU之間可能會互相通知讓其進行調度,該部分通過rt_hw_ipi_sendrt_hw_ipi_handler對接,

poYBAGKfAc-Ad6UrAABykocbA8U469.png

上面對接的函數都比較基礎,其次是對接上下文的匯編代碼部分,這一部分就不是特別順利了。簡單梳理一下Cortex-M的調度流程,rt_schedule獲取最高優先級的任務然后使能PendSV中斷并在全局變量中保存調度信息,最后在完成高優先級中斷(或者直接進行PendSV)后進行實際的上下文切換,在SMP中基本同理,但是由于RT-Thread的SMP是針對Cortex-A提供的,這里出現了一些問題。

首先在調度中必須關注一個函數,rt_cpus_lock_status_restore(thread),其將要調度的線程綁定到當前的cpu上,調用該函數的位置是一個關鍵問題

pYYBAGKfAdKANBmjAAA1DoQXxHQ152.png


在Cortex-A中其在rt_hw_context_switch中被調用,這對于Cortex-A是可行的,因為在非中斷情況下A核會直接進行線程切換而不需要PendSV,但是對于Cortex-M核心放在這個位置會存在下面一個問題:PendSV是中斷,所以需要使能中斷才能運行,因此在rt_hw_context_switch后立馬就有一個rt_hw_interrupt_enable,如果M核工作在非SMP框架下這是沒有問題的,但是在SMP框架下當前的線程已經變了,而rt_hw_interrupt_enable是同當前線程綁定的,所以這里會導致CPU的scheduler_lock_nest,cpus_lock_nest錯亂,從而導致調度器不能正常工作

pYYBAGKfAe-AFlbwAABhL---p0w148.png

基于上面的描述,我考慮把rt_cpus_lock_status_restore放在PendSV中進行調用,這樣就可以保證scheduler_lock_nest工作的正確性,但是導致一個更大的問題!!!在rt_schedule函數中,如果中斷還沒有使能的情況下重復調用rt_schedule(systick中多層中斷)會導致已經被標記為RUNNING的線程無法正常被加入到就緒列表中。因為在上一次的rt_schedule中線程已經被移除了,其等待在PendSV中綁定到當前CPU的時候rt_schedule再次到來,其應該被重新加入到就緒列表(如果優先級低的話),但是schudler是基于當前CPU上的線程來管理的,由于之前被調度的線程當前還沒有綁定,所以線程變成游離狀態而無法被調度,就會出現下面的情況:

poYBAGKfAfOAfZQGAACJwPtJCnk689.png


所以rt_cpus_lock_status_restore(thread)只能在rt_hw_context_switch中被調用,但這種情況下我們需要處理scheduler_nestcpus_lock_nest錯亂的問題,由于SMP框架將nest綁定到線程上,但實際上鎖針對的還是CPU,我也認為將太綁定到CPU上更合適,為了不修改內核源碼的情況下實現,我在rt_hw_context_switch中將當前cpu線程的nest綁定到需要調度的線程上,這樣就等價于把nest綁定到CPU上,此時就可以正常工作了。

poYBAGKfAg6AZ5lxAACtIk0C4l8111.png

解決上述問題后知剩下最后一個問題,我們前文的討論都是基于非中斷情況下的,對于Cortex-M而言中斷中的調度和非中斷中的調度是一致的,都是基于PendSV實現的,所以我們rt_hw_context_switch,rt_hw_context_interrupt_switch用一套一樣的代碼就可以,但是在SMP框架中這兩個部分具有兩個調度函數,在中斷中調用rt_schedule,SMP框架會直接跳過當前調度并且給當前CPU打上中斷調度標記,最后在離開中斷的時候調用rt_scheduler_do_irq_switch(void *context)來實現,對于Cortex-A的中斷結構來說這是沒有問題的,只要保證switch能夠在本次調度過程中直接切換就行,但是對于Cortex-M這樣就不太合適,我們可以把NVIC弄成統一IRQ的樣子,但是我覺得直接廢棄rt_scheduler_do_irq_switch更加合適。

pYYBAGKfAhKAbJvmAAA4DiHj-SA334.png


為了使得調度器不知道我們在中斷狀態,我把rt_interrupt_enter/leave注釋掉了(應該在涉及內核調度的中斷中全部采用這種辦法),這樣irq_nest就一直是0,調度器也不會去調用do_irq了,其實我們不用這個處理方法也能夠工作的,但是中斷中就沒法調度了,實時性也沒法保障。按照我的理解在Cortex-M中這樣的處理并不會有太大的問題,但是總不太好是吧~

pYYBAGKfAiyADNIUAAAlD8mjmDo619.png


最后基于上面全部的修改,RP2040的SMP能夠正常工作,小燈能夠按照正常閃爍。

poYBAGKfAi-ASz_qAACuALvQTO4608.png

最后

我對于RT-Thread的理解還很有限,萌新,有很多問題我可能預料不到,這樣的實現方式我也覺得不太優雅,不過總算是跑起來了(肝了兩天還是有點累emmm)。后續會優化整理并且再經過一段時間的測試,或許能夠喜提自己的第一個RT-Thread PR ~

最后是關于SMP,我不明白為什么把nest綁定到thread而不是cpu上,因為總還是在鎖cpu,其次rt-thread的smp似乎是專門給A核設計,目前的多核MCU也有蠻多,希望可以提供一些相關支持。

Attention please!!(2022-5-12): 評論區有提供bsp的壓縮包

只是一個可以玩玩的狀態,目前可以確定的是存在和調度相關的bug會導致系統崩潰(目前測試在shell反復調用list_thread可能崩潰,可能和kservice有關)。

另外如果線程在調度器啟動前被創建,即INIT_BORAD_EXPORT方式創建則一切正常(list_thread不會崩潰),在main中創建就可能出現崩潰,希望各位大佬可以給點調試思路。

由于最近事情很多比較忙綠,沒有時間調試和閱讀代碼,但會在后續一段時間(六月-七月)調試完善smp調度并在后續添加完善pico的驅動支持,希望感興趣的同學一起交流哈。(也在看看rtthread v5.0的消息哈)

來源:RTThread物聯網操作系統

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

    關注

    0

    文章

    75

    瀏覽量

    19690
收藏 人收藏

    評論

    相關推薦

    Raspberry Pi Pico是什么

    Waveshare給您介紹一款樹莓派家族的新成員,Raspberry Pi Pico 是一款低成本,高性能的微控制開發板,具有靈活數字接口。硬件上,采用Raspberry Pi 官方
    發表于 07-14 07:02

    Raspberry Pi Pico具有哪些功能特性?

    Raspberry Pi Pico具有哪些功能特性?
    發表于 10-11 08:13

    微控制開發板Raspberry Pi Pico

    樹莓派基金會最新發布一款低成本、高性能的微控制開發板Raspberry Pi Pico,新產品相比普通樹莓派體積更小
    發表于 10-29 07:33

    使用raspberry pi Pico的原因

    使用raspberry pi Pico的原因在硬件產品(單片機)的開發中我們往往需要借助一些額外的儀器/設備進行產品的輔助測試, 假設我們需要一個IO+ADC類型輔助設備, 以往的做法是 原理圖
    發表于 02-07 09:16

    多核處理器分類之SMP與NUMA簡析

    存儲的延遲都是一樣的。這種體系結構的處理器有時候也會被叫做對稱多處理器(Symmetric Multi-Processor,簡稱SMP)。這里的“對稱”,是說所有的
    發表于 06-07 16:46

    Raspberry Pi 4/3B的Pico開發板

    英國 Raspberry Pi 設計的全新微控制芯片。”從控制電器到操作燈光顯示Raspberry Pi Pico 將支撐無數日常操作
    發表于 07-26 07:14

    一個印有PINOUT的Raspberry Pi pico分線板

    描述Raspberry Pi Pico 分線板(GPIO 擴展)方面:60 毫米 x 60 毫米特征:緊湊型設計4x M2 螺絲安裝座2.54mm間距焊盤2.54mm 間距排針兼容用于外圍設備的額外
    發表于 07-27 06:33

    RT-Thread框架下的SMP支持

    簡介SMP: 對稱多處理(Symmetrical Multi-Processing)簡稱 SMP,是指在一個計算機上匯集了一組處理器 (多 CPU), 各 CPU 之間共享內存子系統
    發表于 02-13 15:02

    Raspberry Pi Pico是什么?有哪些主要特點

    Raspberry Pi Pico 是一款具有靈活數字接口的低成本、高性能微控制板。
    的頭像 發表于 07-28 11:11 ?6817次閱讀
    <b class='flag-5'>Raspberry</b> Pi <b class='flag-5'>Pico</b>是什么?有哪些主要特點

    如何在Raspberry Pi Pico中使用OLED顯示

    電子發燒友網站提供《如何在Raspberry Pi Pico中使用OLED顯示.zip》資料免費下載
    發表于 10-18 09:15 ?4次下載
    如何在<b class='flag-5'>Raspberry</b> Pi <b class='flag-5'>Pico</b>中使用OLED顯示<b class='flag-5'>器</b>

    使用Raspberry Pi Pico的LED序列

    電子發燒友網站提供《使用Raspberry Pi Pico的LED序列.zip》資料免費下載
    發表于 11-14 11:07 ?0次下載
    使用<b class='flag-5'>Raspberry</b> Pi <b class='flag-5'>Pico</b>的LED序列

    免費Pico模擬上的Raspberry Pi Pico和LCD1602接口

    電子發燒友網站提供《免費Pico模擬上的Raspberry Pi Pico和LCD1602接口.zip》資料免費下載
    發表于 11-17 10:36 ?0次下載
    免費<b class='flag-5'>Pico</b>模擬<b class='flag-5'>器</b>上的<b class='flag-5'>Raspberry</b> Pi <b class='flag-5'>Pico</b>和LCD1602接口

    遠程編程Raspberry Pi Pico

    電子發燒友網站提供《遠程編程Raspberry Pi Pico.zip》資料免費下載
    發表于 06-16 15:25 ?0次下載
    遠程編程<b class='flag-5'>Raspberry</b> Pi <b class='flag-5'>Pico</b>

    Raspberry Pi Pico 2

    、可選的RISC?V內核、增強的安全特性,以及升級的接口功能。該器件由RP235x微控制平臺提供支持,此平臺也由Raspberry Pi設計。Pico 2將RP2350與4MB板載QSPI閃存配對
    的頭像 發表于 11-25 15:10 ?622次閱讀
    <b class='flag-5'>Raspberry</b> Pi <b class='flag-5'>Pico</b> 2

    Raspberry Pi Pico 2 W 發布

    Pico 2 W 微控制板發布:支持無線連接,7 美元 該開發板基于樹莓派 RP2350 處理器,沿用了初代 Pico W 上的英飛凌 CYW43439 無線芯片,因此仍然僅 支持
    的頭像 發表于 11-25 18:25 ?521次閱讀
    <b class='flag-5'>Raspberry</b> Pi <b class='flag-5'>Pico</b> 2 W 發布
    主站蜘蛛池模板: 翁公与小莹在客厅激情| 内射一区二区精品视频在线观看| 人人射人人插| 久久热r在线视频精品| 国产熟妇无码一区二| 国产黄A片在线观看永久免费麻豆| 国产 欧美 亚洲 日韩视频| 干了快生了的孕妇| 港台三级大全| 漂亮的保姆3中文版完整版 | 国产在线不卡| 好男人午夜www视频在线观看 | 国产精品亚洲精品久久品| 精品一区二区三区在线成人 | 亚洲人视频在线| 99久久国产露脸精品国产吴梦梦 | 日日噜噜夜夜躁躁狠狠| 亚洲 欧美 日韩 国产 视频| 一抽一出BGM免费50分动漫| 在线免费公开视频| 99热最新在线| 含羞草免费完整视频在线观看| 两百磅美女| 撕开美女的衣服2| 欧美性情一线免费http| 9477小游戏| 国产亚洲视频在线观看| 亚洲A片不卡无码久久尤物| FREEXXX性乌克兰XXX| 国产在线亚洲精品观| 亚洲精品无码久久久久A片| 成人高清网站| 蜜桃无码AV视频在线观看| 亚洲三级在线中文字幕| 久久99国产精品一区二区| 60岁老年熟妇在线无码| 国厂精品114福利电影| 伊人久久大香网| 狠狠色噜噜狠狠狠狠米奇777| 约艺术院校96年清纯白嫩| 男生jj插入女生jj|