嵌入式雜項

   讓自己網速快起來你可以 自己在系統中設置 步驟我給你寫出來
  單擊“開始→運行”命令,輸入“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命令手動的創建設備節點了


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章