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

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

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

并行多線程處理器MC3172

痞子衡嵌入式 ? 來源:痞子衡嵌入式 ? 作者:痞子衡嵌入式 ? 2022-08-19 14:57 ? 次閱讀

最近,朋友送了塊小板子,板子上的MCU是個很有意思的東西——并行多線程處理器MC3172 。

通俗地說,這顆MCU的內(nèi)部實現(xiàn)了類似RTOS多線程的功能。但是MC3172 編程與RTOS編程的最大區(qū)別就是:

  • MC3172多線程絕對并行運行,沒有切換抖動及開銷。

  • MC3172無線程優(yōu)先級、優(yōu)先級反轉(zhuǎn)、死鎖等概念。

  • MC3172所有中斷都可以安排專門線程處理,沒有中斷嵌套和延遲。

  • MC3172各線程同步并行運行,互不阻塞,互不干擾。

  • MC3172線程響應(yīng)的確定性相對于RTOS更為精確。

MC3172簡介

MC3172 是廈門感芯科技的一款32 位 RISC并行多線程實時處理器。基于RISC-V RV32IMC 指令集, 100%單周期指令, 最高200MHz主頻, 3.37coremark/MHz??梢源鎸崟r操作系統(tǒng), 實現(xiàn)程序的模塊化與復(fù)用性。

相關(guān)資料可在感芯官網(wǎng)下載。鏈接:

http://www.gxchip.cn/

MC3172 特性:

4c978256-1f85-11ed-ba43-dac502259ad0.png

MC3172實踐

MC3172的開發(fā)環(huán)境使用的是國產(chǎn)軟件——MounRiver Studio。

4cb789fc-1f85-11ed-ba43-dac502259ad0.png

MounRiver Studio下載鏈接:

http://www.mounriver.com/download

我們簡單看一下MC3172的demo工程:

4cc90a38-1f85-11ed-ba43-dac502259ad0.png

1、MC3172文件夾

MC3172存放MC3172編程核心文件。

線程配置工具可對各線程進行配置:

4cda25e8-1f85-11ed-ba43-dac502259ad0.png

可以配置線程時鐘源、頻率、??臻g、存儲器分配等信息。

MC3172支持64路線程同步并行運行, 其中分為4個線程組,每個線程組16線程,每個線程組里的線程編號如上圖所示。其中,不使用的線程可以設(shè)置為空閑線程,空閑線程完全不運行,不產(chǎn)生功耗。

每個線程都有自己獨立的??臻g ,在數(shù)據(jù)空間允許范圍內(nèi)可隨意分配,但需要確保所有非空閑線程所占的數(shù)據(jù)空間不超過數(shù)據(jù)空間的大小。

MC3172.h存放外設(shè)地址相關(guān)宏定義及其配置宏,如:

4cf1fac4-1f85-11ed-ba43-dac502259ad0.png

類似于ST的stm32fxxx.h。

thread_config.h為線程配置文件,由線程配置工具生成:

4d008d1e-1f85-11ed-ba43-dac502259ad0.png

MC3172.lds為鏈接腳本,由線程配置工具生成

4d0d92de-1f85-11ed-ba43-dac502259ad0.png

thread_start.c為啟動線程相關(guān)的源文件:

#ifndefTHREAD_START_C
#defineTHREAD_START_C
#include"./MC3172.h"
#include"./thread_config.h"

voidthread1_initial(void)
{
#ifdefROTHD_THREAD1_VALID
externvoidthread1_main(void);
rothd_set_sp_const(ROTHD_THREAD1_STACKCFG_VALUE|0x20000000);
thread1_main();
#endif
}
voidthread2_initial(void)
{
#ifdefROTHD_THREAD2_VALID
externvoidthread2_main(void);
rothd_set_sp_const(ROTHD_THREAD2_STACKCFG_VALUE|0x20000000);
thread2_main();
#endif
}

//省略部分代碼......
void(*thread_initial_pointer[64])(void)={
&thread0_initial,
&thread1_initial,
&thread2_initial
//省略部分代碼......
}

voidthread_start(void)
{
(*thread_initial_pointer[THREAD_ID])();
}

程序運行的入口函數(shù)為:thread_start ,從鏈接腳本里可以知道:

4d1eaa56-1f85-11ed-ba43-dac502259ad0.png

thread_start里的THREAD_ID為線程ID值,直接從0x50000000地址中讀出:

#defineTHREAD_ID(*(volatileu8*)(0x50000000))

猜測:0x50000000地址里的ID值會不斷變化,通過某種機制跳轉(zhuǎn),遍歷執(zhí)行thread_initial_pointer函數(shù)指針數(shù)組里的各個線程函數(shù)。

threadx_initial里初始化線程棧,并執(zhí)行線程主體,如

voidthread_end(void)
{
while(1);
}

voidthread1_main(void)
{
while(1){
//usercodesection
}
thread_end();
}

這是用戶代碼,我們可以在各個線程主體函數(shù)里邊編寫我們的應(yīng)用代碼。

2、Release文件夾

Release文件夾里存放的是編譯生成的固件程序,通過 開發(fā)板程序下載工具 可進行下載:

4d2c5b6a-1f85-11ed-ba43-dac502259ad0.png

3、USER_CODE文件夾

USER_CODE文件夾存放用戶代碼:

4d421626-1f85-11ed-ba43-dac502259ad0.png

MC3172 是一顆并行并行多線程實時處理器,我們下面來看看其多線程并行執(zhí)行的特性。

我們編寫兩個線程,線程進行相同的配置,兩個線程分別對兩個IO進行翻轉(zhuǎn),測試代碼如:

voidLED0_GPIOA_PIN0_TEST(void)
{
//啟動GPIOA并設(shè)置特權(quán)組及時鐘頻率
INTDEV_SET_CLK_RST(GPIOA_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));

//使能GPIOAPIN0引腳
GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR,GPIO_PIN0,GPIO_SET_ENABLE);

while(1)
{
//GPIOAPIN0輸出1
GPIO_SET_OUTPUT_PIN_TO_1(GPIOA_BASE_ADDR,GPIO_PIN0);

//延時
for(u32var=0;var5000;++var)
{
NOP();
}

//GPIOAPIN0輸出0
GPIO_SET_OUTPUT_PIN_TO_0(GPIOA_BASE_ADDR,GPIO_PIN0);

//延時
for(u32var=0;var5000;++var)
{
NOP();
}
}
}

voidLED1_GPIOA_PIN1_TEST(void)
{
//啟動GPIOA并設(shè)置特權(quán)組及時鐘頻率
INTDEV_SET_CLK_RST(GPIOA_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));

//使能GPIOAPIN1引腳
GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR,GPIO_PIN1,GPIO_SET_ENABLE);

while(1)
{
//GPIOAPIN1輸出1
GPIO_SET_OUTPUT_PIN_TO_1(GPIOA_BASE_ADDR,GPIO_PIN1);

//延時
for(u32var=0;var5000;++var)
{
NOP();
}

//GPIOAPIN1輸出0
GPIO_SET_OUTPUT_PIN_TO_0(GPIOA_BASE_ADDR,GPIO_PIN1);

//延時
for(u32var=0;var5000;++var)
{
NOP();
}
}
}

////////////////////////////////////////////////////////////


voidthread_end(void)
{
while(1);
}

////////////////////////////////////////////////////////////

voidthread0_main(void)
{
while(1){
//usercodesection
}
thread_end();
}

////////////////////////////////////////////////////////////

voidthread1_main(void)
{
while(1){
//usercodesection
LED0_GPIOA_PIN0_TEST();
}
thread_end();
}

////////////////////////////////////////////////////////////

voidthread2_main(void)
{
while(1){
//usercodesection
LED1_GPIOA_PIN1_TEST();
}
thread_end();
}

燒錄程序,使用邏輯分析儀抓取GPIOA_PIN0及GPIOA_PIN1引腳電平變化如:

4d4fc456-1f85-11ed-ba43-dac502259ad0.png

可見,這兩個波形是完全同步的,CPU同時在干兩件事情,實現(xiàn)了與RTOS多線程同樣的效果。

心得與總結(jié)

嵌入式開發(fā),是軟件+硬件結(jié)合,兩者互補。如果硬件功能很強大,則軟件可能可以設(shè)計得比較簡單;如果硬件功能有限,則軟件方面可能得考慮比較多的方面。

比如:

  • 一些軟件算法,需要多傳感器數(shù)據(jù)輸入進行融合,則功能實現(xiàn)可能比較簡單,但實際可能為了降成本,減少一些傳感器,這時候需要實現(xiàn)穩(wěn)定可靠的功能,則軟件算法上得下更大的功夫。

  • 對于一些不太復(fù)雜的數(shù)字信號處理,在通用的MCU上就可以處理,但對于一些比較復(fù)雜的數(shù)字信號處理,則可能使用一些帶有DSP處理器的MCU。

特別的,對于芯片內(nèi)部IC電路來說,如果內(nèi)部有相關(guān)模塊可以實現(xiàn)某些功能的話,則對應(yīng)的軟件編程會簡單很多,而且硬件實現(xiàn)的比軟件實現(xiàn)的效率要高。

硬件實現(xiàn)的多線程編程確實優(yōu)于RTOS編程,但實際開發(fā)中產(chǎn)品軟硬件架構(gòu)需要考慮多個方面,比如芯片的穩(wěn)定性以及軟件生態(tài)等方面。

并行多線程實時處理器是個好東西,但目前并行多線程實時處理器還處于起步階段,還有很多東西需要完善,需要我們多支持與傳播,只有生態(tài)起來了,將來我們才有機會用得上。


審核編輯 :李倩


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

    關(guān)注

    2542

    文章

    50315

    瀏覽量

    750356
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16813

    瀏覽量

    349498
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    277

    瀏覽量

    19882

原文標(biāo)題:了解一下這款國產(chǎn)并行多線程MCU!

文章出處:【微信號:pzh_mcu,微信公眾號:痞子衡嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Python中多線程和多進程的區(qū)別

    Python作為一種高級編程語言,提供了多種并發(fā)編程的方式,其中多線程與多進程是最常見的兩種方式之一。在本文中,我們將探討Python中多線程與多進程的概念、區(qū)別以及如何使用線程池與進程池來提高并發(fā)執(zhí)行效率。
    的頭像 發(fā)表于 10-23 11:48 ?145次閱讀
    Python中<b class='flag-5'>多線程</b>和多進程的區(qū)別

    多線程設(shè)計模式到對 CompletableFuture 的應(yīng)用

    最近在開發(fā) 延保服務(wù) 頻道頁時,為了提高查詢效率,使用到了多線程技術(shù)。為了對多線程方案設(shè)計有更加充分的了解,在業(yè)余時間讀完了《圖解 Java 多線程設(shè)計模式》這本書,覺得收獲良多。本篇文章將介紹其中
    的頭像 發(fā)表于 06-26 14:18 ?226次閱讀
    從<b class='flag-5'>多線程</b>設(shè)計模式到對 CompletableFuture 的應(yīng)用

    java實現(xiàn)多線程的幾種方式

    Java實現(xiàn)多線程的幾種方式 多線程是指程序中包含了兩個或以上的線程,每個線程都可以并行執(zhí)行不同的任務(wù)或操作。Java中的
    的頭像 發(fā)表于 03-14 16:55 ?526次閱讀

    AT socket可以多線程調(diào)用嗎?

    請問AT socket 可以多線程調(diào)用嗎? 有互鎖機制嗎,還是要自己做互鎖。
    發(fā)表于 03-01 08:22

    什么是多核多線程?多核多線程如何提高程序的運行效率?

    線程無法充分利用多核處理器并行計算能力。
    的頭像 發(fā)表于 02-20 10:22 ?1162次閱讀

    你還是分不清多進程和多線程嗎?一文搞懂!

    中同時運行多個獨立的進程。每個進程都有自己獨立的內(nèi)存空間,可以同時執(zhí)行不同的任務(wù)。多進程之間通過進程間通信的方式進行數(shù)據(jù)交換。 優(yōu)點: - 程序之間內(nèi)存空間相互獨立,相互不會干擾。 - 可以有效地利用多核處理器的優(yōu)勢,提高
    的頭像 發(fā)表于 12-19 16:07 ?499次閱讀

    redis多線程還能保證線程安全嗎

    Redis是一種使用C語言編寫的高性能鍵值存儲系統(tǒng),它是單線程的,因為使用了多路復(fù)用的方式來處理并發(fā)請求。這樣的實現(xiàn)方式帶來了很好的性能,但同時也引發(fā)了一些線程安全方面的問題。 在Redis中,由于
    的頭像 發(fā)表于 12-05 10:28 ?1530次閱讀

    redis使用多線程處理操作命令

    Redis 是一個使用多線程處理操作命令的開源內(nèi)存數(shù)據(jù)庫系統(tǒng)。它以其高性能、可擴展性和靈活性而聞名,通常被用作緩存、消息代理和數(shù)據(jù)存儲等各種應(yīng)用場景。在本文中,我們將詳盡、詳實、細(xì)致地探
    的頭像 發(fā)表于 12-05 10:25 ?512次閱讀

    mfc多線程編程實例

    (圖形用戶界面)應(yīng)用程序的開發(fā)。在這篇文章中,我們將重點介紹MFC中的多線程編程。 多線程編程在軟件開發(fā)中非常重要,它可以實現(xiàn)程序的并發(fā)執(zhí)行,提高程序的效率和響應(yīng)速度。MFC提供了豐富的多線程支持,可以輕松地實現(xiàn)
    的頭像 發(fā)表于 12-01 14:29 ?1307次閱讀

    128線程Zen 4處理器細(xì)節(jié)實測報告

    AMD的銳龍線程撕裂者處理器在一些性能測試中都遠(yuǎn)遠(yuǎn)超過消費者使用的普通處理器。該系列處理器的最大特點就是核心數(shù)量多,AMD通過Chiplet技術(shù)和
    發(fā)表于 11-21 11:47 ?1005次閱讀
    128<b class='flag-5'>線程</b>Zen 4<b class='flag-5'>處理器</b>細(xì)節(jié)實測報告

    多線程如何保證數(shù)據(jù)的同步

    多線程編程是一種并發(fā)編程的方法,意味著程序中同時運行多個線程,每個線程可獨立執(zhí)行不同的任務(wù),共享同一份數(shù)據(jù)。由于多線程并發(fā)執(zhí)行的特點,會引發(fā)數(shù)據(jù)同步的問題,即保證多個
    的頭像 發(fā)表于 11-17 14:22 ?1053次閱讀

    多線程同步的幾種方法

    多線程同步是指在多個線程并發(fā)執(zhí)行的情況下,為了保證線程執(zhí)行的正確性和一致性,需要采用特定的方法來協(xié)調(diào)線程之間的執(zhí)行順序和共享資源的訪問。下面將介紹幾種常見的
    的頭像 發(fā)表于 11-17 14:16 ?1063次閱讀

    Linux系統(tǒng)上多線程和多進程的運行效率

    關(guān)于多進程和多線程,教科書上最經(jīng)典的一句話是“進程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”,這句話應(yīng)付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有這么簡單了,選的不好,會讓你
    的頭像 發(fā)表于 11-10 10:54 ?1247次閱讀
    Linux系統(tǒng)上<b class='flag-5'>多線程</b>和多進程的運行效率

    LabVIEW多線程編程解析 LabVIEW的VI優(yōu)先級和并行循環(huán)等相關(guān)知識

    軟件開發(fā)過程中總會遇到需要多線程同步運行的情況,尤其是一些復(fù)雜的測試系統(tǒng)和大型項目,僅靠單線程運行的程序是遠(yuǎn)遠(yuǎn)無法滿足用戶需求的,甚至可以說在復(fù)雜測試系統(tǒng)的軟件開發(fā)中,多線程運行是最基本的。
    的頭像 發(fā)表于 11-10 10:20 ?1w次閱讀
    LabVIEW<b class='flag-5'>多線程</b>編程解析 LabVIEW的VI優(yōu)先級和<b class='flag-5'>并行</b>循環(huán)等相關(guān)知識

    關(guān)于Python多進程和多線程詳解

    進程(process)和線程(thread)是操作系統(tǒng)的基本概念,但是它們比較抽象,不容易掌握。關(guān)于多進程和多線程,教科書上最經(jīng)典的一句話是“進程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”。
    的頭像 發(fā)表于 11-06 14:46 ?756次閱讀
    關(guān)于Python多進程和<b class='flag-5'>多線程</b>詳解