linux学习小知识_第1页
linux学习小知识_第2页
linux学习小知识_第3页
linux学习小知识_第4页
linux学习小知识_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

小知识 20120614 王小彬 1、在 linux 终端下,执行:mount udisk /mnt 可以将 U 盘挂载到/mnt 文件夹下。之后要 读取 U 盘的内容就很容易了。:):) (*) 2 arm 板上 linux 自动挂载 U 盘( 详解将友善之臂的 root_qtopia 根文件的/etc/mdev.conf 和 /bin/hotplug.sh 这两个文件) mini2440 开发板 Linux 系统自动挂载 U 盘与 SD 卡失败的解决方法 对于有些 U 盘和 SD 卡, mini2440 开发板自带的 Linux 系统不能有效的自 动挂载在文件系统里面, 这 是因为 mini2440 的/etc/mdev.conf 和 /bin/hotplug.sh 这两个文件写的不太完善,我经过测试,发现其中 的内容需要改进,在/etc/mdev.conf 文件中,只需将以下内容写至末尾即可: mmcblk0-9 0:0 0666 =sdcard * /bin/hotplug.sh sda-z0-9 0:0 0666 =udisk * /bin/hotplug.sh 在/bin/hotplug.sh 文件中则需要把以下内容加在 “case $MDEV in” 的后面: sda-z1-9) DEVNAME=udisk MOUNTPOINT=/udisk ; mmcblk0-9p0-9) DEVNAME=sdcard MOUNTPOINT=/sdcard ;mmcblk0- 9) DEVNAME=sdcard MOUNTPOINT=/sdcard ; 这样再重启系统就可以自动挂载任何了! 本篇文章来源于 Linux 公社网站() 原文链接:/Linux/2011- 04/34643.htm 3 Qt 中文显示设置 #include 02 #include 03 #include “mainwindow.h“ 04 05 int main(int argc, char *argv) 06 07 08 QApplication a(argc, argv); 09 / 以下部分解决中文乱码 10 QTextCodec:setCodecForTr(QTextCodec:codecForName(“UTF8“); 11 QTextCodec:setCodecForLocale(QTextCodec:codecForName(“UTF8“); 12 QTextCodec:setCodecForCStrings(QTextCodec:codecForName(“UTF8“); 13 / 以上部分解决中文乱码 14 MainWindow w; 15 16 w.show(); 17 18 return a.exec(); 4、Fedora 14 以 root 身份登录 GUI 界面设置 进入到/etc/pam.d/目录下:cd /etc/pam.d/ 切换到 root 权限:su root 用 vim 打开 gdm 和 gdm-password 两个文件 分别用“#”注释掉 auth required pam_succeeed_if.so user!=root quite 一行。 重新回到登录界面即可用 root 登录到图形界面。 5、Fedora 安装新内核 将内核解压到根文件下, 进入内核, 执行:#! /bin/sh make menuconfig make make modules make modules_install make install 将/boot/grub 下的 grub.conf 打开 将上面的 timeout=0 改为 5,即延 时 5s 作为选择内核版本的缓冲时间,当然想要 设得更长或更短都可 以,结 果如下 重启后在 BISO 自 检之后,按 ESC 键, 进入 Grub 引导菜单, 选择相应的内核。 6 Ubuntu 下安装 qwt 且使用 在终端执行:svn co /svnroot/qwt qwt 获 取 qwt 的源码,然后 进入该文件夹 下的 qwt-6.0 文件夹,执行:qmake make make install 编译完的代码自动安装到/usr/local 下,形成一个名为 qwt-6.0.2-svn 的文件夹。 进入该文件夹下的 example 是,执行:qmake make 进入该文件夹下的 bin,在终端执行: ./bode qwslibqtserial.so.1.0;libqtserial.so.1.0.0 然后把此几个文件拷贝到$QTEDIR/lib 目录下,把头文件:posix_qtserialport.h, qtserialbase.h 拷贝到 $QTEDIR/include 目录下,当然也可以你自己指定的目录, 最后是测试程序,你在 测试程序中就可以像使用一般的 库文件那样使用了, 对了,当然,在 makefile 中的 LIBS 变量上加-lqtserial; eg:LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lm -lqte -lqtserial 相关文章 16、Qt 无规则窗口制作 setGeometry(0,0,120,120); pixmap=new QPixmap(/doc/test/a/tmp.png); bitmap=new QBitmap(/doc/test/a/mask.png); QPalette palette; palette.setBrush(backgroundRole(), QBrush(*pixmap); setPalette(palette); setMask(*bitmap); 17、虚拟机里的 Ubuntu 串口设 置 串口名为:ttyS1; 18、有两块板独自都可以和电脑 正确通信,而两 块板之间却通信 错误,此时可以查看一下两 块板间的 TX、Rx 是否接对,很可能两者之间是以 TX-TX、Rx-Rx 连接的。 19、linux 内核编译安装需要的工具: build-essential 基本的编程库(gcc, make 等) kernel-package libncurses5-dev (meke menuconfig 要调用的) libqt3-headers (make xconfig 要调用的) 其他工具在升级过程中可以按提示安装 20、查看 linux 内核信息 2011-03-28 18:06 348 人阅读 评论(0) 收藏 举报 关键词 环形缓冲区 printk klogd syslogd dmesg 在头文件 中定义了 【8 种可用的日志级别字符串】 KERN_EMERG 用于紧急事件消息,它们一般是系统崩溃之前提示的消息。 KERN_ALERT 用于需要立即采取动作的情况。 KERN_CRIT 临界状态,通常涉及严重的硬件或软件操作失败。 KERN_ERR 用于报告错误状 态;设备驱动程序会经常使用 KERN_ERR 来报告来自硬件的问题。 KERN_WARNING 对可能出现问题的情况进行警告, 这类情况通常不会对系统造成严重问题。 KERN_NOTICE 有必要进行提示的正常情形。 许多与安全相关的状况用这个级别进行汇报。 KERN_INFO 提示性信息。很多驱动程序在启动的时候,以这个 级别打印出它们找到的硬件信息。 KERN_DEBUG 用于调试信息。 dmesg 是从 kernel 的 ring buffer(环缓冲区)中读取信息的. 那什么是 ring buffer 呢? 在 LINUX 中,所有的系统信息( 包内核信息)都会传送到 ring buffer 中.而内核产生的信息由 printk()打 印出来。 系统启动时所看到的信息都是由该函数打印到屏幕中。 printk()打出的信息往往以 这的数 字表明消息的重要级别。高于一定的优先级别会打印到屏幕上,否 则 只会保留在系统的缓冲区中(ring buffer)。 至于 dmesg 具体是如何从 ring buffer 中读取的,大家可以看 dmesg.c 源代码.很短,比较容易读懂. 是 syslogd 这 个守护进程根据/etc/syslog.conf, 将不同的服务产 生的 Log 记录到不同的文件中. LINUX 系统启动后,由 /etc/init.d/sysklogd 先后启动 klogd,syslogd 两个守护进程。 其中 klogd 会通过 syslog()系统调用或者读取 proc 文件系统来从系统缓冲区(ring buffer)中得到由 内核 printk()发出的信息 .而 syslogd 是通过 klogd 来读取系统内核信息. 1 所有系统 信息是输出到 ring buffer 中去的.dmesg 所显示的内容也是从 ring buffer 中读取的. 2 LINUX 系统中/etc/init.d/sysklogd 会启动 2 个守护进程:Klogd, Syslogd 3 klogd 是负责读 取内核信息的 ,有 2 种方式: syslog()系统调用(这个函数用法比 较全,大家去 MAN 一下看看)直接的对/proc/kmsg 进行读取(再 这提一下,/proc/kmsg 是专门输出内核信息的地方) 4 Klogd 的输出结果会传送给 syslogd 进行处理,syslogd 会根据/etc/syslog.conf 的配置把 log 信息输 出到/var/log/下的不同文件中. 21、进行 linux 串口通信时,要重点注意串口的设置,如果输入输出设置不对的话,在接受 或 发送一些与回车符、空格等 ASCII 码相等的字符时,会出 现堵塞现象。 22、嵌入式 Qt 中,主线程中的对象(如按钮、对话框等等之类的)越多,Qt 程序在处理对应对 象的信号响应时就越慢。因为 需要超找响应的对象变多了。可以多线程使用,分配线程间的 对象数。 23、使用 C 语言进行文件的重命名及删除操作 在包里有两个函数可以满足你的要求: 注意,这两个函数操作的文件必须要关闭,否则会执行失败,如果失败,执行完成后可以通过比较 errno 的值 来确定失败原因. 重命名: int rename(const char *oldname, const char *newname); 参数解释: oldname:原文件名 newname:新文件名(可以指定全局路径来移动文件) 返回值: 0:成功 -1:失 败,并将全局变量 errno 置为错误码 删除: int remove(const char *filename); 参数解释: filename:要删除的文件名 返回值: 0:成功 -1:失 败,并将全局变量 errno 置为错误码 24、access 目录 描述 函数名: access 头文件:io.h(linux 中为) 功 能: 确定文件的 访问权限,检查某个文件的存取方式,比如说是只读方式、只写方式等。如果指 定的存取方式有效,则函数返回 0,否 则函数返回-1 。 用 法: int access(const char *filename, int amode); int _access(const char *path,int mode) ; 编辑本段描述 access 函数,当对文件使用时,判断是否存在指定的文件,以及是否能够按指定的模式进行访问。 当对目录使用时,只判断是否存在指定的目 录;因为在 Windows 系统下所有的目录都有读和写的访问 权限。 参数 mode 可 为以下的其中之一: 00 只存在 02 写权限 04 读权限 06 读和写权限 返回值: 如果文件拥有给定的模式则返回 0,如果发生错误返回-1。 可移植性: Windows,Unix 及其类似系统都存在此函数。 请注意, lcc-win32 同时支持_access(微软公约)和 access。 程序例: #include #include int file_exists(char *filename); int main(void) printf(“Does NOTEXIST.FIL exist: %sn“, file_exists(“NOTEXISTS.FIL“) ? “YES“ : “NO“); return 0; int file_exists(char *filename) return (access(filename, 0) = 0); 25、C 语言 linux 简单编程,遍历文件夹获得文件名 2011-3-29 20:28 提问者: dlrongrong | 悬赏分:5 | 浏览次数:2059 次 目的: 访问某个地址,遍 历文件名得到文件名以 0 开头的文件,将此 .jp2 文件的文件名和文件大小 读取存放 到一个 BUFFER 里面。 int GetFileCount(char ff) /ff 的值为 0,表示需要匹配以 0 开头的文件名 char name402400; char buf1024; memset(name,0,402400); DIR *pDir; struct dirent *pDirect; pDir=opendir(“/mnt/disk1/jp2/*.jp2“); if(pDir=NULL) return -1; do memset(buf,0,1024); sprintf(buf,“%s:%d,“,pDirect-d_name,pDirect-d_reclen); if(pDirect-d_name0!=ff) continue; strcat(name,buf); while( pDirect=readdir(pDir) ) != NULL); send(client_socket,name,strlen(name),0); closedir(pDir); return 0; 3)Linux 程序 设计 入门- 文件操作 Linux 下文件的操作 前言: 我们在这一节将要讨论 linux 下文件操作的各个函数. 文件的创建和读写 文件的各个属性 目录文件的操作 管道文件 - - 1。文件的创建和 读写 我假设你已经知道了标准级的文件操作的各个函数(fopen,fread,fwrite 等等).当然 如果你不清楚的话也不要着急.我们讨论的系统级的文件操作实际上是为标准级文件操作 服务的. 当我们需要打开一个文件进行读写操作的时候,我们可以使用系统调用函数 open.使用完 成以后我们调用另外一个 close 函数进行关闭操作. #include #include #include #include int open(const char *pathname,int flags); int open(const char *pathname,int flags,mode_t mode); int close(int fd); open 函数有两个形式.其中 pathname 是我们要打开的文件名( 包含路径名称,缺省是认为在 当前路径下面).flags 可以去下面的一个值或者是几个值的组合. O_RDONLY:以只读的方式打开文件. O_WRONLY:以只写的方式打开文件. O_RDWR:以读写的方式打开文件. O_APPEND:以追加的方式打开文件. O_CREAT:创建一个文件. O_EXEC:如果使用了 O_CREAT 而且文件已经存在,就会发生一个错误. O_NOBLOCK:以非阻塞的方式打开一个文件. O_TRUNC:如果文件已经存在,则删除文件的内容. 前面三个标志只能使用任意的一个.如果使用了 O_CREATE 标志,那么我们要使用 open 的第 二种形式.还要指定 mode 标志,用来表示文件的访问权限.mode 可以是以下情况的组合. - S_IRUSR 用户可以读 S_IWUSR 用户可以写 S_IXUSR 用户可以 执行 S_IRWXU 用户可以读写执行 - S_IRGRP 组可以读 S_IWGRP 组可以写 S_IXGRP 组可以 执行 S_IRWXG 组可以读写执行 - S_IROTH 其他人可以读 S_IWOTH 其他人可以写 S_IXOTH 其他人可以执行 S_IRWXO 其他人可以读写执行 - S_ISUID 设置用户执行 ID S_ISGID 设置组的执行 ID - 我们也可以用数字来代表各个位的标志.Linux 总共用 5 个数字来表示文件的各种权限. 00000.第一位表示设置用户 ID.第二位表示 设置组 ID,第三位表示用 户自己的权限位,第四 位表示组的权限,最后一位表示其他人的权限. 每个数字可以取 1(执行权限),2( 写权限),4(读权限),0(什么也没有)或者是这几个值的和 比如我们要创建一个用户读写执行,组没有权限,其他人读执行的文件.设置用户 ID 位那么 我们可以使用的模式是-1(设置用户 ID)0(组没有设置)7(1+2+4)0(没有权限,使用缺省) 5(1+4)即 10705: open(“temp“,O_CREAT,10705); 如果我们打开文件成功,open 会返回一个文件描述符.我们以后对文件的所有操作就可以 对这个文件描述符进行操作了. 当我们操作完成以后,我们要关闭文件了,只要调用 close 就可以了,其中 fd 是我们要关闭 的文件描述符. 文件打开了以后,我们就要对文件进行读写了.我们可以调用函数 read 和 write 进行文件的 读写. #include ssize_t read(int fd, void *buffer,size_t count); ssize_t write(int fd, const void *buffer,size_t count); fd 是我们要进行读写操作的文件描述符 ,buffer 是我们要写入文件内容或读出文件内容的 内存地址.count 是我 们要读写的字节数. 对于普通的文件 read 从指定的文件(fd) 中读取 count 字节到 buffer 缓冲区中( 记住我们必 须提供一个足够大的缓冲区),同时 返回 count. 如果 read 读到了文件的结尾或者被一个信号所中断,返回值会小于 count.如果是由信号中 断引起返回,而且没有返回数据,read 会返回-1, 且设置 errno 为 EINTR.当程序读到了文件 结尾的时候,read 会返回 0. write 从 buffer 中写 count 字节到文件 fd 中,成功时返回实际所写的字节数. 下面我们学习一个实例,这个实例用来拷贝文件. #include #include #include #include #include #include #include #define BUFFER_SIZE 1024 int main(int argc,char *argv) int from_fd,to_fd; int bytes_read,bytes_write; char bufferBUFFER_SIZE; char *ptr; if(argc!=3) fprintf(stderr,“Usage:%s fromfile tofilena“,argv0); exit(1); /* 打开源文件 */ if(from_fd=open(argv1,O_RDONLY)=-1) fprintf(stderr,“Open %s Error:%sn“,argv1,strerror(errno); exit(1); /* 创建目的文件 */ if(to_fd=open(argv2,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)=-1) fprintf(stderr,“Open %s Error:%sn“,argv2,strerror(errno); exit(1); /* 以下代码是一个经典的拷贝文件的代码 */ while(bytes_read=read(from_fd,buffer,BUFFER_SIZE) /* 一个致命的错误发生了 */ if(bytes_read=-1) else if(bytes_read0) ptr=buffer; while(bytes_write=write(to_fd,ptr,bytes_read) /* 一个致命错误发生了 */ if(bytes_write=-1) /* 写完了所有读的字节 */ else if(bytes_write=bytes_read) break; /* 只写了一部分,继续写 */ else if(bytes_write0) ptr+=bytes_write; bytes_read-=bytes_write; /* 写的时候发生的致命错误 */ if(bytes_write=-1)break; close(from_fd); close(to_fd); exit(0); 2。文件的各个属性 文件具有各种各样的属性,除了我们上面所知道的文件权限以外,文件还有创建时间 ,大小等等属性. 有时侯我们要判断文件是否可以进行某种操作(读,写等等). 这个时候我 们可以使用 acce ss 函数 . #include int access(const char *pathname,int mode); pathname:是文件名称,mode 是我们 要判断的属性.可以取以下值或者是他 们的组合. R_OK 文件可以读,W_OK 文件可以写,X_OK 文件可以执行,F_OK 文件存在.当我们测试成功时 ,函数返回 0,否则如果有一个条件不符时,返回-1. 如果我们要获得文件的其他属性,我们可以使用函数 stat 或者 fstat. #include #include int stat(const char *file_name,struct stat *buf); int fstat(int filedes,struct stat *buf); struct stat dev_t st_dev; /* 设备 */ ino_t st_ino; /* 节 点 */ mode_t st_mode; /* 模式 */ nlink_t st_nlink; /* 硬连接 */ uid_t st_uid; /* 用 户 ID */ gid_t st_gid; /* 组 ID */ dev_t st_rdev; /* 设备类型 */ off_t st_off; /* 文件字节数 */ unsigned long st_blksize; /* 块大小 */ unsigned long st_blocks; /* 块数 */ time_t st_atime; /* 最后一次访问时间 */ time_t st_mtime; /* 最后一次修改 时间 */ time_t st_ctime; /* 最后一次改变时间( 指属性) */ ; stat 用来判断没有打开的文件,而 fstat 用来判断打开的文件.我们使用最多的属性是 st_ mode.通过 着属性我 们可以判断给定的文件是一个普通文件还是一个目录,连接等等.可以 使用下面几个宏来判断. S_ISLNK(st_mode):是否是一个连 接.S_ISREG 是否是一个常规文件.S_ISDIR 是否是一个目 录 S_ISCHR 是否是一个字符设备.S_ISBLK 是否是一个块设备 S_ISFIFO 是否 是一个 FIFO 文 件.S_ISSOCK 是否是一个 SOCKET 文件. 我们会在下面说明如何使用这几个宏的. 3。目 录文件的操作 在我们编写程序的时候,有时候会要得到我 们当前的工作路径。 C 库函数提供了 get cwd 来解决这个问题。 #include char *getcwd(char *buffer,size_t size); 我们提供一个 size 大小的 buffer,getcwd 会把我们当前的路径考到 buffer 中.如果 buffer 太小,函数会返回-1 和一个错误号 . Linux 提供了大量的目录操作函数,我们学习几个比较简单和常用的函数. #include #include #include #include #include int mkdir(const char *path,mode_t mode); DIR *opendir(const char *path); struct dirent *readdir(DIR *dir); void rewinddir(DIR *dir); off_t telldir(DIR *dir); void seekdir(DIR *dir,off_t off); int closedir(DIR *dir); struct dirent long d_ino; off_t d_off; unsigned short d_reclen; char d_nameNAME_MAX+1; /* 文件名称 */ mkdir 很容易就是我们创建一个目录,opendir 打开一个目录为以后读做准备.readdir 读一 个打开的目录.rewinddir 是用来重读目录的和我们学的 rewind 函数一 样.closedir 是关闭 一个目录.telldir 和 seekdir 类似与 ftee 和 fseek 函数. 下面我们开发一个小程序,这个程序有一个参数.如果这个参数是一个文件名,我们输出这 个文件的大小和最后修改的时间,如果是一个目录我们输出这个目录下所有文件的大小和 修改时间. #include #include #include #include #include #include #include #include static int get_file_size_time(const char *filename) struct stat statbuf; if(stat(filename, return(-1); if(S_ISDIR(statbuf.st_mode)return(1); if(S_ISREG(statbuf.st_mode) printf(“%s size:%ld bytestmodified at %s“, filename,statbuf.st_size,ctime( return(0); int main(int argc,char *argv) DIR *dirp; struct dirent *direntp; int stats; if(argc!=2) printf(“Usage:%s filenamena“,argv0); exit(1); if(stats=get_file_size_time(argv1)=0)|(stats=-1)exit(1); if(dirp=opendir(argv1)=NULL) printf(“Open Directory %s Error:%sn“, argv1,strerror(errno); exit(1); while(direntp=readdir(dirp)!=NULL) if(get_file_size_time(direntp- | int pipe(int fildes2); pipe 调用可以 创建一个管道 (通信缓冲区).当调用成功时,我们可以访问文件描述符 fild es0,fildes1.其中 fildes0是用来读的文件描述符,而 fildes1是用来写的文件描 述符. 在实际使用中我们是通过创建一个子进程,然后一个进程写,一个进程读来使用的. 关于进程通信的详细情况请查看进程通信 #include #include #include #include #include #include #include #define BUFFER 255 int main(int argc,char *argv) char bufferBUFFER+1; int fd2; if(argc!=2) fprintf(stderr,“Usage:%s stringna“,argv0); exit(1); if(pipe(fd)!=0) fprintf(stderr,“Pipe Error:%sna“,strerror(errno); exit(1); if(fork()=0) close(fd0); printf(“Child%d Write to pipena“,getpid(); snprintf(buffer,BUFFER,“%s“,argv1); write(fd1,buffer,strlen(buffer); printf(“Child%d Quitna“,getpid(); exit(0); else close(fd1); printf(“Parent%d Read from pipena“,getpid(); memset(buffer,0,BUFFER+1); read(fd0,buffer,BUFFER); printf(“Parent%d Read:%sn“,getpid(),buffer); exit(1); 为了实现重定向操作,我们需要调用另外一个函数 dup2. #include int dup2(int oldfd,int newfd); dup2 将用 oldfd 文件描述符来代替 newfd 文件描述符,同时关闭 newfd 文件描述符.也就是说 , 所有向 newfd 操作都转到 oldfd 上面.下面我们学习一个例子,这个例子将标准输出重定向 到一个文件. #include #include #include #include #include #include #include #define BUFFER_SIZE 1024 int main(int argc,char *argv) int fd; char bufferBUFFER_SIZE; if(argc!=2) fprintf(stderr,“Usage:%s outfilenamena“,argv0); exit(1); if(fd=open(argv1,O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR)=-1) fprintf(stderr,“Open %s Error:%sna“,argv1,strerror(errno); exit(1); if(dup2(fd,STDOUT_FILENO)=-1) fprintf(stderr,“Redirect Standard Out Error:%sna“,strerror(errno); exit(1); fprintf(stderr,“Now,please input string“); fprintf(stderr,“(To quit use CTRL+D)n“); while(1) fgets(buffer,BUFFER_SIZE,stdin); if(feof(stdin)break; write(STDOUT_FILENO,buffer,strlen(buffer); exit(0); 好了,文件一章我们就暂时先讨论到这里,学习好了文件的操作我们其实已经可以写出一 些比较有用的程序了.我们可以编写一个实现例如 dir,mkdir,cp,mv 等等常用的文件操作 命令了. 想不想自己写几个试一试呢? 26、linux 下,使用 stime()、settimeofday()函数只能更改系统的当前时间,并不能将当前已修 改的时间写入 RTC 中,系统重启后会丢失设置的时间。 1、嵌入式系统板子上的 时间是用 date 标准系统命令查看的,date 是 SHELL 命令,例如 busybox 或者 uClinux 上的 sash 等。 这个时间是有运行起来的嵌入式 LINUX 软件维护的,其实就是内存中的一个全 局变量,LINUX 默认启动给这个全局变量赋值就是 19700101 这样的数值。 2、RTC 芯片(很多是嵌入式 处理器内置 RTC 模块,那么就是 CPU 内部寄存器)内部的寄存器 维护的 时间值。 一般的,LINUX 启动后,您可以通过 date 命令来设置更改系统时间,但掉电就会丢失的,启动后又是 1970 这样的时间了。若要能 date 设 置后保存系统时间,使得在下次重启后还能保持的话,就必须有 RTC后备电池 的软硬件支持。 例如,我们 PC 上可以设置系统时间,重启后也不会丢失,就是因 为我们 PC 主板上有 RTC 支持。 RTC 可以是外接的一个芯片,例如常见的 X1226/1227 等,它们就是通过 I2C 接到处理器上的。 当然,现 在更多的情况是 CPU 内置 RTC 模块, 这样您硬件设计的话就只要提供后备电池即可。 明确了系统时间的两个概念后,我 们来看看 RTC 的实现机制。 在嵌入式系统上,实现的方法可以灵活多 样,只要能达到最 终的目的: 您可通过某种操作获取当前的正确的时间,而且重启不会丢失。 那么看看几种实现机制。 在开始介绍几种方法前,我 们先说 明一下软件时间的方式: 我们的平台是嵌入式 LINUX,要 实现 RTC 支持, 则必须是“ 驱动应用程序”的方式,而我们的驱动都 建议是采用 MODULES 方式独立加载的方式, 这样可不影响整个 LINUX 内核。 下面开始介绍实现方法: 从上面可以看到,时间实际上是两个地方同 时在维护的,一个是 RTC 芯片内部寄存器或 CPU 的 RTC 寄存器;另一个则是 LINUX 维护的时间。LINUX 的时间重启就会丢失,而 RTC 由于有后备电池保护, 则不会丢失,在板子断 电后还可以 继续维持计时。所以,最好理解的实现方式就是让 LINUX 内核启动 的时候,从 RTC 芯片里面 读取时间值 ,赋给 LINUX 的时间变量。这样 LINUX 一启动时间就校正过来, 不再是 1970 了。当然,这样做,就不能用独立的 RTC 驱动的 MODULES 形式了。而当您通 过 date 命 令设置 LINUX 时间时,您 还要修改 date 命令的代码,使之同 时还要通过 I2C 修改 RTC 芯片内部寄存 器数值(或 CPU 内部寄存器数 值),当然了,这样还是需要一个读写 RTC 的驱动的。 下面则是一个更简化的实现方法 即 LINUX 启动时,不从 RTC 芯片里面 读取时间,而您直接修改 date 命令的代码,让它不要从 LINUX 提供的接口读取,而是直接通 过驱动 从 RTC 里面直接读取。 另外,如果您的系统允许的话,您都可以不走 date 的路线,即读取系 统时间不用 date 命令也可以,可 以自己直接写个读取时间的函数,例如 read_rtc/write_rtc,就用这两个函数取代 date 命令读取和设置 系统时间的功能。 呵呵,写了这么多,好像也没说清楚,最后,大家 记住: 我们看到的时间,实际是在两个不同的地方 维护的 一个是 LINUX 维护的,一个是 RTC 芯片里面的。 这样就存在一个两个时间同步的问题,一个发生在 LINUX 启动的时候,需要从 RTC 里面获取时间; 另一个发生在您设置系统时间的时候,需要两个同时更改。 当然了,中间一些猫 腻就可以发生,例如您可以偷懒跳过 LINUX 时间 ,让 date 或者您自己的代码直接 读取 RTC 时间,而完全不理会 LINUX 的时间(还让它是 1970.吧) 在 ARM9 实验箱等板子上,我们是通过修改 busybox 的 date.c 代码 来实现的的;而在 HHGW-LITE-R3 等 HHPPC 平台上则是通过自己写的 writeRTC 来作的。 前一种方法改变了系统运行方式,后一种 则没有把硬件时间同 LINUX 系统时间联系起来。 27、在 linux 下运行程序时要注意路径,如果一个程序在/opt 文件加下,它使用 open(“mm“,O_CREAT | O_RDWR,0666); 创建文件。 如果你的初衷是在/opt 这个文件夹下创建 mm 文件, 则你只能进入到/opt 文件夹里,然后运 行这个程序。 否则将会在你运行程序的路径里创建文件。比如在 /下运行./opt/ 程序,则会在/下看到 mm 文 件。 28、Qt 中的多线程通信 线程一发送一个信号给另一个线程二。只有当 线程二开始 执行时线程二从信号开始执行,否 则线程一发送的信号不断的累加,直到 线程二用掉信号。 单线程内的信号通信像中断一样,从 发信号的那一句 A 开始,转到槽执行,然后返回,从 A 后面的 B 句继续执行。最终返回到构造函数中。 29、在友善之臂的 FriendlyARM 板中,MAC 在 eth0-setting 中都设为 MAC=08:90:90:90:90:90。 如果在一个地方有多台同样的板,且不改 变该 MAC 的值 的话,会 导致使用 telnet 时会很卡。 30、在 Qt 中,槽函数中不能直接 return 返回,程序退出 时会出现“程序异常。 31、Qt 资源文件 QT 下添加*.qrc(图标 Icon、图像)资源 博客分类: Qt qrcqt 资源文件 1、最好( 图像资源等都包含在一个文件夹中,如 images) 2、在 main 函数中强制初始化资源 Q_INIT_RESOURCE(filename);如: int main(int argc, char *argv) Q_INIT_RESOURCE(filename); /资源定义宏 . 3、在工程文件*.pro 中添加行: RESOURCES += application.qrc 4、典型的*.qrc 文件 images/actualsize.png images/fitwindow.png images/present.png images/print.png images/rotate_left.png images/rotate_right.png images/zoomin.png images/zoomout.png images/next.png images/previous.png images/copy.png images/open.png 5、资 源引用,如: QIcon(“:/images/open.png“) %调用 images 文件 夹中的 open.png。 *注:若是通过添加 qrc 获得的文件,则需要注意文件中类似“ ”之类的前 缀,也需要添加在文件前,如 QIcon(“:/new/prefix1/images/open.png“);注意与上文的不同。 -其他说明性知识点- Qt 资源体系采用平台独立机制来存储应用程序执行时的二进制文件。这种机制在应用程序需要一些 确定的文件(图标、翻译文件等等)而且又不想冒丢失文件的风险时是有用的。 资源体系依赖于 qmake, rcc (Qts resource compiler), 和 QFile 的紧密协作。Qt 3 的 qembed 工具 和 image collection 机制被废除。 Resource Collection Files (.qrc) 与应用程序关联的应用程序由 .qrc 文件来指定,它用 XML 记录硬盘上的文件和对应的随意指定的资源 名称,应 用程序通 过资源名称来访问资 源。 一个.qrc 文件的例子: images/copy.png images/cut.png images/new.png images/open.png images/paste.png images/save.png .qrc 文件中列出的 资源文件是程序的源码树的一部分。指定的路径是 .qrc 文件所在目录的相对路 径。注意,列出的资源文件必须位于 .qrc 文件所在目录或者其子目录下。 资源数据也能被编译进二进制文件中,因此应用程序代码可以立即访问;也可以创建一个二进制资 源,稍后在程序中登记了资源体系的代 码中指定。 缺省时,程序可以用 资源在源 码树中的名称加一个 :/ 前缀来访问它。例如,在程序的源码树中是 images/cut.png 的文件可以通过 :/images/cut.png 来访问。 但也可以用 file 标签中的 alias 属性来指定: images/cut.png 这时该文件可以通过 :/cut-img.png 来访问。 也可以在 .qrc 文件中用 qresource 标签的 prefix 属 性:它可以为 .qrc 文件中所有文件指定一个前缀: images/cut.png 这时该文件可以用 :/myresources/cut-img.png 访问。

温馨提示

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

评论

0/150

提交评论