FreeRTOS学习(一)

2023-05-16

前言

最近正在学习和FreeRTOS相关的知识,在此记录一下,学习资料来自正点原子
在学习之前,我也有一个和很多初学者共同的疑惑----Why RTOS?
在探究这个问题之前,我想先回顾一下什么是RTOS

RTOS介绍

RTOS即为Real Time Operating System(实时操作系统)在以往的裸机编程中我们会通过定时器中断结合while循环来控制单片机

这样造成的现象就是不能多个任务同时进行,必须要执行完上一个任务才能执行下一个,可能有些朋友会想:靠定时器中断回调就可以了啊,但是中断是不能执行长时间的任务的,稍有帮助的一种思路就是在中断回调函数中挂起对应的工作标志位,while中检测到后就会开始执行,但这样还是会浪费很多时间在等待上一个任务中

这个时候RTOS的优势就展现出来了

RTOS可以控制CPU不断地工作,充分利用CPU的所有性能,简单来说就是给每个任务分片对应的运行时间,时间到了就进入下一个任务,上一个任务的节点会通过堆栈指针保留起来,等下次轮到它的时候会从上一次开始执行,Unix系统也是如此,而笔者选用FreeRTOS的原因是因为其免费且是ST官方钦定的RTOS,可以在CUBEMX中一键配置(不得不感叹大厂才做环境啊)

相关原理

这次我只打算讨论动态任务的创建和删除,这里简单带过一下原理

任务调度

FreeRTOS支持三种任务调度方式:抢占式调度、时间片调度以及协程式调度,我们前面提到了RTOS中的任务是可以连续执行的,每个任务有对应的工作周期,这里就重点介绍一下抢占式和时间片调度

抢占式调度

抢占式调度针对的是优先级不同的任务,每个任务都被分配了一个优先级,优先级高的可以抢占优先级低的任务

这里的优先级和中断机制类似,FreeRTOS的工作方式有两种:特殊方法&通用方法,在通用方法下的优先级算法是通过软件配置,理论上可以有很多个,相反的特殊方法则是基于32位MCU硬件,对应的优先级数有0~31,两者的区别是后者的运行速度高于前者,数值越大的优先级越大,这是和中断机制不同的,还需要注意的一点是:中断的优先级比RTOS中的任何任务都要高

时间片调度

和上面不同,时间片调度针对的是同一个优先级下的任务

当多个任务的优先级相同时,任务调度器会在每一次系统时钟节拍到(1MS)的时候切换任务

任务状态

FreeRTOS中的任务有四种状态:运行态、就绪态、阻塞态、挂起态
并且除了运行态其他三种状态都有自身对应的任务状态列表:就绪列表、阻塞列表、挂起列表

在一个线程中只能有一个任务处于运行态,其他的任务会处于另外的三种状态,如下图所示

只有就绪态可以和运行态相互转换,运行态可以进入任意一种其他形态,换句话说就是所有的任务要先从挂起态&阻塞态进入就绪态才可以顺利开始线程

在这里插入图片描述

抢占式流程

具体的抢占式流程可以看这张图
在这里插入图片描述

这里的优先级顺序为Task3>Task2>Task1,因此可以看出当Task1处在运行态且Task2处在阻塞&挂起态时Task1可以正常工作,但当Task2处在就绪态后Task1会被优先级高的Task2抢占,此时堆栈会记录Task1的工作进度并等到下一次Task2&Task3均被阻塞&挂起时再重新执行完剩下的工作

时间片流程

若创建的三个任务Task1、Task2、Task3均为同一个优先级,这就代表它们处在就绪列表的同一个位置处,此时会按照分配的顺序从Task1执行1ms->Task2执行1ms->Task3执行1ms->Task1执行1ms往复工作

工程搭建

接下来就可以进入CUBEMX配置了,我所使用的开发板是正点的基于F103ZET6的精英板
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

一些简单的配置就不多介绍了
下面我们来看FreeRTOS的配置
关于其他的配置可以参考正点的资料或者查看别的文章,有很多详细的介绍,这里就只介绍最简单的创建一个任务

在这里插入图片描述

接下来就可以学习相关的代码了,下面这些代码是FreeRTOSConfig.h中的,关于各种宏的说明我已加上了中文注释,可自行阅读

配置代码

/* USER CODE BEGIN Header */  
/*  
 * FreeRTOS Kernel V10.0.1 * Copyright (C) 2017 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! *//* USER CODE END Header */  
  
#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 and more 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 *----------------------------------------------------------*/  
/* USER CODE BEGIN Includes */  
/* Section where include file can be added */  
/* USER CODE END Includes */  
  
/* Ensure definitions are only used by the compiler, and not by the assembler. */  
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)  
  #include <stdint.h>  
  extern uint32_t SystemCoreClock;  
#endif  
#define configUSE_PREEMPTION                     1  //抢占式调度  
#define configSUPPORT_STATIC_ALLOCATION          0  //采用静态方式管理内存  
#define configSUPPORT_DYNAMIC_ALLOCATION         1  //采用动态方式管理内存  
#define configUSE_IDLE_HOOK                      0  //使能使用空闲任务钩子函数  
#define configUSE_TICK_HOOK                      0  //使能使用系统时钟中断节拍钩子函数  
#define configCPU_CLOCK_HZ                       ( SystemCoreClock )  //将CPU内核时钟设置为SYSTICK  
#define configTICK_RATE_HZ                       ((TickType_t)1000) //设置RTOS节拍中断频率  
#define configMAX_PRIORITIES                     ( 32 ) //设置任务的最大优先级数  
#define configMINIMAL_STACK_SIZE                 ((uint16_t)128)  //设置空闲任务的栈空间大小  
#define configTOTAL_HEAP_SIZE                    ((size_t)3072) //设置系统的动态内存大小,即为内存堆(Byte)  
#define configMAX_TASK_NAME_LEN                  ( 16 ) //设置任务名的最大字符数  
#define configUSE_TRACE_FACILITY                 1  //用于使能可视化的跟踪调试  
#define configUSE_16_BIT_TICKS                   0  //定义系统节拍计数器的数据类型,此时代表为uint32_t,反之为uint16_t  
#define configUSE_MUTEXES                        1  //用于使能互斥信号量  
#define configQUEUE_REGISTRY_SIZE                8  //用于定义可以注册的队列和信号量的最大数量  
#define configUSE_RECURSIVE_MUTEXES              1  //用于使能递归互斥信号量  
#define configUSE_COUNTING_SEMAPHORES            1  //用于使能计数型信号量  
#define configUSE_PORT_OPTIMISED_TASK_SELECTION  1  //选择下一个要执行的任务(通用方法&特殊方法)  
  
/* Co-routine definitions. */  
#define configUSE_CO_ROUTINES                    0  //用于启用协程模式  
#define configMAX_CO_ROUTINE_PRIORITIES          ( 2 )  //设置协程时的最大任务优先级数量  
  
/* Software timer definitions. */  
#define configUSE_TIMERS                         1  //启动软件定时器功能  
#define configTIMER_TASK_PRIORITY                ( 2 )  //设置软件定时器处理任务的优先级  
#define configTIMER_QUEUE_LENGTH                 10 //定义软件定时器队列的长度  
#define configTIMER_TASK_STACK_DEPTH             256  //设置软件定时器处理任务的栈空间大小  
  
/* 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_vTaskCleanUpResources       0 //可以回收删除任务后的资源  
#define INCLUDE_vTaskSuspend                1 //挂起任务  
#define INCLUDE_vTaskDelayUntil             1 //任务绝对延时  
#define INCLUDE_vTaskDelay                  1 //任务延时  
#define INCLUDE_xTaskGetSchedulerState      1 //获取任务调度器状态  
#define INCLUDE_xTimerPendFunctionCall      1 //将函数的执行挂到定时器服务任务  
#define INCLUDE_xQueueGetMutexHolder        1 //查看队列中的互斥信号量  
#define INCLUDE_uxTaskGetStackHighWaterMark 1 //获取任务堆栈历史剩余最小值  
#define INCLUDE_eTaskGetState               1 //获取任务状态  
  
/*  
 * The CMSIS-RTOS V2 FreeRTOS wrapper is dependent on the heap implementation used * by the application thus the correct define need to be enabled below */#define USE_FreeRTOS_HEAP_4  
  
/* Cortex-M specific definitions. */  
#ifdef __NVIC_PRIO_BITS  
 /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */  
 #define configPRIO_BITS         __NVIC_PRIO_BITS#else  
 #define configPRIO_BITS         4  
#endif  
  
/* The lowest interrupt priority that can be used in a call to a "set priority"  
function. */  
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY   15  
  
/* The highest interrupt priority that can be used by any interrupt service  
routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL  
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER  
PRIORITY THAN THIS! (higher priorities are lower numeric values. */  
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5  
  
/* Interrupt priorities used by the kernel port layer itself.  These are generic  
to all Cortex-M ports, and do not rely on any particular library functions. */  
#define configKERNEL_INTERRUPT_PRIORITY   ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )  
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!  
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */  
#define configMAX_SYSCALL_INTERRUPT_PRIORITY   ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )  
  
/* Normal assert() semantics without relying on the provision of an assert.h  
header file. */  
/* USER CODE BEGIN 1 */  
#define configASSERT( x ) if ((x) == 0) {taskDISABLE_INTERRUPTS(); for( ;; );}  
/* USER CODE END 1 */  
  
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS  
standard names. */  
#define vPortSVCHandler    SVC_Handler  
#define xPortPendSVHandler PendSV_Handler  
  
/* IMPORTANT: This define is commented when used with STM32Cube firmware, when the timebase source is SysTick,  
              to prevent overwriting SysTick_Handler defined within STM32Cube HAL */  
#define xPortSysTickHandler SysTick_Handler  
  
/* USER CODE BEGIN Defines */  
/* Section where parameter definitions can be added (for instance, to override default ones in FreeRTOS.h) */  
/* USER CODE END Defines */  
  
#endif /* FREERTOS_CONFIG_H */

点灯代码

/* USER CODE BEGIN Header */  
/**  
  ******************************************************************************  * File Name          : freertos.c  * Description        : Code for freertos applications  ******************************************************************************  * @attention  *  * <h2><center>&copy; Copyright (c) 2022 STMicroelectronics.  * All rights reserved.</center></h2>  *  * This software component is licensed by ST under Ultimate Liberty license  * SLA0044, the "License"; You may not use this file except in compliance with  * the License. You may obtain a copy of the License at:  *                             www.st.com/SLA0044  *  ******************************************************************************  *//* USER CODE END Header */  
  
/* Includes ------------------------------------------------------------------*/  
#include "FreeRTOS.h"  
#include "task.h"  
#include "main.h"  
#include "cmsis_os.h"  
  
/* Private includes ----------------------------------------------------------*/  
/* USER CODE BEGIN Includes */  
/* USER CODE END Includes */  
  
/* Private typedef -----------------------------------------------------------*/  
/* USER CODE BEGIN PTD */  
  
/* USER CODE END PTD */  
  
/* Private define ------------------------------------------------------------*/  
/* USER CODE BEGIN PD */  
#define LED1_ON() HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET)  
#define LED2_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET)  
#define LED1_OFF() HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET)  
#define LED2_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET)  
/* USER CODE END PD */  
  
/* Private macro -------------------------------------------------------------*/  
/* USER CODE BEGIN PM */  
/* USER CODE END PM */  
  
/* Private variables ---------------------------------------------------------*/  
/* USER CODE BEGIN Variables */  
/* USER CODE END Variables */  
/* Definitions for defaultTask */  
osThreadId_t defaultTaskHandle;  
const osThreadAttr_t defaultTask_attributes = {  
  .name = "defaultTask",  
  .priority = (osPriority_t) osPriorityLow1,  
  .stack_size = 128 * 4  
};  
/* Definitions for MYTASK01 */  
osThreadId_t MYTASK01Handle;  
const osThreadAttr_t MYTASK01_attributes = {  
  .name = "MYTASK01",  
  .priority = (osPriority_t) osPriorityLow1,  
  .stack_size = 128 * 4  
};  
  
/* Private function prototypes -----------------------------------------------*/  
/* USER CODE BEGIN FunctionPrototypes */  
  
/* USER CODE END FunctionPrototypes */  
  
void StartDefaultTask(void *argument);  
void myTask01(void *argument);  
  
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */  
  
/**  
  * @brief  FreeRTOS initialization  * @param  None  * @retval None  */void MX_FREERTOS_Init(void) {  
  /* USER CODE BEGIN Init */  
  
  /* USER CODE END Init */  
  /* USER CODE BEGIN RTOS_MUTEX */  /* add mutexes, ... */  /* USER CODE END RTOS_MUTEX */  
  /* USER CODE BEGIN RTOS_SEMAPHORES */  /* add semaphores, ... */  /* USER CODE END RTOS_SEMAPHORES */  
  /* USER CODE BEGIN RTOS_TIMERS */  /* start timers, add new ones, ... */  /* USER CODE END RTOS_TIMERS */  
  /* USER CODE BEGIN RTOS_QUEUES */  /* add queues, ... */  /* USER CODE END RTOS_QUEUES */  
  /* Create the thread(s) */  /* creation of defaultTask */  defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);  
  
  /* creation of MYTASK01 */  
  MYTASK01Handle = osThreadNew(myTask01, NULL, &MYTASK01_attributes);  
  
  /* USER CODE BEGIN RTOS_THREADS */  
  /* add threads, ... */  /* USER CODE END RTOS_THREADS */  
  /* USER CODE BEGIN RTOS_EVENTS */  /* add events, ... */  /* USER CODE END RTOS_EVENTS */  
}  
  
/* USER CODE BEGIN Header_StartDefaultTask */  
/**  
  * @brief  Function implementing the defaultTask thread.  * @param  argument: Not used  * @retval None  *//* USER CODE END Header_StartDefaultTask */  
void StartDefaultTask(void *argument)  
{  
  /* USER CODE BEGIN StartDefaultTask */  
  /* Infinite loop */  for(;;)  
  {  
    osDelay(100); //阻塞100ms  
    if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) == GPIO_PIN_RESET)  
    {  
      vTaskDelete(&MYTASK01Handle);  
    }  
  }  
  /* USER CODE END StartDefaultTask */  
}  
  
/* USER CODE BEGIN Header_myTask01 */  
/**  
* @brief Function implementing the MYTASK01 thread.  
* @param argument: Not used  
* @retval None  
*/  
/* USER CODE END Header_myTask01 */  
void myTask01(void *argument)  
{  
  /* USER CODE BEGIN myTask01 */  
  /* Infinite loop */  for(;;)  
  {  
    LED1_ON();  
    vTaskDelay(500);  //任务延时500ms  
    LED1_OFF();  
    osDelay(520); //阻塞520ms  
  }  
  /* USER CODE END myTask01 */  
}  
  
/* Private application code --------------------------------------------------*/  
/* USER CODE BEGIN Application */  
/* USER CODE END Application */  
  
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS学习(一) 的相关文章

  • FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)

    我们在前面单独介绍过FreeRTOS的任务通知和消息队列 但是在FreeRTOS中任务间的通讯还有信号量 邮箱 事件组标志等可以使用 这篇文章就这些成员与消息队列和任务通知的关系进行说明分析 增加邮箱部分 任务通知发送消息 Demo 202
  • FreeRTOS系列

    1 RTOS简介 RTOS全称为 Real Time Operation System 即实时操作系统 RTOS强调的是实时性 又分为硬实时和软实时 硬实时要求在规定的时间内必须完成操作 不允许超时 而软实时里对处理过程超时的要求则没有很严
  • ZYNQ中FreeRTOS中使用定时器

    使用普通的Timer中断方式时 Timer中断可以正常运行 但是UDP通信进程无法启动 其中TimerIntrHandler是中断服务程序 打印程序运行时间与从BRAM中读取的数据 void SetupInterruptSystem XSc
  • FreeRTOS学习笔记<中断>

    中断概念 Cortex M的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽中断 NMI 1个Systick 滴答定时器 定时器中断和多个系统异常 Cortex M处理器有多个用于管中断和异常的可编程寄存器 这些寄存器大多数都在 NV
  • FreeRTOS+CubeMX系列第一篇——初识FreeRTOS

    文章目录 一 关于FreeRTOS 二 FreeRTOS的特点 三 如何在CubeMX上配置FreeRTOS 四 FreeRTOS文档资料 五 同系列博客 一 关于FreeRTOS 1 什么是FreeRTOS FreeRTOS是一个迷你的实
  • 【FreeRTOS(三)】任务状态

    文章目录 任务状态 任务挂起 vTaskSuspend 取消任务挂起 vTaskResume 挂起任务调度器 vTaskSuspendAll 取消挂起任务调度器 xTaskResumeAll 代码示例 任务挂起 取消任务挂起 代码示例 挂起
  • freeRTOS使用uxTaskGetStackHighWaterMark函数查看任务堆栈空间的使用情况

    摘要 每个任务都有自己的堆栈 堆栈的总大小在创建任务的时候就确定了 此函数用于检查任务从创建好到现在的历史剩余最小值 这个值越小说明任务堆栈溢出的可能性就越大 FreeRTOS 把这个历史剩余最小值叫做 高水位线 此函数相对来说会多耗费一点
  • FreeRTOS_中断

    传送门 博客汇总帖 传送门 Cortex M3 中断 异常 传送门 Cortex M3笔记 基础 笔记内容参考 正点原子的FreeRTOS开发手册 cortex m3权威指南 Cortex M3和Cortex M4权威指南等 文中stm32
  • FreeRTOS:中断配置

    目录 一 Cortex M 中断 1 1中断简介 1 2中断管理简介 1 3优先级分组定义 1 4优先级设置 1 5用于中断屏蔽的特殊寄存器 1 5 1PRIMASK 和 FAULTMASK 寄存器 1 5 2BASEPRI 寄存器 二 F
  • 基于HAL库的FREERTOS-----------三.队列

    一 队列简介 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式 但是如果在使用操作系统的应用中用
  • FreeRTOS基础五:软件定时器

    软件定时器简介 软件定时器的作用 在指定的时间到来时执行指定的函数 或者以某个频率周期性地执行某个函数 被执行的函数叫做软件定时器回调函数 软件定时器由FreeRTOS内核实现 不需要硬件支持 软件定时器只有在软件定时器回调函数被调用时才需
  • STM32F103移植FreeRTOS必须搞明白的系列知识---2(FreeRTOS任务优先级)

    STM32F103移植FreeRTOS必须搞明白的系列知识 1 Cortex CM3中断优先级 STM32F103移植FreeRTOS必须搞明白的系列知识 2 FreeRTOS任务优先级 STM32F103移植FreeRTOS必须搞明白的系
  • 基于STM32的FreeRTOS学习之中断测试实验(五)

    记录一下 方便以后翻阅 本章内容是接着上一章节进行的实际演练 1 实验目的 FreeRTOS可以屏蔽优先级低于configMAX SYSCALL INTERRUPT PRIORITY的中断 不会屏蔽高于其的中断 本次实验就是验证这个说法 本
  • FreeRTOS轻量级同步--任务通知

    1 简介 在FreeRTOS的配置参数中的configUSE TASK NOTIFICATIONS宏打开 一般RTOS会默认打开 如图1所示 图1 notify宏开关 RTOS在创建任务时 会创建一个32位的通知值ulNotifiedVal
  • STM32 Freertos 添加 外部sram heap_5.c

    1 添加外部SRAM 初始化 2 添加heap 5 c 3 初始化heap 5 c 外部堆栈 Define the start address and size of the two RAM regions not used by the
  • FreeRTOSConfig.h 配置优化及深入

    本篇目标 基于上一篇的移植freertos stm32f4 freertos 上 修改 FreeRTOSConfig h 文件的相关配置来优化辅助 FreeRtos 的使用 并且建立一些基本功能 信号量 消息地列等 的简单应用位于 stm3
  • 当一个任务写入变量而其他任务读取该变量时,我们是否需要信号量?

    我正在研究 freeRtos 并且我有一个名为 x 的变量 现在 每秒只有一个任务正在写入该变量 而其他任务正在读取该变量值 我需要用互斥锁来保护变量吗 如果变量为 32 位或更小 并且其值是独立的并且不与任何其他变量一起解释 则不需要互斥
  • FreeRTOS 匈牙利表示法 [重复]

    这个问题在这里已经有答案了 我是 RTOS 和 C 编程的新手 而且我仍在习惯 C 的良好实践 因此 我打开了一个使用 FreeRTOS 的项目 我注意到操作系统文件使用匈牙利表示法 我知道一点符号 但面临一些新的 标准 FreeRTOS
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https

随机推荐

  • PilotPi:树莓派运行PX4配置方法

    直接看最后 即可 前言 PX4开源飞控固件支持很多款硬件 包括pixhawk cuav 和 cube等 在1 12版本中px4官方开始实验性的支持树莓派直接运行 这样我们就可以在树莓派上直接运行飞控程序 考虑到树莓派处理器的性能 那么就算可
  • PX4 1.12版本后启用lpe导致飞控启动失败的问题的解决办法

    时间 20220531 问题 在PX4 升级到1 12后使用local position estimator也就是LPE后会导致飞控启动失败 从SD卡的log中可以看到是硬件错误 解决办法 将文件 PX4Firmware根目录中的文件 pl
  • 多旋翼/四旋翼半物理(硬件在环HIL)仿真

    半物理仿真平台基本框架如图所示 多旋翼HIL平台结构图 其中 xff0c 最重要的也就是中间的部分 xff0c 一个是多旋翼模型 xff0c 另一个是传感器部分实现 硬件平台目前使用的是NI的myRIO xff08 临时的 xff09 xf
  • 如何编写VeriStand custom device/custom FPGA Target以及基本原理

    在做HIL开发的时候用到了FPGA xff0c 对于Labview中可以很方便的使用FPGA xff0c 但是在用VeriStand 做模型仿真的时候 xff0c 调用FPGA就没呢么方便了 感觉就是功能还没有完善 如果想要在Labview
  • 提高github下载速度的方法【100%有效】可达到2MB/s

    在国内从github上面下载代码的速度峰值通常都是20kB s 这种速度对于那些小项目还好 xff0c 而对于大一些的并且带有很多子模块的项目来讲就跟耽误时间 虽然有很多提速的方法 xff0c 但是实际用起来并不稳定 这里提供一种新的方法
  • 如何理解选主元的Doolittle分解法

    书中讲解不是很详细 xff0c 理解之后总结一下 首先说一下 xff0c 之所以要理解选主元的Doolittle分解是因为书中对于该分解过程的讲解比较违和 本文的目的是为了说明 xff1a 选主元的Doolittle分解法分解得到的LU矩阵
  • Latex中插入eps图片不显示,显示空白

    Latex中插入eps图片变异后 xff0c 生成的pdf文件中 xff0c 图片为空白 在文章开头 documentclas 后面添加如下代码即可 usepackage graphicx usepackage epstopdf 或者 us
  • C/C++ 信号量 CreateSemaphore 用法

    HANDLE CreateSemaphore LPSECURITY ATTRIBUTES lpSemaphoreAttributes SD LONG lInitialCount initial count LONG lMaximumCoun
  • 单片机寄存器的位操作

    1 连续多位需要操作 假如需要将B16的D8 D10位改为0001 xff0c 但是更改D8 D10位时又不能改变其它位状态 xff1a 所以需要先将D8 D10位 清0 xff0c 再改为0001 PORTB gt PCR 16 amp
  • DockerFile编写、加载、镜像保存、上传阿里云镜像

    DockerFile用来构建docker镜像文件 指令 说明 FROM 指定基础镜像 MAINTAINER 镜像是谁写的 xff0c 姓名 43 邮箱 RUN 镜像构建的时候需要运行的命令 ADD 将本地文件添加到容器中 xff0c tar
  • 手把手教你写一个属于自己的库

    写在前面 xff1a 本文章使用devc 43 43 xff0c 若用VC的别进来 xff01 如果你不知道怎么写库 xff0c 请参考我这篇文章 xff1a 手把手教你建立c 43 43 个人库 在新建好库文件之后 xff0c 我们就可以
  • warning: libopencv_imgcodecs.so.3.2, needed by /...warning: libpng12.so.0, needed by /usr/local/lib/

    warning libopencv imgcodecs so 3 2 needed by opt ros melodic lib libcv bridge so may conflict with libopencv imgcodecs s
  • /usr/bin/ld: warning: libopencv_imgcodecs.so.3.2, needed by /usr/lib/x86_64-linux-gnu/libopencv_high

    出现一个警告信息 xff0c 暂时不管 usr bin ld warning libopencv imgcodecs so 3 2 needed by usr lib x86 64 linux gnu libopencv highgui s
  • 灰度图像二值化-----c++实现

    前天闲着没事干 xff0c 就写了写BMP图像处理 xff0c 感觉大家还比较感兴趣 所以现在没事 xff0c 继续更新 这次简单的写了灰度图像二值化 这是什么概念呢 xff1f 图像的二值化的基本原理 图像的二值化处理就是将图像上的点的灰
  • 3D打印情况记录(1)

    打印情况记录 xff08 1 xff09 打印参数打印结果 打印参数 切片软件MakerBot Print xff0c 温度195 xff0c 材料白色pla xff0c 外壳打印速度40mm s xff0c 内衬打印速度稀疏30mm s
  • 【在VScode中使用终端命令编译运行c++程序】

    在VScode下的powershell下使用命令行编译运行c 43 43 文件 xff1a 首先 xff0c 进入文件所在的路径地址 xff1a 编译生成 exe可执行文件的不同方式 xff1a 不指定生成可执行文件的名称 xff1a 执行
  • 连接字符串strcat()函数

    strcat 函数的原型 xff1a span class hljs preprocessor include lt string h gt span span class hljs keyword char span span class
  • makefile '@' '$' '$$' '-' '-n ' 使用小结

    编译代码时 xff0c 会进程接触makefile xff0c 会涉及到一些符号 xff0c 由于不明白有些意思经常出现问题 xff0c 在此归纳一下 39 64 39 符号的使用 通常makefile会将其执行的命令行在执行前输出到屏幕上
  • 【STM32】RTC实时时钟,步骤超细详解,一文看懂RTC

    什么是RTC RTC Real Time Clock xff1a 实时时钟 RTC是个独立的定时器 RTC模块拥有一个连续计数的计数器 xff0c 在相应的软件配置下 xff0c 可以提供时钟日历的功能 修改计数器的值可以重新设置当前时间和
  • FreeRTOS学习(一)

    前言 最近正在学习和FreeRTOS相关的知识 xff0c 在此记录一下 xff0c 学习资料来自正点原子 在学习之前 xff0c 我也有一个和很多初学者共同的疑惑 Why RTOS xff1f 在探究这个问题之前 xff0c 我想先回顾一