感芯科技MC3172多线程实时性测试

电子说

1.3w人已加入

描述

之前在网上看到了感芯科技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字节。

mcu

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).整体波形

mcu

整体波形看起来线程基本时同时切换,同步运行,下面放大看看。

(2).上升沿触发波形

mcu

注意:这里采用示波器的auto触发模式,可以抓到每次触发的时间会有不同,

  • 最快从线程1切换到线程2的时间为40ns左右。
  • 最慢从线程1切换到线程2的时间为120ns左右。

(3)结果分析

目前芯片配置为内部高速RC时钟200Mhz,配置每个线程的主频为¼主频,也就是50Mhz。

此时对应的线程切换时间范围应该在40ns~120ns之间。

我分析在当前配置下,硬件核心线程切换逻辑是:

mcu

 

 

  审核编辑:汤梓红

 

 

 

 

 

 

 

 

 

 

 

 

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分