嵌入式程序设计课程总结
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
父进程回收子进程需要调用wait与waitpid
exit()与_exit()的区别ห้องสมุดไป่ตู้
exit()函数在终止当前进程前要检查该进程打开过哪些文件,把文件缓 冲区的内容写回文件,就是所谓的“清理I/O缓冲”。
5.1.1 系统调用
系统调用是指操作系统提供给用户程序调用的一组“特殊”接 口,用户程序可以通过这组“特殊”接口获得操作系统内核提 供的服务。例如用户可以通过进程控制相关的系统调用来创建 进程、实现进程之间的通信等。
2.模式规则
——模式规则是用来定义相同处理规则的多个文件的。它不 同于隐式规则,隐式规则仅仅能够用make默认的变量来进行操 作,而模式规则还能引入用户自定义变量,为多个文件建立相 同的规则,从而简化makefile的编写。
数据段 BSS段 代码段 栈 堆
一个由C语言的程序占用的内存分为以下几个部分。
8
3.2.2堆和栈的区别
申请大小的限制
堆是向高地址扩展的数据结构,是不连续的内存区域;栈是向低 地址扩展的数据结构,是一块连续的内存的区域。
申请速度的限制
堆是由malloc()等语句分配的内存,一般速度比较慢,而且容易产 生内存碎片,不过用起来很方便。栈由系统自动分配,速度较快, 但程序员一般无法控制。
上机时进行的操作
Make
能解释规则含义
make工程管理器就是个自动编译管理器,能够根据文件时间戳自 动发现更新过的文件而减少编译的工作量,同时它通过读入 Makefile文件的内容来执行大量的编译工作。
Makefile 规则
1. 隐式规则
——隐式规则能够告诉make怎样使用传统的规则完成任务, 这样当用户使用它们时就不必详细指定编译的具体细节,而只 需把目标文件列出即可。Make会自动搜索隐式规则目录来确定 如何生成目标文件。
《嵌入式系统程序设 计》 课程总结
主要内容(课堂)
嵌入式系统基础 嵌入式Linux C程序开发 嵌入式Linux C语言基础 嵌入式Linux开发环境 嵌入式Linux文件I/O编程
多任务编程
多进程/多线程 进程间通信
网络编程 设备驱动开发 QT图形编程
Vi
Gcc
Gcc编译流程
——预处理、编译、汇编、链接。
常用选项
-I dir 在头文件的搜索路径列表中添加 dir 目录 gcc hello.c -I /home/david/src/inc -o hello
库相关选项
-L dir 在库文件的搜索路径列表中添加 dir 目录
Gdb
嵌入式系统概念
——被嵌入到电子设备中的专用计算系统。
交叉编译
——在一个平台上生成可以在另一个平台上执行的代码。
交叉调试
——将嵌入式程序在宿主机和目标机之间进行的调试。
Bootloader作用
——初始化硬件设备,建立内存空间的映射表,从而建 立适当的系统软硬件环境,为最终调用操作系统内核做好 准备。
文件描述符是一个非负的整数,它是一个索引值,并指向在内核中每 个进程打开文件的记录表。
open()/read()/write()/close()与
-基于文件描述符
fopen()/fread()/fwrite()/fclose()的区别-基于流缓冲
解释文件锁的应用场景,fcntl与lockf
fork()—创建新进程
ARM体系结构支持大端模式(big-endian) 10 和小端模式(little-endian)两种内存模式。
系统调用与用户编程接口API的区别
系统调用是一个通过软件中断机制向内核提交请求以获取内核服务的 接口。实际使用中程序员调用的则是API。
文件描述符概念
对linux而言,所有对设备和文件的操作都是使用文件描述符来进行的。
栈(stack):由编译器自动分配释放,存放函数的参数 值、局部变量的值、返回地址等,其操作方式类似于数 据结构中的栈。
堆(heap):一般由程序员动态分配(调用mallo()函数) 和释放(调用free()函数),若程序员不释放,程序结束 时可能由操作系统回收。
数据段(data):存放的是全局变量、静态变量、常数。 根据存放的数据,数据段又可以分成普通数据段(包括 可读可写/只读数据段,存放静态初始化的全局变量或常 量)、BSS数据段(存放未初始化的全局变量)。 代码段(code):用于存放程序代码。
3.2.2堆和栈的区别
申请方式
栈(stack)是由系统自动分配的;堆(head) 需要程序员自己申请,并在申请时指定大小 。
申请后系统的响应
堆在操作系统中有一个记录空闲内存地址的链 表,当系统收到程序的申请时,系统就会开始 遍历该链表,寻找第一个空间大于所申请空间 的堆结点,然后将该结点从空闲结点链表中删 除,并将该结点的空间分配给程序。
12 间进入内核空间,处理完后再返回到用户空间。
5.1.2 用户编程接口
在Linux中,用户编程接口(API)遵循了 在Unix中最流行的应用编程界面标准—— POSIX标准。POSIX标准是由IEEE和 ISO/IEC共同开发的标准系统。该标准基于 当时现有的Unix实践和经验,描述了操作 系统的系统调用编程接口(实际上就是 API),用于保证应用程序可以在源代码一 级上在多种操作系统上移植运行。这些系 统调用编程接口主要是通过C库(libc)实
堆和栈中的存储内容
堆一般在堆的头部用一个字节存放堆的大小,堆中的具体内容由 程序员安排。
9
3.3.3 字节顺序
字节顺序是指一个字中各个字节的顺序, 有大端模式和小端模式。
大端模式是指在这种格式中,字数据的高字节 存储在低地址中,而字数据的低字节则存放在 高地址中。
小端模式是指与大端存储格式相反,在小端存 储格式中,低地址中存放的是字数据的低字节, 高地址存放的是字数据的高字节。
在Linux中,为了更好地保护内核空间,将程序的运行空间 分为内核空间和用户空间(也就是常称的内核态和用户态), 它们分别运行在不同的级别上,逻辑上是相互隔离的。
因此,用户进程在通常情况下不允许访问内核数据,也无法使 用内核函数,它们只能在用户空间操作用户数据,调用用户空 间的函数。
但是,在有些情况下,用户空间的进程需要获得一定的系统服 务(调用内核空间程序),这时操作系统就必须利用系统提供 给用户的“特殊接口”——系统调用规定用户进程进入内核空 间的具体位置。进行系统调用时,程序运行空间需要从用户空