Linux--串口屏显示控制实验

一、 实验简介

实验目标:在Linux下通过串口屏显示并控制功能模块的状态和参数
操作系统:Ubuntu 20.04.6 LTS
串口屏:迪文串口屏 DMG48270C043_03W
在这里插入图片描述

二、实现代码-- C语言

   代码功能就是在Linux下使用串口和TCP,重点在于如何处理好串口和网口接收的数据。 通过本实验可以基本掌握如何在Linux下使用串口和TCP。网上很多教程都会介绍Liunx下如何实现串口和TCP这两种通信方式,很少有结合实际应用进行介绍的文章,本文就将结合一个实际应用例子进行分析记录,也是对自己学习这些东西的一个简单总结记录。

2.1 通信协议

  这里的通信协议不是说解释串口或是TCP这样的通信协议,本文指的是在传输数据过程自己定义的数据帧格式,不同的数据需要设置功能模块的不同功能通信协议的有助于我们管理不同的控制信号。发送数据时按以下格式设置好数据后再通过到其他模块。

主控模块<----->功能模块 网口通信TCP

字段指令头指令码数据长度数据
长度(字节)114N
0xAA不同指令N具体数据

主控模块<----->串口屏 串口通信
在这里插入图片描述

2.2 串口通信

   Linux的串口表现为设备文件。实验使用的串口屏是USB扩展的,实验前需要安装CH341驱动串口设备文件命名为dev/ttyCH341USB*,不同的硬件平台对串口设备文件的命名有所区别。

2.2.1 初始化串口

   在Linux下,不管是设备、文档、可执行程序,对于内核来说都是读写文件,会涉及到open、read、write的操作,对于文件操作就有了“阻塞”和“非阻塞”的概念。不同模式对文件的处理方式会有不同,使用的场景也不一样。

“阻塞”的定义
对于 read,当串口的接收缓冲区没有数据的时候,read函数会阻塞在那里,不返回,程序也无法下一步执行,一直到串口的接收缓冲区中有数据可读时,read读到了想要长度的字节数后才会返回,返回值为读到的字节数。
对于write,当串口发送缓冲区满时,或者剩下的空间小鱼将要写入的字节数时,则write阻塞,一直到串口的发送缓冲区中剩下的空间大于等于将要写入的字节数,再执行写操作,返回写入的字节数。

“非阻塞”的定义
对于read,当串口的接收缓冲区中没有数据时,read操作立即返回,返回值为0.
对于write,当串口发送缓冲区满,或者剩下的空间小鱼将要写入的字节数时,write仍然会被执行,写入当前串口发送缓冲区剩下的空间字节数,然后返回写入的字节数。

serial init

    serial = serial_new();
    if (serial_open(serial,"/dev/ttyCH341USB1",115200) <0) //打开并设置设备文件
    {
        serial_free(serial);
        printf("serial open failed!\n");
    }
    else
    {   
        printf("serial opened! \n");
    }

serial_open 函数
   网上很多都是直接用的open函数,实验使用的函数同样基于open函数通过该函数设置好串口,默认使用的阻塞模式。

int serial_open(serial_t *serial, const char *path, uint32_t baudrate) {
    return serial_open_advanced(serial, path, baudrate, 8, PARITY_NONE, 1, false, false);//参数设置
}

int serial_open_advanced(serial_t *serial, const char *path, uint32_t baudrate, unsigned int databits, serial_parity_t parity, unsigned int stopbits, bool xonxoff, bool rtscts) {
    struct termios termios_settings;

    /* Validate args */
    if (databits != 5 && databits != 6 && databits != 7 && databits != 8)
        return _serial_error(serial, SERIAL_ERROR_ARG, 0, "Invalid data bits (can be 5,6,7,8)");
    if (parity != PARITY_NONE && parity != PARITY_ODD && parity != PARITY_EVEN)
        return _serial_error(serial, SERIAL_ERROR_ARG, 0, "Invalid parity (can be PARITY_NONE,PARITY_ODD,PARITY_EVEN)");
    if (stopbits != 1 && stopbits != 2)
        return _serial_error(serial, SERIAL_ERROR_ARG, 0, "Invalid stop bits (can be 1,2)");

    memset(serial, 0, sizeof(serial_t));

    /* Open serial port */
    if ((serial->fd = open(path, O_RDWR | O_NOCTTY)) < 0)
        return _serial_error(serial, SERIAL_ERROR_OPEN, errno, "Opening serial port \"%s\"", path);
    fcntl(serial->fd,F_SETFL,0);
    memset(&termios_settings, 0, sizeof(termios_settings));

    /* c_iflag */

    /* Ignore break characters */
    termios_settings.c_iflag = IGNBRK;
    if (parity != PARITY_NONE)
        termios_settings.c_iflag |= INPCK;
    /* Only use ISTRIP when less than 8 bits as it strips the 8th bit */
    if (parity != PARITY_NONE && databits != 8)
        termios_settings.c_iflag |= ISTRIP;
    if (xonxoff)
        termios_settings.c_iflag |= (IXON | IXOFF);

    /* c_oflag */
    termios_settings.c_oflag = 0;

    /* c_lflag */
    termios_settings.c_lflag = 0;

    /* c_cflag */
    /* Enable receiver, ignore modem control lines */
    termios_settings.c_cflag = CREAD | CLOCAL;

    /* Databits */
    if (databits == 5)
        termios_settings.c_cflag |= CS5;
    else if (databits == 6)
        termios_settings.c_cflag |= CS6;
    else if (databits == 7)
        termios_settings.c_cflag |= CS7;
    else if (databits == 8)
        termios_settings.c_cflag |= CS8;

    /* Parity */
    if (parity == PARITY_EVEN)
        termios_settings.c_cflag |= PARENB;
    else if (parity == PARITY_ODD)
        termios_settings.c_cflag |= (PARENB | PARODD);

    /* Stopbits */
    if (stopbits == 2)
        termios_settings.c_cflag |= CSTOPB;

    /* RTS/CTS */
    if (rtscts)
        termios_settings.c_cflag |= CRTSCTS;

    /* Baudrate */
    cfsetispeed(&termios_settings, _serial_baudrate_to_bits(baudrate));
    cfsetospeed(&termios_settings, _serial_baudrate_to_bits(baudrate));

    /* Set termios attributes */
    if (tcsetattr(serial->fd, TCSANOW, &termios_settings) < 0) {
        int errsv = errno;
        close(serial->fd);
        serial->fd = -1;
        return _serial_error(serial, SERIAL_ERROR_CONFIGURE, errsv, "Setting serial port attributes");
    }
    serial->use_termios_timeout = false;
    return 0;
}

2.2.2 读写串口

fd为文件识别号,buf为收发数组
接收数据

int len;unsigned char buf[11];
len = read(fd, buf, 11);
if (len < 0){    
printf("reading data faile \n");
}

发送数据

int len;
char buf[] = "hello world!";
len = write(fd, buf, sizeof(buf));
if (len< 0) {    
printf("write data to serial failed! \n");
}

2.3 TCP通信

   Socket编程是一种网络编程的方式,用于实现不同计算机之间的数据通信。在网络应用中,Socket是端到端通信的一个抽象概念,它建立在网络模型的传输层之上,提供了一种方式来允许程序跨网络发送和接收数据。最常见的是TCP(传输控制协议)和UDP(用户数据报协议)。

2.4.1 TCP初始化

Socket编程通常涉及以下几个基本步骤:

  1. 创建Socket:首先,需要在客户端和服务器端分别创建Socket。在服务器端,Socket用于监听来自客户端的连接请求;在客户端,Socket用于与服务器建立连接。
  2. 绑定(Bind):服务器端的Socket需要绑定到一个网络地址(IP地址)和端口上,以便客户端能够找到并连接到它。
  3. 监听(Listen):服务器端的Socket开始监听绑定的地址和端口,等待客户端的连接请求。
  4. 接受连接(Accept):当服务器Socket监听到客户端的连接请求时,它会接受这个连接,从而在服务器和客户端之间建立一个新的通信链路。
  5. 数据传输:一旦连接建立,客户端和服务器端就可以通过读写操作在这个连接上发送和接收数据。数据的发送和接收可以是阻塞的也可以是非阻塞的,这取决于Socket的配置。
  6. 关闭连接:数据传输完成后,双方可以关闭连接。关闭连接的一方会向对方发送一个连接释放信号,以结束会话。
#include"TCPserver.h"
 
int TCPserverinit(void)
{
	//服务器监听套接字和连接套接字
	listen_fd=-1;
	connect_fd=-1;
	struct sockaddr_in servaddr;//定义服务器对应的套接字地址
	//服务器接收和发送缓冲区
	uint8_t sendbuf[MAXLINE], recbuf[MAXLINE];
 
	//初始化套接字地址结构体
	memset(&servaddr, 0, sizeof(servaddr));
	servaddr.sin_family = AF_INET;//IPv4
	servaddr.sin_port = htons(PORT);//设置监听端口
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//表示接收任意IP的连接请求
 
	//创建套接字
	if((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
		//如果创建套接字失败,返回错误信息
		//strerror(int errnum)获取错误的描述字符串
		printf("create socket error: %s(error: %d)\n", strerror(errno), errno);
		exit(0);
	}
	//绑定套接字和本地IP地址和端口
	if(bind(listen_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
		//绑定出现错误
		printf("bind socket error: %s(error: %d)\n", strerror(errno), errno);
		exit(0);
	}
 
	//使得listen_fd变成监听描述符
	if(listen(listen_fd, 10) == -1){
		printf("listen socket error: %s(error: %d)\n", strerror(errno), errno);
		exit(0);
	}
	//accept阻塞等待客户端请求
	printf("等待客户端发起连接\n");
	if((connect_fd = accept(listen_fd, (struct sockaddr*)NULL, NULL)) == -1){
		printf("accept socket error: %s(error: %d)\n", strerror(errno), errno);
	    }
}

2.4.1 TCP收发数据

   在Linux下,都是按读写文件的方式去管理设备。
接收数据

int len;unsigned char buf[11];
len = read(fd, buf, 11);
if (len < 0){    
printf("reading data faile \n");
}

发送数据

int len;
char buf[] = "hello world!";
len = write(fd, buf, sizeof(buf));
if (len< 0) {    
printf("write data to serial failed! \n");
}

2.4 数据收发处理

2.4.1 串口屏

void* ScreenTranslateMessage(void* arg)
{
    uint8_t i,j=0;
    uint8_t hedebyte[3];
    uint8_t onebyte;
    while (1)
    {
        serial_read(serial,&onebyte, 1);
        usleep(5000);
        if(onebyte==0X5A) //识别帧头标识
            {
            hedebyte[0]=onebyte;
            onebyte=0;
            serial_read(serial, hedebyte+1, 2);
            usleep(5000);
            }
        if (hedebyte[0]==0X5A && hedebyte[1]==0XA5)
            {
            sdatalen=hedebyte[2];
            serial_read(serial,sdata,sdatalen);//接受串口屏反馈数据
            usleep(2500);
                for (i = 0; i<3; i++)
                {
                    printf("%02x",hedebyte[i]);
                }
                for (j = 0; j<sdatalen; j++)//数据
                {
                    printf("%02x",sdata[j]);
                }
                printf("\n");
            serialPolling(sdata,sdatalen); //按照通信协议依次处理数据,通过TCP反馈到功能模块
            memset(sdata,0,sizeof(sdata));
            sdatalen=0;
            }
        usleep(5000);
        memset(hedebyte,0,sizeof(hedebyte));
    }  
    return NULL;
}
uint8_t serialPolling(uint8_t *data,uint8_t datalen)
{
    int i=0,j=0;
    double power=2;
    uint8_t chartonum=0;

    if(datalen==0) 
    {   return 0;}
    else
    {
       LCDaddr=((uint16_t)data[1]<<8)|data[2];//识别串口屏部件
       switch (LCDaddr)
       {
        case State_check:
            sendbuf[0]=0xAA;
            sendbuf[1]=0x01;
            sendbuf[2]=0x00;
            sendbuf[3]=0x00;
            sendbuf[4]=0x00;
            sendbuf[5]=0x00; //设置数据帧
            write(connect_fd, sendbuf, 6);//通过TCP反馈到功能模块
            break;
        case IP_address : //获得网络网址,将bits数据转化为网址
            for(i=4;i < 19;i ++)
            {
                if(data[i]!= 0xFF)
                {
                    IPaddress[i] = data[i];
                    if(data[i]!=0x2e)
                    {
                    chartonum=(IPaddress[i]-0x30)*pow(10,power);
                    IP_buffer[j]=IP_buffer[j]+chartonum;
                    power--;
                    }
                    else
                    {
                        j++;
                        power=2;
                    }
		        }
	        }
            memset(IPaddress,0,15);
            break;
        default:
        break;
       }
    }

}

2.4.2 功能模块

void* TCPtranslateMessage(void* arg)
{
    while (1)
    {   
        //读取客户端发来的信息
        ssize_t tdatalen = read(connect_fd,tdata, sizeof(tdata));
        if(tdatalen <= 0){
                return 0;
        }
        for (uint8_t i = 0; i < tdatalen; i++)
        {
            printf("%02x",tdata[i]);
        }
        printf("\n");
        TCPPolling(tdata,tdatalen);//处理TCP接收数据,和串口类似先找帧头然后针对不同数据进行处理
        memset(tdata,0,sizeof(tdata));
    }
    return NULL;
}

根据自己的需求去设计处理数据的函数

uint8_t TCPPolling(uint8_t *data,uint8_t datalen)
{
    uint8_t position=6;
    if(datalen==0) 
    {   return 0;}
    else
    {
       command=data[1];
       switch (command)
       {
       case 01:
        /* code */
        //状态显示,设置屏幕显示数据
        DW_SetValue(Running_state,data[position]);
        DW_SetValue(Input_datastate,data[position+1]);
        break;
       case 02:
        DW_SetValue(Output_power,data[position]);
        DW_SetValue(PAR_coefficient,data[position+1]);
        break;
       case 03:
        /* code */
        break;
       default:
        break;
       }
    }

三、参考资料

《T5L DGUSII应用开发指南》
串口通信协议和Linux下的串口编程
TCP的socket详解
迪文串口屏教程
迪文串口屏(T5L2 & DGUS II)开发 – 入门

  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
第一章 嵌入式系统............................................................ 1 1.1 嵌入式系统概述........................................................... 1 1.2 嵌入式处理器............................................................. 1 1.3 嵌入式操作系统........................................................... 3 1.4 GEC2410B 嵌入式教学平台介绍.............................................. 6 1.5 GEC2410B 教学平台的使用.................................................. 15 第二章 ADS集成开发环境的使用................................................ 21 2.1 ADS 集成开发环境介绍.....................................................21 2.2 使用ADS创建工程........................................................ 24 第三章 ARM验................................................................ 32 3.1 ARM基础实验............................................................. 32 3.1.1 ARM汇编指令编程实验................................................... 32 3.1.2 Thumb和ARM指令混合编程实验........................................... 41 3.1.3 C和ARM汇编混合编程实验............................................... 49 3.1.4 外部中断应用实验...................................................... 57 3.1.5 看门狗定时器应用实验.................................................. 68 3.1.6 PWM控制蜂鸣器实验..................................................... 74 3.1.7 ARM启动及工作模式切换实验............................................. 85 3.1.8 串口通信应用实验...................................................... 91 3.1.9 4X4键盘控制实验...................................................... 102 3.1.10 实时时钟设计实验.................................................... 108 3.1.11 IIC总线应用实验..................................................... 109 3.1.12 Nor flash应用实验................................................... 132 3.1.13 Nand flash应用实验.................................................. 146 3.1.14 ADC应用实验......................................................... 170 3.1.15 VGA显示实验......................................................... 181 3.1.16 IIS音频总线实验..................................................... 187 3.1.17 TFT 液晶屏显示实验................................................... 197 3.1.18触摸屏控制实验....................................................... 212 3.1.19 汉字字符显示实验.....................................................225 3.1.20 红外模块控制实验.....................................................229 3.1.21 直流电机控制实验.....................................................240 3.1.22 步进电机控制实验.....................................................246 3.1.23 RS485 接口通信实验...................................................252 3.2 ARM高级实验 258.........................................................258 3.2.1 TFTP 以太网通讯.......................................................258 3.2.2 USB设备实验...........................................................269 3.2.3 SD卡接口应用实验......................................................297 3.2.4 GPS定位实验...........................................................310 3.2.5 GPRS/GSM 通讯实验.....................................................318 3.2.6 并口打印机驱动设计实验................................................328 第四章 实时操作系统实验.....................................................335 4.1 NUCLEUS PLUS 在S3C2410A 上的移植....................................... 335 4.2 NUCLEUS PLUS 基于S3C2410A 的实验........................................345 4.3 UCOS-II在GEC2410上的移植..............................................352 4.4 UCOS-II应用程序设计....................................................355 第五章 嵌入式LINUX实验 ....................................................361 5.1 搭建嵌入式LINUX实验平台................................................361 5.2 嵌入式LINUX开发与调试..................................................371 5.3 U-BOOT在GEC2410上的移植................................................375 5.4 嵌入式LINUX内核移植定制与编译..........................................386 5.5 嵌入式LINUX根文件系统的制作............................................395 5.6 嵌入式LINUX的LED驱动程序设计..........................................401 5.7 嵌入式GUI开发..........................................................410 第六章 嵌入式WINDOWS CE系统................................................424 6.1 WINDOWS CE的安装........................................................424 6.2 定制嵌入式WINDOWS CE平台...............................................427 6.3 HELLO WORLD实现.........................................................432 6.4 使用ACTIVESYNC连接GEC2410B与PC机.....................................435
目 录 第一部分 ARM9基本实验 3 前 言 3 第一章 ARM9 处理器介绍 8 第二章 系统的硬件单元及使用说明 13 一、ZY21ARM13BC实验系统特点 13 二、ZY21ARM13BC实验系统组成 14 三、ZY21ARM13BC实验系统各功能模块介绍 14 第三章 嵌入式软件的基本使用 32 一、超级终端的配置 32 二、ADS1.2集成开发环境的使用 38 三、简易仿真器的配置 53 四、Flash Programmer软件安装 55 第四章 基础实验 57 实验一 ADS集成开发环境 57 实验二 Flash烧写实验 62 实验三 串口通讯实验 68 实验四 USB接口实验 77 实验五 IIS音频实验 80 实验六 IIC接口实验 87 实验七 键盘及数码管驱动实验 94 实验八 PS/2键盘接口实验 97 实验九 A/D接口实验 102 实验十 D/A接口实验 107 实验十一 LED显示实验 111 实验十二 步进电机实验 113 实验十三 直流电机实验 116 实验十四 LCD驱动实验 119 实验十五 触摸屏实验 126 实验十六 WDT看门狗实验 135 实验十七 实时时钟实验 139 实验十八 RS485接口实验 144 实验十九 CAN及SPI接口实验 150 实验二十 利用SPI接口与FPGA通讯实验 157 实验二十一 利用串口与FPGA通讯实验 162 实验二十二 利用数据地址总线与FPGA通讯实验 164 实验二十三 GPRS基本实验 167 实验二十四 GPRS通话建立实验 173 实验二十五 GPRS短信发送实验 176 实验二十六 GPRS短信接收实验 181 实验二十七 GPS全球定位实验 186 附录 ARM汇编指令集 191 第二部分UC/OS-Ⅱ实验 216 第一章 实时系统介绍 216 实验一 uC/OS-Ⅱ操作系统介绍 216 第二章 UC/OS-II操作系统部分实验 254 实验二 uC/OS-Ⅱ简介以及其在ARM上的移植实验 254 实验三 绘图的API函数实验 267 实验四 系统的消息循环实验 270 实验五 列表框控件的使用实验 275 实验六 文本框控件实验 278 实验七 多任务和系统时钟实验 281 实验八 任务间的通信和同步实验 286 附 录 295 一、嵌入式系统应用编程API 函数 295 二、配置手册 323 参考书目 330 第一部分 ARM9基本实验 前 言 嵌入式技术的发展 计算系统无所不在,每年都要建立数以百万计的计算系统,这些系统包括台式计算机、笔记本计算机、工作站、大型主机以及服务器等。真正令人惊讶的是,每年建立的计算系统都有各自完全不同的目的:嵌入在大型的电子设备中,重复执行某个特定功能,而通常没有引起设备使用者的注意。要精确的定义这些嵌入式计算系统(或简称为嵌入式系统)并非易事,一种较近似的定义是,嵌入式-系统基本上是除台式机外的一种计算系统。通过考察常见实例及其共性,可以更好的了解这些系统,同时找到嵌入式系统设计者所面对的主要挑战。 嵌入式系统存在于各种常见的电子设备中,如消费类电子产品(移动电话、寻呼机、数码相机、便携式摄像机、磁带录像机、掌上游戏机、计算器、个人数字助理)、家用电器产品(微波炉、留言机、自动调温器、家庭安全系统、洗衣机以及照明系统)、办公自动化设备(传真机、复印机、打印机、扫描仪)、商用设备(收音机、路边收费器、报警系统、读卡机、产品扫描设备以及自动提款机)以及车用设备(传动控制、定速控制、燃料喷射、防锁死刹车器以及主动式悬吊)等。表1是一份简短的嵌入式系统实例清单,更完整的清单如果列出则要好几页。可以说,靠电力运行的任何设备已经或即将嵌入计算系统。虽然嵌入式计算机比台式计算机便宜很多,但其数量庞大。例如,在1999年,一个典型的美国家庭可能拥有一部台式计算机,但有35~50部嵌入式计算机。再者,1998年平均每部汽车有50部嵌入式计算机,价值数百美元,年增长率达17%。近年来,嵌入式微处理器单元年销售量达数十亿部,而台式微处理器单元的年销售量仅数亿部。 防锁死刹车器 调制解调器 自动对焦相机 MPEG解码器 自动提款机 网卡 自动收费系统 网关/路由器 自动传动 车(船)载导航 航空电子系统 寻呼机 电池充电器 影印机 便携式摄像机 销售站系统 移动电话 掌上游戏机(电玩) 移动电话基站 打印机 无绳电话 卫星电话 定速控制 扫描仪 路边收费器 话音识别器 磁盘驱动器 立体声系统 电子读卡器 远程会议系统 电子仪器 电视 电子玩具/游戏 温度控制器 工厂控制 电视机顶盒 指纹辨别器 DVD播放器 家庭安全系统 游戏(电玩)控制器 生命维持系统 可视电话 医疗检测系统 洗衣机和干衣机 数码相机 智能型烤箱/洗碗机 传真机 防盗追踪系统 表1 嵌入式系统的简要清单 嵌入式系统从20世纪70年代单片机的出现到今天各式各样的嵌入式微处理器,微控制器的大规模应用,至今已有30多年的发展历史。最初的嵌入式系统应用是基于单片机的,使得汽车,家电,工业机器人,通信装置以及成千上万种产品可以通过内嵌电子装置来获得更佳的使用性能,更易使用,速度更快,价格更低。这些装置已经初步具备了嵌入式的应用特点,但是这时的应用只是使用8位的芯片执行一些单线程的程序,其实还不能完全称为嵌入式“系统”。 从20世纪80年代开始,嵌入式系统的程序员开始用商业级的“操作系统”编写嵌入式应用软件,这使得开发人员可以进一步缩短开发周期,降低开发成本并提高开发效率。1981年,Ready System开发出世界上第一个商业嵌入式实时内核(VTR32)。这个实时内核包含了许多传统操作系统的特征,包括任务管理,任务间通信,同步与互相排斥,中断支持,内存管理等功能,此后一些公司也纷纷推出了自己的嵌入式操作系统。这些系统均具有嵌入式的典型特点:它们都采用占先式的调度,响应时间很短,任务执行的时间可以确定;系统内核很小,具有可裁剪性,可扩充性和可移植性,可以移植到多种处理器上;具有较强的实时性和可靠性,适合嵌入式应用。这些嵌入式实时多任务操作系统的出现,使得应用开发人员从小范围的开发中解放出来,同时也促使嵌入式有了更广阔的应用空间。 20世纪90年代以后,随着对实时性要求的提高,软件的规模不断增大,实时内核逐渐发展为实时多任务操作系统(RTOS),并作为一种软件平台逐步成为目前国际嵌入式发展的主流。此时出现了我们都较为熟悉的Palm OS,Windows CE,嵌入式Linux,Uc/OS操作系统,我们国内也出现了Hopen,Delta OS等操作系统。到今天,RTOS已经在全球形成了一个产业,每年RTOS和相关的开发工具(包括仿真器,逻辑分析仪,软件编译器和调试器)销售额已经达到几十亿美元。(1999年已经达到13亿美元。) 嵌入式系统由硬件和软件两大部分构成,以上我们所讲的操作系统就是软件部分。从硬件方面来讲,嵌入式的核心部件是嵌入式处理器。嵌入式微处理器的性能好坏就直接决定整个系统的运行效果。由于嵌入式系统应用需求的多样性,市场上基于RISC结构的嵌入式微处理器提供商也日渐增多。据统计数字表明,2002年32位嵌入式微处理器市场销售额排在前3位的公司分别是ARM,Motorola和MIPS,其中ARM公司的芯片销售量达1.5亿个,市场份额超过70%。 ARM是一类处理器的名字,同时也是一个公司的名字。ARM公司于1990年11月在英国剑桥成立,它是全球领先的16/32位RISC微处理器知识产权设计供应商,向全球各大领先电子公司提供高效性能、低成本和高效率的RISC微处理器、外设和系统芯片技术授权。 1991年,ARM推出第一个嵌入式RISC核心——ARM6系列处理器。不久VLIS率先获得授权,随后,夏普、GECPlessey、德州仪器等一些大公司也同ARM公司签署了授权协议,从此ARM的知识产权产品和授权用户都急剧扩大。从1998年4月,ARM上市之后,ARM在短短几年时间内已经成为一家全球性大公司,在三大洲8个国家都设有分支机构。ARM中国安谋咨询上海有限公司也已在2002年成立。目前,全世界由几十家著名的半导体公司都使用ARM公司的授权,其中包括摩托罗拉、IBM、Intel、ATMEL、SONY、NEC、LG等。 ARM微处理器得到了众多半导体厂家的支持,全球已有100多家IT公司在采用ARM技术,20家最大的半导体厂商中有19家是ARM的用户。优良的性能和准确的市场定位极大的丰富了ARM资源,加速了基于ARM核面向各种芯片的开发应用。在2002年,基于ARM核的芯片占据了整个32、64位嵌入式市场的79.5%,在中国,ARM的市场占有率也达到了57.5%之多,可以说ARM会统一整个嵌入式处理器系统。 ARM微处理器目前包括ARM7系列、ARM9系列、ARM9E系列、ARM10E系列 SecurCore 系列,Intel公司的StrongARM和Xscale以及最新的ARM11系列。除了具有ARM体系结构的共同特点外,每个系列的ARM微处理器都有各自的特点和应用领域。其中,ARM7、ARM9、ARM9E、ARM10为四个通用处理器系列,每个系列提供一套相对独特的性能来满足不同领域的需求。随着ARM 的进一步发展,其必将会占据更大的市场份额。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伊丽莎白鹅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值