之前在网上看到了感芯科技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文章
16977浏览量
350215 -
多线程
+关注
关注
0文章
277浏览量
19919 -
RISC-V
+关注
关注
44文章
2227浏览量
46000
发布评论请先 登录
相关推荐
评论