轻松玩转树莓派Pico之九、RP2040-SMP自定义工程创建

2024-02-26 03:44

本文主要是介绍轻松玩转树莓派Pico之九、RP2040-SMP自定义工程创建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

@[toc]## 1、工程创建
运行完 FreeRTOS-SMP-Demos 后,我们对 SMP 运行有了一定的了解,接下来我们自己创建工程编译运行。

  1. 按照前文 轻松玩转树莓派Pico之二、创建自己的pico工程项目 一文创建 pico_smp 项目。
    创建 pico_smp.c,并输入:
#include <stdio.h>
#include "pico/stdlib.h"int main()
{setup_default_uart();while(1) {printf("Hello World!\r\n");sleep_ms(1000);}return 0;
}
  1. 创建项目CMakeLists.txt
cmake_minimum_required(VERSION 3.13)include(pico_sdk_import.cmake)project(pico_smp C CXX ASM)set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)pico_sdk_init()add_executable(pico_smppico_smp.c
)pico_add_extra_outputs(pico_smp)
target_link_libraries(pico_smp pico_stdlib)
  1. 在项目 pico_freertos_smp 目录下依次输入:
$ mkdir build && cd build
$ cmake ..
$ make

测试是否可以正常编译

2、FreeRTOS-SMP源码下载

下载 smp 分支源码,采用 git submodule 模式,在命令行中输入:

$ git submodule add -b smp https://github.com/FreeRTOS/FreeRTOS-Kernel

下载完成后,可以在 FreeRTOS-Kernel/portable/ThirdParty/GCC/RP2040 目录下看到 RP2040-SMP 相关的适配。

根据 README.md 文件介绍,可以将 FreeRTOS_Kernel_import.cmake 文件复制到项目工程下,并在项目 CMakeLists.txt 文件夹加入该文件即可。

修改 pico-smp 工程

  1. 修改 CMakeLists.txt,加入 include(FreeRTOS_Kernel_import.cmake)
    因为我们的下载的 FreeRTOS-Kernel 就在当前工程目录下,以子模块类型存在。
cmake_minimum_required(VERSION 3.13)include(pico_sdk_import.cmake)include(FreeRTOS-Kernel/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake)project(pico_smp C CXX ASM)set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)pico_sdk_init()add_executable(pico_smppico_smp.c
)target_link_libraries(pico_smp pico_stdlib FreeRTOS-Kernel FreeRTOS-Kernel-Heap4)
include_directories(${CMAKE_CURRENT_LIST_DIR})pico_add_extra_outputs(pico_smp)
  1. 加入 smp 相关代码,修改 main() 函数,创建 2个任务,并让 task0 运行在 core0,task1 运行在 core1。
  2. 调用 vTaskStartScheduler() 函数启动调度器。
#include "FreeRTOS.h"
#include "task.h"void task0(void *param)
{static uint32_t cnt = 0;while (1) {printf("%s cnt: %d\n", __FUNCTION__, cnt ++);printf("task %s is runing in core %d\r\n", __FUNCTION__, portGET_CORE_ID());vTaskDelay(1000);}
}void task1(void *param)
{static uint32_t cnt = 0;while (1) {printf("%s cnt: %d\n", __FUNCTION__, cnt ++);printf("task %s is runing in core %d\r\n", __FUNCTION__, portGET_CORE_ID());vTaskDelay(1000);}
}int main()
{setup_default_uart();TaskHandle_t task0_Handle = NULL;xTaskCreate(task0, "task0", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, &task0_Handle);UBaseType_t task0_CoreAffinityMask = (1 << 0);vTaskCoreAffinitySet(task0_Handle, task0_CoreAffinityMask); TaskHandle_t task1_Handle = NULL;xTaskCreate(task1, "task1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 2, &task1_Handle);UBaseType_t task1_CoreAffinityMask = (1 << 1);vTaskCoreAffinitySet(task1_Handle, task1_CoreAffinityMask); vTaskStartScheduler();return 0;
}

需要特别注意需要开启下面这 2 个宏

#define configRUN_MULTIPLE_PRIORITIES           1
#define configUSE_CORE_AFFINITY                 1
  1. 添加 FreeRTOSConfig.h
/** FreeRTOS V202107.00* Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.** Permission is hereby granted, free of charge, to any person obtaining a copy of* this software and associated documentation files (the "Software"), to deal in* the Software without restriction, including without limitation the rights to* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of* the Software, and to permit persons to whom the Software is furnished to do so,* subject to the following conditions:** The above copyright notice and this permission notice shall be included in all* copies or substantial portions of the Software.** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.** http://www.FreeRTOS.org* http://aws.amazon.com/freertos** 1 tab == 4 spaces!*/#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H/*-----------------------------------------------------------* Application specific definitions.** These definitions should be adjusted for your particular hardware and* application requirements.** THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.** See http://www.freertos.org/a00110.html*----------------------------------------------------------*//* Scheduler Related */
#define configUSE_PREEMPTION                    1
#define configUSE_TICKLESS_IDLE                 0
#define configUSE_IDLE_HOOK                     0
#define configUSE_TICK_HOOK                     0
#define configTICK_RATE_HZ                      ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES                    32
#define configMINIMAL_STACK_SIZE                ( configSTACK_DEPTH_TYPE ) 256
#define configUSE_16_BIT_TICKS                  0#define configIDLE_SHOULD_YIELD                 1/* Synchronization Related */
#define configUSE_MUTEXES                       1
#define configUSE_RECURSIVE_MUTEXES             1
#define configUSE_APPLICATION_TASK_TAG          0
#define configUSE_COUNTING_SEMAPHORES           1
#define configQUEUE_REGISTRY_SIZE               8
#define configUSE_QUEUE_SETS                    1
#define configUSE_TIME_SLICING                  1
#define configUSE_NEWLIB_REENTRANT              0
#define configENABLE_BACKWARD_COMPATIBILITY     0
#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 5/* System */
#define configSTACK_DEPTH_TYPE                  uint32_t
#define configMESSAGE_BUFFER_LENGTH_TYPE        size_t/* Memory allocation related definitions. */
#define configSUPPORT_STATIC_ALLOCATION         0
#define configSUPPORT_DYNAMIC_ALLOCATION        1
#define configTOTAL_HEAP_SIZE                   (128*1024)
#define configAPPLICATION_ALLOCATED_HEAP        0/* Hook function related definitions. */
#define configCHECK_FOR_STACK_OVERFLOW          0
#define configUSE_MALLOC_FAILED_HOOK            0
#define configUSE_DAEMON_TASK_STARTUP_HOOK      0/* Run time and task stats gathering related definitions. */
#define configGENERATE_RUN_TIME_STATS           0
#define configUSE_TRACE_FACILITY                1
#define configUSE_STATS_FORMATTING_FUNCTIONS    0/* Co-routine related definitions. */
#define configUSE_CO_ROUTINES                   0
#define configMAX_CO_ROUTINE_PRIORITIES         1/* Software timer related definitions. */
#define configUSE_TIMERS                        1
#define configTIMER_TASK_PRIORITY               ( configMAX_PRIORITIES - 1 )
#define configTIMER_QUEUE_LENGTH                10
#define configTIMER_TASK_STACK_DEPTH            1024/* Interrupt nesting behaviour configuration. */
/*
#define configKERNEL_INTERRUPT_PRIORITY         [dependent of processor]
#define configMAX_SYSCALL_INTERRUPT_PRIORITY    [dependent on processor and application]
#define configMAX_API_CALL_INTERRUPT_PRIORITY   [dependent on processor and application]
*//* SMP port only */
#define configNUM_CORES                         2
#define configTICK_CORE                         0
#define configRUN_MULTIPLE_PRIORITIES           1
#define configUSE_CORE_AFFINITY                 1/* RP2040 specific */
#define configSUPPORT_PICO_SYNC_INTEROP         1
#define configSUPPORT_PICO_TIME_INTEROP         1#include <assert.h>
/* Define to trap errors during development. */
#define configASSERT(x)                         assert(x)/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */
#define INCLUDE_vTaskPrioritySet                1
#define INCLUDE_uxTaskPriorityGet               1
#define INCLUDE_vTaskDelete                     1
#define INCLUDE_vTaskSuspend                    1
#define INCLUDE_vTaskDelayUntil                 1
#define INCLUDE_vTaskDelay                      1
#define INCLUDE_xTaskGetSchedulerState          1
#define INCLUDE_xTaskGetCurrentTaskHandle       1
#define INCLUDE_uxTaskGetStackHighWaterMark     1
#define INCLUDE_xTaskGetIdleTaskHandle          1
#define INCLUDE_eTaskGetState                   1
#define INCLUDE_xTimerPendFunctionCall          1
#define INCLUDE_xTaskAbortDelay                 1
#define INCLUDE_xTaskGetHandle                  1
#define INCLUDE_xTaskResumeFromISR              1
#define INCLUDE_xQueueGetMutexHolder            1/* A header file that defines trace macro can be included here. */#endif /* FREERTOS_CONFIG_H */

3、编译

在项目 pico_freertos_smp 目录下依次输入:

$ mkdir build && cd build
$ cmake ..
$ make

即可完成编译,编译完成后在 builld 目录下已经生成了 .uf2 .bin .elf 等文件。

下载至 pico 开发板后,运行如下:

task0 cnt: 0
task1 cnt: 0
task task1 is runing in core 1
task task0 is runing in core 0
task1 cnt: 1
task task1 is runing in core 1
task0 cnt: 1
task task0 is runing in core 0
task1 cnt: 2
task task1 is runing in core 1
task0 cnt: 2
task task0 is runing in core 0

这篇关于轻松玩转树莓派Pico之九、RP2040-SMP自定义工程创建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/747611

相关文章

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

macOS怎么轻松更换App图标? Mac电脑图标更换指南

《macOS怎么轻松更换App图标?Mac电脑图标更换指南》想要给你的Mac电脑按照自己的喜好来更换App图标?其实非常简单,只需要两步就能搞定,下面我来详细讲解一下... 虽然 MACOS 的个性化定制选项已经「缩水」,不如早期版本那么丰富,www.chinasem.cn但我们仍然可以按照自己的喜好来更换

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

使用SpringBoot创建一个RESTful API的详细步骤

《使用SpringBoot创建一个RESTfulAPI的详细步骤》使用Java的SpringBoot创建RESTfulAPI可以满足多种开发场景,它提供了快速开发、易于配置、可扩展、可维护的优点,尤... 目录一、创建 Spring Boot 项目二、创建控制器类(Controller Class)三、运行

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

轻松掌握python的dataclass让你的代码更简洁优雅

《轻松掌握python的dataclass让你的代码更简洁优雅》本文总结了几个我在使用Python的dataclass时常用的技巧,dataclass装饰器可以帮助我们简化数据类的定义过程,包括设置默... 目录1. 传统的类定义方式2. dataclass装饰器定义类2.1. 默认值2.2. 隐藏敏感信息