嵌入式Linux应用开发学习(一)—嵌入式编程基本知识


前言

网上对于嵌入式发展的介绍,以及ARM处理器的介绍等都已经有很多了,所以这里也不进行更多的介绍了。同时对于环境的搭建,后期单独发一篇博客进行操作的展示。本文主要是从基础的第一节开始,对交叉编译工具链和gcc的基本概念进行讲解。
参考书籍《嵌入式Linux应用开发》韦东山著


一、交叉编译工具链的配置

因为我们最终是在开发板上运行我们的程序,而我们的PC用的是x86架构(CISC,复杂指令集架构),而我们的开发板是基于(RISC, 精简指令集架构)。所以我们直接在虚拟机上通过

gcc -o xxx  xxxx.c  

生成的可执行文件在开发板上是无法直接运行的。所以我们需要配置交叉编译工具链,生成适用于ARM架构的可执行文件。

具体的配置方法:
下载百问网的任意一块板子的开发资料
http://download.100ask.net/boards/St/100ask_stm32mp157_pro/index.html
其中有这样的一个文件
在这里插入图片描述打开后,里面对应有一个开发板完全手册
在这里插入图片描述打开,找到第8章就是对应的配置方法
在这里插入图片描述
特别注意:在最后导入这个环境变量的时候,一定要将这个用户名更改一下,他的是book,你要改为你的用户名,否则后序进行检测没有效果
在这里插入图片描述对于arm-buildroot-linux-gunueabihf-gcc的选项和使用下面我们将进行介绍。

二、编译器的使用

1.gcc编译的过程:

一个文件要经过预处理、编译、汇编、链接4个步骤才能变成一个可执行文件。
在这里插入图片描述这是我写的一个程序hello.c
在这里插入图片描述运行结果:
在这里插入图片描述希望你能对这个main的参数有一个简单的理解。

你可以使用指令来查看生成可执行文件的整个过程

gcc -o hello hello.c -v  

在这里插入图片描述这里面有很多的配置信息,你可以参考下图去验证这个过程
在这里插入图片描述

2.gcc编译选项

在只知道了我们编译的整个过程后,就会有疑问了,为什么我们看不见这个过程中生成的xxx.i,xxx.S,xxx.o文件呢?

因为我们平时使用的gcc -o xxx xxx.c指令-c这一个选项就把整个预处理,编译,汇编,链接给都实现了,那么期间生成的临时文件自然就没必要留着只需要保存最后的可执行文件。

所以我们如果要查看这个过程中的文件该怎么办呢?

  • 预处理xxx.i文件的生成
    预处理的作用:预处理的作用是为了展开我们的宏,以及导入我们的库文件比如我们的<stdio.h> 和定义的MAX,MIN。以及优化掉没有实际用的代码(如果你就是要保留,不允许编译器优化,可以使用volatile关键字)hello.i文件内容见图三
    使用指令如下

图一

gcc -E -o hello.i hello.c

图二
在这里插入图片描述图三
在这里插入图片描述上面部分就是头文件的引入,期间的宏定义因为我没有使用,所以编译器就给我优化掉了,如果我使用了,他就会把MAX,MIN展开为20和10.

  • 编译 xxx.S文件的生成
    编译的作用:编译的作用主要是对编译的代码中有语法错误,进行检测。同时将文件生成一个汇编代码文件。(见图三)
    使用指令(图一)

图一

gcc -S -o hello.s hello.i

图二
在这里插入图片描述图三
在这里插入图片描述里面都是一些汇编指令,特别注意,语法错误是在编译过程中,不是预处理。预处理只是进行优化。

  • 汇编
    汇编的功能:汇编的功能就是将.S中的汇编码转换为机器读的机器码。(见图三)
    使用指令(见图一)
    图一
gcc -c -o hello.o hello.S

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

  • 链接
    链接的作用:链接的作用就是在你执行你的文件的时候,还需要使用到其他的文件的函数。那么就需要将另一个文件和自己写的这个文件链接起来,这样编译器才知道你这个函数是怎么用的,这个程序才能正确的执行()
    使用指令(图一)
    图一
gcc -o test hello.o xxx.o

这里就不展示了,后面有时间再回来给大家修改验证
链接的时候,又要分链接的是静态库,还是动态库
静态库:静态库就是在你程序执行的时候需要用,完整的把这个库文件代码考入到你的可执行文件中。如果你的这个库被多次调用相应的你的文件占用的内存也就越多
动态库:动态库就是在你程序执行的时候,系统动态自动加载到内存,不用完整拷贝,所以很节省内存。

制作和使用静态库的方法:
使用指令

gcc -c -o main.o  main.c
gcc -c -o sub.o   sub.c
ar  crs  libsub.a  sub.o  sub2.o  sub3.o(可以使用多个.o生成静态库)
gcc  -o  test  main.o  libsub.a  (如果.a不在当前目录下,需要指定它的绝对或相对路径)

生成的是一个xxx.a文件

制作和使用动态库的方法

gcc -c -o main.o  main.c
gcc -c -o sub.o   sub.c
gcc -shared  -o libsub.so  sub.o  sub2.o  sub3.o(可以使用多个.o生成动态库)
gcc -o test main.o  -lsub  -L /libsub.so/所在目录/

生成的是一个xxx.so文件

  • 头文件的介绍
    在我们编写程序的时候,常常会引入头文件,比如
    #include<stdio.h>
    #include “xxx.h”

这里的 “xxx.h"中的” "表示的是该文件在当前目录下
在这里插入图片描述这个的<stdio.h>的<>表示的是在系统目录下

在这里插入图片描述
通常我们也可以使用一些选项来指定我们的头文件路径,同理我们链接时的库文件也是一个道理。
方法一:通过指令 -L选项来指定链接的库文件的目录位置,-l选项来指定哪一个库文件
- I来指定头文件的位置。
在这里插入图片描述

方法二:你可以将你需要链接的文件,或者头文件放到上面的这个系统目录中
在这里插入图片描述

  • 很有用的选项
gcc -E main.c   // 查看预处理结果,比如头文件是哪个
gcc -E -dM main.c  > 1.txt  // 把所有的宏展开,存在1.txt里
gcc -Wp,-MD,abc.dep -c -o main.o main.c  // 生成依赖文件abc.dep,后面Makefile会用

echo 'main(){}'| gcc -E -v -  // 它会列出头文件目录、库目录(LIBRARY_PATH)

总结

补充选项

  • Wall
    这个选项基本打开了所有需要注意的警告信息,比如没有指定类型的声明、在声明之前就使用的函数、局部变量除了声明就没再使用等。
    这个警告虽然对程序没有坏的影响,但是有些警告需要加以关注,比如类型匹配的警告等。

  • -g调试
    以操作系统的本地格式(stabs,COFF,XCOFF,或DWARF)产生调试信息,GDB能够使用这些调试信息。在大多数使用stabs格式的系统上,-g'选项加入只有GDB才使用的额外调试信息。可以使用下面的选项来生成额外的信息:-gstabs+’,-gstabs',-gxcoff+’,-gxcoff',-gdwarf+‘或`-gdwarf’,具体用法请读者参考GCC手册。

  • -O或-O1 优化选项
    优化:对于大函数,优化编译的过程将占用稍微多的时间和相当大的内存。不使用-O'或-O1’选项的目的是减少编译的开销,使编译结果能够调试、语句是独立的:如果在两条语句之间用断点中止程序,可以对任何变量重新赋值,或者在函数体内把程序计数器指到其他语句,以及从源程序中精确地获取你所期待的结果。
    不使用-O'或-O1’选项时,只有声明了register的变量才分配使用寄存器。
    使用了-O'或-O1’选项,编译器会试图减少目标码的大小和执行时间。如果指定了-O'或-O1’选项,,-fthread-jumps'和-fdefer-pop’选项将被打开。在有delay slot的机器上,-fdelayed-branch'选项将被打开。在即使没有帧指针 (frame pointer)也支持调试的机器上,-fomit-frame-pointer’选项将被打开。某些机器上还可能会打开其他选项。
    -O2
    多优化一些。除了涉及空间和速度交换的优化选项,执行几乎所有的优化工作。例如不进行循环展开(loop unrolling)和函数内嵌(inlining)。和-O'或-O1’选项比较,这个选项既增加了编译时间,也提高了生成代码的运行效果。
    -O3
    优化的更多。除了打开-O2所做的一切,它还打开了-finline-functions选项
    -O0
    不优化

希望上面的内容能对你有多帮助!!!

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
嵌入Linux应用开发学习路线可以按照以下方进行: 1. 先从学习Linux基础知识开始。掌握Linux系统的基本概念,了解Linux的文件系统、进程和线程管理、信号处理等。可以通过读相关书籍或者参加在线课程来学习。 2. 掌握Linux下的C/C++编程。了解Linux下的编程环境和工具,学习使用Linux下的开发工具链进行编译和调试。可以通过编写一些简单的命令行应用程序来熟悉Linux下的编程环境。 3. 学习Linux应用开发框架。了解Linux下常用的应用开发框架,例如Qt和GTK+,学习使用这些框架进行图形界面的应用开发。可以通过参考相关的教程和示例代码来学习。 4. 深入学习Linux的系统编程接口。了解Linux的系统调用接口,学习如何使用系统调用进行文件操作、进程管理、网络通信等。可以通过阅读Linux的相关文档和参考书籍来学习。 5. 学习嵌入Linux的设备驱动开发。了解Linux下的设备驱动框架,学习如何编写设备驱动程序,包括字符设备驱动、块设备驱动和网络设备驱动等。可以通过参考Linux内核的源代码和相关的文档来学习。 总的来说,嵌入Linux应用开发学习路线是先掌握Linux基础知识,然后学习Linux应用开发框架,最后深入学习设备驱动开发。这样的学习路线能够帮助你逐步掌握嵌入Linux应用开发所需的技能和知识。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [嵌入Linux入门指南(一)——学习路线篇](https://blog.csdn.net/weixin_51627076/article/details/122588888)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jacky~~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值