粤嵌GEC6818-学习笔记1-基础篇

  • 工具:
    vmware workstation player
    ubuntu18.04
    代码编辑器(notepad++/vscode)
    SecureCRT
  • 问题引入:
    如何设置共享文件夹?
    Linux有哪些常用指令?
    如何进行交叉开发?
    如何查看C语言库函数的使用说明?
    如何使用C语言进行文件操作?

设置共享文件夹

  • 设置一个文件夹(目录),使得两个操作系统(windows和linux)能同时访问到,可以方便操作。

  • 我们一般习惯在Windows系统写代码,当我们需要在Linux系统编译文件时,需要将Windows的文件传到Linux系统,设置一个共享文件夹的话,可以使得两个系统可以同时访问到,大大地方便了操作。

  • 设置过程:

    • 打开虚拟机->菜单->管理->虚拟机设置->选项->共享文件夹->总是启用。

    • 点击添加按钮->弹出添加向导->点击浏览按钮,从windows中选择一个文件夹,确定即可。

在这里插入图片描述
在这里插入图片描述

  • 验证:

    • 打开ubuntu底部的《文件》图标->其它位置->计算机->mnt->hgfs-> 刚刚设置的共享文件夹。
    • 打开共享文件夹就可以访问到里面的文件了。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Linux基础

  • 常用指令
pwd     打印当前的工作路径
cd      用于切换路径(文件夹/目录)
        格式:cd  路径名 
ls      列出指定目录下的文件名
        格式:ls 路径名(可省略不写)
clear   清屏

在这里插入图片描述

touch	文件名字   创建文件
vi/vim	编辑器
		有两种模式:
		第一种:命令模式:按下i,进入编辑模式! 
		第二种:编辑模式:按下esc这个键,进入命令模式
	退出vi的方式有三种
		语法:进入命令行模式:写入 " : " ,之后我们再进行下一步操作
		暖男的方式:q 它会询问你,是否要保存
		渣男的方式:x 不管系统,直接退出并且保存
		正常人:wq 退出并且保存!
ls		查看列表
		可以将你当前目录的所有文件名打印出来
cd		切换目录的指令
		使用方法: cd 目录名
		cd /mnt/hgfs/NHDXshare
		cd . 表示进入当前目录
		cd .. 表示进入上一级目录
pwd		查看你的当前目录的绝对路径
mkdir	创建一个目录
		使用方法: mkdir 目录名
mv		移动一个文件
		假设我要把data里面的1.txt移动到note里面去,该如何做??
		mv ./1.txt ../code
cp		复制一个文件
		假设我要把code里面的1.txt复制一份到data里面去,该如何做?
		cp ./1.txt ../data
  • linux路径说明
    在linux中,所有的路径都是从 / 开始的,称之为根目录
    我们把以/开始的路径,称为绝对路径,例如:/mnt/hgfs/20220618
    那些不是以/开始的路径,称为相对路径,例如: code/
    在一个路径中,除了根目录之外的斜杠,称为路径分隔符

在linux中,有几个特别的符号,表示某种特定的路径:

 ~  表示home目录,一般完整形式可能是: /home/china 
     典型用法:  cd ~

 .   表示当前路径
     典型用法:  ./xxx 

 ..  表示当前路径的上一级目录
     典型用法:
         cd ..

 -   表示上一次所在的路径
     典型用法:
         cd -

第一个C程序

  • 编写程序(在windows中编写代码)
    推荐使用vscode编写,文件保存在之前设置的共享文件夹
#include <stdio.h>
int main()
{
    printf("hello world\n");
    return 0;
}

在这里插入图片描述

  • 切换到ubuntu中,进行编译
    先切换到共享文件夹,然后进行编译
cd 共享文件夹路径
gcc xxx.c(文件名) -o xx(文件名)
cd /mnt/hgfs/code
gcc 00-hello.c -o hello 
  • 执行
./hello

我们可以看到编译00-hello.c文件后,执行hello文件后打印 hello world,打开共享文件夹可以看到编译后的hello文件。
在这里插入图片描述
在这里插入图片描述

SecureCRT连接GEC6818开发板

  • 步骤:
    快速连接->参数配置->1、选择Serial->2、选择开发板所连接的端口->3、波特率选择115200->4、不勾选->5、选择默认

(右键此电脑->管理->系统工具->设备管理器->端口,即可查看serial所连接的端口号,我的电脑连接的时com5,所以选择com5)
在这里插入图片描述
在这里插入图片描述

  • 创建工作文件夹
mkdir -p /文件名

在这里插入图片描述

交叉开发

  • 步骤
    1、编写程序
    2、切换到ubuntu中,进行交叉编译
arm-linux-gcc  xxx.c -o xxx.arm 

在这里插入图片描述
3、把生成的xxx.arm传输到GEC6818开发板

  • 打开CRT连接开发板,进入自己的工作目录 (如果没有工作目录,需要先创建: mkdir -p /0618)
    • cd /0618
  • 执行传输指令
    • rx 待发送的文件名 (回车,菜单->传输->发送xmodem->在弹出的文件对话框中选择要发送的文件)
    • 例: rx hello.arm

在这里插入图片描述

在这里插入图片描述
选择发送Xmodem
在这里插入图片描述
选择要传输的文件
在这里插入图片描述
4、添加执行权限

  • chmod +x 文件名
  • 例: chmod +x hello.arm

在这里插入图片描述
5、执行
./hello.arm
编译 .c文件
在这里插入图片描述

文件IO

使用linux操作系统的好处:它提供了丰富的人机交互功能,或者说是人机的交互界面!

  • Linux的应用开发:

    • Everything is a file in linux
    • 在linux下面,一切皆文件!!
    • 在linux下面,所有的一切都是被当作一个文件来使用的。
  • 操作文件的步骤:

    • 1、打开冰箱 -> 打开文件 open
    • 2、把大象放到冰箱 -> 操作文件 read/write
    • 3、关闭冰箱 -> 关闭文件 close
  • C语言库给我们提供了很多函数!

    • 查询函数的语法:man 你要查询的东西!!
    • man 2 open 2表示文档的第二页

在这里插入图片描述
在这里插入图片描述

文件操作

打开文件open

在这里插入图片描述

  • const char *pathname: 不可在本函数内部进行更改的一个路径名

  • int flags: 打开文件的方式

    • O_RDONLY 只读
    • O_WRONLY 只写
    • O_RDWR 可读可写!!
  • 返回值:

    • 打开文件成功,返回一个整数,这个整数是>0的,称之为文件描述符;
    • 打开文件失败,返回-1;

读文件read

NAME
       read - read from a file descriptor
        从一个文件描述符中去读取数据
SYNOPSIS
       #include <unistd.h>

       ssize_t read(int fd, void *buf, size_t count);

       int fd :  fd 表示是文件描述符!!也就是open的返回值! 
       void *buf   :用来保存你从这个文件(fd)当中读取到的内容,我们一般用字符数组来保存
       size_t count : 你想要从文件中去读取多少个字节!!
返回值:
		成功,返回读到的字节数
		失败:返回-1
		当文件读取完了,返回一个 0 ;

写文件

NAME
       write - write to a file descriptor
        向文件描述符中里去写数据
SYNOPSIS
       #include <unistd.h>

       ssize_t write(int fd, const void *buf, size_t count);
       int fd : 文件描述符
       const void *buf : buf 是保存你要写入到文件里面去的数据
       size_t count    : 你想写入文件数据的大小,或者说你想写多少字节到文件当中去!
返回值:
   成功,返回实际上写入的字节数
   失败,返回-1

关闭文件 close

NAME
       close - close a file descriptor  
        关闭文件

SYNOPSIS
       #include <unistd.h>

       int close(int fd);
       int fd : 其实就是我们前面open这个函数的返回值,也就是一个文件文件描述符!!

移动光标 lseek

NAME
       lseek - reposition read/write file offset

SYNOPSIS
       #include <sys/types.h>
       #include <unistd.h>

       off_t lseek(int fd, off_t offset, int whence);
       int fd : 你要操作的那个文件的文件描述符
       off_t offset    : 偏移量
                       >0  往后偏移
                       <0  往前偏移
                       =0  不动
       int whence  : 光标定位的方式
                    1、是文件的开头  SEEK_SET:基于文件的开头
                    2、是文件的结尾  SEEK_END:基于文件的结尾
                    3、是文件的当前位置  SEEK_CU:基于光标的当前位置
返回值:
   失败,返回-1
   成功,返回新光标到文件开头的位置
例如:
   我想把光标定位在文件结尾处:  lseek(fd,0,SEEK_END);

练习

  • 从一个文本中读取内容
    使用open read close 这个三个函数对文件进行操作!
    读取文件的内容,然后输出buf
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    //打开文件
    //打开文件成功的话,我们就返回一个整数,这个整数(文件描述符)是>0!!
    //打开文件失败就返回-1;
    int fd = open("./1.txt",O_RDWR);
    if(fd == -1)
    {
        printf("open error\n");
        return -1;
    }
    
    //操作文件
    char buf[10] = {0};
    int ret = read(fd, buf, 5);
    if(ret == -1)
    {
        printf("read error\n");
        return -1;
    }
    if(ret == 0)
    {
        printf("read over\n");
        return 1;
    }
    printf("%s\n",buf);
    close(fd);
    return 1;
}
  • 定义一个数组,然后你把数组的内容写入到文件2.txt当中去!!
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
    int fd = open("./2.txt",O_RDWR);
    if(fd == -1)
    {
        printf("open error\n");
        return -1;
    }

    //写文件
    char buf[10] = {'a','b','c','2','3'};//字符数组
    //char *buf1 = "asdff12";//字符串

    int ret = write(fd, buf, 5);
    if(ret == -1)
    {
        printf("write error\n");
        return -1;
    }
    close(fd);

    return 0;
}

  • 利用lseek这个函数,用代码算出文件的大小!!
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main(){
    //打开文件
    int fd = open("./biji.md",O_RDWR);
    if(fd == -1)
    {
        printf("open error\n");
        return -1;
    }

    //它的返回值是新光标到文件开头的位置
    int num = lseek(fd, 0, SEEK_END);
    printf("num = %d\n", num);
    close(fd);

    return 0;
}
  • 假设你有一个文件:1.txt,我要求你把1.txt的内容全部复制到2.txt里面,要求复制1.txt里面的内容到2.txt里面
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    int fd = open("./1.txt",O_RDWR);
    int fd1 = open("./2.txt",O_RDWR);
    if(fd == -1)
    {
        printf("open error\n");
        return -1;
    }
        if(fd1 == -1)
    {
        printf("open error\n");
        return -1;
    }
    //操作文件
    char buf[2] = {0};

    while (1)
    {
        int ret = read(fd, buf, 1);
        if (ret == -1)
        {
            printf("read error\n");
            return -1;
        }
        if (ret == 0)
        {
            printf("read over\n");
            break;
        }
        
        int ret1 = write(fd1, buf, 1);
        if(ret1 == -1)
        {
            printf("write error\n");
            return -1;
        }
    }
    
    close(fd);
    close(fd1);
    return 1;
}

下一篇

粤嵌GEC6818-学习笔记2-屏幕相关及音频播放https://blog.csdn.net/weixin_45735391/article/details/125452935

  • 36
    点赞
  • 238
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝净云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值