嵌入式安防监控项目——html框架分析和环境信息刷新到网页
目录
一、html控制LED
二、模拟数据上传到html
一、html控制LED
简单来说就是html给boa服务器发了一个控制指令信息,然后boa转发给cgi进程,cgi通过消息队列和主进程通信。主进程再去启动LED子线程。
这是老师给的工程。
以前学32都有这工具那工具来管理,现在就是自己建文件夹,然后写makefile来管理
先来看看makefile
KERNELDIR :=/home/book/Linux_4412/kernel/linux-3.14
PWD :=$(shell pwd)CROSS_COMPILE=arm-none-linux-gnueabi-
#CROSS_COMPILE=
CC=$(CROSS_COMPILE)gcc
CP=cpARM_DRVDIR=~/nfs_rootfs/drv/
NFS_BOA_WWWDIR=~/nfs_rootfs/boa/www/
NFS_BOA_CGIDIR=~/nfs_rootfs/boa/cgi-bin/obj-m +=demo.o
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
$(CC) -o cgi_led.cgi -static cgi_led.c
mv *.o *.mod.c *.order *.symvers objinstall:
sudo cp demo.ko $(ARM_DRVDIR)
sudo cp *.mp3 *.jpg led.html $(NFS_BOA_WWWDIR)
sudo cp cgi_led.cgi $(NFS_BOA_CGIDIR)clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
rm -rf cgi_led.cgi
主要就是调用内核的makefile来编译我们的驱动程序,然后编译我们的LED的C文件生成cgi。
为了方便加上clean和install命令
/*************************************************************************# FileName : test.c# Author : fengjunhui # Email : 18883765905@163.com # Created : 2017年07月03日 星期一 15时48分02秒************************************************************************/#include<stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>#include <sys/ioctl.h>
#include <linux/limits.h>
#include <errno.h>
#include "chardev.h"#define LED_DEVICE "/dev/chrdev0"
#define MAX_BUFFER_SIZE PIPE_BUFint main(int argc, const char *argv[])
{int i = 0,j = 3;int nread;int led_control,led_state;int led_fd,fifo_fd;led_desc_t led;char *data;led_fd = open(LED_DEVICE,O_RDWR);if(led_fd < 0){printf("open failed !\n");}printf("open device success! led_fd: %d\n",led_fd);printf("Content-type: text/html;charset=utf-8\n\n");printf("<html>\n");printf("<head><title>cgi control led web</title></head>\n");printf("<body>\n");printf("<p>led is setted successful! you can watch the led's change</p>\n");//printf("<p><a herf=http://192.168.1.100/led.html>go back</a></p>\n");printf("<a href=\"/led.html\">go back led control page </a>");printf("</body>\n");data = getenv("QUERY_STRING"); //getenv()读取环境变量的当前值的函数 if(sscanf(data,"led_control=%d&led_state=%d",&led_control,&led_state)!=2){ //利用sscnaf()函数的特点将环境变量分别提取出led_control和led_state这两个值printf("<p>please input right"); printf("</p>");} printf("<p>led_control = %d,led_state = %d</p>", led_control, led_state);if(led_control < 2 || led_control > 5) { printf("<p>Please input 2<=led_control<=5!"); printf("</p>");} if(led_state>1) {printf("<p>Please input 0<=led_state<=1!"); printf("</p>"); }led.led_num = led_control;led.led_state = led_state;if(led.led_state == 0){ioctl(led_fd,FS_LED_OFF,&led);}else if(led.led_state == 1){ioctl(led_fd,FS_LED_ON,&led);}else if(led.led_state == 2){while(j --){for(i = 2; i <= 5; i ++ ){led.led_num = i;led.led_state = 0;ioctl(led_fd,FS_LED_OFF,&led);usleep(500000);led.led_state = 1;ioctl(led_fd,FS_LED_ON,&led);usleep(500000);}}}close(led_fd);printf("</html>\n");return 0;
}
这是老师再17年写的老代码了,主要就是接收html的指令然后发给A9主进程,但是由于这只是个测试所以没用主进程,直接再这个cgi进程中操作LED了。
昨天发烧没看清,录视频讲错了。
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <asm/uaccess.h>
#include <asm/io.h>#include "chardev.h"const char *name = "chrdev";
unsigned int major ;
struct class *cls;
struct device *dev;#define GPX2CON 0x11000c40
#define GPX2DAT 0x11000c44
#define GPX1CON 0x11000c20
#define GPX1DAT 0x11000c24
#define GPF3CON 0x114001e0
#define GPF3DAT 0x114001e4void __iomem * gpx2con_vir;
void __iomem * gpx2dat_vir;
void __iomem * gpx1con_vir;
void __iomem * gpx1dat_vir;
void __iomem * gpf3con_vir;
void __iomem * gpf3dat_vir;char kbuf[] = {'1','2','3','4'};loff_t demo_llseek(struct file *filp, loff_t offset, int cnt)
{printk("---->%s--->%d\n",__func__,__LINE__);return 0;
}ssize_t demo_read(struct file *filp, char __user *usrbuf, size_t count, loff_t *offset)
{int bytes = 0;printk("---->%s--->%d\n",__func__,__LINE__);bytes = copy_to_user(usrbuf,kbuf,4);if(bytes > 0){printk("copy_to_user failed!\n");}return 0;
}ssize_t demo_write(struct file *filp, const char __user *usrbuf, size_t size, loff_t *offset)
{int bytes = 0;printk("---->%s--->%d\n",__func__,__LINE__);bytes = copy_from_user(kbuf,usrbuf,4);if(bytes > 0){printk("copy_from_user failed\n");return -1;}printk("copy_from_user usrbuf:%c\n",kbuf[0]);return 0;
}long demo_ioctl(struct file *filp, unsigned int cmd, unsigned long args)
{int i;led_desc_t *led = (led_desc_t *)args;printk("---->%s--->%d\n",__func__,__LINE__);switch(cmd){case FS_LED_ON:i = led->led_num;printk("i= %d\n",i);if(i == 2){writel(readl(gpx2dat_vir) | (0x1 << 7),gpx2dat_vir);}else if(i == 3){writel(readl(gpx1dat_vir) | (0x1 << 0),gpx1dat_vir);}else if(i == 4){writel(readl(gpf3dat_vir) | (0x1 << 4),gpf3dat_vir);}else if(i == 5){writel(readl(gpf3dat_vir) | (0x1 << 5),gpf3dat_vir);}printk("FS_LED_ON. \n");break;case FS_LED_OFF:i = led->led_num;printk("i= %d\n",i);if(i == 2){writel(readl(gpx2dat_vir)&~(0x1 << 7),gpx2dat_vir);}else if(i == 3){writel(readl(gpx1dat_vir)&~(0x1 << 0),gpx1dat_vir);}else if(i == 4){writel(readl(gpf3dat_vir)&~(0x1 << 4),gpf3dat_vir);}else if(i == 5){writel(readl(gpf3dat_vir)&~(0x1 << 5),gpf3dat_vir);}printk("FS_LED_OFF. \n");break;default:printk("default :....\n");break;}return 0;
}int demo_open(struct inode *inode, struct file *filp)
{//硬件的初始化工作--收发数据的初始化printk("---->%s--->%d\n",__func__,__LINE__);return 0;
}int demo_close(struct inode *inode, struct file *filp)
{printk("---->%s--->%d\n",__func__,__LINE__);return 0;
}const struct file_operations fops = {.open=demo_open,.llseek=demo_llseek,.read=demo_read,.write=demo_write,.unlocked_ioctl=demo_ioctl,.release=demo_close,
};void gpio_ioremap(void)
{gpx2con_vir = ioremap(GPX2CON,8);gpx2dat_vir = gpx2con_vir + 4;gpx1con_vir = ioremap(GPX1CON,8);gpx1dat_vir = gpx1con_vir + 4;gpf3con_vir = ioremap(GPF3CON,8);gpf3dat_vir = gpf3con_vir + 4;writel((readl(gpx2con_vir) & ~(0XF<< 28))| (0x1 << 28),gpx2con_vir);writel((readl(gpx1con_vir) & ~(0XF<< 0))| (0x1 << 0),gpx1con_vir);writel((readl(gpf3con_vir) & ~(0XF<< 16 ))| (0x1 << 16),gpf3con_vir);writel((readl(gpf3con_vir) & ~(0XF<< 20 ))| (0x1 << 20),gpf3con_vir);}static int __init demo_init(void)
{printk("---->%s--->%d\n",__func__,__LINE__);major = register_chrdev(0,name,&fops); if(major <= 0){printk("register_chrdev failed!\n");}printk("register_chrdev success .major: %d\n",major);cls = class_create(THIS_MODULE,name);if(cls == NULL){printk("class_create failed!\n");}dev = device_create(cls, NULL,MKDEV(major,0),NULL,"chrdev0");if(dev == NULL){ printk("device_create failed!\n");}gpio_ioremap();return 0;
}void viraddr_iounmap(void)
{iounmap(gpx2con_vir);iounmap(gpx1con_vir);iounmap(gpf3con_vir);
}static void __exit demo_exit(void)
{printk("---->%s--->%d\n",__func__,__LINE__);viraddr_iounmap();device_destroy(cls,MKDEV(major,0));class_destroy(cls);unregister_chrdev(major,name);
}module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");
这就是一个LED的驱动程序
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>web控制A9开发板led</title></head><body background="./makeru-desktop.jpg"><br/><embed src="./meiyanfang.mp3" autostart="true" loop="true" hidden="true"> <h1 align="center">基于Cortex-A9的web控制LED灯</h1><!--新建一个表单,动作链接到开发板的/cgi-bin/cgi_led.cgi,采用的方法为GET--> <form action="/cgi-bin/cgi_led.cgi" method="get"> <p align="center">Web端的led的控制测试</p><p align="center">请输入需要控制的led:<input type="text" name="led_control"/></p><p align="center">请输入LED控制命令 :<input type="text" name="led_state"/></p><h2 align="center"> (0熄灭-1点亮-2流水)</h2> <p align="center"><input type="submit" value="sure"/> <input type="reset" value="back"/></p></form></body>
</html>
LED的前端程序,和搞web的差远了哈,这个不用精通会点就行,这部分工作以后公司有专人做的。
嵌入式安防监控项目——LED控制_哔哩哔哩_bilibili
二、模拟数据上传到html
#include "data_global.h"
#include "sem.h"#define N 1024 //for share memoryextern int shmid;
extern int msgid;
extern int semid;extern key_t shm_key;
extern key_t sem_key;
extern key_t key; //msg_keyextern pthread_mutex_t mutex_client_request,mutex_refresh,mutex_sqlite,mutex_transfer,mutex_analysis,mutex_sms,mutex_buzzer,mutex_led,mutex_camera;extern pthread_cond_t cond_client_request,cond_refresh,cond_sqlite,cond_transfer,cond_analysis,cond_sms,cond_buzzer,cond_led,cond_camera;extern struct env_info_client_addr sm_all_env_info;struct shm_addr{char shm_status; //shm_status���Ե���home_id���������ֹ����ڴ�����struct env_info_client_addr sm_all_env_info;
};
struct shm_addr *shm_buf;int file_env_info_struct(struct env_info_client_addr *rt_status,int home_id);void *pthread_refresh(void *arg)
{//semaphore for access to resource limitsif((sem_key = ftok("/tmp",'i')) < 0){perror("ftok failed .\n");exit(-1);}semid = semget(sem_key,1,IPC_CREAT|IPC_EXCL|0666);if(semid == -1) {if(errno == EEXIST){semid = semget(sem_key,1,0777);}else{perror("fail to semget");exit(1);}}else{init_sem (semid, 0, 1);}//share memory for env_info refresh configif((shm_key = ftok("/tmp",'i')) < 0){perror("ftok failed .\n");exit(-1);}shmid = shmget(shm_key,N,IPC_CREAT|IPC_EXCL|0666);if(shmid == -1) {if(errno == EEXIST){shmid = shmget(key,N,0777);}else{perror("fail to shmget");exit(1);}}//share memapif((shm_buf = (struct shm_addr *)shmat(shmid,NULL,0)) == (void *)-1){perror("fail to shmat");exit(1);}printf("pthread_refresh ......>>>>>>>\n");#if 1bzero (shm_buf, sizeof (struct shm_addr));while(1){sem_p(semid,0);shm_buf->shm_status = 1;file_env_info_struct(&shm_buf->sm_all_env_info,shm_buf->shm_status);sleep(1);sem_v(semid,0);}
#endif }int file_env_info_struct(struct env_info_client_addr *rt_status,int home_id)
{int env_info_size = sizeof(struct env_info_client_addr);printf("env_info_size = %d.\n",env_info_size);rt_status->monitor_no[home_id].zigbee_info.temperature = 10.0;rt_status->monitor_no[home_id].zigbee_info.tempMIN = 2.0;rt_status->monitor_no[home_id].zigbee_info.tempMAX = 20.0;rt_status->monitor_no[home_id].zigbee_info.humidity = 20.0;rt_status->monitor_no[home_id].zigbee_info.humidityMIN = 10.0;rt_status->monitor_no[home_id].zigbee_info.humidityMAX = 30.0;rt_status->monitor_no[home_id].zigbee_info.reserved[0] = 0.01;rt_status->monitor_no[home_id].zigbee_info.reserved[1] = -0.01;rt_status->monitor_no[home_id].a9_info.adc = 9.0;rt_status->monitor_no[home_id].a9_info.gyrox = -14.0;rt_status->monitor_no[home_id].a9_info.gyroy = 20.0;rt_status->monitor_no[home_id].a9_info.gyroz = 40.0;rt_status->monitor_no[home_id].a9_info.aacx = 642.0;rt_status->monitor_no[home_id].a9_info.aacy = -34.0;rt_status->monitor_no[home_id].a9_info.aacz = 5002.0;rt_status->monitor_no[home_id].a9_info.reserved[0] = 0.01;rt_status->monitor_no[home_id].a9_info.reserved[1] = -0.01;return 0;
}
这是A9刷新的线程程序
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <errno.h>
#include <sys/sem.h>
#include <unistd.h>
#include "sem.h"
#include "cgic.h"
#include "data_global.h"#define N 32#define MONITOR_NUM 1char status[2][6] = {"Close", "Open"};
char fan_status[4][6] = {"Close", "One", "Two", "Three"};struct shm_addr{char shm_status;struct env_info_client_addr sm_all_env_info;
};int cgiMain()
{key_t key;int shmid,semid;struct shm_addr *shm_buf;if((key = ftok("/tmp",'i')) <0){perror("ftok");exit(1);}printf("key = %x\n",key);if((semid = semget(key, 1, 0666)) < 0){perror("semget");exit(1);}if((shmid = shmget(key, N, 0666 )) == -1){perror("shmget");exit(1);}if((shm_buf = (struct shm_addr*)shmat(shmid, NULL, 0)) == (void*)-1 ){perror("shmat");exit(1);}sem_p(semid,0);cgiHeaderContentType("text/html");fprintf(cgiOut, "<head><meta http-equiv=\"refresh\" content=\"1\"><style><!--body{line-height:50%}--></style> </head>");fprintf(cgiOut, "<HTML>\n");fprintf(cgiOut, "<BODY bgcolor=\"#666666\">\n");
//fprintf(cgiOut, "<h1><font color=\"#FF0000\">HOME_ID #%d:</font></H2>\n ", shm_buf->shm_status);if (shm_buf->shm_status == 1){fprintf(cgiOut, "<script>function show(){var date =new Date(); var now = \"\"; now = date.getFullYear()+\"年\"; now = now + (date.getMonth()+1)+\"月\"; \ now = now + date.getDate()+\"日\"; now = now + date.getHours()+\"时\"; now = now + date.getMinutes()+\"分\";now = now + date.getSeconds()+\"秒\"; document.getElementById(\"nowDiv\").innerHTML = now; setTimeout(\"show()\",1000);} </script> \n "); fprintf(cgiOut, "<h2><font face=\"Broadway\"><font color=\"#00FAF0\">Home1 Real-time Environment Info:</font></font></H2>\n ");fprintf(cgiOut, "<h2 align=center><font color=\"#cc0033\"><body onload=\"show()\"> <div id=\"nowDiv\"></div></font></h2> \n "); fprintf(cgiOut, "<h4>ZIGBEE数据显示部分</H4>\n ");fprintf(cgiOut, "<h4>Temperature:\t%0.2f</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].zigbee_info.temperature );fprintf(cgiOut, "<h4>Humidity:\t%0.2f</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].zigbee_info.humidity);fprintf(cgiOut, "<h4>A9数据显示部分</H4>\n ");fprintf(cgiOut, "<h4>Adc:\t%0.2f</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.adc);fprintf(cgiOut, "<h4>GYROX:\t%d</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.gyrox);fprintf(cgiOut, "<h4>GYROY:\t%d</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.gyroy);fprintf(cgiOut, "<h4>GYROZ:\t%d</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.gyroz);fprintf(cgiOut, "<h4>AACX :\t%d</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.aacx);fprintf(cgiOut, "<h4>AACY :\t%d</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.aacy);fprintf(cgiOut, "<h4>AACZ :\t%d</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.aacz);fprintf(cgiOut, "<h4>A9-RESERVED[0]:\t%d</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.reserved[0]);fprintf(cgiOut, "<h4>A9-RESERVED[1]:\t%d</H4>\n ", shm_buf->sm_all_env_info.monitor_no[shm_buf->shm_status].a9_info.reserved[1]);fprintf(cgiOut, "<h4>STM32数据显示部分</H4>\n ");fprintf(cgiOut, "<h4>......</H4>\n ");}else{fprintf(cgiOut, "<h2><font face=\"Broadway\"><font color=\"#FFFAF0\">Close!</font></font></H2>\n "); }
// fprintf(cgiOut, "<h3>:</H3>\n "); fprintf(cgiOut, "</BODY></HTML>\n"); sem_v (semid, 0);return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <errno.h>
#include "cgic.h"
#include "data_global.h"#define home_id 1struct shm_addr{char shm_status; //shm_status可以等于home_id,用来区分共享内存数据struct env_info_client_addr sm_all_env_info;
};
struct shm_addr *shm_buf;#if 0
struct setEnv
{int temMAX;int temMIN;int humMAX;int humMIN;int illMAX;int illMIN;
};
#endif int cgiMain()
{key_t key;char sto_no[2];char buf[20];struct shm_addr new;int msgid;struct msg msg_buf;memset(&msg_buf,0,sizeof(msg_buf));cgiFormString("store", sto_no, 2);cgiFormString("temMAX", buf, 20);new.sm_all_env_info.monitor_no[home_id].zigbee_info.tempMAX = atoi(buf);cgiFormString("temMIN", buf, 20);new.sm_all_env_info.monitor_no[home_id].zigbee_info.tempMIN = atoi(buf);cgiFormString("humMAX", buf, 20);new.sm_all_env_info.monitor_no[home_id].zigbee_info.humidityMAX = atoi(buf);cgiFormString("humMIN", buf, 20);new.sm_all_env_info.monitor_no[home_id].zigbee_info.humidityMIN = atoi(buf);//cgiFormString("illMAX", buf, 20);//new.illMAX = atoi (buf);//cgiFormString("illMIN", buf, 20);//new.illMIN = atoi (buf);if((key = ftok("/tmp", 'g')) < 0){perror("ftok");exit(1);}if((msgid = msgget(key, 0666)) < 0){perror("msgget");exit(1);}memcpy (msg_buf.text+1, &new, 24);msg_buf.type = 1L;msg_buf.msgtype = 5L;msg_buf.text[0] = sto_no[0];msgsnd(msgid, &msg_buf,sizeof(msg_buf)-sizeof(long),0);sto_no[0] -= 48;cgiHeaderContentType("text/html\n\n"); fprintf(cgiOut, "<HTML><HEAD>\n"); fprintf(cgiOut, "<TITLE>My CGI</TITLE></HEAD>\n"); fprintf(cgiOut, "<BODY>"); fprintf(cgiOut, "<H2>send sucess</H2>");//fprintf(cgiOut, "<a href='.html'>返回</a>"); fprintf(cgiOut, "<meta http-equiv=\"refresh\" content=\"1;url=../home%d.html\">", sto_no[0]);fprintf(cgiOut, "</BODY>\n"); fprintf(cgiOut, "</HTML>\n"); return 0; }
这俩是CGI相关的程序都是为了完成数据的刷新
录了讲解视频,后面发评论区
相关文章:

嵌入式安防监控项目——html框架分析和环境信息刷新到网页
目录 一、html控制LED 二、模拟数据上传到html 一、html控制LED 简单来说就是html给boa服务器发了一个控制指令信息,然后boa转发给cgi进程,cgi通过消息队列和主进程通信。主进程再去启动LED子线程。 这是老师给的工程。 以前学32都有这工具那工具来管…...

centos安装docker详细步骤
目录 一.前言 1.环境要求2.官网中文安装参考手册 二.安装步骤 1.卸载旧版本2.安装需要的软件包3.设置docker镜像源 1.配置docker镜像源 方式1:官网地址(外国):方式2:阿里云源:2.查看配置是否成功 4.更新yum软件包索引5.可以查看…...

初识HTML、W3C标准、如何利用IDEA创建HTML项目、HTML基本结构、网页基本信息
一、什么是HTML? HTML——Hyper Text Markup Languagr(超文本标记语言) 超文本包括:文字、图片、音频、视频、动画等 目前网页中常用——HTML5 HTML5提供了一些新的元素和一些有趣的新特性,同时也建立了一些新的规则…...

为什么程序员喜欢这些键盘?
文章目录程序员的爱介绍个人体验程序员的爱 程序员是长时间使用计算机的群体,他们需要一款高品质的键盘来保证舒适的打字体验和提高工作效率。在键盘市场上,有很多不同类型的键盘,但是对于程序员来说,机械键盘是他们最钟爱的选择…...

JS中数组去重的几种方法
JS 中有多种方法可以实现数组去重,下面是几种常用的方法:1、使用 Set 去重:Set 数据结构中不能有重复元素,可以将数组转成 Set 类型,再转回数组。let arr [1,2,3,4,5,6,2,3,4]; let uniqueArr [...new Set(arr)]; co…...

Nginx 配置实例-负载均衡
一、实现效果 浏览器地址栏输入地址 http://192.168.137.129/edu/a.html,负载均衡效果,将请求平均分配到8080和8081两台服务器上。 二、准备工作 1. 准备两台tomcat服务器,一台8080,一台8081 (具体操作如下两个链接) Nginx配置实…...

引出生命周期、生命周期_挂载流程、生命周期_更新流程、生命周期_销毁流程、生命周期_总结——Vue
目录 一、引出生命周期 二、生命周期_挂载流程 三、生命周期_更新流程 四、生命周期_销毁流程 五、生命周期_总结 一、引出生命周期 生命周期: 1.又名:生命周期回调函数、生命周期函数、生命周期钩子。 2.是什么:Vue在关键时刻帮我们调…...

C++ STL学习之【vector的使用】
✨个人主页: Yohifo 🎉所属专栏: C修行之路 🎊每篇一句: 图片来源 The power of imagination makes us infinite. 想象力的力量使我们无限。 文章目录📘前言📘正文1、默认成员函数1.1、默认构造…...

方差分析与单因素方差分析
研究分类型自变量对数值型因变量的影响。检验统计的设定和检验方法与变量间的方差是否相等有关。 例如研究行业、服务等级对投诉数的影响:如表格中给出4个行业、每个行业有3个服务等级、样本容量为7、观测值为投诉数。则构成一个3维的矩阵。 在上述基础上…...

分布式链路追踪组件skywalking介绍
SkyWalking组件概念 一个开源的可观测平台, 用于从服务和云原生基础设施收集, 分析, 聚合及可视化数据。SkyWalking 提供了一种简便的方式来清晰地观测分布式系统, 甚至横跨多个云平台。SkyWalking 更是一个现代化的应用程序性能监控(Application Performance Monitoring)系统…...

SUBMIT的用法
SUBMIT的用法 一、简介 系统MB52/MB51/MB5B等类似的报表 ,虽然数据很全面,执行效率也够快,但是经常会不满足用户需求(增添字段、添加查询条件等),很多ABAP 会选择去COPY出标准程序,然后去做修改…...

网页基本标签、图像标签、链接标签、块内元素和块元素、列表标签、表格标签
一、网页基本标签 标题标签 段落标签 未写段落标签前,文本没有按照想要的格式排列显示 写段落标签后: 每句都是一段,所以句与句距离比较宽 换行标签 同一段,只是把文字换行,所以比较紧凑 水平线标签 字体样式标签 …...

RxJava操作符变换过程
要使用Rxjava首先要导入两个包,其中rxandroid是rxjava在android中的扩展 implementation io.reactivex:rxandroid:1.2.1implementation io.reactivex:rxjava:1.2.0我们在使用rxjava的操作符时都觉得很方便,但是rxjava是怎么实现操作符的转换呢࿰…...

开放平台订单接口
custom-自定义API操作 注册开通 taobao.custom 公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) secret String 是 调用密钥 api_name String 是 API接口名称(包括在请求地址中&a…...

CDN相关知识点
1、什么是CDN?CDN的作用是什么? CDN(Content Delivery Network,内容分发网络)是一种通过在多个节点上分布内容以提高网络性能、可靠性和可扩展性的网络解决方案。CDN通过在不同的地理位置部署服务器,使用户…...

【论文阅读】注意力机制与二维 TSP 问题
前置知识 注意力机制 见 这篇 二维 TSP 问题 给定二维平面上 nnn 个点的坐标 S{xi}i1nS\{x_i\}_{i1}^nS{xi}i1n,其中 xi∈[0,1]2x_i\in [0,1]^2xi∈[0,1]2,要找到一个 1∼n1\sim n1∼n 的排列 π\piπ ,使得目标函数 L(π∣s)∥xπ…...

[深入理解SSD系列 闪存实战2.1.7] NAND FLASH基本编程(写)操作及原理_NAND FLASH Program Operation 源码实现
前言 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义, 下面先来个热身: 问1. 原理图上NAND FLASH只有数据线,怎么传输地址? 答1.在DATA0~DATA7上既传输数据,又传输地址 当ALE为高电平时传输的是地址, 问2. 从N...

PMP项目管理项目资源管理
目录1 项目资源管理概述2 规划资源管理3 估算活动资源4 获取资源5 建设团队6 管理团队7 控制资源1 项目资源管理概述 项目资源管理包括识别、获取和管理所需资源以成功完成项目的各个过程,这些过程有助于确保项目经理和项目团队在正确的时间和地点使用正确的资源。…...

程序的编译和链接
程序的编译和链接程序的编译和链接程序的两种环境翻译环境详解编译和链接预处理编译汇编链接运行环境程序的编译和链接 程序的两种环境 在ANSI C的任何一种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 …...

Win11的两个实用技巧系列之无法联网怎么办、耳机没声音的多种解决办法
Win11无法联网怎么办? win11安装后设备不能上网的解决办法Win11无法联网怎么办?电脑安装win11系统以后,发现不能上网,连接不上网络,该怎么办呢?下面我们就来看看win11安装后设备不能上网的解决办法Win11安装后&#x…...

【微信小程序】-- 自定义组件 - 数据监听器 - 案例 (三十五)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
Linux - 第7节 - 进程间通信
1.进程间通信介绍 进程间通信目的: 数据传输:一个进程需要将它的数据发送给另一个进程 。 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要向另一个或一组进程发送消息,通…...

# 数据完整性算法在shell及python中的实践
数据完整性算法在shell及python中的实践 文章目录数据完整性算法在shell及python中的实践1 预备知识1.1 摘要算法1.2 报文(数据)完整性校验1.3 python byte类型字符串与普通字符串区别2 传统方法(散列函数)2.1 在shell中实践2.2 在…...

QEMU启动x86-Linux内核
目录QEMU简介linux启动流程我的环境安装QEMU软件包安装源码安装编译linux内核编译busybox制作initramfs使用QEMU启动linux内核简化命令参考QEMU简介 QEMU(quick emulator)是一个通用的、开源的硬件模拟器,可以模拟不同硬件架构(如…...

C/C++每日一练(20230311)
目录 1. 计算阶乘的和 ★ 2. 基本计算器 ★★★ 3. N皇后 II ★★★ 🌟 每日一练刷题专栏 C/C 每日一练 专栏 Python 每日一练 专栏 1. 计算阶乘的和 计算:1!-2!3!-4!5!-6!7!-8!9!-10!,并输出计算结果。 注意:不全是…...

哪个牌子的洗地机耐用?耐用的洗地机推荐
作为当下非常热销的洗地机,它不仅解放了双手,使用也非常的便捷。是生活品质提高的最好代表,但是面对市面上让人眼花缭乱的洗地机,挑选几个来回都决定不了到底入手哪个好!为了能帮助大家选购到合适的洗地机,…...

搭建一个中心化的定时服务
1. 背景 在物联网络,很多设备之间都在进行交互,其中云端在远程交流中起到了很重要的作用。比如,一台设备想进行调温,但是需要知道此时房间的温度,那就需要定时去查询传感器测出来的房间温度,如果温度过高&a…...

【CSS】快速入门笔记
视频链接:https://www.bilibili.com/video/BV1mS4y1Z7Ga/?spm_id_from333.999.0.0&vd_source1ad00d913eae8281cbadad6ae66fb06c 文章目录一、CSS语法1.结构2.样式类型1)内联样式 Inline Style2)内部样式 Internal Style3)外部…...

第161篇 笔记-去中心化的含义
本文主要内容来自Vitalik Buterin的文章。“去中心化”这个词是在加密经济学领域用得最多的一个词,通常也作为辨别区块链的依据。然而,这个词也可能是被定义得最不恰当的一个词。数千小时的研究和价值数十亿美元哈希算力的投入都旨在实现去中心化&#x…...

「计算机组成原理」数据的表示和运算(二)
文章目录五、奇偶校验码六、算术逻辑单元ALU6.1 电路的基本原理6.2 加法器的设计6.2.1 一位全加器6.2.2 串行加法器6.2.3 串行进位的并行加法器6.2.4 并行进位的并行加法器七、补码加减运算器八、标志位的生成九、定点数的移位运算9.1 算数移位9.2 逻辑移位9.3 循环移位五、奇偶…...