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
    +关注

    关注

    146

    文章

    16977

    浏览量

    350215
  • 多线程
    +关注

    关注

    0

    文章

    277

    浏览量

    19919
  • RISC-V
    +关注

    关注

    44

    文章

    2227

    浏览量

    46000
收藏 人收藏

    评论

    相关推荐

    socket 多线程编程实现方法

    在现代网络编程中,多线程技术被广泛应用于提高服务器的并发处理能力。Socket编程是网络通信的基础,而将多线程技术应用于Socket编程,可以显著提升服务器的性能。 多线程编程的基本概念 多线
    的头像 发表于 11-12 14:16 196次阅读

    Python中多线程和多进程的区别

    Python作为一种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常见的两种方式之一。在本文中,我们将探讨Python中多线程与多进程的概念、区别以及如何使用线程池与进程池来提高并发执行效率。
    的头像 发表于 10-23 11:48 306次阅读
    Python中<b class='flag-5'>多线程</b>和多进程的区别

    ESP32会不会有多线程问题,需要加锁吗?

    ESP32会不会有多线程问题,需要加锁吗
    发表于 07-19 08:05

    多线程设计模式到对 CompletableFuture 的应用

    最近在开发 延保服务 频道页时,为了提高查询效率,使用到了多线程技术。为了对多线程方案设计有更加充分的了解,在业余时间读完了《图解 Java 多线程设计模式》这本书,觉得收获良多。本篇文章将介绍其中
    的头像 发表于 06-26 14:18 265次阅读
    从<b class='flag-5'>多线程</b>设计模式到对 CompletableFuture 的应用

    bootloader开多线程做引导程序,跳app初始化后直接进hardfualt,为什么?

    如标题,想做一个远程升级的项目,bootloader引导区域和app都是开多线程跑的,就是自己写了个小的任务调度器,没什么功能主要是想让程序快速的响应,延时不会对其他程序造成堵塞,程序测试
    发表于 04-18 06:07

    鸿蒙OS开发实例:【ArkTS类库多线程CPU密集型任务TaskPool】

    CPU密集型任务是指需要占用系统资源处理大量计算能力的任务,需要长时间运行,这段时间会阻塞线程其它事件的处理,不适宜放在主线程进行。例如图像处理、视频编码、数据分析等。 基于多线程并发机制处理CPU密集型任务可以提高CPU
    的头像 发表于 04-01 22:25 787次阅读
    鸿蒙OS开发实例:【ArkTS类库<b class='flag-5'>多线程</b>CPU密集型任务TaskPool】

    鸿蒙APP开发:【ArkTS类库多线程】TaskPool和Worker的对比

    TaskPool(任务池)和Worker的作用是为应用程序提供一个多线程的运行环境,用于处理耗时的计算任务或其他密集型任务。可以有效地避免这些任务阻塞主线程,从而最大化系统的利用率,降低整体资源消耗,并提高系统的整体性能。
    的头像 发表于 03-26 22:09 582次阅读
    鸿蒙APP开发:【ArkTS类库<b class='flag-5'>多线程</b>】TaskPool和Worker的对比

    java实现多线程的几种方式

    Java实现多线程的几种方式 多线程是指程序中包含了两个或以上的线程,每个线程都可以并行执行不同的任务或操作。Java中的多线程可以提高程序
    的头像 发表于 03-14 16:55 570次阅读

    AT socket可以多线程调用吗?

    请问AT socket 可以多线程调用吗? 有互锁机制吗,还是要自己做互锁。
    发表于 03-01 08:22

    linux多线程编程实例

    linux线程
    的头像 发表于 02-15 21:16 412次阅读
    linux<b class='flag-5'>多线程</b>编程实例

    报名启动|OpenHarmony源码转换器—多线程特性转换赛题

    点击蓝字 ╳ 关注我们 开源项目 OpenHarmony 是每个人的 OpenHarmony 原文标题:报名启动|OpenHarmony源码转换器—多线程特性转换赛题 文章出处:【微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。
    的头像 发表于 12-29 16:15 655次阅读
    报名启动|OpenHarmony源码转换器—<b class='flag-5'>多线程</b>特性转换赛题

    你还是分不清多进程和多线程吗?一文搞懂!

    你还是分不清多进程和多线程吗?一文搞懂! 多进程和多线程是并发编程中常见的两个概念,它们都可以用于提高程序的性能和效率。但是它们的实现方式和使用场景略有不同。 1. 多进程: 多进程指的是在操作系统
    的头像 发表于 12-19 16:07 534次阅读

    redis多线程还能保证线程安全吗

    是单线程的,多个客户端请求会按序执行,每个请求使用一个线程完成,这样可以避免多线程之间的竞争条件和锁等带来的开销。但是,由于Redis是存储内存中的数据的,当多个客户端同时对同一个数据进行读写操作时,就会存在
    的头像 发表于 12-05 10:28 1682次阅读

    redis使用多线程处理操作命令

    Redis 是一个使用多线程处理操作命令的开源内存数据库系统。它以其高性能、可扩展性和灵活性而闻名,通常被用作缓存、消息代理和数据存储等各种应用场景。在本文中,我们将详尽、详实、细致地探
    的头像 发表于 12-05 10:25 544次阅读

    mfc多线程编程实例

    (图形用户界面)应用程序的开发。在这篇文章中,我们将重点介绍MFC中的多线程编程。 多线程编程在软件开发中非常重要,它可以实现程序的并发执行,提高程序的效率和响应速度。MFC提供了丰富的多线程支持,可以轻松地实现
    的头像 发表于 12-01 14:29 1416次阅读