0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

韩晓宇 来源:韩晓宇 作者:韩晓宇 2022-09-13 09:15 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

之前在网上看到了感芯科技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或USBCAN总线形式,满足多通

端口需求;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字节。

pYYBAGMcGpqAAFsUAAGNlJ2V_h0268.png

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

pYYBAGMcIHCAP8nPAAC5G7K6gk4795.png

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

(2).上升沿触发波形

pYYBAGMcIRuAKp3EAADJ8eLJusU710.png

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

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

(3)结果分析

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

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

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

poYBAGMcJ6uALowSAACDqBmLoFM350.png

审核编辑:汤梓红

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

    关注

    147

    文章

    18609

    浏览量

    387096
  • 多线程
    +关注

    关注

    0

    文章

    279

    浏览量

    20915
  • RISC-V
    +关注

    关注

    48

    文章

    2793

    浏览量

    51911
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux多线程对比单线程的优势

    。「提高响应」:线程可以使程序更加响应用户输入或其他事件,避免阻塞。线程相比单线程的优点:「并发性」:多线程可以同时执行多个任务,而单
    发表于 12-01 06:11

    RK3588核心板/开发板RT-Linux系统实时及硬件中断延迟测试

    本文介绍瑞微RK3588芯片平台RT-Linux系统实时及硬件中断延迟测试,基于触觉智能RK3588核心板/开发板演示。Linux-RT实时
    的头像 发表于 11-28 18:57 133次阅读
    RK3588核心板/开发板RT-Linux系统<b class='flag-5'>实时</b><b class='flag-5'>性</b>及硬件中断延迟<b class='flag-5'>测试</b>

    【飞凌OK153-S开发板评测】系统实时及codesys测试

    接牛刀小试章节,今天我们主要测试下OK153-S开发板系统实时以及是否可以跑codesys底层runtime。 因OK153-S开发板只有一个网口,后面跑codesys测试Ether
    发表于 11-28 14:00

    【飞凌OK-T153 开发板试用】实时测试

    实时测试 本文以cyclictest工具为例测试中断响应时间或延迟 cyclictest所测得的延时包含中断延时 + 调度延时两部分,如下图 中断延时(interrupt late
    发表于 11-22 05:29

    rt-thread studio 如何进行多线程编译?

    ,使用的是5800h+32g内存+sn550 ssd,开启16线程编译时cpu的占用率也只能到30%,编译完整个工程需要3分钟 感觉多线程编译设置没有生效,有办法提高编译速度吗 rtthread studio版本是 2.2.9
    发表于 10-11 09:16

    RK3576核心板/开发板RT-Linux系统实时及硬件中断延迟测试

    本文介绍瑞微RK3576芯片平台RT-Linux系统实时及硬件中断延迟测试,基于触觉智能RK3576开发板PurplePiOH2演示。Linux-RT
    的头像 发表于 09-30 16:52 1671次阅读
    RK3576核心板/开发板RT-Linux系统<b class='flag-5'>实时</b><b class='flag-5'>性</b>及硬件中断延迟<b class='flag-5'>测试</b>

    微RK35XX系列Linux实时详细测试对比( PREEMPT_RT和Xenomai )

    需求。本文基于触觉智能旗下瑞微RK系列开发板,历经240小时实测!展开RT-Linux实时系统两大内核:PREEMPT_RT与Xenomai实时
    的头像 发表于 09-30 16:37 1535次阅读
    瑞<b class='flag-5'>芯</b>微RK35XX系列Linux<b class='flag-5'>实时</b><b class='flag-5'>性</b>详细<b class='flag-5'>测试</b>对比( PREEMPT_RT和Xenomai )

    【HZ-T536开发板免费体验】—— linux创建线程

    自己的私有资源。 在linux系统中,线程状态通常反映了当前线程的当前活动和执行阶段。 主要分为: 1。运行转态 2。阻塞转态 3。终止状态 如何区分单线程多线程? 在单个程序中只
    发表于 09-01 21:31

    多线程的安全注意事项

    多线程安全是指多个线程同时访问或修改共享资源时,能够保证程序的正确和可靠。 开发者选择TaskPool或Worker进行多线程开发时,在
    发表于 06-20 07:49

    工控一体机多线程任务调度优化:聚徽分享破解工业复杂流程高效协同密码

    在当今工业 4.0 的浪潮下,工业生产正朝着高度自动化、智能化的方向大步迈进。生产流程日益复杂,众多任务需要同时、高效地协同执行,这对工业控制系统的核心 —— 工控一体机提出了前所未有的挑战。多线程
    的头像 发表于 05-28 14:06 486次阅读

    一种实时多线程VSLAM框架vS-Graphs介绍

    针对现有VSLAM系统语义表达不足、地图可解释差的问题,本文提出vS-Graphs,一种实时多线程VSLAM框架。该方案显著提升了重建地图的语义丰富度、可解释及定位精度。实验表明
    的头像 发表于 04-19 14:07 730次阅读
    一种<b class='flag-5'>实时</b><b class='flag-5'>多线程</b>VSLAM框架vS-Graphs介绍

    迅为RK3588开发板实时系统编译-Preemption系统/ Xenomai系统编译-实时系统测试-Preemption测试

    联网之后,使用apt安装,输入 以下命令: apt-get install rt-tests 在烧写非实时内核的buildroot镜像之后,使用cyclictest测试,执行以下命令
    发表于 03-11 10:54

    请问如何在Python中实现多线程与多进程的协作?

    大家好!我最近在开发一个Python项目时,需要同时处理多个任务,且每个任务需要不同的计算资源。我想通过多线程和多进程的组合来实现并发,但遇到了一些问题。 具体来说,我有两个任务,一个是I/O密集型
    发表于 03-11 06:57

    请问rt-thread studio如何进行多线程编译?

    ,使用的是5800h+32g内存+sn550 ssd,开启16线程编译时cpu的占用率也只能到30%,编译完整个工程需要3分钟 感觉多线程编译设置没有生效,有办法提高编译速度吗
    发表于 02-19 08:30

    华为云 X 实例 CPU 性能测试详解与优化策略

      2.2 Sysbench单线程CPU性能测试   2.3 Sysbench多线程CPU性能测试(4线程)   2.4 高强度
    的头像 发表于 12-30 14:52 1182次阅读
    华为云 X 实例 CPU 性能<b class='flag-5'>测试</b>详解与优化策略