嵌入式 Linux 编程

image-20210110165157726

嵌入式应用开发

嵌入式软件开发流程

image-20210110162804974

什么是交叉编译

  • 在一种平台上编译出能在另一种平台(体系结构不同)上运行的程序;
  • 在PC 平台(X86) 上编译出能运行在ARM平台上的的程序,即编译得到的程序在X86平台上不能运行, 必须放到 必须放到ARM平台上才能运行;
  • 用来编译这种程序的编译器就叫交叉编译器 ;
  • 为了不与本地编译器混淆,交叉编译器的名字一般都有前缀,例如: 都有前缀,例如:arm-linux-gcc。

构建交叉编译环境所需的工具链主要包括:

  • 交叉编译器,例如 交叉编译器,例如arm-linux-gcc
  • 交叉汇编器,例如 交叉汇编器,例如arm-linux-as
  • 交叉链接器,例如 交叉链接器,例如arm-linux-ld
  • 用于处理可执行程序和库的一些基本工具,例如arm-linux-strip

常见通信模式

image-20210110164009484
  • 串口通讯
    • 特点及应用场合
      • 驱动实现最简单
      • 传输速度慢,距离短,不适合大数据量、长距离数据传输
      • 需要在宿主机、目标机两端均提供驱动
      • 常用于宿主机-目标机的字符流通讯
  • 网络通讯
    • 特点及应用场合
      • 驱动实现相对复杂,一般采用精简的网络通讯协议,如 TFTP 进行通讯
      • 常用于宿主机-目标机的大数据量数据传输,可以作为串口通讯的补充
      • 需要在宿主机、目标机两端均提供驱动
      • 宿主机端实现服务器,目标机端提供客户端
    • TFTP协议
      • TFTP 服务的全称是简单文件传输协议( Trivial File Transfer Protocol )
      • TFTP 可以看成一个简化了的 FTP
      • TFTP 服务器端安装在宿主机, TFTP 客户端由目标板实现,目标板需要获取 IP 地址
  • 并口…
  • USB…

Linux 文件系统

Linux 系统中有三种基本的文件类型

  • 普通文件 :又分为文本文件和二进制文件;
  • 目录文件 :目录文件存储了一组相关文件的位置、大小等与文件有关的信息;
  • 设备文件: Linux 系统把每一个I/O 设备都看成一个文件,与普通文件一样处理,这样可以使文件与设备的操作尽可能统一

Linux 终端命令

Shell

  • Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口(命令解释器) 。
  • Shell接收用户输入的命令并把它送入内核去执行。
  • Shell起着协调用户与系统的一致性和在用户与系统之间进行交互的作用。

Shell的主要功能

  • 命令解释器、命令通配符、命令补全、别名机制、命令历史

Linux 命令格式:cmd [-参数] [操作对象]

  • cmd是命令名
  • 单字符参数前使用一个减号(-),单词参数前使用两个减号(–)。
  • 多个单字符参数前可以只使用一个减号。
  • 最简单的Shell命令只有命令名,复杂的Shell命令可以有多个参数。
  • 操作对象可以是文件也可以是目录,有些命令必须使用多个操作对象, 如cp命令必须指定源操作对象和目标操作对象。
  • 命令名、参数和操作对象都作为Shell命令执行时的输入,它们之间用空格分隔开。

Linux 编程基础

  • VI编辑器
  • GCC编译器
  • Make工程管理器
  • GDB调试器
image-20210110170344463

步骤示例

  • 编写源代码

    VI编辑器 [root@localhost chap2]# vi hello.c

  1. 编译源程序GCC——GNU Compiler Collection

    [root@localhost chap2]# gcc –o hello hello.c

  2. 运行程序/调试程序

    [root@localhost chap2]#./hello

GCC

  • 对C/C++ 编译的控制
    • 预处理(Preprocessing)
    • 编译(Compilation)
    • 汇编(Assembly)
    • 链接(Linking)
  • 基本使用格式:$ gcc [ 选项 ] <文件名>
    • 生成预处理文件:$gcc –E hello.c –o hello.i
    • 生成汇编文件:$gcc –S hello.c –o hello.s
    • 生成二进制文件:$gcc –c hello.c –o hello.o
    • 生成可执行文件:$gcc hello.c –o hello

使用make工具

  • 基本格式:

    目标:依赖项列表
    (Tab缩进)命令
    
    • 目标:欲生成的目标文件
    • 依赖项:生成目标需要的文件
  • 原理:

    • 判断依赖项是否为最新,否则,生成新的目标
  • make 工具的使用格式:

    • make [[ 命令选项] [ 命令参数]]
    • 通常使用make 就可以了,make 会寻找Makefile 作为编译指导文件

makefile 示例

  • 最简单的makefile文件

    calc: main.c getch.c getop.c stack.c
    	gcc -o calc main.c getch.c getop.c stack.c 
    
  • 解决一下编写效率方面的问题

     cc = gcc
     prom = calc
     src = main.c getch.c getop.c stack.c
         
     $(prom): $(src)
        $(cc) -o $(prom) $(src)
    
  • 解决修改calc.h文件无法察觉

    cc = gcc
    prom = calc
    deps = calc.h
    obj = main.o getch.o getop.o stack.o
         
    $(prom): $(obj)
        $(cc) -o $(prom) $(obj)
    
    main.o: main.c $(deps)
        $(cc) -c main.c
    
    getch.o: getch.c $(deps)
        $(cc) -c getch.c
    
    getop.o: getop.c $(deps)
        $(cc) -c getop.c
    
    stack.o: stack.c $(deps)
        $(cc) -c stack.c 
    
  • 解决代码非常啰嗦

    cc = gcc
    prom = calc
    deps = calc.h
    obj = main.o getch.o getop.o stack.o
        
    $(prom): $(obj)
        $(cc) -o $(prom) $(obj)
    
    # %.o:%.c,这是一个模式规则,表示所有的.o目标都依赖于与它同名的.c文件(当然还有deps中列出的头文件)。
    %.o: %.c $(deps)
    	# 再来就是命令部分的<和@
    	# 其中<代表的是依赖关系表中的第一项(如果我们想引用的是整个关系表,那么就应该使用^),具体到我们这里就是%.c。
    	# 而$@代表的是当前语句的目标,即%.o。
    	# 这样一来,make命令就会自动将所有的.c源文件编译成同名的.o文件。不用我们一项一项去指定了。整个代码自然简洁了许多。
        $(cc) -c $< -o $@
    
  • 如果我们想增加自动清理编译结果的功能就可以为其定义一个带伪目标的规则

    cc = gcc
    prom = calc
    deps = calc.h
    obj = main.o getch.o getop.o stack.o
        
    $(prom): $(obj)
        $(cc) -o $(prom) $(obj)
    
    %.o: %.c $(deps)
        $(cc) -c $< -o $@
    
    # 当我们在终端中执行make clean命令时,它就会去删除该工程生成的所有编译文件。
    clean:
        rm -rf $(obj) $(prom)
    
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐