嵌入式 Linux 编程

嵌入式应用开发

嵌入式软件开发流程

什么是交叉编译

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

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

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

常见通信模式

  • 串口通讯

    • 特点及应用场合

      • 驱动实现最简单
      • 传输速度慢,距离短,不适合大数据量、长距离数据传输
      • 需要在宿主机、目标机两端均提供驱动
      • 常用于宿主机-目标机的字符流通讯
  • 网络通讯
    • 特点及应用场合

      • 驱动实现相对复杂,一般采用精简的网络通讯协议,如 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调试器

步骤示例

  • 编写源代码

    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.cgcc -o calc main.c getch.c getop.c stack.c
    
  • 解决一下编写效率方面的问题

     cc = gccprom = calcsrc = 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.cgetch.o: getch.c $(deps)$(cc) -c getch.cgetop.o: getop.c $(deps)$(cc) -c getop.cstack.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)
    

嵌入式 Linux 编程相关推荐

  1. Linux学习之嵌入式Linux编程文件IO(C语言版)

    Linux学习之嵌入式Linux编程文件IO(C语言版) 一.文件IO常用函数 1.open 2.write 3.read 示例代码: #include <sys/types.h> #in ...

  2. arm linux udp 自发自收_嵌入式linux编程开发必备知识

    嵌入式linux是嵌入式开发必不可少的一份子,在科技高速发展的今天,嵌入式已然已经成为了最热门的技术之一了.对于想要学习好嵌入式的学员来说,现在学习好linux是很有必要的,因为这个是嵌入式的核心.那 ...

  3. linux 串口 字符 间隔,嵌入式linux编程过成中模块从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数(提取特定字符串+字符串转16进制)...

    嵌入式linux编程过成中用到zigbee模块 zigbee从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数 (提取特定字符串+字符串转16进制) #include #incl ...

  4. linux QT 结束当前进程_嵌入式linux编程开发必备知识

    嵌入式linux是嵌入式开发必不可少的一份子,在科技高速发展的今天,嵌入式已然已经成为了最热门的技术之一了.对于想要学习好嵌入式的学员来说,现在学习好linux是很有必要的,因为这个是嵌入式的核心.那 ...

  5. 嵌入式linux编程开发必备知识

    嵌入式linux是嵌入式开发必不可少的一份子,在科技高速发展的今天,嵌入式已然已经成为了最热门的技术之一了.对于想要学习好嵌入式的学员来说,现在学习好linux是很有必要的,因为这个是嵌入式的核心.那 ...

  6. 嵌入式linux编程过成中模块从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数(提取特定字符串+字符串转16进制)

    嵌入式linux编程过成中用到zigbee模块 zigbee从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数 (提取特定字符串+字符串转16进制) #include<st ...

  7. 嵌入式linux编程,嵌入式Linux学习笔记 - 嵌入式Linux基础知识和开发环境的构建_Linux编程_Linux公社-Linux系统门户网站...

    注:所有内容基于友善之臂Mini2440开发板 一.嵌入式Linux开发环境的构建 嵌入式开发一般分为三个步骤: 1.编译bootloader,烧到开发板 2.编译嵌入式Linux内核,烧到开发板 3 ...

  8. 嵌入式Linux编程基础ppt,嵌入式LinuxC高级编程.ppt

    <嵌入式LinuxC高级编程.ppt>由会员分享,可在线阅读,更多相关<嵌入式LinuxC高级编程.ppt(45页珍藏版)>请在装配图网上搜索. 1.嵌入式Linux C高级编 ...

  9. uniaccess进程无法结束 拒绝访问_嵌入式Linux编程——程序员小白不懂的进程、信号量、并发、互斥...

    所有学嵌入式Linux系统的看过来了,以下内容是每一位想学习Linux嵌入式系统想要了解的内容,真的很想要分享给大家! 本文分享的内容主要如下几个方面: 3.1 并发的原理 3.1.1 一个简单的例子 ...

最新文章

  1. laravel5 MAC is invalid
  2. 转eclipse如何修改dynamic web module version .
  3. java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息...
  4. SQL查询交集、并集、差集
  5. Java多线程之并发协作生产者消费者设计模式
  6. php for循环 循环奇数,php – Foreach,每个n项的特殊处理(奇数,甚至例如)
  7. 具有NetBeans,WebLogic 12c,JPA和MySQL数据源的Arquillian
  8. dubbo 消费者也要暴露端口吗_一文详细解读 Dubbo 中的 http 协议
  9. mysql 锁定表_MySQL表锁定
  10. log4net进阶手札(四):保存自定义对象到oracle
  11. win32收不到F10按键消息解决的方法
  12. 服装设计与工程_百度百科
  13. 解决VS下载慢的问题
  14. 你真的了解LinkedBlockingQueue的put,add和offer的区别吗
  15. GIF图像格式简介(87a和89a)(C语言生成GIF图像)
  16. 如何利用光驱位给老旧笔记本电脑安装固态硬盘
  17. 算法 图8 How Long Does It Take
  18. 米家接入HomeKit系列五:Sir控制米家设备
  19. windows隐藏CMD窗口,使jar程序在后台执行
  20. 从破解虫脑到攻克人脑:一条“永生之路”的新赛道?

热门文章

  1. ubuntu下ffmpeg图片转视频
  2. jetson 板卡功率测试
  3. 电脑休眠、睡眠、待机的区别
  4. 设计模式学习笔记总结
  5. Java8新特性1:lambda表达式入门--由浅入深,从单发步枪迈向自动步枪
  6. SpringBoot开发微信公众号_回复文本信息功能
  7. 常见UNIXLINUX系统
  8. Android App Widget中如何调用RemoteView中的函数
  9. python象棋游戏代码_python学员作品-象棋游戏
  10. 【Web UI自动化测试】Web UI自动化测试之日志收集篇(全网最全)