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

e2studio开发磁力计LIS2MDL(1)----轮询获取磁力计数据

e2studio开发磁力计LIS2MDL.1--轮询获取磁力计数据

  • 概述
  • 视频教学
  • 样品申请
  • 源码下载
  • 速率
  • 新建工程
  • 工程模板
  • 保存工程路径
  • 芯片配置
  • 工程模板选择
  • 时钟设置
  • UART配置
  • UART属性配置
  • 设置e2studio堆栈
  • e2studio的重定向printf设置
  • R_SCI_UART_Open()函数原型
  • 回调函数user_uart_callback ()
  • printf输出重定向到串口
  • 通信模式
  • IIC属性配置
  • IIC配置
  • R_IIC_MASTER_Open()函数原型
  • R_IIC_MASTER_Write()函数原型
  • R_IIC_MASTER_Read()函数原型
  • sci_i2c_master_callback()回调函数
  • 参考程序
  • 初始换管脚
  • 获取ID
  • 复位操作
  • BDU设置
  • 设置速率
  • 启用偏移消除
  • 开启温度补偿
  • 设置为连续模式
  • 轮询读取数据
  • 主程序
  • 演示

概述

本文将介绍如何使用 LIS2MDL 传感器来读取数据。主要步骤包括初始化传感器接口、验证设备ID、配置传感器的数据输出率和滤波器,以及通过轮询方式持续读取磁力数据和温度数据。读取到的数据会被转换为适当的单位并通过串行通信输出。
这个传感器常用于多种电子设备中,以提供精确的磁场强度数据,从而用于指南针应用、位置追踪或者动作检测等功能。

最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:615061293 。

在这里插入图片描述

视频教学

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

源码下载

速率

该模块支持的速度为普通模式(100k)、快速模式(400k)、快速模式+(1M)、高速模式(3.4M)。

在这里插入图片描述

新建工程

在这里插入图片描述

工程模板

在这里插入图片描述

保存工程路径

在这里插入图片描述

芯片配置

本文中使用R7FA4M2AD3CFL来进行演示。
在这里插入图片描述

工程模板选择

在这里插入图片描述

时钟设置

开发板上的外部高速晶振为12M.

在这里插入图片描述
需要修改XTAL为12M。

在这里插入图片描述

UART配置

在这里插入图片描述
点击Stacks->New Stack->Driver->Connectivity -> UART Driver on r_sci_uart。
在这里插入图片描述

UART属性配置

在这里插入图片描述

设置e2studio堆栈

printf函数通常需要设置堆栈大小。这是因为printf函数在运行时需要使用栈空间来存储临时变量和函数调用信息。如果堆栈大小不足,可能会导致程序崩溃或不可预期的行为。
printf函数使用了可变参数列表,它会在调用时使用栈来存储参数,在函数调用结束时再清除参数,这需要足够的栈空间。另外printf也会使用一些临时变量,如果栈空间不足,会导致程序崩溃。
因此,为了避免这类问题,应该根据程序的需求来合理设置堆栈大小。

在这里插入图片描述

e2studio的重定向printf设置

在这里插入图片描述
在嵌入式系统的开发中,尤其是在使用GNU编译器集合(GCC)时,–specs 参数用于指定链接时使用的系统规格(specs)文件。这些规格文件控制了编译器和链接器的行为,尤其是关于系统库和启动代码的链接。–specs=rdimon.specs 和 --specs=nosys.specs 是两种常见的规格文件,它们用于不同的场景。
–specs=rdimon.specs
用途: 这个选项用于链接“Redlib”库,这是为裸机(bare-metal)和半主机(semihosting)环境设计的C库的一个变体。半主机环境是一种特殊的运行模式,允许嵌入式程序通过宿主机(如开发PC)的调试器进行输入输出操作。
应用场景: 当你需要在没有完整操作系统的环境中运行程序,但同时需要使用调试器来处理输入输出(例如打印到宿主机的终端),这个选项非常有用。
特点: 它提供了一些基本的系统调用,通过调试接口与宿主机通信。
–specs=nosys.specs
用途: 这个选项链接了一个非常基本的系统库,这个库不提供任何系统服务的实现。
应用场景: 适用于完全的裸机程序,其中程序不执行任何操作系统调用,比如不进行文件操作或者系统级输入输出。
特点: 这是一个更“裸”的环境,没有任何操作系统支持。使用这个规格文件,程序不期望有操作系统层面的任何支持。
如果你的程序需要与宿主机进行交互(如在开发期间的调试),并且通过调试器进行基本的输入输出操作,则使用 --specs=rdimon.specs。
如果你的程序是完全独立的,不需要任何形式的操作系统服务,包括不进行任何系统级的输入输出,则使用 --specs=nosys.specs。
在这里插入图片描述

R_SCI_UART_Open()函数原型

在这里插入图片描述

故可以用 R_SCI_UART_Open()函数进行配置,开启和初始化UART。

 /* Open the transfer instance with initial configuration. */err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);assert(FSP_SUCCESS == err);

回调函数user_uart_callback ()

当数据发送的时候,可以查看UART_EVENT_TX_COMPLETE来判断是否发送完毕。

在这里插入图片描述
在这里插入图片描述

可以检查检查 “p_args” 结构体中的 “event” 字段的值是否等于 “UART_EVENT_TX_COMPLETE”。如果条件为真,那么 if 语句后面的代码块将会执行。

fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{if(p_args->event == UART_EVENT_TX_COMPLETE){uart_send_complete_flag = true;}
}

printf输出重定向到串口

打印最常用的方法是printf,所以要解决的问题是将printf的输出重定向到串口,然后通过串口将数据发送出去。
注意一定要加上头文件#include <stdio.h>

#ifdef __GNUC__                                 //串口重定向#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endifPUTCHAR_PROTOTYPE
{err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);if(FSP_SUCCESS != err) __BKPT();while(uart_send_complete_flag == false){}uart_send_complete_flag = false;return ch;
}int _write(int fd,char *pBuffer,int size)
{for(int i=0;i<size;i++){__io_putchar(*pBuffer++);}return size;
}

通信模式

对于LIS2MDL,可以使用SPI或者IIC进行通讯。
最小系统图如下所示。
在这里插入图片描述

在CS管脚为1的时候,为IIC模式
在这里插入图片描述

本文使用的板子原理图如下所示。

在这里插入图片描述

CS对应到RA4M2板子上的端口为P014。
在这里插入图片描述

配置为输出管脚。

在这里插入图片描述

    R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_14, BSP_IO_LEVEL_HIGH);

IIC属性配置

查看手册,可以得知LIS2MDL的IIC地址为“0011110” ,即0x1E

在这里插入图片描述

IIC配置

配置RA4M2的I2C接口,使其作为I2C master进行通信。
查看开发板原理图,对应的IIC为P407和P408。

在这里插入图片描述

点击Stacks->New Stack->Connectivity -> I2C Master(r_iic_master)。

在这里插入图片描述

设置IIC的配置,需要注意从机的地址。

在这里插入图片描述

R_IIC_MASTER_Open()函数原型

R_IIC_MASTER_Open()函数为执行IIC初始化,开启配置如下所示。

    /* Initialize the I2C module */err = R_IIC_MASTER_Open(&g_i2c_master0_ctrl, &g_i2c_master0_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);

R_IIC_MASTER_Write()函数原型

在这里插入图片描述
R_IIC_MASTER_Write()函数是向IIC设备中写入数据,写入格式如下所示。

    err = R_IIC_MASTER_Write(&g_i2c_master0_ctrl, &reg, 1, true);assert(FSP_SUCCESS == err);

R_IIC_MASTER_Read()函数原型

在这里插入图片描述

R_SCI_I2C_Read()函数是向IIC设备中读取数据,读取格式如下所示。

    /* Read data from I2C slave */err = R_IIC_MASTER_Read(&g_i2c_master0_ctrl, bufp, len, false);assert(FSP_SUCCESS == err);

sci_i2c_master_callback()回调函数

对于数据是否发送完毕,可以查看是否获取到I2C_MASTER_EVENT_TX_COMPLETE字段。

在这里插入图片描述

/* Callback function */
i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
uint32_t  timeout_ms = 100000;
void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
{i2c_event = I2C_MASTER_EVENT_ABORTED;if (NULL != p_args){/* capture callback event for validating the i2c transfer event*/i2c_event = p_args->event;}
}

参考程序

https://github.com/STMicroelectronics/lis2mdl-pid

初始换管脚

使能CS为高电平,配置为IIC模式。

       R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_14, BSP_IO_LEVEL_HIGH);       /* Initialize the I2C module */err = R_IIC_MASTER_Open(&g_i2c_master0_ctrl, &g_i2c_master0_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);/* Initialize mems driver interface */stmdev_ctx_t dev_ctx;dev_ctx.write_reg = platform_write;dev_ctx.read_reg = platform_read;dev_ctx.handle = &SENSOR_BUS;/* Wait sensor boot time */platform_delay(BOOT_TIME);

获取ID

可以向WHO_AM_I (4Fh)获取固定值,判断是否为0x40

在这里插入图片描述
is2mdl_device_id_get为获取函数。

在这里插入图片描述

对应的获取ID驱动程序,如下所示。

  /* Wait sensor boot time */platform_delay(BOOT_TIME);/* Check device ID */lis2mdl_device_id_get(&dev_ctx, &whoamI);printf("LIS2MDL_ID=0x%x,whoamI=0x%x\n",LIS2MDL_ID,whoamI);if (whoamI != LIS2MDL_ID)while (1) {/* manage here device not found */}

复位操作

可以向CFG_REG_A (60h)的SOFT_RST寄存器写入1进行复位。

在这里插入图片描述

lis2mdl_reset_set为重置函数。

在这里插入图片描述

对应的驱动程序,如下所示。

 /* Restore default configuration */lis2mdl_reset_set(&dev_ctx, PROPERTY_ENABLE);do {lis2mdl_reset_get(&dev_ctx, &rst);} while (rst);

BDU设置

在很多传感器中,数据通常被存储在输出寄存器中,这些寄存器分为两部分:MSB和LSB。这两部分共同表示一个完整的数据值。例如,在一个加速度计中,MSB和LSB可能共同表示一个加速度的测量值。
连续更新模式(BDU = ‘0’):在默认模式下,输出寄存器的值会持续不断地被更新。这意味着在你读取MSB和LSB的时候,寄存器中的数据可能会因为新的测量数据而更新。这可能导致一个问题:当你读取MSB时,如果寄存器更新了,接下来读取的LSB可能就是新的测量值的一部分,而不是与MSB相对应的值。这样,你得到的就是一个“拼凑”的数据,它可能无法准确代表任何实际的测量时刻。
块数据更新(BDU)模式(BDU = ‘1’):当激活BDU功能时,输出寄存器中的内容不会在读取MSB和LSB之间更新。这就意味着一旦开始读取数据(无论是先读MSB还是LSB),寄存器中的那一组数据就被“锁定”,直到两部分都被读取完毕。这样可以确保你读取的MSB和LSB是同一测量时刻的数据,避免了读取到代表不同采样时刻的数据。
简而言之,BDU位的作用是确保在读取数据时,输出寄存器的内容保持稳定,从而避免读取到拼凑或错误的数据。这对于需要高精度和稳定性的应用尤为重要。
可以向CTRL3 (12h)的BDU寄存器写入1进行开启。

在这里插入图片描述

对应的驱动程序,如下所示。

  /* Enable Block Data Update */lis2mdl_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);

设置速率

速率可以通过CFG_REG_A (60h)的ODR设置速率。

在这里插入图片描述

设置速率可以使用如下函数。

  /* Set Output Data Rate */lis2mdl_data_rate_set(&dev_ctx, LIS2MDL_ODR_10Hz);

启用偏移消除

LIS2MDL 磁力计的配置寄存器(CFG_REG_B)的OFF_CANC - 这个位用于启用或禁用偏移消除。
这意味着每次磁力计准备输出新的测量数据时,它都会自动进行偏移校准,以确保数据的准确性。这通常用于校准传感器,以消除由于传感器偏移或环境因素引起的任何误差。
在这里插入图片描述

  /* Set / Reset sensor mode */lis2mdl_set_rst_mode_set(&dev_ctx, LIS2MDL_SENS_OFF_CANC_EVERY_ODR);

开启温度补偿

开启温度补偿可以通过CFG_REG_A (60h)的COMP_TEMP_EN进行配置。
在这里插入图片描述

  /* Enable temperature compensation */lis2mdl_offset_temp_comp_set(&dev_ctx, PROPERTY_ENABLE);

设置为连续模式

LIS2MDL 磁力计 CFG_REG_A (60h) 配置寄存器的MD1 和 MD0 - 这两个位用于选择设备的工作模式。
00 - 连续模式,设备连续进行测量并将结果放在数据寄存器中。
01 - 单次模式,设备进行单次测量,然后返回到空闲模式。
10 和 11 - 空闲模式,设备被置于空闲模式,但I2C和SPI接口仍然激活
在这里插入图片描述

  /* Set device in continuous mode */lis2mdl_operating_mode_set(&dev_ctx, LIS2MDL_CONTINUOUS_MODE);

轮询读取数据

对于数据是否准备好,可以查看STATUS_REG (67h)的Zyxda位,判断是否有新数据到达。
在这里插入图片描述

    uint8_t reg;/* Read output only if new value is available */lis2mdl_mag_data_ready_get(&dev_ctx, &reg);

数据OUTX_L_REG(68h)-OUTZ_H_REG(6Dh)获取。

在这里插入图片描述

      /* Read magnetic field data */memset(data_raw_magnetic, 0x00, 3 * sizeof(int16_t));lis2mdl_magnetic_raw_get(&dev_ctx, data_raw_magnetic);magnetic_mG[0] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[0]);magnetic_mG[1] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[1]);magnetic_mG[2] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[2]);

主程序

#include "hal_data.h"#include <stdio.h>
#include "lis2mdl_reg.h"fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{if(p_args->event == UART_EVENT_TX_COMPLETE){uart_send_complete_flag = true;}
}/* Callback function */
i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
uint32_t  timeout_ms = 100000;
void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
{i2c_event = I2C_MASTER_EVENT_ABORTED;if (NULL != p_args){/* capture callback event for validating the i2c transfer event*/i2c_event = p_args->event;}
}#ifdef __GNUC__                                 //串口重定向#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endifPUTCHAR_PROTOTYPE
{err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);if(FSP_SUCCESS != err) __BKPT();while(uart_send_complete_flag == false){}uart_send_complete_flag = false;return ch;
}int _write(int fd,char *pBuffer,int size)
{for(int i=0;i<size;i++){__io_putchar(*pBuffer++);}return size;
}FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER#define SENSOR_BUS g_i2c_master0_ctrl/* Private macro -------------------------------------------------------------*/
#define    BOOT_TIME        20 //ms/* Private variables ---------------------------------------------------------*/
static int16_t data_raw_magnetic[3];
static int16_t data_raw_temperature;
static float magnetic_mG[3];
static float temperature_degC;
static uint8_t whoamI, rst;
static uint8_t tx_buffer[1000];/* Extern variables ----------------------------------------------------------*//* Private functions ---------------------------------------------------------*/
/**   WARNING:*   Functions declare in this section are defined at the end of this file*   and are strictly related to the hardware platform used.**/
static int32_t platform_write(void *handle, uint8_t reg, const uint8_t *bufp,uint16_t len);
static int32_t platform_read(void *handle, uint8_t reg, uint8_t *bufp,uint16_t len);
static void tx_com(uint8_t *tx_buffer, uint16_t len);
static void platform_delay(uint32_t ms);
static void platform_init(void);/*******************************************************************************************************************//*** main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function* is called by main() when no RTOS is used.**********************************************************************************************************************/
void hal_entry(void)
{/* TODO: add your own code here *//* Open the transfer instance with initial configuration. */err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);assert(FSP_SUCCESS == err);printf("hello world!\n");R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_14, BSP_IO_LEVEL_HIGH);/* Initialize the I2C module */err = R_IIC_MASTER_Open(&g_i2c_master0_ctrl, &g_i2c_master0_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);/* Initialize mems driver interface */stmdev_ctx_t dev_ctx;dev_ctx.write_reg = platform_write;dev_ctx.read_reg = platform_read;dev_ctx.handle = &SENSOR_BUS;/* Wait sensor boot time */platform_delay(BOOT_TIME);/* Check device ID */lis2mdl_device_id_get(&dev_ctx, &whoamI);printf("LIS2MDL_ID=0x%x,whoamI=0x%x\n",LIS2MDL_ID,whoamI);if (whoamI != LIS2MDL_ID)while (1) {/* manage here device not found */}/* Restore default configuration */lis2mdl_reset_set(&dev_ctx, PROPERTY_ENABLE);do {lis2mdl_reset_get(&dev_ctx, &rst);} while (rst);/* Enable Block Data Update */lis2mdl_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);/* Set Output Data Rate */lis2mdl_data_rate_set(&dev_ctx, LIS2MDL_ODR_10Hz);/* Set / Reset sensor mode */lis2mdl_set_rst_mode_set(&dev_ctx, LIS2MDL_SENS_OFF_CANC_EVERY_ODR);/* Enable temperature compensation */lis2mdl_offset_temp_comp_set(&dev_ctx, PROPERTY_ENABLE);/* Set device in continuous mode */lis2mdl_operating_mode_set(&dev_ctx, LIS2MDL_CONTINUOUS_MODE);while (1){uint8_t reg;/* Read output only if new value is available */lis2mdl_mag_data_ready_get(&dev_ctx, &reg);if (reg) {/* Read magnetic field data */memset(data_raw_magnetic, 0x00, 3 * sizeof(int16_t));lis2mdl_magnetic_raw_get(&dev_ctx, data_raw_magnetic);magnetic_mG[0] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[0]);magnetic_mG[1] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[1]);magnetic_mG[2] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[2]);printf("Magnetic field [mG]:%4.2f\t%4.2f\t%4.2f\r\n",magnetic_mG[0], magnetic_mG[1], magnetic_mG[2]);/* Read temperature data */memset(&data_raw_temperature, 0x00, sizeof(int16_t));lis2mdl_temperature_raw_get(&dev_ctx, &data_raw_temperature);temperature_degC = lis2mdl_from_lsb_to_celsius(data_raw_temperature);printf("Temperature [degC]:%6.2f\r\n",temperature_degC);}R_BSP_SoftwareDelay(10, BSP_DELAY_UNITS_MILLISECONDS);}#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();
#endif
}

演示

在这里插入图片描述

相关文章:

e2studio开发磁力计LIS2MDL(1)----轮询获取磁力计数据

e2studio开发磁力计LIS2MDL.1--轮询获取磁力计数据 概述视频教学样品申请源码下载速率新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()prin…...

C++ 字符串大小写转换,替换,文件保存 方法封装

此示例程序方法已经封装好使用std::islower()函数可以检查一个字符是否是小写字母,使用std::isupper()函数可以检查一个字符是否是大写字母。 如果传入的字母是小写字母,则使用std::toupper()函数将其转换为大写字母,并输出转换后的结果。 如果输入的字母是大写字母,则使…...

计算机基础面试题 |19.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…...

mysql 添加用户并分配select权限

1.root用户先登录或者在可执行界面 1.1 选择mysql 点击mysql 或者在命令行 use mysql 1.2创建用户 CREATE USER username% IDENTIFIED BY password; 备注1&#xff1a;%替换为可访问数据库的ip&#xff0c;例如“127.0.0.1”“192.168.1.1”&#xff0c;使用“%”表示不限制…...

重新认识canvas,掌握必要的联结密码

查看专栏目录 canvas示例教程100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…...

Linux第21步_取消鼠标中键的复制粘贴功能

在ubuntu18.04操作系统中&#xff0c;选中文本后&#xff0c;若按下鼠标中键&#xff0c;就可以执行复制粘贴&#xff0c;相当于 CtrlshiftC 后又按了 CtrlshiftV。在Linux系统中&#xff0c;基本上都是这么配置的。在windows系统中&#xff0c;我们习惯用Ctrl-C复制&#xff0…...

数学建模-Matlab R2022a安装步骤

软件介绍 MATLAB是一款商业数学软件&#xff0c;用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境&#xff0c;主要包括MATLAB和Simulink两大部分&#xff0c;可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程…...

【AI】Pytorch 系列:学习率设置

a. 有序调整:等间隔调整(Step),按需调整学习率(MultiStep),指数衰减调整(Exponential)和 余弦退火CosineAnnealing。 b. 自适应调整:自适应调整学习率 ReduceLROnPlateau。 c. 自定义调整:自定义调整学习率 LambdaLR。 #得到当前学习率 lr = next(iter(optimizer.param_gr…...

LeetCode第107题 - 二叉树的层序遍历 II

题目 解答 class Solution {List<List<Integer>> nodeLevels new LinkedList<>();public List<List<Integer>> levelOrderBottom(TreeNode root) {levelOrder(root, 0);List<List<Integer>> nodeLevels2 new LinkedList<>…...

java 常⽤的线程池模式FixedThreadPool

java 常⽤的线程池模式FixedThreadPool 线程池中的线程数量是固定的。 当提交一个新任务时&#xff0c;如果线程池中的线程都在运行&#xff0c;新任务就会被放入任务队列中等待执行。 如果线程池中的所有线程都在运行&#xff0c;且任务队列已满&#xff0c;那么线程池会创建新…...

双机调度算法

假设当前有两个处理机A、B&#xff0c;以及n个待处理的任务。第i个任务在处理处理机A上处理需要的时间为ai&#xff0c;在处理机B上处理的时间为bi&#xff0c;两个处理机可以并行处理任务&#xff0c;但单个处理机不能同时执行任务。要求给定n个任务及各个任务对应的ai 、bi&a…...

精进单元测试技能——Pytest断言的艺术

本篇文章主要是阐述Pytest在断言方面的应用。让大家能够了解和掌握Pytest针对断言设计了多种功能以适应在不同测试场景上使用。 了解断言的基础 在Pytest中&#xff0c;断言是通过 assert 语句来实现的。简单的断言通常用于验证预期值和实际值是否相等&#xff0c;例如&#xf…...

探索人工智能:深度学习、人工智能安全和人工智能

深度学习是人工智能的一种重要技术&#xff0c;它模拟了人类大脑神经网络的工作原理&#xff0c;通过建立多层次的神经元网络来实现对数据的分析和处理。这种技术的引入使得人工智能的发展进入到了一个新的阶段。 现如今&#xff0c;深度学习在各个领域都有着广泛的应用。例如…...

CHS_02.1.4+操作系统体系结构 二

CHS_02.1.4操作系统体系结构 二 操作系统的结构 上篇文章我们只介绍过宏内核 也就是大内核以及微内核分层结构的操作系统模块化是一种很经典的程序设计思想宏内核和微内核外核 操作系统的结构 上篇文章我们只介绍过宏内核 也就是大内核以及微内核 今年大纲又增加了分层结构 模块…...

【python可视化大屏】使用python实现可拖拽数据可视化大屏

介绍&#xff1a; 我在前几期分享了关于爬取weibo评论的爬虫&#xff0c;同时也分享了如何去进行数据可视化的操作。但是之前的可视化都是单独的&#xff0c;没有办法在一个界面上展示的。这样一来呢&#xff0c;大家在看的时候其实是很不方便的&#xff0c;就是没有办法一目了…...

FineBI实战项目一(4):指标分析之每日订单总额/总笔数

1 明确数据分析目标 统计每天的订单总金额及订单总笔数 2 创建用于保存数据分析结果的表 use finebi_shop_bi;create table app_order_total(id int primary key auto_increment,dt date,total_money double,total_cnt int ); 3 编写SQL语句进行数据分析 selectsubstring(c…...

如何确定CUDA对应的pytorch版本?

参考&#xff1a;此链接...

分布式锁3: zk实现分布式锁5 使用中间件curator

一 curator的说明 1.1 curator的说明 curator是netflix公司开源的一个zk客户端。对Zookeeper提供的原生客户端进行封装&#xff0c;简化了Zookeeper客户端的开发量。Curator解决了很多zookeeper客户端非常底层的细节开发工作&#xff0c;包括连接重连、反复注册wathcer和Node…...

扩展边界opencv

扩展图像的边缘&#xff08;如上边增加50像素&#xff09;通常是通过添加额外的像素行来实现的 使用cv2.copyMakeBorder函数 valueborder_color指定了边框的颜色 import cv2 import numpy as np# 读取图像 image cv2.imread(th.jpg)# 设置边框宽度 top_border_width 50 # …...

开源C语言库Melon:Cron格式解析

本文介绍开源C语言库Melon的cron格式解析。 关于 Melon 库&#xff0c;这是一个开源的 C 语言库&#xff0c;它具有&#xff1a;开箱即用、无第三方依赖、安装部署简单、中英文文档齐全等优势。 Github repo 简介 cron也就是我们常说的Crontab中的时间格式&#xff0c;格式如…...

vue的学习方法

学习Vue.js的方法如下&#xff1a; 先了解基本概念和语法&#xff1a;学习Vue.js的第一步是了解它的基本概念&#xff0c;例如组件、指令、数据绑定等。你可以开始阅读Vue官方文档并参考教程和示例来掌握这些基本概念和语法。 实践项目&#xff1a;在理解了Vue.js的基本概念和…...

Hive之set参数大全-2

C 指定是否启用表达式缓存的评估 hive.cache.expr.evaluation 是 Hive 中的一个配置属性&#xff0c;用于指定是否启用表达式缓存的评估。表达式缓存是一项优化技术&#xff0c;它可以在执行查询时缓存表达式的评估结果&#xff0c;以减少计算开销。 在 Hive 配置中&#xf…...

C++面试宝典第17题:找规律填数

题目 仔细观察下面的数字序列,找到规律,并填写空白处的数字。 (1)1, 2, 4, 7, 11, 16, __ (2)-1, 2, 7, 28, __, 126 (3)6, 10, 18, 32, 57, __ (4)19, 6, 1, 2, 11, __ (5)2, 3, 5, 7, 11, __ (6)1, 8, 9, 4, __, 1/6 (7)1, 2, 3, 7, 16, __, 321 (8)1, 2, …...

ubuntu查看内存使用情况

在Ubuntu中&#xff0c;你可以使用一些命令来查看内存使用情况。这些命令可以帮助你了解系统的内存使用情况&#xff0c;包括已用内存、空闲内存、缓存和缓冲区的内存等。 1、使用free命令 free命令是一个非常有用的命令&#xff0c;可以快速查看系统的内存使用情况。在终端中…...

ES6 新增 Set、Map 两种数据结构的理解

ES6 新增 Set、Map 两种数据结构的理解 Set 是一种叫做集合的数据结构&#xff0c; 集合是由一堆无序的、相关联的 , 且不重复的内存结构【 数学中称为元素 】组成的组合&#xff1b; Map 是一种叫做字典的数据结构 字典是一些元素的集合 。每个元素有一个称作 key 的域 , 不同…...

影视视频知识付费行业万能通用网站系统源码,三网合一,附带完整的安装部署教程

在数字化时代&#xff0c;知识付费行业逐渐成为主流。人们对高质量内容的需求日益增长&#xff0c;越来越多的人愿意为有价值的知识和信息服务付费。为了满足这一市场需求&#xff0c;罗峰给大家分享一款全新的影视视频知识付费网站系统源码&#xff0c;为用户提供一站式的知识…...

Java字符串拼接常用方法总结

使用场景&#xff1a;用某个分隔符拼接字符串 下边是我使用过的几种方式废话不多说&#xff0c;直接上代码初始数据 1.使用流2.StringBuilder3.[StringJoiner](https://blog.csdn.net/qq_43417581/article/details/126076152?ops_request_misc%257B%2522request%255Fid%2522%2…...

【2023 CSIG垂直领域大模型】大模型时代,如何完成IDP智能文档处理领域的OCR大一统?

目录 一、像素级OCR统一模型&#xff1a;UPOCR1.1、为什么提出UPOCR&#xff1f;1.2、UPOCR是什么?1.2.1、Unified Paradigm 统一范式1.2.2、Unified Architecture统一架构1.2.3、Unified Training Strategy 统一训练策略 1.3、UPOCR效果如何&#xff1f; 二、OCR大一统模型前…...

Phi-2小语言模型QLoRA微调教程

前言 就在不久前&#xff0c;微软正式发布了一个 27 亿参数的语言模型——Phi-2。这是一种文本到文本的人工智能程序&#xff0c;具有出色的推理和语言理解能力。同时&#xff0c;微软研究院也在官方 X 平台上声称&#xff1a;“Phi-2 的性能优于其他现有的小型语言模型&#…...

hadoop自动获取时间

1、自动获取前15分钟 substr(from_unixtime(unix_timestamp(concat(substr(20240107100000,1,4),-,substr(20240107100000,5,2),-,substr(20240107100000,7,2), ,substr(20240107100000,9,2),:,substr(20240107100000,11,2),:,00))-15*60,yyyyMMddHHmmss),1) unix_timestam…...

【面试高频算法解析】算法练习8 单调队列

前言 本专栏旨在通过分类学习算法&#xff0c;使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目&#xff0c;帮助您深度理解每种算法&#xff0c;避免出现刷了很多算法题&#xff0c;还是一知半解的状态 专栏导航 二分查找回溯&#xff08;Backtracking&…...

ATTCK视角下的信息收集:Sysmon检测

目录 1、简介 2、使用Sysmon 3、检测Sysmon是否安装运行 4、检测Sysmon是否被卸载 5、使Sysmon在终端隐匿运行的技术 1、简介 Sysmon&#xff08;系统监视器&#xff09;是由windows sysinternals 出品的Sysinternals 系列工具中的一个 它是windows系统服务和设备驱动程…...

02、Kafka ------ 配置 Kafka 集群

目录 配置 Kafka 集群配置步骤启动各Kafka节点 配置 Kafka 集群 启动命令&#xff1a; 1、启动 zookeeper 服务器端 小黑窗输入命令&#xff1a; zkServer 2、启动 zookeeper 的命令行客户端工具 &#xff08;这个只是用来看连接的节点信息&#xff0c;不启动也没关系&#…...

2024年全球网络安全预测报告

1.Gartner Gartners Top Strategic Predictions for 2024 and Beyond《Gartner顶级战略预测&#xff1a;2024年及未来》 https://www.gartner.com/en/articles/gartner-s-top-strategic-predictions-for-2024-and-beyond 2.IDC Top 10 Worldwide IT Industry 2024 Predict…...

Qt - QML与C++数据交互详解

文章目录 1 . 前言2 . Qml调用C的变量3 . Qml调用C的类4 . Qml调用C的方法5 . Qml接收C的信号6 . C接收Qml的信号&#xff08;在Qml中定义信号槽&#xff09;7 . C接收Qml的信号&#xff08;在C中定义信号槽&#xff09;8 . C调用Qml的函数9 . 总结 【极客技术传送门】 : https…...

Kettle Local引擎使用记录(一)(基于Kettle web版数据集成开源工具data-integration源码)

Kettle Web &#x1f4da;第一章 前言&#x1f4da;第二章 demo源码&#x1f4d7;pom.xml引入Kettle引擎核心文件&#x1f4d7;java源码&#x1f4d5; controller&#x1f4d5; service&#x1f4d5; 其它&#x1f4d5; maven settings.xml &#x1f4d7;测试&#x1f4d5; 测试…...

Java--业务场景:在Spring项目启动时加载Java枚举类到Redis中(补充)

文章目录 前言步骤测试结果 前言 通过Java–业务场景&#xff1a;在Spring项目启动时加载Java枚举类到Redis中,我们成功将Java项目里的枚举类加载到Redis中了&#xff0c;接下来我们只需要写接口获取需要的枚举值数据就可以了&#xff0c;下面一起来编写这个接口吧。 步骤 在…...

WPF 基础入门(资源字典)

资源字典 每个Resources属性存储着一个资源字典集合。如果希望在多个项目之间共享资源的话&#xff0c;就可以创建一个资源字典。资源字段是一个简单的XAML文档&#xff0c;该文档就是用于存储资源的&#xff0c;可以通过右键项目->添加资源字典的方式来添加一个资源字典文件…...

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑电氢耦合和碳交易的电氢能源系统置信间隙鲁棒规划》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这标题涉及到一个复杂的能源系统规划问题&#xff0c;其中考虑了电氢耦合、碳交易和置信间隙鲁棒规划。以下是对标题各个部分的解读&#xff1a; 电氢耦…...

ubuntu设定时间与外部ntp同步

前言 在 Ubuntu 上&#xff0c;你可以通过配置 systemd-timesyncd 服务来与外部 NTP 服务器同步系统时间。下面是设置的步骤&#xff1a; 安装 NTP 工具&#xff1a; 如果你的系统中没有安装 ntpdate 工具&#xff0c;可以使用以下命令安装&#xff1a; sudo apt-get updat…...

DataFrame详解

清洗相关的API 清洗相关的API: 1.去重API: dropDupilcates 2.删除缺失值API: dropna 3.替换缺失值API: fillna 去重API: dropDupilcates dropDuplicates(subset):删除重复数据 1.用来删除重复数据,如果没有指定参数subset,比对行中所有字段内容,如果全部相同,则认为是重复数据,…...

控制障碍函数(Control Barrier Function,CBF) 三、代码

三、代码实现 3.1、模型 这是一个QP问题&#xff0c;所以我们直接建模 这其实还是之前的那张图&#xff0c;我们把这个大的框架带入到之前的那个小车追击的问题中去&#xff0c;得到以下的一些具体的约束条件 CLF约束 L g V ( x ) u − δ ≤ − L f V ( x ) − λ V ( x ) …...

哈希表-散列表数据结构

1、什么是哈希表&#xff1f; 哈希表也叫散列表&#xff0c;哈希表是根据关键码值(key value)来直接访问的一种数据结构&#xff0c;也就是将关键码值(key value)通过一种映射关系映射到表中的一个位置来加快查找的速度&#xff0c;这种映射关系称之为哈希函数或者散列函数&…...

C# 强制类型转换和as区别和不同使用场景

文章目录 1.强制类型转换2. as 运算符3.实例总结&#xff1a; 在C#中&#xff0c;as 和 强制类型转换&#xff08;例如 (T)value&#xff09;的主要区别在于它们处理类型转换不成功时的行为和适用场景&#xff1a; 1.强制类型转换 使用语法&#xff1a;Type variable (Type)…...

什么是 DDoS 攻击

布式拒绝服务 (DDoS) 攻击是一种恶意尝试,通过大量互联网流量淹没目标或其周围基础设施,从而破坏目标服务器、服务或网络的正常流量。 DDoS 攻击通过利用多个受感染的计算机系统作为攻击流量源来实现有效性。被利用的机器可以包括计算机和其他网络资源。 从高层来看,DDoS 攻…...

c++隐式类型转换与explicit

我们知道&#xff0c;一个float与int做运算时&#xff0c;系统会首先个int类型转换为float类型之后再进行运算&#xff0c;这种隐式类型转换也会发生在类中 看以下例子&#xff0c;定义一个类 class myTime { public:int Hour;myTime() {};myTime(int h) :Hour(h) {}; }; 在…...

BERT Intro

继续NLP的学习&#xff0c;看完理论之后再看看实践&#xff0c;然后就可以上手去kaggle做那个入门的project了orz。 参考&#xff1a; 1810.04805.pdf (arxiv.org) BERT 论文逐段精读【论文精读】_哔哩哔哩_bilibili (强推!)2023李宏毅讲解大模型鼻祖BERT&#xff0c;一小时…...

“To-Do Master“ GPTs:重塑任务管理的趣味与效率

有 GPTs 访问权限的可以点击链接进行体验&#xff1a;https://chat.openai.com/g/g-IhGsoyIkP-to-do-master 部署私人的 To-Do Master 教程&#xff1a;https://github.com/Reborn14/To-Do-Master/tree/main 引言 在忙碌的日常生活中&#xff0c;有效地管理日常任务对于提高生…...

npm安装vue,添加淘宝镜像

如果是第一次使用命令栏可能会遇到权限问题。 解决vscode无法运行npm和node.js命令的问题-CSDN博客 安装 在vscode上面的导航栏选择terminal打开新的命令栏 另外可能会遇到网络或者其他的问题&#xff0c;可以添加淘宝镜像 npm install -g cnpm --registryhttps://registry.…...

LeetCode 2707. 字符串中的额外字符

一、题目 1、题目描述 给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串&#xff0c;每个子字符串都在 dictionary 中出现过。s 中可能会有一些 额外的字符 不在任何子字符串中。 请你采取最优策略分割 s &#xff…...