收藏 分享(赏)

linux有关.doc

上传人:fmgc7290 文档编号:7445262 上传时间:2019-05-18 格式:DOC 页数:6 大小:66KB
下载 相关 举报
linux有关.doc_第1页
第1页 / 共6页
linux有关.doc_第2页
第2页 / 共6页
linux有关.doc_第3页
第3页 / 共6页
linux有关.doc_第4页
第4页 / 共6页
linux有关.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

1、1.嵌入式开发过程绝大多数 Linux 软件开发都是以 native 方式进行的,即本机(HOST)开发、调试,本机运行的方式。这种方式通常不适合于嵌入式系统的软件开发,因为对于嵌入式系统的开发,没有足够的资源在本机(即板子上系统)运行开发工具和调试工具。通常的嵌入式系统的软件开发采用一种交叉编译调试的方式。交叉编译调试环境建立在宿主机(即一台 PC 机)上,对应的开发板叫做目标板。运行 Linux 的 PC【宿主机】开发时使用宿主机上的交叉编译、汇编及连接工具形成可执行的二进制代码(这种可执行代码并不能在宿主机上执行,而只能在目标板上执行) ,然后把可执行文件下载到目标机上运行。调试时的方法

2、很多,可以使用串口,以太网口等,具体使用哪种调试方法可以根据目标机处理器提供的支持作出选择。宿主机和目标板的处理器一般不相同,宿主机为 Intel 处理器,而目标板如 UP-CUP S2410 经典平台开发板为三星 S3c2410.GNU 编译器提供这样的功能,在编译器编译时可以选择开发所需的宿主机和目标机从而建立开发环境。所以在进行嵌入式开发前第一步的工作就是要安装一台装有指定操作系统的 PC 机作宿主开发机,对于嵌入式 LINUX,宿主机上的操作系统一般要求为 REDHAT LINUX。嵌入式开发通常要求宿主机配置有网络,支持 NFS(为交叉开发时 mount 所用) 。然后要在宿主机上建

3、立交叉编译调试的开发环境。环境的建立需要许多的软件模块协同工作,这将是一个比较繁杂的工作,但现在已通过博创嵌入式教学套件中光盘的安装而自动完成了。2.多线程程序的优缺点多线程程序作为一种多任务、并发的工作方式,有以下的优点:1) 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。2) 使多CPU 系统更加有效。操作系统会保证当线程数不大于CPU 数目时,不同的线程运行于不同的CPU 上。3) 改善程序结构

4、。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。LIBC 中的 pthread 库提供了大量的 API 函数,为用户编写应用程序提供支持3主要的多线程API在本程序的代码中大量的使用了线程函数,如pthread_cond_signal、pthread_mutex_init、pthread_mutex_lock 等等,这些函数的作用是什么,在哪里定义的,我们将在下面的内容中为大家做一个简单的介绍,并且为其中比较重要的函数做一些详细的说明。 线程创建函数:int pthread_create (pthread_t * thread_id, _

5、const pthread_attr_t * _attr,void *(*_start_routine) (void *),void *_restrict _arg) 获得父进程ID:pthread_t pthread_self (void) 测试两个线程号是否相同:int pthread_equal (pthread_t _thread1, pthread_t _thread2) 线程退出:void pthread_exit (void *_retval) 等待指定的线程结束:int pthread_join (pthread_t _th, void *_thread_return) 互斥量

6、初始化:pthread_mutex_init (pthread_mutex_t *,_const pthread_mutexattr_t *)4.C 编程1、建立工作目录rootzxt smile# mkdir hellorootzxt smile# cd hello2、编写程序源代码在 Linux 下的文本编辑器有许多,常用的是 vim 和 Xwindow 界面下的 gedit 等,我们在开发过程中推荐使用 vim,用户需要学习 vim 的操作方法,请参考相关书籍中的关于 vim 的操作指南。 Kdevelope、anjuta 软件的界面与 vc6.0 类似,使用它们对于熟悉 windows

7、 环境下开发的用户更容易上手。实际的 hello.c 源代码较简单,如下:include main()printf(“hello world n”);我们可以是用下面的命令来编写 hello.c 的源代码,进入 hello 目录使用 vi 命令来编辑代码:rootzxt hello# vi hello.c按“i”或者“a”进入编辑模式,将上面的代码录入进去,完成后按 Esc 键进入命令状态,再用命令“ :wq”保存并退出。这样我们便在当前目录下建立了一个名为 hello.c 的文件。3、编写 Makefile要使上面的 hello.c 程序能够运行,我们必须要编写一个 Makefile 文件,

8、Makefile 文件定义了一系列的规则,它指明了哪些文件需要编译,哪些文件需要先编译,哪些文件需要重新编译等等更为复杂的命令。使用它带来的好处就是自动编译,你只需要敲一个“make” 命令整个工程就可以实现自动编译,当然我们本次实验只有一个文件,它还不能体现出使用 Makefile 的优越性,但当工程比较大文件比较多时,不使用 Makefile 几乎是不可能的。下面我们介绍本次实验用到的 Makefile 文件。CC= armv4l-unknown-linux-gccEXEC = helloOBJS = hello.o CFLAGS += LDFLAGS+= static all: $(EX

9、EC)$(EXEC): $(OBJS)$(CC) $(LDFLAGS) -o $ $(OBJS) clean:-rm -f $(EXEC) *.elf *.gdb *.o下面我们来简单介绍这个 Makefile 文件的几个主要部分: CC 指明编译器 EXEC 表示编译后生成的执行文件名称 OBJS 目标文件列表 CFLAGS 编译参数 LDFLAGS 连接参数 all: 编译主入口 clean: 清除编译结果注意:“$(CC) $(LDFLAGS) -o $ $(OBJS)”和“-rm -f $(EXEC) *.elf *.gdb *.o”前空白由一个 Tab 制表符生成,不能单纯由空格来代

10、替。与上面编写 hello.c 的过程类似,用 vi 来创建一个 Makefile 文件并将代码录入其中rootzxt hello# vi Makefile4、编译应用程序在上面的步骤完成后,我们就可以在 hello 目录下运行“make” 来编译我们的程序了。如果进行了修改,重新编译则运行:rootzxt hello# make cleanrootzxt hello# make注意:编译、修改程序都是在宿主机(本地 PC 机)上进行,不能在 MINICOM 下进行。5、下载调试在宿主 PC 计算机上启动 NFS 服务,并设置好共享的目录,具体配置请参照前面第一章第四节中关于嵌入式 Linux

11、 环境开发环境的建立。在建立好 NFS 共享目录以后,我们就可以进入 MINICOM 中建立开发板与宿主 PC 机之间的通讯了。rootzxt hello# minicom/mnt/yaffs mount -t nfs -o nolock 192.168.0.56:/arm2410cl /host 注意: IP 地址需要根据宿主 PC 机的实际情况修改成功挂接宿主机的 arm2410cl 目录后,在开发板上进入/host 目录便相应进入宿主机的/arm2410cl 目录,我们已经给出了编辑好的 hello.c 和 Makefile 文件,它们在/arm2410cl/exp/basic/01_h

12、ello 目录下。用户可以直接在宿主 PC 上编译生成可执行文件,并通过上面的命令挂载到开发板上,运行程序察看结果。如果不想使用我们提供的源码的话,可以再建立一个 NFS 共享文件夹。如/root/share,我们把我们自己编译生成的可执行文件复制到该文件夹下,并通过 MINICOM 挂载到开发板上。rootzxt hello# cp hello /root/sharerootzxt hello# minicom/mnt/yaffs mount -t nfs -o nolock 192.168.0.56:/root/share /host 再进入/host 目录运行刚刚编译好的 hello 程

13、序,查看运行结果。/mnt/yaffs cd /host/host ./hellohello world下载调试方法,在之后的实验中如没有明显说明,请使用这种方法,不再赘述5.串口 打开串口在 Linux 下串口文件位于/dev 下,一般在老版本的内核中串口一为/dev/ttyS0 ,串口二为 /dev/ttyS1, 在我们的开发板中串口设备位于/dev/tts/下,因为开发板中没有 ttyS0 这个设备,所以我们要建立一个连接,方法如下:/mnt/yaffs cd /dev/dev ln sf /dev/tts/0 ttyS0打开串口是通过标准的文件打开函数来实现的int fd;fd = o

14、pen( “/dev/ttyS0“, O_RDWR); /*以读写方式打开串口*/if (-1 = fd) /* 不能打开串口一*/perror(“ 提示错误!“); 串口设置最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置 struct termios 结构体的各成员值,关于该结构体的定义可以查看/arm2410cl/kernel/linux-2.4.18-2410cl/include/asm/termios.h 文件。struct termiounsigned short c_iflag; /* 输入模式标志 */unsigned short c_oflag; /*

15、 输出模式标志 */unsigned short c_cflag; /* 控制模式标志 */unsigned short c_lflag; /* local mode flags */unsigned char c_line; /* line discipline */unsigned char c_ccNCC; /* control characters */;设置这个结构体很复杂,可以参考 man 手册或者由赵克佳、沈志宇编写的UNIX 程序编写教程 ,我这里就只考虑常见的一些设置: 波特率设置:下面是修改波特率的代码:struct termios Opt;tcgetattr(fd, cf

16、setispeed( /*设置为 19200Bps*/cfsetospeed(tcsetattr(fd,TCANOW, 校验位和停止位的设置:无效验 8 位Option.c_cflag Option.c_cflag Option.c_cflag Option.c_cflag |= CS8; 奇效验(Odd) 7 位Option.c_cflag |= PARENB;Option.c_cflag Option.c_cflag Option.c_cflag Option.c_cflag |= CS7; 偶效验(Even) 7 位Option.c_cflag Option.c_cflag |= PAR

17、ODD;Option.c_cflag Option.c_cflag Option.c_cflag |= CS7; Space 效验 7 位 Option.c_cflag Option.c_cflag Option.c_cflag Option.c_cflag |= CS8; 设置停止位:1 位:options.c_cflag 2 位:options.c_cflag |= CSTOPB;注意:如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(Raw Mode)方式来通讯,设置方式如下: options.c_lflag /*Input*/options.c_oflag

18、 /*Output*/ 读写串口设置好串口之后,读写串口就很容易了,把串口当作文件读写就可以了。 发送数据:char buffer1024;int Length1024;int nByte;nByte = write(fd, buffer ,Length) 读取串口数据:使用文件操作 read 函数读取,如果设置为原始模式(Raw Mode)传输数据,那么read 函数返回的字符数是实际串口收到的字符数。可以使用操作文件的函数来实现异步读取,如 fcntl,或者 select 等来操作。char buff1024;int Len1024;int readByte = read(fd, buff, Len); 关闭串口关闭串口就是关闭文件。close(fd);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报