嵌入式系统设计
2012年下學(xué)期嵌入式系統(tǒng)設(shè)計(jì)課程大作業(yè)
1、敘述下列相關(guān)名詞的含義
ARM、xscale、PXA255、RISC、體系結(jié)構(gòu)
ARM:一種技術(shù)、一個(gè)公司的名稱(chēng)、一種處理器。
Xscale:Xscale是ARM體系結(jié)構(gòu)的一種內(nèi)核,基于ARMv5TE,由Intel公司開(kāi)發(fā),在架構(gòu)擴(kuò)展的基礎(chǔ)上同時(shí)也保留了對(duì)于以往產(chǎn)品的向下兼容。
PXA255:XScale的內(nèi)核版本,采用ARMV5TE的7級(jí)超流水線(xiàn),32K數(shù)據(jù)緩存/32K指令緩存。
RISC:英文全稱(chēng)為:ReducedInstructionSetComputing,中文即“精簡(jiǎn)指令集”,一種CPU的設(shè)計(jì)概念;與之相對(duì)的是CISC,即復(fù)雜指令集
體系結(jié)構(gòu):嵌入式系統(tǒng)硬件與軟件的銜接;它確定嵌入式系統(tǒng)設(shè)計(jì)的部件、部件功能、部件間借口的設(shè)計(jì),并集中于嵌入式系統(tǒng)的核心部分——處理器的運(yùn)算與內(nèi)存的存取。
?
2、畫(huà)出嵌入式硬件系統(tǒng)組成的模塊結(jié)構(gòu)圖
?
3、敘述基于linux的嵌入式平臺(tái)的搭建過(guò)程
答:Linux嵌入式平臺(tái)的搭建符合嵌入式平臺(tái)搭建的一般過(guò)程,但是具體到Linux嵌入式平臺(tái),又有些許不同,其搭建過(guò)程如下:
1)處理器以及硬件開(kāi)發(fā)平臺(tái)的選擇
以處理器為主,結(jié)合考慮硬件平臺(tái)的情況。處理器考慮的問(wèn)題包括應(yīng)用類(lèi)型及I/O接口、主頻和功耗、對(duì)不同類(lèi)型存儲(chǔ)器的支持、封裝等;硬件平臺(tái)的選擇和設(shè)計(jì)包括內(nèi)存和外圍存儲(chǔ)器、輸入輸出接口以及設(shè)備等幾項(xiàng)主要內(nèi)容。
2)操作系統(tǒng)的選擇
由于已經(jīng)選取了Linux操作系統(tǒng),因此此處主要是內(nèi)核版本的選取以及對(duì)內(nèi)核功能的裁剪。
3)開(kāi)發(fā)環(huán)境的選取
即開(kāi)發(fā)工具的選取,主要是指開(kāi)發(fā)軟件的選取,比如常用的minicom。
4)開(kāi)發(fā)實(shí)施
首先,Bootloader的燒制。目的是對(duì)硬件系統(tǒng)基本功能的支持,比如串口通信。其次,內(nèi)核文件的制作。接下來(lái),內(nèi)核文件的拷貝。此時(shí),可以通過(guò)串口或者網(wǎng)口實(shí)施傳輸,能夠大幅度提高傳輸速度。最后,在主機(jī)使用開(kāi)發(fā)軟件,完成對(duì)硬件系統(tǒng)的開(kāi)發(fā)工作。包括硬件驅(qū)動(dòng)程序、上層的應(yīng)用程序、系統(tǒng)的集成與調(diào)試等。
?
4、判斷題
(×)1.嵌入式系統(tǒng)調(diào)試通常可以分為硬件級(jí)調(diào)試和在線(xiàn)仿真器調(diào)試。
(√)2.在ARM處理器中,快速中斷(FIQ)的優(yōu)先級(jí)高于外部中斷(IRQ)。
(×)3.ROM能夠永久或半永久地保存數(shù)據(jù),ROM內(nèi)的數(shù)據(jù)永遠(yuǎn)不會(huì)丟失。
(√)4.內(nèi)建測(cè)試系統(tǒng)(BIST)是SoC片上系統(tǒng)的重要結(jié)構(gòu)之一,JTAG測(cè)試接口是IC芯片測(cè)試方法的標(biāo)準(zhǔn)。
(×)5.VHDL的基本單元描述不包括庫(kù)。
(×)6.嵌入式ARM架構(gòu)的嵌入式處理器同時(shí)支持大端、小端(Big/Little-Endian)數(shù)據(jù)類(lèi)型。
(×)7.嵌入式操作系統(tǒng)通常采用整體式內(nèi)核或?qū)哟问絻?nèi)核的結(jié)構(gòu)。
(×)8.ARM7TDMI中的T代表增強(qiáng)型乘法器。
(×)9.看門(mén)狗(Watch Dog)實(shí)際是一個(gè)簡(jiǎn)單的定時(shí)器,在固定時(shí)間內(nèi)若正常清零,則自動(dòng)復(fù)位處理器。
(√)10.ARM-CPU由多家不同制造商生產(chǎn),芯片外部提供的總線(xiàn)是不一致的。
(√)11.Linux 內(nèi)核穩(wěn)定、功能強(qiáng)大并且可以裁減,因?yàn)榉浅_m合嵌入式應(yīng)用。
(√)12.Linux 內(nèi)核的中斷服務(wù)程序運(yùn)行于與所有進(jìn)程都無(wú)關(guān)的中斷上下文中。
(√)13.Linux遵循POSIX標(biāo)準(zhǔn),意味著絕大多數(shù)UNIX應(yīng)用程序不需要任何改動(dòng)就可以在Linux系統(tǒng)上編譯且運(yùn)行。
(×)14.Linux內(nèi)核支持可以裁減的功能,因此它屬于微內(nèi)核架構(gòu)。
(√)15.Linux在fork()時(shí)采用了寫(xiě)時(shí)拷貝(簡(jiǎn)稱(chēng)COW)技術(shù),允許父進(jìn)程和子進(jìn)程同時(shí)共享相同的物理頁(yè)面。
(√)16.任何一個(gè)Linux應(yīng)用程序都需要調(diào)用exit()函數(shù)。
(×)17.當(dāng)前的Linux調(diào)度算法非常高效,但是查找當(dāng)前最高優(yōu)先級(jí)的可運(yùn)行程序時(shí),開(kāi)銷(xiāo)會(huì)隨著可運(yùn)行程序的多少而變化。
(√)18.Linux的系統(tǒng)調(diào)用是作為C庫(kù)的一部分提供的。
(×)19.為了對(duì)硬件做出迅速的響應(yīng)并完成對(duì)時(shí)間嚴(yán)格的操作,中斷處理下半部必須在關(guān)中斷狀態(tài)下執(zhí)行。
(×)20.Linux的內(nèi)存管理采用了分頁(yè)的機(jī)制,因此即使是內(nèi)核本身也全部是分頁(yè)的。
(√)21.嵌入式系統(tǒng)由上到下主要分為3個(gè)層次:應(yīng)用軟件層,系統(tǒng)軟件層,硬件層。
(×)22.嵌入式系統(tǒng)的軟硬件是獨(dú)立設(shè)計(jì)的。
(√)23.嵌入式系統(tǒng)設(shè)計(jì)需要建立交叉開(kāi)發(fā)環(huán)境。
(√)24.通用系統(tǒng)程序開(kāi)發(fā)不需要建立和使用交叉編譯環(huán)境。
(√)25.對(duì)于C++代碼,gcc命令只能編譯其源文件,而不能自動(dòng)和C++程序使用的庫(kù)鏈接。
(√)26.嵌入式系統(tǒng)可以沒(méi)有操作系統(tǒng)。
(√)27.JTAG測(cè)試允許多個(gè)器件通過(guò)JTAG接口串聯(lián)在一起形成一個(gè)JTAG鏈,能實(shí)現(xiàn)對(duì)各個(gè)器件分別測(cè)試。
(×)28.GDB調(diào)試器只支持本地調(diào)試應(yīng)用程序。
(√)29.KGDB程序是一個(gè)專(zhuān)門(mén)用于調(diào)試Linux內(nèi)核的GDB調(diào)試樁。
(×)30.片上調(diào)試器是存在重疊RAM。
?
5、基于嵌入式的智能家居系統(tǒng)設(shè)計(jì),重點(diǎn)在于完成智能家居控制平臺(tái)的結(jié)構(gòu)、功能和設(shè)計(jì)分析,畫(huà)出相應(yīng)的結(jié)構(gòu)功能框圖。
(1) 硬件總體設(shè)計(jì)框圖
根據(jù)上文的功能需要,設(shè)計(jì)出由ARM為控制核心,單片機(jī)控制的家電控制模塊和傳感器報(bào)警模塊,并且包含GSM通信模塊的智能家居系統(tǒng),硬件結(jié)構(gòu)框圖如下圖所示。
????????????????????????????????????????????????????????
(2) 控制核心選擇
智能家居控制系統(tǒng)采用XScale作為開(kāi)發(fā)平臺(tái),該平臺(tái)基于Intel?高性能的XScale處理器,支持Windows CE和Linux等嵌入式操作系統(tǒng),是針對(duì)教學(xué)和實(shí)驗(yàn)的多功能實(shí)驗(yàn)平臺(tái)。XScale處理器的最高主頻可達(dá)400MHz,且該處理器被加入了WirelessMXX技術(shù),大大的提高了多媒體處理能力,而且加入了Intel SpeedStep動(dòng)態(tài)電源管理技術(shù),在保證CPU性能的前提下,最大限度的降低設(shè)備功耗。
XScale配備了觸摸屏、以太網(wǎng)、USB、串口、CF/MMC、PCMCIA等接口。滿(mǎn)足了智能家居系統(tǒng)控制中心的硬件要求
(3)家電控制板
家電控制板采用AT89C51為控制核心。擴(kuò)展板的元件布局,其上有四盞LED分別模擬四種家電,三個(gè)按鈕模擬三種傳感器。其中四盞LED分別連接單片機(jī)的P1.0、P1.1、P1.2、P1.3;三個(gè)按鈕分別連接P2.0、P2.1、P2.2。
(3.1)串行端口電路
家電控制板采用串口與XScale實(shí)驗(yàn)箱進(jìn)行通信,其采用了經(jīng)典的兼容RS-232標(biāo)準(zhǔn)的MAX232芯片作為串口的電平轉(zhuǎn)換芯片。家電擴(kuò)展板采用的是常用的DB9頭作為串口接口, 其中2腳RxD為接收引腳,3腳TxD為發(fā)送引腳,GND為信號(hào)地引腳。一般情況下普通串口只接這幾個(gè)引腳;特殊的串口,如藍(lán)牙串口除接上述的三個(gè)腳之外,還接了DSR引腳和CTS引腳,是因?yàn)樗{(lán)牙串口的數(shù)據(jù)流輸出采用這兩個(gè)腳的信號(hào)控制;而其他引腳是跟MODEM相關(guān)的。在智能家居系統(tǒng)中,家電控制板接普通串口,GSM模塊接藍(lán)牙串口。
RS-232信號(hào)相對(duì)于信號(hào)地而言,在正負(fù)電平之間擺動(dòng)。發(fā)送數(shù)據(jù)時(shí),發(fā)送端輸出的正電平在+5V到+15V之間,負(fù)電平在-5V和-15V之間。無(wú)數(shù)據(jù)傳輸時(shí),線(xiàn)上為T(mén)TL電平。接收器典型的工作電平在+3V~+12V與-3V~-12V。由于發(fā)送電平和接收電平的差僅為2~3V左右,所以其共模抑制能力差,加上雙絞線(xiàn)的分布電容,信號(hào)傳輸距離最大為15m,最高速率為20kb/s。
MAX232包含2個(gè)驅(qū)動(dòng)器、2個(gè)接收器和一個(gè)電壓發(fā)生器電路,提供TIA/EIA-232-F電平。該器件符合TIA/EIA-232-F標(biāo)準(zhǔn),每一個(gè)接收器將TIA/EIA-232-F電平轉(zhuǎn)換成5V TTL/CMOS電平。每一個(gè)發(fā)送器將TTL/CMOS電平轉(zhuǎn)換成TIA/EIA-232-F電平。
(3.2)家電控制電路
家用電器控制的接口中K1~K4 為繼電器,分別控制四路家電的閉合和斷開(kāi),Q1~Q4 為繼電器線(xiàn)圈電流驅(qū)動(dòng),電路由單片機(jī)的P1口進(jìn)行控制,DD1~DD4 發(fā)光二極管用于顯示某路控制電路的工作情況,主要為了調(diào)試電路而設(shè)置。
(3.3) 傳感器接口電路
在傳感器沒(méi)有報(bào)警信號(hào)時(shí),光電耦合芯片處于截止?fàn)顟B(tài),與之相接的單片機(jī)端口為低電平;當(dāng)傳感器有報(bào)警,傳感器輸出高電平,此時(shí)光電耦合芯片導(dǎo)通,與之相接的單片機(jī)端口為高電平,由單片機(jī)對(duì)報(bào)警信號(hào)進(jìn)行采集并做出相應(yīng)處理。
(4) GSM通信模塊
GSM通信部分采用西門(mén)子MC35GSM/GPRS無(wú)線(xiàn)模塊作為通信工具。它支持EGSM900和GSM1800雙頻,支持?jǐn)?shù)字、語(yǔ)音、短消息和傳真,使用AT指令控制發(fā)送短消息。它采用9V直流電源供電,通過(guò)RS-232串行端口與XSBase270試驗(yàn)箱連接進(jìn)行通信。
(5) 視頻監(jiān)控模塊
視頻采集模塊采用使用中星微(Vimicro)公司的ZC0301P芯片的攝像頭, ZC0301P芯片可支持USB 1.1接口,硬件最高支持VGA分辨率(640×480)。在VGA模式下可達(dá)到15幀/秒速率,在CIF(352×288)和 SIF(320×240)模式下可達(dá)到30幀/秒速率。它通過(guò)USB接口連接到XScale試驗(yàn)箱。
?
6、下面是linux下的一個(gè)簡(jiǎn)單的設(shè)備驅(qū)動(dòng)程序,寫(xiě)出linux設(shè)備驅(qū)動(dòng)常用的數(shù)據(jù)結(jié)構(gòu),同時(shí)閱讀下面代碼,請(qǐng)給出測(cè)試程序中的每條語(yǔ)句加以注釋。
設(shè)備驅(qū)動(dòng)程序Keypad.c的源代碼:
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/poll.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/rtc.h>
#include <linux/delay.h>
#include <asm/hardware.h>
#include <asm/delay.h>
#include <asm/uaccess.h>
#define LEDnKEY_MAJOR ? 251
#define KEYPAD_NAME????"X-Hyper250 Keypad"
#define KEYPAD_VERSION?"Version 0.1"
#define EXT_KEY_CS? EXT_PORT2
#define EXT_LED_CS? EXT_PORT3
#define LED_SHOW??? 10
/*EXT_KEY_CS 為向外部LED進(jìn)行數(shù)值設(shè)定,它定義在其它頭文件里*/
void led_off_on() /**/
{
??? int i;
??? EXT_LED_CS = 0xff;
???
??? for(i =0 ; i<8;++i)
??? {
??????? EXT_LED_CS = ~((1 << i)& 0xff);???
??????? udelay(30000);
??? }
??? EXT_LED_CS = 0xff;
}
?
int lednkey_open(struct inode *inode, struct file *filp)
{
??? MOD_INC_USE_COUNT;
??? return (0);????????? /* success */??????
}
int lednkey_release(struct inode *inode, struct file *filp)
{
??? led_off_on();
??? MOD_DEC_USE_COUNT;
??? return (0);
}
ssize_t lednkey_read(struct file *filp, char *Putbuf, size_t length,loff_t *f_pos)
{
??? unsigned short BottonStatus;
?? unsignedchar Bottontmp = 0;
??? int i;
??? BottonStatus = ( EXT_KEY_CS &0xff );
??? for(i = 0 ; i < 8; ++i)
??? {
??????? if( ((BottonStatus >>i) & 1) == 0 )
??????????? Bottontmp = (i+1);
??? }
??? copy_to_user( Putbuf,&Bottontmp, length);
??? return length;
}
?
ssize_t lednkey_write(struct file *filp, const char *Getbuf, size_tlength, loff_t *f_pos)
{
??? int num;
??? unsigned char UsrWantLed;
??? ?
? ? copy_from_user(&UsrWantLed, Getbuf, length);
???
??? num =? ( (UsrWantLed) & 0xff );
??? EXT_LED_CS = ~(1 <<(num-1));
??? return (0);
}
?
int lednkey_ioctl(struct inode *inode, struct file *filp, unsigned intcmd,unsigned long arg)
{
??? switch(cmd)
??? {
??????? case LED_SHOW:
??????????? {
??????????????? if(arg)
??????????????????? led_off_on();
??????????????? break;
??????????? }
??? }
??? return 0;
}
struct file_operations lednkey_fops = {
??? open:?????? lednkey_open,
??? read:?????? lednkey_read,
??? write:????? lednkey_write,
??? ioctl:????? lednkey_ioctl,
??? release:??? lednkey_release,
};
static int _init xhyper250_keypad_init(void)
?
{
??? int result;
??? result =register_chrdev(LEDnKEY_MAJOR, "lednkey", &lednkey_fops);
???
printf("%s %s initialized.\n",KEYPAD_NAME,KEYPAD_VERSION);
??? led_off_on();
??? return 0;
}
static void _exit xhyper250_keypad_exit(void)
{?
??? unregister_chrdev( LEDnKEY_MAJOR,"lednkey" );?????? ???
??? led_off_on();
}
module_init(xhyper250_keypad_init);
module_exit(xhyper250_keypad_exit);
?
?
測(cè)試文件的源代碼如下:
?
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
?
#define LED_SHOW 10
int fd;//定義文件描述符
?
static char *dev_name = "/dev/keypad";//設(shè)備文件地址
?
int main(int argc, char **argv)
{
??? int data = 0, pre_data;
?
??? fd = open( dev_name , O_RDWR );//打開(kāi)字符設(shè)備文件,返回該文件的描述符
?
??? if( !(fd >=0) )
??? {
??????? printf("%s file openfailed\n", dev_name );//如果打開(kāi)失敗,打印
??????? exit(-1);
??? }
??? printf("\nkeypad App : pressthe push button see show led - Exit Ctrl-C \n",dev_name);
?
??? ioctl(fd,LED_SHOW,1);//利用ioctl來(lái)控制設(shè)備,命令是LED_SHOW
?
??? while(1)???
??? {
??????? do
??????? {
??????????? pre_data = data;
??????????? read( fd, (char *)&data, sizeof(data) );//從fd所代表的設(shè)備中讀取sizeof(data)字節(jié)數(shù)的數(shù)據(jù)到data所指向的區(qū)域中。
??????????? data = (data & 0xff);
??????? }while(data == 0);
?
??????? if( pre_data == 0)
??????? {
??????????? printf("Write %dLED\n",data);
??????????? write( fd, (const char*)&data, sizeof((const char )data) ); //將data所指向的區(qū)域?qū)懭雜izeof(data)字節(jié)數(shù)的數(shù)據(jù)中到fd所代表的設(shè)備。
?
??????? }??????????????
??? }
?
??? close( fd );//關(guān)閉文件
??? return 0;
}
總結(jié)
- 上一篇: 回归预测 | MATLAB实现MSE-E
- 下一篇: 【网络攻防课实验】一:本地系统密码破解