一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RT-Thread框架下的SMP支持

冬至配餃子 ? 來(lái)源:螺絲松掉的人 ? 作者:螺絲松掉的人 ? 2023-10-11 10:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言
最近報(bào)名參加了恩智浦社區(qū)的 LPC55S69 開(kāi)發(fā)板測(cè)評(píng)活動(dòng),由于其搭載的是一顆 Cortex-M33 Dual Core 的 CPU,而且有大佬已經(jīng)支持了 RT-Thread 的 BSP,就考慮使其支持 RT-Thread 框架下的 SMP,最近就一直在研究 SMP,并在 Raspberry-Pico 上做了一些實(shí)驗(yàn)。以下是一些我在學(xué)習(xí)過(guò)程中的心得體會(huì),不對(duì)的地方歡迎大家指正交流~

SMP 簡(jiǎn)介
SMP: 對(duì)稱多處理(Symmetrical Multi-Processing)簡(jiǎn)稱 SMP,是指在一個(gè)計(jì)算機(jī)上匯集了一組處理器 (多 CPU), 各 CPU 之間共享內(nèi)存子系統(tǒng)以及總線結(jié)構(gòu)。雖然同時(shí)使用多個(gè)CPU,但是從管理的角度來(lái)看,它們的表現(xiàn)就像一臺(tái)單機(jī)一樣。系統(tǒng)將任務(wù)隊(duì)列對(duì)稱地分布于多個(gè)CPU之上,從而極大地提高了整個(gè)系統(tǒng)的數(shù)據(jù)處理能力。RT-Thread 自 v4.0.0 版本開(kāi)始支持 SMP,在對(duì)稱多核上可以通過(guò)使能 RT_USING_SMP 來(lái)開(kāi)啟。

系統(tǒng)上電后,各 CPU 的啟動(dòng)流程如下圖所示:

1.jpg

每個(gè)次級(jí) CPU 自身硬件部分的初始化不能由 CPU0 完成,因?yàn)槠渥陨碛布荒苡善渌?CPU 訪問(wèn)。

關(guān)于 CPU 已經(jīng)支持了 SMP 的平臺(tái)
RT-Thread 的 libcpu 中有一些芯片類型已經(jīng)支持了 SMP 功能,例如 Cortex-A 系列。對(duì)于這樣的平臺(tái),SMP 的移植工作就會(huì)簡(jiǎn)單很多,我們只需要實(shí)現(xiàn) rt_hw_secondary_cpu_up() ,secondary_cpu_c_start() ,rt_hw_secondary_cpu_idle_exec() 這三個(gè)函數(shù)即可,具體的移植介紹可以參考 RT-Thread 文檔中心SMP 介紹與移植

關(guān)于 CPU 還未支持 SMP 的平臺(tái)
RT-Thread 中還有一些 CPU 是沒(méi)有支持 SMP 的,例如 Cortex-M 系列的大部分 CPU,練手的 PICO 是 M0 ,準(zhǔn)備開(kāi)發(fā)的 LPC55S69 是 M33,都是還沒(méi)有支持 SMP 的。對(duì)于這樣的平臺(tái)移植 SMP 就會(huì)相對(duì)麻煩。除了 rt_hw_secondary_cpu_up() ,secondary_cpu_c_start() ,rt_hw_secondary_cpu_idle_exec() 這三個(gè)函數(shù),我們還需要補(bǔ)充 SMP 所需要的底層支持,主要是中斷和調(diào)度部分,從而實(shí)現(xiàn)更加復(fù)雜的共享資源保護(hù),以及線程間的通訊和調(diào)度。

推薦大家先去看看 RT-Thread 文檔中心的相關(guān)資料,以及這篇文章:[RT-Thread學(xué)習(xí)筆記](méi) 中斷鎖、調(diào)度鎖與死鎖,最好再去看看 rt-threadsrc 目錄下的 scheduler.c 源碼。其中有許多 SMP 的相關(guān)實(shí)現(xiàn)。

CPU ID
scheduler.c 中已經(jīng)有 SMP 的相關(guān)支持,但是會(huì)發(fā)現(xiàn),還需要 CPU 的個(gè)數(shù)及其對(duì)應(yīng)的 ID 等重要參數(shù)。所以我們首先要是實(shí)現(xiàn)的是 rt_hw_cpu_id() 這個(gè)函數(shù)。這個(gè)需要對(duì)應(yīng)自己開(kāi)發(fā)平臺(tái)的實(shí)際情況。

OS Tick
在 SMP 系統(tǒng)中,每個(gè) CPU 維護(hù)自己獨(dú)立的 tick 值,用作任務(wù)運(yùn)行計(jì)時(shí)以及時(shí)間片統(tǒng)計(jì)。除此之外,CPU0 還通過(guò) tick 計(jì)數(shù)來(lái)更新系統(tǒng)時(shí)間,并提供系統(tǒng)定時(shí)器的功能,次級(jí) CPU 不需要提供這些功能。這部分也是要針對(duì)使用的開(kāi)發(fā)開(kāi)發(fā)平臺(tái)進(jìn)行配置。

處理器間中斷 IPI
處理器間中斷(Inter-Processor Interrupt)負(fù)責(zé) CPU 之間的相互通訊及處理,針對(duì)不同開(kāi)發(fā)的平臺(tái),我們還需要實(shí)現(xiàn)以下函數(shù):

/* 該函數(shù)用來(lái)向 CPU 位圖中表示的 CPU 集合發(fā)送指定編號(hào)的 IPI 信號(hào) /
void rt_hw_ipi_send(int ipi_vector, unsigned int cpu_mask)
/
函數(shù)為當(dāng)前 CPU 設(shè)置指定編號(hào) IPI 信號(hào)的處理函數(shù) */
void rt_hw_ipi_handler_install(int ipi_vector, rt_isr_handler_t ipi_isr_handler)
調(diào)度與同步
臨界區(qū)保護(hù)是需要特別注意的。對(duì)于 SMP 通過(guò)關(guān)中斷的方式并不能阻止多個(gè) CPU 對(duì)共享資源的并發(fā)訪問(wèn),需要通過(guò)自旋鎖機(jī)制進(jìn)行保護(hù)(在次級(jí) CPU 啟動(dòng)中就需要使用)。我們就還需要實(shí)現(xiàn)以下幾個(gè)函數(shù):

rt_hw_spin_lock_init() /* 初始化已分配的 spinlock 變量 /
rt_hw_spin_lock() /
獲取 spinlock,忙等待直到獲取成功 /
rt_hw_spin_unlock() /
釋放 spinlock */
需要定義自旋鎖:

typedef union {
unsigned long slock;
struct __arch_tickets {
unsigned short owner;
unsigned short next;
} tickets;
} rt_hw_spinlock_t;
不使用 SMP 的時(shí)候,在進(jìn)行調(diào)度等需要臨界資源保護(hù)的情況下,是通過(guò) rt_hw_interrupt_disable/enable 來(lái)屏蔽中斷進(jìn)行保護(hù),但是在 SMP 中,對(duì) rt_hw_interrupt_disable/enable 進(jìn)行了替換,從而保證對(duì)共享資源訪問(wèn)的互斥:

/* 在 rthw.h 中 */
#ifdef RT_USING_SMP
#define rt_hw_interrupt_disable rt_hw_local_irq_disable
#define rt_hw_interrupt_enable rt_hw_local_irq_enable
#endif
因?yàn)?SMP 使用了多核,調(diào)度和同步的情況相較于單個(gè)處理器更加復(fù)雜和重要,這部分是移植的重點(diǎn)。需要針對(duì)開(kāi)發(fā)平臺(tái)的不同,對(duì)以下函數(shù)進(jìn)行重寫(xiě)(對(duì)于 Cortex-M 內(nèi)核,需要注意輔助上下文切換的 PendSV 也是一種中斷):

/* 實(shí)現(xiàn)從當(dāng)前線程切換到目標(biāo)線程,在 Cortex-M 內(nèi)核里 rt_hw_context_switch() 和 rt_hw_context_switch_interrupt() 功能一致 /
rt_hw_context_switch_interrupt:
rt_hw_context_switch:
/
實(shí)現(xiàn)沒(méi)有來(lái)源線程切換到目標(biāo)線程 /
rt_hw_context_switch_to:
/
PendSV 中斷處理函數(shù),在 Cortex-M 內(nèi)核里 PendSV 輔助完成上下文切換 */
PendSV_Handler:
這部分需要在 context_gcc.S 文件中實(shí)現(xiàn)。

移植 SMP 的重點(diǎn)是調(diào)度與同步,大家在移植之前,最好對(duì) RT-Thread 的調(diào)度流程和中斷機(jī)制有一定的學(xué)習(xí)和理解,這部分可以參考 RT-Thread 文檔中心,最好能配合著理解源碼的實(shí)現(xiàn)。我對(duì) RT-Thread 框架下的 SMP 目前的理解就是以上這些,歡迎大家交流討論。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19885

    瀏覽量

    235084
  • SMP
    SMP
    +關(guān)注

    關(guān)注

    0

    文章

    78

    瀏覽量

    20278
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3298

    瀏覽量

    118865
  • Cortex-M
    +關(guān)注

    關(guān)注

    2

    文章

    231

    瀏覽量

    30381
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1406

    瀏覽量

    41912
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于RT-Thread的RoboMaster電控框架設(shè)計(jì)

    由于 RT-Thread 穩(wěn)定高效的內(nèi)核,豐富的文檔教程,積極活躍的社區(qū)氛圍,以及設(shè)備驅(qū)動(dòng)框架、Kconfig、Scons、日志系統(tǒng)、海量的軟件包……很難不選擇 RT-Thread 進(jìn)行項(xiàng)目開(kāi)發(fā)。
    發(fā)表于 09-06 15:21 ?1037次閱讀

    RT-Thread SMP和AMP初體驗(yàn)簡(jiǎn)介

    還有一塊樹(shù)莓派也是多核的,RT-Thread 官方的 BSP 中也支持了這塊板子的 SMP 功能。進(jìn)入 menuconfig 進(jìn)行同樣的配置;env 中運(yùn)行命令 scons 構(gòu)建項(xiàng)目;將生成
    發(fā)表于 02-03 14:33

    RT-Thread框架下SMP支持

    ,就考慮使其支持 RT-Thread 框架下SMP,最近就一直在研究 SMP,并在 Raspberry-Pico 上做了一些實(shí)驗(yàn)。以下是
    發(fā)表于 02-13 15:02

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開(kāi)發(fā)組(2015-03-31)。RT-Thread做為國(guó)內(nèi)有較大影響力的開(kāi)源實(shí)時(shí)操作系統(tǒng),本文是RT-Thread實(shí)時(shí)操作系統(tǒng)的編程指南
    發(fā)表于 11-26 16:06 ?0次下載

    2022 RT-Thread全球技術(shù)大會(huì):螢石EZIOT SDK對(duì)RT-Thread支持

    2022 RT-Thread全球技術(shù)大會(huì):RT-Thread在攝像頭及IoT設(shè)備上的實(shí)踐經(jīng)驗(yàn)分享
    的頭像 發(fā)表于 05-27 11:08 ?1535次閱讀
    2022 <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):螢石EZIOT SDK對(duì)<b class='flag-5'>RT-Thread</b>的<b class='flag-5'>支持</b>

    RT-Thread全球技術(shù)大會(huì):螢石EZloT SDK對(duì)RT-Thread支持以及多芯片平臺(tái)管理策略

    RT-Thread全球技術(shù)大會(huì):螢石EZloT SDK對(duì)RT-Thread支持以及多芯片平臺(tái)管理策略 ? ? ? ? ? 審核編輯:彭靜 ?
    的頭像 發(fā)表于 05-27 11:55 ?1964次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):螢石EZloT SDK對(duì)<b class='flag-5'>RT-Thread</b>的<b class='flag-5'>支持</b>以及多芯片平臺(tái)管理策略

    RT-Thread全球技術(shù)大會(huì):RT-Thread上的單元測(cè)試框架與運(yùn)行測(cè)試用例

    RT-Thread全球技術(shù)大會(huì):RT-Thread上的單元測(cè)試框架與運(yùn)行測(cè)試用例 ? ? ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 16:21 ?1890次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):<b class='flag-5'>RT-Thread</b>上的單元測(cè)試<b class='flag-5'>框架</b>與運(yùn)行測(cè)試用例

    RT-Thread設(shè)備模型框架及創(chuàng)建注冊(cè)設(shè)備的實(shí)現(xiàn)

    RT-Thread設(shè)備模型框架及創(chuàng)建注冊(cè)設(shè)備的實(shí)現(xiàn)方式介紹如下:
    的頭像 發(fā)表于 05-28 10:38 ?2417次閱讀
    <b class='flag-5'>RT-Thread</b>設(shè)備模型<b class='flag-5'>框架</b>及創(chuàng)建注冊(cè)設(shè)備的實(shí)現(xiàn)

    RT-Thread文檔_RT-Thread 簡(jiǎn)介

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

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

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

    RT-Thread文檔_utest 測(cè)試框架

    RT-Thread文檔_utest 測(cè)試框架
    發(fā)表于 02-22 18:43 ?2次下載
    <b class='flag-5'>RT-Thread</b>文檔_utest 測(cè)試<b class='flag-5'>框架</b>

    淺析RT-Thread設(shè)備驅(qū)動(dòng)框架

    RT-Thread 設(shè)備框架屬于組件和服務(wù)層,是基于 RT-Thread 內(nèi)核之上的上層軟件。設(shè)備框架是針對(duì)某一類外設(shè),抽象出來(lái)的一套統(tǒng)一的操作方法及接入標(biāo)準(zhǔn),可以屏蔽硬件差異,為應(yīng)用
    的頭像 發(fā)表于 08-07 15:39 ?2587次閱讀

    基于 RT-Thread 的 RoboMaster 電控框架(一)

    由于 RT-Thread 穩(wěn)定高效的內(nèi)核,豐富的文檔教程,積極活躍的社區(qū)氛圍,以及設(shè)備驅(qū)動(dòng)框架、Kconfig、Scons、日志系統(tǒng)、海量的軟件包……很難不選擇 RT-Thread 進(jìn)行項(xiàng)目開(kāi)發(fā)
    的頭像 發(fā)表于 09-19 19:55 ?1200次閱讀

    基于RT-Thread的RoboMaster電控框架(二)

    由于 RT-Thread 穩(wěn)定高效的內(nèi)核,豐富的文檔教程,積極活躍的社區(qū)氛圍,以及設(shè)備驅(qū)動(dòng)框架、Kconfig、Scons、日志系統(tǒng)、海量的軟件包
    的頭像 發(fā)表于 09-20 15:16 ?1126次閱讀

    基于rt-thread的socket通信設(shè)計(jì)

    最近再研究 rt-thread 的通信 ,想設(shè)計(jì)出 eps8266(多個(gè)) rt-thread(作為中控) 服務(wù)器的通信框架,使用的開(kāi)發(fā)板是 潘多拉
    的頭像 發(fā)表于 10-13 15:02 ?1684次閱讀
    基于<b class='flag-5'>rt-thread</b>的socket通信設(shè)計(jì)