摘要:最近,朋友送了塊小板子,板子上的MCU是個(gè)很有意思的東西——并行多線程處理器MC3172 。通俗地說(shuō),這顆MCU的內(nèi)部實(shí)現(xiàn)了類似RTOS多線程的功能。但是MC3172 編程與RTOS編程的最大區(qū)別就是:
-
MC3172多線程絕對(duì)并行運(yùn)行,沒(méi)有切換抖動(dòng)及開(kāi)銷。
-
MC3172無(wú)線程優(yōu)先級(jí)、優(yōu)先級(jí)反轉(zhuǎn)、死鎖等概念。
-
MC3172所有中斷都可以安排專門線程處理,沒(méi)有中斷嵌套和延遲。
-
MC3172各線程同步并行運(yùn)行,互不阻塞,互不干擾。
-
MC3172線程響應(yīng)的確定性相對(duì)于RTOS更為精確。
MC3172簡(jiǎn)介
MC3172 是廈門感芯科技的一款32 位 RISC并行多線程實(shí)時(shí)處理器。基于RISC-V RV32IMC 指令集, 100%單周期指令,最高200MHz主頻,3.37coremark/MHz。可以代替實(shí)時(shí)操作系統(tǒng), 實(shí)現(xiàn)程序的模塊化與復(fù)用性。
http://www.gxchip.cn/
MC3172 特性:
![052e9338-1abb-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/14/wKgZomTnFgGAPtX1AAWlhM0gj1w519.png)
MC3172實(shí)踐
MC3172的開(kāi)發(fā)環(huán)境使用的是國(guó)產(chǎn)軟件——MounRiver Studio。
![054bec12-1abb-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/14/wKgZomTnFgKAWWT6AAK1opuIk88650.png)
MounRiver Studio下載鏈接:
http://www.mounriver.com/download
我們簡(jiǎn)單看一下MC3172的demo工程:
![057a8ce8-1abb-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/14/wKgZomTnFgKAO-0rAACx5VED3Go201.png)
1、MC3172文件夾
MC3172存放MC3172編程核心文件。
線程配置工具可對(duì)各線程進(jìn)行配置:
![058f65e6-1abb-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/14/wKgZomTnFgOAM9yUAALeUTNTBO0181.png)
可以配置線程時(shí)鐘源、頻率、棧空間、存儲(chǔ)器分配等信息。
MC3172支持64路線程同步并行運(yùn)行, 其中分為4個(gè)線程組,每個(gè)線程組16線程,每個(gè)線程組里的線程編號(hào)如上圖所示。其中,不使用的線程可以設(shè)置為空閑線程,空閑線程完全不運(yùn)行,不產(chǎn)生功耗。
每個(gè)線程都有自己獨(dú)立的棧空間 ,在數(shù)據(jù)空間允許范圍內(nèi)可隨意分配,但需要確保所有非空閑線程所占的數(shù)據(jù)空間不超過(guò)數(shù)據(jù)空間的大小。
MC3172.h存放外設(shè)地址相關(guān)宏定義及其配置宏,如:
![05afdc72-1abb-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/14/wKgZomTnFgOAJD9hAAA5M1lSRzU540.png)
類似于ST的stm32fxxx.h。
thread_config.h為線程配置文件,由線程配置工具生成:
![05d10096-1abb-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/14/wKgZomTnFgOAbIfxAAApMhtvf3E828.png)
MC3172.lds為鏈接腳本,由線程配置工具生成
![05e2418a-1abb-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/14/wKgZomTnFgOASXRRAAAlNiMh8AI442.png)
thread_start.c為啟動(dòng)線程相關(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])();
}
程序運(yùn)行的入口函數(shù)為:thread_start ,從鏈接腳本里可以知道:
![05ef8494-1abb-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/14/wKgZomTnFgOAEVdyAACMZh_fbbs988.png)
thread_start里的THREAD_ID為線程ID值,直接從0x50000000地址中讀出:
#defineTHREAD_ID(*(volatileu8*)(0x50000000))
猜測(cè):0x50000000地址里的ID值會(huì)不斷變化,通過(guò)某種機(jī)制跳轉(zhuǎn),遍歷執(zhí)行thread_initial_pointer函數(shù)指針數(shù)組里的各個(gè)線程函數(shù)。
threadx_initial里初始化線程棧,并執(zhí)行線程主體,如
voidthread_end(void)
{
while(1);
}
voidthread1_main(void)
{
while(1){
//usercodesection
}
thread_end();
}
這是用戶代碼,我們可以在各個(gè)線程主體函數(shù)里邊編寫(xiě)我們的應(yīng)用代碼。
2、Release文件夾
Release文件夾里存放的是編譯生成的固件程序,通過(guò) 開(kāi)發(fā)板程序下載工具 可進(jìn)行下載:
![06098f7e-1abb-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/14/wKgZomTnFgOAEGuIAADusHCHYAI171.png)
3、USER_CODE文件夾
USER_CODE文件夾存放用戶代碼:
![061e239e-1abb-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/14/wKgZomTnFgOARpOFAAAYOdeyJXo203.png)
MC3172是一顆并行并行多線程實(shí)時(shí)處理器,我們下面來(lái)看看其多線程并行執(zhí)行的特性。
我們編寫(xiě)兩個(gè)線程,線程進(jìn)行相同的配置,兩個(gè)線程分別對(duì)兩個(gè)IO進(jìn)行翻轉(zhuǎn),測(cè)試代碼如:
voidLED0_GPIOA_PIN0_TEST(void)
{
//啟動(dòng)GPIOA并設(shè)置特權(quán)組及時(shí)鐘頻率
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);
//延時(shí)
for(u32var=0;var5000;++var)
{
NOP();
}
//GPIOAPIN0輸出0
GPIO_SET_OUTPUT_PIN_TO_0(GPIOA_BASE_ADDR,GPIO_PIN0);
//延時(shí)
for(u32var=0;var5000;++var)
{
NOP();
}
}
}
voidLED1_GPIOA_PIN1_TEST(void)
{
//啟動(dòng)GPIOA并設(shè)置特權(quán)組及時(shí)鐘頻率
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);
//延時(shí)
for(u32var=0;var5000;++var)
{
NOP();
}
//GPIOAPIN1輸出0
GPIO_SET_OUTPUT_PIN_TO_0(GPIOA_BASE_ADDR,GPIO_PIN1);
//延時(shí)
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引腳電平變化如:
![062b7a12-1abb-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/14/wKgZomTnFgOAaMvwAAKdnDdUAVo972.png)
可見(jiàn),這兩個(gè)波形是完全同步的,CPU同時(shí)在干兩件事情,實(shí)現(xiàn)了與RTOS多線程同樣的效果。
心得與總結(jié)
嵌入式開(kāi)發(fā),是軟件+硬件結(jié)合,兩者互補(bǔ)。如果硬件功能很強(qiáng)大,則軟件可能可以設(shè)計(jì)得比較簡(jiǎn)單;如果硬件功能有限,則軟件方面可能得考慮比較多的方面。
比如:
-
一些軟件算法,需要多傳感器數(shù)據(jù)輸入進(jìn)行融合,則功能實(shí)現(xiàn)可能比較簡(jiǎn)單,但實(shí)際可能為了降成本,減少一些傳感器,這時(shí)候需要實(shí)現(xiàn)穩(wěn)定可靠的功能,則軟件算法上得下更大的功夫。
-
對(duì)于一些不太復(fù)雜的數(shù)字信號(hào)處理,在通用的MCU上就可以處理,但對(duì)于一些比較復(fù)雜的數(shù)字信號(hào)處理,則可能使用一些帶有DSP處理器的MCU。
特別的,對(duì)于芯片內(nèi)部IC電路來(lái)說(shuō),如果內(nèi)部有相關(guān)模塊可以實(shí)現(xiàn)某些功能的話,則對(duì)應(yīng)的軟件編程會(huì)簡(jiǎn)單很多,而且硬件實(shí)現(xiàn)的比軟件實(shí)現(xiàn)的效率要高。
硬件實(shí)現(xiàn)的多線程編程確實(shí)優(yōu)于RTOS編程,但實(shí)際開(kāi)發(fā)中產(chǎn)品軟硬件架構(gòu)需要考慮多個(gè)方面,比如芯片的穩(wěn)定性以及軟件生態(tài)等方面。
并行多線程實(shí)時(shí)處理器是個(gè)好東西,但目前并行多線程實(shí)時(shí)處理器還處于起步階段,還有很多東西需要完善,需要我們多支持與傳播,只有生態(tài)起來(lái)了,將來(lái)我們才有機(jī)會(huì)用得上。
審核編輯:湯梓紅-
處理器
+關(guān)注
關(guān)注
68文章
19407瀏覽量
231183 -
mcu
+關(guān)注
關(guān)注
146文章
17317瀏覽量
352641 -
RTOS
+關(guān)注
關(guān)注
22文章
819瀏覽量
119887
原文標(biāo)題:并行多線程的MCU—MC3172,你見(jiàn)過(guò)嗎?
文章出處:【微信號(hào):果果小師弟,微信公眾號(hào):果果小師弟】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
什么是并行多線程實(shí)時(shí)處理器?MC3172開(kāi)發(fā)環(huán)境開(kāi)發(fā)實(shí)踐
![什么是<b class='flag-5'>并行</b><b class='flag-5'>多線程</b>實(shí)時(shí)<b class='flag-5'>處理器</b>?<b class='flag-5'>MC3172</b>開(kāi)發(fā)環(huán)境開(kāi)發(fā)<b class='flag-5'>實(shí)踐</b>](https://file1.elecfans.com/web2/M00/A3/B4/wKgZomUJFfWAEmgCAAA-6x1DCVs413.png)
[每日一芯]感芯科技 MC3172 系列 64線程并行 32位risc-v MUC 附完整資料
【感芯科技64線程MC3172開(kāi)發(fā)板免費(fèi)試用體驗(yàn)】1.開(kāi)箱搭環(huán)境
【感芯科技64線程MC3172開(kāi)發(fā)板免費(fèi)試用體驗(yàn)】Fedora Linux 搭環(huán)境
【RISC-V開(kāi)發(fā)板】并行多線程處理器MC3172開(kāi)發(fā)資料集合
【感芯科技MC3172開(kāi)發(fā)板體驗(yàn)】感芯科技MC3172開(kāi)發(fā)板上手體驗(yàn)
【感芯科技MC3172開(kāi)發(fā)板體驗(yàn)】初次使用多線程開(kāi)發(fā)板
【感芯科技MC3172開(kāi)發(fā)板體驗(yàn)】測(cè)評(píng)感芯科技MC3172開(kāi)發(fā)板
【感芯科技MC3172開(kāi)發(fā)板體驗(yàn)】MC3172開(kāi)發(fā)板一種便捷的多線程開(kāi)發(fā)新途徑
【感芯科技MC3172開(kāi)發(fā)板體驗(yàn)】開(kāi)機(jī)測(cè)試
【感芯科技MC3172開(kāi)發(fā)板體驗(yàn)】多線程串口功能測(cè)試
并行多線程處理器MC3172
感芯科技MC3172多線程實(shí)時(shí)性測(cè)試
![感芯科技<b class='flag-5'>MC3172</b><b class='flag-5'>多線程</b>實(shí)時(shí)性測(cè)試](https://file.elecfans.com/web2/M00/68/B7/pYYBAGMcGpqAAFsUAAGNlJ2V_h0268.png)
【感芯科技64線程MC3172開(kāi)發(fā)板免費(fèi)試用體驗(yàn)】Fedora Linux 搭環(huán)境
![【感芯科技64<b class='flag-5'>線程</b><b class='flag-5'>MC3172</b>開(kāi)發(fā)板免費(fèi)試用體驗(yàn)】Fedora Linux 搭環(huán)境](https://file.elecfans.com/web2/M00/6E/C5/pYYBAGM-u9OAEoViABOcLCwADIA435.png)
【感芯科技64線程MC3172開(kāi)發(fā)板免費(fèi)試用體驗(yàn)】MC3172開(kāi)發(fā)板了解學(xué)習(xí)
![【感芯科技64<b class='flag-5'>線程</b><b class='flag-5'>MC3172</b>開(kāi)發(fā)板免費(fèi)試用體驗(yàn)】<b class='flag-5'>MC3172</b>開(kāi)發(fā)板了解學(xué)習(xí)](https://file.elecfans.com/web2/M00/6E/18/poYBAGM9pqWADw2nABlLbrqSQzg872.png)
評(píng)論