M0模塊的讀寫操作_第1頁
M0模塊的讀寫操作_第2頁
M0模塊的讀寫操作_第3頁
M0模塊的讀寫操作_第4頁
M0模塊的讀寫操作_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、最新M0模塊的讀寫操作嵌入式系統(tǒng)是物聯(lián)網(wǎng)產(chǎn)業(yè)開展的核心推動力 中嵌協(xié)會 柏斯維 2022年8月7日*總理視察無錫時,提出在無錫加快建立“感知中國中心的指示。從此在國內不管是各級地方政府還是企業(yè)都很重視,并掀起了一個追逐物聯(lián)網(wǎng)的行動熱潮。一年過去了,再一次的解讀溫總理的“感知中國更具有現(xiàn)實意義和深遠的歷史意義。嵌入式與物聯(lián)網(wǎng)的關系 溫總理用經(jīng)典的四個字“感知中國全面描述和定義了物聯(lián)網(wǎng)產(chǎn)業(yè)的內涵。從字面上來理解,“感既是信息采集傳感器;“知信息處理運算、處理、控制、通信并通過互聯(lián)網(wǎng)進行信息傳遞和控制。這些都是嵌入式系統(tǒng)的特征實質。如果歸納一句話來理解總理“感知中國的含義,既是通過嵌入式系統(tǒng)智能終端

2、產(chǎn)品網(wǎng)絡化的過程實現(xiàn)感知的目的。 簡單講,物聯(lián)網(wǎng)是物與物、人與物之間的信息傳遞與控制。專業(yè)上講就應該是智能終端的網(wǎng)絡化。大家都知道,嵌入式系統(tǒng)無所不在,有嵌入式系統(tǒng)的地方才會有物聯(lián)網(wǎng)的應用。所以,我在所有的場合都在傳播一個理念,什么是物聯(lián)網(wǎng)呢?物聯(lián)網(wǎng)就是基于互聯(lián)網(wǎng)的嵌入式系統(tǒng)。從另一個意義也可以說,物聯(lián)網(wǎng)的產(chǎn)生是嵌入式系統(tǒng)高速開展的必然產(chǎn)物,更多的嵌入式智能終端產(chǎn)品有了聯(lián)網(wǎng)的需求,催生了物聯(lián)網(wǎng)這個概念的產(chǎn)生。記得是在09年10月12日,英特爾公司宣布成立中國研究院并且專攻嵌入式方向。在全球熱炒物聯(lián)網(wǎng)概念時,英特爾為什么不成立物聯(lián)網(wǎng)研究院?而專注嵌入式的研究呢。這是值得深思研究的課題。那么,在2

3、022英特爾信息技術峰會IDF的前一天,英特爾CTO賈斯汀和英特爾研究院方之熙院長一起宣布了英特爾中國研究院全新的研究戰(zhàn)略致力于打造世界一流的嵌入式系統(tǒng)研究院。方院長講到:作為英特爾研究院全球5大節(jié)點之一,英特爾中國研究院將承當嵌入式系統(tǒng)的前瞻性研究任務,放眼全球嵌入式增長機遇,融合國人智慧做世界級的研究,并將國際水準的研究成果直接奉獻于中國的開展。 中國 、互聯(lián)網(wǎng)、有線電視用戶人數(shù)均居全球第一,也已成為名副其實的世界第一汽車市場。從智能交通到車載信息設備,從“物聯(lián)網(wǎng)到智能家電,嵌入式移動互聯(lián)在中國開展前景廣闊。中國這么大的市場規(guī)模、這么快的增長速度,提供了很多非常好的研究課題。這些研究課題在

4、世界上也都是非常前沿的,為企業(yè)提供了很多的開展時機。 企業(yè)追逐的是利潤而不是概念。從以上例子就足以看出物聯(lián)網(wǎng)與嵌入式系統(tǒng)的關系、嵌入式系統(tǒng)的重要性、嵌入式系統(tǒng)在物聯(lián)網(wǎng)產(chǎn)業(yè)開展中的角色地位。嵌入式系統(tǒng)才是拉動GDP的增長和產(chǎn)業(yè)升級的真正動力。嵌入式系統(tǒng)才是物聯(lián)網(wǎng)產(chǎn)業(yè)開展的核心推動力。 物聯(lián)網(wǎng)人才需求與培養(yǎng) 企業(yè)開展科技進步離不開人才,特別是在21世紀科技高速開展的今天。毋庸置疑,物聯(lián)網(wǎng)的開展對人才的需求更是迫在眉睫,人才的短缺將是物聯(lián)網(wǎng)產(chǎn)業(yè)開展的瓶頸??梢赃@樣說,在物聯(lián)網(wǎng)產(chǎn)業(yè)開展中,有了人才就掌握了競爭的主動權,有了人才就占領了競爭的制高點。目前,在高等院校都紛紛加快物聯(lián)網(wǎng)相關的學科建設,社會培

5、訓機構也是人才培養(yǎng)的不可或缺的力量,特別是利用嵌入式系統(tǒng)的培訓機構,在嵌入式系統(tǒng)教學的根底上,增加通信、無線模塊、RFID、網(wǎng)絡等課程,就可以很快的適應物聯(lián)網(wǎng)技術開展的需求,這也是最快的人才培養(yǎng)捷徑之一。大力推動嵌入式與物聯(lián)網(wǎng)的人才引進和培訓,是為構筑物聯(lián)網(wǎng)產(chǎn)業(yè)開展創(chuàng)造人力資源的根底條件。 物聯(lián)網(wǎng)、云計算不是炒作,是嵌入式系統(tǒng)物聯(lián)與互聯(lián)網(wǎng)技術在高級階段上交叉融合變革時代產(chǎn)物。當物聯(lián)網(wǎng)熱鬧過后,必然會進入一個理性時代。深入了解嵌入式系統(tǒng)物聯(lián)史,有助于厘清物聯(lián)網(wǎng)、云計算的本質。目前,物聯(lián)網(wǎng)、云計算領域中,缺少嵌入式系統(tǒng)視角。物聯(lián)網(wǎng)系統(tǒng)構建、物聯(lián)網(wǎng)系統(tǒng)工程應用,是物聯(lián)網(wǎng)時代嵌入式系統(tǒng)的新機遇。下面由

6、卓躍教育為您介紹。單片、嵌入、物聯(lián)三位一體的嵌入式系統(tǒng)單片機與嵌入式系統(tǒng)是不同時代概念的同一事物,經(jīng)歷了許多不為人知的誕生環(huán)境與開展歷程。單片機概念出現(xiàn)在PC機誕生之前,PC機誕生后才有了嵌入式系統(tǒng)概念。無論是單片機還是嵌入式系統(tǒng),它們都呈現(xiàn)出單片、嵌入、物聯(lián)的三位一體的特征?!皢纹瑱C強調的是形態(tài),“嵌入式系統(tǒng)強調的是應用形式,“物聯(lián)那么是它們的本質。PC機出現(xiàn)后,計算機走出機房,成為群眾工具。計算領域、工業(yè)控制領域都寄希望于計算機,由此誕生了通用計算機系統(tǒng)與嵌入式計算機系統(tǒng)兩大概念。嵌入式計算機系統(tǒng)企圖沿襲PC機的模式,走單板機、工控機、單片微型計算機6801系列的道路,卻進入死胡同。在計算

7、機界,“嵌入式計算機系統(tǒng)死亡了,“嵌入式系統(tǒng)卻始終存在,以至于20多年后,單片機有了“嵌入式系統(tǒng)的稱呼與視角。1971年,Intel公司推出了世界上第一個微處理器,即4位微處理器4004。隨后又推出了8位的8008。1974年,8008開展成8080,成為第二代微處理器,其目的是代替子邏輯電路器件,應用于各種電路系統(tǒng)和設備中,由此開始了嵌入式處理器的嘗試。隨后,眾多的單片機微控制器應運而生,如1974年Mostek公司與仙童公司的3870系列單片機、1976年Intel公司的8048單片機、1977年GI公司的PIC1650系列單片機、1978年Rockwell公司的6500系列單片機,以及1

8、980年Intel公司推出的MCS51系列單片機,這些單片機本質上都是嵌入式處理器根底上的微控制器。1981年8月12日,IBM公司在Intel8088微處理器根底上,推出了全球第一臺個人計算機,即IBMPC。實際上,在PC機誕生前,單片機也經(jīng)為嵌入式應用尋找到了最正確的“微控制器應用模式。當時由于強調的自己獨立的單片形態(tài),稱之為單片機,即實現(xiàn)單片形態(tài)嵌入式應用的微控制器,控制的是物理對象。因此,“單片、“嵌入、“物聯(lián)是單片機或嵌入式系統(tǒng)三位一體、與生俱來的本質特性M0內核PLC11C14的中斷和其他arm產(chǎn)品的中斷不一樣,PLC11C14芯片手冊上說有32個中斷0-31,其中27號中斷保存,

9、0-11共十二個是靜態(tài)的中斷向量,有外部引腳P0端口的,P0_0到P0_11,一一對應,12號中斷由P1_0對應。PLC11C14一共四個端口,P0到P3,其中P0到P2每個端口十二個引腳,P3口四個引腳。內部中斷有四個定時器中斷,看門狗中斷,串口,SPI,等等。這些也大同小異,但是在最后的有一個中斷狀態(tài)的中斷源28 PIO_3 GPIO interrupt status of port 329 PIO_2 GPIO interrupt status of port 230 PIO_1 GPIO interrupt status of port 131 PIO_0 GPIO interrupt

10、 status of port 0經(jīng)過仔細研究BSP包內的軟件源碼,發(fā)現(xiàn)上訴四個中斷可以監(jiān)控四個端口,當這些端口中有引腳電位變化時,出發(fā)中斷,進入中斷效勞函數(shù),PIOINT0_IRQHandlervoid;在中斷中判斷是哪個引腳發(fā)生了中斷if(GPIOIntStatus(PORT2, 8)/對應PORT2_8端口的中斷事件,這樣一來所有外部的GPIO,都可以作為外部中斷使用,大大提高了資源的利用率,我們可以在下半部機制完成中斷處理函數(shù),在中斷中只置位標志位,在main函數(shù)中輪詢標志位是否發(fā)生變化,發(fā)生變化后跳轉到對應的下半部處理函數(shù)中,這樣中斷觸發(fā)后可以很快完成處理,不會在中斷中浪費過多資源。

11、同時我們可以設置觸發(fā)中斷的條件,BSP包中提供了一個函數(shù)GPIOSetInterrupt(PORT2, 8, 1,0, 0 );GPIOIntEnable(PORT2,8);對應參數(shù),第一個端口號;第二個參數(shù)管腳號;第三個參數(shù)電平觸發(fā)還是跳變沿觸發(fā)0為跳變沿觸發(fā),1為電平觸發(fā);第四個參數(shù)當?shù)谌齾?shù)設置為跳變沿出發(fā)時,0位單邊沿觸發(fā),1為雙邊沿觸發(fā);當?shù)谌齾?shù)設置為點評觸發(fā)是,0代表低電平,1代表高電平。第五個參數(shù)設置上升沿還是下降沿觸發(fā),對單邊沿觸發(fā)有效。上面設置PORT2_8引腳,低電平觸發(fā)方式。1、Colink 固件升級Colink板子鏈接2、安裝Colink驅動ColinkExUsbDr

12、iver-1.2.0,然后重啟PCwin7 64 位ColinkExUsbDriver-1.2.0 安裝方法you need to downloadModified the inf file from:,then do the following operation:1.Open theInstallation folder: replace the inf file with the new one.2.Delete the file:dpinst.xml.3. run dpinst_amd64.exe.PS: Only Windows 64bit OS need to dothe repl

13、acement.ForNepi: Please do the same operation.If the driveris unable to be installed on vista 64bit, connect us.We will release a new driver in a few days.早上安裝keil的一點小插曲,我的是vin7 64位沒有對應的驅動,后來在網(wǎng)上查到的解決方法; 好了下面開始分析程序,在keil下建立工程就會生成對應的引導文件,也就是匯編寫的,怎么引導c代碼,這里掠過。開始第一個main;int main(void) SystemInit(); GPIO

14、Init(); CLKOUT_Setup(CLKOUTCLK_SRC_MAIN_CLK); /*這個主要是要設置CLKOUT,WDT CLOCK,SPI,UART,等輸出時鐘*/ while(1) 好了啃掉第一個函數(shù)SystemInit,這里涉及到各種存放器都要親自動手去看芯片手冊,void SystemInit (void) uint32_t i; LPC_SYSCON-SYSMEMREMAP = 0 x2;/*這個函數(shù)是內存映射函數(shù),0 x2,是將flash映射到0 x0地址,我看了一下手冊,發(fā)現(xiàn)flash就在0 x0地址,所以只要程序下載到flash中就可以運行,注意,程序默認從0 x0

15、地址開始執(zhí)行的*/ LPC_SYSCON-SYSOSCCTRL = 0 x00;/*系統(tǒng)晶振選擇,0 x00 是默認值,頻率范圍是1-20MHz*/ LPC_SYSCON-PDRUNCFG &= (0 x15);/*這個用來設置power-down 的,不知道怎么翻譯好了,大家應該都懂得,這種表示是將第六位清零,其他位保持不變第六位是SYSOSC_PD 系統(tǒng)晶振*/ for ( i = 0; i SYSAHBCLKCTRL |= (1SYSPLLCLKSEL = MAIN_CLKSRCSEL_Val; /* Select system OSC */ LPC_SYSCON-SYSPLLCLKUE

16、N = 0 x01; /* Update clock source */ LPC_SYSCON-SYSPLLCLKUEN = 0 x00; /* toggle Update register once */ LPC_SYSCON-SYSPLLCLKUEN = 0 x01; while ( !(LPC_SYSCON-SYSPLLCLKUEN & 0 x01) ); /* Wait until updated */*這一局部是選擇時鐘源的,將SYS-PLL時鐘源設置為 System 晶振,并更新時鐘源*/ regVal = LPC_SYSCON-SYSPLLCTRL; regVal &= 0 x1

17、FF; LPC_SYSCON-SYSPLLCTRL = (regVal | (MAIN_PLL_P_ValPDRUNCFG &= (0 x1SYSPLLSTAT & 0 x01) ); LPC_SYSCON-MAINCLKSEL = 0 x03; LPC_SYSCON-MAINCLKUEN = 0 x01; LPC_SYSCON-MAINCLKUEN = 0 x00; LPC_SYSCON-MAINCLKUEN = 0 x01; while ( !(LPC_SYSCON-MAINCLKUEN & 0 x01) ); /*這一局部是選擇時鐘源的,將MAINCLK 時鐘源設置為 PLL clock

18、,并更新時鐘源*/ LPC_SYSCON-SYSAHBCLKDIV = SYS_AHB_DIV_Val; SystemFrequency = ClockSource * (MAIN_PLL_M_Val+1); SystemAHBFrequency = (uint32_t)(SystemFrequency/SYS_AHB_DIV_Val); return;工程大體框架:假設你要管理一個大的倉庫,其中要防止的重要的物品,你要實時的監(jiān)控倉庫的環(huán)境,包括溫度,濕度,光照,和進出貨物的數(shù)量以及進出人員。怎么樣像不像一個倉庫管理員的工作,沒錯就是管理員的工作,我們的工程就是要用物聯(lián)網(wǎng)的知識來搭建一個系統(tǒng)完

19、成管理員的工作,這個工程管理比管理員管理范圍更大精度更高,本錢更低。好了下面具體說一說工程模塊。模塊一:感知模塊,實時監(jiān)測倉庫環(huán)境,主要有溫度傳感器,濕度傳感器,三軸傳感器。模塊二:效勞模塊,boa效勞器,在a8上創(chuàng)立效勞器,處理由M0上傳來的信息。模塊三:在a8上移植linux kernel,用于線程調度,攝像頭驅動I2C控制模塊四:網(wǎng)頁編寫,可以登錄物聯(lián)網(wǎng)系統(tǒng),實時查看環(huán)境信息下面是boa效勞器移植過程嵌入式Linux中的Web效勞器應用一BOA簡介Boa是一個非常小巧的Web效勞器,其可執(zhí)行代碼只有60K左右。它是一個單任務的Web效勞器,只能依次完成用戶的請求,而不會fork出新的進程

20、處理并發(fā)連接請求。但boa支持cgi,能夠為cgi程序fork出一個進程來執(zhí)行。Boa的設計目標是速度和平安,在其站點公布的性能測試中,boa的性能要好于apache效勞器。:w隨著網(wǎng)絡技術的迅猛開展,在嵌入式設備的管理和交互中,基于Web方式的應用成為目前的主流,用戶可以直接通過遠程登錄的方式對設備進行管理和維護,大大方便了使用性。下面就為大家講解一下boa效勞器在嵌入式Linux系統(tǒng)中的移植過程。二BOA效勞器移植工具鏈:gccversion4.5.1平臺: 處理器:s5pc100內核:linux-2.6.351.解壓源碼2.進入src/./configure生成Makefile修改Mak

21、efile修改CCgcc為CCarm-none-linux-gnueabi-gcc修改CPPgcc-E為CPParm-none-linux-gnueabi-gcc-E3.make編譯1)編譯一個linux下的c系統(tǒng),包含詞法和語法分析模塊,Linux上用bison和flex。yacc是一個文法分析器的生成器,bison即是yacc的GNU版本.Lex和YACC是用于構造詞法分析機和語法解釋器的工具,利用Lex和YACC你可以輕松的構造一個語法解釋器。sudoapt-getinstallbisonflex2)修改src/log.c注釋掉if(dup2(error_log,STDERR_FILEN

22、O)=-1)DIE(unabletodup2theerrorlog);為:/*if(dup2(error_log,STDERR_FILENO)=-1)DIE(unabletodup2theerrorlog);*/3)修改src/boa.c注釋掉下面內容:if(passwdbuf=NULL)DIE(getpwuid);if(initgroups(passwdbuf-pw_name,passwdbuf-pw_gid)=-1)DIE(initgroups);為#if0if(passwdbuf=NULL)DIE(getpwuid);if(initgroups(passwdbuf-pw_name,pas

23、swdbuf-pw_gid)=-1)DIE(initgroups);#endif4)修改src/boa.cif(setuid(0)!=-1)DIE(ickyLinuxkernelbug!);為#if0if(setuid(0)!=-1)DIE(ickyLinuxkernelbug!);#endif5)執(zhí)行make出現(xiàn)錯誤:arm-none-linux-gnueabi-gcc-g-O2-pipe-Wall-I.-c-outil.osrc/util.csrc/util.c:100:1:error:pastingtand-doesnotgiveavalidpreprocessingtokenmake:

24、*util.oError1#去掉其中./src/compat.h120行的#。然后給boa瘦身arm-none-linux-gnueabi-stripboa三Boa效勞器配置1創(chuàng)立目錄mkdir/source/rootfs/etc/boa將boa源碼目錄下的boa.conf拷貝到/source/rootfs/etc/boa目錄下cpboa.conf/source/rootfs/etc/boa2修改配置文件boa.confvim/source/rootfs/etc/boa(1)user的修改修改Usernobody為User0(2)Group的修改修改Groupnogroup為Group0(3)

25、ScriptAlias的修改修改ScriptAlias/cgi-bin/usr/lib/cgi-bin/為ScriptAlias/cgi-bin/www/cgi-bin/(5)DocumentRoot的修改修改DocumentRoot/var/www為DocumentRoot/www(6)ServerName的設置修改#ServerName為ServerName否那么會出現(xiàn)錯誤“gethostbyname:Nosuchfileordirectory(7)AccessLog修改修改AccessLog/var/log/boa/access_log為#AccessLog/var/log/boa/ac

26、cess_log(8)以下配置和boa.conf的配置有關,都是在ARM根文件系統(tǒng)rootfs中創(chuàng)立以下步驟在開發(fā)板上進行:創(chuàng)立HTML文檔的主目錄/wwwmkdir/www創(chuàng)立CGI腳本所在錄/www/cgi-binmkdir/www/cgi-bin當不能使用cgi時將#AddTypeapplication/x- d-cgicgi改為AddTypeapplication/x- d-cgicgi四boa器測試將boa拷貝到開發(fā)板根文件系統(tǒng)的/etc/boa下#cpsrc/boa/source/rootfs/etc/boa將ubuntu下/etc/mime.types拷貝到開發(fā)板根文件系統(tǒng)的/e

27、tc下#cp/etc/mime.types/source/rootfs/etc將你的主頁index.html拷貝到www目錄下運行boa,然后在主機游覽器輸入開發(fā)板網(wǎng)址rootfarsightboa#./boa30/10/2022:19:10:36+0000boa:serverbuilt10302022at19:10:3630/10/2022:19:10:36+0000boa:startingserverpid=968,port80附1:boa配置文件參數(shù)說明boa的配置文件是/etc/boa/boa.conf。Port:boa效勞器監(jiān)聽的端口,默認的端口是80。如果端口小于1024,那么必須

28、是root用 戶啟動效勞器。Listen:綁定的ip地址。不使用這個參數(shù)時,將綁定所有的地址。User:連接到效勞器的客戶端的身份,可以是用戶名或UID。Group:連接到效勞器的客戶端的組,可以是組名或GID。ServerAdmin:效勞器出故障時要通知的郵箱地址。ErrorLog:指定錯誤日志文件。如果路徑?jīng)]有以“/開始,那么相對于ServerRoot路徑。沒 有配置時默認的文件是/dev/stderr。假設不想記錄日志,指定文件為/dev/null。AccessLog:設置存取日志文件,與ErrorLog類似。UseLocaltime:設置使用本地時間,使用UTC時注釋這個參數(shù)。這個參數(shù)

29、沒有值。VerboseCGILogs:在錯誤日志文件中記錄CGI啟動和停止時間,假設不記錄,注釋這個參數(shù)。這個參數(shù)沒有值。ServerName:指定效勞器的名稱,當客戶端使用gethostname+gethostbyname時返回給客戶端。VirtualHost:虛擬主機開關。使用此參數(shù),那么會在DocumentRoot設定的目錄添加一個ip地址作為新的DocumentRoot來處理客戶端的請求。如DocumentRoot設置為/var/www,那么 :/localhost/那么轉換成,假設注釋此參數(shù),那么為/var/www/。DocumentRoot:HTML文件的根目錄也就是網(wǎng)站的目錄。U

30、serDir:指定用戶目錄。DirectoryIndex:指定預生成目錄信息的文件,注釋此變量將使用DirectoryMaker變量。這個變量也就是設置默認主頁的文件名。DirectoryMaker:指定用于生成目錄的程序,注釋此變量將不允許列目錄。DirectoryCache:當DirectoryIndex文件不存在,而DirecotryMaker又被注釋掉時,將列出這個參數(shù)指定目錄給客戶端。KeepAliveMax:每個連接允許的請求數(shù)量。如果將此值設為0,將不限制請求的數(shù)目。KeepAliveTimeOut:在關閉持久連接前等待下一個請求的秒數(shù)。秒。MimeTypes:設置包含mimet

31、ypes信息的文件,一般是/etc/mime.types。DefaultType:默認的mimetype類型,一般是text/html。CGIPath:相當于給CGI程序使用的$PATH變量。SinglePostLimit:一次POST允許最大的字節(jié)數(shù),默認是1MB.AddType:增加MimeType沒有指定的類型,例:AddTypetypeextensionextension.。要使用cgi,必須添加cgi類型:AddTypeapplication/x- d-cgicgiRedirect:重定向文件Aliases:指定路徑的別名。ScriptAlias:指定腳本路徑的虛擬路徑。附2:編譯中

32、的出錯處理錯誤1:debian:/home/a/boa-0.94.13/src#makeyacc-dboa_grammar.ymake:yacc:Commandnotfoundmake:*y.tab.cError127解決方法:debian:/home/a/boa-0.94.13/src#apt-getinstallbison錯誤2:debian:/home/a/boa-0.94.13/src#makelexboa_lexer.lmake:lex:Commandnotfoundmake:*lex.yy.cError127解決方法:debian:/home/a/boa-0.94.13/src#a

33、pt-getinstallflexmake:Nothingtobedoneforall.說明make沒有檢查到需要編譯的東西,庫或者應用程序已經(jīng)編譯好了。make主要檢查的是時間戳,只要target比依賴的文件時間靠后它就認為不需要編譯.今天寫個程序,要求有輸入兩個數(shù)字,想都沒想就用了scanf;本想寫的嚴謹一些,就加了判斷條件ifscanf“%d,%d,&a,&b != 2perror(input errorn);exit(1);測試時,輸入少于兩了數(shù)據(jù),一個或不插入時錯誤信息被打印出來,但是當我輸入的數(shù)字個數(shù)超過兩個時,不會出現(xiàn)打印信息,測試結果也正常這樣讓我覺得這個判斷條件有些雞肋了,于

34、是到網(wǎng)上找一下關于scanf原函數(shù)#include #include #include loc_incl.hint scanf(const char *format, .) va_list ap; int retval; va_start(ap, format); retval = _doscan(stdin, format, ap); va_end(ap); return retval;其中,_doscan(stdin,fromat,ap)很復雜,大致功能 定義一些后面需要用到的變量跳過format格式串中的空格,并且跳過輸入流中的空格輸入流stream與format格式串中的空白符空白符可

35、以是空格(space)、制表符(tab)和新行符(newline)保持一致在format中的字符為%的前提下,stream中的字符也為%,那么繼續(xù)format當前字符為*,表示讀指定類型的數(shù)據(jù)但不保存指定說明最大域寬。 在百分號(%)與格式碼之間的整數(shù)用于限制從對應域讀入的最大字符數(shù)于寬度所以我出現(xiàn)的問題很好解釋了,我輸入數(shù)字時被放在輸入緩沖區(qū)中,scanf對有需要的數(shù)字進行格式化輸入,多余的還在緩沖區(qū)內,所以不會報錯。輸入一個數(shù)字后再輸入任何間隔符,都會被scanf吃掉,直到輸入第二個數(shù)字為止,格式化輸入結束。工程中涉及到溫濕度傳感器,原理圖給出,用DHT11溫濕度一體ICDHT11 數(shù)字溫

36、濕度傳感器是一款含有已校準數(shù)字信號輸出的溫濕度復合傳感器。它應用專用的數(shù)字模塊采集技術和溫濕度傳感技術,確保產(chǎn)品具有枀高的可靠性與卓越的長期穩(wěn)定性。傳感器包括一個電阻式感濕元件和一個 NTC 測溫元件。單總線說明DHT11 器件采用簡化的單總線通信。單總線即只有一根數(shù)據(jù)線,系統(tǒng)中的數(shù)據(jù)交換、控制均由單總線完成。設備主機或從機通過一個漏枀開路或三態(tài)端口連至該數(shù)據(jù)線,以允許設備在不發(fā)送數(shù)據(jù)時能夠釋放總線,而讓其它設備使用總線;單總線通常要求外接一個約 5.1k 的上拉電阻,這樣,當總線閑置時,其狀態(tài)為高電平。由于它們是主從結極,只有主機呼叫從機時,從機才能應答,因此主機訪問器件都必須嚴格遵循單總線

37、序列,如果出現(xiàn)序列混亂,器件將不響應主機。單總線傳送數(shù)據(jù)位定義DATA 用于微處理器與 DHT11 之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次傳送 40 位數(shù)據(jù),高位先出。數(shù)據(jù)格式:8bit 濕度整數(shù)數(shù)據(jù) + 8bit 濕度小數(shù)數(shù)據(jù)+8bit 溫度整數(shù)數(shù)據(jù) + 8bit 溫度小數(shù)數(shù)據(jù)+8bit 校驗位。校驗位數(shù)據(jù)定義“8bit 濕度整數(shù)數(shù)據(jù) + 8bit 濕度小數(shù)數(shù)據(jù)+8bit 溫度整數(shù)數(shù)據(jù) + 8bit 溫度小數(shù)數(shù)據(jù) 8bit 校驗位等于所得結果的末 8 位。例如一:接收到的 40 位數(shù)據(jù)為:0011 0101 0000 0000 0001 1000 0000 0000 0100 1101濕

38、度高 8 位 濕度低 8 位 溫度高 8 位 溫度低 8 位 校驗位計算:0011 0101+0000 0000+0001 1000+0000 0000= 0100 1101下面是一些代碼,其中涉及到時序的地方做出注釋uint32_t Read_Temp_Hum(uint8_t *temp, uint8_t *hum) uint32_t cnt_last; uint8_t hum_10, hum_01, temp_10, temp_01, chksum, chk; uint32_t tc1, tc; uint32_t i; p3_2_counter = 0; / 用來檢測中斷是否產(chǎn)生,在中斷中

39、進行p3_2_counter+; cnt_last = p3_2_counter; GPIOIntDisable(PORT1, 5);/* 微處理器的 I/O 設置為輸出同時輸出低電平,且低電平保持時間不能小于 18ms,然后微處理器的 I/O 設置為輸入狀態(tài),由于上拉電阻,微處理器的 I/O 即 DHT11 的 DATA 數(shù)據(jù)線也隨之變高,等待 DHT11 作 出答復信號*/ GPIOSetDir(PORT1, 5, 1); / Set PIO1_5 to output GPIOSetValue(PORT1, 5, 0); delay_ms(30); /保證時間大于18ms GPIOSetV

40、alue(PORT1, 5, 1); /變成高電平 GPIOSetDir(PORT1, 5, 0); /set PIO1_5 to input GPIOSetInterrupt(PORT1, 5, 0, 0, 0); /設置下降沿觸發(fā),使能中斷 GPIOIntEnable(PORT1, 5);/* DHT11 的 DATA 引腳檢測到外部信號有低電平時,等待外部信號低電平結束,延遲后 DHT11 的 DATA 引腳處于輸出狀態(tài),輸出 80 微秒的低電平作為應答信號,緊接著輸出 80 微秒的高電平通知外設準備接 收數(shù)據(jù),微處理器的 I/O 此時處于輸入狀態(tài),檢測到 I/O 有低電平DHT11 回

41、應信號后,等待 80 微秒的高電平后的數(shù)據(jù)接收*/ for(i=0; i3; i+) /應答信號剛好是三個跳變沿,全部接受后,進行數(shù)據(jù)的接收 GPIOSetInterrupt(PORT1, 5, 0, 0, i&0 x01); while(p3_2_counter = cnt_last); /用來檢測是否有中斷產(chǎn)生,生成中斷后p3_2_counter+; cnt_last = p3_2_counter; /* 由 DHT11 的 DATA 引腳輸出 40 位數(shù)據(jù),微處理器根據(jù) I/O 電平的變化接收 40 位數(shù)據(jù), 位數(shù)據(jù)“0的格式為: 50 微秒的低電平和 26-28 微秒的高電平。 位數(shù)據(jù)

42、“1的格式為: 50 微秒的低電平加 70微秒的高電平。*/ for(i=0; iVAL;在中斷中完成GPIOSetInterrupt(PORT1, 5, 0, 0, 0); while(p3_2_counter = cnt_last); cnt_last = p3_2_counter;if(p3_2_tc tc1)tc = tc1 - p3_2_tc; /高電平時間,低電平都是50us不判斷,判斷高電平是時間來判斷是0 or 1elsetc = 48000 - (p3_2_tc - tc1);/* DATA 用于微處理器與 DHT11 之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次傳送 40 位

43、數(shù)據(jù),高位先出。 數(shù)據(jù)格式: 8bit 濕度整數(shù)數(shù)據(jù) + 8bit 濕度小數(shù)數(shù)據(jù)+8bit 溫度整數(shù)數(shù)據(jù) + 8bit 溫度小數(shù)數(shù)據(jù)+8bit 校驗位。 */if(i 8)hum_10 = 2328)/ 這里的2328是怎么得到的,系統(tǒng)時鐘設置為48MHz,(1/48MHZ )*2328 = 48.5us; hum_10 |= 0 x01;/ 上面提到位數(shù)據(jù)“0時高電平26-28 微秒我們取27us,位數(shù)據(jù)“1時高電平70, / 判斷上下的臨界值27 + 70/2 = 48.5;else if(i 16)hum_01 = 2328) hum_01 |= 0 x01;else if(i 24)t

44、emp_10 = 2328) temp_10 |= 0 x01;else if(i 32)temp_01 = 2328) temp_01 |= 0 x01;elsechksum = 2328) chksum |= 0 x01; /* 當一位數(shù)據(jù)傳輸結束后,總線重新恢復高電平狀態(tài),下面的一次中斷,就是恢復高電平狀態(tài)同時也用來 同步p3_2_counter = cnt_last;*/ GPIOSetInterrupt(PORT1, 5, 0, 0, 1); while(p3_2_counter = cnt_last); GPIOIntDisable(PORT1, 5); *temp = temp_

45、10; *(temp+1) = temp_01; *hum = hum_10; *(hum+1) = hum_01;/* 下面是對校驗位核對,如上面所訴“8bit 濕度整數(shù)數(shù)據(jù) + 8bit 濕度小數(shù)數(shù)據(jù)+8bit 溫度整數(shù)數(shù)據(jù) + 8bit 溫度小數(shù)數(shù)據(jù) 8bit 校驗位等于所*/ chk = hum_10; chk += hum_01; chk += temp_10; chk += temp_01; if(chk = chksum) return 1; else return 0;以上就是單總線下溫濕度傳感器的核心代碼,其中中斷局部不同處理器定義不同,這里就不進行闡述了。還有不處理器的系統(tǒng)

46、時鐘設置不同,在臨界值得判斷也不一樣。關于ucos在lpc上移植:主要有四個文件,傳統(tǒng)的有三個文件:os_cpu_c.c,os_cpu_a.s,os_cpu.h還有一個是IRQ.incOs_cpu.h:這個文件相對來說還是很簡單的,關于變量的重新定義,堆棧生長度,臨界區(qū)了,最有特色的是運用swi軟中斷。Os_task_sw()肯定是用軟中斷了,在mdk中要聲明一個沒有定義的函數(shù),就要在這個函數(shù)前面加上_SWI(),也就是用它聲明,而_swi()就是一個關鍵字了。uc在x86上移植也是用的軟中斷int 0 x80。在lpc中一旦調用os_task_sw()就會觸發(fā)_swi(0 x00)這個軟中斷

47、,那它就會使arm進入管理模式然后執(zhí)行軟中斷函數(shù)SoftwareInterrupt,這個函數(shù)在os_cpu_a.s中定義,后續(xù)。關于os_task_sw()osstartHighRdy()進入臨界區(qū)的兩個函數(shù) 還有一些ARM用到的函數(shù)它們?yōu)槭裁匆密浿袛喽挥闷胀ê瘮?shù)調用呢?答案是這樣的:ARM處理核有兩個指令集,用戶任務還可以使用兩種模式:用戶和系統(tǒng),組合起來就有4種方式了,各種方式對系統(tǒng)資源有不同的訪問控制權限。為了使底層接口函數(shù)與處理器狀態(tài)無關,同時在任務調用相應的函數(shù)時不需要知道函數(shù)位置,也就是說:統(tǒng)一進入管理模式,統(tǒng)一用軟中斷調用。Os_cpu_a.s:這個文件主要當然是Softwa

48、reInterrupt了,在這個函數(shù)里有三方面跳轉:1.os_task_sw2.osstartHighRdy3. SWI_Exception1.一個任務切換也調用OSIntCtxSw這個標號,說明它和中斷切換過程一樣,都是先保存老的再迎取新的,但是有一點不同:就是這兩個函數(shù)調用的模式不同:任務級切換是進入管理模式而中斷級是進入IRQ模式。妙就妙在雖然是進入的不同模式但一進來都是在SP指針下取老任務的數(shù)據(jù)然后保存,然后迎新。可以看出這時的SP指針一個是管理的一種情況是IRQ的。Spsr記錄了任務的環(huán)境,而不管什么模式都用R3來記錄spsr,然后保存,總之陳明計寫得太效率和有技巧了。2.ossta

49、rtHighRdy其實就是調用OSIntCtxSw_1,就不多說了它就是迎新唄3.這個函數(shù)在.c文件里,后續(xù)。Os_cpu_c.c:文件有一個OSTaskStkInit函數(shù)就很明顯了,按照堆棧格式模擬,就不多說了。SWI_Exception這個函數(shù)有好幾路轉向,去除了第一和第二路,因為在os_cpu_a.s中定義了。臨界區(qū)函數(shù)其實就是進去把中斷位關閉就行了。但是還有一個陳添上去的一個全局變量OsEnterSum:主要來實現(xiàn)臨界區(qū)嵌套,當OsEnterSum = 0的時候才開中斷。剩下的函數(shù)也是改變cpsr就完了沒什么。主要是在調用完SWI_Exception這個函數(shù)后還得回SoftwareIn

50、terrupt里面實現(xiàn)任務的繼續(xù)運行關于函數(shù)的參數(shù)問題兩個參數(shù)一個放到R0一個放到R1中傳過來,呵呵。IRQ.inc: 這個文件是匯編頭文件里面定義了一個宏,在不少應用里直接把它復制到IRQ.S中了,然后在寫上;/*中斷*/IRQ_Handler HANDLER IRQ_Exception;/*定時器0中斷*/Timer0_HandlerHANDLER Timer0_Exception這就是對這個宏的運用,分別套用就行了,它實現(xiàn)了os對IRQ的管理。在這個宏里面調用了兩個函數(shù):一個是IRQ_Exception_Function,一個是OSIntExit。第一個可以是Timer0_Excepti

51、on在它里面調用timetick(),第二個調用OSIntExit(),在這個函數(shù)里調用osIntctxSw(),但是在includes.h中#define OSIntCtxSw() return,把這個函數(shù)給費了,呵呵,直接返回啦。然后在宏里判斷是否執(zhí)行中斷級切換。但是我就不明白陳為什么這樣做了。也可以還用os的osIntctxSw()調用啊,如果回來了說明不切換,然后直接恢復現(xiàn)場也行吧。切換就調用osIntctxSw唄。ISL20223是一款綜合性光傳感器,內部有16位ADC轉換,通過I2C用戶配置參數(shù),可編程lux范圍選擇。大致了解一下芯片知識,然后詳細追蹤代碼,看I2C實現(xiàn)。REXT

52、External resistor pin for ADC reference; connect this pin to ground through a (nominal) 100kresistor兩個二極管,一個隊可見光540 nm敏感,一個對紅外線敏感,模式一對應第一個二極管工作,模式二對應第二個二極管工作,模式三對應二個二極管同時工作Diode1 - Diode2。8*8位內部控制存放器:2*8控制存放器2*8設置上下中斷閾值4*8data存放器,只讀模式 ,2個reading 2個timer countsISL20223的原理圖如下所示:由原理圖可以看出,ISL20223數(shù)據(jù)傳輸是由

53、I2C總線傳輸?shù)模琁2C協(xié)議簡單介紹一下。具體的定義這里不說了,主要是怎么用,以其中一種模式進行說明。I2C SDA Out 從機數(shù)據(jù)時序,I2 CSDA in 主機發(fā)送的時序。解釋一下上面的時序:時鐘高電平時一個下降沿,表示開始信號Start。接著在8個時鐘周期內發(fā)送1000100 0w前七位是從機地址,最后一位是代表R/W。下一個時鐘第九個時鐘,從機拉低應答。接下來8個時鐘周期是存放器的地址,00000 xxx三位可變的。從機應答。主機接收后SCL高電平期間,由主機產(chǎn)生一個上升沿的信號作為停止。主機產(chǎn)生一個下降沿作為start。接下來發(fā)送8位的讀指令,10001001.拉低SDA放棄總線。

54、接下來從機發(fā)送8位數(shù)據(jù)。主機將SDA不操作,作為應答非信號。迫使從機釋放總線。主機發(fā)送停止信號。A1-6代表從機地址,R7-0 存放器地址,D7-0數(shù)據(jù)。I2C寫時序原理和上面相同,對應讀寫位改變就行。這里只是 I2C SDA Out 只從機,I2 CSDA in 主機發(fā)送的。解釋一下上面的時序:時鐘高點評時一個下降沿,Start。接著在8個時鐘周期內發(fā)送10001000w下一個時鐘,從機壓低應答。接下來8個時鐘周期是存放器的地址,00000 xxx三位可變的。從機應答。主機接收后SCL高電平期間,由主機產(chǎn)生一個上升沿的信號作為停止。主機產(chǎn)生一個下降沿作為start。接下來發(fā)送8位的讀指令,1

55、0001001.拉低SDA放棄總線。接下來從機發(fā)送8位數(shù)據(jù)。主機將SDA不操作,作為應答非信號。迫使從機釋放總線。主機發(fā)送停止信號。A1-6代表從機地址,R7-0 存放器地址,D7-0數(shù)據(jù)I2C的寫時序和上面類似。這里只是ISL20223的簡單介紹,I2C具體傳輸還要看LPC11C14配置存放器。配置LPC11C14可以不用考慮每個時序的數(shù)據(jù)。是不是覺得上面分析的時序沒有用了,其實還是有用的,當你用io口模擬時序時就必須要考慮每個時序的數(shù)據(jù)了。這種情況還是存在的,有的IC傳輸協(xié)議不是標準I2C的協(xié)議,而是變種協(xié)議,大致相同,細節(jié)處要自己考慮。下一篇準備寫一下LPC11C14s上的I2C存放器配

56、置,以及,存放器控制時序方法。很多時候我們需要在程序退出的時候做一些諸如釋放資源的操作,但程序退出的方式有很多種,比方main()函數(shù)運行結束、在程序的某個地方用exit() 結束程序、用戶通過Ctrl+C或Ctrl+break操作來終止程序等等,因此需要有一種與程序退出方式無關的方法來進行程序退出時的必要處理。方法就 是用atexit()函數(shù)來注冊程序正常終止時要被調用的函數(shù)。 atexit()函數(shù)的參數(shù)是一個函數(shù)指針,函數(shù)指針指向一個沒有參數(shù)也沒有返回值的函數(shù)。atexit()的函數(shù)原型是:int atexit (void (*)(void); 在一個程序中最多可以用atexit()注冊3

57、2個處理函數(shù),這些處理函數(shù)的調用順序與其注冊的順序相反,也即最先注冊的最后調用,最后注冊的最先調用。下面是一段代碼例如:#include /使用atexit()函數(shù)所必須包含的頭文件stdlib.h#includevoid fn1(void);int main(void)atexit(fn1);printf(a./n);return 0;void fn1()printf(b./n);輸出結果是:a.b.什么是倉儲系統(tǒng)編輯倉儲系統(tǒng)指的是產(chǎn)品分揀或儲存接收中使用的設備和運作策略的組合。 12倉儲系統(tǒng)的構成編輯存儲空間貨物倉儲設施設備人員作業(yè)及管理系統(tǒng)等要素。3倉儲系統(tǒng)的經(jīng)濟優(yōu)化編輯對于倉儲系統(tǒng)的根

58、本要求是滿足供給需求前提下,盡量減少存貯物資的數(shù)量,從而降低存貯費用,提高存貯系統(tǒng)經(jīng)濟效益。為到達這一要求, 在存貯管理和運輸上必須選擇合理的策略。確定性存貯模型的特點是需求消耗速度和入庫補充特性都是確定的。它又依入庫物資速率是否有限制和出庫物資是否允許短缺分為有限供給率、無限供給率、允許缺貨、不許缺貨四種類型。本文主要討論基于(,S)混合策略確實定性存貯理論,即物資補充和消耗滿足一定的規(guī)律下,當存貯量Q低于最底庫存量 時,就進行物資補充,把存貯量提高到S;反之,當QS時,就不做補充。一、物流倉儲模型的建立(一)無限供給率根本問題假設無限供給率,即定貨物資在規(guī)定時間一次到貨。每次定貨量為常數(shù)Q

59、;需求連續(xù)均勻,速度為常數(shù)R,t時間的需求量為R(t);當存貯量下降到時,又進行下一次補充。存貯量隨時間的變化如下圖;每次定貨費用C0和單位物資年存貯費C1為常數(shù);年度保障經(jīng)費用Cy為運輸費Cd和存貯費 Cb之和,即Cy=Cd + Cb.。(二)數(shù)學模型的建立與分析在每次輸送量Q,年需求量D的條件下,年運輸次數(shù)為,每次運輸費用C0 ,因而年運輸費用為 ;在無限供給率及常需求速度情況下,物資存貯量以勻速減小。當存貯量接近警戒量時,一次定貨入庫。因而,年平均存貯量為 ,于是年存貯費用為;由此得到年度保障費用公式:由公式可以看出,增加每次定貨量Q,一方面可以減少年度運輸費Cd,另一方面又增加年存貯費

60、Cb 。研究每次定貨量Q對年度保障費用Cy的動態(tài)影響,將公式積分得到:,由此計算得到最小經(jīng)濟定貨量,相應的年度保障經(jīng)費優(yōu)化值 .二、應用舉例(一)問題陳述為滿足市場需求,某物資倉庫每年從上級倉庫申請補充某型號物資5000箱,每箱物資每月存貯費用折算大約50元,其每次運輸費10000元, 每次運量為200箱。倉庫不允許缺貨,始終保持800箱的庫存量用于市場調撥?,F(xiàn)明確研究問題為:如何調整運輸方案和運輸量,在滿足市場供給的情況下,使倉庫經(jīng)費最少。(二)數(shù)學模型的驗證計算根據(jù)的運輸存貯模型,可知當前每次運輸量Q=200箱,倉庫最低存貯要求=800箱,單位物資年度存貯費用C1=50 x12=600 元

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論