单片机与嵌入式区别.doc

上传人:hw****26 文档编号:3542972 上传时间:2019-06-03 格式:DOC 页数:13 大小:66.50KB
下载 相关 举报
单片机与嵌入式区别.doc_第1页
第1页 / 共13页
单片机与嵌入式区别.doc_第2页
第2页 / 共13页
单片机与嵌入式区别.doc_第3页
第3页 / 共13页
单片机与嵌入式区别.doc_第4页
第4页 / 共13页
单片机与嵌入式区别.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

1、单片机和嵌入式系统 linux 的区别 随着嵌入式行业硬件平台的性能增强,项目需求和功能日益复杂,ARM 公司推出的 CORTEX-M3,更是让以往做单片机的工程师在芯片和技术选型面临两难选择,本专题将从芯片价格、整个系统的硬件软件设计及维护的成本等各个方面给您提供一个参考, 并从技术角度分析单片机和带操作系统的系统的软件开发的异同点。 1.单片机与 ARM 等新处理器的价格比较 2.带操作系统与不带操作系统的软件开发的区别 2.1.驱动开发的区别 2.2.应用程序开发的区别1. 单片机与 ARM 等新处理器的价格比较表 1型号 架构 资源 价格( 元)AT89S51 8051 最高频率 33

2、MHz4KB Flash128B 内部 RAM32 个可编程 IO 引脚 两个 16bit 的计数器 一个 UART 口 4SST89E564RD 8051 最高频率 40MHz 64KB Flash1KB 内部 RAM32 个可编程 IO 引脚 三个 16bit 的计数器 一个 UART 口 一个 SPI 接口 35STM32F103 CORTEX-M3 最高频率 72MHz64KB 或 128BK Flash20KB SRAM80 个可编程 IO 引脚 2 个 12bit 的 ADC7 通道 DMA 控制器 标准调试口(SWD 和 JTAG)7 个定时器 USB 接口 2 个 I2C 接口

3、 3 个 UART2 个 SPI 接口 21HI3510 ARM9+DSP 双核 最高工作频率 240MHz视频处理单元,支持多种协议的实时编解码 80图形处理单元 视音频接口 以太网接口 DDR 控制器 USB、UART、IrDA 、 I2C、SPI、GPIO 等多种外设接口 S3C2440 ARM9 最高工作频率 400MHzSDRAM 控制器 LCD 控制器 4 通道 DMA 控制器 3 个 UART2 个 SPI1 个 I2C 接口 IIS 音频接口 SD HOST 接口 2 个 USB 接口 8 个 10bit ADC摄像头接口 Camera 接口 40从表 1 里面各种芯片的资源,

4、大概就可以猜知它们的应用场合。51 单片机通常被用来做一些比较简单的控制,比如采集信号、驱动一些开关。AT89S51 的 Flash 只有 4K,一个稍微复杂的程序就不止 4K 了。SST89E564RD 是一种扩展的 51 单片机,它的 Flash 达到 64KB,可以外接最多 64KB 的 SRAM。在 SST89E564RD 上的程序可以写得更复杂一些,但是它对外的接口也比较少。CORTEX-M3 系列的处理器,对外接口极其丰富,这使得它的应用面更广,但是限于它的 Flash、内存还是比较小,一般不在上面运行操作系统,它算是一个性能非常突出的单片机。HI3510 是海思半导体公司的一款用

5、于监控设备的芯片,一般上面运行 Linux 系统,通过摄像头采集数据、编码,然后通过网络传输。另一端接收到数据之后,再解码。在上面运行的程序非常复杂,有漂亮的图片界面、触摸屏控制、数据库等等。对声音图像的编解码更是用到 DSP 核。S3C2440 是一款通用的芯片,它与“高级单片机”STM32F103 相比,多了存储控制器和 NAND 控制器这使得可以外接更大的 Flash、更大的内存;多了内存管理单元(MMU)这使得它可以进行地址映身(虚拟地址、物理地址之间的映射)。可以在 S3C2440 上运行 Linux 系统,运行更大更复杂的程序。在具体工作中,怎么选择这些芯片呢?一句话:成本!进行任

6、何产品的开发都要考虑性价比,一切应该从“成本 ”出发。成本不仅包括芯片的价格,也包括整个系统的硬件、软件设计及维护的难易。芯片价格可以在电子市场问到,也可以在 http:/ 上找到有卖这种芯片的柜台,然后电话咨询。基于不同的应用,处理器和其他外设的选择是要统一考虑的,如果要实现一个简单的 U 盘读写功能,那么可以选择带 USB 控制器的 CORTEX-M3 芯片,也可以选择 8051 外接一个 USB 控制器比如 SL811,就看哪种方案成本更低。进行芯片选型时,必须基于整个系统来考虑。员工的偏好和知识结构也是一个很重要的因素,如果他对 ATMEL 的芯片比较熟,他就不会倾向于三星;如果他不会

7、 Linux 等操作系统,那么选型时就不会有操作系统的概念。选择自己不熟悉的芯片和技术,最后的成本也可能更高。2. 带操作系统与不带操作系统的软件开发的区别用通俗的话来说,一个处理芯片不运行操作系统,我们就把它称为单片机,而单片机编程就是写裸板程序,这个程序直接在板子上运行;相对的,另一种程序就是基于操作系统的程序,说得简单点就是,这种程序可以通过统一的接口调用“别人写好的代码”,在“别人的基础上”更快更方便地实现自己的功能。2.1. 驱动开发的区别驱动开发的区别我总结有两点:能否借用、是否通用。2.1.1 能否借用基于操作系统的软件资源非常丰富,你要写一个 Linux 设备驱动时,首先在网上

8、找找,如果有直接拿来用;其次是找到类似的,在它的基础上进行修改;如果实在没有,就要研究设备手册,从零写起。而不带操作系统的驱动开发,一开始就要深入了解设备手册,从零开始为它构造运行环境,实现各种函数以供应用程序使用。 举个例子,要驱动一块 LCD,在单片机上的做法是: 首先要了解 LCD 的规格,弄清楚怎么设置各个寄存器,比如设置 LCD 的时钟、分辨率、象素 划出一块内存给 LCD 使用 编写一个函数,实现在指定坐标描点。比如根据 x、y 坐标在这块内存里找到这个象素对应的小区域,填入数据。基于操作系统时,我们首先是找到类似的驱动,弄清楚驱动结构,找到要修改的地方进行修改。下面是单片机操作

9、LCD 的代码: 初始化:void Tft_Lcd_Init(int type)/* * 设置 LCD 控制器的控制寄存器 LCDCON15* 1. LCDCON1:* 设置 VCLK 的频率:VCLK(Hz) = HCLK/(CLKVAL+1)x2* 选择 LCD 类型: TFT LCD * 设置显示模式: 16BPP* 先禁止 LCD 信号输出* 2. LCDCON2/3/4:* 设置控制信号的时间参数* 设置分辨率,即行数及列数* 现在,可以根据公式计算出显示器的频率:* 当 HCLK=100MHz 时,* Rate = 1/(VSPW+1)+(VBPD+1)+(LIINEVAL+1)+

10、(VFPD+1)x* (HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)x* 2x(CLKVAL+1)/(HCLK)* = 60Hz* 3. LCDCON5:* 设置显示模式为 16BPP 时的数据格式: 5:6:5* 设置 HSYNC、VSYNC 脉冲的极性 (这需要参考具体 LCD 的接口信号): 反转* 半字(2 字节)交换使能*/LCDCON1 = (CLKVAL_TFT_32024022)1);LCDSADDR2 = LOWER21BITS(LCDBUFFER+ (LINEVAL_TFT_320240+1)*(HOZVAL_TFT_320240+1)*2)1)

11、;LCDSADDR3 = (0 19) green = (color 10) blue = (color 3) color = (red 11) | (green 5) | blue; / 格式 5:6:5*addr = (UINT16) color;break;case 8:UINT8 *addr = (UINT8 *)fb_base_addr + (y * xsize + x);*addr = (UINT8) color;break;default:break;下面是在 Linux 的 LCD 驱动里修改的地方(archarmmach-s3c2440mach-smdk2440.c):/*

12、320x240 */static struct s3c2410fb_mach_info smdk2440_lcd_cfg _initdata = .regs = .lcdcon1 = 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 = S

13、3C2410_LCDCON3_HBPD(36) | S3C2410_LCDCON3_HOZVAL(319) | S3C2410_LCDCON3_HFPD(19),.lcdcon4 = S3C2410_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,.gpc

14、con = 0xaaaa56aa,.gpccon_mask = 0xffffffff,.gpcup = 0xffffffff,.gpcup_mask = 0xffffffff,.gpdcon = 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,.yr

15、es = .max = 240,.min = 240,.defval = 240,.bpp = .min = 16,.max = 16,.defval = 16,;这并不表示代码 Linux 的驱动程序就比单片机的驱动程序好写,怎么在几万个文件中找到要修改的代码,这也是需要艰苦的学习的。基于操作系统的驱动开发,既要懂得芯片的具体操作,也要理解操作系统的软件结构。2.1.2 是否通用有些单片机厂家也给客户提供了大量的驱动程序,比如 USB HOST 驱动程序,这可以让客户很容易就可以在它的上面编写程序读写 U 盘。但是客户写的这些程序,只能在这种芯片、这个驱动程序上使用;更换另一种芯片后,即使芯

16、片公司也提供了驱动程序,但是接口绝对不一样,客户又得重新编写应用程序。基于操作系统的驱动程序要遵循统一的接口,比如对于不同的芯片的 USB HOST 驱动,它们都要向上提供一个相同的数据结构,在里面实现了各自的 USB 操作。下面是 S3C2410/S3C2440 的 USB 驱动向上层提供的数据结构:static const struct hc_driver ohci_s3c2410_hc_driver = .deion = hcd_name,.product_desc = “S3C24XX OHCI“,.hcd_priv_size = sizeof(struct ohci_hcd),/*

17、generic hardware linkage*/.irq = ohci_irq,.flags = HCD_USB11 | HCD_MEMORY,/* basic lifecycle operations*/.start = 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,.

18、endpoint_disable = ohci_endpoint_disable,/* scheduling support*/.get_number = ohci_get_,/* root hub support*/.hub_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_b

19、us_resume,#endif.start_port_reset = ohci_start_port_reset,;下面是 ATMEL 公司的 ARM 芯片的 USB 驱动向上层提供的数据结构:/*-*/static const struct 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_

20、USB11 | HCD_MEMORY,/* basic lifecycle operations*/.start = ohci_at91_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 sup

21、port*/.get_number = ohci_get_,/* root hub support*/.hub_status_data = ohci_hub_status_data,.hub_control = ohci_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,;基于通用性,即使是你自己写的

22、Linux 驱动,简单到只是点亮一个 LED,基于“通用性”,这个驱动也要向上提供统一的接口。下面是单片机 LED 驱动程序和 Linux 下的 LED 驱动程序的部分代码。单片机 LED 驱动程序:void led_init(void)GPBCON = GPB5_out; / 将 LED 对应的 GPB5 引脚设为输出void led_on(void) GPBDAT void led_off(void) GPBDAT |= (15);Linux 的 LED 驱动程序:#define DEVICE_NAME “leds“ /* 加载模式后,执行 ”cat /proc/devices”命令看到的

23、设备名称 */#define LED_MAJOR 231 /* 主设备号 */* 应用程序执行 ioctl(fd, cmd, arg)时的第 2 个参数 */#define IOCTL_LED_ON 0#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,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。