單片機(jī)與嵌入式區(qū)別_第1頁
單片機(jī)與嵌入式區(qū)別_第2頁
單片機(jī)與嵌入式區(qū)別_第3頁
單片機(jī)與嵌入式區(qū)別_第4頁
單片機(jī)與嵌入式區(qū)別_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 單片機(jī)和嵌入式系統(tǒng)linux的區(qū)別隨著嵌入式行業(yè)硬件平臺(tái)的性能增強(qiáng),項(xiàng)目需求和功能日益復(fù)雜,ARM公司推出的 CORTEX-M3,更是讓以往做單片機(jī)的工程師在芯片和技術(shù)選型面臨兩難選擇,本專題將從芯片價(jià)格、整個(gè)系統(tǒng)的硬件軟件設(shè)計(jì)及維護(hù)的成本等各個(gè)方面給您提供一個(gè)參考,并從技術(shù)角度分析單片機(jī)和帶操作系統(tǒng)的系統(tǒng)的軟件開發(fā)的異同點(diǎn)。 1.單片機(jī)與ARM等新處理器的價(jià)格比較 2.帶操作系統(tǒng)與不帶操作系統(tǒng)的軟件開發(fā)的區(qū)別1. 單片機(jī)與ARM等新處理器的價(jià)格比較表1 從表1里面各種芯片的資源,大概就可以猜知它們的應(yīng)用場(chǎng)合。51單片機(jī)通常被用來做一些比較簡(jiǎn)單的控制,比如采集信號(hào)、驅(qū)動(dòng)一些開關(guān)。AT89S5

2、1的Flash只有4K,一個(gè)稍微復(fù)雜的程序就不止4K了。SS T89E564RD是一種擴(kuò)展的51單片機(jī),它的Flash達(dá)到64KB,可以外接最多64KB的SRAM。在SST89 E564RD上的程序可以寫得更復(fù)雜一些,但是它對(duì)外的接口也比較少。CORTEX-M3系列的處理器,對(duì)外接口極其豐富,這使得它的應(yīng)用面更廣,但是限于它的Flash、內(nèi)存還是比較小,一般不在上面運(yùn)行操作系統(tǒng),它算是一個(gè)性能非常突出的單片機(jī)。HI3510是海思半導(dǎo)體公司的一款用于監(jiān)控設(shè)備的芯片,一般上面運(yùn)行Linux系統(tǒng),通過攝像頭采集數(shù)據(jù)、編碼,然后通過網(wǎng)絡(luò)傳輸。另一端接收到數(shù)據(jù)之后,再解碼。在上面運(yùn)行的程序非常復(fù)雜,有漂

3、亮的圖片界面、觸摸屏控制、數(shù)據(jù)庫等等。對(duì)聲音圖像的編解碼更是用到DSP核。S3C2440是一款通用的芯片,它與“高級(jí)單片機(jī)”STM32F103相比,多了存儲(chǔ)控制器和NAND控制器這使得可以外接更大的Flash、更大的內(nèi)存;多了內(nèi)存管理單元(MMU這使得它可以進(jìn)行地址映身(虛擬地址、物理地址之間的映射??梢栽赟3C2440上運(yùn)行Linux系統(tǒng),運(yùn)行更大更復(fù)雜的程序。在具體工作中,怎么選擇這些芯片呢?一句話:成本!進(jìn)行任何產(chǎn)品的開發(fā)都要考慮性價(jià)比,一切應(yīng)該從“成本”出發(fā)。成本不僅包括芯片的價(jià)格,也包括整個(gè)系統(tǒng)的硬件、軟件設(shè)計(jì)及維護(hù)的難易?;诓煌膽?yīng)用,處理器和其他外設(shè)的選擇是要統(tǒng)一考慮的,如果要

4、實(shí)現(xiàn)一個(gè)簡(jiǎn)單的U盤讀寫功能,那么可以選擇帶USB控制器的CORTEX-M3芯片,也可以選擇8051外接一個(gè)USB控制器比如SL811,就看哪種方案成本更低。進(jìn)行芯片選型時(shí),必須基于整個(gè)系統(tǒng)來考慮。員工的偏好和知識(shí)結(jié)構(gòu)也是一個(gè)很重要的因素,如果他對(duì)ATMEL的芯片比較熟,他就不會(huì)傾向于三星;如果他不會(huì)Linux等操作系統(tǒng),那么選型時(shí)就不會(huì)有操作系統(tǒng)的概念。選擇自己不熟悉的芯片和技術(shù),最后的成本也可能更高。2. 帶操作系統(tǒng)與不帶操作系統(tǒng)的軟件開發(fā)的區(qū)別用通俗的話來說,一個(gè)處理芯片不運(yùn)行操作系統(tǒng),我們就把它稱為單片機(jī),而單片機(jī)編程就是寫裸板程序,這個(gè)程序直接在板子上運(yùn)行;相對(duì)的,另一種程序就是基于操

5、作系統(tǒng)的程序,說得簡(jiǎn)單點(diǎn)就是,這種程序可以通過統(tǒng)一的接口調(diào)用“別人寫好的代碼”,在“別人的基礎(chǔ)上”更快更方便地實(shí)現(xiàn)自己的功能。2.1. 驅(qū)動(dòng)開發(fā)的區(qū)別驅(qū)動(dòng)開發(fā)的區(qū)別我總結(jié)有兩點(diǎn):能否借用、是否通用。基于操作系統(tǒng)的軟件資源非常豐富,你要寫一個(gè)Linux設(shè)備驅(qū)動(dòng)時(shí),首先在網(wǎng)上找找,如果有直接拿來用;其次是找到類似的,在它的基礎(chǔ)上進(jìn)行修改;如果實(shí)在沒有,就要研究設(shè)備手冊(cè),從零寫起。而不帶操作系統(tǒng)的驅(qū)動(dòng)開發(fā),一開始就要深入了解設(shè)備手冊(cè),從零開始為它構(gòu)造運(yùn)行環(huán)境,實(shí)現(xiàn)各種函數(shù)以供應(yīng)用程序使用。舉個(gè)例子,要驅(qū)動(dòng)一塊LCD,在單片機(jī)上的做法是:首先要了解LCD的規(guī)格,弄清楚怎么設(shè)置各個(gè)寄存器,比如設(shè)置LCD

6、的時(shí)鐘、分辨率、象素劃出一塊內(nèi)存給LCD使用編寫一個(gè)函數(shù),實(shí)現(xiàn)在指定坐標(biāo)描點(diǎn)。比如根據(jù)x、y坐標(biāo)在這塊內(nèi)存里找到這個(gè)象素對(duì)應(yīng)的小區(qū)域,填入數(shù)據(jù)?;诓僮飨到y(tǒng)時(shí),我們首先是找到類似的驅(qū)動(dòng),弄清楚驅(qū)動(dòng)結(jié)構(gòu),找到要修改的地方進(jìn)行修改。下面是單片機(jī)操作LCD的代碼:初始化:void Tft_Lcd_Init(int type/* 設(shè)置LCD控制器的控制寄存器LCDCON15* 1. LCDCON1:* 設(shè)置VCLK的頻率:VCLK(Hz = HCLK/(CLKVAL+1x2* 選擇LCD類型: TFT LCD* 設(shè)置顯示模式: 16BPP* 先禁止LCD信號(hào)輸出* 2. LCDCON2/3/4:* 設(shè)

7、置控制信號(hào)的時(shí)間參數(shù)* 設(shè)置分辨率,即行數(shù)及列數(shù)* 現(xiàn)在,可以根據(jù)公式計(jì)算出顯示器的頻率:* 當(dāng)HCLK=100MHz時(shí),* Rate = 1/(VSPW+1+(VBPD+1+(LIINEVAL+1+(VFPD+1x* (HSPW+1+(HBPD+1+(HFPD+1+(HOZVAL+1x* 2x(CLKVAL+1/(HCLK* = 60Hz* 3. LCDCON5:* 設(shè)置顯示模式為16BPP時(shí)的數(shù)據(jù)格式: 5:6:5* 設(shè)置HSYNC、VSYNC脈沖的極性(這需要參考具體LCD的接口信號(hào): 反轉(zhuǎn)* 半字(2字節(jié)交換使能*/LCDCON1 = (CLKVAL_TFT_320240<<

8、;8 | (LCDTYPE_TFT<<5 | (BPPMODE_16BPP<<1 | (ENVID_DISABLE<< 0;LCDCON2 = (VBPD_320240<<24 | (LINEVAL_TFT_320240<<14 | (VFPD_320240<<6 | (VSPW_320240;LCDCON3 = (HBPD_320240<<19 | (HOZVAL_TFT_320240<<8 | (HFPD_ 320240;LCDCON4 = HSPW_320240;/ LCDCON5 = (FO

9、RMAT8BPP_565<<11 | (HSYNC_INV<<9 | (VSYNC_IN V<<8 | / (HWSWP<<1;LCDCON5 = (FORMAT8BPP_565<<11 | (HSYNC_INV<<9 | (VS YNC_INV<<8 | (VDEN_INV << 6 | (HWSWP<<0;/* 設(shè)置LCD控制器的地址寄存器LCDSADDR13* 幀內(nèi)存與視口(view point完全吻合,* 圖像數(shù)據(jù)格式如下:* |-PAGEWIDTH-|* y/x 0 1 2 2

10、39* 0 rgb rgb rgb . rgb* 1 rgb rgb rgb . rgb* 1. LCDSADDR1:* 設(shè)置LCDBANK、LCDBASEU* 2. LCDSADDR2:* 設(shè)置LCDBASEL: 幀緩沖區(qū)的結(jié)束地址A21:1* 3. LCDSADDR3:* OFFSIZE等于0,PAGEWIDTH等于(240*2/2*/LCDSADDR1 = (LCDBUFFER>>22<<21 | LOWER21BITS(LCDBUFFER>> 1;LCDSADDR2 = LOWER21BITS(LCDBUFFER+ (LINEVAL_TFT_3202

11、40+1*(HOZVAL_T FT_320240+1*2>>1;LCDSADDR3 = (0<<11 | (LCD_XSIZE_TFT_320240*2/2;/* 禁止臨時(shí)調(diào)色板寄存器 */TPAL = 0;fb_base_addr = LCDBUFFER;bpp = 16;xsize = 320;ysize = 240;描點(diǎn):/* 畫點(diǎn)* 輸入?yún)?shù):* x、y : 象素坐標(biāo)* color: 顏色值* 對(duì)于16BPP: color的格式為0xAARRGGBB (AA = 透明度,* 需要轉(zhuǎn)換為5:6:5格式* 對(duì)于8BPP: color為調(diào)色板中的索引值,* 其顏色取決

12、于調(diào)色板中的數(shù)值*/void PutPixel(UINT32 x, UINT32 y, UINT32 colorUINT8 red,green,blue;switch (bppcase 16:UINT16 *addr = (UINT16 *fb_base_addr + (y * x size + x;red = (color >> 19 & 0x1f;green = (color >> 10 & 0x3f;blue = (color >> 3 & 0x1f;color = (red << 11 | (green <&

13、lt; 5 | blue; / 格式5:6:5*addr = (UINT16 color;break;case 8:UINT8 *addr = (UINT8 *fb_base_addr + (y * xsi ze + x;*addr = (UINT8 color;break;default:break;下面是在Linux的LCD驅(qū)動(dòng)里修改的地方(archarmmach-s3c2440mach-smdk2440.c:/* 320x240 */static struct s3c2410fb_mach_info smdk2440_lcd_cfg _initdata = .regs = .lcdcon

14、1 = S3C2410_LCDCON1_TFT16BPP | S3C2410_LCDCON1_TFT | S3C2410_LCDCON1_CLKVAL(0x04,.lcdcon2 = S3C2410_LCDCON2_VBPD(1 | S3C2410_LCDCON2_LINEVAL(239 | S3C2410_LCDCON2_VFPD(5 | S3C2410_LCDCON2_VSPW(1,.lcdcon3 = S3C2410_LCDCON3_HBPD(36 | S3C2410_LCDCON3_HOZVAL(319 | S3C2410_LCDCON3_HFPD(19,.lcdcon4 = S3C2

15、410_LCDCON4_MVAL(13 | S3C2410_LCDCON4_HSPW(5,.lcdcon5 = S3C2410_LCDCON5_FRM565 |S3C2410_LCDCON5_INVVLINE |S3C2410_LCDCON5_INVV |S3C2410_LCDCON5_INVVDEN |S3C2410_LCDCON5_PWREN |S3C2410_LCDCON5_HWSWP,.gpccon = 0xaaaa56aa,.gpccon_mask = 0xffffffff,.gpcup = 0xffffffff,.gpcup_mask = 0xffffffff,.gpdcon =

16、0xaaaaaaaa,.gpdcon_mask = 0xffffffff,.gpdup = 0xffffffff,.gpdup_mask = 0xffffffff,.fixed_syncs = 1,.type = S3C2410_LCDCON1_TFT,.width = 320,.height = 240,.xres = .min = 320,.max = 320,.defval = 320,.yres = .max = 240,.min = 240,.defval = 240,.bpp = .min = 16,.max = 16,.defval = 16,;這并不表示代碼Linux的驅(qū)動(dòng)程序

17、就比單片機(jī)的驅(qū)動(dòng)程序好寫,怎么在幾萬個(gè)文件中找到要修改的代碼,這也是需要艱苦的學(xué)習(xí)的?;诓僮飨到y(tǒng)的驅(qū)動(dòng)開發(fā),既要懂得芯片的具體操作,也要理解操作系統(tǒng)的軟件結(jié)構(gòu)。有些單片機(jī)廠家也給客戶提供了大量的驅(qū)動(dòng)程序,比如USB HOST驅(qū)動(dòng)程序,這可以讓客戶很容易就可以在它的上面編寫程序讀寫U盤。但是客戶寫的這些程序,只能在這種芯片、這個(gè)驅(qū)動(dòng)程序上使用;更換另一種芯片后,即使芯片公司也提供了驅(qū)動(dòng)程序,但是接口絕對(duì)不一樣,客戶又得重新編寫應(yīng)用程序?;诓僮飨到y(tǒng)的驅(qū)動(dòng)程序要遵循統(tǒng)一的接口,比如對(duì)于不同的芯片的USB HOST驅(qū)動(dòng),它們都要向上提供一個(gè)相同的數(shù)據(jù)結(jié)構(gòu),在里面實(shí)現(xiàn)了各自的USB操作。下面是S3C

18、2410/S3C2440的USB驅(qū)動(dòng)向上層提供的數(shù)據(jù)結(jié)構(gòu):static const struct hc_driver ohci_s3c2410_hc_driver = .deion = hcd_name,.product_desc = "S3C24XX OHCI",.hcd_priv_size = sizeof(struct ohci_hcd,/* generic hardware linkage*/.irq = ohci_irq,.flags = HCD_USB11 | HCD_MEMORY,/* basic lifecycle operations*/.start =

19、ohci_s3c2410_start,.stop = ohci_stop,.shutdown = ohci_shutdown,/* managing i/o requests and associated device resources */.urb_enqueue = ohci_urb_enqueue,.urb_dequeue = ohci_urb_dequeue,.endpoint_disable = ohci_endpoint_disable,/* scheduling support*/.get_number = ohci_get_,/* root hub support*/.hub

20、_status_data = ohci_s3c2410_hub_status_data,.hub_control = ohci_s3c2410_hub_control,.hub_irq_enable = ohci_rhsc_enable,#ifdef CONFIG_PM.bus_suspend = ohci_bus_suspend,.bus_resume = ohci_bus_resume,#endif.start_port_reset = ohci_start_port_reset,;下面是ATMEL公司的ARM芯片的USB驅(qū)動(dòng)向上層提供的數(shù)據(jù)結(jié)構(gòu):/*-* /static const st

21、ruct hc_driver ohci_at91_hc_driver = .deion = hcd_name,.product_desc = "AT91 OHCI",.hcd_priv_size = sizeof(struct ohci_hcd,/* generic hardware linkage*/.irq = ohci_irq,.flags = HCD_USB11 | HCD_MEMORY,/* basic lifecycle operations*/.start = ohci_at91_start,.stop = ohci_stop,.shutdown = ohci

22、_shutdown,/* managing i/o requests and associated device resources*/.urb_enqueue = ohci_urb_enqueue,.urb_dequeue = ohci_urb_dequeue,.endpoint_disable = ohci_endpoint_disable,/* scheduling support*/.get_number = ohci_get_,/* root hub support*/.hub_status_data = ohci_hub_status_data,.hub_control = ohc

23、i_hub_control,.hub_irq_enable = ohci_rhsc_enable,#ifdef CONFIG_PM.bus_suspend = ohci_bus_suspend,.bus_resume = ohci_bus_resume,#endif.start_port_reset = ohci_start_port_reset,;基于通用性,即使是你自己寫的Linux驅(qū)動(dòng),簡(jiǎn)單到只是點(diǎn)亮一個(gè)LED,基于“通用性”,這個(gè)驅(qū)動(dòng)也要向上提供統(tǒng)一的接口。下面是單片機(jī)LED驅(qū)動(dòng)程序和Linux下的LED驅(qū)動(dòng)程序的部分代碼。單片機(jī)LED驅(qū)動(dòng)程序:void led_init(voidGP

24、BCON = GPB5_out; / 將LED對(duì)應(yīng)的GPB5引腳設(shè)為輸出void led_on(voidGPBDAT &= (1<<5;void led_off(voidGPBDAT |= (1<<5;Linux的LED驅(qū)動(dòng)程序:#define DEVICE_NAME "leds" /* 加載模式后,執(zhí)行”cat /proc/devices”命令看到的設(shè)備名稱 */#define LED_MAJOR 231 /* 主設(shè)備號(hào) */* 應(yīng)用程序執(zhí)行ioctl(fd, cmd, arg時(shí)的第2個(gè)參數(shù) */#define IOCTL_LED_ON 0

25、#define IOCTL_LED_OFF 1/* 用來指定LED所用的GPIO引腳 */static unsigned long led_table = S3C2410_GPB5,S3C2410_GPB6,S3C2410_GPB7,S3C2410_GPB8,;/* 用來指定GPIO引腳的功能:輸出 */static unsigned int led_cfg_table = S3C2410_GPB5_OUTP,S3C2410_GPB6_OUTP,S3C2410_GPB7_OUTP,S3C2410_GPB8_OUTP, ; /* 應(yīng)用程序?qū)υO(shè)備文件/dev/leds 執(zhí)行 open(.時(shí), *

26、就會(huì)調(diào)用 s3c24xx_leds_open 函數(shù) */ static int s3c24xx_leds_open(struct inode *inode, struct file *file int i; for (i = 0; i < 4; i+ / 設(shè)置 GPIO 引腳的功能:本驅(qū)動(dòng)中 LED 所涉及的 GPIO 引腳設(shè)為輸出 功能 s3c2410_gpio_cfgpin(led_tablei, led_cfg_tablei; return 0; /* 應(yīng)用程序?qū)υO(shè)備文件/dev/leds 執(zhí)行 ioclt(.時(shí), * 就會(huì)調(diào)用 s3c24xx_leds_ioctl 函數(shù) */ static int s3c24xx_leds_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg if (arg > 4 return -EINVAL; switch(cmd case IOCTL_LED_ON: / 設(shè)置指定引腳的輸出電平為 0 s3c2410_gpio_setpin(led_tablearg, 0; return 0; case IOCTL_LED_OFF: / 設(shè)置指定引腳的輸出電

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論