单片机和嵌入式系统linux的区别_第1页
单片机和嵌入式系统linux的区别_第2页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机和嵌入式系统linux的区别随着嵌入式行业硬件平台的性能增强,项目需求和功能日益复杂,ARM公司推出的 方面给您 提供一个参考,并从技术角度分析单片机和带操作系统的系统的软件开发的异同点。 1.单片机与ARM等新处理器的价格比较 2.带操作系统与不带操作系统的软件开发的区别 2.1.驱动开发的区别 2.2.应用程序开发的区别1. 单片机与ARM等新处理器的价格比较表1型号架构资源价格(元)4AT89S518051128B内部RAM32个可编程IO引脚两个16bit的计数器一个UART口最高频率40MHzSST89E564RD 8051352120KB SRAM7个定时器USB接口2个I2

2、C接口3个UART2个SPI接口HI3510ARM9+DSP双 最高工作频率80核240MHzUSB、UART、IrDA、等多种外设接口S3C2440ARM9402个SPI1个I2C接口IIS音频接口SD HOST接口2个USB接口8个10bit ADC摄像头接口Camera 接口从表 1 单片机通常被用来做一些比较简单的控制,比如采集信号、驱动一些开关。AT89S51 的Flash 只有 4K 是一种扩展的 51 单片机,它的 Flash 达到 64KB,可以外接最多 64KB 的 SRAM。在SST89E564RD 上的程序可以写得更复杂一些,但是它对外的接口也比较少。CORTEX-M3

3、系列的处理器,对外接口极其丰富,这使得它的应用面更广,但是限于它的 Flash、内存还是比较小,一般不在上面运行操作系统,它算是一个性能非常突出的单片机。HI3510 是海思半导体公司的一款用于监控设备的芯片,一般上面运行 Linux再解码。 在上面运行的程序非常复杂,有漂亮的图片界面、触摸屏控制、数据库等等。对声音图像的编解码更是用到 DSP 核。S3C2440 是一款通用的芯片,它与“高级单片机”STM32F103 相比,多了存储控制器和 NAND 控制器这使得可以外接更大的 Flash、更大的内存;多了内 之间的映射)。可以在 S3C2440 上运行 Linux 系统,运行更大更复杂的程

4、 序。系统的硬件、软件设计及维护的难易。 上找到有卖这种芯片的柜台,然后电话咨询。单的 U 盘读写功能,那么可以选择带USB 控制器的 CORTEX-M3 芯片,也可以选择 8051 外接一个 USB 控制器比如 芯片选型时,必须基于整个系统来考虑。员工的偏好和知识结构也是一个很重要的因素,如果他对 ATMEL 的芯片比较熟,他就不会倾向于三星;如果他不会 Linux 等操作系统,那么选型时就不会有操作系统的概念。选择自己不熟悉的芯片和技术,最后的成本也可能更高。2. 带操作系统与不带操作系统的软件开发的区别用通 俗的话来说,一个处理芯片不运行操作系统,我们就把它称为单片机,而就是基于操 作系

5、统的程序,说得简单点就是,这种程序可以通过统一的接口调用“别人写好的代码”,在“别人的基础上”更快更方便地实现自己的功能。2.1. 驱动开发的区别驱动开发的区别我总结有两点:能否借用、是否通用。2.1.1 能否借用基于 操作系统的软件资源非常丰富,你要写一个Linux设备驱动时,首先在网上找找,如果有直接拿来用;其次是找到类似的,在它的基础上进行修改;如果实在没 有,就要研究设备手册,从零写起。而不带操作系统的驱动开发,一开程序使用。举个例子,要驱动一块LCD,在单片机上的做法是: 首先要了解LCD的规格,弄清楚怎么设置各个寄存器,比如设置LCD的时钟、分辨率、象素 划出一块内存给LCD使用

6、坐标在这块内存里找到这个象素对应的小区域,填入数据。地方进行修改。下面是单片机操作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

7、+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1)x*(HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)x2x(CLKVAL+1)/(HCLK)= 60Hz* 3. LCDCON5:*设置显示模式为16BPP时的数据格式: 5:6:5*设置HSYNC、VSYNC脉冲的极性(这需要参考具体LCD的接口信号): 反转*半字(2字节)交换使能*/LCDCON1 = (CLKVAL_TFT_3202408) |(LCDTYPE_TFT5) | (ENVID_DISABLE0);(BPPMODE_16BPP1) |LCDCON2 = (VBPD_32024024

8、) |(LINEVAL_TFT_32024014) | (VFPD_3202406) | (VSPW_320240);LCDCON3 = (HBPD_32024019) |(HOZVAL_TFT_3202408) | (HFPD_320240);LCDCON4 = HSPW_320240;/LCDCON5 = (FORMAT8BPP_56511) | (HSYNC_INV9)| (VSYNC_INV8) | /(HWSWP1);LCDCON5 = (FORMAT8BPP_56511) |(HSYNC_INV9) | (VSYNC_INV8) | (VDEN_INV 6) | (HWSWP22)

9、1);LCDSADDR2 = LOWER21BITS(LCDBUFFER+ (LINEVAL_TFT_320240+1)*(HOZVAL_TFT_320240+1)*2)1);LCDSADDR3 = (0 19) & 0 x1f;green = (color 10) & 0 x3f;blue = (color 3) & 0 x1f;color = (red 11) | (green 5) | blue; / 格式5:6:5*addr = (UINT16) color;break;case 8:UINT8 *addr = (UINT8 *)fb_base_addr + (y * xsize +x

10、);*addr = (UINT8) color;break;default:break;下面是在Linux的LCD驱动里修改的地方(archarmmach-s3c2440mach-smdk2440.c):/* 320 x240 */static struct s3c2410fb_mach_info smdk2440_lcd_cfg _initdata =.regs = .lcdcon1 = S3C2410_LCDCON1_TFT16BPP | S3C2410_LCDCON1_TFT | S3C2410_LCDCON1_CLKVAL(0 x04),.lcdcon2 = S3C2410_LCDCO

11、N2_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 = S3C2410_LCDCON4_MVAL(13) | S3C2410_LCDCON4_HSPW(5),.lcdcon5 = S3C2410_LCDCON5_FRM565 |S3C2410_LCDCON5_

12、INVVLINE |S3C2410_LCDCON5_INVV |S3C2410_LCDCON5_INVVDEN |S3C2410_LCDCON5_PWREN |S3C2410_LCDCON5_HWSWP,.gpccon = 0 xaaaa56aa,.gpccon_mask = 0 xffffffff,.gpcup = 0 xffffffff,.gpcup_mask = 0 xffffffff,.gpdcon = 0 xaaaaaaaa,.gpdcon_mask = 0 xffffffff,.gpdup = 0 xffffffff,.gpdup_mask = 0 xffffffff,.fixed

13、_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的驱动程序就比单片机的驱动程序好写,怎么在几万个既要懂得芯片的具体操作,也要理解操作系统的软件结构。2.1.2 是否通用有些 USB HOST驱动程序,这可以让客户很容易就可以在它的上面

14、编写程序读写U盘。但是客户写的这些程序,只能在这种芯片、这个驱动程序上使用;更换另一种芯片 后,即使芯片公司也提供了驱动程序,但是接口绝对不一样,客户又得重新编写应用程序。基于操作系统的驱动程序要遵循统一的接口,比如对于不同的芯片的USBHOSTUSB操作。下面是S3C2410/S3C2440的USB驱动向上层提供的数据结构:static const struct hc_driver ohci_s3c2410_hc_driver = .deion = hcd_name,.product_desc = S3C24XX OHCI,.hcd_priv_size = sizeof(struct ohc

15、i_hcd),/* 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

16、_dequeue,.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_resu

17、me = ohci_bus_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

18、_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

19、support*/.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,;基于通用性,即使是你自己写

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

21、 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_G

22、PB6_OUTP,S3C2410_GPB7_OUTP,S3C2410_GPB8_OUTP,;/* 应用程序对设备文件/dev/leds执行open(.)时,* 就会调用s3c24xx_leds_open函数*/static int s3c24xx_leds_open(struct inode *inode, struct file *file)int i;for (i = 0; i 4) return -EINVAL;switch(cmd) case IOCTL_LED_ON:/ 设置指定引脚的输出电平为0s3c2410_gpio_setpin(led_tablearg, 0);return 0;case IOCTL_LED_OFF:/ 设置指定引脚的输出电平为1s3c2410_gpio_setpin(led_tablearg, 1);return 0;default:return -EINVAL;/* 这个结构是字符设备驱动程序的核心* 当应用程序操作设备文件时所调用的o

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论