【STM32MP157应用编程】2.GPIO输入、输出、中断

news2025/7/23 15:52:05

目录

GPIO文件

指令操作GPIO

程序操作GPIO

程序说明

程序代码

2_GPIO_4.c

启动交叉编译工具

编译

拷贝到开发板

测试

GPIO文件

在/sys/class/gpio目录下,存放了GPIO的文件。

 

 gpiochipX:当前SoC所包含的GPIO控制器,STM32MP157一共包含了12个GPIO控制器。

GPIO组GPIO控制器
GPIOAgpiochip0
GPIOBgpiochip16
GPIOCgpiochip32
GPIODgpiochip48
GPIOEgpiochip64
GPIOFgpiochip80
GPIOGgpiochip96
GPIOHgpiochip112
GPIOIgpiochip128
GPIOJgpiochip144
GPIOKgpiochip160
GPIOZgpiochip176

 每个gpiochipX中都有base、label、ngpio这三个重要的文件。

 

       base:该控制器所管理的这组GPIO引脚中最小的编号。每一个GPIO引脚都会有一个对应的编号,Linux下通过这个编号来操控对应的GPIO引脚。

cat base

 label:该组GPIO对应的标签,也就是名字。

cat label

 ngpio:该控制器所管理的GPIO引脚的数量(引脚编号范围:base ~ base+ngpio-1)。

cat ngpio

 

引脚编号的计算:如PC13。

              |-> GPIOC组 -> gpiochip32 -> 32 ->|

PC13 ->|                                                         |-> 32+13=45

              |-> IO13 -> 13号引脚 -> 13 --------->|

        export:用于将指定编号的GPIO引脚导出。在使用GPIO引脚之前,需要将其导出,导出成功之后才能使用它。export文件是只写文件,不能读取,将一个指定的引脚编号写入到export文件中即可将对应的GPIO引脚导出。

echo 0 > export

 

       gpio0为导出的引脚编号为0的目录,用于管理、控制该GPIO引脚。

       unexport:将导出的GPIO引脚删除,也就是取消导出的GPIO。当使用完GPIO引脚之后,需要将导出的引脚删除,同样该文件也是只写文件、不可读。

echo 0 > unexport

 

       注意:不是所有GPIO引脚都可以成功导出,如果对应的GPIO已经在内核中被使用了,那便无法成功导出。

指令操作GPIO

       direction:配置GPIO引脚为输入或输出模式。该文件可读、可写,读表示查看GPIO当前是输入还是输出模式,写表示将GPIO配置为输入或输出模式;读取或写入操作可取的值为“out”(输出模式)和“in”(输入模式)。

       将引脚的模式设置为输出模式。

cat direction
echo "out" > direction
cat direction

 

        value:在GPIO配置为输出模式下,向value文件写入“0”控制GPIO引脚输出低电平,写入“1”控制GPIO引脚输出高电平。在输入模式下,读取value文件获取GPIO引脚当前的输入电平状态。

       获取引脚的输入电平。

echo "in" > direction
cat value
cat value

 控制GPIO引脚输出高电平。

echo "out" > direction
echo "1" > value

 active_low:这个属性文件用于控制极性,可读可写,默认情况下为0。

设置正常极性。

echo "0" > active_low
echo "out" > direction
echo "1" > value	#输出高电平
echo "0" > value 	#输出低电平

 

 设置反向极性。

echo "1" > active_low
echo "out" > direction
echo "1" > value	#输出低电平
echo "0" > value	#输出高电平

 

       edge:控制中断的触发模式,该文件可读可写。在配置GPIO引脚的中断触发模式之前,需将其设置为输入模式。

       配置为非中断触发。

echo "none" > edge

 配置为上升沿触发。

echo "rising" > edge

 

 配置为下降沿触发。

echo "falling" > edge

 

 配置为边沿触发。

echo "both" > edge

 

程序操作GPIO

程序说明

 ./xxx --YinJiao 参数1 --MoShi ShuChu --DianPing 参数2

引脚输出电平。

参数1:引脚。

                PA0~PZ15。

参数2:电平。

                0:低电平。

                1:高电平。 

./xxx --YinJiao 参数1 --MoShi ShuRu

引脚获取输入的电平。

参数1:引脚。

                PA0~PZ15。

./xxx --YinJiao 参数1 --MoShi ZhongDuan --ChuFa_MoShi 参数2

引脚中断。

参数1:引脚。

                PA0~PZ15。

参数2:中断的触发模式。

                none:非中断。

                rising:上升沿触发。

                falling:下降沿触发。

                both:边沿触发。

程序代码

2_GPIO_4.c

/*
        GPIO输入、输出、中断综合
*/

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <poll.h>

//      ./xxx --YinJiao PA0 --MoShi ShuChu --DianPing 0
//      ./xxx --YinJiao PA0 --MoShi ShuRu
//      ./xxx --YinJiao PA0 --MoShi ZhongDuan --ChuFa_MoShi rising

char GPIO_Path[100];

int main(int argc, char *argv[])
{
    //校验传参
    if (argc != 5 && argc != 7)
    {
        printf("%s文件的参数错误。\n", argv[0]);
        return -1;
    }

    //引脚
    char YinJiaoZu = 0;       //引脚组
    int YinJiao_BianHao = -1; //引脚编号
    char num_str[3];
    int num = 0;
    if (!strcmp(argv[1], "--YinJiao"))
    {
        //argv[2] PA0-PA15
        if (strlen(argv[2]) == 3)
        {
            YinJiaoZu = argv[2][1];
            if (YinJiaoZu == 'Z')
            {
                YinJiao_BianHao = (12 - 1) * 16;
                if (isdigit(argv[2][2])) //isdigit()判断字符是否是数字
                {
                    num_str[0] = argv[2][2];
                    num_str[1] = '\0';
                    sscanf(num_str, "%d", &num); // 将提取的数字转化为整型
                    YinJiao_BianHao = YinJiao_BianHao + num;
                }
            }
            else if (YinJiaoZu >= 'A' && YinJiaoZu <= 'K')
            {
                YinJiao_BianHao = (YinJiaoZu - 65) * 16;
                if (isdigit(argv[2][2])) //isdigit()判断字符是否是数字
                {
                    num_str[0] = argv[2][2];
                    num_str[1] = '\0';
                    sscanf(num_str, "%d", &num); // 将提取的数字转化为整型
                    YinJiao_BianHao = YinJiao_BianHao + num;
                }
            }
            else
            {
                printf("%s参数错误。\n", argv[2]);
                return -1;
            }
        }
        else if (strlen(argv[2]) == 4)
        {
            YinJiaoZu = argv[2][1];
            if (YinJiaoZu == 'Z')
            {
                YinJiao_BianHao = (12 - 1) * 16;
                if (isdigit(argv[2][2]) && isdigit(argv[2][3])) //isdigit()判断字符是否是数字
                {
                    num_str[0] = argv[2][2];
                    num_str[1] = argv[2][3];
                    num_str[2] = '\0';
                    sscanf(num_str, "%d", &num); // 将提取的数字转化为整型
                    YinJiao_BianHao = YinJiao_BianHao + num;
                }
            }
            else if (YinJiaoZu >= 'A' && YinJiaoZu <= 'K')
            {
                YinJiao_BianHao = (YinJiaoZu - 65) * 16;
                if (isdigit(argv[2][2]) && isdigit(argv[2][3])) //isdigit()判断字符是否是数字
                {
                    num_str[0] = argv[2][2];
                    num_str[1] = argv[2][3];
                    num_str[2] = '\0';
                    sscanf(num_str, "%d", &num); // 将提取的数字转化为整型
                    YinJiao_BianHao = YinJiao_BianHao + num;
                }
            }
            else
            {
                printf("%s参数错误。\n", argv[2]);
                return -1;
            }
        }
        else
        {
            printf("%s参数错误。\n", argv[2]);
            return -1;
        }

        //判断引脚GPIO是否导出
        sprintf(GPIO_Path, "/sys/class/gpio/gpio%d", YinJiao_BianHao);
        if (access(GPIO_Path, F_OK))
        { //如果目录不存在 则需要导出
            int fd;
            char YinJiao_BianHao_str[5];
            if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY)))
            {
                perror("打开export错误!\n");
                return -1;
            }

            sprintf(YinJiao_BianHao_str, "%d", YinJiao_BianHao);
            if (write(fd, YinJiao_BianHao_str, strlen(YinJiao_BianHao_str)) == -1)
            { //导出 gpio
                perror("导出引脚GPIO错误!\n");
                close(fd);
                exit(-1);
            }
            close(fd); //关闭文件
        }
    }
    else
    {
        printf("%s选项错误。\n", argv[1]);
        return -1;
    }

    //模式
    int fd_direction;
    int fd_active_low;
    int fd_edge;
    int fd_value;
    char direction_path[100];  //direction路径
    char active_low_path[100]; //active_low路径
    char edge_path[100];       //edge路径
    char value_path[100];      //value路径
    char value;
    if (!strcmp(argv[3], "--MoShi"))
    {
        if (!strcmp(argv[4], "ShuChu")) //输出
        {
            //校验电平
            if (strcmp(argv[5], "--DianPing"))
            {
                printf("%s选项错误。\n", argv[5]);
                return -1;
            }
            if (strcmp(argv[6], "0") && strcmp(argv[6], "1"))
            {
                printf("%s参数错误。\n", argv[6]);
                return -1;
            }

            //配置输出模式
            sprintf(direction_path, "%s/%s", GPIO_Path, "direction");
            if (0 > (fd_direction = open(direction_path, O_WRONLY)))
            {
                perror("打开direction错误!\n");
                close(fd_direction);
                return -1;
            }
            if (strlen("out") != write(fd_direction, "out", strlen("out")))
            {
                perror("设置模式错误!\n");
                close(fd_direction);
                return -1;
            }

            //配置极性
            sprintf(active_low_path, "%s/%s", GPIO_Path, "active_low");
            if (0 > (fd_active_low = open(active_low_path, O_WRONLY)))
            {
                perror("打开active_low错误!\n");
                close(fd_active_low);
                return -1;
            }
            if (strlen("0") != write(fd_active_low, "0", strlen("0")))
            {
                perror("设置极性错误!\n");
                close(fd_active_low);
                return -1;
            }

            //配置为非中断方式
            sprintf(edge_path, "%s/%s", GPIO_Path, "edge");
            if (0 > (fd_edge = open(edge_path, O_WRONLY)))
            {
                perror("打开edge错误!\n");
                close(fd_edge);
                return -1;
            }
            if (strlen("none") != write(fd_edge, "none", strlen("none")))
            {
                perror("设置非中断方式错误!\n");
                close(fd_edge);
                return -1;
            }

            //输出电平
            sprintf(value_path, "%s/%s", GPIO_Path, "value");
            if (0 > (fd_value = open(value_path, O_WRONLY)))
            {
                perror("打开value错误!\n");
                close(fd_value);
                return -1;
            }
            if (strlen(argv[6]) != write(fd_value, argv[6], strlen(argv[6])))
            {
                perror("输出电平错误!\n");
                close(fd_value);
                return -1;
            }
            printf("输出的电平:%s\n", argv[6]);
            close(fd_value);
        }
        else if (!strcmp(argv[4], "ShuRu")) //输入
        {
            //配置输入模式
            sprintf(direction_path, "%s/%s", GPIO_Path, "direction");
            if (0 > (fd_direction = open(direction_path, O_WRONLY)))
            {
                perror("打开direction错误!\n");
                close(fd_direction);
                return -1;
            }
            if (strlen("in") != write(fd_direction, "in", strlen("in")))
            {
                perror("设置模式错误!\n");
                close(fd_direction);
                return -1;
            }

            //配置极性
            sprintf(active_low_path, "%s/%s", GPIO_Path, "active_low");
            if (0 > (fd_active_low = open(active_low_path, O_WRONLY)))
            {
                perror("打开active_low错误!\n");
                close(fd_active_low);
                return -1;
            }
            if (strlen("0") != write(fd_active_low, "0", strlen("0")))
            {
                perror("设置极性错误!\n");
                close(fd_active_low);
                return -1;
            }

            //配置为非中断方式
            sprintf(edge_path, "%s/%s", GPIO_Path, "edge");
            if (0 > (fd_edge = open(edge_path, O_WRONLY)))
            {
                perror("打开edge错误!\n");
                close(fd_edge);
                return -1;
            }
            if (strlen("none") != write(fd_edge, "none", strlen("none")))
            {
                perror("设置非中断方式错误!\n");
                close(fd_edge);
                return -1;
            }

            //读取电平状态
            sprintf(value_path, "%s/%s", GPIO_Path, "value");
            if (0 > (fd_value = open(value_path, O_RDONLY)))
            {
                perror("打开value错误!\n");
                close(fd_value);
                return -1;
            }
            if (0 > read(fd_value, &value, 1))
            {
                perror("读取value错误!\n");
                close(fd_value);
                return -1;
            }
            printf("输入的电平:%c\n", value);
            close(fd_value);
        }
        else if (!strcmp(argv[4], "ZhongDuan")) //中断
        {
            //校验触发模式
            if (strcmp(argv[5], "--ChuFa_MoShi"))
            {
                printf("%s选项错误。\n", argv[5]);
                return -1;
            }
            if (strcmp(argv[6], "rising") && strcmp(argv[6], "falling") && strcmp(argv[6], "both"))
            {
                printf("%s参数错误。\n", argv[6]);
                return -1;
            }

            //配置输入模式
            sprintf(direction_path, "%s/%s", GPIO_Path, "direction");
            if (0 > (fd_direction = open(direction_path, O_WRONLY)))
            {
                perror("打开direction错误!\n");
                close(fd_direction);
                return -1;
            }
            if (strlen("in") != write(fd_direction, "in", strlen("in")))
            {
                perror("设置模式错误!\n");
                close(fd_direction);
                return -1;
            }

            //配置极性
            sprintf(active_low_path, "%s/%s", GPIO_Path, "active_low");
            if (0 > (fd_active_low = open(active_low_path, O_WRONLY)))
            {
                perror("打开active_low错误!\n");
                close(fd_active_low);
                return -1;
            }
            if (strlen("0") != write(fd_active_low, "0", strlen("0")))
            {
                perror("设置极性错误!\n");
                close(fd_active_low);
                return -1;
            }

            //配置触发方式
            sprintf(edge_path, "%s/%s", GPIO_Path, "edge");
            if (0 > (fd_edge = open(edge_path, O_WRONLY)))
            {
                perror("打开edge错误!\n");
                close(fd_edge);
                return -1;
            }
            if (strlen(argv[6]) != write(fd_edge, argv[6], strlen(argv[6])))
            {
                perror("设置中断方式错误!\n");
                close(fd_edge);
                return -1;
            }

            //中断触发
            struct pollfd pfd;
            int ret;
            sprintf(value_path, "%s/%s", GPIO_Path, "value");
            if (0 > (pfd.fd = open(value_path, O_RDONLY)))
            {
                perror("打开value错误!\n");
                close(pfd.fd);
                return -1;
            }
            pfd.events = POLLPRI; //events:等待的事件。POLLPRI:调用方对高优先级数据事件感兴趣,并且poll()函数将等到发生此类事件。
            read(pfd.fd, &value, 1);
            while (1)
            {
                ret = poll(&pfd, 1, -1);
                if (ret < 0)
                {
                    perror("轮询错误!\n");
                    return -1;
                }
                else if (ret == 0)
                {
                    printf("轮询超时!\n");
                    continue;
                }
                if (pfd.revents & POLLPRI) //校验高优先级可读
                {
                    //文件读取位置移到头部
                    if (lseek(pfd.fd, 0, SEEK_SET) < 0)
                    {
                        perror("文件读取位置移到头部错误!\n");
                        return -1;
                    }
                    if (read(pfd.fd, &value, 1) < 0)
                    {
                        perror("读取value错误!\n");
                        return -1;
                    }
                    printf("GPIO中断触发,value=%c\n", value);
                }
            }
        }
    }
    else
    {
        printf("%s选项错误。\n", argv[3]);
        return -1;
    }
    return 0;
}

启动交叉编译工具

source /opt/st/stm32mp1/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

编译

${CC} -o 2_GPIO_4 2_GPIO_4.c

拷贝到开发板

scp 2_GPIO_4 root@10.3.22.219:/home/root/Linux_C_YingYong_BianCheng/JiaoCheng/2_GPIO/

 

测试

使用PE4引脚进行测试,PE4引脚处于悬空状态,电平状态不确定。

PE4输出高电平。

./2_GPIO_4 --YinJiao PE4 --MoShi ShuChu --DianPing 1

 

 PE4输出低电平。

./2_GPIO_4 --YinJiao PE4 --MoShi ShuChu --DianPing 0

 

 PE4获取输入的电平。

./2_GPIO_4 --YinJiao PE4 --MoShi ShuRu

 

 PE4上升沿中断。

./2_GPIO_4 --YinJiao PE4 --MoShi ZhongDuan --ChuFa_MoShi rising

 PE4下降沿中断。

./2_GPIO_4 --YinJiao PE4 --MoShi ZhongDuan --ChuFa_MoShi falling

 

 PE4边沿中断。

./2_GPIO_4 --YinJiao PE4 --MoShi ZhongDuan --ChuFa_MoShi both

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新型开源C2框架:浩劫

研究人员发现了一次针对政府实体的新攻击&#xff0c;攻击者在此期间使用了一种名为浩劫&#xff08;Havoc &#xff09;的新型 C2 框架。 尽管 C2 框架广泛可用&#xff0c;但 Havoc 作为一种先进的后开发框架脱颖而出&#xff0c;可以躲避最新版本的 Windows 11 Defender。 …

一文带你快速初步了解云计算与大数据

目录 &#x1f50d;一、云计算基础 1、云计算的概念、特点、关键技术 2、云计算的分类 3、云计算的部署模式 4、云计算的服务模式&#xff1a;IaaS、PaaS、SaaS分别是什么&#xff0c;具体含义要清楚 5、物联网的概念 6、物联网和云计算、大数据的关系 7、了解云计算的…

Python-生成元组和字典

1.生成元组元组是元素按顺序组合后的产物&#xff0c;元组对象的类型是tuple型含有两个元素的元组成为数据对元组可以包含任意数量和任意类型的元素&#xff0c;其元素总数可以为0、1、2等&#xff0c;并且元素的先后顺序是由意义的。另外&#xff0c;元组中的元素类型没有必要…

open3d最大平面检测,平面分割

1.点云读入 读入文件&#xff08;配套点云下载链接&#xff09; # 读取点云 pcd o3d.io.read_point_cloud("point_cloud_00000.ply")配套点云颜色为白色&#xff0c;open3d的点云显示默认背景为白色&#xff0c;所以将点云颜色更改为黑色 pcd.colors o3d.utilit…

利用 OLE 对象漏洞的 HWP 恶意文件浮出水面

ASEC 分析人员发现了一个利用 OLE 对象的恶意 HWP 文件&#xff0c;尽管其使用了 2020 年就被识别的恶意 URL&#xff0c;但仍然使用了 Flash 漏洞&#xff08;CVE-2018-15982&#xff09;&#xff0c;需要用户谨慎对待。 打开 HWP 文件时会在 %TEMP%文件夹中生成如下文件。攻…

数据结构之基:从根儿上了解数据结构的特性

学好数据结构&#xff0c;就等于成功了一半。 程序是对现实的模拟&#xff0c;现实是由时间和空间组成的&#xff0c;高效的人都是用最少的时间、最少的空间来做最伟大的事&#xff0c;程序亦是如此。我们要选择最合理的算法和最合理的数据结构&#xff0c;来写最好的代码&…

MySQL进阶知识

1 存储引擎1.1 MySQL体系结构1.2 存储引擎简介存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的&#xff0c;而不是基于库的&#xff0c;同一个库的多个表可以采用不同的存储引擎&#xff0c;所以存储引擎也经常称为表类型。创建表时可以指…

Rocketmq源码(一)手把手本地调试

很久没有学习了&#xff0c;从前是因为太忙&#xff0c;现在是因为太懒。立个flag&#xff0c;一定要把rocketmq源码看完&#xff01;源码阅读从idea的环境搭建和debug开始&#xff5e; Idea搭建调试目录代码下载代码架构启动namesvr启动broker启动consumer启动producer代码下载…

深度学习训练营之yolov5 官方代码调用以及-requirements.txt下载当中遇到的问题

深度学习训练营之yolov5 官方代码调用原文链接内容总结环境介绍前置工作简单介绍yolov5下载源码yolov5的下载遇到问题问题解析问题处理创建虚拟环境下载当中遇到的问题代码运行视频检测参考内容原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客…

taobao.trades.sold.query( 根据收件人信息查询交易单号 )

&#xffe5;开放平台免费API必须用户授权聚石塔内调用 根据收件人信息查询交易单号。 公共参数 请求地址: HTTP地址 公共请求参数: 公共响应参数: 请求参数 请求示例 TaobaoClient client new DefaultTaobaoClient(url, appkey, secret); TradesSoldQueryRequest req new…

我用了33行纯CSS实现了下划线的交互动画效果

背景 最近看到了一个特别炫酷的网站上的一个小细节&#xff0c;下划线的动画。看下他的实现效果。 但是&#xff0c;假如我们左边并没有足够的空间存放一条不可见的下划线呢&#xff1f; 像这样。 思路与实现 我要把这个下划线也做成文章刚开始的动画。就不是太好借鉴上面的思…

Windows Server 2022 中文版、英文版下载 (updated Feb 2023)

Windows Server 2022 中文版、英文版下载 (updated Feb 2023) Windows Server 2022 正式版&#xff0c;2023 年 2 月更新 请访问原文链接&#xff1a;https://sysin.org/blog/windows-server-2022/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&a…

Spring Boot 调取Bartender使用教程

Spring Boot 调取Bartender使用教程.md 原文链接&#xff1a;小回博客 博主可帮忙配置bartender进行打印&#xff0c;另有完整Mes系统源码。业务清单 文章目录Spring Boot 调取Bartender使用教程.md[toc]一、复制解压压缩包JavaBarTenderPrint.zip到C盘根目录下&#xff1a;二…

DNF搭建服务器服务端搭建教程

DNF搭建服务器服务端搭建教程 我是艾西&#xff0c;今天给大家分享下怎么样自己搭建一个DNF。 前阵子体验了下其他GM搭建的服&#xff0c;那么对于自己搭建的好处在于出道即巅峰&#xff01; 想要什么武器就是一串代码命令的事情。 下面我跟大家说一下需要准备那些东西&#x…

2023年度数学建模竞赛汇总

本人7年数学建模竞赛经验&#xff0c;历史获奖率百分之百。团队成员都是拿过全国一等奖的硕博&#xff0c;有需要数模竞赛帮助的可以私信我。 下面主要列几年一些比较有含金量的数学建模竞赛&#xff08;按比赛时间顺序&#xff09; 1. 美国大学生数学建模竞赛 报名时间&…

mars3d基础项⽬常⻅报错

1.在⼤家使⽤mars3d基础项⽬的时候经常遇到这个报错&#xff0c;截图如下 回答&#xff1a; 1.原因是因为使⽤了cnpm安装依赖&#xff0c;导致了⼀些依赖问题 2.解决⽅式也很简答&#xff0c;重新使⽤ npm 或 yarn 或 pnpm安装依赖即可 2.本地加载地图时&#xff0c;出现报错回…

云原生|kubernetes|ingress-nginx插件部署(kubernetes-1.23和最新版controller-1.6.4)

前言&#xff1a; ingress是kubernetes内的一个重要功能插件&#xff0c;这个使得服务治理成为一个可能&#xff0c;当然&#xff0c;结合微服务更为妥当了。 不管是什么插件&#xff0c;还是服务&#xff0c;第一步当然是要能顺利的部署到系统当中&#xff0c;这样&#xff…

Oracle——物化视图

文章目录含义物化视图的语法物化视图的创建1、自动刷新的物化事务 ON COMMIT2、非自动刷新的物化视图 ON demand关于手动刷新物化视图的删除资料参考含义 什么是物化视图&#xff1f; 物化视图&#xff0c;通俗点说就是物理化的视图。 什么叫物理化&#xff1f; 将视图以表结构…

【论文解读】如何使用1B参数的小模型打败GPT3.5

大型语言模型 (LLM) 通过利用思维链 (CoT) 提示生成中间推理链作为推断答案的基本原理&#xff0c;在复杂推理上表现出了令人印象深刻的性能。 然而现有的 CoT 研究主要集中在语言模态上。 我们提出 Multimodal-CoT&#xff08;多模态思维链推理模型&#xff09;&#xff0c;它…

GCC:从源文件到可执行文件

GCC&#xff1a;从源文件到可执行文件 假设我们有hello.c 文件 #include <stdio.h> int main(){printf("hello world!\n");return 0; }怎么在linux上利用GCC命令生产可执行文件&#xff08;单文件编译&#xff09;呢&#xff1f; 一、流程 C文件从源文件到…