【驱动篇】龙芯LS2K0300之单总线驱动

实验过程

实验目的: 在龙芯开发板上面使用单总线驱动DS18B20温度传感器

① 根据原理图连接DS18B20模块

② 将i2c0引脚的功能复用为GPIO

③ 注册字符设备,按照DS18B20的读写时序编写读写驱动接口

④ 编写测试用例解析传感器的数值

原理图

将板子上面的GPIO48连接传感器的DAT引脚,其余引脚连接如下

在这里插入图片描述

然后记得在设备树中把i2c0部分代码注释掉,将PIN16复用为GPIO48

驱动代码

定义相关传感器设备结构体

#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of_gpio.h>
#include <linux/errno.h>

#define DS18B20_DEV_NUM			1		  
#define DS18B20_DEV		        "ds18b20"	
#define DS18B20_GPIO            48
#define DS18B20_DQ_OUT(x)       gpio_direction_output(ds18b20.gpio, x)
#define DS18B20_DQ_IN           ds18b20_get_io()

struct ds18b20_dev {
    dev_t dev_id;		
	struct cdev cdev;	
	struct class *class;	
	struct device *device;	
	int major;			
	int minor;	
    int gpio;				
    unsigned char data[2]; 
	struct timer_list timer;	
    struct work_struct work;
};

struct ds18b20_dev ds18b20;

传感器数据读写交互

static int ds18b20_get_io(void)
{
    gpio_direction_input(ds18b20.gpio);
    return gpio_get_value(ds18b20.gpio); 
}

static void ds18b20_reset(void)
{
    DS18B20_DQ_OUT(0);  /* 拉低DQ,复位 */
    udelay(750);      /* 拉低750us */
    DS18B20_DQ_OUT(1);  /* DQ=1, 释放复位 */
    udelay(15);       /* 延迟15US */
}

uint8_t ds18b20_check(void)
{
    uint8_t retry = 0;
    uint8_t rval = 0;

    while (DS18B20_DQ_IN && retry < 200)    /* 等待DQ变低, 等待200us */
    {
        retry++;
        udelay(1);
    }

    if (retry >= 200)
    {
        rval = 1;
    }
    else
    {
        retry = 0;

        while (!DS18B20_DQ_IN && retry < 240)   /* 等待DQ变高, 等待240us */
        {
            retry++;
            udelay(1);
        }

        if (retry >= 240) rval = 1;
    }

    return rval;
}

static uint8_t ds18b20_read_bit(void)
{
    uint8_t data = 0;
    DS18B20_DQ_OUT(0);
    udelay(2);
    DS18B20_DQ_OUT(1);
    udelay(12);

    if (DS18B20_DQ_IN)
    {
        data = 1;
    }

    udelay(50);
    return data;
}

static uint8_t ds18b20_read_byte(void)
{
    uint8_t i, b, data = 0;

    for (i = 0; i < 8; i++)
    {
        b = ds18b20_read_bit(); /* DS18B20先输出低位数据 ,高位数据后输出 */

        data |= b << i;         /* 填充data的每一位 */
    }

    return data;
}

static void ds18b20_write_byte(uint8_t data)
{
    uint8_t j;
    for (j = 1; j <= 8; j++)
    {
        if (data & 0x01)
        {
            DS18B20_DQ_OUT(0);  /*  Write 1 */
            udelay(2);
            DS18B20_DQ_OUT(1);
            udelay(60);
        }
        else
        {
            DS18B20_DQ_OUT(0);  /*  Write 0 */
            udelay(60);
            DS18B20_DQ_OUT(1);
            udelay(2);
        }

        data >>= 1;             /* 右移,获取高一位数据 */
    }
}

static void ds18b20_start(void)
{
    ds18b20_reset();
    ds18b20_check();
    ds18b20_write_byte(0xcc);   /*  skip rom */
    ds18b20_write_byte(0x44);   /*  convert */
}

static int ds18b20_init(void)
{
    gpio_direction_output(ds18b20.gpio, 0);
    ds18b20_reset();
    return ds18b20_check();	
}

注册字符设备,绑定相关回调函数

static int ds18b20_open(struct inode *inode, struct file *filp)
{
	return 0;
}

static ssize_t ds18b20_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt) 
{
    int ret;
    ret = copy_to_user(buf, &ds18b20.data[0], 2);
	if(ret)
        return -ENOMEM;
	return ret;
}

static struct file_operations ds18b20_fops = {
	.owner	= THIS_MODULE,
	.open = ds18b20_open,
	.read	= ds18b20_read,
};

static void ds18b20_work_callback(struct work_struct *work)
{
    ds18b20_start();                            /*  ds1820 start convert */
    ds18b20_reset();
    ds18b20_check();
    ds18b20_write_byte(0xcc);                   /*  skip rom */
    ds18b20_write_byte(0xbe);                   /*  convert */
    ds18b20.data[0] = ds18b20_read_byte();      /*  LSB */
    ds18b20.data[1] = ds18b20_read_byte();      /*  MSB */
}

static void ds18b20_timer_callback(struct timer_list *arg)
{
    schedule_work(&ds18b20.work);	
    mod_timer(&ds18b20.timer, jiffies + (1000 * HZ/1000));	
}

static int ds18b20_module_init(void)
{
    int ret = 0;
    ds18b20.gpio = DS18B20_GPIO;
    if (!gpio_is_valid(ds18b20.gpio)) {
        return -EINVAL;
    }

    ret = gpio_request(ds18b20.gpio, "DS18B20-GPIO");
    if (ret) {
        printk(KERN_ERR "ds18b20 : Failed to request gpio\n");
        return ret;
	}

    ds18b20_init();

    if (ds18b20.major) {		
		ds18b20.dev_id = MKDEV(ds18b20.major, 0);
		ret = register_chrdev_region(ds18b20.dev_id, DS18B20_DEV_NUM, DS18B20_DEV);
		if(ret < 0) {
			pr_err("cannot register %s char driver [ret=%d]\n", DS18B20_DEV, DS18B20_DEV_NUM);
			goto free_gpio;
		}
	} 
    else {					
		ret = alloc_chrdev_region(&ds18b20.dev_id, 0, DS18B20_DEV_NUM, DS18B20_DEV);
		if(ret < 0) {
			pr_err("%s Couldn't alloc_chrdev_region, ret=%d\r\n", DS18B20_DEV, ret);
			goto free_gpio;
		}
		ds18b20.major = MAJOR(ds18b20.dev_id);	
		ds18b20.minor = MINOR(ds18b20.dev_id);	
	}
	
	ds18b20.cdev.owner = THIS_MODULE;
	cdev_init(&ds18b20.cdev, &ds18b20_fops);
	cdev_add(&ds18b20.cdev, ds18b20.dev_id, DS18B20_DEV_NUM);
	if(ret < 0)
		goto del_unregister;
		
	ds18b20.class = class_create(THIS_MODULE, DS18B20_DEV);
	if (IS_ERR(ds18b20.class)) {
		goto del_cdev;
	}

	ds18b20.device = device_create(ds18b20.class, NULL, ds18b20.dev_id, NULL, DS18B20_DEV);
	if (IS_ERR(ds18b20.device)) {
		goto destroy_class;
	}

	timer_setup(&ds18b20.timer, ds18b20_timer_callback, 0);
    ds18b20.timer.expires=jiffies + msecs_to_jiffies(1000);
    add_timer(&ds18b20.timer);
	INIT_WORK(&ds18b20.work, ds18b20_work_callback);

    return 0;

destroy_class:
	class_destroy(ds18b20.class);
del_cdev:
	cdev_del(&ds18b20.cdev);
del_unregister:
	unregister_chrdev_region(ds18b20.dev_id, DS18B20_DEV_NUM);
free_gpio:
	gpio_free(ds18b20.gpio);
	return -EIO;
}

整合代码

#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of_gpio.h>
#include <linux/errno.h>

#define DS18B20_DEV_NUM			1		  
#define DS18B20_DEV		        "ds18b20"	
#define DS18B20_GPIO            48	
#define DS18B20_DQ_OUT(x)       gpio_direction_output(ds18b20.gpio, x)
#define DS18B20_DQ_IN           ds18b20_get_io()

struct ds18b20_dev {
    dev_t dev_id;		
	struct cdev cdev;	
	struct class *class;	
	struct device *device;	
	int major;			
	int minor;	
    int gpio;				
    unsigned char data[2]; 
	struct timer_list timer;	
    struct work_struct work;
};

struct ds18b20_dev ds18b20;

static int ds18b20_get_io(void)
{
    gpio_direction_input(ds18b20.gpio);
    return gpio_get_value(ds18b20.gpio); 
}

static void ds18b20_reset(void)
{
    DS18B20_DQ_OUT(0);  /* 拉低DQ,复位 */
    udelay(750);      /* 拉低750us */
    DS18B20_DQ_OUT(1);  /* DQ=1, 释放复位 */
    udelay(15);       /* 延迟15US */
}

uint8_t ds18b20_check(void)
{
    uint8_t retry = 0;
    uint8_t rval = 0;

    while (DS18B20_DQ_IN && retry < 200)    /* 等待DQ变低, 等待200us */
    {
        retry++;
        udelay(1);
    }

    if (retry >= 200)
    {
        rval = 1;
    }
    else
    {
        retry = 0;

        while (!DS18B20_DQ_IN && retry < 240)   /* 等待DQ变高, 等待240us */
        {
            retry++;
            udelay(1);
        }

        if (retry >= 240) rval = 1;
    }

    return rval;
}

static uint8_t ds18b20_read_bit(void)
{
    uint8_t data = 0;
    DS18B20_DQ_OUT(0);
    udelay(2);
    DS18B20_DQ_OUT(1);
    udelay(12);

    if (DS18B20_DQ_IN)
    {
        data = 1;
    }

    udelay(50);
    return data;
}

static uint8_t ds18b20_read_byte(void)
{
    uint8_t i, b, data = 0;

    for (i = 0; i < 8; i++)
    {
        b = ds18b20_read_bit(); /* DS18B20先输出低位数据 ,高位数据后输出 */

        data |= b << i;         /* 填充data的每一位 */
    }

    return data;
}

static void ds18b20_write_byte(uint8_t data)
{
    uint8_t j;
    for (j = 1; j <= 8; j++)
    {
        if (data & 0x01)
        {
            DS18B20_DQ_OUT(0);  /*  Write 1 */
            udelay(2);
            DS18B20_DQ_OUT(1);
            udelay(60);
        }
        else
        {
            DS18B20_DQ_OUT(0);  /*  Write 0 */
            udelay(60);
            DS18B20_DQ_OUT(1);
            udelay(2);
        }

        data >>= 1;             /* 右移,获取高一位数据 */
    }
}

static void ds18b20_start(void)
{
    ds18b20_reset();
    ds18b20_check();
    ds18b20_write_byte(0xcc);   /*  skip rom */
    ds18b20_write_byte(0x44);   /*  convert */
}

static int ds18b20_init(void)
{
    gpio_direction_output(ds18b20.gpio, 0);
    ds18b20_reset();
    return ds18b20_check();	
}
 
static int ds18b20_open(struct inode *inode, struct file *filp)
{
	return 0;
}

static ssize_t ds18b20_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt) 
{
    int ret;
    ret = copy_to_user(buf, &ds18b20.data[0], 2);
	if(ret)
        return -ENOMEM;
	return ret;
}

static struct file_operations ds18b20_fops = {
	.owner	= THIS_MODULE,
	.open = ds18b20_open,
	.read	= ds18b20_read,
};

static void ds18b20_work_callback(struct work_struct *work)
{
    ds18b20_start();                            /*  ds1820 start convert */
    ds18b20_reset();
    ds18b20_check();
    ds18b20_write_byte(0xcc);                   /*  skip rom */
    ds18b20_write_byte(0xbe);                   /*  convert */
    ds18b20.data[0] = ds18b20_read_byte();      /*  LSB */
    ds18b20.data[1] = ds18b20_read_byte();      /*  MSB */
}

static void ds18b20_timer_callback(struct timer_list *arg)
{
    schedule_work(&ds18b20.work);	
    mod_timer(&ds18b20.timer, jiffies + (1000 * HZ/1000));	
}

static int ds18b20_module_init(void)
{
    int ret = 0;
    ds18b20.gpio = DS18B20_GPIO;
    if (!gpio_is_valid(ds18b20.gpio)) {
        return -EINVAL;
    }

    ret = gpio_request(ds18b20.gpio, "DS18B20-GPIO");
    if (ret) {
        printk(KERN_ERR "ds18b20 : Failed to request gpio\n");
        return ret;
	}

    ds18b20_init();

    if (ds18b20.major) {		
		ds18b20.dev_id = MKDEV(ds18b20.major, 0);
		ret = register_chrdev_region(ds18b20.dev_id, DS18B20_DEV_NUM, DS18B20_DEV);
		if(ret < 0) {
			pr_err("cannot register %s char driver [ret=%d]\n", DS18B20_DEV, DS18B20_DEV_NUM);
			goto free_gpio;
		}
	} 
    else {					
		ret = alloc_chrdev_region(&ds18b20.dev_id, 0, DS18B20_DEV_NUM, DS18B20_DEV);
		if(ret < 0) {
			pr_err("%s Couldn't alloc_chrdev_region, ret=%d\r\n", DS18B20_DEV, ret);
			goto free_gpio;
		}
		ds18b20.major = MAJOR(ds18b20.dev_id);	
		ds18b20.minor = MINOR(ds18b20.dev_id);	
	}
	
	ds18b20.cdev.owner = THIS_MODULE;
	cdev_init(&ds18b20.cdev, &ds18b20_fops);
	cdev_add(&ds18b20.cdev, ds18b20.dev_id, DS18B20_DEV_NUM);
	if(ret < 0)
		goto del_unregister;
		
	ds18b20.class = class_create(THIS_MODULE, DS18B20_DEV);
	if (IS_ERR(ds18b20.class)) {
		goto del_cdev;
	}

	ds18b20.device = device_create(ds18b20.class, NULL, ds18b20.dev_id, NULL, DS18B20_DEV);
	if (IS_ERR(ds18b20.device)) {
		goto destroy_class;
	}

	timer_setup(&ds18b20.timer, ds18b20_timer_callback, 0);
    ds18b20.timer.expires=jiffies + msecs_to_jiffies(1000);
    add_timer(&ds18b20.timer);
	INIT_WORK(&ds18b20.work, ds18b20_work_callback);

    return 0;

destroy_class:
	class_destroy(ds18b20.class);
del_cdev:
	cdev_del(&ds18b20.cdev);
del_unregister:
	unregister_chrdev_region(ds18b20.dev_id, DS18B20_DEV_NUM);
free_gpio:
	gpio_free(ds18b20.gpio);
	return -EIO;
}


static void ds18b20_module_exit(void)
{
	cdev_del(&ds18b20.cdev);
	unregister_chrdev_region(ds18b20.dev_id, DS18B20_DEV_NUM); 
	device_destroy(ds18b20.class, ds18b20.dev_id);
	class_destroy(ds18b20.class);
	del_timer(&ds18b20.timer);
    cancel_work_sync(&ds18b20.work);
    gpio_free(ds18b20.gpio); 
}

module_init(ds18b20_module_init);
module_exit(ds18b20_module_exit);
MODULE_LICENSE("GPL");

Makefile文件

obj-m += ds18b20.o 
KDIR:=/home/asensing/loongson/linux-4.19
ARCH=loongarch 
CROSS_COMPILE=loongarch64-linux-gnu-
PWD?=$(shell pwd) 
all:
	make -C $(KDIR) M=$(PWD) modules 

构建脚本

export PATH=$PATH:/home/asensing/loongson/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3-1/bin
make -j8
loongarch64-linux-gnu-gcc test.c -o test
FILE=$PWD/$(basename $PWD).ko
scp $FILE test root@192.168.137.216:/home/root

测试用例

#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"

#define DEV_NAME "/dev/ds18b20"

int main()
{
    int fd, ret;
    unsigned char result[2];
    unsigned char TH, TL;
    short tmp = 0;
    float temperature;
    int flag = 0;

    fd = open(DEV_NAME, 0);

    if(fd < 0)
    {
        printf("open %s device failed\n", DEV_NAME);
        exit(1);
    }
    else
        printf("Open %s success!\n", DEV_NAME);

    while(1)
    {
        ret = read(fd, &result, sizeof(result)); 
		if(ret == 0) {	/* 读取到数据 */
			TL = result[0];
			TH = result[1];
    
			if(TH > 7) {	/* 负数处理 */
				TH = ~TH;
				TL = ~TL;
				flag = 1;	/* 标记为负数 */
			}
			tmp = TH;
			tmp <<= 8;
			tmp += TL;

			if(flag == 1) {
				temperature = (float)(tmp+1) * 0.0625; /* 计算负数的温度 */
				temperature = -temperature;
			}else {
				temperature = (float)tmp *0.0625;	/* 计算正数的温度 */
			}            

			if(temperature < 125 && temperature > -55) {	/* 温度范围 */
				printf("Environment Temperature Now : %0.2f℃\n", temperature);
			}
		}
		flag = 0;
		sleep(1);
    }
	close(fd);	/* 关闭文件 */
}

实验效果

插入驱动后,使用测试用例实时读取环境温度值

在这里插入图片描述

广东太热,我要回非洲!

在这里插入图片描述

参考

以上驱动参考自RT-Thread的工程:rtt-psoc62/one-wire/ds18b20.c at main · hywing/rtt-psoc62 (github.com)

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

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

相关文章

【chatgpt】train_split_test的random_state

在使用train_test_split函数划分数据集时&#xff0c;random_state参数用于控制随机数生成器的种子&#xff0c;以确保划分结果的可重复性。这样&#xff0c;无论你运行多少次代码&#xff0c;只要使用相同的random_state值&#xff0c;得到的训练集和测试集划分就会是一样的。…

Linux_软硬链接

目录 1、软链接 2、软链接的使用方式 3、软链接的删除 4、硬链接 5、硬链接的使用方式 6、软硬链接的使用场景 7、软硬链接的区别 结语 前言&#xff1a; 在Linux操作系统中&#xff0c;有软链接和硬链接&#xff0c;他们是一种特殊的文件引用&#xff0c;主要用于与…

破碎的像素地牢探险:游戏分享

软件介绍 《破碎的像素地牢》是开源一款地牢冒险探索类的游戏&#xff0c;融合了日系RPG经典风格&#xff0c;玩家将控制主角进行未知场景的探索。除了经典地牢玩法外&#xff0c;游戏还添加了更多创意内容&#xff0c;如黑屏状态前的挑战性等&#xff0c;使得游戏更加富有挑战…

git 初基本使用-----------笔记

Git命令 下载git 打开Git官网&#xff08;git-scm.com&#xff09;&#xff0c;根据自己电脑的操作系统选择相应的Git版本&#xff0c;点击“Download”。 基本的git命令使用 可以在项目文件下右击“Git Bash Here” &#xff0c;也可以命令终端下cd到指定目录执行初始化命令…

【React】登录-封装Token的存取删方法--共享复用

在token.js中 // 封装存取方法const TOKENKEY token_keyfunction setToken (token) {return localStorage.setItem(TOKENKEY, token) }function getToken () {return localStorage.getItem(TOKENKEY) }function clearToken () {return localStorage.removeItem(TOKENKEY) }ex…

springboot3多模块实践

先帖下目录结构&#xff0c;直接在idea里面新建就行&#xff0c;删掉多余的文件 子模块的新建 根目录pom文件&#xff0c;注意modules、packaging&#xff0c;dependencyManagement统一管理依赖&#xff0c;子模块添加依赖的时候就不用加版本号 <?xml version"1.0…

富文本编辑器CKEditor

介绍 富文本编辑器不同于文本编辑器,它提供类似于 Microsoft Word 的编辑功能 在Django中,有可以现成的富文本三方模块django-ckeditor,具体安排方式: pip install django-ckeditor==6.5.1官网:Django CKEditor — Django CKEditor 6.7.0 documentation 使用方式 创建项…

I2C总线8位IO扩展器PCF8574

PCF8574用于I2C总线的远程8位I/O扩展器 PCF8574国产有多个厂家有替代产品&#xff0c;图示为其中一款HT8574 1 产品特点 低待机电流消耗&#xff1a;10 uA&#xff08;最大值&#xff09; I2C 转并行端口扩展器 漏极开路中断输出 与大多数微控制器兼容 具有大电流驱动能力的闭…

在linux系统中使用docker、mysql实例

systemctl 是一个命令行工具&#xff0c;用于控制和管理基于 systemd 的 Linux 发行版中的系统和服务。 启动服务 &#xff1a;使用 systemctl start [service-name] 开始一个服务。 如启动docker&#xff1a;systemctl start docker 停止服务 &#xff1a;使用 systemctl st…

JAVA期末复习题1

目录 Java 填空题整理及解析 1. 说出Java的特点&#xff1a; 2. Java的运行机制是先编译再解释运行。 3. 请按照以下分类补全对应的数据类型&#xff1a; 4. 在有限次数循环时&#xff0c;一般选择for循环结构&#xff1b;未知循环次数时&#xff0c;可以选择while循环结构…

预备资金有5000-6000买什么电脑比较好?大学生电脑选购指南

小新pro14 2024 处理器&#xff1a;采用了英特尔酷睿Ultra5 125H或Ultra9 185H两种处理器可选&#xff0c;这是英特尔最新的高性能低功耗处理器&#xff0c;具有18个线程&#xff0c;最高可达4.5GHz的加速频率&#xff0c;支持PCIe 4.0接口&#xff0c;内置了强大的ARC核芯显卡…

如何使用ig507金融数据库的股票接口,股票API来获取MACD指标

一、MACD指标简介 MACD&#xff08;Moving Average Convergence Divergence&#xff0c;移动平均收敛/发散&#xff09;是一种趋势跟踪动量指标&#xff0c;用于分析股票或其他金融产品的价格趋势。MACD由两部分组成&#xff1a;差离值&#xff08;DIF&#xff09;和信号线&am…

【FreeRTOS】任务管理与调度

文章目录 调度&#xff1a;总结 调度&#xff1a; 相同优先级的任务轮流运行最高优先级的任务先运行 可以得出结论如下&#xff1a; a 高优先级的任务在运行&#xff0c;未执行完&#xff0c;更低优先级的任务无法运行b 一旦高优先级任务就绪&#xff0c;它会马上运行&#xf…

笔记本更换固态,保留数据,无需重装系统和软件

一、问题描述&#xff1a; 原有一块128GB的固态硬盘作为c盘使用&#xff0c;由于工作学习需要&#xff0c;经常跑虚拟机&#xff0c;现在需要升级容量。 二、解决思路&#xff1a; 硬件 购买一款大容量的固态硬盘 不同的容量有不同的价格&#xff0c;这个根据预算和实际需要来…

Android,RPC原理,C语言实现Binder跨进程通信Demo

RPC原理图 Binder C语言层的Demo演示 新建目录 把两个文件拷贝到我们的Demo下面 1.binder_server.c #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <linux/types.h> #include <stdbool.h> #include <string.h> #…

odoo的采购询价单,默认情况下显示‘draft‘,‘sent‘,‘purchase‘,请问什么情况下才会显示‘to approve‘?

odoo的采购询价单&#xff0c;默认情况下显示’draft’,‘sent’,‘purchase’&#xff0c;请问什么情况下才会显示’to approve’? 见下图&#xff1a; 这与操作人员的角色是相关的&#xff1a; 当操作人员是群组 “采购 / 用户”时&#xff0c;点击“confirm order/确认订…

越复杂的CoT越有效吗?Complexity-Based Prompting for Multi-step Reasoning

Complexity-Based Prompting for Multi-step Reasoning 论文&#xff1a;https://openreview.net/pdf?idyf1icZHC-l9 Github&#xff1a;https://github.com/FranxYao/chain-of-thought-hub 发表位置&#xff1a;ICLR 2023 Complexity-Based Prompting for Multi-step Reason…

【C语言】算法:二分查找

当我们想在一个有序的序列里面查找一个数字的时候&#xff0c;通常会想到使用循环遍历&#xff0c;也就是下面这种方法&#xff1a; 比如我们想在下面的数组里面找到7&#xff1a; int main() {int num 7;int arr[10] { 1,2,3,4,5,6,7,8,9,10 };for (int i 0; i < size…

5.树莓派4b+ubuntu18.04(ros版本melodic)+arduino mega自制两轮差速小车,实现建图导航功能

这一节介绍雷达的使用&#xff0c;我们使用的雷达型号是ydlidar x3 1.进入工作空间 cd catkin_ws/src2.下载官方提供的SDK文件 git clone https://github.com/YDLIDAR/YDLidar-SDK.git3.安装cmake sudo apt install cmake pkg-config4.编译和安装 进入YDLidar-SDK文件夹后如…

Linux动态网站架构(部署开发php代码)

动态网站架构&#xff08;部署开发php代码&#xff09; 测试能否直接部署nginx需要什么服务&#xff0c;及原理准备并进行开发测试部署代码 概述 静态网站&#xff1a;图片仅仅包含&#xff1a;html&#xff0c;css样式js脚本&#xff0c;图片及视频&#xff1b;nginx直接处…