最新日记

linux下cp命令
2007-11-13 15:22

cp命令
该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,同MSDOS下的copy命令一样,功能十分强大。

语法: cp [选项] 源文件或目录 目标文件或目录

说明:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。

该命令的各选项含义如下:

- a 该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录,其作用等于dpR选项的组合。

- d 拷贝时保留链接。

- f 删除已经存在的目标文件而不提示。

- i 和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝。

- p 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。

- r 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。

- l 不作拷贝,只是链接文件。

LINUX下使用U盘
2007-11-13 14:58

#cd /mnt
#mkdir usb
#cd
#mount /dev/sda1 /mnt/usb
卸载:
#cd /mnt
#ymount /mnt/usb
有时候出现driver is busy,解决办法:
  #fuser -m /mnt/usb
  例如显示:11547 11520。。。
    #kill 11547
如果有的进程KILL不掉,就执行:
  #kill -9 11547

减肥历程2
2007-11-07 15:29

  11。6  118
  早餐 粥 小咸菜
  午餐  米饭二两  蒜苗
  晚餐  麻辣烫
 

我的减肥经历
2007-11-06 09:25

    每次回家都要胖一圈,也不是非常胖那种,就是感觉人都笨笨的,长了那最不该长的六斤肉,哈哈。
    11。5  116--118
    早餐:砂锅
    中午:饺子四两
    晚餐:面包半个
    运动:逛街早9点到晚六点
          跳操42分
    11。6  117--118
    早餐:粥
    午餐:米饭二两 羊肉炒香菜一盘
    晚餐:豆芽一盘,枣子糕一小块
    运动:跳操42分

MYSQL操作命令
2007-10-30 16:07

  mysql配置:
    创建用户用户组:
      groupadd mysql
      useradd -g mysql mysql
  给mysql用户赋予对数据库的访问权限:
      chown -R mysql /usr/local/var
  给mysql用户组赋予访问权限:
      chown -R mysql /usr/local
  启动MYSQL守护进程:
      /usr/local/bin/safe_mysqld &
  还有一种方法:
  cd /etc/init.d
  #./mysqld start
  #mysql 

毕业设计
2006-11-25 14:08

    将/write_gpio/gpio_drv.c改为GPC11引脚输出。通过万用表测量,证明了该引脚有输出电压。这步试验成功了!!
  万用表使用:
    将档调为DCV(直流电压)20,估计输出电压在3。3V左右,黑表笔接地(即LCD.SCH中引脚2),红表笔接VD3/GPC11(即LCD.SCH中引脚20)。
  通过分析PCB电路图,找出插槽排列顺序为右下脚为1。

毕业设计
2006-11-23 14:08

 5 访问i/o端口空间
  在驱动程序请求了i/o端口空间中的端口资源后,它就可以通过cpu的io指定来读写这些i/o端口了。在读写i/o端口时要注意的一点就是,大多数平台都区分8位、16位和32位的端口,也即要注意i/o端口的宽度。
  linux在include/asm/io.h头文件(对于i386平台就是include/asm-i386/io.h)中定义了一系列读写不同宽度i/o端口的宏函数。如下所示:
  ⑴读写8位宽的i/o端口  
  unsigned char inb(unsigned port);
    void outb(unsigned char value,unsigned port);    
  其中,port参数指定i/o端口空间中的端口地址。在大多数平台上(如x86)它都是unsigned short类型的,其它的一些平台上则是unsigned int类型的。显然,端口地址的类型是由i/o端口空间的大小来决定的。
  ⑵读写16位宽的i/o端口  
  unsigned short inw(unsigned port);
    void outw(unsigned short value,unsigned port);    
  ⑶读写32位宽的i/o端口  
    unsigned int inl(unsigned port);
    void outl(unsigned int value,unsigned port);    
    5.1 对i/o端口的字符串操作
  除了上述这些“单发”(single-shot)的i/o操作外,某些cpu也支持对某个i/o端口进行连续的读写操作,也即对单个i/o端口读或写一系列字节、字或32位整数,这就是所谓的“字符串i/o指令”(string instruction)。这种指令在速度上显然要比用循环来实现同样的功能要快得多。
  linux同样在io.h文件中定义了字符串i/o读写函数:
  ⑴8位宽的字符串i/o操作  
  void insb(unsigned port,void * addr,unsigned long count);
    void outsb(unsigned port ,void * addr,unsigned long count);    ⑵16位宽的字符串i/o操作  
   void insw(unsigned port,void * addr,unsigned long count);
    void outsw(unsigned port ,void * addr,unsigned long count);     ⑶32位宽的字符串i/o操作  
  
    void insl(unsigned port,void * addr,unsigned long count);
    void outsl(unsigned port ,void * addr,unsigned long count);    
   5.2 pausing i/o  
   在一些平台上(典型地如x86),对于老式总线(如isa)上的慢速外设来说,如果cpu读写其i/o端口的速度太快,那就可能会发生丢失数据的现象。对于这个问题的解决方法就是在两次连续的i/o操作之间插入一段微小的时延,以便等待慢速外设。这就是所谓的“pausing i/o”。
  对于pausing i/o,linux也在io.h头文件中定义了它的i/o读写函数,而且都以xxx_p命名,比如:inb_p()、outb_p()等等。下面我们就以out_p()为例进行分析。
   将io.h中的宏定义__out(b,”b”char)展开后可得如下定义:
  extern inline void outb(unsigned char value, unsigned short port) {
  __asm__ __volatile__ (outb % b 0,% w 1
  : : a (value), nd (port));
  }
  extern inline void outb_p(unsigned char value, unsigned short port) {
  __asm__ __volatile__ (outb % b 0,% w 1
  __full_slow_down_io
  : : a (value), nd (port));
  }  
  可以看出,outb_p()函数的实现中被插入了宏__full_slown_down_io,以实现微小的延时。宏__full_slown_down_io在头文件io.h中一开始就被定义:  
  #ifdef slow_io_by_jumping
  #define __slow_down_io
  jmp 1f
  1: jmp 1f
  1:
  #else
  #define __slow_down_io
  outb %%al,$0x80
  #endif
  
  #ifdef really_slow_io
  #define __full_slow_down_io __slow_down_io
    __slow_down_io __slow_down_io __slow_down_io
  #else
  #define __full_slow_down_io __slow_down_io
  #endif    
  
    显然,__full_slow_down_io就是一个或四个__slow_down_io(根据是否定义了宏really_slow_io来决定),而宏__slow_down_io则被定义成毫无意义的跳转语句或写端口0x80的操作(根据是否定义了宏slow_io_by_jumping来决定)。
  6 访问i/o内存资源
  尽管i/o端口空间曾一度在x86平台上被广泛使用,但是由于它非常小,因此大多数现代总线的设备都以内存映射方式(memory-mapped)来映射它的i/o端口(指i/o寄存器)和外设内存。基于内存映射方式的i/o端口(指i/o寄存器)和外设内存可以通称为“i/o内存”资源(i/o memory)。因为这两者在硬件实现上的差异对于软件来说是完全透明的,所以驱动程序开发人员可以将内存映射方式的i/o端口和外设内存统一看作是 “i/o内存”资源。
  从前几节的阐述我们知道,i/o内存资源是在cpu的单一内存物理地址空间内进行编址的,也即它和系统ram同处在一个物理地址空间内。因此通过cpu的访内指令就可以访问i/o内存资源。  
    一般来说,在系统运行时,外设的i/o内存资源的物理地址是已知的,这可以通过系统固件(如bios)在启动时分配得到,或者通过设备的硬连线(hardwired)得到。比如,pci卡的i/o内存资源的物理地址就是在系统启动时由pci bios分配并写到pci卡的配置空间中的bar中的。而isa卡的i/o内存资源的物理地址则是通过设备硬连线映射到640kb-1mb范围之内的。但是cpu通常并没有为这些已知的外设i/o内存资源的物理地址预定义虚拟地址范围,因为它们是在系统启动后才已知的(某种意义上讲是动态的),所以驱动程序并不能直接通过物理地址访问i/o内存资源,而必须将它们映射到核心虚地址空间内(通过页表),然后才能根据映射所得到的核心虚地址范围,通过访内指令访问这些i/o内存资源。
  6.1 映射i/o内存资源
  linux在io.h头文件中声明了函数ioremap(),用来将i/o内存资源的物理地址映射到核心虚地址空间(3gb-4gb)中,如下:
  void * ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags);
  void iounmap(void * addr);
  函数用于取消ioremap()所做的映射,参数addr是指向核心虚地址的指针。这两个函数都是实现在mm/ioremap.c文件中。具体实现可参考《情景分析》一书。
  6.2 读写i/o内存资源
  在将i/o内存资源的物理地址映射成核心虚地址后,理论上讲我们就可以象读写ram那样直接读写i/o内存资源了。但是,由于在某些平台上,对 i/o内存和系统内存有不同的访问处理,因此为了确保跨平台的兼容性,linux实现了一系列读写i/o内存资源的函数,这些函数在不同的平台上有不同的实现。但在x86平台上,读写i/o内存与读写ram无任何差别。如下所示(include/asm-i386/io.h):
  #define readb(addr) (*(volatile unsigned char *) __io_virt(addr))
  #define readw(addr) (*(volatile unsigned short *) __io_virt(addr))
  #define readl(addr) (*(volatile unsigned int *) __io_virt(addr))
  
  #define writeb(b,addr) (*(volatile unsigned char *) __io_virt(addr) = (b))
  #define writew(b,addr) (*(volatile unsigned short *) __io_virt(addr) = (b))
  #define writel(b,addr) (*(volatile unsigned int *) __io_virt(addr) = (b))
  
  #define memset_io(a,b,c) memset(__io_virt(a),(b),(c))
  #define memcpy_fromio(a,b,c) memcpy((a),__io_virt(b),(c))
  #define memcpy_toio(a,b,c) memcpy(__io_virt(a),(b),(c))
  
   上述定义中的宏__io_virt()仅仅检查虚地址addr是否是核心空间中的虚地址。该宏在内核2.4.0中的实现是临时性的。具体的实现函数在arch/i386/lib/iodebug.c文件。
  
    显然,在x86平台上访问i/o内存资源与访问系统主存ram是无差别的。但是为了保证驱动程序的跨平台的可移植性,我们应该使用上面的函数来访问i/o内存资源,而不应该通过指向核心虚地址的指针来访问。   

毕业设计
2006-11-23 14:08

  周末帮小光搬家,好累啊!!
  上周调到将华恒网站的查询式键盘程序与写数据地址的驱动合并的程序cpld_drv没成功。今天将华恒的那个程序用set_gpio_ctl(),read_gpio_bit(),来实现,测试程序已经基本成功。
    程序由原来的mykeys4.c改写,驱动程序/mykeys4/key_drv.c.,用户程序/mykeys4/app/mykey
    今天想把输入和输出两个驱动程序合并,后来发现输入驱动程序是轮询的,也就是说必须不停的读,在键盘按下时正好读到才行,这样按照原计划,就不行了。所以先把输出调通,输入等最后再说吧!!!
  将计划改动一下:
  11。7  写一个简单的CPLD输出程序,熟悉烧写过程。
  11。8  写步进电机控制程序
  11。9 写步进电机程序
  11。10 烧写调试
  11。11和11。12两天监考
  11。13 和11。14调试成功。
  11。15和11。16调主程序,调试成功

毕业设计
2006-11-22 14:07

    今天要解决的问题是CPLD的引脚没赋值自己就亮了。
    解决问题真挺难的,需要你多想办法从多方面去尝试,说说容易,做起来难,面对莫名其妙的问题,谁也不能确定一定能解决所以有时会灰心的。
    通过对keyled1的调试,我发现灯的引脚赋值不对,将引脚赋值为MOTOEN(灯),则能控制灯的亮灭,但是没有控制的灯还是亮的,不知道什么原因;
  将mygpio程序改写为输入数据和地址参数,然后自动完成向一地址内写数据的程序。应该得到效果如下:
写A2    输出1引脚                      效果
1c        VD5。VD19                      灯1亮 
0c        VD5                            灭
2c        VD5,VD21                    灯2亮
0c        VD5                          灯2灭
4c        VD5,VD23                    灯3亮
8c        VD5,VD10                    灯4亮
16c      VD5,VD12                      蜂鸣器响

实验
2006-11-19 14:06

    今天上午将输出调成功,程序放在/cpldt里面,实现效果如前面日志中所述一致。下面将调电机控制部分;
  近期计划:
  11。14--11。15 电机调好。
  11。16-11。17  输入调好;
  11。18--11。19  总体调试程序
  分析cpldt程序:当写入数据1111 1110时灯1(54脚)亮,此时测得MOTO1EN脚的电压为4。5V,这样看来似乎与预计不符,因为该引脚写的是‘0’,经分析电路图后,发现,当灯引脚写‘0’后,光电耦合器导通,所以MOTO1EN输出高电平。
为了证明结论是正确的,同时测量了Y0,Y1,Y2引脚电压均为3。1V即为高电平‘1’与写入数据相符和。
   

共10篇日记