【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的数据读取,以及计算出称量物品的重量,后续可以结合算法实现相关功能。
相关文章:
【luckfox】添加压力传感器hx711
文章目录 前言一、参考资料二、电路图三、驱动四、makefile——添加驱动五、dts——使能gpio5.1 参考5.2 改动1—— hx117节点5.3 改动2——引脚节点5.4 已经被定义的引脚5.5 gpio源码 六、改动总结——使能hx711七、验证驱动添加八、编写测试文件8.1 测试代码8.2 配置编译环境…...
C++11的lambda表达式
lambda来源于函数式编程的概念。C11这次终于把lambda加进来了。 lambda表达式有如下优点: 1、声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。以更直接的方式去写程序,好的可读性和可维护…...
矩阵特征值与特征向量的理解
各位朋友大家好,我是小C哈哈哈,很高兴认识大家,在这里,我会将一些枯燥难懂的数学和算法知识以图片或动画的形式通俗易懂的展现给大家,希望大家喜欢。 线性代数中的矩阵特征值与特征向量这两个基本概念总是让很多人摸不…...
云原生安全:如何保护云上应用不受攻击
文章目录 云原生安全的概念1. 多层次的安全性2. 自动化安全3. 容器安全4. 持续监控5. 合规性 云原生安全的关键挑战1. 无边界的环境2. 动态性3. 多云环境4. 容器化应用程序5. API和微服务 如何保护云上应用不受攻击1. 身份验证和访问控制示例代码: 2. 数据加密示例代…...
如何在用pip配置文件设置HTTP爬虫IP
首先,定义问题:在 Pip 中设置HTTP爬虫IP服务器,以便在网络上进行访问和下载。 亲身经验:我曾经遇到过类似问题,通过设置HTTP爬虫IP服务器成功解决了网络访问问题。 数据和引证:根据 pip 官方文档ÿ…...
2023MathorCup高校数模挑战赛B题完整解题代码教程
赛道 B: 电商零售商家需求预测及库存优化问题 问题背景: 电商平台存在着上千个商家,他们会将商品货物放在电商配套的仓库, 电商平台会对这些货物进行统一管理。通过科学的管理手段和智能决策, 大数据智能驱动的供应链…...
《动手学深度学习 Pytorch版》 10.7 Transformer
自注意力同时具有并行计算和最短的最大路径长度这两个优势。Transformer 模型完全基于注意力机制,没有任何卷积层或循环神经网络层。尽管 Transformer 最初是应用于在文本数据上的序列到序列学习,但现在已经推广到各种现代的深度学习中,例如语…...
ORACLE-递归查询、树操作
1. 数据准备 -- 测试数据准备 DROP TABLE untifa_test;CREATE TABLE untifa_test(child_id NUMBER(10) NOT NULL, --子idtitle VARCHAR2(50), --标题relation_type VARCHAR(10) --关系,parent_id NUMBER(10) --父id );insert into untifa_test (CHILD_ID, TITLE, RELATION_TYP…...
MySQL篇---第四篇
系列文章目录 文章目录 系列文章目录一、并发事务带来哪些问题?二、事务隔离级别有哪些?MySQL的默认隔离级别是?三、大表如何优化?一、并发事务带来哪些问题? 在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对 同一数据进行操作…...
em/px/rem/vh/vw单位的区别
一、绝对长度单位 1.px 表示像素,显示器上每个像素点大小都是相同的 二、相对长度单位 2.em 相对于当前对象内文本的字体尺寸,如未设置对行内文本字体的尺寸,则相对于浏览器的默认字体(1em16px) em值不是固定的&…...
【C++】多态 ③ ( “ 多态 “ 实现需要满足的三个条件 | “ 多态 “ 的应用场景 | “ 多态 “ 的思想 | “ 多态 “ 代码示例 )
文章目录 一、" 多态 " 实现条件1、" 多态 " 实现需要满足的三个条件2、" 多态 " 的应用场景3、" 多态 " 的思想 二、" 多态 " 代码示例 一、" 多态 " 实现条件 1、" 多态 " 实现需要满足的三个条件 &q…...
创建一个Keil项目
1、创建项目 2、选择存放的文件夹,还有设置项目名 3、选择型号(因为没有STC,用下面这个替代,功能差不多) 4、选择不用启动文件 5、就会得到下面这个,可以在Source Group 1下面编写代码了 6、右键source Group 1,添加c语…...
Xray的简单使用
xray 简介 xray 是一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,主要特性有: 检测速度快。发包速度快; 漏洞检测算法效率高。支持范围广。大至 OWASP Top 10 通用漏洞检测,小至各种 CMS 框架 POC,均…...
Linux Ubunto Nginx安装
一 安装前 环境准备 gcc $ sudo apt-get install gcc zlib $ sudo apt-get install zlib1g-dev pcre $ sudo apt-get install libpcre3 libpcre3-dev openssl $ sudo apt-get install openssl libssl-dev‘ ubuntu 安装 libssl-dev失败的解决方案 1.安装aptitude sudo apt-g…...
深度学习中的epoch, batch 和 iteration
名词定义epoch使用训练集的全部数据进行一次完整的训练,称为“一代训练”batch使用训练集中的一小部分样本对模型权重进行一次反向传播的参数更新,这样的一部分样本称为:“一批数据”iteration使用一个batch的数据对模型进行一次参数更新的过…...
unity开发安卓视频文件适配手机和平板
using UnityEngine; using UnityEngine.UI;public class VideoResize : MonoBehaviour {private RawImage rawImage;private VideoPlayer videoPlayer;private void Start(){rawImage GetComponent<RawImage();videoPlayer GetComponent<VideoPlayer>();// 播放视频…...
NLP之RNN的原理讲解(python示例)
目录 代码示例代码解读知识点介绍 代码示例 import numpy as np import tensorflow as tf from tensorflow.keras.layers import SimpleRNNCell# 第t时刻要训练的数据 xt tf.Variable(np.random.randint(2, 3, size[1, 1]), dtypetf.float32) print(xt) # https://www.cnblog…...
yo!这里是进程间通信
目录 前言 进程间通信简介 目的 分类 匿名通道 介绍 举例(进程池) 命名管道 介绍 举例 共享内存 介绍 共享内存函数 1.shmget 2.shmat 3.shmdt 4.shmctl 举例 1.框架 2.通信逻辑 消息队列 信号量 同步与互斥 理解信号量 后记…...
使用docker安装MySQL,Redis,Nacos,Consul教程
文章目录 安装MySQL安装Redis安装Nacos安装Consul 如未安装docker,参考教程: https://blog.csdn.net/m0_63230155/article/details/134090090 安装MySQL #拉取镜像 sudo docker pull mysql:latestsudo docker run --name mysql \-p 3306:3306 \-e MYSQ…...
python和Springboot如何交互?
Python和Spring Boot可以通过RESTful API进行交互。Spring Boot通常用于后端开发,提供了快速构建RESTful API的工具,而Python则可以用于编写前端或与后端交互的代码。 要实现Python和Spring Boot的交互,可以按照以下步骤进行: 在…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
