跟着嵌入式职业硬件渠道的功用增强,项目需求和功用日益杂乱,ARM公司推出的 CORTEX-M3,更是让以往做单片机的工程师在芯片和技能选型面对两难挑选,本专题将从芯片价格、整个体系的硬件软件设计及保护的本钱等各个方面给您供给一个参阅, 并从技能视点剖析单片机和带操作体系的体系的软件开发的异同点。
●1.单片机与ARM等新处理器的价格比较
●2.带操作体系与不带操作体系的软件开发的差异
●2.1.驱动开发的差异
●2.2.运用程序开发的差异
1. 单片机与ARM等新处理器的价格比较
表1
类型
|
架构
|
资源
|
价格(元)
|
AT89S51
|
8051
|
最高频率33MHz 4KB Flash 128B内部RAM 32个可编程IO引脚 两个16bit的计数器 一个UART口
|
4
|
SST89E564RD
|
8051
|
最高频率40MHz 64KB Flash 1KB内部RAM 32个可编程IO引脚 三个16bit的计数器 一个UART口 一个SPI接口
|
35
|
STM32F103
|
CORTEX-M3
|
最高频率72MHz 64KB或128BK Flash 20KB SRAM 80个可编程IO引脚 2个12bit的ADC 7通道DMA操控器 规范调试口(SWD和JTAG) 7个定时器 USB接口 2个I2C接口 3个UART 2个SPI接口
|
21
|
HI3510
|
ARM9+DSP双核
|
最高作业频率240MHz 视频处理单元,支撑多种协议的实时编解码 图形处理单元 视音频接口 以太网接口 DDR操控器 USB、UART、IrDA、 I2C、SPI、GPIO等多种外设接口
|
80
|
S3C2440
|
ARM9
|
最高作业频率400MHz SDRAM操控器 LCD操控器 4通道DMA操控器 3个UART 2个SPI 1个I2C接口 IIS音频接口 SD HOST接口 2个USB接口 8个10bit ADC 摄像头接口 Camera接口
|
40
|
从表1里边各种芯片的资源,大约就能够猜知它们的运用场合。51单片机通常被用来做一些比较简略的操控,比方收集信号、驱动一些开关。AT89S51的Flash只要4K,一个略微杂乱的程序就不止4K了。SST89E564RD是一种扩展的51单片机,它的Flash到达64KB,能够外接最多64KB的SRAM。在SST89E564RD上的程序能够写得更杂乱一些,可是它对外的接口也比较少。
CORTEX-M3系列的处理器,对外接口极其丰富,这使得它的运用面更广,可是限于它的Flash、内存仍是比较小,一般不在上面运转操作体系,它算是一个功用十分杰出的单片机。
HI3510是海思半导体公司的一款用于监控设备的芯片,一般上面运转Linux体系,经过摄像头收集数据、编码,然后经过网络传输。另一端接收到数据之后,再解码。在上面运转的程序十分杂乱,有美丽的图片界面、触摸屏操控、数据库等等。对声响图画的编解码更是用到DSP核。
S3C2440是一款通用的芯片,它与“高档单片机”STM32F103比较,多了存储操控器和NAND操控器──这使得能够外接更大的Flash、更大的内存;多了内存办理单元(MMU)──这使得它能够进行地址映身(虚拟地址、物理地址之间的映射)。能够在S3C2440上运转Linux体系,运转更大更杂乱的程序。
在详细作业中,怎样挑选这些芯片呢?一句话:本钱!进行任何产品的开发都要考虑性价比,全部应该从“本钱”动身。本钱不只包含芯片的价格,也包含整个体系的硬件、软件设计及保护的难易。
芯片价格能够在电子市场问到,也能够在http://www.ic.net.cn上找到有卖这种芯片的货台,然后电话咨询。
依据不同的运用,处理器和其他外设的挑选是要一致考虑的,假如要完成一个简略的U盘读写功用,那么能够挑选带USB操控器的CORTEX-M3芯片,也能够挑选8051外接一个USB操控器比方SL811,就看哪种计划本钱更低。进行芯片选型时,有必要依据整个体系来考虑。
职工的偏好和知识结构也是一个很重要的要素,假如他对ATMEL的芯片比较熟,他就不会倾向于三星;假如他不会Linux等操作体系,那么选型时就不会有操作体系的概念。挑选自己不熟悉的芯片和技能,最终的本钱也或许更高。
2. 带操作体系与不带操作体系的软件开发的差异
用浅显的话来说,一个处理芯片不运转操作体系,咱们就把它称为单片机,而单片机编程便是写裸板程序,这个程序直接在板子上运转;相对的,另一种程序便是依据操作体系的程序,说得简略点便是,这种程序能够经过一致的接口调用“他人写好的代码”,在“他人的基础上”更快更方便地完成自己的功用。
2.1. 驱动开发的差异
驱动开发的差异我总结有两点:能否借用、是否通用。
2.1.1 能否借用
依据操作体系的软件资源十分丰富,你要写一个Linux设备驱动时,首先在网上找找,假如有直接拿来用;其次是找到相似的,在它的基础上进行修正;假如真实没有,就要研讨设备手册,从零写起。而不带操作体系的驱动开发,一开始就要深化了解设备手册,从零开始为它结构运转环境,完成各种函数以供运用程序运用。
举个比方,要驱动一块LCD,在单片机上的做法是:
① 首先要了解LCD的标准,弄清楚怎样设置各个寄存器,比方设置LCD的时钟、分辨率、象素
② 划出一块内存给LCD运用
③ 编写一个函数,完成在指定坐标描点。比方依据x、y坐标在这块内存里找到这个象素对应的小区域,填入数据。
依据操作体系时,咱们首先是找到相似的驱动,弄清楚驱动结构,找到要修正的当地进行修正。
下面是单片机操作LCD的代码:
① 初始化:
void Tft_Lcd_Init(int type)
{
LCDCON1 = (CLKVAL_TFT_320240<<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 = (FORMAT8BPP_565<<11) | (HSYNC_INV<<9) | (VSYNC_INV<<8) |
//(HWSWP<<1);
LCDCON5 = (FORMAT8BPP_565<<11) | (HSYNC_INV<<9) | (VSYNC_INV<<8) | (VDEN_INV << 6) |
(HWSWP<<0);
LCDSADDR1 = ((LCDBUFFER>>22)<<21) | LOWER21BITS(LCDBUFFER>>1);
LCDSADDR2 = LOWER21BITS((LCDBUFFER+
(LINEVAL_TFT_320240+1)*(HOZVAL_TFT_320240+1)*2)>>1);
LCDSADDR3 = (0<<11) | (LCD_XSIZE_TFT_320240*2/2);
TPAL = 0;
fb_base_addr = LCDBUFFER;
bpp = 16;
xsize = 320;
ysize = 240;
}
② 描点:
void PutPixel(UINT32 x, UINT32 y, UINT32 color)
{
UINT8 red,green,blue;
switch (bpp){
case 16:
{
UINT16 *addr = (UINT16 *)fb_base_addr + (y * xsize + x);
red = (color >> 19) & 0x1f;
green = (color >> 10) & 0x3f;
blue = (color >> 3) & 0x1f;
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):
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_r(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_INVVLINE |
S3C2410_LCDCON5_INVV |
S3C2410_LCDCON5_INVVDEN |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
},
.gpccon = 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,
},
.yres = {
.max = 240,
.min = 240,
.defval = 240,
},
.bpp = {
.min = 16,
.max = 16,
.defval = 16,
},
};
这并不表明代码Linux的驱动程序就比单片机的驱动程序好写,怎样在几万个文件中找到要修正的代码,这也是需求艰苦的学习的。依据操作体系的驱动开发,既要懂得芯片的详细操作,也要了解操作体系的软件结构。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/257962.html