最近,朋友送了塊小板子,板子上的MCU是個很有意思的東西——并行多線程處理器MC3172 。
通俗地說,這顆MCU的內部實現了類似RTOS多線程的功能。但是MC3172 編程與RTOS編程的最大區別就是:
-
MC3172多線程絕對并行運行,沒有切換抖動及開銷。
-
MC3172無線程優先級、優先級反轉、死鎖等概念。
-
MC3172所有中斷都可以安排專門線程處理,沒有中斷嵌套和延遲。
-
MC3172各線程同步并行運行,互不阻塞,互不干擾。
-
MC3172線程響應的確定性相對于RTOS更為精確。
MC3172簡介
MC3172 是廈門感芯科技的一款32 位 RISC并行多線程實時處理器。基于RISC-V RV32IMC 指令集, 100%單周期指令, 最高200MHz主頻, 3.37coremark/MHz。可以代替實時操作系統, 實現程序的模塊化與復用性。
http://www.gxchip.cn/
MC3172 特性:
MC3172實踐
MC3172的開發環境使用的是國產軟件——MounRiver Studio。
MounRiver Studio下載鏈接:
http://www.mounriver.com/download
我們簡單看一下MC3172的demo工程:
1、MC3172文件夾
MC3172存放MC3172編程核心文件。
線程配置工具可對各線程進行配置:
MC3172支持64路線程同步并行運行, 其中分為4個線程組,每個線程組16線程,每個線程組里的線程編號如上圖所示。其中,不使用的線程可以設置為空閑線程,空閑線程完全不運行,不產生功耗。
每個線程都有自己獨立的棧空間 ,在數據空間允許范圍內可隨意分配,但需要確保所有非空閑線程所占的數據空間不超過數據空間的大小。
MC3172.h存放外設地址相關宏定義及其配置宏,如:
類似于ST的stm32fxxx.h。
thread_config.h為線程配置文件,由線程配置工具生成:
MC3172.lds為鏈接腳本,由線程配置工具生成
thread_start.c為啟動線程相關的源文件:
#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])();
}
程序運行的入口函數為:thread_start
,從鏈接腳本里可以知道:
thread_start里的THREAD_ID為線程ID值,直接從0x50000000地址中讀出:
#defineTHREAD_ID(*(volatileu8*)(0x50000000))
猜測:0x50000000地址里的ID值會不斷變化,通過某種機制跳轉,遍歷執行thread_initial_pointer函數指針數組里的各個線程函數。
threadx_initial里初始化線程棧,并執行線程主體,如
voidthread_end(void)
{
while(1);
}
voidthread1_main(void)
{
while(1){
//usercodesection
}
thread_end();
}
這是用戶代碼,我們可以在各個線程主體函數里邊編寫我們的應用代碼。
2、Release文件夾
Release文件夾里存放的是編譯生成的固件程序,通過 開發板程序下載工具
可進行下載:
3、USER_CODE文件夾
USER_CODE文件夾存放用戶代碼:
MC3172 是一顆并行并行多線程實時處理器,我們下面來看看其多線程并行執行的特性。
我們編寫兩個線程,線程進行相同的配置,兩個線程分別對兩個IO進行翻轉,測試代碼如:
voidLED0_GPIOA_PIN0_TEST(void)
{
//啟動GPIOA并設置特權組及時鐘頻率
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并設置特權組及時鐘頻率
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引腳電平變化如:
可見,這兩個波形是完全同步的,CPU同時在干兩件事情,實現了與RTOS多線程同樣的效果。
心得與總結
嵌入式開發,是軟件+硬件結合,兩者互補。如果硬件功能很強大,則軟件可能可以設計得比較簡單;如果硬件功能有限,則軟件方面可能得考慮比較多的方面。
比如:
-
一些軟件算法,需要多傳感器數據輸入進行融合,則功能實現可能比較簡單,但實際可能為了降成本,減少一些傳感器,這時候需要實現穩定可靠的功能,則軟件算法上得下更大的功夫。
-
對于一些不太復雜的數字信號處理,在通用的MCU上就可以處理,但對于一些比較復雜的數字信號處理,則可能使用一些帶有DSP處理器的MCU。
特別的,對于芯片內部IC電路來說,如果內部有相關模塊可以實現某些功能的話,則對應的軟件編程會簡單很多,而且硬件實現的比軟件實現的效率要高。
硬件實現的多線程編程確實優于RTOS編程,但實際開發中產品軟硬件架構需要考慮多個方面,比如芯片的穩定性以及軟件生態等方面。
并行多線程實時處理器是個好東西,但目前并行多線程實時處理器還處于起步階段,還有很多東西需要完善,需要我們多支持與傳播,只有生態起來了,將來我們才有機會用得上。
審核編輯 :李倩
-
傳感器
+關注
關注
2551文章
51163瀏覽量
754156 -
mcu
+關注
關注
146文章
17171瀏覽量
351443 -
多線程
+關注
關注
0文章
278瀏覽量
19996
原文標題:了解一下這款國產并行多線程MCU!
文章出處:【微信號:pzh_mcu,微信公眾號:痞子衡嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論