1 基于嵌入式 Linux 开发基础 丁男. 2 概要 基于 linux 系统开发简介 基于 linux 系统开发简介 多线程技术 多线程技术 对文件操作 对文件操作 对设备操作 对设备操作.

Slides:



Advertisements
Similar presentations
实验二 Linux 线程及信号灯 一、目的 了解并掌握 Linux 线程及信号灯。 二、要求 1 、了解 Linux 线程与信号灯使用: ( 1 ) Linux 线程 ( 2 ) Linux 信号灯 ( 3 )线程互斥 ( 4 )线程同步.
Advertisements

© 2005 博创科技 北 京 博 创 兴 业 科 技 有 限 公 司 BEIJNG UNIVERSAL PIONEERING TECHNOLOGY Co., LTD 博创科技 嵌入互动 第四讲 Linux 多线程编程 北京博创兴业科技有限公司.
Linux 环境及 Shell 程序 操作系统实验 1. 二、 Shell 编程与进程通信 常用 shell 命令 文件及文件属性操作 ls 、 cp 、 mv 、 rm ln 、 ln –s 、 chmod 、 groupadd 、 useradd 输入输出操作 echo 、 cat >> 、
Linux 系统. 操作系统发展需求 1 没有操作系统 2 简单批处理操作系统 3 多道程序设计的批处理 4 多道程序设计的分时操作系统 5 多处理机并行系统 6 网络操作系统 7 分布式操作系统.
多线程编程  Linux 下线程 概述  linux 线程 实现. 1 、 Linux 下线程 概述 进程是系统中程序执行和资源分配的基 本单位。每个进程有自己的数据段、代码 段和堆栈段。 线程通常叫做轻型的进程。线程是在共 享内存空间中并发执行的多道执行路径, 他们共享一个进程的资源。 因为线程和进程比起来很小,所以相对.
COM 串口程序设计 Tel:
嵌入式图形显示.
马志强 软件学院501室 网络应用开发 马志强 软件学院501室
基于操作系统的编程复习 张玉宏
檔案及目錄.
第 5 章 文件I/O操作.
第三讲 多线程程序设计 课程网站:CourseGrading buaa.edu.cn 主讲教师: 赵长海
© 2000 Wind River Systems, Inc.
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
C语言程序设计 第十二章 位运算.
chapter 1-Introduction
OpenMP简介和开发教程 广州创龙电子科技有限公司
计算概论 第二十一讲 文件操作 北京大学信息学院.
第七章. 文件系统 (lab5).
第7章 Linux环境编程.
第二讲 搭建Java Web开发环境 主讲人:孙娜
第10章 文件操作.
第10章 文件操作.
进程及进程管理 第4章 进程及进程管理.
SVN服务器的搭建(Windows) 柳峰
实践演练 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab8 1.
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab10 1.
第十二章 文件 12.1 C文件概述 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位 文件分类 按文件的逻辑结构: 按存储介质:
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
fp=fopen("CD2.dat","wb"); fwrite(&min,8,1,fp); fclose(fp);
程式設計 博碩文化出版發行.
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
按键驱动 广州创龙电子科技有限公司 Guangzhou Tronlong Electronic Technology Co., Ltd.
作業系統實習課(四) -檔案管理- 實驗室:720A 助教:鄧執中.
THE C PROGRAMMING LANGUAGE
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
如何生成设备节点 广州创龙电子科技有限公司
Linux 文件操作——系统调用和标准 IO 库
第9章 文件操作 文件 使用文件的目的 操作系统管理数据的基本单位 存储在外存储器上的数据的集合
Windows 7 的系统设置.
实验一、进程控制 一、实验目的 1、加深对进程的理解,进一步认识并发执行的实质; 2、分析进程争用资源现象,学习解决进程互斥的方法;
(第2版).
实验二、线程同步与通信 一、实验目的 1、掌握Linux下线程的概念; 2、了解Linux线程同步与通信的主要机制;
Advister: Quincy Wu Speaker: Chenglin Tsai Date:3/26
C语言环境配置.
Platform Builder使用介绍 WINCE系统应用开发流程说明 ACTION RDC 杨 涛 2005.Dec.3th
姚金宇 MIT SCHEME 使用说明 姚金宇
3.5 线程 问题的提出 进程的引入使操作系统得以完成对并发执行的多道程序动态特征的描述和资源共享的管理,因而进程既是调度的基本单位又是资源分配的基本单位。进程所具有的这两个特点构成了程序并发执行的基础,但同时又导致进程切换过程中由于进程映像过大而带来的时空开销。因此,如果系统中创建的进程过多,或进程切换的频率过高,则会使系统效率下降,限制了并发度的进一步提高。
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
C標準輸出入函數庫 與 作業系統.
信号量(Semaphore).
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 类型、对象、运算符和表达式.
单片机原理及应用 实践部分 主讲人:刘 强 四川工商学院单片机教学团队 单片机原理及应用 实践部分 主讲人:刘 强
Pthread.
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab7.
Python 环境搭建 基于Anaconda和VSCode.
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
实验二:添加Linux系统调用及熟悉常见系统调用
第十二章 位运算.
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
2019 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab10 1.
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
2019 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab11 1.
实验三 Linux文件目录操作 一、目的 二、要求 了解并掌握Linux文件目录结构。 了解Linux文件系统与目录操作:
C语言程序设计 第13章 文件操作.
2019 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab7.
《操作系统设计与实现》 Linux系统编程.
Presentation transcript:

1 基于嵌入式 Linux 开发基础 丁男

2 概要 基于 linux 系统开发简介 基于 linux 系统开发简介 多线程技术 多线程技术 对文件操作 对文件操作 对设备操作 对设备操作

3 嵌入式 Linux 的开发过程 针对嵌入式 linux 的系统开发环境 针对嵌入式 linux 的系统开发环境 开发平台: linux 桌面系统,如 red hat, debin 等。 编辑器: vi(m) 编译器: Armv4l-unknown-linux-gcc 基于嵌入式 linux 系统的开发流程 基于嵌入式 linux 系统的开发流程 编写代码 编辑器 编译代码 编译器 下载代码

4 可执行代码的格式 可执行代码格式 可执行代码格式 a.out 早期 linux 执行格式,用 gcc 不加 -o ,即默认输出格式。 elf gcc –o 的输出格式 扩展名 扩展名 在 linux 下,应用程序没有固定的扩展名,只要有可以执 行性就可以 可用 ls –l 查看其可行性 运行./filename

5 如何自动运行用户程序 rc.local rc.local./root/usr/etc/rc.local#/////////////////#!/bin/sh ifconfig lo route add -net netmask lo portmap if [ -f /mnt/yaffs/init.sh ]; then /mnt/yaffs/init.sh fi #Add user’s program./program #exec /sbin/getty ttyS

6 多线程编程技术 在 Linux 系统下,启动一个新的进程必须分配给它独 立的地址空间,建立众多的数据表来维护它的代码 段、堆栈段和数据段,这是一种 “ 昂贵 ” 的多任务工 作方式。而运行于一个进程中的多个线程,它们彼 此之间使用相同的地址空间,共享大部分数据,启 动一个线程所花费的空间远远小于启动一个进程所 花费的空间。而且,线程间彼此切换所需的时间也 远远小于进程间切换所需要的时间。 在 Linux 系统下,启动一个新的进程必须分配给它独 立的地址空间,建立众多的数据表来维护它的代码 段、堆栈段和数据段,这是一种 “ 昂贵 ” 的多任务工 作方式。而运行于一个进程中的多个线程,它们彼 此之间使用相同的地址空间,共享大部分数据,启 动一个线程所花费的空间远远小于启动一个进程所 花费的空间。而且,线程间彼此切换所需的时间也 远远小于进程间切换所需要的时间。

7 多线程的优点 提高应用程序响应。 提高应用程序响应。 使多 CPU 系统更加有效。 使多 CPU 系统更加有效。 改善程序结构。 改善程序结构。 线程间方便的通信机制。 线程间方便的通信机制。 线程间的通信方式。 线程间的通信方式。 个线程的数据可以直接为其它线程所用.

8 实例 /* example.c*/ #include #include void thread(void) { int i; for(i=0;i #include void thread(void) { int i; for(i=0;i<3;i++) printf("This is a pthread.n"); } int main(void) { pthread_t id; int i,ret; ret=pthread_create(&id,NULL,(void *) thread,NULL); if(ret!=0){ printf ("Create pthread error!n"); exit (1); } for(i=0;i<3;i++) printf("This is the main process.n"); pthread_join(id,NULL); return (0); }

9 运行结果 Gcc -lpthread –o thread example.c Gcc -lpthread –o thread example.c

10 相关函数及说明 编写 Linux 下的多线程程序,需要使用头文件 pthread.h 。 编写 Linux 下的多线程程序,需要使用头文件 pthread.h 。 线程创建函数: 线程创建函数: int pthread_create (pthread_t * thread_id, __const pthread_attr_t * __attr, void *(*__start_routine) (void *),void *__restrict __arg); 线程退出: 线程退出: void pthread_exit (void *__retval) 等待指定的线程结束: 等待指定的线程结束: int pthread_join (pthread_t __th, void **__thread_return)

11 线程的互斥 互斥锁:互斥锁用来保证一段时间内只有一个线程在 执行一段代码 。实现线程间数据的共享和通信 。 互斥锁:互斥锁用来保证一段时间内只有一个线程在 执行一段代码 。实现线程间数据的共享和通信 。 线程的互斥: 线程的互斥: 互斥锁的初始化: pthread_mutex_init (pthread_mutex_t *,__const pthread_mutexattr_t *) 锁定互斥量(阻塞): int pthread_mutex_lock (pthread_mutex_t *__mutex); 解锁互斥量 int pthread_mutex_unlock (pthread_mutex_t *__mutex) 销毁互斥量: int pthread_mutex_destroy (pthread_mutex_t *__mutex)

12 线程的同步 条件变量 条件变量被用来进行线承间的同步。 条件变量 条件变量被用来进行线承间的同步。 条件变量的结构为 pthread_cond_t , 条件变量的结构为 pthread_cond_t , 初始化条件变量函数: 初始化条件变量函数: int pthread_cond_init (pthread_cond_t *__restrict __cond,__const pthread_condattr_t *__restrict __cond_attr) 销毁条件变量 COND 销毁条件变量 COND int pthread_cond_destroy (pthread_cond_t *__cond) 唤醒线程等待条件变量 唤醒线程等待条件变量 int pthread_cond_signal (pthread_cond_t *__cond) int pthread_cond_signal (pthread_cond_t *__cond) 等待条件变量(阻塞) 等待条件变量(阻塞) int pthread_cond_wait (pthread_cond_t *__restrict __cond, pthread_mutex_t *__restrict __mutex) int pthread_cond_wait (pthread_cond_t *__restrict __cond, pthread_mutex_t *__restrict __mutex)

13 对文件操作 Linux 下最常用的操作就是对文件操作。 Linux 下最常用的操作就是对文件操作。 主要操作 主要操作 文件的创建和读写 文件的各个属性 目录文件的操作 int open(const char *pathname , int flags) ; int open(const char *pathname , int flags) ; O_RDONLY :以只读的方式打开文件。 O_WRONLY :以只写的方式打开文件。 O_RDWR :以读写的方式打开文件。 O_CREAT :创建一个文件。 ssize_t read(int fd , void *buffer , size_t count) ; ssize_t write(int fd , const void *buffer , size_t count) ; ssize_t read(int fd , void *buffer , size_t count) ; ssize_t write(int fd , const void *buffer , size_t count) ; int close(int fd) ; int close(int fd) ; int access(const char *pathname,int mode); int access(const char *pathname,int mode); R_OK 文件可以读, W_OK 文件可以写, X_OK 文件可以执行, F_OK 文件存 在

14

15 与操作目录相关的函数 int mkdir(const char *path , mode_t mode) ; int mkdir(const char *path , mode_t mode) ; DIR *opendir(const char *path) ; DIR *opendir(const char *path) ; struct dirent *readdir(DIR *dir) ; struct dirent *readdir(DIR *dir) ; void rewinddir(DIR *dir) ; void rewinddir(DIR *dir) ; off_t telldir(DIR *dir) ; off_t telldir(DIR *dir) ; void seekdir(DIR *dir , off_t off) ; void seekdir(DIR *dir , off_t off) ; int closedir(DIR *dir) ; int closedir(DIR *dir) ;

16 对串口操作 打开串口 在 Linux 下串口文件是位于 /dev 下的 打开串口 在 Linux 下串口文件是位于 /dev 下的 串口一 为 /dev/ttyS0 串口二 为 /dev/ttyS1 int fd; /* 以读写方式打开串口 */ fd = open( "/dev/ttyS0", O_RDWR); fd = open( "/dev/ttyS0", O_RDWR); if (-1 == fd) { /* 不能打开串口一 */ perror(" 提示错误! "); } 关闭串口 关闭串口 close(fd);

17 串口的设置 struct termio { unsigned short c_iflag; /* 输入模式标志 */ unsigned short c_iflag; /* 输入模式标志 */ unsigned short c_oflag; /* 输出模式标志 */ unsigned short c_cflag; /* 控制模式标志 */ unsigned short c_lflag; /* local mode flags */ unsigned char c_line; /* line discipline */ unsigned char c_cc[NCC]; /* control characters */ };

18 波特率的设定 struct termios Opt; tcgetattr(fd, &Opt); cfsetispeed(&Opt,B19200); /* 设置为 19200Bps*/ cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);或者: newtio.c_cflag = B19200| CRTSCTS | CS8 | CLOCAL | CREAD;/*ctrol flag*/

19 读写操作 读操作 读操作 int readByte = read(fd, buff, Len); 写操作 写操作 nByte = write(fd, buffer,Length) ;