【luckfox】添加压力传感器hx711

文章目录

  • 前言
  • 一、参考资料
  • 二、电路图
  • 三、驱动
  • 四、makefile——添加驱动
  • 五、dts——使能gpio
    • 5.1 参考
    • 5.2 改动1—— hx117节点
    • 5.3 改动2——引脚节点
    • 5.4 已经被定义的引脚
    • 5.5 gpio源码
  • 六、改动总结——使能hx711
  • 七、验证驱动添加
  • 八、编写测试文件
    • 8.1 测试代码
    • 8.2 配置编译环境变量
  • 九、验证
  • 十、其他——添加文件路径
  • 小结

前言

本章介绍基于luckfox开发板添加压力传感器hx711,并编写测试

一、参考资料

Rockchip_RV1103_Datasheet_V1.1-20220427.pdf
在这里插入图片描述

二、电路图

在这里插入图片描述

只有这两个io口没有复用其他功能,需要关掉PWM0_0/1_0。

三、驱动

luckfox-pico-main\sysdrv\source\kernel\drivers\iio\adc\hx711.c

这里匹配gpio

static int hx711_probe(struct platform_device *pdev)
{/** PD_SCK stands for power down and serial clock input of HX711* in the driver it is an output*/hx711_data->gpiod_pd_sck = devm_gpiod_get(dev, "sck", GPIOD_OUT_LOW);if (IS_ERR(hx711_data->gpiod_pd_sck)) {dev_err(dev, "failed to get sck-gpiod: err=%ld\n",PTR_ERR(hx711_data->gpiod_pd_sck));return PTR_ERR(hx711_data->gpiod_pd_sck);}/** DOUT stands for serial data output of HX711* for the driver it is an input*/hx711_data->gpiod_dout = devm_gpiod_get(dev, "dout", GPIOD_IN);if (IS_ERR(hx711_data->gpiod_dout)) {dev_err(dev, "failed to get dout-gpiod: err=%ld\n",PTR_ERR(hx711_data->gpiod_dout));return PTR_ERR(hx711_data->gpiod_dout);}hx711_data->reg_avdd = devm_regulator_get(dev, "avdd");if (IS_ERR(hx711_data->reg_avdd))return PTR_ERR(hx711_data->reg_avdd);
}static struct platform_driver hx711_driver = {.probe		= hx711_probe,.remove		= hx711_remove,.driver		= {.name		= "hx711-gpio",.of_match_table	= of_hx711_match,},
};

四、makefile——添加驱动

# luckfox-pico-main\sysdrv\source\kernel\drivers\Makefile
obj-$(CONFIG_IIO)		+= iio/# luckfox-pico-main\sysdrv\source\kernel\drivers\iio\Makefile
obj-y += adc/# luckfox-pico-main\sysdrv\source\kernel\drivers\iio\adc\Makefile
obj-$(CONFIG_HX711) += hx711.o

配置

luckfox-pico\sysdrv\source\kernel\arch\arm\configs\luckfox_rv1106_linux_defconfig

# sensor -- hx711
CONFIG_HX711=y
CONFIG_IIO=y

五、dts——使能gpio

5.1 参考

luckfox-pico\sysdrv\source\kernel\Documentation\devicetree\bindings\iio\adc\avia-hx711.yaml

examples:- |#include <dt-bindings/gpio/gpio.h>weight {compatible = "avia,hx711";sck-gpios = <&gpio3 10 GPIO_ACTIVE_HIGH>;dout-gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;avdd-supply = <&avdd>;clock-frequency = <100000>;};

注意,这里要改动下,需要匹配驱动中的of获取,移除gpios和supply。

//luckfox-pico-main\sysdrv\source\kernel\drivers\iio\adc\hx711.c
static const struct of_device_id of_hx711_match[] = {{ .compatible = "avia,hx711", },{},
};

5.2 改动1—— hx117节点

rv1103-luckfox-pico-ipc.dtsi
rv1103g-luckfox-pico.dts
rv1106-evb.dtsi
rv1106.dtsi
rv1103.dtsi

luckfox-pico-main\sysdrv\source\kernel\arch\arm\boot\dts\rv1103g-luckfox-pico.dts

hx711:hx711 {status = "okay";compatible = "avia,hx711"; sck-gpios = <&gpio1 RK_PA2 GPIO_ACTIVE_HIGH>;dout-gpios = <&gpio1 RK_PA4 GPIO_ACTIVE_HIGH>;avdd-supply = <&vcc_3v3>;//vcc3v3_sysclock-frequency = <400000>;
};

dtsi中sck-gpios是全的,但是在代码中只有sck,这个是在代码中省去了,注意区分。

这里只是给hx117增加了设备节点,但是rv1103和其他平台不太一样,还需要自己在dts中定义pin的节点

5.3 改动2——引脚节点

这点真就没注意到,导致我纠结了好久,还是没有获取到hx117的数据。
参考:https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-GPIO/

	gpio1pa2:gpio1pa2 {compatible = "regulator-fixed";pinctrl-names = "default";pinctrl-0 = <&gpio1_pa2>;regulator-name = "gpio1_pa2";regulator-always-on;};gpio0pa4:gpio0pa4 {compatible = "regulator-fixed";pinctrl-names = "default";pinctrl-0 = <&gpio0_pa4>;regulator-name = "gpio0_pa4";regulator-always-on;};&pinctrl {gpio1-pa2 {gpio1_pa2:gpio1-pa2 {rockchip,pins =	<1 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;};};gpio0-pa4 {gpio0_pa4:gpio0-pa4 {rockchip,pins =	<0 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>;};};
};

5.4 已经被定义的引脚

板子的21-27都被定义了,这是用于fspi

i2c3和spi0被enable了,需要disable后测试hx117
其中spi的cs选的是c0(28+0=16),不是d2(38+2=26),所以只需要关掉i2s3即可。

或者改用gpio1_A2和gpio_A4,这样不会有引脚复用,可以同时支持i2c、spi、adc。

5.5 gpio源码

在这里插入图片描述
在这里插入图片描述
都设为高电平有效GPIO_ACTIVE_HIGH

引脚作为输入还是输出由驱动中devm_gpiod_get定义

/sys/bus/iio/devices/iio:device0/

六、改动总结——使能hx711

diff --git a/sysdrv/source/kernel/arch/arm/boot/dts/rv1103g-luckfox-pico.dts b/sysdrv/source/kernel/arch/arm/boot/dts/rv1103g-luckfox-pico.dts
index 0f1a686fc..b08b1797d 100644
--- a/sysdrv/source/kernel/arch/arm/boot/dts/rv1103g-luckfox-pico.dts
+++ b/sysdrv/source/kernel/arch/arm/boot/dts/rv1103g-luckfox-pico.dts
@@ -63,6 +63,23 @@ gpio4pb1:gpio4pb1 {regulator-name = "gpio4_pb1";regulator-always-on;};
+
+       /* add hx711 */
+       gpio1pa2:gpio1pa2 {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&gpio1_pa2>;
+               regulator-name = "gpio1_pa2";
+               regulator-always-on;
+       };
+
+       gpio0pa4:gpio0pa4 {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&gpio0_pa4>;
+               regulator-name = "gpio0_pa4";
+               regulator-always-on;
+       };};/**********GPIO**********/&pinctrl {
@@ -102,6 +119,19 @@ gpio4_pb1:gpio4-pb1 {};};+       /* add hx711*/
+       gpio1-pa2 {
+               gpio1_pa2:gpio1-pa2 {
+                       rockchip,pins = <1 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
+
+       gpio0-pa4 {
+               gpio0_pa4:gpio0-pa4 {
+                       rockchip,pins = <0 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
+};@@ -178,19 +208,21 @@ &uart4 {/**********PWM**********/+&pwm0 {
-       status = "okay";
+       status = "disabled";pinctrl-names = "active";pinctrl-0 = <&pwm0m0_pins>;// pinctrl-0 = <&pwm0m1_pins>;};&pwm1 {
-       status = "okay";
+       status = "disabled";pinctrl-names = "active";pinctrl-0 = <&pwm1m0_pins>;// pinctrl-0 = <&pwm1m1_pins>;};// &pwm2 {//     status = "okay";//     pinctrl-names = "active";
@@ -251,4 +283,15 @@ &pwm11 {+/**********iio**********/
+/ {
+       hx711:hx711 {
+               status = "okay";
+               compatible = "avia,hx711";
+               sck-gpios = <&gpio1 RK_PA2 GPIO_ACTIVE_HIGH>;
+               dout-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_HIGH>;
+               avdd-supply = <&vcc_3v3>;//vcc3v3_sys
+               clock-frequency = <400000>;
+       };
+};diff --git a/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106_linux_defconfig b/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106_linux_defconfig
index 4c54b6965..28a2caf94 100755
--- a/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106_linux_defconfig
+++ b/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106_linux_defconfig
@@ -320,3 +320,7 @@ CONFIG_DEBUG_FS=y# CONFIG_SCHED_DEBUG is not set# CONFIG_FTRACE is not set# CONFIG_RUNTIME_TESTING_MENU is not set
+
+# sensor -- hx711
+CONFIG_HX711=y
+CONFIG_IIO=y

七、验证驱动添加

可以看到驱动正常加载了,注意dmesg中的hx711相关log是我自己在驱动中添加的,默认是没有的,可以直接获取iio属性判断驱动有没有添加成功。

root@Rockchip:/# dmesg | grep hx711
[    0.091066] hx711-gpio hx711: hx711_probe
[    0.091420] hx711-gpio hx711: ret=3300000
[    0.091447] hx711-gpio hx711: ret=330000000
[    0.091456] hx711-gpio hx711: ret=1536
[    0.091464] hx711-gpio hx711: ret=6145
[    0.091471] hx711-gpio hx711: ret=3072
root@Rockchip:/# cd /sys/bus/iio/devices/iio:device0
root@Rockchip:/sys/bus/iio/devices/iio:device0# ls
of_node                      in_voltage0_raw
name                         buffer
uevent                       dev
in_voltage_scale             power
current_timestamp_clock      subsystem
trigger                      in_voltage1_scale_available
in_voltage1_raw              scan_elements
in_voltage0_scale_available
root@Rockchip:/sys/bus/iio/devices/iio:device0# cat name
hx711
root@Rockchip:/sys/bus/iio/devices/iio:device0# cat in_voltage0_raw
7949573
root@Rockchip:/sys/bus/iio/devices/iio:device0#

在这里插入图片描述

八、编写测试文件

应用实例ko
https://wiki.luckfox.com/zh/Luckfox-Pico/Core3566-SDK

执行文件bin
https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-GPIO

8.1 测试代码

hx711_app.c

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
// #include <linux/delay.h>
#include <sys/time.h>
#include <string.h>#define IIO_DEVICE "/sys/bus/iio/devices/iio:device0"
#define SENSOR_CALI_PATH_OFFSET "/root/hx711_cal_offset"
#define SENSOR_CALI_PATH_SCALE "/root/hx711_cal_scale"static int cal_offset = 8500000;    // save raw value without test itemsstatic int cal_scale = 475;         // when set phone, 1g is 475
static int cal_weight = 187;  // the weight of phone// static float weight = 0;
static int weight = 0;
// float convert_to_weight(int sensor_data) {
int convert_to_weight(int sensor_data) {int weight;// weight = (float)(sensor_data - cal_offset) / cal_scale;// printf("\nsensor_raw=%d,cal_offset=%d,cal_scale=%d\n",sensor_data,cal_offset,cal_scale);if(cal_scale != 0)weight = (sensor_data - cal_offset) / cal_scale;elseweight = 0;// printf("Sensor data: %.1f\n", weight);// printf("Sensor data: %d\n", weight);return weight;
}int get_hx711_raw(){int fd;char buf[64];ssize_t num_read;fd = open(IIO_DEVICE "/in_voltage0_raw", O_RDONLY);if (fd < 0) {perror("Failed to open iio device");return 1;}num_read = read(fd, buf, sizeof(buf) - 1);if (num_read < 0) {perror("Failed to read sensor data");close(fd);return 1;}close(fd);buf[num_read] = '\0';int sensor_data = atoi(buf);// printf("  raw sensor_data=%d\n",sensor_data);return sensor_data;
}// float get_hx711_value(){
int get_hx711_value(){int sensor_data = get_hx711_raw();weight = convert_to_weight(sensor_data);return weight;
}// save scale&offset to file 
void set_cal_value(){int fd;char tmp_char[64];fd = open(SENSOR_CALI_PATH_OFFSET, O_CREAT|O_RDWR ,0777);if (fd < 0) {perror("Failed to open cal offset.");return;}// printf("-------\ncal_offset=%d\n",cal_offset);memset(tmp_char,0,sizeof(tmp_char));sprintf(tmp_char,"%d\0",cal_offset);// printf("xxx tmp_char=[%s]\n",tmp_char);write(fd, tmp_char, sizeof(tmp_char));close(fd);fd = open(SENSOR_CALI_PATH_SCALE, O_CREAT|O_RDWR ,0777);if (fd < 0) {perror("Failed to open cal offset.");return;}// printf("cal_scale=%d\n",cal_scale);memset(tmp_char,0,sizeof(tmp_char));sprintf(tmp_char,"%d\0",cal_scale) ;// printf("xxx tmp_char=[%s]\n-------\n",tmp_char);write(fd, tmp_char, sizeof(tmp_char)-1);close(fd);
}void print_cal_value_and_raw(int sensor_raw_tmp){printf("cal&raw:\n");printf("   cal_offset=%d sensor_raw=%d\n", cal_offset, sensor_raw_tmp);printf("   test_offset\t%d\n   cal_weight\t%d\n   cal_scale\t%d\n",sensor_raw_tmp - cal_offset, cal_weight, cal_scale);printf("\n");
}void print_cal_value(){printf("hx711 calibration value\n");printf("   cal_offset\t%d\n   cal_weight\t%d\n   cal_scale\t%d\n",cal_offset, cal_weight, cal_scale);printf("\n");
}void sns_calibration(){int cal_test_num = 10;int cal_average = 0;int cal_test_tmp = 0;int cal_scale_raw = 0;// test 10 times to get offset averagefor(int i=0; i<cal_test_num; i++){cal_test_tmp = get_hx711_raw();usleep(10);cal_average = (cal_average * i + cal_test_tmp)/(i+1);}cal_offset=cal_average;usleep(20);printf("!!! Please put test items on the board whose weight same with cmd3\nWaiting input char to continue ...\n");getchar();cal_test_tmp = get_hx711_raw();cal_scale_raw = cal_test_tmp - cal_offset;cal_scale = (cal_scale_raw)/cal_weight;print_cal_value_and_raw(cal_test_tmp);set_cal_value();
}void get_cal_value(){int tmp_offset;int tmp_scale;char tmp_file_value[64];int fd;// printf("get_cal_value\n");fd = open(SENSOR_CALI_PATH_OFFSET, O_RDWR,0777);if (fd < 0) {perror("Failed to open cal offset.");return;}read(fd, tmp_file_value, sizeof(tmp_file_value) - 1);// printf("tmp_file_value=%s\n",tmp_file_value);tmp_offset = atoi(tmp_file_value);// printf("tmp_offset=%d\n",tmp_offset);close(fd);fd = open(SENSOR_CALI_PATH_SCALE, O_RDWR,0777);if (fd < 0) {perror("Failed to open cal offset.");return;}memset(tmp_file_value,0,sizeof(tmp_file_value));read(fd, tmp_file_value, sizeof(tmp_file_value) - 1);tmp_scale = atoi(tmp_file_value);// printf("tmp_offset=%d\n",tmp_scale);close(fd);cal_offset = tmp_offset;cal_scale = tmp_scale;}int main(int argc, char *argv[]) {char cmd1[16];char cmd2[16];char cmd3[16];int ret;int val_tmp=0;// calibration: put the items whose weight is known. weight sends to cmd3// ./hx771_app -c 187if(argc == 3){strcpy(cmd2,argv[1]);strcpy(cmd3,argv[2]);printf("cmd2=%s cmd3=%s\n",cmd2,cmd3);if(strcmp(cmd2, "-c") == 0){printf("get cal cal_weight %s\n",cmd3);cal_weight=atoi(cmd3);        // save the weight of cal items} else {printf("hx711 no cal_weight\n");return 0;}sns_calibration();sleep(1);// test the calibration resultval_tmp = get_hx711_value();printf("sensor value: %d\n", val_tmp);return 0;}printf("-------------test-------------\n");get_cal_value();print_cal_value();int sensor_data;int test_num=5;while(test_num--){val_tmp = get_hx711_value();printf("%02d: %d\n",5 - test_num,val_tmp);sleep(1);}printf("--------------------------\n");return 0;
}

8.2 配置编译环境变量

需要在ubuntu环境下运行。

export PATH=/home/luckfox/Luckfox-Pico/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin:$PATH
source ~/.bashrc  
cd ~/luckfox/luckfox-pico/project/app/test_app/hx711
arm-rockchip830-linux-uclibcgnueabihf-gcc hx711_app.c -o hx711_app

在这里插入图片描述

九、验证

由于将虚拟机中生成的可执行文件复制到windows本地,再通过adb传入设备中,这部分流程比较重复,所以编写了一个简单的bat脚本进行刷入,需要输入虚拟机的登录密钥就可以执行了。

scp youkai@192.168.206.130:/home/youkai/luckfox/luckfox-pico/project/app/test_app/hx711/hx711_app .adb push hx711_app /root/adb shell "chmod 777 /root/hx711_app"
adb shell "./root/hx711_app -c 187"

直接运行这个bat脚本,然后输入密码就可以实现自动刷执行文件并校准。

刷完执行文件后也可以手动下命令进行测试。

root@Rockchip:/root# ./hx711_app -c 187
root@Rockchip:/root# ./hx711_app

在这里插入图片描述

十、其他——添加文件路径

busybox vi /etc/profile'# ' --> '$USER@$HOSTNAME:$PWD# 'source /etc/profile

在这里插入图片描述

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

小结

本章实现了hx711的数据读取,以及计算出称量物品的重量,后续可以结合算法实现相关功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/171944.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决:谷歌浏览器访问http时,自动转https访问的问题

问题背景&#xff1a;某个系统网站&#xff0c;之前一直用https域名访问&#xff0c;现在改成http域名后&#xff0c;用http访问&#xff0c;谷歌浏览器会自动跳转到https。 解决方法&#xff1a; 在浏览器中输入网址&#xff1a;chrome://net-internals/#hsts -》 在“Delete…

Jmeter压测实战:Jmeter二次开发之自定义函数

​1 前言 Jmeter是Apache基金会下的一款应用场景非常广的压力测试工具&#xff0c;具备轻量、高扩展性、分布式等特性。Jmeter已支持实现随机数、计数器、时间戳、大小写转换、属性校验等多种函数&#xff0c;方便使用人员使用。如果在使用过程中存在和业务强耦合的常用功能函…

【广州华锐互动】VR公司工厂消防逃生演练带来沉浸式的互动体验

在工业生产过程中&#xff0c;安全问题始终是我们不能忽视的重要环节。特别是火灾事故&#xff0c;不仅会造成重大的经济损失&#xff0c;更会威胁到员工的生命安全。传统的消防安全训练方法&#xff0c;如讲座、实地演练等&#xff0c;虽然具有一定的效果&#xff0c;但是无法…

Matlab绘制散点的95%置信区间图

Matlab常绘制95%置信区间图&#xff0c;主要使用到patch函数。 如果直接使用散点进行拟合&#xff0c;在patch函数绘制95%置信区间时&#xff0c;会绘制的很乱&#xff0c;这个是由于patch函数所导致的&#xff0c;其实这个问题在 Matlab绘制95%置信区间图 中已经讲到过&#…

【教3妹学编程-java实战4】Map遍历删除元素的几种方法

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 2哥 :3妹&#xff0c;今天是周末&#xff0c;又不用上…

51单片机复位电容计算与分析(附带Proteus电路图)

因为iC x (dU/dt).在上电瞬间&#xff0c;U从0变化到U,所以这一瞬间就是通的&#xff0c;然后这就是一个直流回路&#xff0c;因为电容C直流中是断路的&#xff0c;所以就不通了。 然后来分析一下这个电容的电压到底是能不能达到单片机需要的复位电压。 这是一个线性电容&…

基于springboot实现休闲娱乐代理售票平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现休闲娱乐代理售票平台系统演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把休闲娱乐代理售票管理与现在网络相结合&#xff0c;利用java技术建设休闲娱乐代理售票系统&#xff0c;实现休闲娱乐代理售票的信息化。则对于进一步提高休闲娱乐代理售票管…

【黑产攻防道03】利用JS参数更新检测黑产的协议破解

任何业务在运营一段时间之后都会面临黑产大量的破解。验证码和各种爬虫的关系就像猫和老鼠一样, 会永远持续地进行博弈。极验根据十一年和黑产博弈对抗的经验&#xff0c;将黑产的破解方式分为三类&#xff1a; 1.通过识别出验证码图片答案实现批量破解验证&#xff0c;即图片…

SQL-正则表达式和约束

文章目录 主要内容一.正则表达式1.操作1代码如下&#xff08;示例&#xff09;: 2.操作2代码如下&#xff08;示例&#xff09;: 3.操作3代码如下&#xff08;示例&#xff09;: 4.操作4代码如下&#xff08;示例&#xff09;: 二.约束1.主键约束 2.自增长约束3.非空约束4.唯一…

CSDN学院 < 华为战略方法论进阶课 > 正式上线!

目录 你将收获 适用人群 课程内容 内容目录 CSDN学院 作者简介 你将收获 提升职场技能提升战略规划的能力实现多元化发展综合能力进阶 适用人群 主要适合公司中高层、创业者、产品经理、咨询顾问&#xff0c;以及致力于改变现状的学员。 课程内容 本期课程主要介绍华为…

网络原理的讲解

网络原理 重要性: 网络原理知识 1.工作中非常重要的理论知识,尤其是正在调试一些bug的时候. 2.面试中非常重要的考点. 3.学习中非常关键的难点. 网络原理这里,主要给大家介绍, TCP/IP协议 这里的关键协议. 按照这里的这四层,分别进行介绍(物理层不涉及) 应用层 是和程序猿打…

ubuntu 安装 gnome 安装 xrdp

先安装xrdp 更新 apt-get sudo apt-get update && apt-get upgrade安装图形包 apt-get install xubuntu-desktop安装 xrdp apt-get install xrdp安装 xfce4 apt-get install xfce4配置 xfce4 Add xfce to the xfce desktop window manager autorun by fixing the …

栈、队列、矩阵的总结

栈的应用 括号匹配 表达式求值&#xff08;中缀&#xff0c;后缀&#xff09; 中缀转后缀&#xff08;机算&#xff09; 中缀机算 后缀机算 总结 特殊矩阵 对称矩阵的压缩存储 三角矩阵 三对角矩阵 稀疏矩阵的压缩存储

如何在vscode中添加less插件

Less &#xff08;Leaner Style Sheets 的缩写&#xff09; 是一门向后兼容的 CSS 扩展语言。它对CSS 语言增加了少许方便的扩展&#xff0c;通过less可以编写更少的代码实现更强大的样式。但less不是css&#xff0c;浏览器不能直接识别&#xff0c;即浏览器无法执行less代码&a…

基于springboot实现休闲娱乐代理售票平台系统项目【项目源码+论文说明】

基于springboot实现休闲娱乐代理售票系统演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把休闲娱乐代理售票管理与现在网络相结合&#xff0c;利用java技术建设休闲娱乐代理售票系统&#xff0c;实现休闲娱乐代理售票的信息化。则对于进一步提高休闲娱乐代理售票管理发…

【疑问解决】在自动装箱中Integer赋予一个常量1,为什么会出现==判断true和flase的情况(JDK源码、内部缓冲)

问题来源自讲课时的Integer练习中 当时第一反应是false true true 因为第一段的输出为flase毋庸置疑了&#xff0c;因为已经new了两个新的堆空间&#xff0c;当然指向不同的空间了 但是第二段第三段就没有头绪了&#xff0c;自动装箱了难道不是执行同一个空间吗…

【Linux】安装配置虚拟机及虚拟机操作系统的安装

一. 操作系统和内核 关于操作系统是这样定义的&#xff1a; 操作系统&#xff08;英语&#xff1a;Operating System&#xff0c;缩写&#xff1a;OS&#xff09;是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内核与基石。操作系统需要处理如管理与配…

云计算未来展望:边缘计算、量子计算与AI

文章目录 边缘计算&#xff1a;数据处理的新时代应用领域挑战与机遇 量子计算&#xff1a;超越传统计算的新范式量子比特应用前景挑战与机遇 人工智能&#xff1a;云计算的动力云中的AI应用领域挑战与机遇 结语 &#x1f389;欢迎来到云计算技术应用专栏~云计算未来展望&#x…

Xray的简单使用

xray 简介 xray 是一款功能强大的安全评估工具&#xff0c;由多名经验丰富的一线安全从业者呕心打造而成&#xff0c;主要特性有: 检测速度快。发包速度快; 漏洞检测算法效率高。支持范围广。大至 OWASP Top 10 通用漏洞检测&#xff0c;小至各种 CMS 框架 POC&#xff0c;均…

JAVA实现智能停车场管理系统 开源

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系统管理员功能1. 停车位模块2. 车辆模块3. 停车记录模块4. IC卡模块5. IC卡挂失模块 三、界面展示3.1 登录注册3.2 车辆模块3.3 停车位模块3.4 停车数据模块3.5 IC卡档案模块3.6 IC卡挂…