亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? firmware.html

?? USB驅動使用比較詳細的一個例子
?? HTML
?? 第 1 頁 / 共 2 頁
字號:
<html><head><title>FirmWare</title></head><body><p align="center"><font color="#FF0000"><b>MiniNurse(MN)固件源代碼及其分析</b></font></p><blockquote>  <blockquote><p><br>對于像c51這樣簡單的芯片,其固件就相當于操作系統,一個相當原始和粗糙的操作系統。下面是一個"Hello World"性質的固件片斷(C for51),我做了一些注釋:</p>         <blockquote>      <p>void main (void)&nbsp;&nbsp;&nbsp; <font color="#808080">/* 芯片加電后PC為0,轉到這里執行。         */</font><br>     {<br>    &nbsp;&nbsp;&nbsp; <font color="#808080">/* 這里可能會有中斷、定時器、等的初始化代碼         */</font><br>     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(1) {&nbsp;&nbsp;&nbsp; <font color="#808080">/* 注意!一個死循環,這正是固件成為操作系統的原因。         */</font><br>     &nbsp;&nbsp;&nbsp;&nbsp;<font color="#808080">/*        如果沒有這個循環執行完后面的代碼后,芯片會處于空閑狀態。只有重置才能喚醒它。        */</font><br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P1 ^0= 0x01;&nbsp;&nbsp;&nbsp; <font color="#808080">/*         這兩行就是我們的示例代碼,它們是唯一的“進程”,一直被執行。        */</font><br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf ("Hello World\n");&nbsp;&nbsp;&nbsp;        <font color="#808080">/* printf()通常會從51的串口輸出。*/</font><br>     &nbsp;&nbsp;&nbsp; }<br>       }</p>    </blockquote><p>MN的固件要比這復雜。它的固件是分層的,這對固件的可理解性、可移植性以及健壯性都非常重要。比如,如果換用Motorola或者其它種類的單片機,只需要修改最底層的代碼就可以了,這個工作量是非常小的。又如要擴展MN的功能,只要添加相應的廠商請求部分以及可能的主循環(mainloop.c)代碼,這個工作量會因為擴展的功能而異,但如果不是分層,代碼的維護將會是可怕的。<br> <br>MN的固件代碼,分成以下幾個層次:<a href="#硬件抽象層:base_io.c base_io.h">硬件抽象層</a>,<a href="#D12命令接口:D12_comm_if.c D12_comm_if.h">D12命令接口</a>,<a href="#中斷服務例程:isr.c">中斷服務例程</a>,<a href="#USB標準請求:usb_standard_request.c usb_standard_request.h">USB標準請求</a>、<a href="#USB廠商請求:usb_usr_request.c usb_usr_request.h">廠商請求</a>,<a href="#主循環:mainloop.c mainloop.h">主循環</a>等。</p>  </blockquote></blockquote><p> </p><blockquote>  <p><font color="#000080"><b><a name="硬件抽象層:base_io.c base_io.h">硬件抽象層:base_io.c base_io.h</a></b></font></p>      <blockquote><p>該層定義了C51和D12通訊的方法。base_io.h中聲明了兩個函數(復用方式):</p>     <blockquote>    <p>	void outportb(unsigned int Addr,unsigned char Data);<br>    	unsigned char inportb(unsigned int Addr);</p>       </blockquote><p>outportb()為發送信息到D12,inportb()相反。<br> <br>51和D12之間的信息有數據和地址之分。在51看來,它連接的是一個特殊的擴展RAM,這個RAM只有兩個地址狀態。這個兩個地址狀態對于D12來說則意味著下次到達的信息是數據還是對它的控制命令。D12的手冊上說,偶數地址為數據,奇數地址為命令。參考outportb()的實現:</p>     <blockquote>    <p>void outportb(unsigned int Addr,unsigned char Data) {<br>    	*((unsigned char xdata *)Addr)=Data;<br>    	}</p>    </blockquote><p>在base_io.h中,有如下兩行:</p>     <blockquote>    <p>#define D12_Command 0xff03<br>       #define D12_Data&nbsp;&nbsp;&nbsp; 0xff02</p>       </blockquote><p>在更高層的代碼中,會經常看到類似如下的調用:</p>     <blockquote>    <p>outportb(D12_Command, 0xFD);</p>        </blockquote><p>這條語句說明0xFD是對D12的一個命令(該命令讀取芯片ID)。實現中的xdata是C for 51的擴展,被這個關鍵詞修飾的變量存儲在外部RAM中,前面說過,D12就相當與51的一個擴展RAM,所以這里就是在D12中。C for 51還有其它的擴展,可以參閱具體的編譯器文檔,它們之間有細微差別,本文只在必要的時候做必要的解釋。這里給出一種編譯器的擴展規則,僅供參考:</p>    </blockquote></blockquote><p align="center"><img border="0" src="../../Set%20of%20Docutments/FIRMWARE_Explicitly%20Declared%20Memory%20Types.png" width="648" height="276"><br>截取自C51</p><blockquote>  <blockquote><p>inportb()的實現方法與outportb()絕類,只是方向相反。<br><br> D12除了支持上面使用的這種所謂“復用方式”外,還支持非復用方式。這種方式通過控制D12上的A0管腳區分指令和數據。具體的參看D12手冊和硬件設計文檔。這種方式下需要修改outportb()和inportb()的實現,代碼和注釋如下。不過這種方式并沒有試驗成功,目前還不確定是否是固件的問題,僅示意!語言順序和那些看上去沒有意義的語言成份都是試圖符合D12的時序要求。</p>     <blockquote>    <p>void outportb(unsigned int Addr,unsigned char Data)	//send to D12<br>        {<br>    &nbsp;&nbsp;&nbsp; switch (Addr)&nbsp;&nbsp;&nbsp;	//in fact, 'Addr' should be described as 'Command or Data select word'<br>        &nbsp;&nbsp;&nbsp; {<br>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case D12_Command:&nbsp;&nbsp;&nbsp;        //send command-byte to D12<br>        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        A0c=D12_Command;<br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case D12_Data:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        //send data-byte to D12<br>        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A0c=D12_Data;<br>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>       &nbsp;&nbsp;&nbsp; }<br>       <br>    &nbsp;&nbsp;&nbsp; WRc=0;&nbsp;&nbsp;&nbsp; //Write immediately<br>        &nbsp;&nbsp;&nbsp; do {if (1+1==2);} while(0);&nbsp;&nbsp;&nbsp; //重復執行上行語句可能是更好的延時方法!<br>       &nbsp;&nbsp;&nbsp; P0=Data;<br>       &nbsp;&nbsp;&nbsp; do {if (1+1==2);} while(0);&nbsp;&nbsp;&nbsp; //重復執行上行語句可能是更好的延時方法!<br>       &nbsp;&nbsp;&nbsp; WRc=1;&nbsp;&nbsp;&nbsp; //enclose<br>       }<br>    <br>    unsigned char inportb(unsigned int Addr)	//receive from D12<br>        {<br>    &nbsp;&nbsp;&nbsp; unsigned char tmpData;<br>        &nbsp;&nbsp;&nbsp; switch (Addr)&nbsp;&nbsp;&nbsp;	//in fact, 'Addr' should be described as 'Command or Data select word'<br>        &nbsp;&nbsp;&nbsp; {<br>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case D12_Command:<br>        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A0c=D12_Command;<br>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case D12_Data:<br>        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A0c=D12_Data;<br>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        break;<br>    &nbsp;&nbsp;&nbsp; }<br>       <br>    &nbsp;&nbsp;&nbsp; RDc=0;&nbsp;&nbsp;&nbsp; //Read immediately<br>        &nbsp;&nbsp;&nbsp; do {if (1+1==2);} while(0);&nbsp;&nbsp;&nbsp; //重復執行上行語句可能是更好的延時方法!<br>       &nbsp;&nbsp;&nbsp; tmpData=P0;<br>       &nbsp;&nbsp;&nbsp; do {if (1+1==2);} while(0);&nbsp;&nbsp;&nbsp; //重復執行上行語句可能是更好的延時方法!<br>       &nbsp;&nbsp;&nbsp; RDc=1;&nbsp;&nbsp;&nbsp; //enclose<br>       &nbsp;&nbsp;&nbsp; return tmpData;<br>        }</p>    </blockquote>    <p align="center"><img border="0" src="../../Set%20of%20Docutments/FIRMWARE_D12_timing.PNG" width="743" height="468"><br>    截取自Philips PDIUSBD12手冊</p>       <p align="center"> </p>    <p align="center"> </p>  </blockquote>  <p><b><font color="#000080"><a name="D12命令接口:D12_comm_if.c D12_comm_if.h">D12命令接口:D12_comm_if.c D12_comm_if.h</a></font></b></p>      <blockquote><p>D12向外提供了十數條指令,芯片手冊上有詳細的列表和語法說明。D12_comm_if.h聲明了它們中的大多數,因為有幾條指令并沒有多少用處。D12_comm_if.c中的實現完全根據芯片手冊的定義而寫,沒有什么可以說的。仍以讀芯片ID的例子做示范性說明,這個命令似乎也沒有實際的用途,不過卻可以知道D12是否正常工作。<br> <br>讀芯片ID的命令號是0xFD,這個剛才看過了。該指令后跟兩個八位數據,方向是D12-->51。在實現中,可以看到發送命令后,讀了兩次數據。第一次讀到的是低位,第二次是高位,做了位操作后拼裝成一個16位整型返回。(是的,16位。8位單片機還能怎樣?)為了方便,將代碼再列下:</p>     <blockquote>    <p>unsigned short D12_ReadChipID(void)<br>        {<br>    &nbsp;&nbsp;&nbsp; unsigned short tmpi,tmpj;<br>        <br>    &nbsp;&nbsp;&nbsp; if(bEPPflags.bits.in_isr == 0)<br>        &nbsp;&nbsp;&nbsp; DISABLE;<br>       <br>    &nbsp;&nbsp;&nbsp; outportb(D12_Command, 0xFD);<br>        &nbsp;&nbsp;&nbsp; tmpi=inportb(D12_Data);<br>       &nbsp;&nbsp;&nbsp; tmpj=inportb(D12_Data);<br>       &nbsp;&nbsp;&nbsp; tmpi += (tmpj&lt;&lt;8);<br>        <br>    &nbsp;&nbsp;&nbsp; if(bEPPflags.bits.in_isr == 0)<br>        &nbsp;&nbsp;&nbsp; ENABLE;<br>       &nbsp;&nbsp;&nbsp; return tmpi;<br>        }</p>    </blockquote>    <p> </p>  </blockquote>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
1000精品久久久久久久久| 在线观看日韩一区| 毛片不卡一区二区| 婷婷国产在线综合| 图片区小说区国产精品视频| 午夜欧美电影在线观看| 亚洲综合色在线| 亚洲一级二级在线| 日韩成人精品在线观看| 男人的天堂亚洲一区| 久久精品国产久精国产爱| 精品一区二区三区的国产在线播放| 蜜臀精品一区二区三区在线观看| 蜜桃av一区二区三区电影| 精品一区精品二区高清| 成人自拍视频在线| 91丝袜美女网| 欧美一区二区黄色| 国产日韩影视精品| 亚洲一区二区三区视频在线播放| 亚洲高清视频中文字幕| 精品亚洲国内自在自线福利| 国产乱国产乱300精品| 成人一级视频在线观看| www.日韩精品| 在线不卡的av| 国产精品乱码一区二区三区软件 | 丝袜美腿成人在线| 久久精工是国产品牌吗| 不卡视频免费播放| 欧美一区二区三区日韩视频| 久久精品视频一区| 亚洲va韩国va欧美va精品| 韩日欧美一区二区三区| 一本大道久久a久久综合婷婷| 欧美一区二区三区四区在线观看 | www.日韩在线| 日韩一区二区在线播放| 国产精品美女久久久久久久久| 日韩av一级电影| 99九九99九九九视频精品| 欧美xingq一区二区| 一区二区三区.www| 国产成人精品亚洲午夜麻豆| 91精品国产手机| 亚洲男人的天堂av| 粉嫩aⅴ一区二区三区四区| 9191国产精品| 有码一区二区三区| 国产a久久麻豆| 欧美一区二区精品| 午夜精品久久一牛影视| 成人国产亚洲欧美成人综合网| 精品三级在线看| 丝袜亚洲另类丝袜在线| 91国偷自产一区二区三区观看 | 欧美精品国产精品| 一区二区久久久| 99久久综合99久久综合网站| 久久精品视频一区二区| 久久99精品视频| 欧美一级欧美三级在线观看| 香蕉久久夜色精品国产使用方法| 97久久人人超碰| 中文字幕免费观看一区| 春色校园综合激情亚洲| 中文字幕欧美区| 成人h精品动漫一区二区三区| 国产喂奶挤奶一区二区三区| 国产揄拍国内精品对白| 欧美大片在线观看| 久久精品免费观看| 精品国产青草久久久久福利| 六月丁香婷婷色狠狠久久| 538prom精品视频线放| 视频一区二区中文字幕| 91精品国产综合久久久久久| 午夜成人免费电影| 日韩精品资源二区在线| 九色综合狠狠综合久久| 久久久久久久久久久久电影| 国产一区二区三区免费| 欧美极品少妇xxxxⅹ高跟鞋| 成人一区二区视频| 亚洲激情网站免费观看| 欧美乱妇15p| 久久爱www久久做| 久久婷婷久久一区二区三区| 丁香婷婷综合激情五月色| 综合欧美亚洲日本| 欧美性猛片aaaaaaa做受| 免费成人在线播放| 久久亚洲综合色一区二区三区| 国产精品亚洲成人| 亚洲啪啪综合av一区二区三区| 在线观看成人小视频| 久久久www免费人成精品| 蜜桃一区二区三区在线| 久久网站最新地址| 在线区一区二视频| 久久国产尿小便嘘嘘尿| 亚洲视频一区二区免费在线观看| 在线看一区二区| 加勒比av一区二区| 国产精品网站在线| 91黄色激情网站| 久久精品国产99国产| 中文字幕日韩一区二区| 欧美一级在线免费| 91亚洲国产成人精品一区二三| 日韩激情视频网站| 国产精品欧美一级免费| 久久久精品黄色| 欧美日韩成人在线一区| 成人一区二区三区视频| 欧美96一区二区免费视频| 亚洲丝袜制服诱惑| 26uuu国产在线精品一区二区| 91网址在线看| 国产成人在线电影| 免费成人小视频| 亚洲一区二区三区四区中文字幕| 久久精品亚洲精品国产欧美kt∨| 欧美色图激情小说| 成人av电影在线播放| 久久99久久精品| 亚洲国产成人tv| 亚洲人吸女人奶水| 国产欧美一区二区精品婷婷| 51久久夜色精品国产麻豆| 色综合激情五月| av一区二区三区在线| 国产一区啦啦啦在线观看| 免费在线观看成人| 天天色天天操综合| 亚洲午夜久久久| 亚洲一区二区美女| 亚洲素人一区二区| 亚洲天堂a在线| 亚洲视频免费在线观看| 国产香蕉久久精品综合网| 欧美大片一区二区| 欧美一区二区三区视频在线观看| 欧美性淫爽ww久久久久无| 色婷婷狠狠综合| 91亚洲国产成人精品一区二三| va亚洲va日韩不卡在线观看| 国产成人精品影视| 国产成人av电影在线观看| 国产成人亚洲综合a∨婷婷| 国产福利一区在线观看| 国产精品一二三四区| 国产美女在线精品| 粉嫩高潮美女一区二区三区| 国产成人综合在线观看| 成人高清免费观看| 91看片淫黄大片一级在线观看| 99久久久久久| 在线视频观看一区| 欧美久久高跟鞋激| 日韩精品一区二区三区在线观看| 欧美一区二区三区四区五区 | 欧美哺乳videos| 2020国产精品| 中文字幕一区免费在线观看| 国产精品国产三级国产aⅴ中文| 中文字幕一区av| 亚洲午夜久久久久| 麻豆精品一区二区三区| 国产精品影音先锋| 99在线精品免费| 欧美高清你懂得| 欧美精品一区二区久久久| 777精品伊人久久久久大香线蕉| 91精品国产综合久久久久久漫画 | 蜜桃精品视频在线| 国产高清不卡一区| 色噜噜狠狠色综合欧洲selulu| 欧美色视频一区| 国产午夜久久久久| 亚洲福利一二三区| 国产又粗又猛又爽又黄91精品| 97se亚洲国产综合自在线不卡| 欧美性高清videossexo| 久久嫩草精品久久久精品一| 亚洲美女电影在线| 久久99精品久久久久久动态图| 成人一道本在线| 日韩视频一区在线观看| 国产精品久久久久一区二区三区| 午夜电影一区二区| 成人h动漫精品| 精品伦理精品一区| 亚洲午夜一区二区| 成+人+亚洲+综合天堂| 日韩午夜在线观看视频| 一区二区三区国产精华| 国产99久久精品| 日韩精品在线看片z| 亚洲乱码国产乱码精品精可以看|