嵌入式Linux C基本知识点总结

2024-09-08 05:08

本文主要是介绍嵌入式Linux C基本知识点总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习这块知识点有好久了,最近借一本书的框架来对基本的知识点进行总结,参考《嵌入式Linux上的C语言编程实践》进行总结记录之。

一、 基本开发环境
Linux下C语言开发环境

使用工具:程序生成工具GCC、程序调试工具GDB、工程管理工具为make和Makefile。
开发流程:使用编辑工具编写C语言源文件,然后编译生成机器代码为主的二进制可执行程序。
编译流程:C语言经过编译-汇编-链接,最终生成可执行程序格式。可执行程序包含两部分内容:程序头和程序主体。

嵌入式C语言的开发环境

程序的生成一般使用的是从x86到目标机的编译工具,程序的开发工具是运行于x86机器上的可执行程序,而是用开发工具生成的目标是以目标机器代码为实体的映像文件或者可执行程序,这个工程称为“交叉编译“。
和普通Linux环境下开发相比,更需要掌握一些几点:

* 库函数和系统调用 
* C语言高级应用
* C语言在嵌入式中的特殊语法(大小端,内存对齐等)
* 资源性能考虑(运行效率与存储空间)
二、 基本开发工具
Linux文本编辑工具VI

主要这个掌握VI三种模式的切换:命令模式、文本输入模式、和末行模式,以及VI编辑器的各种命令与操作。
学习VIM的使用,编辑vimrc文件,gedit ~./vimrc修改功能(比如显示行数、颜色加亮等)。

GCC程序开发工具

GCC能完成从C、C++、Objective-C等源文件向运行在特定CPU硬件上的目标代码的转换。对于通用计算机,一般使用GCC生成x86的可执行代码;对于嵌入式开发系统使用交叉编译的GCC,生成目标机可以运行的程序。
利用GCC/G++生成应用程序可以分为以下四步:
(1) 预处理:生成.i文件(预处理器cpp)
(2) 编译:将预处理后的文件转换为汇编语言,生成.s文件(编译器gcc)
(3) 汇编:由汇编代码生成目标代码,即机器代码,生成.o文件(汇编器as)
(4) 链接:由各个文件的目标代码,生成可执行程序(链接器ld)
这里涉及到另外一个知识点就是静态链接库和动态链接库的生成。

Make工程管理工具

Makefile是一个决定怎样编译工程的文本文件,有一定的书写规则。在工程更新的时候,使用GNU的make工具根据当前的Makefile对工程进行有选择的编译。
自动生成Makefile的工具有autoconf、automake。其他的类似工具比如cMake等。

GDB调试工具

在使用GDB之前,需要对源程序增加-g编译选项,此时编译出来的程序包含需要调试的信息,可以利用GDB进行调试。主要使用的命令是run(开始运行程序)、break(设置断点)、next(执行一行且不进入函数)、step(进入函数)、continue(继续程序运行)。
调试分为本地GDB调试和远程GDB调试,远程GDB更适合嵌入式系统的调试手段,使用个目标机端的GDB服务器和主机端的GDB调试器完成调试工作。

三、 基本学习函数
C语言标准库函数

(1) 标准输入/输出类函数 scanf printf putchar getchar putc getc puts ungetc等。
(2) 字符处理及转换函数
isdigit isalpha sprint strncat stncpy strlen strchr strstr strrev memset memmove memcpy memcpy等。
(3) 数学计算类函数 div acos/asin pow exp log ceil abs floor fmod等
(4) 数据结构和算法类函数 bsearch lfind lsearch qsort rand srand等
(5) 文件I/O操作类函数 fopen fclose fgetc fputs fseek fwrite ffush等
(6) 时间日期类函数 clock time gmttime mktime asctime 等
(7) 错误处理及工具函数 clearer feof perror errno assert setjmp longjmp等

Linux C中C语言的扩展库函数

(1) 文件I/O操作函数 open close read write lseek ioctl fcntl mmap dup create等
(2) 文件权限相关函数 access chown chmod utime umask link stat unlink等
(3) 用户操作函数 getgid/setgid getegid/setegid geteuid/seteuid 等
(4) 信号及进程类函数 kill raise alarm signal getpid fork sleep exec _exit等

四、 C语言高级编程

C语言运行过程中所使用的内存总体分为静态存储区和动态存储区两种。

静态存储区

C语言程序中静态数据存储区分为三类:只读存储器(RO)、已初始化读写数据区(RW Data)、未初始化读写存储器(BSS)。在程序运行初始化阶段开辟,在运行过程中不会变化(大小和位置固定),程序退出时被系统回收。

动态存储区

动态存储区分为堆和栈两类,在程序运行过程中动态分配(位置和大小动态变化),常见动态内存管理是栈内存从高地址向低地址分配,堆内存从低地址向高地址分配,一般来说堆使用链表实现,栈使用线性存储方式。
在C语言程序中,栈空间是由编译器管理的,在程序中可以体现栈空间使用的例子是参数的传递、返回值的使用以及自动变量空间。一般来说如果栈空间是从高地址向低地址增长的。

 参数入栈的顺序是:后面的参数在高地址处、前面的参数在低地址处。自动变量在栈空间,前面的变量放入栈的高地址,后面的自动变量放入栈的低地址。在函数退出时函数栈上的内容将被释放。因此,自动变量的地址不可以作为函数返回值

在C语言中,堆内存区域的分配和释放是通过调用库函数完成的,malloc、calloc、realloc、free4个库函数实现堆内存的分配、释放和管理。分配内存后要记得手动释放,否则其资源是不会被系统回收的,会造成内存泄漏。同时指针被释放后,指针应该被设置为NULL,避免野指针。
总的来说,栈内存是由编译器分配和释放,堆内存是由程序分配和释放。

函数指针的使用

函数指针是一个指向函数的指针(本质上是一个代码区的地址),而函数本身代表了算法,此时C语言的算法就可以通过指针的形式,像普通变量一样被使用。函数指针可以作为一个结构体的成员,也可也作为一个参数传递给其他的函数,同样也可以作为函数的返回值。

这篇关于嵌入式Linux C基本知识点总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147199

相关文章

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主