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

    文章

    17123

    浏览量

    350979
  • 多线程
    +关注

    关注

    0

    文章

    278

    浏览量

    19943
  • RISC-V
    +关注

    关注

    45

    文章

    2270

    浏览量

    46127
收藏 人收藏

    评论

    相关推荐

    socket 多线程编程实现方法

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

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

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

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

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

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

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

    基于全志T507-H的Linux-RT实时测试案例分享

    的POSIX API等),实现产品快速上市的期望。 Linux-RT实时测试(Cyclictest工具) Cyclictest常用于实时系统的基准
    发表于 06-03 09:50

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

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

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

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

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

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

    鸿蒙原生应用开发-ArkTS语言基础类库多线程I/O密集型任务开发

    使用异步并发可以解决单次I/O任务阻塞的问题,但是如果遇到I/O密集型任务,同样会阻塞线程中其它任务的执行,这时需要使用多线程并发能力来进行解决。 I/O密集型任务的性能重点通常不在于CPU的处理
    发表于 03-21 14:57

    java实现多线程的几种方式

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

    AT socket可以多线程调用吗?

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

    什么是多核多线程?多核多线程如何提高程序的运行效率?

    线程无法充分利用多核处理器的并行计算能力。
    的头像 发表于 02-20 10:22 1347次阅读

    linux多线程编程实例

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

    Redis7单线程多线程详解

    主要是指Redis的网络IO和键值对读写是由一个线程来完成的。
    的头像 发表于 01-16 17:33 1846次阅读
    Redis7单<b class='flag-5'>线程</b>与<b class='flag-5'>多线程</b>详解

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

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