最近,朋友送了块小板子,板子上的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 特性:
MC3172实践
MC3172的开发环境使用的是国产软件——MounRiver Studio。
MounRiver Studio下载链接:
http://www.mounriver.com/download
我们简单看一下MC3172的demo工程:
1、MC3172文件夹
MC3172存放MC3172编程核心文件。
线程配置工具可对各线程进行配置:
MC3172支持64路线程同步并行运行, 其中分为4个线程组,每个线程组16线程,每个线程组里的线程编号如上图所示。其中,不使用的线程可以设置为空闲线程,空闲线程完全不运行,不产生功耗。
每个线程都有自己独立的栈空间 ,在数据空间允许范围内可随意分配,但需要确保所有非空闲线程所占的数据空间不超过数据空间的大小。
MC3172.h存放外设地址相关宏定义及其配置宏,如:
类似于ST的stm32fxxx.h。
thread_config.h为线程配置文件,由线程配置工具生成:
MC3172.lds为链接脚本,由线程配置工具生成
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
,从链接脚本里可以知道:
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文件夹里存放的是编译生成的固件程序,通过 开发板程序下载工具
可进行下载:
3、USER_CODE文件夹
USER_CODE文件夹存放用户代码:
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引脚电平变化如:
可见,这两个波形是完全同步的,CPU同时在干两件事情,实现了与RTOS多线程同样的效果。
心得与总结
嵌入式开发,是软件+硬件结合,两者互补。如果硬件功能很强大,则软件可能可以设计得比较简单;如果硬件功能有限,则软件方面可能得考虑比较多的方面。
比如:
-
一些软件算法,需要多传感器数据输入进行融合,则功能实现可能比较简单,但实际可能为了降成本,减少一些传感器,这时候需要实现稳定可靠的功能,则软件算法上得下更大的功夫。
-
对于一些不太复杂的数字信号处理,在通用的MCU上就可以处理,但对于一些比较复杂的数字信号处理,则可能使用一些带有DSP处理器的MCU。
特别的,对于芯片内部IC电路来说,如果内部有相关模块可以实现某些功能的话,则对应的软件编程会简单很多,而且硬件实现的比软件实现的效率要高。
硬件实现的多线程编程确实优于RTOS编程,但实际开发中产品软硬件架构需要考虑多个方面,比如芯片的稳定性以及软件生态等方面。
并行多线程实时处理器是个好东西,但目前并行多线程实时处理器还处于起步阶段,还有很多东西需要完善,需要我们多支持与传播,只有生态起来了,将来我们才有机会用得上。
审核编辑 :李倩
-
传感器
+关注
关注
2551文章
51184浏览量
754329 -
mcu
+关注
关注
146文章
17172浏览量
351541 -
多线程
+关注
关注
0文章
278浏览量
20012
原文标题:了解一下这款国产并行多线程MCU!
文章出处:【微信号:pzh_mcu,微信公众号:痞子衡嵌入式】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论