Hi  你好~!
我是個韌體工程師  ,目前在新竹 ,台灣工作
喜歡運動,跑步,衝浪      也熱愛  攝影     

bkboy 發表在 痞客邦 留言(0) 人氣()

00102S
屬於 ,自己的這一年

  
  這一年,充其也只是個量詞。並非時間長短,亦非攸關於外表長相,挑剔程度,人際關係。這一年就是個階段、是個時期。首先以這樣的身分來看待與評論這件事,各位看完有任何感想或是批評,相當樂意接受大家的聲音。
 

bkboy 發表在 痞客邦 留言(0) 人氣()

043S
那 些 年 沒 為 你 做 的 事
原文於Bret Huang 臉書,於2014-03-03發佈於痞客幫
  我說人阿,一生中,能夠遇到幾個貴人,很 確幸 的是,到目前為止,除了爸媽家人。我曾遇見一個沒有任何血緣關係的,貴人。至少我知道,難過,悲傷,開心的時候,我都會想起這個貴人,謝謝你,渡 人 者。一路上,我會看著你幸福,祝你幸福。謝謝你。

bkboy 發表在 痞客邦 留言(0) 人氣()

004-2
原文於Bret Huang 臉書,於2014-03-03發佈於痞客幫
 
謝 ‧ 謝 ‧ 大 ‧ 家
塗鴉牆上的那些好朋友~TAG已經標到緊繃了,有些沒標到的,再用留言來TAG。
sorry
前一天上班撥空電話祝福的廖哥~還有傳送簡訊App的這兩位

bkboy 發表在 痞客邦 留言(0) 人氣()

012.jpg
用我的單眼 帶環遊世界 【玉龍雪山】
我是 阿 B 
帶妳四處去走跳


 

bkboy 發表在 痞客邦 留言(0) 人氣()

0012
勤美誠品綠園道
CMP Block Museum of Arts
  

bkboy 發表在 痞客邦 留言(0) 人氣()

Specialty Knowhow
Computer Science and Engineer is my department ,major in 

bkboy 發表在 痞客邦 留言(0) 人氣()


1KB (Kilo Byte) 等於 1024 個 byte﹔
1MB (Mage Byte) 等於 1024 個 KB﹔
1GB( Giga Byte) 等於 1024 個 MB

bkboy 發表在 痞客邦 留言(0) 人氣()

volatile可以保證對特殊地址的穩定訪問
用volatile宣告的變數,每次都會去ram裡面去取它真正的值。
沒用volatile宣告的變數,直接去cache裡取值,此時有可能ram裡面此變數真正的值已被更改,造成資料不同步。
使用該關鍵字的例子如下:
int volatile nVint;
  當要求使用volatile 聲明的變量的值的時候,系統總是重新從它所在的內存讀取數據,即
使它前面的指令剛剛從該處讀取過數據。而且讀取的數據立刻被保存。
例如:
volatile int i=10;
int a = i;
...
//其他代碼,並未明確告訴編譯器,對i進行過操作
int b = i;

bkboy 發表在 痞客邦 留言(0) 人氣()


先看看kernel裡的定義:
/** * kzalloc - allocate memory. The memory is set to zero. * @size: how many bytes of memory are required. * @flags: the type of memory to allocate (see kmalloc). */ static inline void *kzalloc (size_t size, gfp_t flags) { return kmalloc(size, flags | __GFP_ZERO); }
 kzalloc實現了kmalloc以及memset的功能,一個函數起到了兩個函數的作用

bkboy 發表在 痞客邦 留言(0) 人氣()


程序中,一個process同時處理多個 檔案描述子  (File descript)是很常見的情況。select()系統調用可以使進程檢測同時等待的多個I/O設備,當沒有設備準備好時,select()阻塞,其中任一設備準備好時,select()就返回。 
select()的調用形式為: 
#include <sys/select.h> 
#include <sys/time.h> 
int select(int maxfd, fd_set *readfds, fd_set *writefds, fe_set *exceptfds, const struct timeval *timeout); 
select的第一個參數是 FD  (File descript)集中要被檢測的比特數,這個值必須至少比待檢測的最大 FD  (File descript)大1;參數readfds指定了被讀監控的文件描述 符集;參數writefds指定了被寫監控的 FD  (File descript)集;而參數exceptfds指定了被例外條件監控的 FD  (File descript)集。 
參數timeout起了定時器的作用:到了指定的時間,無論是否有設備準備好,都返回調用。timeval的結構定義如下: 
struct timeval{ 
long tv_sec; //表示幾秒 
long tv_usec; //表示幾微妙 

timeout取不同的值,該調用就表現不同的性質: 
1.timeout為0,調用立即返回; 
2.timeout為NULL,select()調用就阻塞,直到知道有 FD  (File descript)就緒; 
3.timeout為正整數,就是一般的定時器。 
select調用返回時,除了那些已經就緒的描述符外,select將清除readfds、writefds和exceptfds中的所有沒有就緒的描述符。select的返回值有如下情況: 
1.正常情況下返回就緒的 FD  (File descript)個數; 
2.經過了timeout時長後仍無設備準備好,返回值為0; 
3.如果select被某個信號中斷,它將返回-1並設置errno為EINTR。 
4.如果出錯,返回-1並設置相應的errno。 
系統提供了4個宏對描述符集進行操作: 
#include <sys/select.h> 
#include <sys/time.h> 
void FD_SET(int fd, fd_set *fdset); 
void FD_CLR(int fd, fd_set *fdset); 
void FD_ISSET(int fd, fd_set *fdset); 
void FD_ZERO(fd_set *fdset); 
宏FD_SET設置 FD  (File descript)集fdset中對應於 FD  (File descript)fd的位(設置為1),宏FD_CLR清除 FD  (File descript)集fdset中對應於 FD  (File descript)fd的 位(設置為0),宏FD_ZERO清除 FD  (File descript)集fdset中的所有位(既把所有位都設置為0)。使用這3個宏在調用select前設置描述符屏蔽位, 在調用select後使用FD_ISSET來檢測 FD  (File descript)集fdset中對應於 FD  (File descript)fd的位是否被設置。 
過去,描述符集被作為一個整數位屏蔽碼得到實現,但是這種實現對於多於32個的 FD  (File descript)將無法工作。描述符集現在通常用整數數組中的位域表示,數組元素 的每一位對應一個 FD  (File descript)。例如,一個整數佔32位,那麼整數數組的第一個元素代表 FD  (File descript)0到31,數組的第二個元素代表 FD  (File descript)32到63,以 此類推。宏FD_SET設置整數數組中對應於fd FD  (File descript)的位為1,宏FD_CLR設置整數數組中對應於fd FD  (File descript)的位為0,宏FD_ZERO設置 整數數組中的所有位都為0。假設執行如下程序後: 
#include <sys/select.h> 
#include <sys/time.h> 
fd_set readset; 
FD_ZERO(&readset); 
FD_SET(5, &readset); 
FD_SET(33, &readset); 
則 FD  (File descript)集readset中對應於 FD  (File descript)6和33的相應位被置為1,如圖1所示: 
再執行如下程序後: 
FD_CLR(5, &readset); 
則 FD  (File descript)集readset對應於 FD  (File descript)6的相應位被置為0,如圖2所示: 
通常,操作系統通過宏FD_SETSIZE來聲明在一個進程中select所能操作的 FD  (File descript)的最大數目。例如: 
在4.4BSD的頭文件中我們可以看到: 
#ifndef FD_SETSIZE 
#define FD_SETSIZE 1024 
#endif 
在紅帽Linux的頭文件<bits/types.h>中我們可以看到: 
#define __FD_SETSIZE 1024 
以及在頭文件<sys/select.h>中我們可以看到: 
#include <bits/types.h> 
#define FD_SETSIZE __FD_SETSIZE 
既定義FD_SETSIZE為1024,一個整數佔4個字節,既32位,那麼就是用包含32個元素的整數數組來表示 FD  (File descript)集。我們可以在頭文件中修改 這個值來改變select使用的 FD  (File descript)集的大小,但是必須重新編譯內核才能使修改後的值有效。當前版本的unix操作系統沒有限制 FD_SETSIZE的最大值,通常只受內存以及系統管理上的限制。 
我們明白了 FD  (File descript)集的實現機制之後,就可對其進行靈活運用。(以下程序在紅帽Linux 6.0下運行通過,函數fd_isempty用於判斷 FD  (File descript)集是否為空;函數fd_fetch取出 FD  (File descript)集中的所有 FD  (File descript)) 
#include <stdio.h> 
#include <string.h> 
#include <sys/time.h> 
#include <sys/select.h> 
struct my_fd_set{ 
fd_set fs; //定義 FD  (File descript)集fs 
unsigned int nconnect; // FD  (File descript)集fs中 FD  (File descript)的個數 
unsigned int nmaxfd; // FD  (File descript)集fs中最大的 FD  (File descript) 
}; 
/* 函數fd_isempty用於判斷 FD  (File descript)集是否為空,為空返回1,不為空則返回0 */ 
int fd_isempty(struct my_fd_set *pfs) 

int i; 
/*  FD  (File descript)集fd_set是通過整數數組來實現的,所以定義整數數組myset的元素個數為 FD  (File descript)集fd_set所佔內存空間的字節數除以整數所佔內存空間的字節數。 
*/ 
unsigned int myset[sizeof(fd_set) / sizeof(int)]; 
/* 把 FD  (File descript)集pfs->fs 拷貝到數組myset */ 
memcpy(myset, &pfs->fs, sizeof(fd_set)); 
for(i = 0; i < sizeof(fd_set) / sizeof(int); i++) 
/* 如果myset的某個元素不為0,說明 FD  (File descript)集不為空,則函數返回0 */ 
if (myset[i]) 
return 0; 
return 1; /* 如果myset的所有元素都為0,說明 FD  (File descript)集為空,則函數返回1 */ 

/* 函數fd_fetch對 FD  (File descript)集進行位操作,把為1的位換算成相應的 FD  (File descript),然後就可對其進行I/O操作 */ 
void fd_fetch(struct my_fd_set *pfs) 

struct my_fd_set *tempset; //定義一個臨時的結構指針 
unsigned int myset[sizeof(fd_set)/sizeof(unsigned int)]; 
unsigned int i, nbit, nfind, ntemp; 
tempset = pfs; 
memcpy(myset, &tempset->fs, sizeof(fd_set)); 
/* 把最大的 FD  (File descript)maxfd除以整數所佔的位數,得出maxfd在 FD  (File descript)集中相應的位對應於整數數組myset的相應元素的下標,目的是為了減少檢索的次數 */ 
nfind = tempset->nmaxfd / (sizeof(int)*8); 
for (i = 0; i <= nfind; i++) { 
/* 如果數組myset的某個元素為0,說明這個元素所對應的 FD  (File descript)集的32位全為0,則繼續判斷下一元素。*/ 
if (myset[i] == 0) continue; 
/* 如果數組myset的某個元素不為0,說明這個元素所對應的 FD  (File descript)集的32位中有為1的,把myset[i]賦值給臨時變量ntemp,對ntemp進行位運算,把為1的位換算成相應的 FD  (File descript) */ 
ntemp = myset[i]; 
/* nbit記錄整數的二進制位數,對ntemp從低到高位進行&1運算,直到整數的最高位,或直到 FD  (File descript)集中 FD  (File descript)的個數等於0 */ 
for (nbit = 0; tempset->nconnect && (nbit < sizeof(int)*8); nbit++) { 
if (ntemp & 1) { 
/* 如果某位為1,則可得到對應的 FD  (File descript)為nbit + 32*I,然後我們可對其進行I/O操作。這裡我只是做了簡單的顯示。*/ 
printf("i = %d, nbit = %d, The file description is %d\n", i, nbit, nbit + 32*i); 
/* 取出一個 FD  (File descript)後,將 FD  (File descript)集中 FD  (File descript)的個數減1 */ 
tempset->nconnect--; } 
ntemp >>= 1; // ntemp右移一位 



/* 下面的主程序是對以上兩個函數的測試 */ 
main() 

/* 假設fd1,fd2,fd3為3個 FD  (File descript),實際運用中可為Socket描述符等 */ 
int fd1 = 7, fd2 = 256, fd3 = 1023, isempty; 
struct my_fd_set connect_set; 
connect_set.nconnect = 0; 
connect_set.nmaxfd = 0; 
FD_ZERO(&connect_set.fs); 
/* FD_SET操作前對函數fd_isempty進行測試 */ 
isempty = fd_isempty(&connect_set); 
printf("isempty = %d\n", isempty); 
FD_SET(fd1, &connect_set.fs); 
FD_SET(fd2, &connect_set.fs); 
FD_SET(fd3, &connect_set.fs); 
connect_set.nconnect = 3; 
connect_set.nmaxfd = fd3 ; 
/* FD_SET操作後,既把 FD  (File descript)加入到 FD  (File descript)集之後,對函數fd_isempty進行測試 */ 
isempty = fd_isempty(&connect_set); 
printf("isempty = %d\n", isempty); 
/* 對函數fd_ fetch進行測試 */ 
fd_fetch(&connect_set); 

/* 程序輸出結果為 :*/ 
isempty is 1 
isempty is 0 
i = 0, nbit = 7, The file description is 7 
i = 8, nbit = 0, The file description is 256 
i = 31, nbit = 31, The file description is 1023

bkboy 發表在 痞客邦 留言(0) 人氣()


Bulk-Only事務
主機向設備發送CBW(Command Block Warp)包,並以建立相應的數據傳輸開始的,設備接收到CBW包,檢查並解釋它,試圖滿足主機的要求,並通過CSW(Command State Wrap)包向主機返回狀態信息。

bkboy 發表在 痞客邦 留言(0) 人氣()

1 2 3
Blog Stats
⚠️

成人內容提醒

本部落格內容僅限年滿十八歲者瀏覽。
若您未滿十八歲,請立即離開。

已滿十八歲者,亦請勿將內容提供給未成年人士。