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

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

3天内不再提示

Raspberry pico处理器的移植SMP教程

海阔天空的专栏 来源: RTThread物联网操作系统 作者: RTThread物联网操作 2022-06-07 15:48 次阅读

Raspberry pico 是一款双核cortex-m0的处理器,在RT-Thread提供的bsp中目前是默认采用libcpu/arm/cortex-m0,其并没有对多核进行支持。在Coremark的测试中pico的性能很一般,只用一个核心实在是太浪费了,所以下面用一种不太优雅的方式基本实现Pico的SMP,简单测试没有问题,当然由于萌新对于内核的理解程度有限,总是可能存在一些问题,不过总算跑起来了不是~

移植SMP

在这之前,官方的文件完全没有支持Cortex-M的多核。


首先是几个基本的函数对接:


rt_hw_cpu_id:最首先需要实现的一个也是最容易的实现的一个,直接访问pico的sio就可以

pYYBAGKfAZGAYpnRAAAPWE5KVHA827.png


rt_hw_interrupt_disable/enable: 在SMP框架当中,关闭中断不只是屏蔽中断,其还要通过spinlock来保证对资源访问的互斥,对于此rtt在rthw通过宏定义将其替换,并且重新命名原来的中断控制函数

pYYBAGKfAZWADMwMAAAo4IVVu8M631.png


rt_hw_spin_lock_xxx:自旋锁,用于多核之间的资源保护,在rp2040中芯片提供硬件spinlock使用,这一部分同样使用pico-sdk的api即可,选择unsafe版本

poYBAGKfAa-Ae5bvAAAvbiJTgAk844.png

rt_hw_secondary_cpu_up:在主CPU启动后,运行调度器,调度器会调用main线程运行,main线程运行前会首先调用该api来启动第二个核心。Rp2040两个核心其实是上电以后同时启动的,CPU-1会在bootrom中被拦截下来进入等待状态,我们可以通过sio的fifo来唤醒第二个核心,pico-sdk中提供了api,可以直接指定CPU-1唤醒后执行的函数。在唤醒过程中同时使能两个CPU的SIO中断,用来进行IPI_Handler.

pYYBAGKfAbKAXWJFAABi3t4GKe8377.png


在需要调度的时候,CPU之间可能会互相通知让其进行调度,该部分通过rt_hw_ipi_sendrt_hw_ipi_handler对接,

poYBAGKfAc-Ad6UrAABykocbA8U469.png

上面对接的函数都比较基础,其次是对接上下文的汇编代码部分,这一部分就不是特别顺利了。简单梳理一下Cortex-M的调度流程,rt_schedule获取最高优先级的任务然后使能PendSV中断并在全局变量中保存调度信息,最后在完成高优先级中断(或者直接进行PendSV)后进行实际的上下文切换,在SMP中基本同理,但是由于RT-Thread的SMP是针对Cortex-A提供的,这里出现了一些问题。

首先在调度中必须关注一个函数,rt_cpus_lock_status_restore(thread),其将要调度的线程绑定到当前的cpu上,调用该函数的位置是一个关键问题

pYYBAGKfAdKANBmjAAA1DoQXxHQ152.png


在Cortex-A中其在rt_hw_context_switch中被调用,这对于Cortex-A是可行的,因为在非中断情况下A核会直接进行线程切换而不需要PendSV,但是对于Cortex-M核心放在这个位置会存在下面一个问题:PendSV是中断,所以需要使能中断才能运行,因此在rt_hw_context_switch后立马就有一个rt_hw_interrupt_enable,如果M核工作在非SMP框架下这是没有问题的,但是在SMP框架下当前的线程已经变了,而rt_hw_interrupt_enable是同当前线程绑定的,所以这里会导致CPU的scheduler_lock_nest,cpus_lock_nest错乱,从而导致调度器不能正常工作

pYYBAGKfAe-AFlbwAABhL---p0w148.png

基于上面的描述,我考虑把rt_cpus_lock_status_restore放在PendSV中进行调用,这样就可以保证scheduler_lock_nest工作的正确性,但是导致一个更大的问题!!!在rt_schedule函数中,如果中断还没有使能的情况下重复调用rt_schedule(systick中多层中断)会导致已经被标记为RUNNING的线程无法正常被加入到就绪列表中。因为在上一次的rt_schedule中线程已经被移除了,其等待在PendSV中绑定到当前CPU的时候rt_schedule再次到来,其应该被重新加入到就绪列表(如果优先级低的话),但是schudler是基于当前CPU上的线程来管理的,由于之前被调度的线程当前还没有绑定,所以线程变成游离状态而无法被调度,就会出现下面的情况:

poYBAGKfAfOAfZQGAACJwPtJCnk689.png


所以rt_cpus_lock_status_restore(thread)只能在rt_hw_context_switch中被调用,但这种情况下我们需要处理scheduler_nestcpus_lock_nest错乱的问题,由于SMP框架将nest绑定到线程上,但实际上锁针对的还是CPU,我也认为将太绑定到CPU上更合适,为了不修改内核源码的情况下实现,我在rt_hw_context_switch中将当前cpu线程的nest绑定到需要调度的线程上,这样就等价于把nest绑定到CPU上,此时就可以正常工作了。

poYBAGKfAg6AZ5lxAACtIk0C4l8111.png

解决上述问题后知剩下最后一个问题,我们前文的讨论都是基于非中断情况下的,对于Cortex-M而言中断中的调度和非中断中的调度是一致的,都是基于PendSV实现的,所以我们rt_hw_context_switch,rt_hw_context_interrupt_switch用一套一样的代码就可以,但是在SMP框架中这两个部分具有两个调度函数,在中断中调用rt_schedule,SMP框架会直接跳过当前调度并且给当前CPU打上中断调度标记,最后在离开中断的时候调用rt_scheduler_do_irq_switch(void *context)来实现,对于Cortex-A的中断结构来说这是没有问题的,只要保证switch能够在本次调度过程中直接切换就行,但是对于Cortex-M这样就不太合适,我们可以把NVIC弄成统一IRQ的样子,但是我觉得直接废弃rt_scheduler_do_irq_switch更加合适。

pYYBAGKfAhKAbJvmAAA4DiHj-SA334.png


为了使得调度器不知道我们在中断状态,我把rt_interrupt_enter/leave注释掉了(应该在涉及内核调度的中断中全部采用这种办法),这样irq_nest就一直是0,调度器也不会去调用do_irq了,其实我们不用这个处理方法也能够工作的,但是中断中就没法调度了,实时性也没法保障。按照我的理解在Cortex-M中这样的处理并不会有太大的问题,但是总不太好是吧~

pYYBAGKfAiyADNIUAAAlD8mjmDo619.png


最后基于上面全部的修改,RP2040的SMP能够正常工作,小灯能够按照正常闪烁。

poYBAGKfAi-ASz_qAACuALvQTO4608.png

最后

我对于RT-Thread的理解还很有限,萌新,有很多问题我可能预料不到,这样的实现方式我也觉得不太优雅,不过总算是跑起来了(肝了两天还是有点累emmm)。后续会优化整理并且再经过一段时间的测试,或许能够喜提自己的第一个RT-Thread PR ~

最后是关于SMP,我不明白为什么把nest绑定到thread而不是cpu上,因为总还是在锁cpu,其次rt-thread的smp似乎是专门给A核设计,目前的多核MCU也有蛮多,希望可以提供一些相关支持。

Attention please!!(2022-5-12): 评论区有提供bsp的压缩包

只是一个可以玩玩的状态,目前可以确定的是存在和调度相关的bug会导致系统崩溃(目前测试在shell反复调用list_thread可能崩溃,可能和kservice有关)。

另外如果线程在调度器启动前被创建,即INIT_BORAD_EXPORT方式创建则一切正常(list_thread不会崩溃),在main中创建就可能出现崩溃,希望各位大佬可以给点调试思路。

由于最近事情很多比较忙绿,没有时间调试和阅读代码,但会在后续一段时间(六月-七月)调试完善smp调度并在后续添加完善pico的驱动支持,希望感兴趣的同学一起交流哈。(也在看看rtthread v5.0的消息哈)

来源:RTThread物联网操作系统

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

    关注

    0

    文章

    68

    浏览量

    19450
收藏 人收藏

    评论

    相关推荐

    Raspberry Pi Pico是什么

    Waveshare给您介绍一款树莓派家族的新成员,Raspberry Pi Pico 是一款低成本,高性能的微控制开发板,具有灵活数字接口。硬件上,采用Raspberry Pi 官方
    发表于 07-14 07:02

    Raspberry Pi Pico具有哪些功能特性?

    Raspberry Pi Pico具有哪些功能特性?
    发表于 10-11 08:13

    微控制开发板Raspberry Pi Pico

    树莓派基金会最新发布一款低成本、高性能的微控制开发板Raspberry Pi Pico,新产品相比普通树莓派体积更小
    发表于 10-29 07:33

    使用raspberry pi Pico的原因

    使用raspberry pi Pico的原因在硬件产品(单片机)的开发中我们往往需要借助一些额外的仪器/设备进行产品的辅助测试, 假设我们需要一个IO+ADC类型辅助设备, 以往的做法是 原理图
    发表于 02-07 09:16

    RT-Thread SMP介绍与移植资料分享

    1、如何移植 RT-Thread SMP系统上电后,每个 CPU 都会在 ROM 中的代码控制下独自运行,但是只有主处理器(以下简称 CPU0 )跳转到 RT-Thread 的初始化入口处,而其
    发表于 04-27 14:38

    多核处理器分类之SMP与NUMA简析

    存储的延迟都是一样的。这种体系结构的处理器有时候也会被叫做对称多处理器(Symmetric Multi-Processor,简称SMP)。这里的“对称”,是说所有的
    发表于 06-07 16:46

    基于raspberry pi pico的EPS系统

    描述Sweet Manufacturing电子转向系统该项目是一个基于 raspberry pi pico 的 EPS(电动助力转向)系统。该项目使用汽车电池。该项目中使用的传感是转向柱中的两个
    发表于 07-15 10:05

    Raspberry Pi 4/3B的Pico开发板

    英国 Raspberry Pi 设计的全新微控制芯片。”从控制电器到操作灯光显示Raspberry Pi Pico 将支撑无数日常操作
    发表于 07-26 07:14

    一个印有PINOUT的Raspberry Pi pico分线板

    描述Raspberry Pi Pico 分线板(GPIO 扩展)方面:60 毫米 x 60 毫米特征:紧凑型设计4x M2 螺丝安装座2.54mm间距焊盘2.54mm 间距排针兼容用于外围设备的额外
    发表于 07-27 06:33

    基于Raspberry Pi Pico的EuroPi铝制前面板

    描述EuroPi 铝制前面板EuroPi是一个基于 Raspberry Pi Pico 的完全用户可重新编程的模块,它允许用户处理输入和控制,以根据用 Python 编写的代码产生输出。整个项目是开源的。
    发表于 09-01 06:59

    RT-Thread框架下的SMP支持

    简介SMP: 对称多处理(Symmetrical Multi-Processing)简称 SMP,是指在一个计算机上汇集了一组处理器 (多 CPU), 各 CPU 之间共享内存子系统
    发表于 02-13 15:02

    Linux在SMP系统上的移植研究

    基于自主开发以双核嵌入式CPU EM8301为处理核心的嵌入式应用的目的,针对双核CPU芯片的系统结构和Linux内核的特性,通过研究嵌入式Linux操作系统在SMP系统上的移植,探讨SMP
    发表于 11-14 16:09 11次下载
    Linux在<b class='flag-5'>SMP</b>系统上的<b class='flag-5'>移植</b>研究

    适用于Raspberry Pi 4的Raspberry Pi Pico开发板

    电子发烧友网站提供《适用于Raspberry Pi 4的Raspberry Pi Pico开发板.zip》资料免费下载
    发表于 07-22 09:27 6次下载
    适用于<b class='flag-5'>Raspberry</b> Pi 4的<b class='flag-5'>Raspberry</b> Pi <b class='flag-5'>Pico</b>开发板

    使用Raspberry Pi Pico的LED序列

    电子发烧友网站提供《使用Raspberry Pi Pico的LED序列.zip》资料免费下载
    发表于 11-14 11:07 0次下载
    使用<b class='flag-5'>Raspberry</b> Pi <b class='flag-5'>Pico</b>的LED序列

    远程编程Raspberry Pi Pico

    电子发烧友网站提供《远程编程Raspberry Pi Pico.zip》资料免费下载
    发表于 06-16 15:25 0次下载
    远程编程<b class='flag-5'>Raspberry</b> Pi <b class='flag-5'>Pico</b>