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

佛山微信网站建设多少钱/seo关键词排名怎么优化

佛山微信网站建设多少钱,seo关键词排名怎么优化,用ps做网站的首页,网站开发语言对比目录 一.SPI驱动相关结构体与函数 1.struct spi_master 结构体 2.申请 spi_master - spi_alloc_master 3.释放 spi_master - spi_master_put 4.向内核注册 spi_master - spi_register_master 5.注销掉 spi_master 6.struct spi_driver 结构体 7.向内核注册 spi_driver -…

目录

一.SPI驱动相关结构体与函数

1.struct spi_master 结构体

2.申请 spi_master - spi_alloc_master

3.释放 spi_master - spi_master_put

4.向内核注册 spi_master - spi_register_master

5.注销掉 spi_master

6.struct spi_driver 结构体

7.向内核注册 spi_driver - spi_register_driver

8.注销 spi_driver - spi_unregister_driver

9.struct spi_transfer 结构体

10.struct spi_message 结构体

11.初始化 spi_message

12.将 spi_transfer 添加到 spi_message 队列中

13.SPI 同步传输数据 - spi_sync

14.SPI 异步传输数据 - spi_async

二.SPI实验 - ICM20608

1.设备树

(1).流程图

(2).设备树代码

​编辑

2.驱动部分

(1).流程图

​编辑

(2).驱动部分代码

3.应用程序


一.SPI驱动相关结构体与函数

1.struct spi_master 结构体

struct spi_master 
{struct device dev;struct list_head list;......s16 bus_num;/* chipselects will be integral to many controllers; some others* might use board-specific GPIOs.*/u16 num_chipselect;/* some SPI controllers pose alignment requirements on DMAable* buffers; let protocol drivers know about these requirements.*/u16 dma_alignment;/* spi_device.mode flags understood by this controller driver */u16 mode_bits;/* bitmask of supported bits_per_word for transfers */u32 bits_per_word_mask;....../* limits on transfer speed */u32 min_speed_hz;u32 max_speed_hz;/* other constraints relevant to this driver */u16 flags;/* lock and mutex for SPI bus locking */spinlock_t bus_lock_spinlock;struct mutex bus_lock_mutex;/* flag indicating that the SPI bus is locked for exclusive use */bool bus_lock_flag;......int (*setup)(struct spi_device *spi);......int (*transfer)(struct spi_device *spi,struct spi_message *mesg);......int (*transfer_one_message)(struct spi_master *master,struct spi_message *mesg);......
};

2.申请 spi_master - spi_alloc_master

/*** @description:            申请 spi_master* @param - dev     :       设备,一般是 platform_device 中的 dev 变量* @param - size    :       私有数据大小,可以通过 spi_master_get_devdata 函数获取到这些私有数据* @return          :       申请到的 spi_master*/
struct spi_master *spi_alloc_master(struct device *dev,unsigned int size)

3.释放 spi_master - spi_master_put

/*** @description:            释放 spi_master* @param - master  :       要释放的 spi_master* @return          :       无*/
void spi_master_put(struct spi_master *master)

4.向内核注册 spi_master - spi_register_master

/*** @description:            向内核注册 spi_master* @param - master      :   要向内核注册的 spi_master* @return              :   成功则返回(0),失败则返回(-1)*/
int spi_register_master(struct spi_master *master)

5.注销掉 spi_master

/*** @description:            注销 spi_master* @param - master  :       要注销的 spi_master* @return          :       无*/
void spi_unregister_master(struct spi_master *master)

6.struct spi_driver 结构体

struct spi_driver 
{const struct spi_device_id *id_table;int (*probe)(struct spi_device *spi);int (*remove)(struct spi_device *spi);void (*shutdown)(struct spi_device *spi);struct device_driver driver;
};

7.向内核注册 spi_driver - spi_register_driver

/*** @description:            向内核注册 spi_driver* @param - sdrv        :   要注册的 spi_driver* @return              :   成功则返回(0),失败则返回(负值)*/
int spi_register_driver(struct spi_driver *sdrv)

8.注销 spi_driver - spi_unregister_driver

/*** @description:            注销 spi_driver* @param - sdrv        :   要注销的 spi_driver* @return              :   无*/
void spi_unregister_driver(struct spi_driver *sdrv)

9.struct spi_transfer 结构体

struct spi_transfer 
{/* 发送数据缓冲区 */const void *tx_buf;/* 接收数据缓冲区 */         void *rx_buf;/* 数据长度 */unsigned len;dma_addr_t tx_dma;dma_addr_t rx_dma;struct sg_table tx_sg;struct sg_table rx_sg;unsigned cs_change:1;unsigned tx_nbits:3;unsigned rx_nbits:3;#define SPI_NBITS_SINGLE 0x01 /* 1bit transfer */#define SPI_NBITS_DUAL 0x02 /* 2bits transfer */#define SPI_NBITS_QUAD 0x04 /* 4bits transfer */u8 bits_per_word;u16 delay_usecs;u32 speed_hz;struct list_head transfer_list;
};

10.struct spi_message 结构体

struct spi_message 
{struct list_head transfers;struct spi_device *spi;unsigned is_dma_mapped:1;....../* completion is reported through a callback */void (*complete)(void *context);原子哥在线教学:www.yuanzige.com 论坛:www.openedv.comvoid *context;unsigned frame_length;unsigned actual_length;int status;struct list_head queue;void *state;
};

11.初始化 spi_message

/*** @description:            初始化 spi_message* @param - m       :       要初始化的 spi_message* @return          :       无*/
void spi_message_init(struct spi_message *m)

12.将 spi_transfer 添加到 spi_message 队列中

/*** @description:            将 spi_transfer 添加到 spi_message 队列中* @param - t       :       要添加至 spi_message 队列中的 spi_transfer* @param - m       :       spi_transfer 要加入的 spi_message* @return          :       无*/
void spi_message_add_tail(struct spi_transfer *t,struct spi_message *m)

13.SPI 同步传输数据 - spi_sync

/*** @description:            SPI 同步传输数据* @param - spi         :   要进行数据传输的 SPI* @param - message     :   要传输的 spi_message* @return              :   无       */
int spi_sync(struct spi_device *spi,struct spi_message *message)

14.SPI 异步传输数据 - spi_async

/*** @description:            SPI 异步传输数据* @param - spi     :       要进行数据传输的 SPI* @param - message :       要传输的 spi_message* @return          :       无*/
int spi_async(struct spi_device *spi,struct spi_message *message)

二.SPI实验 - ICM20608

1.设备树

(1).流程图

(2).设备树代码

2.驱动部分

(1).流程图

(2).驱动部分代码

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of_gpio.h>
#include <linux/semaphore.h>
#include <linux/timer.h>
#include <linux/i2c.h>
#include <linux/spi/spi.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h>
#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include "icm20608reg.h"#define ICM20608_CNT    1           /* 设备数量 */
#define ICM20608_NAME   "icm20608"  /* 设备名字 *//* 设备结构体 */
struct icm20608_dev
{dev_t devid;                /* 设备号 */struct cdev cdev;           /* cdev */struct class *class;        /* 类 */struct device *device;      /* 设备 */struct device_node *nd;     /* 设备结点 */int major;                  /* 主设备号 */void *private_data;         /* 私有数据 */int cs_gpio;                /* 片选所使用的 GPIO 编号 */signed int gyro_x_adc;      /* 陀螺仪 X 轴原始值 */signed int gyro_y_adc;      /* 陀螺仪 Y 轴原始值 */signed int gyro_z_adc;      /* 陀螺仪 Z 轴原始值 */signed int accel_x_adc;     /* 加速度计 X 轴原始值 */signed int accel_y_adc;     /* 加速度计 Y 轴原始值 */signed int accel_z_adc;     /* 加速度计 Z 轴原始值 */signed int temp_adc;        /* 温度原始值 */
};static struct icm20608_dev icm20608dev;/*** @description:            从icm20608读取多个寄存器数据* @param - dev     :       icm20608设备* @param - reg     :       要读取的寄存器首地址* @param - buf     :       用于存储读到的数据* @param - len     :       要读取的数据的长度* @return          :       操作结果,0为成功,其他为失败*/
static int icm20608_read_regs(struct icm20608_dev *dev,u8 reg,void *buf,int len)
{int ret = -1;unsigned char txdata[1];        //发送的数据为要读取的寄存器首地址unsigned char *rxdata;          //存储该函数SPI整个过程接收到的数据struct spi_message m;struct spi_transfer *t;/* 获取私有数据 */struct spi_device *spi = (struct spi_device *)dev->private_data;t = kzalloc(sizeof(struct spi_transfer),GFP_KERNEL);if(!t){return -ENOMEM;}rxdata = kzalloc(sizeof(char)*len,GFP_KERNEL);if(!rxdata){goto out1;}/* 一共发送 len+1 个字节的数据,第一个字节为寄存器首地址,一共读取len个字节长度的数据 */txdata[0] = reg | 0x80;         /* 写数据的时候,首寄存器地址 bit8 要置1 */t->tx_buf = txdata;             /* 要发送的数据 */t->rx_buf = rxdata;             /* 接收数据的缓冲区 */t->len = len + 1;               /* t->len = 一个字节的寄存器首地址 + 要读取的长度 */spi_message_init(&m);           /* 初始化 spi_message */spi_message_add_tail(t,&m);     /* 将 spi_transfer 添加到 spi_message 队列中 */ret = spi_sync(spi,&m);         /* 同步发送 */if(ret){goto out2;}memcpy(buf,rxdata + 1,len);     /* 只需要读取的数据,rxdata的第一个字节的数据没有意义 */out2:kfree(rxdata);                  /* 释放内存 */out1:kfree(t);                       /* 释放内存 */return ret;
}/*** @description:            向icm20608多个寄存器写入数据* @param - dev     :       icm20608 设备* @param - reg     :       要写的寄存器首地址* @param - buf     :       要写入的数据缓冲区* @param - len     :       要写入数据的长度* @return          :       操作结果*/
static s32 icm20608_write_regs(struct icm20608_dev *dev,u8 reg,u8 *buf,u8 len)
{int ret = -1;unsigned char *txdata;struct spi_message m;struct spi_transfer *t;struct spi_device *spi = (struct spi_device *)dev->private_data;t = kzalloc(sizeof(struct spi_transfer),GFP_KERNEL);if(!t){return -ENOMEM;}txdata = kzalloc(sizeof(char) + len,GFP_KERNEL);        //第一个字节为寄存器首地址,后面的内容为要写的内容if(!txdata){goto out1;}/* 一共要发送 len+1 个字节,第一个字节为寄存器首地址,len 为要写入寄存器的集合 */*txdata = reg & ~0x80;                  /* 写数据的时候,寄存器首地址 bit8 要清零 */memcpy(txdata+1,buf,len);               /* 将要写入的数据拷贝到缓冲区中 */t->tx_buf = txdata;                     /* 要发送的数据 */t->len = len+1;                         /* t->len = 发送的数据段长度+一个字节的寄存器首地址 */spi_message_init(&m);                   /* 初始化 spi_message */spi_message_add_tail(t,&m);             /* 将 spi_transfer 添加到 spi_message 队列中 */ret = spi_sync(spi,&m);if(ret){goto out2;}out2:kfree(txdata);
out1:kfree(t);return ret;
}/*** @descsription:           读取icm20608指定寄存器的值,只读取一个字节* @param - dev         :   icm20608设备* @param - reg         :   要读取的寄存器首地址* @return              :   返回读取到的值 */
static unsigned char icm20608_read_onereg(struct icm20608_dev *dev,u8 reg)
{unsigned char data;icm20608_read_regs(dev,reg,&data,1);return data;
}/*** @description:            向icm20608指定寄存器写入一个字节的数据* @param - dev     :       icm20608设备* @param - reg     :       要写入的寄存器首地址* @param - value   :       要写入的值*/
void icm20608_write_onereg(struct icm20608_dev *dev,u8 reg,u8 value)
{u8 data = value;icm20608_write_regs(dev,reg,&data,1);
}/*** @description:            读取 icm20608 的原始数据,包括三轴陀螺仪、三轴加速度计和内部温度* @param - dev     :       icm20608 设备,读取到的数据会存入该设备结构体内* @return          :       无*/
void icm20608_readdata(struct icm20608_dev *dev)
{unsigned char data[14] = {0};icm20608_read_regs(dev,ICM20_ACCEL_XOUT_H,data,14);     //读取数据并存储在 data 缓冲区中dev->accel_x_adc = (signed short)((data[0] << 8) | data[1]);dev->accel_y_adc = (signed short)((data[2] << 8) | data[3]);dev->accel_z_adc = (signed short)((data[4] << 8) | data[5]);dev->temp_adc    = (signed short)((data[6] << 8) | data[7]);dev->gyro_x_adc  = (signed short)((data[8] << 8) | data[9]);dev->gyro_y_adc  = (signed short)((data[10] << 8) | data[11]);dev->gyro_z_adc  = (signed short)((data[12] << 8) | data[13]);
}/*** @description:            内部寄存器初始化函数* @param           :       无* @return          :       无*/
void icm20608_reginit(void)
{u8 value = 0;icm20608_write_onereg(&icm20608dev,ICM20_PWR_MGMT_1,0X80);mdelay(50);icm20608_write_onereg(&icm20608dev,ICM20_PWR_MGMT_1,0X81);mdelay(50);/* 获取 ICM20608 设备ID */value = icm20608_read_onereg(&icm20608dev,ICM20_WHO_AM_I);printk("ICM20608 ID = %#X\r\n",value);icm20608_write_onereg(&icm20608dev,ICM20_SMPLRT_DIV,0X00);icm20608_write_onereg(&icm20608dev,ICM20_GYRO_CONFIG,0X18);icm20608_write_onereg(&icm20608dev,ICM20_ACCEL_CONFIG,0X18);icm20608_write_onereg(&icm20608dev,ICM20_CONFIG,0X04);icm20608_write_onereg(&icm20608dev,ICM20_ACCEL_CONFIG2,0X04);icm20608_write_onereg(&icm20608dev,ICM20_PWR_MGMT_2,0X00);icm20608_write_onereg(&icm20608dev,ICM20_LP_MODE_CFG,0X00);icm20608_write_onereg(&icm20608dev,ICM20_FIFO_EN,0X00);
}/*** @description:            打开设备* @param - inode   :       传递给驱动的inode* @param - filp    :       设备文件,一般使 filp->private_data 指向设备结构体* @return          :       0成功,其他失败*/
static int icm20608_open(struct inode *inode,struct file *filp)
{/* 设置私有数据 */filp->private_data = &icm20608dev;return 0;
}/*** @description:            从设备读取数据* @param - filp    :       要打开的设备* @param - buf     :       返回给用户空间的数据缓冲区* @param - cnt     :       要读取的字节数* @param - offt    :       相对于文件首地址的偏移量* @return          :       成功则返回(读取到的字节数),失败则返回(负值)*/
static ssize_t icm20608_read(struct file *filp,char __user *buf,size_t cnt,loff_t *offt)
{signed int data[7];long err = 0;struct icm20608_dev *dev = (struct icm20608_dev *)filp->private_data;icm20608_readdata(dev);data[0] = dev->gyro_x_adc;data[1] = dev->gyro_y_adc;data[2] = dev->gyro_z_adc;data[3] = dev->accel_x_adc;data[4] = dev->accel_y_adc;data[5] = dev->accel_z_adc;data[6] = dev->temp_adc;err = copy_to_user(buf,data,sizeof(data));return 0;
}/*** @description:            关闭/释放设备* @param           :       无* @return          :       0成功,其他失败*/
static int icm20608_release(struct inode *inode,struct file *filp)
{return 0;
}/* 设备操作函数  */
static const struct file_operations icm20608_ops = 
{.owner = THIS_MODULE,.open = icm20608_open,.read = icm20608_read,.release = icm20608_release,
};/*** @description:            probe函数,当设备与驱动匹配成功后就会执行此函数* @param - spi     :       spi 设备* @return          :       0成功,其他失败*/
static int icm20608_probe(struct spi_device *spi)
{printk("driver and device matched!\r]n");/* 1.构建设备号 */if(icm20608dev.major){icm20608dev.devid = MKDEV(icm20608dev.major,0);register_chrdev_region(icm20608dev.devid,ICM20608_CNT,ICM20608_NAME);}else{alloc_chrdev_region(&icm20608dev.devid,0,ICM20608_CNT,ICM20608_NAME);icm20608dev.major = MAJOR(icm20608dev.devid);}/* 2.注册cdev */cdev_init(&icm20608dev.cdev,&icm20608_ops);cdev_add(&icm20608dev.cdev,icm20608dev.devid,ICM20608_CNT);/* 3.创建类 */icm20608dev.class = class_create(THIS_MODULE,ICM20608_NAME);if(IS_ERR(icm20608dev.class)){return PTR_ERR(icm20608dev.class);}/* 4.创建设备 */icm20608dev.device = device_create(icm20608dev.class,NULL,icm20608dev.devid,NULL,ICM20608_NAME);if(IS_ERR(icm20608dev.device)){return PTR_ERR(icm20608dev.device);}/* 初始化 spi_device */spi->mode = SPI_MODE_0;     /* MODE0 : CPOL=0,CPHA=0 */spi_setup(spi);icm20608dev.private_data = spi;     //设置私有数据/* 初始化 ICM20608 内部寄存器 */icm20608_reginit();return 0;
}/*** @description:            remove函数,移除SPI驱动的时候会执行此函数* @param - spi     :       spi设备* @return          :       成功则返回(0),失败则返回(其他值)*/
static int icm20608_remove(struct spi_device *spi)
{/* 1.删除设备 */cdev_del(&icm20608dev.cdev);unregister_chrdev_region(icm20608dev.devid,ICM20608_CNT);/* 注销掉类和设备 */device_destroy(icm20608dev.class,icm20608dev.devid);class_destroy(icm20608dev.class);return 0;
}/* 无设备树下的匹配方式 - ID列表 */
static const struct spi_device_id icm20608_id[] = 
{{"alientek,icm20608",0},{}
};/* 设备树下的匹配方式 - 匹配列表 */
static const struct of_device_id icm20608_of_match[] = 
{{.compatible = "alientek,icm20608"},{}
};/* SPI驱动结构体 */
static struct spi_driver icm20608_driver = 
{.probe = icm20608_probe,.remove = icm20608_remove,.driver = {.owner = THIS_MODULE,.name = "icm20608",.of_match_table = icm20608_of_match,        //设备树下的匹配列表},.id_table = icm20608_id,                        //无设备树下的 ID列表
};/*** @description:            驱动入口函数* @param           :       无* @return          :       无*/
static int __init icm20608_init(void)
{return spi_register_driver(&icm20608_driver);
}/*** @description:            驱动出口函数* @param           :       无* @return          :       无*/
static void __exit icm20608_exit(void)
{spi_unregister_driver(&icm20608_driver);
}module_init(icm20608_init);
module_exit(icm20608_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("kaneki");

3.应用程序

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, char  *argv[])
{int ret,fd;char *filename;signed int databuf[7];unsigned char data[14];/* icm20608的原始值 */signed int gyro_x_adc,gyro_y_adc,gyro_z_adc;signed int accel_x_adc,accel_y_adc,accel_z_adc;signed int temp_adc;/* icm20608的实际值 */ float gyro_x_act,gyro_y_act,gyro_z_act;float accel_x_act,accel_y_act,accel_z_act;float temp_act;if(2 != argc){printf("Usage : ./%s <dev_path>\n",argv[0]);return -1;}filename = argv[1];fd = open(filename,O_RDONLY);if(0 > fd){perror("open error");return -1;}while(1){ret = read(fd,databuf,sizeof(databuf));/* 读取成功 */if(0 == ret){/* 得到原始值 */gyro_x_adc = databuf[0];gyro_y_adc = databuf[1];gyro_z_adc = databuf[2];accel_x_adc = databuf[3];accel_y_adc = databuf[4];accel_z_adc = databuf[5];temp_adc = databuf[6];/* 计算得到实际值 */gyro_x_act = (float)(gyro_x_adc) / 16.4;gyro_y_act = (float)(gyro_y_adc) / 16.4;gyro_z_act = (float)(gyro_z_adc) / 16.4;accel_x_act = (float)(accel_x_adc) / 2048;accel_y_act = (float)(accel_y_adc) / 2048;accel_z_act = (float)(accel_z_adc) / 2048;temp_act = ((float)(temp_adc - 25) / 326.8 + 25);printf("----原始值-----\n");printf("gx = %d,gy = %d,gz = %d\n",gyro_x_adc,gyro_y_adc,gyro_z_adc);printf("ax = %d,ay = %d,az = %d\n",accel_x_adc,accel_y_adc,accel_z_adc);printf("temp = %d\n",temp_adc);printf("----实际值----\n");printf("act gx = %.2f,act gy = %.2f,act gz = %.2f\n",gyro_x_act,gyro_y_act,gyro_z_act);printf("act ax = %.2f,act ay = %.2f,act az = %.2f\n",accel_x_act,accel_y_act,accel_z_act);printf("act temp = %.2f\n",temp_act);}usleep(100000); /* 100ms*/}close(fd);return 0;
}

相关文章:

(Linux驱动学习 -13).SPI驱动实验

目录 一.SPI驱动相关结构体与函数 1.struct spi_master 结构体 2.申请 spi_master - spi_alloc_master 3.释放 spi_master - spi_master_put 4.向内核注册 spi_master - spi_register_master 5.注销掉 spi_master 6.struct spi_driver 结构体 7.向内核注册 spi_driver -…...

Angular 框架入门教程:从安装到路由、服务与状态管理详解

一、引言 在前端开发领域&#xff0c;Angular 是一个强大且流行的框架。它由 Google 维护&#xff0c;基于 TypeScript&#xff0c;采用模块化设计&#xff0c;提供了组件化开发、依赖注入、路由、表单处理等丰富功能&#xff0c;旨在帮助开发者构建高效、可维护的单页应用程序…...

【华为HCIP实战课程十八】OSPF的外部路由类型,网络工程师

一、外部路由类型: 上节讲的外部路由类型,无关乎COST大小,OSPF外部路由类型1优先于外部路由类型2 二、转发地址实验拓扑 我们再SW3/R5/R6三台设备运行RIP,SW3即运行RIP又运行OSPF SW3配置rip [SW3-rip-1]ver 2 [SW3-rip-1]network 10.0.0.0 AR5去掉ospf配置和AR6配置rip…...

oss 简单命令(已亲测)

1、 服务器本地文件复制到OSS指定目录 ./ossutil cp -r /opt/post/afc/afcServer/afcenter/logs/ oss://oss-name/ScBak/20230608/ -c /opt/post/ossconfig 2、在oss服务器上创建文件夹 ./ossutil mkdir oss://oss-name/ScBak/20230608/dam -c /opt/post/ossconfig 3、查…...

申请https证书

引入证书: 当服务器使用HTTPS之前都会申请一份证书&#xff0c;证书是为了证明服务端公钥的权威性&#xff0c;服务器向浏览器传输证书&#xff0c;浏览器再从证书里获取公钥&#xff0c;证书明文数据签名。 如何理解CA签发证书的过程 a.CA会有自己的公钥 和 私钥&#xff…...

trtexec 工具使用

本文介绍trtexec工具的使用&#xff0c;trtexec可以实现onnx模型导出trt模型、耗时分析和模型优化分析等功能&#xff0c;本节将对 trtexec的运用进行介绍。 1.trtexec trtexec是官方提供的命令行工具&#xff0c;主要用于一下三个方面 生成模型序列化文件&#xff1a;由ONNX文…...

10款具备强大数据报告功能的电脑监控工具,办公电脑怎么监控

数据报告功能是电脑监控软件的重要特性&#xff0c;它能够帮助管理者全面了解员工的工作行为、应用使用情况&#xff0c;并生成详细的生产力分析报告。以下是10款具备强大数据报告功能的监控工具推荐&#xff0c;帮助企业有效管理和提升工作效率。 1. 固信软件 固信软件不仅是…...

如何理解Linux中的进程名

目录 一&#xff1a;程序的概念二&#xff1a;进程的概念三&#xff1a;线程的概念四&#xff1a;Linux中的进程名 一&#xff1a;程序的概念 程序就是采用某种特定格式编写的文本文件&#xff0c;该文件可以给编译器或者解释器编译和解释。编写好的程序平时存放在硬盘中。 二…...

微信红包设计流程讲解与实战分析

#1024程序员节 | 征文# 前言 微信红包作为大家耳熟能详的一种互动方式&#xff0c;其背后的技术支持包含多个方面。从用户发出红包到红包被抢完&#xff0c;涉及到的流程包括发红包、红包存储、红包拆分以及抢红包等。本文将详细介绍这一系列流程&#xff0c;并通过代码案例来…...

AI智能体:AI智能体(Agent)是什么?为什么要学?99%的人不知道!

为什么要学&#xff1f; 我们先搞清楚为什么&#xff1f; 最近看到 AI 创新力五问&#xff0c;我们日常生活中有使用 AI 来融入到我们的学习工作流嘛&#xff1f; 值得我们日常反省。 未来企业人才招聘测试AI创新力的五问&#xff1a; 您是否处于每天习惯使用 AI 的状态&am…...

NVR小程序接入平台/设备EasyNVR多个NVR同时管理的高效解决方案

在当今的数字化安防时代&#xff0c;视频监控系统的需求日益复杂和多样化。为了满足不同场景下的监控需求&#xff0c;一种高效、灵活且兼容性强的安防视频监控平台——NVR批量管理软件/平台EasyNVR应运而生。本篇探讨这一融合所带来的创新与发展。 一、NVR监测软件/设备EasyNV…...

APS开源源码解读: 排程工具 optaplanner II

上篇 排产&#xff0c;原则上也就是分配时间&#xff0c;分配资源&#xff1b;保证资源日历约束&#xff0c;保证工艺路线约束。我们看一下如何实现optaplanner 优化的 定义一个move, 一个move可能改变了分配到的资源&#xff0c;也可能改变了一个资源上的顺序。改变即意味着优…...

科技是把双刃剑,巧用技术改变财务预测

数字化和全球化的双向驱动&#xff0c;引领我国各行各业在技术革新的浪潮中不断扬帆。这一趋势不仅带来了前所未有的突破与创新&#xff0c;推进企业迈向数据驱动决策的新未来&#xff0c;同时也伴随着一些潜在的问题和挑战。科技的普及就像是一场革命&#xff0c;在财务管理领…...

vscode默认添加python项目的源目录路径到执行环境(解决ModuleNotFoundError: No module named问题)

0. 问题描述 vscode中编写python脚本&#xff0c;导入工程目录下的其他模块&#xff0c;出现ModuleNotFoundError: No module named 错误 在test2的ccc.py文件中执行print(sys.path) 查看路径 返回结果发现并无’/home/xxx/first_demo’的路径&#xff0c;所以test2下面的文…...

【每日刷题】Day143

【每日刷题】Day143 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 200. 岛屿数量 - 力扣&#xff08;LeetCode&#xff09; 2. LCR 105. 岛屿的最大面积 - 力扣&…...

基于Springboot智能学习平台的设计与实现

基于Springboot智能学习平台的设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xff1a;https://download.csdn.net/downlo…...

黑马javaWeb笔记重点备份11:Web请求与响应

请求 SpringBoot内置Servlet 在Tomcat这类Web服务器中&#xff0c;是不识别我们自己定义的Controller的&#xff0c;但在tomcat中是可以识别 Servlet程序的。在SpringBoot进行web程序开发时&#xff0c;它内置了一个核心的Servlet程序 DispatcherServlet&#xff0c;称之为 核…...

H5对接海康硬盘录像机视频简单说明

开发过程中使用HTML5(通常是通过Web技术栈,如HTML、CSS、JavaScript)与海康威视(Hikvision)的硬盘录像机(DVR)进行视频对接,通常涉及以下步骤: 获取DVR的RTSP流地址:海康威视DVR支持RTSP协议,你可以通过DVR的管理界面获取每个摄像头的RTSP流地址。 使用视频播放器库…...

测试人必备的Linux常用命令大全...【全网最全面整理】

Linux常用命令大全&#xff08;非常全&#xff01;&#xff01;&#xff01;&#xff09; 最近都在和Linux打交道&#xff0c;感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制&#xff0c;当然&#xff0c;这也是很多人喜欢linux的原因&#xff0c…...

苹果AI落后两年?——深度解析苹果在AI领域的挑战与前景

# 苹果AI落后两年&#xff1f;——深度解析苹果在AI领域的挑战与前景 近年来&#xff0c;人工智能&#xff08;AI&#xff09;领域的技术竞争日益激烈&#xff0c;各大科技巨头纷纷推出突破性的AI产品。然而&#xff0c;关于苹果公司在AI领域的表现&#xff0c;最近传出一些内…...

三菱PLC伺服-停止位置不正确故障排查

停止位置不正确时&#xff0c;请确认以下项目。 1)请确认伺服放大器(驱动单元)的电子齿轮的设定是否正确。 2&#xff09;请确认原点位置是否偏移。 1、设计近点信号(DOG)时&#xff0c;请考虑有足够为0N的时间能充分减速到爬行速度。该指令在DOG的前端开始减速到爬行速度&…...

Mybatis 批量操作存在则更新或者忽略,不存在则插入

Mybatis 批量操作新增&#xff0c;如果存在重复有下列2种处理方式&#xff1a; 1、存在则忽略代码示例&#xff1a; <insert id"insertDuplicateKeyIgnoreList">INSERT IGNORE INTO specs(status,type,code,name,create_time,create_by)VALUES<foreach col…...

「C/C++」C++ STL容器库 之 std::deque 双端队列容器

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...

一招教你解决Facebook广告账号问题

这段时间&#xff0c;我们写了很多文章来探讨Facebook的广告账户问题&#xff1a;《Facebook被封号该怎么办》《Facebook二不限、三不限账号是什么》《Facebook海外户&#xff08;三不限&#xff09;和账单户该如何选择》《如何区分真假Facebook三不限海外户》相信看过这些文章…...

MySQL启动报错:InnoDB: Unable to lock ./ibdata1 error

MySQL启动报错&#xff1a;InnoDB: Unable to lock ./ibdata1 error 在OS X环境下MySQL启动时报错&#xff1a; 016-03-03T00:02:30.483037Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 35 2016-03-03T00:02:30.483100Z 0 [Note] InnoDB: Check that you do not alr…...

Linux终端之旅: 打包和压缩

在 Linux 世界中&#xff0c;打包和压缩文件是管理系统资源、传输数据和备份的重要技能。通过命令行工具如 tar、gzip、zip 等&#xff0c;我们可以高效地将多个文件或目录打包为一个文件&#xff0c;并通过压缩减少其体积。接下来&#xff0c;我将记录学习如何利用这些工具&am…...

PDA手持机提升管理效率和准确性

在当今快节奏的商业世界中&#xff0c;管理效率和准确性是企业成功的关键因素。而 PDA 手持机的出现&#xff0c;为企业管理带来了革命性的变革&#xff0c;成为提升管理效率和准确性的有力武器。 PDA 手持机&#xff0c;即个人数字助理手持设备&#xff0c;集数据采集、存储、…...

C++ [项目] 愤怒的小鸟

现在才发现C游戏的支持率这么高&#xff0c;那就发几篇吧 零、前情提要 此篇为 制作,由于他没有CSDN,于是由我代发 一、基本介绍 支持Dev-C5.11版本(务必调为英文输入法),基本操作看游戏里的介绍,怎么做的……懒得说,能看懂就看注释,没有的自己猜,如果你很固执……私我吧 …...

群控系统服务端开发模式-市场分析

刚刚我把群控系统服务端开发模式的文档全部整理了一下&#xff0c;结果发现还缺市场分析这篇文档没有上传&#xff0c;不好意思啦。 一、前言 在互联网高速发展且稳定的时代&#xff0c;营销系统是自运营公司线上最好的系统。加上现在直播行业很火&#xff0c;引流很重要&#…...

智能听诊器革新宠物健康监测

在宠物健康护理领域&#xff0c;智能听诊器的引入标志着一个新时代的开启&#xff0c;它正成为宠物医疗保健的新宠。这款设备通过高精度传感器捕捉宠物的心跳和呼吸声&#xff0c;为宠物主人和兽医提供精确的健康数据。 智能听诊器的即时反馈功能&#xff0c;使得主人能够通过…...