STM32F103C8T6-基于FreeRTOS系统实现步进电机控制
引言
上一篇文章讲述了如何使用蓝牙连接stm32进行数据收发控制步进电机,这篇在之前的基础上通过移植操作系统(FreeRTOS或者其他的也可以,原理操作都类似)实现步进电机控制。
上篇博客指路:STM32蓝牙连接Android实现云端数据通信(电机控制-开源)_从蓝牙获取信息 发送到云端-CSDN博客https://blog.csdn.net/m0_74325713/article/details/146500274?spm=1011.2124.3001.6209
FreeRTOS介绍
(简单讲一下)
FreeRTOS 是一款开源的实时操作系统(Real-Time Operating System, RTOS),专为嵌入式系统和微控制器(MCU)设计。
核心特性
轻量级:内核代码仅需几 KB 内存,适合资源受限的微控制器(如 ARM Cortex-M、ESP32、AVR 等)。
可移植性:支持 40+ 种处理器架构,通过抽象层适配不同硬件平台。
实时性:提供确定性的任务调度机制,满足硬实时(Hard Real-Time)或软实时(Soft Real-Time)需求。
模块化设计:核心功能简洁,可通过插件扩展(如 TCP/IP 协议栈、文件系统、低功耗支持等)。
核心功能模块
任务(Tasks)
多任务并发执行,每个任务是一个独立的线程。
任务优先级可配置,支持抢占式调度(Preemptive)或协作式调度(Cooperative)。
调度器(Scheduler)
抢占式调度:高优先级任务可中断低优先级任务。
时间片轮转:同优先级任务按时间片分配 CPU。
支持协程(Coroutines,轻量级任务)。
同步与通信
队列(Queues):任务间传递数据的 FIFO 缓冲区,支持阻塞式读写。
信号量(Semaphores):二进制/计数信号量,用于资源管理和任务同步。
互斥量(Mutexes):防止资源竞争的互斥锁。
事件组(Event Groups):任务间事件通知机制。
内存管理
提供动态内存分配算法(如 heap_1 到 heap_5),支持不同场景的需求。
可自定义内存分配策略以适配硬件。
中断管理
中断服务程序(ISR)与任务间的高效通信。
延迟中断处理(Deferred Interrupt Handling)机制,减少中断延迟。
软件定时器
基于任务调度的软件定时器,支持单次或周期性触发回调函数。
功能实现
主要涉及以下五点功能:
1. 蓝牙通信:通过 USART 接收蓝牙指令,解析指令并执行相应的操作。
2. 步进电机控制:根据接收到的指令控制电机的启动、停止、转动方向和速度。
3. OLED 显示:实时显示电机的状态,如当前速度、运行模式等。
4. FreeRTOS 任务管理:使用 RTOS 管理不同的任务,即蓝牙数据处理和电机控制。
5. 中断处理:利用 TIM 定时器中断驱动步进电机的步进操作,确保精确的时序控制。
CubeMAX配置
这里只展示新增部分,其他部分配置和上篇博客中配置基本一致。
STM32蓝牙连接Android实现云端数据通信(电机控制-开源)_从蓝牙获取信息 发送到云端-CSDN博客
时钟基
选择 FREERTOS 系统 CMSIS_V2 版本。
列表添加对应蓝牙、电机控制的任务,主要优先级问题。(OLED也可以添加,感兴趣的朋友可以都加进去)
Keil函数添加
加入oled,motor相关函数,在usart.c补充回调函数。主函数中补充中断回调函数。基本把上篇博客的代码复制粘贴过去就可以用。oled.c、oled.h、oledfont.h 上篇全部给出,这里就不在重复写了。
motor.c 和 motor.h
#include "motor.h"const uint16_t step_sequence[] = {GPIO_PIN_8, // Step 1: IN1GPIO_PIN_8 | GPIO_PIN_9, // Step 2: IN1+IN2GPIO_PIN_9, // Step 3: IN2GPIO_PIN_9 | GPIO_PIN_12, // Step 4: IN2+IN3GPIO_PIN_12, // Step 5: IN3GPIO_PIN_12 | GPIO_PIN_13, // Step 6: IN3+IN4GPIO_PIN_13, // Step 7: IN4GPIO_PIN_13 | GPIO_PIN_8 // Step 8: IN4+IN1
};volatile uint8_t current_step = 0; // 当前步序号(volatile确保中断中可见)
volatile int8_t direction = 1; // 方向(1正转,-1反转)
volatile int32_t steps_remaining = 0; // 剩余步数
volatile uint8_t continuous_mode = 0; // 连续旋转模式标志 1-持续 0-停止
uint32_t current_speed = 100; // 当前速度(步/秒)volatile uint32_t steps_divider = 1; // 步进分频系数(实际速度=1000Hz/steps_divider)
volatile uint32_t step_counter = 0; // 步进计数器// 速度控制---PSC=72-1 ARR=999 HCLK=72MHZvoid Set_Stepper_Speed(uint32_t speed_steps)
{// 限速if(speed_steps < 10) speed_steps = 10; // 最低10步/秒if(speed_steps > 1000) speed_steps = 1000; // 最高1000步/秒// 更新当前速度current_speed = speed_steps;// 计算分频系数uint32_t new_divider = (1000 + speed_steps / 2) / speed_steps;if(new_divider < 1) new_divider = 1; // 允许最大速度steps_divider = new_divider;// 显示更新uint8_t speed_str[5];snprintf((char*)speed_str, sizeof(speed_str), "%4lu", speed_steps);OLED_show_string(4,1, speed_str);printf("Speed: %lu\n", speed_steps);
}
#ifndef _MOTOR_H_
#define _MOTOR_H_#include <stdint.h>
#include "stm32f1xx_hal.h"
#include "stdio.h"
#include "oled.h"extern const uint16_t step_sequence[8];extern volatile uint8_t current_step;
extern volatile int8_t direction;
extern volatile int32_t steps_remaining;
extern volatile uint8_t continuous_mode;
extern uint32_t current_speed;
extern volatile uint32_t steps_divider;
extern volatile uint32_t step_counter;#define SPEED_STEP 100 // 设定固定步长void Set_Stepper_Speed(uint32_t speed_steps);#endif
usart.c(结尾添加回调函数) usart.h(声明变量)
/* USER CODE BEGIN 1 */
volatile uint8_t rdata;
volatile uint8_t rflag = 0;void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {if (huart == &huart1) {rflag = 1;HAL_UART_Receive_IT(&huart1, (uint8_t*)&rdata, 1);}
}/* USER CODE END 1 */
// UART接收缓存
extern volatile uint8_t rdata;
extern volatile uint8_t rflag;void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
主函数中,中断回调函数补充内容。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{/* USER CODE BEGIN Callback 0 *//* USER CODE END Callback 0 */if (htim->Instance == TIM4) {HAL_IncTick();}/* USER CODE BEGIN Callback 1 */if (htim->Instance == TIM2) {step_counter++;if (step_counter >= steps_divider && (steps_remaining > 0 || continuous_mode)) {step_counter = 0;GPIOB->ODR &= ~(GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_12 | GPIO_PIN_13);GPIOB->ODR |= step_sequence[current_step];current_step = (current_step + direction + 8) % 8;if (!continuous_mode) steps_remaining--;if (!continuous_mode && steps_remaining <= 0) {HAL_TIM_PWM_Stop_IT(&htim2, TIM_CHANNEL_1);GPIOB->ODR &= ~(GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_12 | GPIO_PIN_13);}}}/* USER CODE END Callback 1 */
}
freertos.c 中补充任务函数调用。
void StartBluetoothTask(void *argument)
{/* USER CODE BEGIN StartBluetoothTask *//* Infinite loop */OLED_show_string(1, 1, "28BYJ-48:");HAL_UART_Receive_IT(&huart1, (uint8_t *)&rdata, 1);for (;;){if (rflag == 1){rflag = 0;if (rdata == 'm') {continuous_mode = 1;direction = 1;printf("START\n");OLED_show_string(2, 1, "START ");}else if (rdata == 'n') {continuous_mode = 0;steps_remaining = 0;printf("STOP\n");OLED_show_string(2, 1, "STOP ");}else if (rdata == 'j' || rdata == 'k') {if (rdata == 'j') {current_speed += SPEED_STEP;} else {current_speed = (current_speed > SPEED_STEP) ? current_speed - SPEED_STEP : 10;}Set_Stepper_Speed(current_speed);}else {int16_t angle = 0;switch (rdata){case 'a': angle = 90; break;case 'b': angle = 180; break;case 'c': angle = 270; break;case 'd': angle = 360; break;case 'x': angle = -90; break;case 'y': angle = -180; break;case 'z': angle = -270; break;case 'w': angle = -360; break;}if (angle != 0){steps_remaining = abs(angle) * 4096 / 360;direction = (angle > 0) ? 1 : -1;char angle_str[6];snprintf(angle_str, sizeof(angle_str), "%4d", angle);OLED_show_string(3, 1, (uint8_t *)angle_str);printf("angle: %d\n", angle);}}HAL_UART_Receive_IT(&huart1, (uint8_t *)&rdata, 1);}osDelay(10);}/* USER CODE END StartBluetoothTask */
}/* USER CODE BEGIN Header_StartMotorTask */
/**
* @brief Function implementing the MotorTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartMotorTask */
void StartMotorTask(void *argument)
{/* USER CODE BEGIN StartMotorTask *//* Infinite loop */step_counter = 0;for (;;){// 模拟PWM节拍(每 steps_divider 次循环走一步)step_counter++;if (step_counter >= steps_divider){step_counter = 0;if (steps_remaining > 0 || continuous_mode){GPIOB->ODR &= ~(GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_12 | GPIO_PIN_13);GPIOB->ODR |= step_sequence[current_step];current_step = (current_step + direction + 8) % 8;if (!continuous_mode) {steps_remaining--;}}else if (!continuous_mode && steps_remaining <= 0){GPIOB->ODR &= ~(GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_12 | GPIO_PIN_13);}}osDelay(1); }/* USER CODE END StartMotorTask */
}
完整代码
【免费】STM32F103C8T6-基于FreeRTOS系统实现步进电机控制资源-CSDN文库
相关文章:
STM32F103C8T6-基于FreeRTOS系统实现步进电机控制
引言 上一篇文章讲述了如何使用蓝牙连接stm32进行数据收发控制步进电机,这篇在之前的基础上通过移植操作系统(FreeRTOS或者其他的也可以,原理操作都类似)实现步进电机控制。 上篇博客指路:STM32蓝牙连接Android实现云…...
数字资产和交易解决方案
数字资产和交易解决方案 一、背景 (一)数字经济的蓬勃发展 随着信息技术的飞速发展,数字经济已成为全球经济增长的新引擎。数字资产作为数字经济的重要组成部分,其价值逐渐被人们所认识和重视。数字资产包括但不限于数字货币、…...
计算机网络 实验四 静态路由的配置与应用
一、实验目的 熟悉路由器的工作原理;熟悉静态路由的原理;熟悉华为网络模拟器的使用方法;掌握网络拓扑图的绘制;掌握路由器的配置。 二、实验设备 PC、华为模拟器ENSP。 三、实验步骤 知识准备:路由器和静态路由的…...
二进制求和 - 简单
************* C topic: 67. 二进制求和 - 力扣(LeetCode) ************* Give the topic an inspection. Too many works these days. And no spare time for code learning. However here I am gagin. This topic is an easy one and I want to pra…...
【C++】 —— 笔试刷题day_18
一、压缩字符串(一) 题目解析 题目给定一个字符str,让我们将这个字符串进行压缩; **压缩规则:**出现多次的字符压缩成字符数字;例如aaa压缩成a3。如果字符值出现一次,1不用写。 算法思路 这道题总的来说就非常简单了…...
LeetCode 热题 100_最长递增子序列(87_300_中等_C++)(动态规划)
LeetCode 热题 100_最长递增子序列(87_300) 题目描述:输入输出样例:题解:解题思路:思路一(动态规划): 代码实现代码实现(思路一(动态规划…...
asp-for等常用的HTML辅助标记?
在ASP.NET Core Razor Pages 和 MVC 中,除了asp-for之外,还有许多常用的 HTML 辅助标记,下面为你详细介绍: 表单与路由相关 asp-action 和 asp-controller 用途:这两个标记用于生成表单或链接的 URL,指定…...
map用法介绍
在 C 里,map是标准库提供的一种关联容器,它以键 - 值对的形式存储元素,并且按键的升序排列。下面为你展示如何在 C 用map。 如果没有用万能头的时候,需要加入#include 用法介绍: 映射[需要注意map的映射是1对1的不能出…...
AIGC-十款知识付费类智能体完整指令直接用(DeepSeek,豆包,千问,Kimi,GPT)
Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…...
一页概览:桌面虚拟化方案
2010年左右手绘的,用的是公司的信纸,马克笔。当时在买VMware和Citrix的桌面虚拟化方案,以及Wyse的瘦客户端。...
通过导入 Excel 的方式复制文件或文件夹
在进行文件或文件夹的批量整理时,许多人都会遇到需要将大量文件或文件夹复制到另一个文件夹中的问题。传统的手动复制粘贴方法不仅繁琐,而且效率低下。今天给大家介绍一种方法,可以实现将多个不同文件夹中的文件复制到一个或者多个文件夹&…...
Python单例设计模式深度解析
目录 一、什么是单例设计模式 核心特点 二、为什么需要单例模式 典型应用场景 优势对比 三、Python实现单例的三种方式 1. 使用__new__方法(经典实现) 2. 使用装饰器实现 3. 使用模块实现(Python特有) 四、深入理解__new…...
WPF 图标原地旋转
如何使元素原地旋转 - WPF .NET Framework | Microsoft Learn <ButtonRenderTransformOrigin"0.5,0.5"HorizontalAlignment"Left">Hello,World<Button.RenderTransform><RotateTransform x:Name"MyAnimatedTransform" Angle"…...
深入解析Java日志框架Logback:从原理到最佳实践
Logback作为Java领域最主流的日志框架之一,由Log4j创始人Ceki Glc设计开发,凭借其卓越的性能、灵活的配置以及与SLF4J的无缝集成,成为企业级应用开发的首选日志组件。本文将从架构设计、核心机制、配置优化等维度全面剖析Logback的技术细节。…...
【设计模式——装饰器模式】
在 Unity 游戏开发中,装饰模式是一种非常灵活的设计模式,用于在运行时动态地为对象添加功能。以下是装饰模式的设计思路和实现步骤,以角色的装备系统为例进行说明。 设计思路 装饰模式的核心思想是通过创建一个装饰器类来包装原有的对象&am…...
在 macOS 上切换默认 Java 版本
下载javasdk 打开android studio -> setting -> build.execution,dep -> build tools -> gradle -> Gradle JDK -> download JDK… 点击下载,就下载到了 ~/Library/Java/JavaVirtualMachines/ 安装 jenv brew install jenv将 jenv 集成到 Shell …...
【Linux网络与网络编程】11.数据链路层mac帧协议ARP协议
前面在介绍网络层时我们提出来过一个问题:主机是怎么把数据交给路由器的?那里我们说这是由数据链路层来做的。 网络上的报文在物理结构上是以mac帧的形式流动的,但在逻辑上是以IP流动的,IP的流动是需要mac帧支持的。 数据链路层解…...
158页PPT | 某大型研发制造集团信息化IT规划整体方案
该文档是某大型研发制造集团信息化IT规划整体方案,涵盖项目过程回顾、信息平台分析、现状评估、规划及治理建议和下阶段工作计划。项目旨在理解集团战略目标,评估信息化应用现状,制定可扩展的蓝图,明确未来3年管理与IT建设子项目&…...
ON DUPLICATE KEY UPDATE 更底层解释它的优势
从更底层来看,ON DUPLICATE KEY UPDATE 的优势主要源于以下几个方面: 1. 减少网络往返次数 先查询再更新:这种方式需要客户端和数据库服务器之间进行多次网络通信。首先,客户端发送一个 SELECT 查询请求,然后等待服务…...
Python 赋能区块链金融——从零构建智能交易系统
Python 赋能区块链金融——从零构建智能交易系统 引言:区块链金融系统的崛起 区块链技术正在颠覆传统金融体系,带来去中心化、透明化和高效的交易模式。从 DeFi(去中心化金融)到 NFT 市场,区块链金融系统已成为 Web 3.0 生态的重要支柱。如何用 Python 构建一个区块链金…...
基础(测试用例设计方法:流程图法,等价类划分法,边界值分析法,判定表法,正交分析法,错误推测法,其他方法,案例)
目录 流程图法(场景法) 业务流程 流程图 流程图法设计测试用例 案例-退款泳道图 案例-刷视频流程 等价类划分法 等价类 等价类设计测试用例 案例1-验证电话号码 案例2-验证邮箱格式 边界值分析法 测试数据的选取 边界值法设计测试用例 案例…...
QT —— 信号和槽(槽函数)
QT —— 信号和槽 信号和槽信号(Signal)槽(Slot)声明方式工作原理连接方式1. 传统连接方式(Qt4风格)2. 新式连接方式(Qt5风格) 区分槽函数和信号通过QtCreator生成信号槽代码自动生成槽函数显式连接的优势命名约定自动连接的局限性最佳实践建议结论 我们之前对QT,有…...
ROS2模块库概览
一、核心通信与基础库(最常用) 客户端库 rclcpp (ROS Client Library for C) 核心API:create_node(), create_publisher(), create_subscription()高级特性: 生命周期节点:通过rclcpp_lifecycle实现configure/activate…...
HADOOP——序列化
1.创建一个data目录在主目录下,并且在data目录下新建log.txt文件 2.新建flow软件包,在example软件包下 FlowBean package com.example.flow;import org.apache.hadoop.io.Writable;import java.io.DataInput; import java.io.DataOutput; import java.i…...
第五章 5.2ESP32物联网应用:HTTP与Web服务器详细教学
本文将详细讲解如何在ESP32上搭建Web服务器,通过HTTP协议实现远程控制LED灯。每行代码均有详细注释,适合零基础学习。 一、HTTP协议基础 HTTP是客户端(浏览器)和服务器之间的通信协议,常用请求方法: GET&a…...
c++11 绑定器bind
文章目录 std::bind 使用总结(C11)1. 绑定普通函数2. 使用占位符 _1, _2,调用时传参数3. 绑定类的成员函数(类外)4. 绑定类的成员函数(类内)5. 占位符结合成员函数小结 std::bind 使用总结&…...
实现时间最优轨迹生成/轨迹规划方法(TOTG),不使用moveit,可用于ROS驱动机械臂FollowJointTrajectoryGoal()
前言 在我的这篇文章:https://blog.csdn.net/weixin_45702459/article/details/139293391?spm1011.2415.3001.5331中,写了不使用moveit来ros驱动机械臂的方法,也就是用FollowJointTrajectoryGoal()来进行一系列点的关节运动,其实…...
2025年推荐使用的开源大语言模型top20:核心特性、选择指标和开源优势
李升伟 编译 随着人工智能技术的持续发展,开源大型语言模型(LLMs)正变得愈发强大,使最先进的AI能力得以普及。到2025年,开源生态系统中涌现出多个关键模型,它们在各类应用场景中展现出独特优势。 大型语言…...
高并发多级缓存架构实现思路
目录 1.整体架构 3.安装环境 1.1 使用docket安装redis 1.2 配置redis缓存链接: 1.3 使用redisTemplate实现 1.4 缓存注解优化 1.4.1 常用缓存注解简绍 1.4.2 EnableCaching注解的使用 1.4.3使用Cacheable 1.4.4CachePut注解的使用 1.4.5 优化 2.安装Ngin…...
Qt 的 事件队列
Qt 的 事件队列 是其核心事件处理机制之一,用于管理和分发系统与用户生成的事件(如鼠标点击、键盘输入、定时器、信号槽中的队列连接等)。理解 Qt 的事件队列对多线程、界面响应以及异步处理尤为关键。 一、Qt 的事件处理模型概览 Qt 是基于…...
html-css样式
1. 所有类型为文本的 元素的样式 指定所有类型为文本的 元素的样式 /* 文本框的样式 */ input[type"text"] { font-size: 25px;width: 80px; /* 文本框的宽度 */ padding: 25px; } font-size:字体大小 width:文本框宽度 padding&#…...
Qemu-STM32(十五):STM32F103加入Flash控制器
概述 本文主要描述了在Qemu平台中,如何添加STM32F103的Flash控制器模拟代码。 参考资料 STM32F1XX TRM手册,手册编号:RM0008 添加步骤 1、在hw/arm/Kconfig文件中添加STM32F1XX_FLASH,如下所示: 号部分为新增加内容 diff -…...
设计模式(责任链模式)
责任链模式 模板模式、策略模式和责任链模式,这三种模式具有相同的作用:复用和扩展,在实际的项目开发中比较常用,特别是框架开发中,我们可以利用它们来提供框架的扩展点,能够让框架的使用者在不修改框架源…...
【Mac-ML-DL】深度学习使用MPS出现内存泄露(leaked semaphore)以及张量转换错误
MPS加速修改总结 先说设备:MacBook Pro M4 24GB 事情的起因是我在进行深度学习的时候想尝试用苹果自带的MPS进行训练加速,修改设备后准备开始训练,但是出现如下报错: UserWarning: resource_tracker: There appear to be 1 leak…...
Hadoop集群部署教程-P5
Hadoop集群部署教程-P5 Hadoop集群部署教程(续) 第十七章:安全增强配置 17.1 认证与授权 Kerberos认证集成: # 生成keytab文件 kadmin -q "addprinc -randkey hdfs/masterEXAMPLE.COM" kadmin -q "xst -k hdfs.…...
Github 2FA(Two-Factor Authentication/两因素认证)
Github 2FA认证 多因素用户认证(Multi-Factor Authentication),基本上各个大互联网平台,尤其是云平台厂商(如:阿里云的MFA、华为云、腾讯云/QQ安全中心等)都有启用了,Github算是搞得比较晚些了。 双因素身…...
Spark大数据分析与实战笔记(第四章 Spark SQL结构化数据文件处理-05)
文章目录 每日一句正能量第4章 Spark SQL结构化数据文件处理章节概要4.5 Spark SQL操作数据源4.5.1 Spark SQL操作MySQL4.5.2 操作Hive数据集 每日一句正能量 努力学习,勤奋工作,让青春更加光彩。 第4章 Spark SQL结构化数据文件处理 章节概要 在很多情…...
使用 Azure AKS 保护 Kubernetes 部署的综合指南
企业不断寻求增强其软件开发和部署流程的方法。DevOps 一直是这一转型的基石,弥合了开发与运营之间的差距。然而,随着安全威胁日益复杂,将安全性集成到 DevOps 流水线(通常称为 DevSecOps)已变得势在必行。本指南深入探…...
遵守 Vue3 的单向数据流原则:父组件传递对象 + 子组件修改对象属性,安全地实现父子组件之间复杂对象的双向绑定示例代码及讲解
以下是针对 父组件传递对象 子组件修改对象属性 的完整示例代码,同时遵守 Vue3 的单向数据流原则: 1. 父组件代码 (ParentComponent.vue) vue <template><!-- 通过 v-model 传递整个对象 --><ChildComponent v-model"formData&qu…...
Unchained 内容全面上链,携手 Walrus 迈入去中心化媒体新时代
加密新闻媒体 Unchained — — 业内最受信赖的声音之一 — — 现已选择 Walrus 作为其去中心化存储解决方案,正式将其所有媒体内容(文章、播客和视频)上链存储。Walrus 将替代 Unchained 现有的中心化存储架构,接管其全部历史内容…...
20.3 使用技巧2
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 20.3.3 修改表头单元格 设置列表头单元格的内容: 一是可以通过 DataGridView.Columns[列号].HeaderCell来获得对应列的单…...
【Axure绘制原型】小图标使用技巧
获取小图标的网站:https://www.iconfont.cn/ 搜索相关图标 点击下载-复制SVG代码 回到Axure软件中粘贴,此时会显示出图片 在Axure软件中右键-变换图片-转换为形状 即可...
音视频之H.265/HEVC预测编码
H.265/HEVC系列文章: 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 预测编码是视频编码中的核心技术之一。对于视频信号来说,一幅图像内邻近像素之间有着较强的空间相关性,相邻图像之…...
无人机遥感与传统卫星遥感:谁更适合你的需求?
在对地观测领域,无人机遥感和卫星遥感是两种重要的技术手段,各自具有独特的技术原理、性能特点和应用优势。本文将从技术原理、性能特点和应用场景三个方面,对无人机遥感和卫星遥感进行系统对比,帮助读者全面了解两种技术的差异与…...
学习笔记—C++—模板初阶
目录 模板初阶 泛型编程 函数模板 模版概念 函数模版格式 模版的原理 函数模板的实例化 模版参数的匹配规则 类模板 模板初阶 泛型编程 使用函数重载虽然可以实现,但是有一下几个不好的地方: 1. 重载的函数仅仅是类型不同,代码复…...
【Python进阶】字典:高效键值存储的十大核心应用
目录 前言:技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现(10个案例)案例1:基础操作案例2:字典推导式…...
充电宝项目中集成地图地址解析功能梳理
文章目录 MongoDB数据库引入pom依赖配置yaml配置文件参考POJOXLocationRepositoryservice服务方法 腾讯地图接口申请api key配置api key启动类配置RestTemplate控制层服务层 MongoDB数据库 MongoDB对应经纬度的查询具体很好的支持. 引入pom依赖 <dependency><group…...
算法基础(以acwing讲述顺序为主,结合自己理解,持续更新中...)
文章目录 算法的定义一、基础算法排序二分高精度前缀和与差分双指针算法位运算离散化区间合并 算法的定义 这是我从百度上面搜的定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系…...
栈实现队列
栈实现队列 用栈实现队列:C 语言代码解析栈的基本实现栈的初始化栈的销毁入栈操作检查栈是否为空出栈操作获取栈顶元素获取栈中元素个数 用栈实现队列队列的创建入队操作出队操作获取队首元素检查队列是否为空队列的销毁 总结 用栈实现队列:C 语言代码解…...
Redis原理与Windows环境部署实战指南:助力测试工程师优化Celery调试
引言 在分布式系统测试中,Celery作为异步任务队列常被用于模拟高并发场景。而Redis作为其核心消息代理,其性能和稳定性直接影响测试结果。本文将深入解析Redis的核心原理,主要讲解Windows环境部署redis,为测试工程师提供一套完整…...