当前位置: 首页 > news >正文

freeRTOS使用

创建第一个FreeRTOS程序

1、官网源码下载

(1)进入FreeRTOS官网FreeRTOS professional services for application and RTOS development and consulting. FreeRTOS is an Open Source Code RTOS

 (2)点击下载FreeRTOS

2、处理目录

(1)下载后解压FreeRTOS文件

(2)删除多余文件(红框里的)

(3)删除"FreeRTOSv202212.01\FreeRTOS\Demo"目录下用不到的示例工程,留下common这里放了一些公共文件

(4)"FreeRTOSv202212.01\FreeRTOS\Source\portable"目录下只保留如下两个文件夹,其他全部删掉。(5)"FreeRTOSv202212.01\FreeRTOS\Source\portable\RVDS"目录下只保留如下一个文件夹,其他全部删掉

3、打开编译工程

(1删除后文件后,进入如下图打开工程

(2)弹出如下对话框,说明该工程是用KeilMDK4创建的。点击“Migrate to Device Pack”更新为KeilMDK5。

(3)弹出对话框,点击“确定”。

  1. 更新后,关闭工程再重新打开。编译
  2. 工程目录介绍(System里还有一个LCD也删掉)

  1. 4、去掉无关代码

(1Demo Files文件下只保留“serial.c和main.c”文件,其他都删掉(删完之后main里去掉一些头文件)

(2)编译

5、删除未定义报错内容

(1)在文件STM32F10x.s中,删除如下内容。

(2)删除其他未定义的相关内容,再次编译。报错的内容均删除或者注释,直到没错为止。

  1. 验证

在原有任务的基础上加个i++验证

  1. 配置串口

int fputc( int ch, FILE *f )//重定向  修改数据传输方向
{
  while(!(USART1->SR & (1<<7))){}
	USART1->DR =ch;
	return ch;
}

初始化删除多余的东西,只保留串口一的配置(这里的函数就是个串口的初始化,有效程序只有串口配置和GPIO配置,按照我下面写的程序弄就可以了。写完记得再main里调用,参数可以不填写。。或者删掉重新写个这个函数也可以)

xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
{
		xComPortHandle xReturn;
		USART_InitTypeDef USART_InitStructure;
		GPIO_InitTypeDef GPIO_InitStructure;/* Enable USART1 clock */RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE );/* Configure USART1 Rx (PA10) as input floating */
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init( GPIOA, &GPIO_InitStructure );/* Configure USART1 Tx (PA9) as alternate function push-pull */
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init( GPIOA, &GPIO_InitStructure );		USART_InitStructure.USART_BaudRate = 115200;
		USART_InitStructure.USART_WordLength = USART_WordLength_8b;
		USART_InitStructure.USART_StopBits = USART_StopBits_1;
		USART_InitStructure.USART_Parity = USART_Parity_No ;
		USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
		USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
		USART_InitStructure.USART_Clock = USART_Clock_Disable;
		USART_InitStructure.USART_CPOL = USART_CPOL_Low;
		USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;
		USART_InitStructure.USART_LastBit = USART_LastBit_Disable;USART_Init( USART1, &USART_InitStructure );USART_Cmd( USART1, ENABLE );return xReturn;
}

使用printf

仿真里看串口打印消息

  1. 命名规范

三、FreeRTOS命名规范_freertos命名规则-CSDN博客

3、  验证

在原有任务的基础上加个i++验证

4、  配置串口

int fputc( int ch, FILE *f )//重定向  修改数据传输方向
{while(!(USART1->SR & (1<<7))){}USART1->DR =ch;return ch;
}

初始化删除多余的东西,只保留串口一的配置(这里的函数就是个串口的初始化,有效程序只有串口配置和GPIO配置,按照我下面写的程序弄就可以了。写完记得再main里调用,参数可以不填写。。或者删掉重新写个这个函数也可以)

xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
{xComPortHandle xReturn;USART_InitTypeDef USART_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;/* Enable USART1 clock */RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE );/* Configure USART1 Rx (PA10) as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init( GPIOA, &GPIO_InitStructure );/* Configure USART1 Tx (PA9) as alternate function push-pull */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init( GPIOA, &GPIO_InitStructure );USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No ;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_InitStructure.USART_Clock = USART_Clock_Disable;USART_InitStructure.USART_CPOL = USART_CPOL_Low;USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;USART_InitStructure.USART_LastBit = USART_LastBit_Disable;USART_Init( USART1, &USART_InitStructure );USART_Cmd( USART1, ENABLE );return xReturn;
}

使用printf

仿真里看串口打印消息

5、  命名规范

三、FreeRTOS命名规范_freertos命名规则-CSDN博客

动态任务的创建

1、  任务是什么

 任务的外观:一个永远不返回的函数

说明:使用void *类型形参,确保可以传入任意类型的参数

2、  任务实验

实现

创建任务函数xTaskCreate:

任务也不是很复杂的东西,任务也就是一个函数xTaskCreate。简单得说,创建一个任务,你得提供它的执行函数,你得提供它的栈的大小函数的执行空间函数的优先级等重要的条件。因为任务在运行中,任务函数有调用关系,有局部变量,这些都保存在任务的栈里面;任务有可能被切换,有可能被暂停,这时候CPU寄存器中断现场数据都保存在栈里面。

函数原型

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,const char * const pcName,                             const configSTACK_DEPTH_TYPE usStackDepth,void * const pvParameters,UBaseType_t uxPriority,TaskHandle_t * const pxCreatedTask )

参数说明

pvTaskCode:指向任务函数的指针。该函数表示任务要执行的代码。

pcName:任务名称字符串。用于调试和跟踪,不影响任务功能。

usStackDepth:任务栈大小(以单词为单位)。根据任务需求设定,过小可能导致栈溢出。

pvParameters:传递给任务函数的参数。可以是任意类型的指针。

uxPriority:任务优先级。数值越大,优先级越高。

pxCreatedTask:任务句柄指针。用于存储创建任务后的任务句柄,可选参数。

返回值

如果任务创建成功,返回pdPASS。

如果任务创建失败(例如内存不足),返回错误码。

任务创建成功后,系统会自动将其加入到调度队列。调度器会根据任务优先级选择合适的任务执行。

实验

xTaskCreate(test1,"demo1",100,NULL,1,NULL);
xTaskCreate(test2,"demo2",100,NULL,1,NULL);

int a,b;
void test1(void *param)
{while(1){a++;printf("test1\n");}
}
void test2(void *param)
{while(1){b++;printf("test2\n");}
}

3、  任务的内部

① 代码段和数据区由编译器在编译代码时自动分配与控制

② 堆的分配和使用由程序员控制

③ C代码中一般不会显式使用栈,将由编译器完成;在汇编代码中,程序员可以设置栈的位置并使用

④ C代码也不会显示使用寄存器,也是由编译器完成

个人:代码区 + 数据区 + 栈 + 堆可以理解为任务的实体 + 运行环境

任务切换的本质:保存前一任务(prev)的当前运行状态,恢复后一任务(next)之前的运行状态,并切换到该任务运行

4、  任务控制块

 TCB_t的全称为Task Control Block,也就是任务控制块,这个结构体包含了一个任务所有的信息,但是源代码中存在大量的条件配置选项,以下屏蔽掉的都是可以通过条件来配置的选项,通过条件来决定哪些定义使用或者不用,暂时不需要用到这些,对条件配置项进行屏蔽,TCB最主要的参数在上面它的定义以及相关变量的解释如下

5、任务状态

就绪态(Ready):任务已经具备了运行条件(没有被挂起或阻塞),但是有更高优先级或同优先级的任务正在运行,所以需要等待。

运行态(Running):当任务正在运行时,此时的状态被称为运行态,即CPU的使用权被这个任务占用。

阻塞态(Blocked):任务在等待信号量消息队列、事件标准组、系统延时时,被称为阻塞态,如果等待的事件到了,就会自动退出阻塞态,准备运行。

挂起态(Suspended):任务被暂时停止,通过调用挂起函数(vTaskSuspend())可以把指定任务挂起,任务挂起后暂时不会运行,只有调用恢复函数(xTaskResume())才可以退出挂起状态。

静态任务创建

xTaskCreateStatic():

  xTaskCreateStatic() 用于在系统中创建静态任务。与xTaskCreate()动态分配任务内存不同,xTaskCreateStaitc()需要开发者为任务栈和任务控制块(TCB)提供预先分配的内存空间。这对于内存受限或需要更精准控制任务内存的系统来说非常有用。

函数原型

TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,const char * const pcName,                                     const uint32_t ulStackDepth,void * const pvParameters,UBaseType_t uxPriority,StackType_t * const puxStackBuffer,StaticTask_t * const pxTaskBuffer )

参数解释:

pvTaskCode:指向任务函数的指针。

pcName:任务的名称,通常用于调试目的。

ulStackDepth:任务栈大小,以堆栈类型(StackType_t)为单位计算。

pvParameters:传递给任务函数的参数指针。

uxPriority:任务优先级,数值越大,优先级越高。

puxStackBuffer:指向已分配的任务栈内存缓冲区的指针。

pxTaskBuffer:指向已分配的任务控制块 (TCB) 内存结构的指针

函数返回值:

成功创建任务时,返回任务句柄 TaskHandle_t。

若任务创建失败,返回 NULL。

挂起任务、恢复任务

挂起任务函数原型

vTaskSuspend( TaskHandle_t xTaskToSuspend )

参数

xTaskToSuspend:需要挂起任务的句柄

实验

创建任务时加上句柄

句柄声明

在任务1里挂起任务2

void vTask1( void *pvParameters )
{while(1){printf("vTask1\n");demo1=1;demo2=0;vTaskDelay(4);vTaskSuspend(CreatedTask);}
}

恢复任务函数原型

 void vTaskResume( TaskHandle_t xTaskToResume )

参数

TaskToResumex:需要恢复任务的句柄

实验

//挂起后又恢复了实验中如果正常执行任务2就验证了
//也可以再创建个任务3,进入延时一段时间恢复任务2
void vTask1( void *pvParameters )
{while(1){printf("vTask1\n");demo1=1;demo2=0;vTaskDelay(4);vTaskSuspend(CreatedTask);vTaskDelay(4);vTaskResume(CreatedTask); }}

任务删除

  vTaskDelete()函数用于删除任务。在使用这个函数时,需要提供一个任务句柄作为参数,以便通知内核删除哪个任务。

函数原型

void vTaskDelete( TaskHandle_t xTaskToDelete )

参数:

xTaskToDelete:需要删除任务的句柄

空闲任务与钩子函数

1、空闲任务

创建的任务大部份时间都处于阻塞态。这种状态下所有的任务都不可运行,所以也不能被调度器选中。但处理器总是需要代码来执行——所以至少要有一个任务处于运行态。为了保证这一点,当调用 vTaskStartScheduler()时,调度器会自动创建一个空闲任务。空闲任务是一个非常短小的循环——和最早的示例任务十分相似,总是可以运行。空闲任务拥有最低优先级(优先级 0)以保证其不会妨碍具有更高优先级的应用任务进入运行态——当然,没有任何限制说是不能把应用任务创建在与空闲任务相同的优先级上;如果需要的话,你一样可以和空闲任务一起共享优先级。运行在最低优先级可以保证一旦有更高优先级的任务进入就绪态,空闲任务就会立即切出运行态。

2、  钩子函数

通过空闲任务钩子函数(或称回调,hook, or call-back),可以直接在空闲任务中添加应用程序相关的功能。空闲任务钩子函数会被空闲任务每循环一次就自动调用一次。通常空闲任务钩子函数被用于:

● 执行低优先级,后台或需要不停处理的功能代码。

● 测试系统处理(空闲任务只会在所有其它任务都不运行时才有机会执行,所以测量出空闲任务占用的处理时间就可以清楚的知道系统有多少富余的处理时间)。

●  将处理器配置到低功耗模式——提供一种自动省电方法,使得在没有任何应用功能

● 需要处理的时候,系统自动进入省电模式。

3、  空闲任务钩子函数的实现限制

1. 绝不能阻或挂起。空闲任务只会在其它任务都不运行时才会被执行(除非有应用任务共享空闲任务优先级)。以任何方式阻塞空闲任务都可能导致没有任务能够进入运行态!

2.  如果应用程序用到了 vTaskDelete() AP 函数,则空闲钩子函数必须能够尽快返回。因为在任务被删除后,空闲任务负责回收内核资源。如果空闲任务一直运行在钩子函数中,则无法进行回收工作。

4、  钩子函数的使用

● main函数中找到vTaskStartScheduler()并跳转

● vTaskStartScheduler()内可以找到如图的函数

● 跳转空闲任务函数找到了vApplicationIdleHook()函数就是钩子函数,但是需要configUSE_IDLE_HOOK==1

● 右键跳转configUSE_IDLE_HOOK并将configUSE_IDLE_HOOK等于1

● 编译发现报错,内容为vApplicationIdleHook未定义

● 接下来我们声明写一个vApplicationIdleHook函数并在里面写自己的任务程序就可以了

FreeRTOS的延时函数

vTaskDelay()延时函数,参数xTicksToDelay表示,延时xTicksToDelay*Tick的时间,填入1表示延时1个Tick的时间

vTaskDelayUntil()函数,参数pxPreviousWakeTime是一个起始的Tick时间,xTimeIncrement是填入所需要延时的时间。当需要我们的任务在精确时间开始执行时可以使用该函数达到准确延时。

xTaskGetTickCount()获取当前时间节点

void vTask1( void *pvParameters )
{int i=0;int j=0;int BUF[6]={4,16,12,2};while(1){TickType_t tStart = xTaskGetTickCount();//获取时间节拍for(i=0;i<BUF[j];i++){printf("vTask1\n");}j++;if(j>4){j=0;}demo1=1;demo2=0;
//		vTaskDelay(4);//固定延时xTaskDelayUntil(&tStart,4);//动态调节的延时}
}

Cubemx使用

1、  打开cubemx

2、  新建工程,选择自己芯片的型号

3 、配置LED灯以后,选择FreeRTOS,并配置版本V2

3、改下时钟

4、  生成工程

5、  程序编写

//初始化
void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);/*Configure GPIO pin : PB0 */GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);}

void StartDefaultTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);osDelay(500);}/* USER CODE END StartDefaultTask */
}
void StartTask02(void *argument)
{/* USER CODE BEGIN StartTask02 *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);osDelay(500);}/* USER CODE END StartTask02 */
}

5、烧录验证两个灯闪烁了

相关文章:

freeRTOS使用

创建第一个FreeRTOS程序 1、官网源码下载 &#xff08;1&#xff09;进入FreeRTOS官网FreeRTOS professional services for application and RTOS development and consulting. FreeRTOS is an Open Source Code RTOS &#xff08;2&#xff09;点击下载FreeRTOS 2、处理目录 &…...

基于vue的线上点餐系统论文

基于vue的线上点餐系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了线上点餐系统的开发全过程。通过分析线上点餐系统管理的不足&#xff0c;创建了一个计算机管理线上点餐系统的方案。文章介绍了线上点餐…...

【Windows】windows11右键默认显示更多选项的办法

Windows11系统的右键菜单显示&#xff0c;需要多点一次“显示更多选项”才能看到所有菜单内容&#xff0c;按下面步骤简单设置一下就能恢复成Windows经典的右键菜单显示。 1. 2.输入命令【reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a…...

推荐使用过很好用的api,含免费次数

IP归属地-IPv4城市级&#xff1a;根据IP地址查询归属地信息&#xff0c;支持到城市级&#xff0c;包含国家、省、市、和运营商等信息。IP归属地-IPv6城市级&#xff1a;根据IP地址&#xff08;IPv6版本&#xff09;查询归属地信息&#xff0c;支持到中国大陆地区&#xff08;不…...

QT最大线程并发

声明一个处理函数;int timeTask(); 头文件&#xff1a; #include <QtConcurrent> #include <QFuture> 并发处理改函数的任务&#xff0c;直到处理完成&#xff1a; QFuture<int> ft QtConcurrent::run(this, &ch72_concurrent::timeTask);while (!f…...

在金属/绝缘体/p-GaN栅极高电子迁移率晶体管中同时实现大的栅压摆幅和增强的阈值电压稳定性

标题&#xff1a;Simultaneously Achieving Large Gate Swing and Enhanced Threshold Voltage Stability in Metal/Insulator/p-GaN Gate HEMT (IEDM2023) 摘要 摘要&#xff1a;对于增强型GaN功率晶体管的发展&#xff0c;栅压摆幅和阈值电压稳定性通常是互相排斥的。本文展…...

Redis第1讲——入门简介

Java并发编程的总结和学习算是告一段落了&#xff0c;这段时间思来想去&#xff0c;还是决定把Redis再巩固和学习一下。毕竟Redis不论是在面试还是实际应用中都是极其重要的&#xff0c;在面试中诸如Redis的缓存问题、热key、大key、过期策略、持久化机制等&#xff1b;还有在实…...

数据科学知识库

​ 我的博客是一个技术分享平台&#xff0c;涵盖了机器学习、数据可视化、大数据分析、数学统计学、推荐算法、Linux命令及环境搭建&#xff0c;以及Kafka、Flask、FastAPI、Docker等组件的使用教程。 在这个信息时代&#xff0c;数据已经成为了一种新的资源&#xff0c;而机…...

设计模式——责任链模式(行为模式)

引言 责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理者。 问题 假如你正在开发一个在线订购系统。 你希望对系统访问进行限制&#xff0c; 只允…...

【谭浩强C语言:前八章编程题(多解)】

文章目录 第一章1. 求两个整数之和(p7) 第二章2. 求三个数中的较大值&#xff08;用函数&#xff09;(p14、p107)3.求123...n(求n的阶乘&#xff0c;用for循环与while循环)(P17)1.循环求n的阶乘2.递归求n的阶乘(n< 10) 4.有M个学生&#xff0c;输出成绩在80分以上的学生的学…...

程序人生15年人生感悟

计算机程序员并不是一件什么高大上的职业。而仅仅是一份普通的工作。就像医生能治病救人&#xff0c;我们能治蓝屏救程序&#xff0c;我们都在为这个世界默默的做出自己的贡献。刻意或无意宣扬某个职业高大上&#xff0c;其实质是对其它行业从业者的不公平。但是有些人却常常这…...

React与AJAX

大家好&#xff0c;欢迎来到 《React与AJAX》 课程。在这一课中&#xff0c;我们将学习如何在 React 中使用 AJAX。 什么是 AJAX&#xff1f; AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种使用 JavaScript 在浏览器和服务器之间进行异步通信的技术。A…...

C++ STL泛型算法

泛型算法 <algorithm>定义了大约 80 个标准算法。 它们操作由一对迭代器定义的&#xff08;输入&#xff09;序列或单一迭代器定义的&#xff08;输出&#xff09;序列。 当对两个序列进行拷贝、比较操作时&#xff0c;第一个序列由一对迭代器[b,e)表示&#xff0c;但第…...

使用OpenSSL生成PKCS#12格式的证书和私钥

要使用OpenSSL生成PKCS12格式的证书和私钥&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 安装OpenSSL 首先&#xff0c;确保已在计算机上安装了OpenSSL。可以从OpenSSL官方网站&#xff08;https://www.openssl.org/&#xff09;下载并安装适用于您的操作系统的版本。…...

超详细 | 哈里斯鹰优化算法原理、实现及其改进与利用(Matlab/Python)

测试函数为F9 在MATLAB中执行程序结果如下&#xff1a; 在Python中执行程序结果如下&#xff1a; 哈里斯鹰优化算法(Harris Hawks Optimization , HHO)是 Heidari等[1]于2019年提出的一种新型元启发式算法&#xff0c;设计灵感来源于哈里斯鹰在捕食猎物过程中的合作行为以及突…...

git 切换远程地址分支 推送到指定地址分支 版本回退

切换远程地址 1、切换远程仓库地址&#xff1a; 方式一&#xff1a;修改远程仓库地址 【git remote set-url origin URL】 更换远程仓库地址&#xff0c;URL为新地址。 git remote set-url https://gitee.com/xxss/omj_gateway.git 方式二&#xff1a;先删除远程仓库地址&…...

YOLOv3-YOLOv8的一些总结

0 写在前面 这个文档主要总结YOLO系列的创新点&#xff0c;以YOLOv3为baseline。参考(抄)了不少博客&#xff0c;就自己看看吧。有些模型的trick不感兴趣就没写进来&#xff0c;核心的都写了。 YOLO系列的网络都由四个部分组成&#xff1a;Input、Backbone、Neck、Prediction…...

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)控件的部分公共属性和事件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;控件的部分公共属性和事件 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、公共属性 常用的公共属性有&#xff1a; 宽(with)、高(height)、…...

最新同步云盘推荐:实现轻松管理与便捷同步的理想选择

同步云盘——可以轻松管理文件&#xff0c;同步不同设备之间的文件&#xff0c;受到了许多用户的青睐&#xff01;目前国内有什么值得推荐的同步云盘&#xff1f; Zoho Workdrive同步云盘&#xff0c;助您轻松管理文件&#xff0c;进行多设备同步&#xff0c;便捷使用文件&…...

(第27天)Oracle 数据泵转换分区表

在Oracle数据库中,分区表的使用是很常见的,使用数据泵也可以进行普通表到分区表的转换,虽然实际场景应用的不多。 创建测试表 sys@ORADB 2022-10-13 11:54:12> create table lucifer.tabs as select * from dba_objects;Table created.sys...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...