小玩一个并行多线程MCU—MC3172

大家好转发一篇杂烩君的文章,杂烩君是我同一个高中的老乡,他平时分享的嵌入式知识非常不错。

——————

大家好,我是杂烩君。

最近,朋友送了块小板子,板子上的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 特性:

354cdf110e7c6032923c2f18aacf29c2.png

MC3172实践

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

89247e2722b4722da2770f57c7356b52.png

MounRiver Studio下载链接:

http://www.mounriver.com/download

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

9ef2406dc32033d33e46e16548b5c36c.png

1、MC3172文件夹

MC3172存放MC3172编程核心文件。

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

8aa0dfd700d89880ee4227f9cc0b497e.png

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

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

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

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

5644c94d4883cd4ac2f019148489f54d.png

类似于ST的stm32fxxx.h。

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

53a8e84fb57f888a2ea771cce6a62dad.png

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

f80ecac36037dc9152289d6d144f3a43.png

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

#ifndef THREAD_START_C
#define THREAD_START_C
#include "./MC3172.h"
#include "./thread_config.h"void thread1_initial(void)
{
#ifdef ROTHD_THREAD1_VALID
extern void thread1_main(void);rothd_set_sp_const(ROTHD_THREAD1_STACKCFG_VALUE|0x20000000);thread1_main();
#endif
}
void thread2_initial(void)
{
#ifdef ROTHD_THREAD2_VALID
extern void thread2_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
// 省略部分代码......
}void thread_start(void)
{(*thread_initial_pointer[THREAD_ID])();
}

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

911a2a933f69f4163141e8b40267b4bf.png

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

#define THREAD_ID (*(volatile u8*)(0x50000000))

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

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

void thread_end(void)
{while(1);
}void thread1_main(void)
{while(1){//user code section}thread_end();
}

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

2、Release文件夹

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

a9e3d5e98b0413d501f16a86794ecdf8.png

137bcf1606557c8125a08138054b18eb.jpeg

3、USER_CODE文件夹

USER_CODE文件夹存放用户代码:

8313ca46bb8494f5ef9f4e79874090b8.png

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

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

void LED0_GPIOA_PIN0_TEST(void)
{// 启动GPIOA并设置特权组及时钟频率INTDEV_SET_CLK_RST(GPIOA_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));// 使能GPIOA PIN0引脚GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR, GPIO_PIN0, GPIO_SET_ENABLE);while(1){// GPIOA PIN0输出1GPIO_SET_OUTPUT_PIN_TO_1(GPIOA_BASE_ADDR, GPIO_PIN0);// 延时for (u32 var = 0; var < 5000; ++var){NOP();}// GPIOA PIN0输出0GPIO_SET_OUTPUT_PIN_TO_0(GPIOA_BASE_ADDR, GPIO_PIN0);// 延时for (u32 var = 0; var < 5000; ++var){NOP();}}
}void LED1_GPIOA_PIN1_TEST(void)
{// 启动GPIOA并设置特权组及时钟频率INTDEV_SET_CLK_RST(GPIOA_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));// 使能GPIOA PIN1引脚GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR, GPIO_PIN1, GPIO_SET_ENABLE);while(1){// GPIOA PIN1输出1GPIO_SET_OUTPUT_PIN_TO_1(GPIOA_BASE_ADDR, GPIO_PIN1);// 延时for (u32 var = 0; var < 5000; ++var){NOP();}// GPIOA PIN1输出0GPIO_SET_OUTPUT_PIN_TO_0(GPIOA_BASE_ADDR, GPIO_PIN1);// 延时for (u32 var = 0; var < 5000; ++var){NOP();}}
}void thread_end(void)
{while(1);
}void thread0_main(void)
{while(1){//user code section}thread_end();
}void thread1_main(void)
{while(1){//user code sectionLED0_GPIOA_PIN0_TEST();}thread_end();
}void thread2_main(void)
{while(1){//user code sectionLED1_GPIOA_PIN1_TEST();}thread_end();
}

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

71f3dfe6601804d90307af3a84487de9.png

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

心得与总结

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

比如:

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

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

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

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

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

以上就是本次的分享,如果觉得文章有帮助,麻烦帮忙转发,谢谢!

6cd937a8942a8ac515219fcd551cb417.jpeg

1f7d809a66e08cee51900f1274525c86.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 人脸识别签到(一)

因为Android课程设计自己选题&#xff0c;所以作者选了这个相对简单的。本来开始是想做大学课程查签到&#xff0c;拍一张集体照&#xff0c;就可识别哪些人已到&#xff0c;哪些未到。查了一下百度AI开发平台的人脸识别接口&#xff0c;发现V3的接口文档有M:N的人脸识别&#…

[系列文章]上传文件管理控件v2

一、引言&#xff1a; 开发v1的时候&#xff0c;遇到很多困难&#xff08;因为我是新手&#xff09;&#xff0c;于是就上网找了一些资料。 其中&#xff0c;这篇《数据绑定的总结 》文章&#xff08;http://www.cnblogs.com/qingtianyzl/articles/351012.html&#xff09;被我…

[ mongoDB ] - mongoDB的基本操作

mongoDB的基本操作 强烈推荐参考官方用户手册&#xff1a; http://www.mongodb.org/display/DOCS 1)插入&#xff08;insert&#xff09; 插入的value是json对象&#xff0c;以下示例循环添加了10个用户信息&#xff0c;字段可以是字符串、数值、对象、数组等。 通过VUE查看&am…

STL中的multimap---顺便说说如何查找同一关键字对应的所有值

转载&#xff1a;http://blog.csdn.net/stpeace/article/details/44984639 我个人感觉哈&#xff0c; map的应用场景比multimap更多&#xff0c; 不过&#xff0c; 我们还是来学一下multimap。 我们知道&#xff0c; multimap中&#xff0c; 一个关键字可能对应多个不同的值&am…

信号量保护之位带操作

大家好&#xff0c;上篇文章写的一个中断操作变量的问题&#xff0c;鱼鹰帮忙回复了&#xff0c;大家可以再看看这篇文章。好友让我看这段代码CM3位带操作如果存储器系统支持“锁定传送”&#xff08; lockedtransfers&#xff09;&#xff0c;或者总线上只有一个主机&#xff…

LeetCode872. Leaf-Similar Trees

自己的代码&#xff1a; # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val x # self.left None # self.right Noneclass Solution:def allNode(self,root):listNode[]if Not root:return ListNode…

CCScene切换的所有特效(28种)以及设置屏幕横竖屏!

CCScene 对于使用cocos2d的童鞋肯定很熟悉&#xff0c;那么在使用 CCScene *s [CCScenenode];[s addChild: [restartAction() node]];[[CCDirectorsharedDirector]replaceScene:s]; 对scene进行场景&#xff08;CCLayout&#xff09;进行切换时&#xff0c;cocos2d提供了一…

关于MySqlConnection的一个特殊异常

最近给一个客户做一个项目&#xff0c;其中要与另外一个系统进行数据交换&#xff0c;而那个系统使用的是MySql&#xff0c;因此&#xff0c;从网上下载了一个MySql Connector&#xff0c;由于以前没有用过MySql&#xff0c;而且这个MySql服务器位于互联网上&#xff0c;因此&a…

文档设置及使用

原文链接&#xff1a;http://stynzf.blogbus.com/logs/15944928.html在上一篇文档&#xff08;《微软文档管理解决方案2007》之一&#xff1a;安装部署&#xff09;中&#xff0c;讲述了如何安装部署“文档管理解决方案” 这次我们通过将该子网站作为“Windows中文站”的一个文…

SSL和HTTPS

SSL说明&#xff1a; 1&#xff09;简介 SSL (Secure Socket Layer)为Netscape所研发&#xff0c;用以保障在Internet上数据传输之安全&#xff0c;利用数据加密(Encryption)技术&#xff0c;可确保数据在网络上之传输过程中不会被截取。它已被广泛地用于Web浏览器与服务器之间…

N32替换STM32,这些细节别忽略!

前言目前大形势影响&#xff0c;芯片价格日益上涨&#xff0c;采购周期变长&#xff0c;导致国产芯片替代进口芯片成为大趋势&#xff0c;该文章记录了使用国民技术的N32替换STM32的操作流程。话不多说&#xff0c;上步骤。一、工程配置1.安装硬件库硬件库为厂家提供的资料&…

五分钟读懂UML类图

平时阅读一些远吗分析类文章或是设计应用架构时没少与UML类图打交道。实际上&#xff0c;UML类图中最常用到的元素五分钟就能掌握&#xff0c;下面赶紧来一起认识一下它吧&#xff1a; 一、类的属性的表示方式 在UML类图中&#xff0c;类使用包含类名、属性(field) 和方法(meth…

黑马程序员——java语言基础——面向对象

---------------------- android培训、java培训、期待与您交流&#xff01; ---------------------- 类就是&#xff1a;对现实生活中事物的描述。 对象&#xff1a;就是这类事物&#xff0c;实实在在存在个体。 描述事物其实就是在描述事物的属性和行为。 如何定义类————…

只会纯硬件,让我有点慌

纯硬件产品在市面上现在很少了&#xff0c;大多都带有单片机&#xff0c;比如智能路灯&#xff0c;智能门禁&#xff0c;智能家居等等。为了提高竞争力&#xff0c;单片机相关知识的学习必不可少。给大家推荐一本龙顺宇老师的新书《深入浅出STC8增强型51单片机进阶攻略》。&…

Expression Blend 学习视频下载

微软Expression Blend功能介绍Microsoft Expression Blend—一个全新的&#xff0c;全功能的职业设计工具&#xff0c;用于创造基于Microsoft Windows平台的丰富、复杂的应用界面。使用 Expression Blend, 可以提供更出色的应用软件并提升客户的体验和满意度。Expression Blend…

1、绪论初识机器学习

什么是机器学习&#xff1f; 机器学习是通过数据或者经验&#xff0c;优化计算机程序等性能标准&#xff0c;自动改进计算机的算法&#xff0c;以达到解决未知问题的目标 监督学习 计算机通过学习一组有标签的信息来对从未见过对数据做出有用对预测 监督学习的代表算法&#xf…

NSLog的常用格式说明小释

NSLog的格式如下所示: % 对象%d, %i整数%u 无符整形%f 浮点/双字 %.nf 带有n小数点的浮点/双字%x, %X二进制整数%o 八进制整数%zu size_t %p 指针%e 浮点/双字 (科学计算) %g 浮点/双字%s C字符串%.*s Pascal字符串%c 字符%C unichar %lld 64位长整数(long long) %llu 无符64位…

感觉自己好傻

前几天&#xff0c;一个微信微信朋友找我聊天。他在一家公司工作了4年多&#xff0c;但是这四年基本没有什么技术上的提升&#xff0c;做的事情也一些打杂的事情&#xff0c;核心技术在芯片原厂&#xff0c;软件SDK也是别人写好的&#xff0c;他能做的就是对接客户&#xff0c;…

一名老工程师的感言

[1]好好规划自己的路&#xff0c;不要跟着感觉走&#xff01;根据个人的理想决策安排&#xff0c;绝大部分人并不指望成为什么院 士或教授&#xff0c;而是希望活得滋润一些&#xff0c;爽一些。那么&#xff0c;就需要慎重安排自己的轨迹。从哪个行业入手&#xff0c;逐 渐对该…

Python之OS模块进程管理介绍--os.fork()

转自&#xff1a;http://davidbj.blog.51cto.com/4159484/1240586 有两种方式来实现并发性&#xff0c;一种方式是让每个“任务"或“进程”在单独的内在空间中工作&#xff0c;每个都有自已的工作内存区域。不过&#xff0c;虽然进程可在单独的内存空间中执行&#xff0c;…