轻松玩转树莓派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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/702415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈数据分析工具在智慧城市中的作用

随着城市化、技术进步和人口不断增长&#xff0c;智慧城市已成为当今世界主要技术发展之一。 智慧城市设备依靠描述模型对城市环境产生的大量数据进行数据分析。 在这种城市景观中&#xff0c;智慧城市是技术和可持续的城市地区&#xff0c;利用信息和通信技术(ICT)来改善城市…

C语言每日一题(61)盛最多水的容器

题目链接 力扣 11 盛最多水的容器 题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水…

Eureka服务搭建

1️⃣搭建服务 引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>启动类加注解 EnableEurekaServer SpringBootApplication public…

【服务发现--ingress】

1、ingress介绍 Ingress 提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源所定义的规则来控制。 Ingress 是对集群中服务的外部访问进行管理的 API 对象&#xff0c;典型的访问方式是 HTTP。 Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟…

基于Qt实现TCP和UDP客户端与服务端的完整指南

在当今的软件开发领域&#xff0c;网络通信已经成为了不可或缺的一部分。无论是在物联网(IoT)、企业级应用还是简单的客户端与服务端通信场景中&#xff0c;有效且高效的数据传输都是至关重要的。Qt&#xff0c;作为一个跨平台的C框架&#xff0c;不仅提供了丰富的用户界面组件…

K线实战分析系列之十一:行情力量不足——平头形态

K线实战分析系列之十一&#xff1a;行情力量不足——平头形态 一、平头形态二、不同形态与平头形态的叠加三、总结平头形态 一、平头形态 前一根K线具有较长的实体&#xff0c;后一根K线的实体比较小&#xff0c;无论是多头还是空头的力量到第二根K线都被瓦解了多头上攻&#…

【数据结构与算法】(21)高级数据结构与算法设计之 Dynamic-Programming 动态规划算法 代码示例与详细讲解

目录 4.3 Dynamic-Programming1) Fibonacci降维 2) 最短路径 - Bellman-Ford3) 不同路径-Leetcode 62降维 4) 0-1 背包问题降维 5) 完全背包问题降维 6) 零钱兑换问题-Leetcode322降维零钱兑换 II-Leetcode 518 7) 钢条切割问题降维类似题目 Leetcode-343 整数拆分 8) 最长公共…

HashMap学习

hashmap 1、hashmap 与 hashtable 的区别2、hashmap基本类型与包装类常用实现变量介绍初始容量和负载因子红黑树和链表转化HashMap的内部数据结构HashMap内部哈希算法 参考文章 1、hashmap 与 hashtable 的区别 线程安全null值执行效率 2、hashmap hashmap是java中常用的集合…

寻找连续区间(C 语言)【数组区间处理】

题目来自于博主算法大师的专栏&#xff1a;最新华为OD机试C卷AB卷OJ&#xff08;CJavaJSPy&#xff09; https://blog.csdn.net/banxia_frontend/category_12225173.html 题目 给定一个含有 N 个正整数的数组&#xff0c; 求出有多少个连续区间&#xff08;包括单个正整数&am…

python 基础知识点(蓝桥杯python科目个人复习计划51)

今日复习计划&#xff1a;做复习题 例题1&#xff1a;大石头的搬运工 问题描述&#xff1a; 在一款名为“大石头的搬运工”的游戏中&#xff0c;玩家需要 操作一排n堆石头&#xff0c;进行n - 1轮游戏。 每一轮&#xff0c;玩家可以选择一堆石头&#xff0c;并将其移动到任…

【生活】浅浅记录

各位小伙伴们好鸭&#xff0c;今天不是技术文章&#xff0c;浅浅记录一下最近几个月的收获&#x1f60a; 新的一年&#xff0c;一起努力&#xff0c;加油加油&#xff01;

分库分表(以MySQL为例说明)

1、为什么要分库&#xff1f; ①减轻磁盘压力 ②单库并发连接请求数有限&#xff0c;如果存在过多连接会出现too many connections的问题 2、为什么要分表&#xff1f; ①一般单表数据量超千万很大了&#xff0c;单表数据量过大会出现性能瓶颈&#xff0c;建索引、SQL优化、数据…

tinymce问题处理

Vite构建工具下Tinymce踩坑指南 解决方案是在路劲前面增加/&#xff0c;这个跟上面链接有些区别&#xff0c;区别原因应该是如果路由采用的是createWebHashHistory则应该去掉/&#xff0c;如果是createWebHistory则应该加上/ 页面引用,一种异步加载&#xff0c;一种同步加载&…

深度学习的启航:从零到一的完全指南

深度学习的启航&#xff1a;从零到一的完全指南 深度学习近年来已成为人工智能领域最耀眼的明星&#xff0c;其在图像识别、自然语言处理、游戏以及无人驾驶等领域取得的进展令人瞩目。如果你对深度学习充满好奇&#xff0c;想要开启一段全新的学习旅程&#xff0c;这篇文章将…

睿易售前初级认证课程R1.0睿网络命名选型-2023练习题答案

1、RG-RAP6260(G)可以用在什么场景下?【多选题】 A、别墅花园 B、冷库 C、大型仓库 D、海边 A B C D 2、AP选型要关注什么?【多选题】 A、使用场景 B、带机量 C、Wi-Fi5还是Wi-Fi6 D、千兆还是百兆 A B C D 3、带机60终端以上的Wi-Fi6千兆吸顶AP选哪款【多选题】 A、…

LeetCode 热题 100 | 二叉树(二)

目录 1 543. 二叉树的直径 2 102. 二叉树的层序遍历 3 108. 将有序数组转换为二叉搜索树 菜鸟做题&#xff0c;语言是 C 1 543. 二叉树的直径 这道题和 124. 二叉树中的最大路径和 太像了 题眼&#xff1a;二叉树的 直径 是指树中任意两个节点之间 最长路径的长度 。…

JS基础(三)-操作和流程控制

一 操作网页元素的步骤 1. 查找网页元素 给标签设置id属性&#xff0c;一个网页中的id值不允许重复 <button id"btn">按钮</button> 2. 给按钮绑定事件&#xff0c;监听用户操作 btn.onclick function(){ 一旦监听到用户的…

人工智能 — 特征选择、特征提取、PCA

目录 一、特征选择1、定义2、原因3、做法4、生成过程5、停止条件 二、特征提取三、PCA 算法1、零均值化&#xff08;中心化&#xff09;2、方差3、协方差4、协方差矩阵5、对协方差矩阵求特征值、特征矩阵6、对特征值进行排序7、评价模型8、代码实现9、sklearn 库10、鸢尾花实例…

【数据结构与算法(Java版)】深度剖析二分查找算法

【二分查找算法】的时间复杂度为O(log n)&#xff0c;其中n为数组的长度。因为每次查找都将查找范围缩小一半&#xff0c;所以算法的时间复杂度是对数级别的。 目录 前言 二分查找算法是什么&#xff1f; 算法实现 方式一&#xff1a;&#xff08;左闭右闭&#xff09; 文…

电机控制常见的外围器件

小型断路器&#xff1a; 这些通通都叫小型断路器&#xff0c;二十年的老电工不一定都认识&#xff0c;不信看看_哔哩哔哩_bilibili 1PIN 2PIN 3PIN 4PIN: 正常情况下火线和零线的电流是相等的&#xff0c;但是漏电的情况下&#xff0c;两线的电流差值大于30毫安&#xff0c;漏…