036——完善编译框架和注释并选择开源协议

目录

小总结

编译框架完善

代码风格

开源协议选择


小总结

经过两个月的努力现在已经写了457MB的代码了

.
├── board
│   ├── Linux
│   │   └── 4_9_88
│   │       └── ARM32
│   │           └── 100ask
│   │               └── imx6ull_mini
│   └── README.md
├── build
│   ├── make_conf.mk
│   ├── Makefile
│   └── make_fun.mk
├── client
│   ├── client.py
│   ├── global_var.py
│   ├── __pycache__
│   │   ├── global_var.cpython-38.pyc
│   │   ├── show.cpython-38.pyc
│   │   ├── tcp.cpython-38.pyc
│   │   └── tool.cpython-38.pyc
│   ├── README.md
│   ├── show.py
│   ├── tcp.py
│   ├── tcp_test.py
│   └── tool.py
├── CREDITS
├── driver
│   ├── 01_driver
│   │   ├── 01_led
│   │   │   ├── led_drv.c
│   │   │   ├── led_test.c
│   │   │   └── Makefile
│   │   ├── 02_sr501
│   │   │   ├── Makefile
│   │   │   ├── sr501_drv.c
│   │   │   └── sr501_test.c
│   │   ├── 03_sr04
│   │   │   ├── Makefile
│   │   │   ├── sr04_poll_drv.c
│   │   │   └── sr04_poll_test.c
│   │   ├── 04_irda
│   │   │   ├── irda_drv.c
│   │   │   ├── irda_test.c
│   │   │   └── Makefile
│   │   ├── 05_motor
│   │   │   ├── Makefile
│   │   │   ├── motor_drv.c
│   │   │   └── motor_test.c
│   │   ├── 06_dht11
│   │   │   ├── dht11_arm_drv.c
│   │   │   ├── dht11_drv.c
│   │   │   ├── dht11_iio_drv.c
│   │   │   ├── dht11_test.c
│   │   │   └── Makefile
│   │   └── 07_ds18b20
│   │       ├── ds18b20_drv.c
│   │       ├── ds18b20_test.c
│   │       └── Makefile
│   ├── 02_device_tree
│   │   ├── 05_motor
│   │   │   ├── button_test.c
│   │   │   ├── gpio_dev.c
│   │   │   ├── gpio_drv.c
│   │   │   └── Makefile
│   │   └── 09_irda_ok
│   │       ├── button_test.c
│   │       ├── gpio_drv.c
│   │       └── Makefile
│   ├── 03_iic
│   │   └── 01_at24c02
│   │       ├── i2c_drv.c
│   │       ├── i2c_test.c
│   │       └── Makefile
│   └── 04_spi
│       └── 01_dac
│           ├── dac_drv.c
│           ├── dac_test.c
│           └── Makefile
├── OS
│   └── openharmony
│       └── rootfs
│           └── linux
│               └── etc
│                   └── issue
├── output
├── README.md
├── release
│   └── release.h
├── server
│   ├── build
│   │   ├── make_conf.mk
│   │   ├── Makefile
│   │   └── make_fun.mk
│   ├── include
│   │   ├── driver_handle.h
│   │   ├── global.h
│   │   ├── net.h
│   │   ├── pthread_ctl.h
│   │   ├── tcp.h
│   │   └── tool.h
│   ├── output
│   │   └── cebss_server-0.0.0
│   └── src
│       ├── driver_handle.c
│       ├── pthread_ctl.c
│       ├── server.c
│       ├── tcp.c
│       └── tool.c
└── tools
    ├── bash
    │   ├── add_head.sh
    │   ├── cebss_start.sh
    │   ├── clear_test.sh
    │   ├── close_printk.sh
    │   ├── delete_file.sh
    │   ├── mk_pro_dir.sh
    │   ├── mount_nfs.sh
    │   ├── net.sh
    │   └── open_printk.sh
    ├── include
    │   └── cJSON.h
    └── src
        └── cJSON.c

41 directories, 81 files

一共81个源文件,下面我先来把编译框架完善了

编译框架完善

 先来验证一下内置的api

MAJOR = 0
MINOR = 1
PATCH = 0
NAME = tianyu.xin

TOP_DIR    = 
SERVER_DIR =
# 定义当前目录的绝对路径变量  
CURRENT_DIR := $(abspath ..)  

all:  
	@echo "当前目录的绝对路径是: $(CURRENT_DIR)"

# all:  
#     @echo "Building the whole project..."  
#     $(MAKE) -C   
#     $(MAKE) -C lib  
  
# clean:  
#     @echo "Cleaning the whole project..."  
#     $(MAKE) -C src clean  
#     $(MAKE) -C lib clean  
  
.PHONY: all

DEBUG ?= 0
PRINT ?= 1

# -f 指定非默认的Makefile文件
all:  
	@echo "Welcome to the cebss compilation system."
	@echo "Building the whole project..."
	$(MAKE) -C $(SERVER_BUILD_DIR) debug=$(DEBUG) KBUILD_VERBOSE=$(PRINT)

试一试能不能成功操作子目录的make

一次就成了

MAJOR = 0
MINOR = 1
PATCH = 0
NAME = tianyu.xin

# 定义当前目录的绝对路径变量  
CEBSS_DIR         := $(abspath ..)
OUTPUT_DIR        := $(CEBSS_DIR)/output
SERVER_DIR        := $(CEBSS_DIR)/server
SERVER_OUTPUT_DIR := $(SERVER_DIR)/output
SERVER_BUILD_DIR  := $(SERVER_DIR)/build
SERVER_APP        := cebss_server-$(MAJOR).$(MINOR).$(PATCH)


# Aesthetic treatment
ECHO_END          := \033[01;0m
ECHO_GREEN        := \033[32m
ECHO_RED          := \033[01;31m
ECHO_YELLOW       := \033[33m
ECHO_BLUE         := \033[34m
ECHO_GREEN_YELLOW := \033[42;30m

DEBUG ?= 0
PRINT ?= 1

# -f 指定非默认的Makefile文件
all:  
	@echo "Welcome to the cebss compilation system."
	@echo "Building the whole project..."
	$(MAKE) -C $(SERVER_BUILD_DIR) debug=$(DEBUG) KBUILD_VERBOSE=$(PRINT)
	cp $(SERVER_OUTPUT_DIR)/$(SERVER_APP) $(OUTPUT_DIR)
  
clean:
	@echo "Cleaning the whole project..."
	$(MAKE) -C $(SERVER_BUILD_DIR) clean

.PHONY: all clean help

我想用py来编译

先试试py的这个命令行

def main():  
    # 创建一个解析器对象  
    parser = argparse.ArgumentParser(description='这是一个构建脚本')  
      
    # 添加参数  
    parser.add_argument('--debug', type=int, default=0, help='开启调试模式,值为1时启用')  
    parser.add_argument('--print-level', type=int, default=1, help='打印级别,0表示不打印,1表示打印')  
    parser.add_argument('--target', type=str, choices=['all', 'clean'], help='构建目标,可选值为all或clean')  
      
    # 解析命令行参数  
    args = parser.parse_args()  
      
    # 现在你可以使用args.debug, args.print_level, 和 args.target来获取参数值  
    print(f"Debug level: {args.debug}")  
    print(f"Print level: {args.print_level}")  
    print(f"Target: {args.target}")  
      
    # 根据参数值执行相应的操作...  
    # ...  
  
if __name__ == '__main__':  
    main()

哦吼木有问题

#! /usr/bin/python3
'''
fuction : 编译脚本
author  : 辛天宇
date    : 2024-4-25
-------------------------------
author     date      modify

'''
import subprocess
import argparse
import os  
import sys  

path = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'build')
os.chdir(path)

def run_make_target(target, debug=0, print_level=1):  
    # 构建make命令的字符串  
    cmd = ["make", target, f"DEBUG={debug}", f"PRINT={print_level}"]  
    # 运行make命令  
    process = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

def make_all():
    cmd = ["make","all"]  
    process = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    # 打印输出结果  
    print(process.stdout.decode())  
    if process.stderr:  
        print(f"Error: {process.stderr.decode()}")

def main():  
    # # 创建一个解析器对象  
    # parser = argparse.ArgumentParser(description='这是一个构建脚本')  
      
    # # 添加参数  
    # parser.add_argument('--debug', type=int, default=0, help='开启调试模式,值为1时启用')  
    # parser.add_argument('--print-level', type=int, default=1, help='打印级别,0表示不打印,1表示打印')  
    # parser.add_argument('--target', type=str, choices=['all', 'clean'], help='构建目标,可选值为all或clean')  
      
    # # 解析命令行参数  
    # args = parser.parse_args()  
      
    # # 现在你可以使用args.debug, args.print_level, 和 args.target来获取参数值  
    # print(f"Debug level: {args.debug}")  
    # print(f"Print level: {args.print_level}")  
    # print(f"Target: {args.target}")
    # # 根据参数值执行相应的操作...  
    # # ...
    make_all()
    print(path)

if __name__ == '__main__':  
    main()

代码风格

大概就像下面这样 

/*  
 * File name : tcp.c
 * Function  : tcp handle && driver control
 * Date      : 2024-04-25  
 * Version   : 0.1.0  
 */
/************************************************************************************
*************************************INCLUDE*****************************************
*************************************************************************************/
#include "tcp.h"
#include "net.h"
#include "global.h"
#include "tool.h"
/************************************************************************************
***************************************EXTERN****************************************
*************************************************************************************/
***********
/*
* func        : usage
* return      : error code
* input       : Command line arguments and sizes
* output      :NULL
* author      date     modify
--------------------------------
 xintianyu  2024-4-10  create
*/
int usage(int argc, char *argv[])
{ 
    if (argc != 3)
    {  
        printf("Usage: %s <ip_address> <port>\n", argv[0]);  
        return ERROR;  
    }
    else
    {
        return NOERROR;
    }
}

/*
* func        : NULL function
* return      : NULL
* input       : NULL
* output      :NULL
* author      date     modify
--------------------------------
 xintianyu  2024-4-10  create
*/
void do_nothing()
{
    /*void*/
}

/*
* func        : tcp handle
* return      : err code
* input       : Command line arguments and sizes
* output      :NULL
* author      date     modify
--------------------------------
 xintianyu  2024-4-10  create
*/
int tcp_server(int argc, char *argv[]) 
{
    int server_fd, client_fd;  
    struct sockaddr_in server_addr, client_addr;  
    socklen_t client_len = sizeof(client_addr); 
    char *ip_address = argv[1];  
    int port = atoi(argv[2]);  
  
    /* 创建TCP套接字 */
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {  
        perror("socket creation failed");  
        exit(EXIT_FAILURE);  
    }  

    /* 支持快速重新绑定 */
	int b_reuse = 1;
	setsockopt (server_fd, SOL_SOCKET, SO_REUSEADDR, &b_reuse, sizeof (int));

    /* 设置服务器地址信息 */ 
    memset(&server_addr, 0, sizeof(server_addr));  
    server_addr.sin_family = AF_INET;  
    server_addr.sin_addr.s_addr = inet_addr(ip_address);  
    server_addr.sin_port = htons(port);  
  
    /* 绑定套接字到服务器地址 */ 
    if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {  
        perror("bind failed");  
        exit(EXIT_FAILURE);  
    }  
  
    /* 监听套接字 */
    if (listen(server_fd, 5) < 0) {  
        perror("listen failed");  
        exit(EXIT_FAILURE);  
    }  
  
    printf("Server listening on %s:%d...\n", ip_address, port);  
	/* 处理僵尸进程 */
	signal(SIGCHLD, SIG_IGN);

    /* 接受客户端连接 */  
    if ((client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_len)) < 0) {  
        perror("accept failed");
        goto err1;
    }
    /* 打印客户端信息 */ 
    char client_ip[INET_ADDRSTRLEN];  
    inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, INET_ADDRSTRLEN);  
    printf("Client connected from %s:%d\n", client_ip, ntohs(client_addr.sin_port));
    if (ERROR == do_client(client_fd))
    {
        perror("client disconnect.....");
        goto err2;
    }

err2:
    close(client_fd);
err1:
    close(server_fd);
    return NOERROR;  
}

/************************************************************************************
***************************************LOCAL*****************************************
************************************************************************************/

/*
* func        : client handle
* return      : err code
* input       : file descriptor
* output      :NULL
* author      date     modify
--------------------------------
 xintianyu  2024-4-10  create
 xintianyu  2024-4-25  V-0.1.0
*/
int do_client(int acceptfd)
{
    char rx_buffer[BUFFER_SIZE];
    int ret;
    
    while(1)
    {
        // 接收客户端消息
        memset(rx_buffer, 0, BUFFER_SIZE);
        ssize_t bytes_read = recv(acceptfd, rx_buffer, BUFFER_SIZE - 1, 0);  
        if (bytes_read < 0) 
        {  
            perror("recv failed");  
            return ERROR;
        }
        else
        {
            printf("Received message: %s\n", rx_buffer);
            if ('Q' == rx_buffer[0] || 0 == rx_buffer[0])
            {
                printf("client quit....\n");
                return ERROR;
            }
            else
            {
                ret = select_driver(rx_buffer, acceptfd);
            }
            if (ret != ERROR)
            {
                /*do nothing*/
            }
            else
            {
                // 回复客户端消息  
                //strcpy(tx_buffer, "Hello, client!\n");
                /*确保消息以换行符结尾,并打印接收到的消息*/  
                if (bytes_read > 0 && rx_buffer[bytes_read - 1] != '\n') {  
                    rx_buffer[bytes_read] = '\n';  
                    rx_buffer[bytes_read + 1] = '\0';  
                }
                if (send(acceptfd, rx_buffer, strlen(rx_buffer), 0) < 0) 
                {  
                    perror("send failed");  
                }
            }
        }
    }
	return NOERROR;
}

/*
* func        : driver handle
* return      : err code
* input       : <cmd> (device code) <accepted> (file descriptor)
* output      :NULL
* author      date     modify
--------------------------------
 xintianyu  2024-4-10  create
 xintianyu  2024-4-25  V-0.1.0
*/
int select_driver(char * cmd, int acceptfd)
{
/* TODO 传递参数后需改为使用通信结构体 */
/* TODO 所有的魔鬼数字都要进行定义 */
    int ret = 0;
    int get_data = 0;
    MSG drv_msg;
    char *tx_buffer;
    char buf[32];
    char irda_data=' ';
    DIRECTION direction;
    CMD drv_cmd;

    if('@' == cmd[0])
    {
#if (STD_ON == DEBUG)
        //printf("cmd[0] = @\n");
#endif/*STD_ON == DEBUG*/
        drv_msg.device = extract_digit_number(cmd, 1, 3);
        //printf("device is %d\n", drv_msg.device);
        /*TODO 后续需升级为多线程模式调用驱动*/
        switch(drv_msg.device)
        {
            case 0:
                /*TODO 日志打印等级控制*/
                /*TODO用设备结构体后这里要封装一下*/
                printf("LED!!!\n");
                if ('g' == cmd[4])
                {
                    direction = direction_get;
                    drv_cmd = cmd_no;
                    led_handle(direction, &drv_cmd);
                    if (cmd_close == drv_cmd)
                    {
                        tx_buffer = "@000g0";
                    }
                    else if(cmd_open == drv_cmd)
                    {
                        tx_buffer = "@000g1";
                    }
                }
                else
                {
                    if ('1' == cmd[5])
                        drv_cmd = cmd_open;
                    else if ('0' == cmd[5])
                        drv_cmd = cmd_close;
                    direction = direction_put;
                    if (NOERROR == led_handle(direction, &drv_cmd))
                    {
                        tx_buffer = "@000p1";
                    }
                    else
                    {
                        tx_buffer = "@000p0";
                    }
                }               
                if (send(acceptfd, tx_buffer, strlen(tx_buffer), 0) < 0)
                {
                    perror("send failed");  
                }
                break;
            case 1:
                printf("SR501!!!\n");
                /*TODO 这里封装成带回调函数的处理函数通过传入处理函数做数据处理*/
                if ('g' == cmd[4])
                {
                    
                    sr501_handle(&get_data);
                    if (sr501_some == get_data)
                    {
                        tx_buffer = "@001g1";
                    }
                    else if(sr501_nobody == get_data)
                    {
                        tx_buffer = "@001g0";
                    }
                }              
                if (send(acceptfd, tx_buffer, strlen(tx_buffer), 0) < 0)
                {
                    perror("send failed");  
                }
                break;
            case 2:
                printf("SR04!!!\n");
                if ('g' == cmd[4])
                {
                    ret = sr04_handle(&get_data);
                    if (NOERROR == ret)
                    {
                        sprintf(buf,"@002g%03d", get_data);
                        tx_buffer = buf;
                    }
                    else
                    {
                        tx_buffer = "@002e";
                    }
                }
                printf(">>>>>>%s\n",tx_buffer);         
                if (send(acceptfd, tx_buffer, strlen(tx_buffer), 0) < 0)
                {
                    perror("send failed");  
                }
                break;
            case 3:
                printf("IRDA!!!\n");
                if ('g' == cmd[4])
                {
                    ret = irda_handle(&irda_data);
                    if (NOERROR == ret)
                    {
                        sprintf(buf,"@003g%c", irda_data);
                        tx_buffer = buf;
                    }
                    else
                    {
                        tx_buffer = "@003e";
                    }
                }
                printf(">>>>>>%s\n",tx_buffer);         
                if (send(acceptfd, tx_buffer, strlen(tx_buffer), 0) < 0)
                {
                    perror("send failed");  
                }
                break;
            case 4:
                printf("motor!!!\n");
                if ('s' == cmd[4])
                {
                    if(0 == cmd[5])
                    {
                        /*/0 /n*/
                        get_data = extract_digit_number(cmd, 6, (strlen(&cmd[5])-2));
                    }
                    else
                    {
                        get_data = -extract_digit_number(cmd, 6, (strlen(&cmd[5])-2));
                    }
                    printf("getdata == %d\n",get_data);
                    ret = motor_handle(get_data);
                    if (NOERROR == ret)
                    {
                        tx_buffer = "@004s";
                    }
                    else
                    {
                        tx_buffer = "@004e";
                    }
                }      
                if (send(acceptfd, tx_buffer, strlen(tx_buffer), 0) < 0)
                {
                    perror("send failed");  
                }
                break;
            case 5:
                printf("dht11!!!\n");
                if ('g' == cmd[4])
                {
                    ret = dht11_handle(buf);
                    tx_buffer = buf;
                }
                printf(">>>>>>%s\n",tx_buffer);         
                if (send(acceptfd, tx_buffer, strlen(tx_buffer), 0) < 0)
                {
                    perror("send failed");  
                }
                break;
            case 6:
                printf("ds18b20!!!\n");
                if ('g' == cmd[4])
                {
                    ret = ds18b20_handle(buf);
                    tx_buffer = buf;
                }
                printf(">>>>>>%s\n",tx_buffer);         
                if (send(acceptfd, tx_buffer, strlen(tx_buffer), 0) < 0)
                {
                    perror("send failed");  
                }
                break;
            case 7:
                printf("AT24C02!!!\n");
                if ('g' == cmd[4])
                {
                    direction = direction_get;
                }
                else
                {
                    direction = direction_put;
                    printf("%s\n", &cmd[5]);
                    printf("写入长度  %d\n", strlen(&cmd[5]));
                    memset(buf, 0, 32);
                    strncpy(buf, &cmd[5], strlen(&cmd[5]));
                }

                ret = at24c02_handle(direction, buf, strlen(&cmd[5]));
                if (NOERROR == ret)
                {

                    tx_buffer = buf;
                }
                else
                {
                    tx_buffer = "@007e";
                }
                printf(">>>>>>%s\n",tx_buffer);
                if (send(acceptfd, tx_buffer, strlen(tx_buffer), 0) < 0)
                {
                    perror("send failed");  
                }
                break;
            case 8:
                printf("DAC!!!\n");
                if ('p' == cmd[4])
                {
                    direction = direction_put;
                    get_data = extract_digit_number(cmd, 5, (strlen(&cmd[5])));
                    if (NOERROR == dac_handle(&get_data))
                    {
                        tx_buffer = "@008p";
                    }
                    else
                    {
                        tx_buffer = "@008e";
                    }

                }
                else
                {
                    tx_buffer = "@008e";
                }
                
                if (send(acceptfd, tx_buffer, strlen(tx_buffer), 0) < 0)
                {
                    perror("send failed");  
                }
                break;
            default:
                printf("Unknown equipment!!!\n");
        }
    }
    else
    {
        printf("cmd[0] ERROR!!!\n");
        ret = ERROR;
    }
    return ret;
}

其他的也都这样修改

开源协议选择

        找到了一张神图感觉说的挺不错的。本着开放的原则我就不过多设限了,但是我以前没开源过东西不太了解怕踩坑。真是不知道该怎么选,我看韦东山老师用的MIT那我也用这个好了。

其实码云上这个解释更完善一些

最流行的开源协议什么,如何选择合适的开源协议?中国第一个违反GPL的案例,腾讯影音为什么会被ffmepg谴责——TechParty1204小沙龙第2个主题分享_哔哩哔哩_bilibili

开源协议是什么?都有什么区别?_哔哩哔哩_bilibili 

有个很有意思的事情,鸿蒙有八百多个仓库,但是好多个仓库用的开源协议都不一样,好有趣。

        兄弟们。一定要重视开源协议,没有大家的无私奉献就没有现在的互联网。后面我也学某厂搞个“耻辱柱”,你们不遵守就给你都钉上。(手动狗头)

V-0.1.0版本发布

CEBSS: Chip evaluation board self-test system based on OpenHamony

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10.JAVAEE之网络编程

1.网络编程 通过网络,让两个主机之间能够进行通信 >基于这样的通信来完成一定的功能进行网络编程的时候,需要操作系统给咱们提供一组 AP1, 通过这些 API才能完成编程&#xff08;API 可以认为是 应用层 和 传输层 之间交互的路径&#xff09;&#xff08;API:Socket API相当…

简单案例验证说明 双亲委派机制

双亲委派介绍 双亲委派机制&#xff08;Parent Delegation Mechanism&#xff09;是Java中的一种类加载机制。在Java中&#xff0c;类加载器负责加载类的字节码并创建对应的Class对象。双亲委派机制是指当一个类加载器收到类加载请求时&#xff0c;它会先将该请求委派给它的父…

aysnc-await的用法

aysnc-await是promise的一种特殊语法&#xff0c;它可以更简洁的得到promise aysnc function aysnc 放在函数前定义函数&#xff0c;它规定了这个函数的返回值一定为promise&#xff0c; // 通过new新建一个promise(旧) // let p new Promise(function(resolve,reject){ //…

可搜索加密:保护隐私的搜索技术

在信息化、数字化快速发展的今天&#xff0c;数据的安全性和隐私性已成为公众关注的焦点。随着云计算、大数据等技术的广泛应用&#xff0c;数据共享与协同工作日益普遍&#xff0c;但如何在确保数据安全性的前提下&#xff0c;实现数据的快速、高效检索&#xff0c;成为了一个…

MySQL中explain的用法

执行结果各字段的含义 EXPLAIN SQL语句 如&#xff1a; EXPLAIN SELECT * FROM test 执行结果&#xff1a; 列名描述id在一个大的查询语句中每个SELECT关键字都对应一个 唯一的idselect_typeSELECT关键字对应的那个查询的类型table表名partitions匹配的分区信息type针对单表…

LLama的激活函数SwiGLU 解释

目录 Swish激活函数 1. Swish函数公式 LLaMA模型中的激活函数 1. SwiGLU激活函数 2. SwiGLU激活函数的表达式 3. SwiGLU激活函数的优势 Swish激活函数 Swish是一种激活函数&#xff0c;其计算公式如下&#xff1a; 1. Swish函数公式 Swish(x) x * sigmoid(x) 其中&am…

基于CANoe从零创建以太网诊断工程(2)—— TCP/IP Stack 配置的三种选项

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

Confluence 快捷键大揭秘:提高效率的小窍门

使用 Confluence 快捷键的好处有&#xff1a; 1.提高工作效率&#xff1b; 2.更流畅地进行编辑、导航和管理操作&#xff1b; 3.减少误操作&#xff1b; 4.展现专业水平。 更多精彩内容&#xff1a; 成为 Jira 大师&#xff1a;效率达人的必备秘诀 Jira Cloud 项目管理专栏 PMO…

怎样把PDF分割成多个文件?有哪些方法可以分割PDF文件?这几个方法成功率很高!

一&#xff0c;引言 PDF分割&#xff0c;即将一个完整的PDF文档拆分为多个较小的部分&#xff0c;是许多用户在处理 PDF文件时经常需要执行的操作。无论是为了单独提取某个章节、创建电子书章节、还是为了在多个设备间轻松共享&#xff0c;PDF分割都显得非常实用。本文将详细介…

AI大模型语音实时对话聊天机器人实现:ollama、funasr;支持语音实时语音打断;回音消除噪声抑制

ASR:funasr(1.0.19) LLM:ollama(Qwen) TTS(edge_tts) 支持语音实时语音打断:这是通过子进程的控制创建与杀掉,这里是通过有人再次说话就打断tts 回音消除噪声抑制:喇叭的tts播报影响到麦克风的识别了,播报的声音被错误的识别;这里可以jd买个回音消除的麦克风设备;或者有…

python 10实验

实验内容&#xff1a; 使用线性回归算法预测儿童身高 实验目的&#xff1a; 理解线性回归算法的原理&#xff0c;了解线性回归算法适用的问题类型&#xff0c;能够使用线性回归算法解决问题 实验内容&#xff1a; 一个人的身高除了随年龄变大而增长以外&#xff0c;在一定程…

revit\navisworks各种安装问题

You have entered a nonvalid serial number &#xff0c;怎么都不给你一个机会输出序列号&#xff0c;怎么办&#xff1f; step1: C:\Program Files (x86)\Common Files\Autodesk Shared\AdskLicensing目录下找到uninstall.exe&#xff0c;右键管理员模式运行&#xff0c;会…

动态活码二维码怎么制作?在线二维码生成器的使用技巧

二维码是如何生成的呢&#xff1f;现在二维码与我们的工作和生活息息相关&#xff0c;越来越多的场景都会有不同类型的二维码&#xff0c;比如常见的有视频、图片、文件、问卷、文本等等类型的内容。面对不同用途需求来制作二维码来为其他人提供内容展示&#xff0c;提升用户获…

Chisel 入门(2)运算符

Chisel 入门(2) 运算符 逻辑运算符 ChiselExplanationwidth!x逻辑非1x && y逻辑与1x||y逻辑或1 位操作运算符 ChiselExplanationwidthin Verilog~x位反w(x)~ signal_xx & y位与max(w(x), w(y))signal_x & signal_yx | y位或max(w(x), w(y))signal_x | sign…

Oracle数据库的AI能力分析,释放企业数据价值

解锁Oracle数据库的AI潜力 Oracle数据库提供了一系列的AI能力&#xff0c;旨在帮助企业和开发者更高效地利用人工智能技术。以下是Oracle数据库AI能力的一些关键点&#xff1a;1. AI向量相似性搜索&#xff1a;Oracle Database 23c引入了AI Vector Search功能&#xff0c;该功…

基于B2C的网上拍卖系统——秒杀与竞价

点击下载源码和论文https://download.csdn.net/download/liuhaikang/89222887 课题背景及意义 随着网络的进一步普及和电子商务的高速发展&#xff0c;越来越多的人们开始在网络中寻求方便。网上网物具备了省时、省事、省心、高效等特点&#xff0c;从而受到越来越多人的欢迎。…

SpringCloud系列(16)--将服务提供者Provider注册进Zookeeper

前言&#xff1a;在上一章节中我们说明了一些关于Eureka自我保护模式&#xff0c;而且自上一章节起关于Eureka的知识已经讲的差不多了&#xff0c;不过因为Eureka已经停更了&#xff0c;为了安全考虑&#xff0c;我们要用还在更新维护的注册中心来取代Eureka&#xff0c;而本章…

C语言:复习

文章目录 思维导图数组和指针库函数的模拟实现判断大小端 最近知识学的差不多了&#xff0c;因此开始复习&#xff0c;本篇开始的是对于C语言的复习 思维导图 下面就依据下图&#xff0c;进行内容的整理 数组和指针 这个模块算是C语言中比较大的一个模块了&#xff0c;具体概…

Three.js——基础材质、深度材质、法向材质、面材质、朗伯材质、Phong材质、着色器材质、直线和虚线、联合材质

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

如何使用rdtsc和C/C++来测量运行时间(如何使用内联汇编和获取CPU的TSC时钟频率)

本文主要是一个实验和思维扩展&#xff0c;是一个初步的尝试&#xff0c;旨在研究一些时间测量实现和在 C/C 中内联汇编和汇编函数的使用方法。除非你有特殊用途&#xff0c;不然不要使用汇编指令来实现这个功能。在“扩展阅读”部分会列出了一些不需要内联汇编实现的方法。 写…
最新文章