嵌入式编程基础_第1页
嵌入式编程基础_第2页
嵌入式编程基础_第3页
嵌入式编程基础_第4页
嵌入式编程基础_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式编程基础嵌入式编程基础嵌入式编程基础linux 平台下的应用程序类型nlinux 下的应用程序主要有两种特殊的文件来代表:可执行文件和脚本程序。n可执行文件是能够被计算机直接执行的程序,相当于win平台下exe文件。n脚本程序则是一组指令,这些指令将由另外一个程序(一般来说是shell 解释器)来执行,相当于dos下的bat文件。嵌入式编程基础Shell如何解释执行命令n内置命令-直接执行n实例程序(用户给出路径的)-按照用户给出的路径执行n实例程序(用户未给出路径)-按照PATH变量给出的路径执行嵌入式编程基础n将被搜索的那些子目录都被保存到一个名字为PATH的shell变量里面,和d

2、os下的情况差不多。PATH 是由系统管理员预先配置好了的,通常包括/bin,/usr/bin,/usr/local/bin,你可以使用echo$PATH来显示。如果你是使用的root登陆系统,则还会多包括/sbin,/usr/sbin目录。嵌入式编程基础应用程序开发流程n编写应用程序(vi编辑器)n编译应用程序(编译器)n调试运行应用程序(调试器)n执行(直接输入程序命令运行)嵌入式编程基础应用程序开发流程(实例)应用程序开发流程(实例)n为了快速获得对linux 平台下应用程序设计的体验,我们首先编写经典的hello world程序。 下面的代码来自 c programming langu

3、age第一章 #include main() printf(hello, worldn); 嵌入式编程基础利用vi进行编辑n首先,进入linux的控制台界面。然后,在某个目录建立一个空的c程序文件,比如利用touch /home/zhaohui/linuxApp/hello.c命令 然后cd到当前目录,调用vi编辑器对这个空文件进行编辑,输入这个程序的源代码,(利用vihello.c命令,进入vi编辑器,然后进入vi 的编辑状态,然后输入程序,然后进入vi的命令状态,进行源程序的保存和vi 的退出,回到shell 提示符。)n-hello.c-n#include nint main()nnpr

4、intf(Hello, Linux programmingnworld!n);nreturn 0;nn-嵌入式编程基础gcc 编译和程序运行n然后在当前目录输入编译这个程序的命令,在程序没有错误的情况下,会在当前目录得到一个可执行文件hello。n程序的运行如图所示。n注意:如果你只是输入 gcc hello.c则生成的可执行文件的名字是a.out嵌入式编程基础过程总结n这个命令会依次调用gcc的预编译器(cpp),汇编器(生成.s文件),编译器(生成.o文件)和链接器程序(ld)。n$ gcc -E hello.c -o hello.cppn$ gcc -x cpp-output -c he

5、llo.cpp -o hello.on$ gcc 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命令手册。嵌入式编程基础文件

6、I/O编程n文件描述符n文件I/O相关操作函数nopen函数nclose函数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

7、 flag) 调用成功返回文件描述符,失败返回-1nClose函数-关闭一个文件,释放该文件上的记录锁调用方法:#includeInt close (int )返回成功0,出错-1嵌入式编程基础文件I/O操作函数-read函数nRead函数用来读取打开文件的数据n用法: #include ssize_t read (int * buf,size_t nbytes)n函数作用: 所代表的文件的当前位移量处读取nbytes个字节的数据到buf中,size_t是一个无符号整数,返回类型ssize_t是带符号整数。 返回值:成功,返回读到的字节数,到文件结尾返回0;错返回-1嵌入式编程基础文件I/O读

8、写-程序示例nLED灯-GPIO实验程序嵌入式编程基础文件I/O操作函数-dup函数n复制一个现存的文件描述符用法:#include int dup(int );int dup2(int );返回值:成功,返回新的文件描述符;失败,返回-1嵌入式编程基础文件I/O操作函数-lseeknLseek函数-每个打开的文件都关联着一个文件位移量,用来标识读或写文件时的起始位置,lseek重新设置文件位移量。嵌入式编程基础进程控制开发n进程控制开发n进程的几个基本概念n进程相关几个函数n进程间通信n网络编程嵌入式编程基础进程控制开发-基本概念 n进程几个基本概念n进程-程序的执行 进程是一个具有独立功能

9、的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。n父子进程 由于linux是一个多用户的操作系统,在同一时间可能会有多个用户争夺系统资源,进程为了及时,及早的完成任务(得到系统资源)就创建了子进程来争夺系统资源。一旦子进程创建成功,父子进程就会一起从创建处继续执行,两个进程相互争夺系统资源。嵌入式编程基础进程开发控制-创建进程函数nfork和vfork函数作用:创建进程特点:调用一次,返回两次;子进程中执行返回值为0,父进程中执行,返回值为子进程ID。调用方法:

10、#include #include Pid_t fork(void);Pid_t vfork(void);嵌入式编程基础n#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函数 作用

11、:停止进程的执行,进程停下剩下的所有操作,清楚进程中包括PCB在内的各种数据结构,并终止本进程的运行。 区别: exit()函数退出前会保证缓冲区的数据不丢失 _exit()函数退出前丢失缓冲区数据嵌入式编程基础进程控制开发-等待函数nWait和waitpid函数作用:等待子进程终止函数区别:waitpid与wait的作用相同,waitpid多了两个参数调用方法:#include#includepid_t wait(int* statloc)pid_t waitpid(pid_t pid, int* staloc, int option);嵌入式编程基础进程控制开发-竞态条件n竞态条件 当多个

12、进程都对某个共享数据进行处理,但最后的结果取决于进程的运行顺序,则发生竞态条件(race condition)。嵌入式编程基础进程控制开发nExec函数作用:通过系统调用函数,可以根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。嵌入式编程基础进程间通信n管道 管道pipe用于亲缘进程间的通信,fd0管道读,fd1管道写;半双工通信,可看成一个文件,只是只存在于内存中,可以通过read、write进行读写;每次写的内容都放在管道缓冲区末尾,读取都从缓冲区头部;嵌入式编程基础n有名管道FIFO 管道有名,两个不相关的进程也可以通过它交换数

13、据。原型:#include#includeInt mkfifo(const char* pathname, mode_t mode);嵌入式编程基础n消息队列n创建或连接消息队列n int msgget(key_t key int msgflg);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 msgty

14、p,int msgflg);n销毁消息队列nint msgctl(int msqid,int cmd,struct msqid_ds *buf);嵌入式编程基础n信号量 信号量是一种linux资源,它可以让不同的进程间进行相互通信,因此它也被看做成IPC集中的一员。信号量的作用是在两个或多个进程访问公共资源集时保持同步n表示方法:struct semaphore 该结构包含一个指向等待队列的指针和一个整数计数器嵌入式编程基础n信号量相关函数创建信号量 int semget(key_t key,int nsems,int semflg);信号量初始化 int semctl(int semid,i

15、nt semnum,int cmd,)嵌入式编程基础n共享内存nMmap()系统调用n使得进程之间通过映射一个普通文件来实现共享内存。普通文件被映射到进程地址空间以后,进程可以像访问普通内存一样对文件进行访问n系统V共享内存n系统V共享内存和mmap()的实现不太一样。系统V的共享内存只存在于内存中,所以当一个进程终止时,需要继续保留着共享内存,一旦共享内存被删除,就再也找不到了,但是共享内存需要被注销时,也有编程者来实现。嵌入式编程基础nMmap()函数代码:#include#includeVoid* mmap(void* start, size_t length, int prot, in

16、t flags, int fd, off_t offset);嵌入式编程基础n系统V的共享内存n创建共享内存 要创建共享内存,可使用shmget函数 调用方法:int shmget(key_t key, int size, int shmflg)n使用共享内存 创建内存,有了共享内存ID,然后进行映射,映射到具体的地址空间,利用shmat函数嵌入式编程基础网络编程n网络编程的基本概念nTCP/IP协议n常用的网络编程函数嵌入式编程基础网络编程基本概念n客户端与服务器端客户端:客户程序,这个方法通过不同的途径应用于很多不同类型的应用程序,最常见就是目前在因特网上用的网页。 服务器:被动的角色(从)。 等待来自客户端的要求。 处理要求并传回结果。 先启动服务器端,等待客户端的程序运行并建立连接。服务器端的程序负责监听,等待有一个客户端的程序发来请求。嵌入式编程基础TCP/IP协议n协议模型nSocket编程 根据系统实现了TCP/UDP或者IP层的接口,调用该接口进行网络

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论