文章目录

  • 1、FreeRTOS
  • 2、创建工程
  • 3、移植FreeRTOS
  • 4、编写代码

1、FreeRTOS


FreeRTOS 是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。
FreeRTOS 在内核中增加了对称多处理 (SMP) 支持,使开发人员在设计基于 FreeRTOS 的应用程序时能够利用多核微控制器的 SMP 功能。最重要的是 FreeRTOS 支持树莓派 Pico RP2040 的两个内核的 SMP

2、创建工程

工具 版本
CMake 3.24.1
Arm GNU Toolchain 12.2.0
python 3.10.6

首先使用 pico-project-generator 创建 树莓派 pico 的工程

../pico-project-generator/pico_project.py --gui


进入工程文件夹,使用 vscode 打开项目

编译

cmake .. && make

3、移植FreeRTOS

获取 FreeRTOS 源码

git clone https://github.com/FreeRTOS/FreeRTOS-SMP-Demos.git

进入 FreeRTOS-SMP-Demos 目录

cd FreeRTOS-SMP-Demos

更新子模块

git submodule update --init --recursive


FreeRTOS-SMP-Demos/FreeRTOS/Source 目录放入我们创建的 Pico 工程中

cp -r FreeRTOS-SMP-Demos/FreeRTOS/Source .

FreeRTOS-SMP-Demos/FreeRTOS/Demo/CORTEX_M0+_RP2040/OnEitherCore/FreeRTOS_Kernel_import.cmake 文件放入 Pico 工程中

cp FreeRTOS-SMP-Demos/FreeRTOS/Demo/CORTEX_M0+_RP2040/OnEitherCore/FreeRTOS_Kernel_import.cmake .

FreeRTOS-SMP-Demos/FreeRTOS/Demo/CORTEX_M0+_RP2040/OnEitherCore/FreeRTOSConfig.h 文件放入 Pico 工程中

cp FreeRTOS-SMP-Demos/FreeRTOS/Demo/CORTEX_M0+_RP2040/OnEitherCore/FreeRTOSConfig.h .

最后 Pico 工程的结构是


修改 .vscode/c_cpp_properties.json 文件
includePath 中加入 FreeRTOS 的头文件

{"configurations": [{"name": "Linux","includePath": ["${workspaceFolder}/**","${env:PICO_SDK_PATH}**","${workspaceFolder}/Source/include/**"   // FreeRTOS 头文件],"defines": [],"compilerPath": "/usr/bin/arm-none-eabi-gcc","cStandard": "gnu17","cppStandard": "gnu++14","intelliSenseMode": "linux-gcc-arm","configurationProvider" : "ms-vscode.cmake-tools"}],"version": 4
}

修改 FreeRTOS_Kernel_import.cmake 文件
在开头加入

set(FREERTOS_KERNEL_PATH "${CMAKE_CURRENT_LIST_DIR}/Source")
set(FREERTOS_KERNEL_RP2040_RELATIVE_PATH "../Source/portable/ThirdParty/GCC/RP2040")
set(FREERTOS_KERNEL_RP2040_BACK_PATH "../Source/../../../..")

修改 CMakeLists.txt 文件
include(pico_sdk_import.cmake)
下面添加

# Pull in FreeRTOS
include(FreeRTOS_Kernel_import.cmake)

修改target_link_libraries

target_link_libraries(FreeRTOS PRIVATEpico_stdlibFreeRTOS-KernelFreeRTOS-Kernel-Heap4pico_multicore)

在最后添加target_include_directories

target_include_directories(FreeRTOS PRIVATE${CMAKE_CURRENT_LIST_DIR})

添加target_compile_definitions

target_compile_definitions(FreeRTOS PRIVATEmainRUN_FREE_RTOS_ON_CORE=1PICO_STACK_SIZE=0x1000PICO_STDIO_STACK_BUFFER_SIZE=64 # use a small printf on stack buffer
)

CMakeLists.txt 文件

# Generated Cmake Pico project filecmake_minimum_required(VERSION 3.13)set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)# Initialise pico_sdk from installed location
# (note this can come from environment, CMake cache etc)
set(PICO_SDK_PATH "/home/kjlsai/pico/pico-sdk")# Pull in Raspberry Pi Pico SDK (must be before project)
include(pico_sdk_import.cmake)
# Pull in FreeRTOS
include(FreeRTOS_Kernel_import.cmake)project(FreeRTOS C CXX ASM)set(PICO_CXX_ENABLE_EXCEPTIONS 1)set(PICO_CXX_ENABLE_RTTI 1)# Initialise the Raspberry Pi Pico SDK
pico_sdk_init()# Add executable. Default name is the project name, version 0.1add_executable(FreeRTOS main.cc )pico_set_program_name(FreeRTOS "FreeRTOS")
pico_set_program_version(FreeRTOS "0.1")pico_enable_stdio_uart(FreeRTOS 0)
pico_enable_stdio_usb(FreeRTOS 1)# Add the standard library to the build
target_link_libraries(FreeRTOS PRIVATEpico_stdlibFreeRTOS-KernelFreeRTOS-Kernel-Heap4pico_multicore)pico_add_extra_outputs(FreeRTOS)target_include_directories(FreeRTOS PRIVATE${CMAKE_CURRENT_LIST_DIR})target_compile_definitions(FreeRTOS PRIVATEmainRUN_FREE_RTOS_ON_CORE=1PICO_STACK_SIZE=0x1000PICO_STDIO_STACK_BUFFER_SIZE=64 # use a small printf on stack buffer)

修改 FreeRTOSConfig.h 文件,将宏定义

  • configUSE_TICK_HOOK
  • configCHECK_FOR_STACK_OVERFLOW
  • configUSE_MALLOC_FAILED_HOOK
  • configTICK_CORE

改为 0

将宏定义

  • configNUM_CORES

改为 2

添加宏定义

  • #define configUSE_CORE_AFFINITY 1

4、编写代码

我们写一个打印程序来验证移植是否成功

#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/mutex.h"
#include "pico/sem.h"
#include "FreeRTOS.h" /* Must come first. */
#include "task.h"     /* RTOS task related API prototypes. */
#include "queue.h"    /* RTOS queue related API prototypes. */
#include "timers.h"   /* Software timer related API prototypes. */
#include "semphr.h"   /* Semaphore related API prototypes. */void task0(void *pvParam)
{for(;;){uint CORE_ID;CORE_ID = portGET_CORE_ID();                        // 获取核心IDprintf("task0 is runing in core %d\r\n",CORE_ID);   // 打印核心IDvTaskDelay(1000 / portTICK_PERIOD_MS);              // 延时1秒}
}void task1(void *pvParam)
{for(;;){uint CORE_ID;CORE_ID = portGET_CORE_ID();printf("task1 is runing in core %d\r\n",CORE_ID);vTaskDelay(1000 / portTICK_PERIOD_MS);}
}int main()
{stdio_init_all();/* 创建任务0 */TaskHandle_t task0_Handle = NULL;UBaseType_t task0_CoreAffinityMask = (1 << 0);              // 指示该任务可以运行在哪个核心上xTaskCreate(task0, "task0", 1024, NULL, 1, &task0_Handle);vTaskCoreAffinitySet(task0_Handle, task0_CoreAffinityMask); // 为任务设置核心关联掩码/* 创建任务1 */TaskHandle_t task1_Handle = NULL;UBaseType_t task1_CoreAffinityMask = (1 << 1);xTaskCreate(task1, "task1", 1024, NULL, 1, &task1_Handle);vTaskCoreAffinitySet(task1_Handle, task1_CoreAffinityMask);vTaskStartScheduler();return 0;
}

编译工程


烧录程序后,打开串口助手可以看到任务0运行在核心0上,任务1运行在核心1上。


可见我们成功将 FreeRTOS 移植到 树莓派 Pico 上,并且成功调用 SMP 功能。

树莓派 pico 移植 FreeRTOS相关推荐

  1. 首款微控制器级树莓派 Pico,超廉价只需4美元

    2021年1月21日,树莓派基金会发布了首款微控制器级产品:Raspberry Pi Pico. 该产品基于全新的 RP2040 芯片构建,售价仅 4 美元,国内标准售价 29.99 元人民币,目前在 ...

  2. FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS

     上一次,我们简单的测试了FreeRTOS的基于IAR EWARMv6.4和STM32F103VET6平台的Demo,对其有了一个基本认识.接下来我们开始自己移植FreeRTOS的过程. 1.创建 ...

  3. 2.STM32F407ZGT6 学习笔记-移植 FreeRTOS

    程序移植的代码: https://gitee.com/chejia12/free-rtos_-f407.git 1. 在工程下建议FreeRTOS文件夹 2. 在FreeRTOS文件夹下建立 src ...

  4. STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级)

    STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级) STM32F103移植FreeRTOS必须搞明白的系列知识---2(FreeRTOS任务优先级) ...

  5. 英飞凌TC397移植FreeRTOS

    英飞凌TC397移植FreeRTOS 一.准备工作 1.FreeRTOS源码 2.STM驱动代码 3.中断相关配置文件 4.AURIX Developement Studio初始工程(包含SDK) 二 ...

  6. 【FreeRTOS】在Cortex-M4开发板上移植FreeRTOS并且实现LED灯闪烁(保姆级教程)

    相信有不少小伙伴手上只有M4的开发板,想要移植FreeRTOS:但是,网上大部分都是M3移植教程.因此,陷入深深的迷茫中,难不成只能使用仿真了???

  7. STM32F103移植FreeRTOS

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.freeROTS是什么? 二.移植FreeRTOS步骤 1.移植工具 2.第一步建立一个工程 3.第二步下载Fre ...

  8. 树莓派 Pico Clion开发

    准备 交叉编译工具链 ARM GNU:下载页面 GNU工具链包括了 LD.GCC.G++等交叉编译连接工具 下载完成后下一步下一步安装就可以,注意一下安装路径. 树莓派Pico SDK下载: Pico ...

  9. 树莓派Pico开发板与大功率MOSFET/IGBT器件驱动控制24V直流电机技术实践

    摘要:本文在介绍MOSFET器件和IGBT器件作为电子开关基本原理的基础上,讲述了树莓派Pico与MOSFET&IGBT器件驱动控制24V直流电机硬件接口技术,最后给出了树莓派Pico开发板G ...

最新文章

  1. cookie关键字_我遇过的最难的Cookie问题
  2. SQLserver安全设置攻略
  3. BREW 计费模式概览
  4. 设计模式 | 工厂方法模式及典型应用
  5. 11月12日云栖精选夜读 | 2135亿!新技术的力量刚刚开始
  6. HTTPS_SSL配置的步骤以及原理说明
  7. git-fork下来的项目(拷贝到本地 根据原来的库更新)
  8. 百度地图api改变覆盖物背景实例及css颜色值简介
  9. unity 阳光插件_网络广告,阳光创信保驾护航
  10. bubbleSort 冒泡排序
  11. c语言中欧几里得模乘法逆元,扩展欧几里得算法同余方程模m乘法逆元详解
  12. js按钮频繁提交解决方案:
  13. Cydia Substrate插件编写
  14. 小米笔记本计算机在哪里,小米笔记本电脑配置在哪里查看
  15. 外贸网站建站营销及推广?
  16. Android圆角ImageView的几种实现方式(包含四个角的分别设置)
  17. aspnetcore vue 下载zip文件,压缩包打不开的问题记录
  18. Ping IPv6在线测试检测 testipv6 加速镜像
  19. 谷歌浏览器chrome官方下载网址
  20. 做一个简单网页(做一个简单网页多少钱)

热门文章

  1. 七夕节最深情表白文案从此告别搓衣板
  2. 使用MATLABsimulinkstm32mat_targetstm32cubemx开发stm32
  3. 基于stm32f103c8t6移植uc/OS-III系统
  4. 京东高效转链API接口—商品优惠券二合一转链—京东联盟优惠券如何转链?
  5. 【一周头条盘点】中国软件网(2018.12.17~2018.12.21)
  6. 09-微信小程序商城 分类和产品 左右布局框架(微信小程序商城开发、小程序毕业设计、小程序源代码)(黄菊华-微信小程序开发教程)
  7. Linux系统Ubuntu有什么优点?
  8. 35岁前多用利弊分析,35岁后要有“安全边际”
  9. 如何修改notepad默认编码
  10. Java版的双色球买彩票程序