之前在網上看到了感芯科技MC3172MCU,看介紹有硬件64位多線程處理,甚是感興趣,最近有幸收到一塊開發板,所以進行部分性能方面的測試。
MC3172簡介
感芯科技第一款32 位 RISC 處理器 MC3172 ,業內首個64線程同步并行運行,線程資源可按需配置,
共享代碼段空間與數據段空間,硬件級實時響應,無需中斷服務程序,無需實時操作系統。
基于RISC-V RV32IMC 指令集,100%單周期指令,最高200MHz主頻,3.37coremark/MHz。
數據段與代碼段共享128K字節SRAM,可按需配置為96K代碼空間加32K數據空間,或64K代碼空間加
64K數據空間,或32K代碼空間加96K數據空間,靈活應對各種應用場景。
擁有豐富片內外設:12個可配置通信接口,可按需配置為UASRT或SPI或USB或CAN總線形式,滿足多通
信端口需求;6個雙緩沖24位計數器,可提供高精度PWM與輸入捕捉;64個GPIO,可提供豐富的自定義控制
接口。
產品特性
內核 Core:
- 基于 RV32IMC 指令集,單周期乘法
- 64路線程同步并行運行,無需線程切換
- 線程資源可按需配置且無需操作系統
- 3.37coremark/MHz
- 100%單周期指令,時序確定
- 最高 200MHz 系統主頻
存儲器:
- 128KB SRAM可按需分配為:
96K代碼空間+32K數據空間
64K代碼空間+64K數據空間
32K代碼空間+96K數據空間
電源管理和低功耗:
- 核心供電電壓范圍:1.8V~1.98V,
- GPIO供電電壓:1.8V~3.3V
系統時鐘、復位
- 內嵌 200MHz RC 振蕩器
- 內嵌 8MHz RC 振蕩器
- 外部支持 4MHz~40MHz 高速振蕩器
- 外部支持 最高133MHz 輸入時鐘
- 上電復位(POR)
多線程實時性測試
由于這個芯片其他的測試例如引腳配置、定時器配置、串口配置等網友已經有諸多帖子,所以我只對目前我感覺好奇的多線程實時性進行測試。
1.多線程配置(使用線程0、1、2、3,分頻?主頻)
這里我們4個線程組每個僅使用1個線程,分頻每個均為?主頻。線程空間定位2048字節。
2.測試思路和主要程序代碼
在僅配置4個線程的情況下,我們在不同的線程中通過切換GPIO0、1、2的引腳電平來判斷具體線程的響應時序。具體配置如下:
線程0:用來初始化GPIOA引腳的0、1、2為輸出引腳。初始化完成后,設定全局變量u8g_sysInitSuccessFlg為1;
初始化完成后,每等待150個延時周期,對u8g_gpioAllowToggleFlg取反,并反轉GPIOA0。
線程1:等待線程0對GPIO初始化完成后,實時檢測u8g_gpioAllowToggleFlg的狀態,并對GPIOA1進行翻轉。
線程2:等待線程0對GPIO初始化完成后,實時檢測u8g_gpioAllowToggleFlg的狀態,并對GPIOA2進行翻轉。
通過對比上升沿的時間差,即可知道線程運行的時序差。
volatile u8 u8g_sysInitSuccessFlg=0;
volatile u8 u8g_gpioAllowToggleFlg=0;
void thread0_main(void)
{
while(1){
u32 u32gpioToggleDelayCnt;
INTDEV_SET_CLK_RST(GPIOA_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));
GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR,GPIO_PIN0,GPIO_SET_ENABLE);
GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR,GPIO_PIN1,GPIO_SET_ENABLE);
GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR,GPIO_PIN2,GPIO_SET_ENABLE);
GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR,GPIO_PIN3,GPIO_SET_ENABLE);
u8g_sysInitSuccessFlg = 1;
while(1){
u32gpioToggleDelayCnt = 150;
while(u32gpioToggleDelayCnt--){NOP();}
u8g_gpioAllowToggleFlg = !u8g_gpioAllowToggleFlg;
GPIO_SET_OUTPUT_PIN_INV(GPIOA_BASE_ADDR,GPIO_PIN0);
}
}
thread_end();
}
void thread1_main(void)
{
while(1){
while(!u8g_sysInitSuccessFlg){NOP();}
while(1){
if(u8g_gpioAllowToggleFlg){
GPIO_SET_OUTPUT_PIN_TO_1(GPIOA_BASE_ADDR,GPIO_PIN1);
}else{
GPIO_SET_OUTPUT_PIN_TO_0(GPIOA_BASE_ADDR,GPIO_PIN1);
}
}
}
thread_end();
}
void thread2_main(void)
{
while(1){
while(!u8g_sysInitSuccessFlg){NOP();}
while(1){
if(u8g_gpioAllowToggleFlg){
GPIO_SET_OUTPUT_PIN_TO_1(GPIOA_BASE_ADDR,GPIO_PIN2);
}else{
GPIO_SET_OUTPUT_PIN_TO_0(GPIOA_BASE_ADDR,GPIO_PIN2);
}
}
}
thread_end();
}
3.測試結果
信號說明:
黃色:GPIOA0電平 藍色:GPIOA1電平
(1).整體波形
整體波形看起來線程基本時同時切換,同步運行,下面放大看看。
(2).上升沿觸發波形
注意:這里采用示波器的auto觸發模式,可以抓到每次觸發的時間會有不同,
- 最快從線程1切換到線程2的時間為40ns左右。
- 最慢從線程1切換到線程2的時間為120ns左右。
(3)結果分析
目前芯片配置為內部高速RC時鐘200Mhz,配置每個線程的主頻為?主頻,也就是50Mhz。
此時對應的線程切換時間范圍應該在40ns~120ns之間。
我分析在當前配置下,硬件核心線程切換邏輯是:
審核編輯:湯梓紅
-
mcu
+關注
關注
146文章
17178瀏覽量
351681 -
多線程
+關注
關注
0文章
278瀏覽量
20018 -
RISC-V
+關注
關注
45文章
2294瀏覽量
46251
發布評論請先 登錄
相關推薦
評論