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

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

3天内不再提示

并行多线程处理器MC3172

痞子衡嵌入式 来源:痞子衡嵌入式 作者:痞子衡嵌入式 2022-08-19 14:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

最近,朋友送了块小板子,板子上的MCU是个很有意思的东西——并行多线程处理器MC3172 。

通俗地说,这颗MCU的内部实现了类似RTOS多线程的功能。但是MC3172 编程与RTOS编程的最大区别就是:

  • MC3172多线程绝对并行运行,没有切换抖动及开销。

  • MC3172无线程优先级、优先级反转、死锁等概念。

  • MC3172所有中断都可以安排专门线程处理,没有中断嵌套和延迟。

  • MC3172各线程同步并行运行,互不阻塞,互不干扰。

  • MC3172线程响应的确定性相对于RTOS更为精确。

MC3172简介

MC3172 是厦门感芯科技的一款32 位 RISC并行多线程实时处理器。基于RISC-V RV32IMC 指令集, 100%单周期指令, 最高200MHz主频, 3.37coremark/MHz。可以代替实时操作系统, 实现程序的模块化与复用性。

相关资料可在感芯官网下载。链接:

http://www.gxchip.cn/

MC3172 特性:

4c978256-1f85-11ed-ba43-dac502259ad0.png

MC3172实践

MC3172的开发环境使用的是国产软件——MounRiver Studio。

4cb789fc-1f85-11ed-ba43-dac502259ad0.png

MounRiver Studio下载链接:

http://www.mounriver.com/download

我们简单看一下MC3172的demo工程:

4cc90a38-1f85-11ed-ba43-dac502259ad0.png

1、MC3172文件夹

MC3172存放MC3172编程核心文件。

线程配置工具可对各线程进行配置:

4cda25e8-1f85-11ed-ba43-dac502259ad0.png

可以配置线程时钟源、频率、栈空间、存储器分配等信息。

MC3172支持64路线程同步并行运行, 其中分为4个线程组,每个线程组16线程,每个线程组里的线程编号如上图所示。其中,不使用的线程可以设置为空闲线程,空闲线程完全不运行,不产生功耗。

每个线程都有自己独立的栈空间 ,在数据空间允许范围内可随意分配,但需要确保所有非空闲线程所占的数据空间不超过数据空间的大小。

MC3172.h存放外设地址相关宏定义及其配置宏,如:

4cf1fac4-1f85-11ed-ba43-dac502259ad0.png

类似于ST的stm32fxxx.h。

thread_config.h为线程配置文件,由线程配置工具生成:

4d008d1e-1f85-11ed-ba43-dac502259ad0.png

MC3172.lds为链接脚本,由线程配置工具生成

4d0d92de-1f85-11ed-ba43-dac502259ad0.png

thread_start.c为启动线程相关的源文件:

#ifndefTHREAD_START_C
#defineTHREAD_START_C
#include"./MC3172.h"
#include"./thread_config.h"

voidthread1_initial(void)
{
#ifdefROTHD_THREAD1_VALID
externvoidthread1_main(void);
rothd_set_sp_const(ROTHD_THREAD1_STACKCFG_VALUE|0x20000000);
thread1_main();
#endif
}
voidthread2_initial(void)
{
#ifdefROTHD_THREAD2_VALID
externvoidthread2_main(void);
rothd_set_sp_const(ROTHD_THREAD2_STACKCFG_VALUE|0x20000000);
thread2_main();
#endif
}

//省略部分代码......
void(*thread_initial_pointer[64])(void)={
&thread0_initial,
&thread1_initial,
&thread2_initial
//省略部分代码......
}

voidthread_start(void)
{
(*thread_initial_pointer[THREAD_ID])();
}

程序运行的入口函数为:thread_start ,从链接脚本里可以知道:

4d1eaa56-1f85-11ed-ba43-dac502259ad0.png

thread_start里的THREAD_ID为线程ID值,直接从0x50000000地址中读出:

#defineTHREAD_ID(*(volatileu8*)(0x50000000))

猜测:0x50000000地址里的ID值会不断变化,通过某种机制跳转,遍历执行thread_initial_pointer函数指针数组里的各个线程函数。

threadx_initial里初始化线程栈,并执行线程主体,如

voidthread_end(void)
{
while(1);
}

voidthread1_main(void)
{
while(1){
//usercodesection
}
thread_end();
}

这是用户代码,我们可以在各个线程主体函数里边编写我们的应用代码。

2、Release文件夹

Release文件夹里存放的是编译生成的固件程序,通过 开发板程序下载工具 可进行下载:

4d2c5b6a-1f85-11ed-ba43-dac502259ad0.png

3、USER_CODE文件夹

USER_CODE文件夹存放用户代码:

4d421626-1f85-11ed-ba43-dac502259ad0.png

MC3172 是一颗并行并行多线程实时处理器,我们下面来看看其多线程并行执行的特性。

我们编写两个线程,线程进行相同的配置,两个线程分别对两个IO进行翻转,测试代码如:

voidLED0_GPIOA_PIN0_TEST(void)
{
//启动GPIOA并设置特权组及时钟频率
INTDEV_SET_CLK_RST(GPIOA_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));

//使能GPIOAPIN0引脚
GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR,GPIO_PIN0,GPIO_SET_ENABLE);

while(1)
{
//GPIOAPIN0输出1
GPIO_SET_OUTPUT_PIN_TO_1(GPIOA_BASE_ADDR,GPIO_PIN0);

//延时
for(u32var=0;var< 5000;++var)
{
NOP();
}

//GPIOAPIN0输出0
GPIO_SET_OUTPUT_PIN_TO_0(GPIOA_BASE_ADDR,GPIO_PIN0);

//延时
for(u32var=0;var< 5000;++var)
{
NOP();
}
}
}

voidLED1_GPIOA_PIN1_TEST(void)
{
//启动GPIOA并设置特权组及时钟频率
INTDEV_SET_CLK_RST(GPIOA_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));

//使能GPIOAPIN1引脚
GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR,GPIO_PIN1,GPIO_SET_ENABLE);

while(1)
{
//GPIOAPIN1输出1
GPIO_SET_OUTPUT_PIN_TO_1(GPIOA_BASE_ADDR,GPIO_PIN1);

//延时
for(u32var=0;var< 5000;++var)
{
NOP();
}

//GPIOAPIN1输出0
GPIO_SET_OUTPUT_PIN_TO_0(GPIOA_BASE_ADDR,GPIO_PIN1);

//延时
for(u32var=0;var< 5000;++var)
{
NOP();
}
}
}

////////////////////////////////////////////////////////////


voidthread_end(void)
{
while(1);
}

////////////////////////////////////////////////////////////

voidthread0_main(void)
{
while(1){
//usercodesection
}
thread_end();
}

////////////////////////////////////////////////////////////

voidthread1_main(void)
{
while(1){
//usercodesection
LED0_GPIOA_PIN0_TEST();
}
thread_end();
}

////////////////////////////////////////////////////////////

voidthread2_main(void)
{
while(1){
//usercodesection
LED1_GPIOA_PIN1_TEST();
}
thread_end();
}

烧录程序,使用逻辑分析仪抓取GPIOA_PIN0及GPIOA_PIN1引脚电平变化如:

4d4fc456-1f85-11ed-ba43-dac502259ad0.png

可见,这两个波形是完全同步的,CPU同时在干两件事情,实现了与RTOS多线程同样的效果。

心得与总结

嵌入式开发,是软件+硬件结合,两者互补。如果硬件功能很强大,则软件可能可以设计得比较简单;如果硬件功能有限,则软件方面可能得考虑比较多的方面。

比如:

  • 一些软件算法,需要多传感器数据输入进行融合,则功能实现可能比较简单,但实际可能为了降成本,减少一些传感器,这时候需要实现稳定可靠的功能,则软件算法上得下更大的功夫。

  • 对于一些不太复杂的数字信号处理,在通用的MCU上就可以处理,但对于一些比较复杂的数字信号处理,则可能使用一些带有DSP处理器的MCU。

特别的,对于芯片内部IC电路来说,如果内部有相关模块可以实现某些功能的话,则对应的软件编程会简单很多,而且硬件实现的比软件实现的效率要高。

硬件实现的多线程编程确实优于RTOS编程,但实际开发中产品软硬件架构需要考虑多个方面,比如芯片的稳定性以及软件生态等方面。

并行多线程实时处理器是个好东西,但目前并行多线程实时处理器还处于起步阶段,还有很多东西需要完善,需要我们多支持与传播,只有生态起来了,将来我们才有机会用得上。


审核编辑 :李倩


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

    关注

    2573

    文章

    54363

    浏览量

    785783
  • mcu
    mcu
    +关注

    关注

    147

    文章

    18604

    浏览量

    386563
  • 多线程
    +关注

    关注

    0

    文章

    279

    浏览量

    20911

原文标题:了解一下这款国产并行多线程MCU!

文章出处:【微信号:pzh_mcu,微信公众号:痞子衡嵌入式】欢迎添加关注!文章转载请注明出处。

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

    :「资源利用率」:通过多线程,可以更有效地利用CPU资源,特别是多核CPU。「并行处理」:线程允许同时执行多个任务,提高程序的执行效率。「简化设计」:使用
    发表于 12-01 06:11

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

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

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

    的执行任务成为单线程多线程是程序中包含多个执行流,在一个程序中可以同时运行多个不同的线程来执行不同的任务。 多线程提高了CPU的使用卤率。多线程
    发表于 09-01 21:31

    多线程的安全注意事项

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

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

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

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

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

    集特工控机搭载海光3350处理器:国产化工业计算的创新实践

    扩展性为核心,适配工业场景的多样化需求,尤其在电力、交通、智能制造等领域表现出色。海光3350处理器基于AMD Zen架构的授权优化,主频达3.0GHz,支持多线程处理,为工控机提供了强大的算力基础。 二、核心硬件配置 海光33
    的头像 发表于 02-13 09:14 4465次阅读

    迅为3A6000开发板/龙芯3A6000与龙芯3A5000等龙架构处理器软件兼容

    个最新研发的高性能 LA664 处理器核,支持同时多线程技术(SMT2),全芯片共 8 个逻辑核。集成安全可信模块,可提供安全启动方案和国密(SM2、SM3、SM4 等)应用支持。 根据中国电
    发表于 02-12 15:06

    量子处理器是什么_量子处理器原理

    量子处理器(QPU)是量子计算机的核心部件,它利用量子力学原理进行高速数学和逻辑运算、存储及处理量子信息。以下是对量子处理器的详细介绍:
    的头像 发表于 01-27 11:53 1761次阅读

    EE-115:ADSP-2189 IDMA接口,连接Motorola MC68300微处理器系列

    电子发烧友网站提供《EE-115:ADSP-2189 IDMA接口,连接Motorola MC68300微处理器系列.pdf》资料免费下载
    发表于 01-15 16:05 0次下载
    EE-115:ADSP-2189 IDMA接口,连接Motorola <b class='flag-5'>MC</b>68300微<b class='flag-5'>处理器</b>系列

    AN-415:ADSP-2181 IDMA接口,连接摩托罗拉MC68300微处理器系列

    电子发烧友网站提供《AN-415:ADSP-2181 IDMA接口,连接摩托罗拉MC68300微处理器系列.pdf》资料免费下载
    发表于 01-14 15:09 0次下载
    AN-415:ADSP-2181 IDMA接口,连接摩托罗拉<b class='flag-5'>MC</b>68300微<b class='flag-5'>处理器</b>系列

    EE-259:AD7865并行ADC与ADSP-21161 SHARC处理器接口

    电子发烧友网站提供《EE-259:AD7865并行ADC与ADSP-21161 SHARC处理器接口.pdf》资料免费下载
    发表于 01-08 14:45 0次下载
    EE-259:AD7865<b class='flag-5'>并行</b>ADC与ADSP-21161 SHARC<b class='flag-5'>处理器</b>接口

    EE-220:将外部存储与第三代SHARC处理器并行端口配合使用

    电子发烧友网站提供《EE-220:将外部存储与第三代SHARC处理器并行端口配合使用.pdf》资料免费下载
    发表于 01-06 16:12 0次下载
    EE-220:将外部存储<b class='flag-5'>器</b>与第三代SHARC<b class='flag-5'>处理器</b>和<b class='flag-5'>并行</b>端口配合使用

    AN-813: ADSP-BF533/ADSP-BF561 Blackfin处理器与高速并行ADC接口

    电子发烧友网站提供《AN-813: ADSP-BF533/ADSP-BF561 Blackfin处理器与高速并行ADC接口.pdf》资料免费下载
    发表于 01-06 14:36 0次下载
    AN-813: ADSP-BF533/ADSP-BF561 Blackfin<b class='flag-5'>处理器</b>与高速<b class='flag-5'>并行</b>ADC接口

    EE-260:AD7865并行ADC与ADSP-2136x SHARC处理器接口

    电子发烧友网站提供《EE-260:AD7865并行ADC与ADSP-2136x SHARC处理器接口.pdf》资料免费下载
    发表于 01-06 14:24 0次下载
    EE-260:AD7865<b class='flag-5'>并行</b>ADC与ADSP-2136x SHARC<b class='flag-5'>处理器</b>接口