FreeRTOS cpu利用率简单介绍

2023-05-16

1. CPU 利用率简介

CPU 使用率其实就是系统运行的程序占用的 CPU 资源,表示机器在某段时 间程序运行的情况,如果这段时间中,程序一直在占用 CPU 的使用权,那么可 以认为 CPU 的利用率是 100%。CPU 的利用率越高,说明机器在这个时间上运行 了很多程序,反之较少。利用率的高低与 CPU 强弱有直接关系,就像一段一模 一样的程序,如果使用运算速度很慢的 CPU,它可能要运行 1000ms,而使用很 运算速度很快的 CPU 可能只需要 10ms,那么在 1000ms 这段时间中,前者的 CPU 利用率就是 100%,而后者的 CPU 利用率只有 1%,因为 1000ms 内前者都 在使用 CPU 做运算,而后者只使用 10ms 的时间做运算,剩下的时间 CPU 可以 做其他事情。 FreeRTOS 是多任务操作系统,对 CPU 都是分时使用的:比如 A 任务占用 10ms,然后 B 任务占用 30ms,然后空闲 60ms,再又是 A 任务占 10ms,B 任 务占 30ms,空闲 60ms;如果在一段时间内都是如此,那么这段时间内的利用率 为 40%,因为整个系统中只有 40%的时间是 CPU 处理数据的时间。 FreeRTOS 是一个很完善很稳定的操作系统,当然也给我们提供测量各个任 务占用 CPU 时间的函数接口,我们可以知道系统中的每个任务占用 CPU 的时 间,从而得知系统设计的是否合理,出于性能方面的考虑,有的时候,我们希望 知道 CPU 的使用率为多少,进而判断此 CPU 的负载情况和对于当前运行环境是 否能够“胜任工作”。所以,在调试的时候很有必要得到当前系统的 CPU 利用 率相关信息,但是在产品发布的时候,就可以把 CPU 利用率统计这个功能去掉, 因为使用任何功能的时候,都是需要消耗系统资源的,FreeRTOS 是使用一个外 部的变量进行统计时间的,并且消耗一个高精度的定时器,其用于定时的精度是 系统时钟节拍的 10-20 倍,比如当前系统时钟节拍是 1000HZ,那么定时器的计 数节拍就要是 10000-20000HZ。而且 FreeRTOS 进行 CPU 利用率统计的时候, 也有一定缺陷,因为它没有对进行 CPU 利用率统计时间的变量做溢出保护,我 们使用的是 32 位变量来系统运行的时间计数值,而按 20000HZ 的中断频率计 算,每进入一中断就是 50us,变量加一,最大支持计数时间:2^32 * 50us / 3600s =59.6 分钟,运行时间超过了 59.6 分钟后统计的结果将不准确,除此之外整个 系统一直响应定时器 50us 一次的中断会比较影响系统的性能。 385 用户想要使用 CPU 利用率统计的话,需要自定义配置一下,首先在 FreeRTOSConfig.h 配置与系统运行时间和任务状态收集有关的配置选项,并且 实现 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() 与 portGET_RUN_TIME_COUNTER_VALUE()这两个宏定义,具体如下。

然后需要实现一个中断频率为 10000HZ 定时器,用于系统运行时间统计, 其实很简单,只需将 CPU_RunTime 变量自加即可,这个变量是用于记录系统运 行时间的,中断服务函数具体如下。

volatile uint32_t CPU_RunTime = 0UL;
/********************************************************************
***********
* 函 数 名 : TIM6_IRQHandler
* 函数功能 : TIM6 中断函数
* 输 入 : 无
* 输 出 : 无
*********************************************************************
**********/
void TIM6_IRQHandler(void)
{
386
if(TIM_GetITStatus(TIM6,TIM_IT_Update))
{
CPU_RunTime++;
}
TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
}

2.整体代码

1.time.c

#include "time.h"
#include "usart.h"

/*******************************************************************************
* 函 数 名         : TIM4_Init
* 函数功能           : TIM4初始化函数
* 输    入         : per:重装载值
                     psc:分频系数
* 输    出         : 无
*******************************************************************************/
void TIM4_Init(u16 per,u16 psc)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟
    
    TIM_TimeBaseInitStructure.TIM_Period=per;   //自动装载值
    TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
    TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
    
    TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //开启定时器中断
    TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
    
    NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;//定时器中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=4;//抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;        //子优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    
    
    TIM_Cmd(TIM4,ENABLE); //使能定时器    
}

/*******************************************************************************
* 函 数 名         : TIM4_IRQHandler
* 函数功能           : TIM4中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void TIM4_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM4,TIM_IT_Update))
    {
        printf("TIM4输出.......\r\n");
    }
    TIM_ClearITPendingBit(TIM4,TIM_IT_Update);    
}


/*******************************************************************************
* 函 数 名         : TIM3_Init
* 函数功能           : TIM3初始化函数
* 输    入         : per:重装载值
                     psc:分频系数
* 输    出         : 无
*******************************************************************************/
void TIM3_Init(u16 per,u16 psc)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3时钟
    
    TIM_TimeBaseInitStructure.TIM_Period=per;   //自动装载值
    TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
    
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //开启定时器中断
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
    
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//定时器中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=5;//抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;        //子优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    
    
    TIM_Cmd(TIM3,ENABLE); //使能定时器    
}

/*******************************************************************************
* 函 数 名         : TIM3_IRQHandler
* 函数功能           : TIM3中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void TIM3_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM3,TIM_IT_Update))
    {
        printf("TIM3输出.......\r\n");
    }
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);    
}


/*******************************************************************************
* 函 数 名         : TIM6_Init
* 函数功能           : TIM6初始化函数
* 输    入         : per:重装载值
                     psc:分频系数
* 输    出         : 无
*******************************************************************************/
void TIM6_Init(u16 per,u16 psc)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);//使能TIM3时钟
    
    TIM_TimeBaseInitStructure.TIM_Period=per;   //自动装载值
    TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
    TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStructure);
    
    TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //开启定时器中断
    TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
    
    NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;//定时器中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=5;//抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;        //子优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    
    
    TIM_Cmd(TIM6,ENABLE); //使能定时器    
}

volatile uint32_t CPU_RunTime = 0UL;
/*******************************************************************************
* 函 数 名         : TIM6_IRQHandler
* 函数功能           : TIM6中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void TIM6_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM6,TIM_IT_Update))
    {
        CPU_RunTime++;
    }
    TIM_ClearITPendingBit(TIM6,TIM_IT_Update);    
}

2.main.c

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "FreeRTOS.h"
#include "task.h"
#include "key.h"
#include "time.h"
#include "string.h"


//任务优先级
#define START_TASK_PRIO        1
//任务堆栈大小    
#define START_STK_SIZE         128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);

//任务优先级
#define LED1_TASK_PRIO        2
//任务堆栈大小    
#define LED1_STK_SIZE         50  
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);

//任务优先级
#define LED2_TASK_PRIO        3
//任务堆栈大小    
#define LED2_STK_SIZE         50  
//任务句柄
TaskHandle_t LED2Task_Handler;
//任务函数
void led2_task(void *pvParameters);


//任务优先级
#define CPU_TASK_PRIO        4
//任务堆栈大小    
#define CPU_STK_SIZE         512  
//任务句柄
TaskHandle_t CPUTask_Handler;
//任务函数
void CPU_task(void *pvParameters);


/*******************************************************************************
* 函 数 名         : main
* 函数功能           : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
int main()
{
    SysTick_Init(72);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
    LED_Init();
    KEY_Init();
    USART1_Init(115200);
    TIM6_Init(100-1,72-1);//定时0.1ms
    printf("FreeRTOS CPU利用率统计\r\n");
    //创建开始任务
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
    vTaskStartScheduler();          //开启任务调度
}

//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
                             
    //创建LED1任务
    xTaskCreate((TaskFunction_t )led1_task,     
                (const char*    )"led1_task",   
                (uint16_t       )LED1_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )LED1_TASK_PRIO,
                (TaskHandle_t*  )&LED1Task_Handler);

    //创建LED2任务
    xTaskCreate((TaskFunction_t )led2_task,     
                (const char*    )"led2_task",   
                (uint16_t       )LED2_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )LED2_TASK_PRIO,
                (TaskHandle_t*  )&LED2Task_Handler);
    
    //创建CPU任务
    xTaskCreate((TaskFunction_t )CPU_task,     
                (const char*    )"CPU_task",   
                (uint16_t       )CPU_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )CPU_TASK_PRIO,
                (TaskHandle_t*  )&CPUTask_Handler);
    
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
} 

//LED1任务函数
void led1_task(void *pvParameters)
{
    while(1)
    {
        LED1=0;
        vTaskDelay(200);
        printf("LED1_Task Running,LED2_ON\r\n");
        LED1=1;
        vTaskDelay(800);
        printf("LED1_Task Running,LED2_OFF\r\n");
    }
}

//LED2任务函数
void led2_task(void *pvParameters)
{
    while(1)
    {
        LED2=0;
        vTaskDelay(800);
        printf("LED2_Task Running,LED2_ON\r\n");
        LED2=1;
        vTaskDelay(200);
        printf("LED2_Task Running,LED2_OFF\r\n");
    }
}

//CPU任务函数
void CPU_task(void *pvParameters)
{
    uint8_t CPU_RunInfo[400];//保存任务运行时间信息
    
    while(1)
    {
        memset(CPU_RunInfo,0,400);//信息缓冲区清零
        vTaskList((char *)&CPU_RunInfo);  //获取任务运行时间信息
        
        printf("---------------------------------------------\r\n");
        printf("任务名      任务状态 优先级   剩余栈 任务序号\r\n");
        printf("%s", CPU_RunInfo);
        printf("---------------------------------------------\r\n");

        memset(CPU_RunInfo,0,400);                //信息缓冲区清零

        vTaskGetRunTimeStats((char *)&CPU_RunInfo);

        printf("任务名       运行计数         利用率\r\n");
        printf("%s", CPU_RunInfo);
        printf("---------------------------------------------\r\n\n");
        vTaskDelay(1000);   /* 延时1000个tick */
    }
}

3.实验现象

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS cpu利用率简单介绍 的相关文章

  • 【Oracle】ORA-28000解决方法

    ORA 28000 账号被锁定 错误原因 xff1a 数据库中设置了密码最 错误次数为10次 xff0c 超过10次后导致账号被锁定 解决方案1 xff1a 1 查看 户使 的概要 件名 xff0c 般为DEFAULT SELECT USE
  • dpkg命令的用法

    dpkg命令的用法 dpkg 是Debian package的简写 xff0c 为 Debian 操作系统 专门开发的套件管理系统 xff0c 用于软件的安装 xff0c 更新和移除 所有源自 34 Debian 34 的Linux的发行版
  • 关于正则表达式的学习

    今天在写cpp题目的时候被字符串搜索恶心坏了 于是乎开始自学正则表达式 正则regex其实就是一个规范化的模板字符串 第一条 基础语法和注意事项 另外 在使用转义特殊字符的时候 要用到两个 才能有效果 b才代表一个数字 才能代表一个 34
  • 扩展卡尔曼滤波(EKF)

    本篇文章是看完http blog csdn net adamshan article details 78265754这篇文章后再加上自己的理解写的 xff0c 如果侵权可以联系我删除 xff0c 如果有不对的地方请您不啬赐教 xff01
  • OVS 基本操作命令

    1 ovs vsctl获取或者更改ovs vswitchd的配置信息 xff0c 此工具操作的时候会更新ovsdb server中的数据库 查看网桥 ovs vsctl show 添加网桥 ovs vsctl add br br0 创建po
  • 解决c++string类型变量无法输出中文的问题(环境:mingw+vscode)

    我也是在网上找了好久解决办法 其实很简单在visual code终端中输入chcp 936即可
  • 利用ros进行双目相机标定(发布双目相机话题再用cameracalibrator.py文件进行标定)

    1 创建工作环境 mkdir p opencv test src cd opencv test src catkin create pkg stereo camera std msgs roscpp rospy 2 修改CMakeLists
  • 串级PID 位置环+速度环

    1位置环和速度环的串级pid xff0c 首先要记住 xff0c 位置环的输出是速度环的输入 xff0c 最后控制输出为速度环的输出 速度环的PID控制器 代码如下 float Velocity KP A 61 400 Velocity K
  • 通过蓝点无限的学习,对UWB实现的过程以及对UWB连接WIFI的遇到的问题进行复盘

    超宽带 xff08 Ultra Wide Band xff0c UWB xff09 技术是一种无线载波通信技术 xff0c 它不采用正弦载波 xff0c 而是利用纳秒级的非正弦波窄脉冲传输数据 xff0c 因此其所占的频谱范围很宽 UWB技
  • Java——this关键字

    关于Java语言当中的this关键字 xff1a 1 this是一个关键字 xff0c 翻译为 xff1a 这个 2 this是一个引用 xff0c this是一个变量 xff0c this变量中保存了内存地址指向了自身 xff0c thi
  • 【开源“青女四轴”,DIY小四轴】

    开源 青女四轴 xff0c DIY小四轴 简介说明明确难点如何解决动态调节每个电机的升力 xff1f 硬件原理图如下 程序设计步骤建议最终程序声明 简介 四轴和遥控的主控芯片均为STM32F103C8T6 此开源项目为 从硬件设计到飞控的代
  • 实测 (二)NVIDIA Xavier NX + D435i / 奥比中光Astrapro 相机+ ORB-SLAM 2 + 3 稠密回环建图

    开发环境 xff1a NX 43 Ubuntu18 04 43 ROS melodic 接着上篇 xff0c 开始orb slam2稠密回环建图 二 NX 43 D435i 43 ORB SLAM2 稠密回环建图 先上效果图 这里感谢大神提
  • ubuntu 启用root用户及root用户远程登陆

    介绍 ubuntu安装好的时候你设置的用户并不是拥有最高权限的用户 xff0c 而最高权限的用户root需要你来启用他 xff01 如果用自己设置的用户会比较麻烦 xff0c 经常需要在命令前面加上 sudo xx 做法 1 首先右键开启一
  • 实测 (四)NVIDIA Xavier NX + D435i / 奥比中光Astrapro 相机+ ORB-SLAM 2 + 3 稠密回环建图

    来了 xff01 接着上篇 xff0c 开始orb slam3 的稠密回环建图实测 xff08 奥比中光Astrapro 相机 xff09 老样子 xff0c 先上效果图 xff1a 开发环境 xff1a NX 43 Ubuntu18 04
  • 无人机组装调试教程

    无人机 北郊强哥笔记 多轴飞行器如何称得上无人机 xff1f 关键在飞控 xff1a 飞控包括低端飞控 xff08 如kk xff0c QQ xff0c cc3D xff09 和智能化飞控 xff08 如APNM NAZA PIXHAWK
  • 51和STM32的Keil环境搭建

    前言 笔者由于竞赛需要 xff0c 最近开始学习STM32H7系列芯片 xff0c 由于之前并没有学习过32 xff0c 且51也是较早时期学习 xff0c 对于一些概念一知半解 xff0c 没有得到很好的吸收 xff0c 所以在基础较差的
  • 【STM32】滴答时钟24位递减计数器系统时钟【SystTick】

    SysTick定时器 xff0c 也叫滴答定时器或者系统定时器 SysTick 系统定时器是属于CM3内核中的一个外设 xff0c 内嵌在NVIC中 系统定时器是一个24位的向下递减的计数器 xff0c 计数器每计数一次的时间为1 SYSC
  • Opencv通道

    Opencv通道 1 拆分通道 1 拆分一个BGR图像 使用split b g r 61 cv2 split bgr image b B通道图像 g G通道图像 r R通道图像 注意 xff1a 顺序不能变 xff01 xff01 xff0
  • STM32入门100步

    目录 1 C8T6引脚图 2 电路基础 1 IO口静态特性 xff1a 2 上下拉电阻 3 STM32官网 xff1a 4 内核与存储器 5 时钟 复位和电源管理 6 低功耗和ADC 7 DMA和IO端口 8 调试模式和定时器 9 看门狗和
  • 【语音去噪】谱减法+维纳滤波+卡尔曼滤波语音去噪【含Matlab源码 1881期】

    一 谱减法 维纳滤波 卡尔曼滤波语音去噪简介 1 维纳滤波算法 在传统的去噪算法中 维纳滤波因其操作简单 去噪效果好 被公认为一种经典的去噪算法 语音信号在时域的表示为 yi t si t ni t 其中si t ni t 和yi t 分别

随机推荐

  • 【VRP】节约里程算法求解车辆路径规划问题【含Matlab源码 1166期】

    一 VRP简介 1 VRP基本原理 车辆路径规划问题 Vehicle Routing Problem VRP 是运筹学里重要的研究问题之一 VRP关注有一个供货商与K个销售点的路径规划的情况 可以简述为 对一系列发货点和收货点 组织调用一定
  • 【滤波跟踪】扩展卡尔曼滤波器IMU和GPS数据计算无人机的姿态【含Matlab源码 2531期】

    一 简介 针对室内定位中的非视距 Non Line of Sight NLOS 现象 提出一个新型算法进行识别 同时有效缓解其影响 主要通过超宽带 Ultra Wideband UWB 定位系统与惯性导航系统 Inertial Naviga
  • 从烧录系统开始Jetson Nano无人车开发记录

    从烧录系统开始Jetson Nano无人车开发记录 xff08 一 xff09 本章介绍硬件选型与系统烧录环境配置 前言 搭建一个四轮麦克纳姆移动机器人平台 xff0c 用于团队日常学习 xff0c 算法复现和开发 将在下文详细介绍从系统烧
  • 把当前ubuntu18.0.4系统做成镜像

    先下载remastersys wget ftp ftp gwdg de pub linux easyvdr mirror remastersys ubuntu remastersys remastersys 3 0 4 2 all deb
  • 批量修改YOLO数据集镜面后的labels和解决Python中bug

    在Python3 8环境下用OpenMV对yolo数据集进行数据增强 镜面转换时 xff0c 打算直接批量修改镜像前txt里的某值作为镜像后的labels 但发现有bug的风险 xff0c 于是把代码移植到Python控制台 上图看出将字符
  • python中的模块与包详解

    目录 一 什么是模块 二 模块的导入 1 import 模块名 2 from 模块名 import 功能名 3 from 模块名 import 4 as定义别名 模块导入总结 三 自定义模块 制作自定义模块 用pycharm演示 测试模块
  • 【C语言】冒泡排序算法和冒泡排序的时间复杂度

    提示 xff1a 冒泡排序算法是非常重要的算法 xff0c 一定要熟练掌握 思路可以参考一位大佬博主的博客 xff1a 帅地 介绍的十分详细 xff0c 理解了之后 xff0c 可以参考我的代码 xff0c 是入门级别的 xff0c 比较好
  • Vbox遇到“Destination host unreachable“问题的解决之法

    在上一篇 虚拟机的网络配置与连接 中 xff0c 有讲述到Vmware遇到Destination host unreachable 问题的解决之法 xff0c 而这一篇文章我将说到Vbox的遇到 34 Destination host un
  • 以太网链路聚合与VRRP

    文章目录 一 以太网链路聚合1 1 链路聚合的含义以及作用1 2 链路聚合的配置 二 VRRP2 1 VRRP概述2 2VRRP术语2 3 VRRP工作原理2 4 VRRP的基本配置2 5VRRP总结 三 总结 一 以太网链路聚合 1 1
  • Ubuntu 20.04 系统迁移

    一 前言 现实工作中需要在Intel NUC上装一个Ubuntu 20 04系统 xff0c 并运行ROS以及相关的很多功能包 xff0c 但如果直接安装新新系统 xff0c 之前的大量环境变量要重新去配置 xff0c 所以考虑说将原先的U
  • 电大计算机考试答案

    中央电大计算机基础考试题库大全 基础知识 单选题 1 自计算机问世至今已经经历了四个时代 xff0c 划分时代的主要依据是计算机的 A 规模 B 性能 C 功能 D 构成元件答案 D 2 当前的计算机一般被认为是第四代计算机 xff0c 它
  • 用opencv识别颜色并输出坐标

    1首先安装opencv pip install opencv python 参考https blog csdn net qq 42114833 article details 128648458 spm 61 1001 2014 3001
  • ROS开发(ubuntu)笔记·1

    学习网址 xff1a Introduction GitBook autolabor com cn b站 xff1a 奥特学园 ROS机器人入门课程 ROS理论与实践 零基础教程 哔哩哔哩 bilibili 创建一个ROS Workspace
  • ROS通信机制~话题通信(Publisher&Subscriber)·笔记2

    系列文章目录 xff1a ROS开发 xff08 ubuntu xff09 笔记 1 嘻 嘻的博客 CSDN博客 ROS通信机制 服务通信 server amp client 笔记3 嘻 嘻的博客 CSDN博客 话题通信 理论模型 xff1
  • SDL2.0在linux/ubuntu系统中更新使用指导

    前言 个人喜好原因 xff0c 写OpenGL的程序都喜欢用SDL做框架 xff0c 没有Qt那么臃肿 xff0c 也没有glut那么坑跌 在不失灵活性的情况下保持了自己的轻量 SDL2 0在今年很早的时候时候就发布了 xff0c 几天就来
  • Tensorflow-gpu安装教程(window11和window10一样)

    1 安装最新版Pycharm xff08 最常见的编译器 xff09 下载官网 xff1a https www jetbrains com pycharm 可以安装到D盘 xff0c 版本免费社区版就行 xff0c 推荐装最新版 2 安装最
  • T265 安装(Realsense SDK和Realsense-ros)

    一 写在前面 硬件配置 xff1a Jeston xavier NX 机载电脑 xff0c 板载6002E 设备如图 xff1a T265双目摄像头 二 Realsense SDK和Realsense ros的介绍 在我看来 xff0c R
  • SysTick 定时器的使用

    手册说明 代码模块 SysTick h ifndef SysTick H define SysTick H include 34 system h 34 void SysTick Init u8 SYSCLK void delay us u
  • FreeRTOS互斥量的实验

    互斥量又称互斥信号量 xff08 本质是信号量 xff09 xff0c 是一种特殊的二值信号量 xff0c 它和 信号量不同的是 xff0c 它支持互斥量所有权 递归访问以及防止优先级翻转的特性 xff0c 用于实现对临界资源的独占式处理
  • FreeRTOS cpu利用率简单介绍

    1 CPU 利用率简介 CPU 使用率其实就是系统运行的程序占用的 CPU 资源 xff0c 表示机器在某段时 间程序运行的情况 xff0c 如果这段时间中 xff0c 程序一直在占用 CPU 的使用权 xff0c 那么可 以认为 CPU