《最新嵌入式编程基础--2PPT课件.ppt》由会员分享,可在线阅读,更多相关《最新嵌入式编程基础--2PPT课件.ppt(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式编程基础嵌入式编程基础-2-2linux 平台下的应用程序类型nlinux 下的应用程序主要有两种特殊的文件来代表:可执行文件和脚本程序。n可执行文件是能够被计算机直接执行的程序,相当于win平台下exe文件。n脚本程序则是一组指令,这些指令将由另外一个程序(一般来说是shell 解释器)来执行,相当于dos下的bat文件。过程总结n这个命令会依次调用gcc的预编译器(cpp),汇编器(生成.s文件),编译器(生成.o文件)和链接器程序(ld)。n$gcc-E hello.c-o hello.cppn$gcc-x cpp-output-c hello.cpp-o hello.on$gcc
2、 hello.o-o hellon提示:命令$gcc O2-S hello.c 可以得到.s汇编文件。如果打算学习某个c语言程序所对应的汇编代码。可以参考csapp的第三章。诸如变量、数组、指针、控制流、子程序等。n当然也可以使用objdump d hello来查看汇编代码。诸如objdump等这些命令称为binutils,是非常强大的代码分析工具。比如addr2line,ar,as,gprof,ld,nm,objcopy,objdump,ranlib,size,strings,strip等。具体可以参考其man命令手册。文件I/O编程n文件描述符n文件I/O相关操作函数nopen函数nclo
3、se函数nlseek函数nread函数nwrite函数ndup和dup2函数nfcntl函数文件描述符n文件描述符定义 linux中每打开一个文件都有一个文件描述符与之对应。该描述符是一个非负整数。取值0对应标准输入,表示键盘1对应标准输出,一般屏幕2表示出错输出,一般到屏幕文件I/O操作函数-open、close函数nOpen函数可以打开一个文件,也可以创建并打开文件;调用方式:#include#include#include Int open(const char pathname,int flag)调用成功返回文件描述符,失败返回-1nClose函数-关闭一个文件,释放该文件上的记录锁调
4、用方法:#includeInt close(int filedes)返回成功0,出错-1文件I/O操作函数-read函数nRead函数用来读取打开文件的数据n用法:#include ssize_t read(int filedes,void*buf,size_t nbytes)n函数作用:filedes所代表的文件的当前位移量处读取nbytes个字节的数据到buf中,size_t是一个无符号整数,返回类型ssize_t是带符号整数。返回值:成功,返回读到的字节数,到文件结尾返回0;错返回-1文件I/O读写-程序示例nLED灯-GPIO实验程序文件I/O操作函数-dup函数n复制一个现存的文件描
5、述符用法:#include int dup(int filedes);int dup2(int filedes,int filedes2);返回值:成功,返回新的文件描述符;失败,返回-1文件I/O操作函数-lseeknLseek函数-每个打开的文件都关联着一个文件位移量,用来标识读或写文件时的起始位置,lseek重新设置文件位移量。进程控制开发n进程控制开发n进程的几个基本概念n进程相关几个函数n进程间通信n网络编程进程控制开发-基本概念 n进程几个基本概念n进程-程序的执行 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的
6、实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。n父子进程 由于linux是一个多用户的操作系统,在同一时间可能会有多个用户争夺系统资源,进程为了及时,及早的完成任务(得到系统资源)就创建了子进程来争夺系统资源。一旦子进程创建成功,父子进程就会一起从创建处继续执行,两个进程相互争夺系统资源。进程开发控制-创建进程函数nfork和vfork函数作用:创建进程特点:调用一次,返回两次;子进程中执行返回值为0,父进程中执行,返回值为子进程ID。调用方法:#include#include Pid_t fork(void);Pid_t vfork(void);n#
7、includen#includen#includenInt main(void)n pid_t pid;n if(pid=fork()0)n err_sys(“fork errorn”);nElsen if(pid=0)n printf(“this is process of child!n”);nElsen printf(“parent process pid=%d!n”,getpid();进程控制开发-退出进程函数nExit函数和_exit函数 作用:停止进程的执行,进程停下剩下的所有操作,清楚进程中包括PCB在内的各种数据结构,并终止本进程的运行。区别:exit()函数退出前会保证缓冲区
8、的数据不丢失 _exit()函数退出前丢失缓冲区数据进程控制开发-等待函数nWait和waitpid函数作用:等待子进程终止函数区别:waitpid与wait的作用相同,waitpid多了两个参数调用方法:#include#includepid_t wait(int*statloc)pid_t waitpid(pid_t pid,int*staloc,int option);进程控制开发-竞态条件n竞态条件 当多个进程都对某个共享数据进行处理,但最后的结果取决于进程的运行顺序,则发生竞态条件(race condition)。进程控制开发nExec函数作用:通过系统调用函数,可以根据指定的文件名
9、找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。进程间通信n管道 管道pipe用于亲缘进程间的通信,fd0管道读,fd1管道写;半双工通信,可看成一个文件,只是只存在于内存中,可以通过read、write进行读写;每次写的内容都放在管道缓冲区末尾,读取都从缓冲区头部;n有名管道FIFO 管道有名,两个不相关的进程也可以通过它交换数据。原型:#include#includeInt mkfifo(const char*pathname,mode_t mode);n消息队列n创建或连接消息队列n int msgget(key_t key int msgfl
10、g);nKey的产生n key_t ftok(const char*path,int id);n发送消息nint msgsnd(int msqid,const void*msgp,size_t msgsz,int msgflg);n接收消息nint msgrcv(int msqid,void*msqp,size_t msgsz,long msgtyp,int msgflg);n销毁消息队列nint msgctl(int msqid,int cmd,struct msqid_ds*buf);n信号量 信号量是一种linux资源,它可以让不同的进程间进行相互通信,因此它也被看做成IPC集中的一员。
11、信号量的作用是在两个或多个进程访问公共资源集时保持同步n表示方法:struct semaphore 该结构包含一个指向等待队列的指针和一个整数计数器n信号量相关函数创建信号量 int semget(key_t key,int nsems,int semflg);信号量初始化 int semctl(int semid,int semnum,int cmd,)n共享内存nMmap()系统调用n使得进程之间通过映射一个普通文件来实现共享内存。普通文件被映射到进程地址空间以后,进程可以像访问普通内存一样对文件进行访问n系统V共享内存n系统V共享内存和mmap()的实现不太一样。系统V的共享内存只存在于
12、内存中,所以当一个进程终止时,需要继续保留着共享内存,一旦共享内存被删除,就再也找不到了,但是共享内存需要被注销时,也有编程者来实现。nMmap()函数代码:#include#includeVoid*mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset);n系统V的共享内存n创建共享内存 要创建共享内存,可使用shmget函数 调用方法:int shmget(key_t key,int size,int shmflg)n使用共享内存 创建内存,有了共享内存ID,然后进行映射,映射到具体的地址空间,利用shmat
13、函数网络编程n网络编程的基本概念nTCP/IP协议n常用的网络编程函数网络编程基本概念n客户端与服务器端客户端:客户程序,这个方法通过不同的途径应用于很多不同类型的应用程序,最常见就是目前在因特网上用的网页。服务器:被动的角色(从)。等待来自客户端的要求。处理要求并传回结果。先启动服务器端,等待客户端的程序运行并建立连接。服务器端的程序负责监听,等待有一个客户端的程序发来请求。TCP/IP协议n协议模型nSocket编程 根据系统实现了TCP/UDP或者IP层的接口,调用该接口进行网络编程网络编程n网络编程n服务器编程:创建套接扣绑定套接口设置套接口为监听模式,进入被动接受连接请求状态接受请求,建立连接读/写数据终止连接n客户端程序:创建套接口与远程服务程序连接读/写数据终止连接n创建套接口socket函数n绑定套接口调用bind函数n建立连接调用connect函数n监听调用listen函数n接受请求调用accept函数n关闭套接字n字节转换函数ngetsockname和getpeername函数作业n见附录文件 作业-嵌入式编程.doc