应用编程概念
应用编程(也可称为系统编程)与驱动编程、裸机编程有何不同?
-
系统调用;
-
何为库函数;
-
应用程序的 main()函数;
-
应用程序开发环境的介绍;
系统调用
定义
-
系统调用(system call)是 Linux 内核给应用层的应用编程接口(API),是 Linux 应用层到内核的入口;
-
系统调用是内核直接向应用层提供的应用编程接口,譬如 open、write、read、close 等
功能
通过系统调用,通过系统调用 API,应用层可以实现与内核的交互;
Linux 应用程序可以请求内核以自己的名义执行某些事情,譬如打开磁盘中的文件、读写文件、关闭文件以及控制其它硬件外设;
-
操作系统下有两种不同的状态:内核态和用户态;
-
应用程序运行在用户态、而内核则运行在内核态。
应用编程与裸机编程、驱动编程区别
裸机编程:无操作系统支持的编程环境称为裸机编程环境,例:单片机编程开发,直接在硬件运行程序,无操作系统支持;
Linux 驱动编程:是基于内核驱动框架开发驱动程序,驱动开发工程师通过调用 Linux 内核提供的接口完成设备驱动的注册,驱动程序负责底层硬件操作相关逻辑;
Linux 应用编程(系统编程):基于 Linux 操作系统的应用编程,在应用程序中通过调用系统调用 API 完成应用程序的功能和逻辑,应用程序运行于操作系统之上;
总结
-
LED 应用程序与 LED 驱动程序是分隔、分离的,它们单独编译,它们并不是整合在一起的;
-
应用程序运行在操作系统之上,有操作系统支持,应用程序处于用户态,而驱动程序处于内核态,与纯粹的裸机程序存在着质的区别;
-
Linux 应用开发与驱动开发是两个不同的方向;
库函数
会分辨调用的函数是系统调用还是库函数即可
发展历程
-
系统调用使用起来并不是很方便,提供比底层系统调用更为方便、更为好用、且更具有可移植性的调用接口;
-
C 库是应用层使用的一套函数库,Linux 下,常以动态(.so)库文件的形式提供,存放在根文件系统/lib 目录;
-
C 语言库函数构建于系统调用之上,库函数绝大部分由系统调用封装而来;
库函数和系统调用区别
-
编写应用程序除使用系统调用API接口,如 open、write、read、close之外,还使用库函数(C语言库函数);
-
有些库函数不调用任何系统调用,譬如一些字符串处理函数 strlen()、strcat()、memcpy()、memset();
-
有些库函数则会使用系统调用来完成实际操作,譬如库函数 fopen 内部调用了系统调用 open()来帮它打开文件、库函数 fread()利用系统调用 read()来完成读文件操作、fwrite()就利用了系统调用 write()来完成写文件操作;
实现者的角度来看,系统调用与库函数之间有根本的区别;
在实际应用编程中,直接把它们当做是 C 函数即可,知道调用的函数是系统调用还是库函数即可;
标准 C 语言函数库
Linux系统使用的C语言库为GNU C 语言函数库,作为标准 C 语言函数库;
( 也 叫 作 glibc , 其 网 址 为http://www.gnu.org/software/libc/)
glibc 版本
main 函数
Linux 应用程序中,main 函数也是作为应用程序的入口函数存在,main 函数的形参一般会有两种写法:
//示例代码 1.4.1 main 函数写法之无传参
int main(void)
{
/* 代码 */
}
//示例代码 1.4.2 main 函数写法之有传参
int main(int argc, char **argv)
{
/* 代码 */
}
argc 形参表示传入参数的个数,包括应用程序自身路径和程序名;
例:运行当前目录下的 hello 可执行文件,并且传入参数,如下所示:
./hello 112233
那么此时参数个数为 2,并且这些参数都是作为字符串的形式传递给 main 函数:
argv[0]等于"./hello"
argv[1]等于"112233"
有传参时 main 函数的写法并不只有这一种
开发环境推荐
我们的重点是学习应用编程!而不是学习 IDE 怎么用
Eclipse
vscode+ARM gcc(交叉编译工具)
个人:nodepid++、gcc
刚刚下了vscode,很烦这个弄几次了前期配置,之前也是;
c文件运行到底具体咋整好麻烦,幸好只是当编辑工具,后期再学一学吧;
我记得我成功过,好像改两个地方就行(前提是插件装好);
入门篇
Makefile
提高篇
进阶篇
cmake+vscode