zoukankan      html  css  js  c++  java
  • 嵌入式Linux基础知识

    一、构建嵌入式开发环境
    1、编译bootloader并烧写到板子中---uboot, 可以自己定制bootloader and logo
    2、编译file system 并烧写--内嵌APP
    3、编译linux kernel----定制drivers and logo
    4、编译APP
    5、编译file system 备份---内嵌APP
    6、安装交叉编译工具
    7、安装调试工具

    二、嵌入式编程基础知识

    一般的c/c++文件要变成可执行文件需要经过预处理、编译、汇编、和连接等4个步骤
    1)预处理
    以#开头的为预处理命令,如包含命令#include、宏定义#define、条件编译#if #ifdef,预处理的目的是将所有include文件插入到源文件中、将宏定义展开、
    条件编译成立的选择使用的代码,最后将所有代码输入到.i文件中等待处理,预处理需要用到arm-linux-cpp工具

    2)编译
    把所有c/c++代码(上面的.i文件)翻译成汇编代码,用到工具为ccl

    3)汇编
    将前面的汇编代码翻译成一定格式的机器码,Linux上一般为ELF目标文件,用到工具为arm-linux-as

    4)连接
    连接就是将上面生成的obj文件和系统库的obj文件、库文件连接起来,最终生成在平台上可执行文件,用到工具为arm-linux-ld

    arm-linux-gcc选项
    1)-c
    预处理、编译和汇编源文件,不做连接,编译器生成obj文件,gcc通过.o替换.c .i .s等
    2)-S
    编译后即停止,不进行汇编,gcc用.s替换.c .i等
    3)-E
    预处理后停止,不进行编译,预处理代码到标准输出
    4)-o file
    指定输出file文件
    5)-v
    显示gcc版本,编译细节
    6)-Wall
    打开警告选项
    7)-g
    打开调试选项,可用gdb调试
    8)-llibrary
    连接名为library的库文件,真正名字为liblibrary.a
    9)-static
    静态编译
    10)-shared
    生成共享obj文件
    11)-Idir
    指定dir为头文件搜索目录
    12)-Ldir.
    指定dir为库文件搜索目录

    arm-linux-ld选项
    1)-T
    指定代码段(-Ttext),数据段(-Tdate),bss段(-Tbss)的起始地址
    使用连接脚本(-Txxx.lds)

    例:
    SECTIONS {
    . = 0×30000000;
    .text : { *(.text)}
    .rodata ALIGN(4) : { *(.rodate) }
    .data ALIGN(4) : { *(.data) }
    .bss ALIGN(4) : { *(.bss) *(COMMON) }
    }

    第二行表示当前运行地址为0×30000000,第三行定义了.text段,内容为*(.text),表示所有输入文件的代码段,起始运行地址为0×30000000
    第四行定义了.rodata段,代码紧挨.text,ALIGN(4)表示起始地址4字节对齐如果.text为0×30000000-0x300003f1,则.rodata地址为0x300003f4

    arm-linux-objcopy选项,此命令用来复制一个目标文件内容到另一个文件中,可进行格式转换
    例:将ELF格式转换成二进制文件
    arm-linux-objcopy -O binary -S elf_file bin_file

    arm-linux-objdump选项, 常用来查看反汇编代码
    ELF转反汇编
    arm-linux-objdump -D elf_file > dis_file
    二进制转反汇编
    arm-linux-objdump -D -b binary -m arm bin_file > dis_file

    三、 Makefile 编译文件------以后补充

    Makefile介绍
    1)格式:
    目标 : 依赖
    <tab>命令
    例:
    hello: hello.c
    gcc -o hello hello.c
    clean:
    rm -f hello

    2)赋值方法
    延时变量:使用时才展开
    var = value
    var ?= value(变量未定义才有效,即定义第一次出现的延时变量)
    立即变量:定义时值就确定
    var := value
    对于 var += value 右边变量如果前面使用:=定义为立即变量,则它是立即变量,否则为延时变量
    3)Makefile常用函数
    函数调用以“$”开头,以圆括号或花括号把函数名和参数括起。感觉很像一个变量,是不是?函数中的参数可以使用变量,
    为了风格的统一,函数和变量的括号

  • 相关阅读:
    IOS 11 通讯录手机号「隐形字符」的 Bug
    本地添加const参数 防止短信接口恶意调用
    javascript阿拉伯数字 转 汉字中文数字
    js去掉数组的空字符串
    Chrome 清除某个特定网站下的缓存
    vue-cli中的babel配置文件.babelrc详解
    提交到github报错Please tell me who you are
    跨域问题
    js单线程、js任务队列、异步操作
    Java 异常
  • 原文地址:https://www.cnblogs.com/wenrenhua08/p/3934276.html
Copyright © 2011-2022 走看看