0%

RTOS的多核心方案

起因

今天再看rtt手册的时候看到一个smp方案,就是多核操作调度,其实想想也是,mcu只是普遍是单核,也不能这样说,esp32就是RISC-v双核MCU呢。

SMP

这个是多核,注意了,这个多核,指的是全部架构和功能一样的多核,就像cpu多核一样那种,此时整个系统都是一个rtos,就是一个rtos控制所有核心,每一个核心都可以运行一个任务和中断等操作。此时,就得注意了,高优先级和低优先级就能一起触发运行了。因为此时是一个cpu干一件事这件事包括时间片,所以,如果有就绪列表中有任务的话同优先级的任务就会运行在同一个核心上面,经过时间片调度,一起运行。此时优先级低的任务就可以分到一个cpu来处理同优先级的任务了。这点是要注意的。至于实现就是比较复杂了,根据官方的操作去移植吧,这里篇幅不够。反正注意是一个系统控制所有资源和核心,有点linux的味道了,但是linux还有mmu等诸多资源管理。

AMP

怎么可能总是一样的架构芯片?随便拿一个手机芯片,你看有多少个大核,小核。arm开发板也是一样的啊 STM32H745I就是M4和M7双核。所以一个arm-A系列,也常常有A53和A7混合啊。这明显就是非对称核心了。那么此时怎么办?rt-thread的文档没有给方案!一般厂商再出厂的时候,就会为自己的soc写好rtos的代码,直接调用api就好了。但是如果没有怎么办?此时,咱们的老大哥,freertos有方案,就是AMP方案,就是每一个核心都运行一个rtos,然后通过一个流\信号缓冲区来实现,控制和函数调用。具体·流程思路如下:大核心,一般都是主控主核,这点大家都是默认的。就是大核心就是一只告高速运行的,此时可以通过调用api的方法,向rtos中的缓冲区中发送函数指令,特定的核心是时刻处于接收状态的,一旦识别到指令就去执行,因为他们的空间是共享的,所以就会直接去调用函数。此时大核就完成任务和发布。这其实就有点dma的味道,就是告诉dma该干嘛,dma就去干了,完事之后,也往缓冲区中发送执行完毕
的命令此时就实现一个简单的多核操作。

note:多核心是多核心,不是多板子,是一个芯片里面多个核心,是芯片内部的数据、控制等处理。不是说一个板子上面接上两个mcu就是多核心了,这只是两个mcu之间的通信,就跟串口那样的,所以就不是多核心。多核心,它们内部可能有共享内存、线路、指令等,很复杂的走线。

多核心烧录

多核心怎么烧录呢?我们一般烧写代码,都是mcu那种单核代码烧写或者直接就是linux内核那种多核系统下载进去了,然后uboot引导开机。对于非对称核心的,就是要烧录多次, STM32H745I一个M4和M7核心,但是它们有着独立的空间和数据。所以,需要分别烧录才行。还有使用uboot或者bootloader那种进行代码的下载。这个时候就只需要下载一次,此时就是把程序按照特定的规则来打包,然后再引导程序中解包。对于对称多核,因为它们是共享内存和数据空间的,所以,往往烧写一次就足够了。对于不同版本,不同厂商的mcu处理方法有所不同,但是大致的思路是正确的。

其实,如果是arm架构的单片机,我们要知道一件事,此时它们是在一块内存上面的,因为我们对cube的探索发现gpio同一个时刻只能给一个核心使用,而且两个核心都是有引脚的控制权,所以,它们内存也是统一编址的,我们就可以使用keil分别烧录,把M7烧录到0x08000000 把m4烧录到0x08100000 此时就可以两者工作了,注意了,烧录的时候,不要清空flash了。也可以使用一些cubeide等诸多软件来进行烧录。此时是两份代码都是通过一个jtag进行烧录的哦。

结语

今天,我问我的同事,多核怎么烧录,他思考一会儿,对我说,用不到得,这东西没搞得的必要,就像我之前问他,觉得mcu动态调用实现,手机那种app的操作,他也觉得没必要。我们的求知欲会渐渐消退,变得越来越现实。但是我内心的….还是不甘啊,我只是在为了我糟糕的人生赎罪。

-------------下次的来访是什么时候呢[doge]-------------