树莓派 pico 移植 FreeRTOS
文章目录
- 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相关推荐
- 首款微控制器级树莓派 Pico,超廉价只需4美元
2021年1月21日,树莓派基金会发布了首款微控制器级产品:Raspberry Pi Pico. 该产品基于全新的 RP2040 芯片构建,售价仅 4 美元,国内标准售价 29.99 元人民币,目前在 ...
- FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS
上一次,我们简单的测试了FreeRTOS的基于IAR EWARMv6.4和STM32F103VET6平台的Demo,对其有了一个基本认识.接下来我们开始自己移植FreeRTOS的过程. 1.创建 ...
- 2.STM32F407ZGT6 学习笔记-移植 FreeRTOS
程序移植的代码: https://gitee.com/chejia12/free-rtos_-f407.git 1. 在工程下建议FreeRTOS文件夹 2. 在FreeRTOS文件夹下建立 src ...
- STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级)
STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级) STM32F103移植FreeRTOS必须搞明白的系列知识---2(FreeRTOS任务优先级) ...
- 英飞凌TC397移植FreeRTOS
英飞凌TC397移植FreeRTOS 一.准备工作 1.FreeRTOS源码 2.STM驱动代码 3.中断相关配置文件 4.AURIX Developement Studio初始工程(包含SDK) 二 ...
- 【FreeRTOS】在Cortex-M4开发板上移植FreeRTOS并且实现LED灯闪烁(保姆级教程)
相信有不少小伙伴手上只有M4的开发板,想要移植FreeRTOS:但是,网上大部分都是M3移植教程.因此,陷入深深的迷茫中,难不成只能使用仿真了???
- STM32F103移植FreeRTOS
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.freeROTS是什么? 二.移植FreeRTOS步骤 1.移植工具 2.第一步建立一个工程 3.第二步下载Fre ...
- 树莓派 Pico Clion开发
准备 交叉编译工具链 ARM GNU:下载页面 GNU工具链包括了 LD.GCC.G++等交叉编译连接工具 下载完成后下一步下一步安装就可以,注意一下安装路径. 树莓派Pico SDK下载: Pico ...
- 树莓派Pico开发板与大功率MOSFET/IGBT器件驱动控制24V直流电机技术实践
摘要:本文在介绍MOSFET器件和IGBT器件作为电子开关基本原理的基础上,讲述了树莓派Pico与MOSFET&IGBT器件驱动控制24V直流电机硬件接口技术,最后给出了树莓派Pico开发板G ...
最新文章
- cookie关键字_我遇过的最难的Cookie问题
- SQLserver安全设置攻略
- BREW 计费模式概览
- 设计模式 | 工厂方法模式及典型应用
- 11月12日云栖精选夜读 | 2135亿!新技术的力量刚刚开始
- HTTPS_SSL配置的步骤以及原理说明
- git-fork下来的项目(拷贝到本地 根据原来的库更新)
- 百度地图api改变覆盖物背景实例及css颜色值简介
- unity 阳光插件_网络广告,阳光创信保驾护航
- bubbleSort 冒泡排序
- c语言中欧几里得模乘法逆元,扩展欧几里得算法同余方程模m乘法逆元详解
- js按钮频繁提交解决方案:
- Cydia Substrate插件编写
- 小米笔记本计算机在哪里,小米笔记本电脑配置在哪里查看
- 外贸网站建站营销及推广?
- Android圆角ImageView的几种实现方式(包含四个角的分别设置)
- aspnetcore vue 下载zip文件,压缩包打不开的问题记录
- Ping IPv6在线测试检测 testipv6 加速镜像
- 谷歌浏览器chrome官方下载网址
- 做一个简单网页(做一个简单网页多少钱)
热门文章
- 七夕节最深情表白文案从此告别搓衣板
- 使用MATLABsimulinkstm32mat_targetstm32cubemx开发stm32
- 基于stm32f103c8t6移植uc/OS-III系统
- 京东高效转链API接口—商品优惠券二合一转链—京东联盟优惠券如何转链?
- 【一周头条盘点】中国软件网(2018.12.17~2018.12.21)
- 09-微信小程序商城 分类和产品 左右布局框架(微信小程序商城开发、小程序毕业设计、小程序源代码)(黄菊华-微信小程序开发教程)
- Linux系统Ubuntu有什么优点?
- 35岁前多用利弊分析,35岁后要有“安全边际”
- 如何修改notepad默认编码
- Java版的双色球买彩票程序