嵌入式杂项

来源:互联网 发布:007支票打印软件 编辑:程序博客网 时间:2024/04/30 12:05

   让自己网速快起来你可以 自己在系统中设置 步骤我给你写出来
  单击“开始→运行”命令,输入“gpedit.msc”后回车,运行“组策略”程序,
  依次展开“计算机配置→管理模板→网络→Qos数据包调度程序”,在右侧的
  窗口中双击“限制可保留带宽”项,打开“限制可保留带宽属性”对话框,
  选择“已启用”选项,然后在“带宽限制”中把数值设为“0”即可一起用一
  个..不要用软件封别人了.似乎很不好 :)


 win调用记事本 notepad
     计算器 calc
     画图工具 mspaint

*********************************************
#define EV_SYN 0x00
#define EV_KEY 0x01 //按键
#define EV_REL 0x02 //相对坐标(轨迹球)
#define EV_ABS 0x03 //绝对坐标
#define EV_MSC 0x04 //其他
#define EV_SW 0x05
#define EV_LED 0x11 //LED
#define EV_SND 0x12//声音
#define EV_REP 0x14//repeat
#define EV_FF 0x15
#define EV_PWR 0x16
#define EV_FF_STATUS 0x17
#define EV_MAX 0x1f
#define EV_CNT (EV_MAX+1)
*********************************************

  vi 取消撤销命令 ctrl + r

 产品经理常用的三款软件:
   用于思维分析的 mindmanager
   用于快速建立演示界面的Axure
   快速构建3D模型的Google sketchup3D

python -m SimpleHTTPServer
共享网络文件


******************************* 高端内存 *******************************************
 
Linux 把内核地址空间(0xc0000000 -- 0xfffffffff)划分为
   DMA区 NORMAL区 高端内存区
   16M  16M - 896M  剩下的128M
 对于超过1G物理内存的RAM ,内核无法访问,就借助128M的高端内存访问,
   比如访问 0x4000000 - 0x40010000 间的物理 1M 空间,就先在高端空间寻找空闲的 1M 地址
   然后把此地址映射到物理地址上,这样就可以访问高于1G的内存了;
*****************************************************************************

 

sed -i "s/123/234/g" main.c   //在命令中把mian.c里面的123替换成234

环境变量格式:
export PATH="/opt/STM/STLinux-2.3/devkit/sh4/bin:$PATH"

vi实现多行的空格缩进;
  :n,m,s/^/   /g
  其中n代表从n行开始
      m代表到m行结束
      g前面的空格为要缩进的空格个数;
     
 或者直接 v 几行,之后 <


****************************************************************

svn update -r 200 test.php   更新某文件到一个版本
svn diff -r 200:201 test.php  比较两文件的差异性
svn log|less   log信息从顶部向下显示,less是正续显示;

svn ci -m  "注释信息" 文件

****************************************************************

  在浏览器上输入 file:///F:/工作资料
  就可以打开本地F盘的工作资料 目录

 

  dmesg 显示内核开机信息,也可以用来查看usb插入之后的信息
  dmesg |grep usb
  cat /proc/kmsg &


 vi 一下波浪线代表把当前小写变大写,大写变小写

**********************************************************************************************

3. 遍历文件夹grep一个字符串
find . -name "*c" | xargs grep "strings"
在当前文件夹下所有c文件中查找字符串“string”

要么直接 grep -inR \string /文件路径


************************************************
ubunt 快捷键使用
 ctrl + L 代表clear命令
 ctrl + D 代表返回桌面命令,此命令要自己设置 /seting/keyboard/shortcut...
************************************************


/mnt # time cp /tmp/sd2/sd1/\[Andorid开发视频教学\]01_27_项目功能分4 ./
real    0m 2.20s
user    0m 0.03s
sys     0m 1.07s


***********************************************
ubuntu解压命令全览
.tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
注:tar是打包,不是压缩!
~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~
.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~
.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~
.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~
.bz
解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知
.tar.bz
解压:tar jxvf FileName.tar.bz
压缩:未知
~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~
.Z
解压:uncompress FileName.Z
压缩:compress FileName
.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName
~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~
.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~
.rar
解压:rar x FileName.rar
压缩:rar a FileName.rar DirName
rar请到:
http://www.rarsoft.com/download.htm 下载!
解压后请将rar_static拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp rar_static /usr/bin/rar
~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~
.lha
解压:lha -e FileName.lha
压缩:lha -a FileName.lha FileName
lha请到:
http://www.infor.kanazawa-it.ac.jp/~ishii/lhaunix/下载!
>解压后请将lha拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp lha /usr/bin/
~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~
.rpm
解包:rpm2cpio FileName.rpm | cpio -div
~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~
.deb
解包:ar p FileName.deb data.tar.gz | tar zxf -
~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.
tar .tgz .tar.gz .tar.Z .tar.bz .tar.bz2 .zip .cpio .rpm .deb .slp .arj .rar .ace .lha .lzh .lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea
解压:sEx x FileName.*压缩:sEx a FileName.* FileName

***********************************************************************************************

 

************************************************************************

通常我们会在.vimrc中设置缩进,不过编辑源代码的时候粘贴就出问题了,粘贴的代码每行会多一次缩进,结果就面目全非了,解决方法是先设置为粘贴模式:
  
   :set paste

   内核中字符串的拼接
   char name[20];
   sprintf(name,"empty%d",i);字符串拼接;
  
  
dd命令是linux下非常有用的一个命令,作用就是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换


vim在两个大括号之间的跳转,% ,在括号位置按%;
D 表示删除光标后面的所有字符,直至一行结尾处;


************************************************************************
                        DMA申请和使用的所有笔记
                       
内存中用于与外设交互数据的一块区域被称做DMA缓冲区,在设备不支持scatter/gather CSG,
分散/聚集操作的情况下,DMA缓冲区必须是物理上连续的。 

在分配内存时,系统会尽量给我们分配连续的物理内存,这样有什么好处呢?我知道的有如下2条:

1、DMA不使用页表机制,因此必须分配连续的物理内存。
2、使用连续物理内存可以提高系统整体性能。                     
                       
                        申请DMA设备

像使用中断一样,在使用DMA之前,设备驱动程序需要首先向系统申请DMA通道,
申请DMA通道的函数如下:
int request_dma(unsigned int dmanr, const char * device_id); 

同样的,设备结构体指针可作为传入device_id的最佳参数。
使用完DMA通道后,应该使用如下函数释放该通道:
void free_dma(unsinged int dmanr);
                      
                        DMA映射
                       
DMA映射包括两个方面的工作:分配一片DMA缓冲区;为这片缓冲区产生设备可访问的地址
。结合前面所讲的,DMA映射必须考虑Cache一致性问题。
Cache的一致性就是指Cache中的数据,与对应的内存中的数据是一致的。

内核中提供了以下函数用于分配一个DMA一致性的内存区域:
void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp);

以下函数用于分配一个写合并(writecombinbing)的DMA缓冲区:
void *dma_alloc_writecombine(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp);

                         流式DMA映射(单物理地址连续的缓冲区)
                        
对于单个已经分配的缓冲区而言,使用dma_map_single()可实现流式DMA映射:
dma_addr_t dma_map_single(struct device *dev, void *buffer, size_t size, enum dma_data_direction direction);
 如果映射成功,返回的是总线地址,否则返回NULL.最后一个参数DMA的方向,可能取DMA_TO_DEVICE, DMA_FORM_DEVICE, DMA_BIDIRECTIONAL和DMA_NONE;
 与之对应的反函数是:void dma_unmap_single(struct device *dev,dma_addr_t *dma_addrp,size_t size,enum dma_data_direction direction);
 
 
                        驱动访问流式DMA映射
 通常情况下,设备驱动不应该访问unmap()的流式DMA缓冲区,如果确实要访问的话,就使用下面的函数操作
 这时可先使用如下函数获得DMA缓冲区的拥有权:
void dma_sync_single_for_cpu(struct device *dev,dma_handle_t bus_addr, size_t size, enum dma_data_direction direction);
在驱动访问完DMA缓冲区后,应该将其所有权还给设备,通过下面的函数:
void dma_sync_single_for_device(struct device *dev,dma_handle_t bus_addr, size_t size, enum dma_data_direction direction);
 
                        基于分散/聚集的DMA缓冲区映射(物理地址不连续的多缓冲区)
   
如果设备要求较大的DMA缓冲区,在其支持SG模式的情况下,申请多个不连续的、相对较小的DMA 
缓冲区通常是防止申请太大的连续物理空间的方法。在Linux内核中,使用如下函数映射SG:
int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
enum dma_data_direction direction);
nents是散列表(scatterlist)入口的数量,该函数的返回值是DMA缓冲区的数量,可能小于nents。对
于scatterlist中的每个项目,dma_map_sg()为设备产生恰当的总线地址,它会合并物理上临近的内存区域。
scatterlist结构体的定义如代码清单11.18所示,它包含了scatterlist对应的page结构体指针、缓冲区
在page中的偏移(offset)、缓冲区长度(length)以及总线地址(dma_address)。

执行dma_map_sg()后,通过sg_dma_address()可返回scatterlist对应缓冲区的总线地址,sg_dma_len()
可返回scatterlist对应缓冲区的长度
如果设备驱动一定要访问映射情况下的SG缓冲区,应该先调用如下函数:
int dma_sync_sg_for_cpu(struct device *dev,struct scatterlist *sg, int nents,enum dma_data_direction direction);

访问完后,通过下列函数将所有权返回给设备:
int dma_map_device(struct device *dev,struct scatterlist *sg, int nents,enum dma_data_direction direction);
                    
                       
***********************************************************************


copy_from_user((void *)&bl_val, (const void *)arg, sizeof(unsigned long));

copy_to_user((void *)arg, (const void *)&bl_val, sizeof(unsigned long));


********************************  shell  *****************************
   ln的链接又软链接和硬链接两种,软链接就是ln -s ** **,它只会在你选定的位置上生成一个文件的镜像,
不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,
无论是软链接还是硬链接,文件都保持同步变化。软链接是可以跨分区的,但是硬链接只能在同一分区内

**********************************************************************

Linux内核结构体
 struct file
   file_operatiorn  f_op;   //操作函数接口
   mode_t         f_mode;   //读写模式
   void*    private_data;   //私有数据指针
   unsigned int  f_flags;   //阻塞与非阻塞
  
 struct inode   // inode包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息
   struct block_device* i_bdev;
   struct cdev*          c_dev;
 
 struct cdev 
  struct module *owner;
   const struct file_operations *ops;
  struct list_head              list;
  dev_t                          dev;
  unsigned int                 count;
  
 struct device
     struct semaphore         sem;
     struct bus_type         * bus;
     void             *driver_data;   /* data private to the driver */
     void           *platform_data;   /* Platform specific data, device
     struct class           *class;
    
 ***************************************************************************************************
 *************************************************
   find / -amin -10 # 查找在系统中最后10分钟访问的文件
 *************************************************
 
 *************************************************
 int  main(int argc,char** argv){
  char str[10];
  strcpy(str,argv[1]);             //字符的输入拷贝
  int value;
  value = strtoul(argv[2],NULL,0); //数字的输入拷贝
 }
 
./a.out score 100
打印 参数二(字符串) 参数三(数字) 

**************************************************

fflush(stdout)当然是清空stdout的缓冲区了
就是有输出就直接输出,不会积累到缓冲区满了再输出
   你可以试试下面的代码
    int i;
    for (i=0;i<10;i++)
    {
      printf("%d",i);
      // fflush(stdout);
    sleep(1);
    }
   
   再去掉注释试试就知道了
 一般就是在输出打印之后加上fflush函数;
**************************************


********************** poll 的实现  **************************

poll的实现是基于等待队列的(睡眠与唤醒,得不到数据而睡眠),但是与一般等待队列的使用方法是不一样的,
poll的实现只要定义等待队列头就可以了,不需要定义等待队列
   1)定义
      wait_queue_head_t poll_wait_queue;
   2)初始化等待队列头
      init_waitqueue_head(&g_innov_notifier_priv.poll_wait_queue);
   3)在poll函数里实现
      poll_wait(filp, &g_innov_notifier_priv.poll_wait_queue, poll_table);
   4)在中断里唤醒
      wake_up_interruptible(&g_innov_notifier_priv.poll_wait_queue);
**************************************************************

 

********************* 等待队列的一般用法 *********************

1) 定义和初始化等待队列头

wait_queue_head_t wqh;//定义等待队列头类型变量
init_waitqueue_head(wait_queue_head_t *wqh);//初始化等待队列头
DECLARE_WAIT_QUEUE_HEAD(name);//定义并初始化等待队列头

2) 定义和初始化等待队列

DECLARE_WAITQUEUE(name,task);//定义并初始化一个名为name的等待队列,task通常被设置为代表当前进程的current指针。

3) 添加/移除等待队列

add_wait_queue(wait_queue_head_t *q,wait_queue_t wait);
remove_wait_queue(wait_queue_head_t *q,wait_queue_t *wait);
前者是将等待队列wait添加到等待队列头q指向的等待队列数据链中,后者从中移除。

4) 等待事件

wait_event(queue,condition);//当condition为真时,立即返回;否则进程进入TASK_UNINTERRUPTIBLE类型的睡眠状态,并挂在queue指定的等待队列数据链上。
wait_event_interruptible(queue,condition);//当condition为真时,立即返回;否则进程进入TASK_INTERRUPTIBLE类型的睡眠状态,并挂在queue指定的等待队列数据链上。
wait_event_killable(queue,condition);//当condition为真时,立即返回;否则进程进入TASK_KILLABLE类型的睡眠状态,并挂在queue指定的等待队列数据链上。
wait_event_timeout(queue,condition);//当condition为真时,立即返回;否则进程进入TASK_UNINTERRUPTIBLE类型的睡眠状态,并挂在queue指定的等待队列数据链上;当阻塞时间timeout超时后,立即返回。
wait_event_interruptible_timeout(queue,condition);//当condition为真时,立即返回;否则进程进入TASK_INTERRUPTIBLE类型的睡眠状态,并挂在queue指定的等待队列数据链上;当阻塞时间timeout超时后,立即返回。

5) 唤醒队列

wake_up(wait_queue_head_t *queue);//唤醒由queue指向的队列数据链中的所有睡眠类型的等待进程。
wake_up_interruptible(wait_queue_head_t *queue);//唤醒由queue指向的队列数据链中的所有睡眠类型为TASK_INTERRUPTIBLE的等待进程。

*******************************************************************************

 


********************************** 三层内存的物理申请 *************************
  
*** #define TCC_MEM_SIZE " mem=422M"
  #define TCC_VPU_SIZE 56
#else
   /arch/arm/kernel/setup.c
  char *tcc_mem_size = TCC_MEM_SIZE;
 strcat(default_command_line, tcc_mem_size);
 
 等价于 strcat(default_command_line, mem=422M ); 这样就预留了(512-422)M空间地址;
 在Linux内核引导时,传入参数“mem=size”保留顶部的内存区间。比如系统有256MB内 存,
 参数“mem=248M”会预留顶部的8MB内存,进入系统后可以调用ioremap(0xF800000,0x800000)来申请这段内存
 
 ********************************************************************************
  
  
   **************************** printk ***********************************
  #if   DEBUG
  #define DDD(fmt, arg...) do{printk("[%s:%d]" fmt "\n", __func__, __LINE__, ##arg);}while(0)
  #else
  #define DDD(fmt, arg...)
  #endif
  
   ***********************************************************************
  
   冷格就是在升级系统前对硬盘进行的格式化,可以将一个分区格式化为不同的文件系统
   mkfs.ext3 是最常用的命令之后. 跟他同一效果的命令是 mkfs -t ext3  都将会把指定分区格式化为ext3格式。
   例如:
   比如我们用fdisk /dev/sda 给磁盘先分了一个分区 /dev/sda5 分区完记得执行partprobe将分区信息写入内核.
   此时必须把分区格式化之后,才可以挂载到文件系统.
   mkfs.ext3 /dev/sda5   格式化完毕之后,就可以正常挂载了  mount /dev/sda5 /data
  
   mkdosfs 
   mkdosfs -n Tester /dev/fd0 将 A 槽里的磁碟片格式化为 DOS 格式,并将标签设为 Tester

******************************************************************************************************

要将目录/modules下面所有文件中的zhangsan都修改成lisi,这样做:
 
 sed -i "s/zhangsan/lisi/g" `grep zhangsan -rl /modules`

  解释一下:
   -i 表示inplace edit,就地修改文件
   -r 表示搜索子目录 
   -l 表示输出匹配的文件名
  只修改一个文件,后面的grep就不需要了...
******************************************************************************************************

  du -sh  disk   查看disk文件夹的大小
  
 
  
  #if 01
  #define DDD(fmt, arg...)
  #else
  #define DDD(fmt, arg...) do{printk("[%s:%d]" fmt "\n", __func__, __LINE__, ##arg);}while(0)
  #endif 


******************************************************************************************************


device_create()

功能:该函数创建一个设备并将其注册到sysfs中,同时在系统的sys/class和sys/device目录下会生成相应的类和设备入口。并且,该函数还会出发用户空间udev的动作,udev会根据sysfs下的class在/dev目录下创建设备节点,这也为自动创建设备节点提供了一种途径。通过device_create()函数,我们就可以不用通过mknod命令手动的创建设备节点了


******************************************************************************************************

0 0
原创粉丝点击