C语言编程程序优化方案
在C语言中,宏是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。
写一个“标准”宏MIN ,这个宏输入两个参数并返回较小的一个:
错误做法:
#define MIN(A,B) ( A 《= B ? A : B )
正确做法:
#define MIN(A,B) ((A)《= (B) ? (A) : (B) )
对于宏,我们需要知道三点:
(1)宏定义“像”函数;
(2)宏定义不是函数,因而需要括上所有“参数”;
(3)宏定义可能产生副作用。
下面的代码:
least = MIN(*p++, b);
将被替换为:
( (*p++) 《= (b) ?(*p++):(b) )
发生的事情无法预料。
因而不要给宏定义传入有副作用的“参数”。
使用寄存器变量
当对一个变量频繁被读写时,需要反复访问内存,从而花费大量的存取时间。为此,C语言提供了一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,从而提高效率。寄存器变量的说明符是register。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量,而循环计数是应用寄存器变量的最好候选者。
(1) 只有局部自动变量和形参才可以定义为寄存器变量。因为寄存器变量属于动态存储方式,凡需要采用静态存储方式的量都不能定义为寄存器变量,包括:模块间全局变量、模块内全局变量、局部staTIc变量;
(2) register是一个“建议”型关键字,意指程序建议该变量放在寄存器中,但最终该变量可能因为条件不满足并未成为寄存器变量,而是被放在了存储器中,但编译器中并不报错(在C++语言中有另一个“建议”型关键字:inline)。
下面是一个采用寄存器变量的例子:
/* 求1+2+3+….+n的值 */
WORD AddiTIon(BYTE n)
{
register i,s=0;
for(i=1;i《=n;i++)
return s;
}
本程序循环n次,i和s都被频繁使用,因此可定义为寄存器变量。
内嵌汇编
程序中对时间要求苛刻的部分可以用内嵌汇编来重写,以带来速度上的显著提高。但是,开发和测试汇编代码是一件辛苦的工作,它将花费更长的时间,因而要慎重选择要用汇编的部分。
在程序中,存在一个80-20原则,即20%的程序消耗了80%的运行时间,因而我们要改进效率,最主要是考虑改进那20%的代码。
嵌入式C程序中主要使用在线汇编,即在C程序中直接插入_asm{ }内嵌汇编语句:
/* 把两个输入参数的值相加,结果存放到另外一个全局变量中 */
int result;
void Add(long a, long *b)
{
_asm
{
MOV AX, a
MOV BX, b
ADD AX, [BX]
MOV result, AX
}
}
利用硬件特性
首先要明白CPU对各种存储器的访问速度,基本上是:
CPU内部RAM 》 外部同步RAM 》 外部异步RAM 》 FLASH/ROM
对于程序代码,已经被烧录在FLASH或ROM中,我们可以让CPU直接从其中读取代码执行,但通常这不是一个好办法,我们最好在系统启动后将FLASH或ROM中的目标代码拷贝入RAM中后再执行以提高取指令速度;
对于UART等设备,其内部有一定容量的接收BUFFER,我们应尽量在BUFFER被占满后再向CPU提出中断。例如计算机终端在向目标机通过RS-232传递数据时,不宜设置UART只接收到一个BYTE就向CPU提中断,从而无谓浪费中断处理时间;
如果对某设备能采取DMA方式读取,就采用DMA读取,DMA读取方式在读取目标中包含的存储信息较大时效率较高,其数据传输的基本单位是块,而所传输的数据是从设备直接送入内存的(或者相反)。DMA方式较之中断驱动方式,减少了CPU 对外设的干预,进一步提高了CPU与外设的并行操作程度。
活用位操作
使用C语言的位操作可以减少除法和取模的运算。在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作,因而,灵活的位操作可以有效地提高程序运行的效率。举例如下:
/* 方法1 */
int i,j;
i = 879 / 16;
j = 562 % 32;
/* 方法2 */
int i,j;
i = 879 》》 4;
j = 562 - (562 》》 5 《《 5);
对于以2的指数次方为“*”、“/”或“%”因子的数学运算,转化为移位运算“《《 》》”通常可以提高算法效率。因为乘除运算指令周期通常比移位运算大。
C语言位运算除了可以提高运算效率外,在嵌入式系统的编程中,它的另一个最典型的应用,而且十分广泛地正在被使用着的是位间的与(&)、或(|)、非(~)操作,这跟嵌入式系统的编程特点有很大关系。我们通常要对硬件寄存器进行位设置,譬如,我们通过将AM186ER型80186处理器的中断屏蔽控制寄存器的第低6位设置为0(开中断2),最通用的做法是:
#define INT_I2_MASK 0x0040
wTemp = inword(INT_MASK);
outword(INT_MASK, wTemp &~INT_I2_MASK);
而将该位设置为1的做法是:
#define INT_I2_MASK 0x0040
wTemp = inword(INT_MASK);
outword(INT_MASK, wTemp | INT_I2_MASK);
判断该位是否为1的做法是:
#define INT_I2_MASK 0x0040
wTemp = inword(INT_MASK);
if(wTemp & INT_I2_MASK)
{
… /* 该位为1 */
}
上述方法在嵌入式系统的编程中是非常常见的,我们需要牢固掌握。
总结
在性能优化方面永远注意80-20准备,不要优化程序中开销不大的那80%,这是劳而无功的。
宏定义是C语言中实现类似函数功能而又不具函数调用和返回开销的较好方法,但宏在本质上不是函数,因而要防止宏展开后出现不可预料的结果,对宏的定义和使用要慎而处之。很遗憾,标准C至今没有包括C++中inline函数的功能,inline函数兼具无调用开销和安全的优点。
使用寄存器变量、内嵌汇编和活用位操作也是提高程序效率的有效方法。
除了编程上的技巧外,为提高系统的运行效率,我们通常也需要最大可能地利用各种硬件设备自身的特点来减小其运转开销,例如减小中断次数、利用DMA传输方式等。
如何选择一个ARM品牌核心处理器操作系统
ARM公司是世界最大的半导体知识产权供应商,拥有全球近200家半导体公司的客户。目前,80%的GSM手机,99%的CDMA手机,以及未来3G手机也都是采用基于ARM核的嵌入式处理器。提供研究分析信息的机构Gartner Inc,2003年6月份统计,2002年ARM在全球半导体IP供应商中排名第一,占市场份额的19.8%,销售收入达1.8亿美圆,比2001年增长10%。
目前,除了像TI OMAP, Intel的Xscale和Motorola的IMX系列这样的移动终端处理器采用ARM核外,也还有象Samsung, Atmel, Sharp, OKI和Philip等半导体公司设计一些通用ARM核的处理器,可以广泛应用在各种嵌入式系统,现在在市场上看到比较多的有S3C44B0, 4510,2410,AT91系列和Intel PXA255等。
ARM处理器是32位设计,同时也配置了16位指令集,软件可以以16位编码与等价32位代码相比,占用的存储器空间可以节省约35%。ARM处理器目前有ARM7, ARM9, ARM9E, ARM10, ARM11系列产品和来自合作伙伴Intel Xscale和Strong ARM系列ARM7,适合于中低端的网络设备、终端、各种通用型的嵌入式应用和工业控制等领域。ARM9适合于智能手机、PDA和先进的控制管理和仪器仪表应用。Intel Xscale系列产品提供了高性能价格比、低功耗、适用于智能无线终端、PDA、家庭网络和网络存储器设备等应用。
嵌入式操作系统是ARM CPU重要的软件基础
从8位/16位单片机发展到以ARM CPU核为代表的32位嵌入式处理器,嵌入式操作系统将替代传统的由手工编制的监控程序或调度程序,成为重要的基础组件。嵌入式操作系统可以提供ARM CPU核和外设的设备管理,如核的初始化、MMU(内存管理单元)、定时器、中断、串口、SPI、GPIO、以太网、图形接口等,嵌入式操作系统提供任务调度、内存管理、中断处理、同步互斥机制、文件系统和网络功能,更重要的一点是嵌入式操作系统对应用程序可以起到屏蔽的作用,让应用程序员面向操作系统级开发应用软件,并易于在不同的基于ARM核的嵌入式处理器上移植。
嵌入式操作系统都一般具有一定的实时性,易于裁剪和伸缩,可以适合于从ARM7到Xscale各种ARM CPU和各种档次的应用,嵌入式操作系统可以使用广泛流行的ARM开发工具,如ARM公司的SDT/ADS和Real View、IAR EW等也可以使用开源的软件,如GCC/GDB、KDE或Eclipe开发环境,市场上还有商业厂商的专用的开发工具,如Tornado、μC/View、μC/KA、CODE/Lab、Metroworks等。
本文就目前国内在ARM CPU上广泛采用的三种嵌入式操作系统做个分析,μC/OS-II、μCLinux和嵌入式Linux。后两种同属于Linux,前者是针对没有MMU的微处理器,如ARM7 TDMI核,后者可适用于绝大多数有MMU的微处理器中,如ARM920T,当然,文章也会涉及到其它支持ARM CPU的嵌入式操作系统。
μC/OS-II嵌入式实时内核
由Jean Labrosse先生著,邵贝贝老师翻译的《嵌入式实时操作系统μC/OS-II》先后由电力出版社(第一版)和航空航天大学出版社出版(第二版)发行了近万册,相信有数以千计的学生、老师和工程师正在使用μC/OS-II,在过去的一年中(2003),在《电子产品世界》、《电子设计应用》和《单片机和嵌入式系统应用》等杂志和各种学术会议上的有μC/OS-II相关论文就有几十余篇。全世界数百种设备已经在使用μC/OS-II,包括如手机、路由器、不间断电源、飞行器、医疗设备和工业控制设备,在中国也已经有包括香港权智,首科希电,安控科技在内的10余家公司购买了产品授权。
μC/OS-II已经有ARM7TDMI、ARM9和Strong ARM等各种ARM CPU的移植,支持包含Atmel、Hynix、Intel、Motorola、Philips、Samsung、Sharp等公司的ARM核的CPU。μC/OS-II的移植也相当容易,与CPU相关的代码包装在三个文件中,os_cpu.h,os_cpu_a.asm,os_cpu_c.c,而且Jean Labrosse先生的应用笔记AN-1011和AN-1012对ARM7、AN-1337对ARM9的移植过程都做了详细的说明。
μC/OS-II有60余个系统调用,覆盖任务、定时器、信号量、事件标志、邮箱、队列和内存管理,已经包含了传统嵌入式操作系统内核(如PSOS,VRTX)的功能,还支持互斥型信号量(Mutual Exclusion Semaphone),这是90年代的嵌入式操作系统内核,如Vxworks和VRTXsa才有的技术。
μC/OS-II因为是可抢占的实时内核,所以μC/OS-II与商业嵌入式实时内核在性能上没有什么差异,μC/OS-II没有用户态和内核态,任务(线程)或中断和任务切换的响应可以很快,主要是和不同的ARM CPU相关的。最新的2.7x版本还增加了算法以避免在移植中修改OSINTCEXSW()中的堆栈指针。这样可以保证μC/OS-II在不同的CPU上运行更稳定,移植更方便。
总之,μC/OS-II是一个非常容易学习(有一本很好的讲解很清楚的书),结构简单,功能完备和实时性很强的嵌入式操作系统内核,适合于各种嵌入式应用以及大专院校教学和科研。
μC/OS-II目前除了内核外还有商业化文件系统μC/FS,图形系统μC/GUI以及任务调试工具μC KA和μC View,但是μC/OS-II自己目前还没有TCP/IP(有计划)如果需要,可以购买商用的TCP/IP,如InterNiche (www.iniche.com),但价格还是很贵,免费的TCP/IP项目如LWIP (http://www.sics.se/~adam/lwip/),但无论在功能还是稳定性与商业代码无法比拟,这可能也是目前μC/OS-II的弱点。
最后需要说明,μC/OS-II不是免费软件,任何人学习使用μC/OS-II需要购买《嵌入式实时操作系统μC/OS-II》一书,使用了μC/OS-II的产品需要购买产品生产授权,购买了此授权的还可以得到开发期间的技术支持和升级服务。
μCLinux操作系统
μCLinux是Linux小型化后,适合于没有MMU的微处理器芯片而裁剪成的小型化Linux操作系统,在ARM CPU系列中,ARM7 TDMI,ARM940T等ARM核的CPU产品,如果希望使用Linux操作系统,只能用μCLinux,当然,μCLinux也支持Motorola Dragonball, Coldfire等其它中低端嵌入式处理器。
μCLinux保持了传统Linux操作系统的主要特性,包括稳定、强大的网络和文件系统的支持,μCLinux裁剪了大量的Linux内核以缩小尺寸,适合象512k RAM,1M Flash这样小容量,低成本的嵌入式系统。
μCLinux的项目是由Linux 2.0.38内核开始的,第一个项目是Motorola 68EZ328,目前已经有2.4 Linux支持的一些移植的版本,如S3C2500, 44B0等ARM芯片,这些,你可以在μCLinux的官方网站www.uclinux.org上找到,μCLinux近期主要是在发展各种2.4.x版本的移植,以期跟上Linux社会主流的发展趋势(因为今年Linux 2.6将开始成为主流的内核)。
μCLinux系统小型化的另一个重要原因是采用了μCLib库替代Linux的Glib库,使用μCLib可以大大减少应用程序的代码尺寸,对于中小型嵌入式应用,μCLib功能可以满足需要,所以目前即使是某些采用Linux 2.4内核的嵌入式LINUX系统也采用μCLib库的做法。μCLinux中,由于没有内存保护机制,应用代码一般采用静态连接的方式,而且在μCLinux中采用Flat文件执行格式(Linux是Coff或Elf格式), μCLinux和应用代码都可以支持固化,存储在Flash存储介质中,不需象Linux需要经过一次Flash到RAM的拷贝。所有这些,使得μCLinux更象传统意义上的嵌入式操作系统。
μCLinux主要是针对没有MMU的嵌入式处理器开发设计,那么它也失去了有MMU所带来的Linux操作系统的特色,比如,上面已经提到的静态加载(Linux支持动态应用的加载),μCLinux对内存操作是直接的物理内存,这样,任何程序的异常都可能导致内核崩溃,μCLinux采用Vfovk(),支持多进程,但需要父子进程协调同步,μCLinux的文件系统相对比较陈旧,支持的CPU和参考设计还比较少,社区的发展和维护也相对缓慢。更重要的是,在国内外没有一家软件公司有商业化的μCLinux软件产品和服务支持,目前μCLinux官方网站还很少看见象IBM、Intel这样的巨型公司身影,只有2~3家小型的硬件或方案提供商,这对于商业化的产品开发中采用是有一定的风险。
嵌入式Linux操作系统
我们这里要讨论的是可以嵌入在ARM CPU上的,有MMU功能的Linux操作系统,也可以称是嵌入式Linux操作系统。芬兰学生Linux Torvalds在91年写完第一个Linux版本时,怎样也无法想象到今天Linux在全世界范围被广泛注目和应用。嵌入式系统作为Linux应用的一个重要领域,由于它的广泛性和多样化正在迅速发展。
和微软的软件不一样,Linux不是由一家公司所拥有、维护开发的,Linux在市场有多种发行版本,所有发行版本都包含一样的Linux内核、基本工具和应用,不同的发行版本主要是在附加的工具链、应用、配置以及各种内核补丁上有所不同。嵌入式Linux主要是在实时性增强、内核精简和裁减、支持多种CPU结构(如ARM CPU)等方面做了改进和提高。
使用Linux在嵌入式系统中有两种途径。
第一是用户自己装配(称为DIY内核),你可以在www.kernel.org找到全部Linux代码,或直接到ARM CPU的源代码树下www.ARMLinux.org.uk找到你需要的Linux版本在ARM下的移植,或者某些半导体公司,如三星、Motorola也在自己的网站或销售自己的ARM评估板的时候送给一张CD,里面含有一个可以支持他们评估板的最小Linux内核系统。如果这个最小内核没有包含GCC/GDB工具链,你可能还要到GNU的网站下载全部的源代码,然后再编译生成你需要版本的ARM工具链和应用程序库,这个过程是相当耗时和困难的。还需要指出,这种DIY内核的配置,添加应用和驱动程序也是不标准的和复杂的,这是嵌入式系统的特殊性所在,比如说,有的基于ARM的应用是网络上的小型互连设备,他需要多个以太网、USB主机、小型的NOR Flash文件系统,而一个ARM手持终端,它关心的是LCD的触屏、红外或蓝牙的接口、USB用户端、快速的启动,动态的电源管理和NADA FLASH,这样,你就需要在数十家Linux相关网站下载各种补丁,应用和工具,把它们和你拿到的这个内核进行反复的编译和调试,确信它们之间以及它们在你所用的ARM CPU硬件评估板上是稳定可靠工作的,这个过程是在没有任何技术支持下完成的。当然,如果可以从某家半导体公司或开源的网站能够得到“最小内核”,它所包含的组件(如驱动、应用和文件系统)和你的应用近似,而且代码是可靠的,或者你及时正确得到Linux网友的指导,那么你是幸运的。据说,有一个著名的电信设备制造商花了2年的时间和150万美圆在一个项目中开发自己的Linux,而且最后还不得不停止了。
第二是选择一个商业的嵌入式Linux操作系统平台。商业化的嵌入式Linux版本是针对嵌入式处理器,如ARM所优化设计的,已经支持了各种半导体厂家的评估板和主要的设备驱动,商业化的嵌入式Linux包含了文件系统、应用、实时性扩展和技术支持培训服务,现今国外著名的商业化嵌入式Linux产品有:MontaVista Linux, Bluecat Linux, TImesys Linux, Metrowork Linux(原Lineo), Vlinux(韩国)和Redhat Linux等,国内也有红旗、中软、新华嵌入式Linux。
MontaVista Linux是MontaVista软件公司于99年推出的,它是目前全球最优秀的嵌入式Linux操作系统和工具供应商,MontaVista在嵌入式Linux的实时性、交叉开发工具、高可用性、动态电源管理等Linux技术要点方面具有世界领先地位。
MontaVista Linux最版本是3.1,采用Linux 2.4.20,针对8种CPU系列(包含ARM和Xscale)优化定制的商业化版本,包含了最新O(1)实时调度器,可抢占的内核,微秒级的高分辨定时器,基于Eclipse的DevRocket开发环境,支持应用、内核和文件系统(固化)的配置和调试,以及测试和分析工具,纯Windows, Linux和Solaris开发主机,80余种评估板和应用系统的设备驱动支持。
选择象MontaVista Linux这样商业化嵌入式Linux,可以让用户把时间和资金放在应用软件和特定的硬件接口和设备驱动程序,使用商业嵌入式Linux,可以得到一定时间(一般是1年)的技术支持,升级和培训(这很重要,因为Linux是每天都在变化的)。
商业嵌入式Linux目前除国内的产品外,价格还是很昂贵的,根据配置和服务时间,大约从几千到几万美圆,多数国内用户从资金和心理上还很难承受,商业嵌入式Linux开发工具相对于Microsoft和象Tornado/VXWORK的开发工具,在易于使用和丰富性方面还待于提高和改进。
同作为Linux操作系统,我是推荐使用带有MMU 的 Linux ,而不是μCLinux,因为绝大多数新的ARM CPU 都是AMR9核,他们都带有MMU 了,无论是开放源码的LINUX 社区还是商业的嵌入式LINUX 公司的支持和维护都比μCLinux,要好,快和丰富的多。
结束语
前面我们对三种在ARM CPU上较为流行的嵌入式操作系统作了详细的分析,在进入一个总结之前,我还想提到几个在国际上很有名气的嵌入式操作系统,它们是Windriver公司的Vxworks、ATI的Nucleus、日本人的iTron和WinCE。
Windriver的Vxworks在两三年前曾经是最具影响力的嵌入式操作系统,几乎主要的通信设备制造商都是采用PowerPC+Vxworks这种组合,但是在ARM CPU上,Vxworks的应用并不多见;ATI的Nucleus(现在已经是Mentor的嵌入式部门)曾经作为最有名气的源代码、没有版税的嵌入式操作系统而在北美和亚洲台湾流行,最成功的设计范例是各种GSM移动电话,Nucleus只是一个实时内核,用户需要再购买它的TCP/IP,GUI,文件系统和设备驱动才能形成一个功能完整的嵌入式系统,这使它在近些年失去了优势;日本人的iTron是在日本几乎家喻户晓的嵌入式内核,标准的编程接口、低廉的价格(1~3千美圆)、没有版税、支持几乎所有的CPU(尤其是支持很多日本的CPU),但在除日本之外,iTron好象毫无建树;微软的WinCE,几乎所有高端PDA都是采用它,它们使用的是 Xscale或ARM9这样的CPU,但微软只是关心有产量象PC一样巨大的嵌入式设备制造商,所以他并没有把自己的WinCE象Linux一样易于移植到不同的CPU和增加设备驱动程序,微软更愿意象Windows一样自己把所有事情做好,你只是拿去用好了,如果你没有相当的级别,很难获得它的个性化定制服务。
最后我们归纳一下选择一个合适的ARM CPU的嵌入式操作系统的几个重要因素。
第一是应用。如果你想开发的嵌入式设备是一个和网络应用密切相关或者就是一个网络设备,那么你应该选择用嵌入式Linux或者μCLinux,而不是μC/OS-II,因为Linux不仅为你集成了TCP/IP协议,还有很丰富的其它网络协议,如DHCP Server,PPPoe,webserver等等。
第二是实时性。没有一个绝对的数字可以告诉你什么是硬实时,什么是软实时,它们之间的界限也是十分模糊的,这与你选择什么样的ARM CPU,它的主频,内存等参数有一定的关系,象Intel Xscale这样的处理器,即使配合普通Linux的内核,内核的抢占延时最坏情况也只有1.743毫秒,而99.9%的情况是1.42毫秒,而如果你使用加入实时补丁等技术的嵌入式Linux如MontaVista Linux(2.4.17版本内核),最坏的情况只有436微秒,而99.9%的情况是195微秒,上面的数字以及考虑到最新的Linux在实时性方面的改进(如低延时O(1)调试器,微秒级的高分辨率POSIX定时器),嵌入式Linux可以适合于90~95%的各种嵌入式系统应用。当然,你如果希望更高数量级的实时响应,如高速的A/D转换需要几个微秒以内的中断延时,要求一个毫秒级没有DMA方式的异步串行实时处理器等类似的应用,可能是采用μC/OS-II是合适的。当然,你采用象Vxworks这样传统的嵌入式操作系统也可以满足这样的强实时性要求。
上一篇:嵌入式系统的远程更新该如何进行?常见的嵌入式操作系统
下一篇:嵌入式技术优缺点分析,嵌入式入门学习方法
推荐阅读
史海拾趣
启攀微电子(Chiphomer)公司成立于2003年,当时正值中国集成电路产业快速发展的初期。创始人张杨带领着一支由英美归国的留学精英和国内资深管理与技术人员组成的团队,立志要在这一领域闯出一片天地。然而,初创时期的资金短缺、技术壁垒和市场认可度低等问题,让公司面临着巨大的挑战。然而,他们凭借着对技术的执着追求和对市场的敏锐洞察,成功推出了首款SDH通信芯片,为公司的后续发展奠定了坚实的基础。
随着市场竞争的加剧,AW Industries Inc意识到只有不断创新才能在行业中立足。公司加大了对研发的投入,并成功研发出了一款具有革命性的新型电子元件。这款元件不仅性能卓越,而且成本更低,迅速在市场上占据了主导地位。这一创新成果不仅为公司带来了丰厚的利润,也奠定了其在电子行业的领先地位。
随着公司实力的不断增强,康龙开始积极拓展国内外市场。公司先后在美国、欧洲等地设立了销售机构,与多家国际知名企业建立了长期稳定的合作关系。同时,康龙还积极参与国际展会和交流活动,提升品牌知名度和影响力。通过不懈的努力,康龙的产品已经成功打入国际市场,并赢得了客户的广泛赞誉。
为了寻求更广阔的发展空间,Fronter电子开始积极拓展国内外市场。公司通过参加各类行业展会、建立广泛的销售网络以及开展国际合作等方式,不断开拓新客户和市场领域。同时,Fronter电子还逐步向多元化经营转型,不仅限于电子元器件的销售,还涉足到了电子产品的设计、制造和服务等多个环节。这种多元化经营的策略使得Fronter电子能够更好地满足市场需求,提升整体竞争力。
为了寻求更广阔的发展空间,Fronter电子开始积极拓展国内外市场。公司通过参加各类行业展会、建立广泛的销售网络以及开展国际合作等方式,不断开拓新客户和市场领域。同时,Fronter电子还逐步向多元化经营转型,不仅限于电子元器件的销售,还涉足到了电子产品的设计、制造和服务等多个环节。这种多元化经营的策略使得Fronter电子能够更好地满足市场需求,提升整体竞争力。
随着通信技术的不断发展和市场竞争的加剧,Ericsson也面临着前所未有的挑战。为了应对这些挑战,Ericsson积极进行转型升级。一方面,公司加大了对研发的投入力度,不断推出具有创新性和竞争力的产品和服务;另一方面,Ericsson也通过收购、兼并等方式拓展业务领域和市场份额。此外,公司还注重与合作伙伴建立紧密的合作关系共同推动行业发展。
第1章 数字电子技术基础 119页.ppt 第2章 组合逻辑电路 136页.ppt 第3章 时序逻辑电路 171页.ppt 第4章 脉冲信号的产生与整形 46页.ppt 第5章 数模和模数转换 29页.ppt 数字电子技术.ppt… 查看全部问答∨ |
|
我的bsp里面有stepldr和eboot, 我想让eboot跑起来, 但把stepldr.nb1烧写到flash中后,在dnw上显示的却是乱码!!!! 这个是串口的初始代码: void Uart_Init(void) { int i; rUFCON1 = 0x0;   ...… 查看全部问答∨ |
现在的IP地址已经不够用了,但是依然可以使用非独立的IP地址来访问网络。 例如我的IP:10.15.1.79[mask:255.255.0.0],这个应该肯定不是独立IP了。 如果我要给外网发送一个IP报(140.252.0.1),可以判断是外网,就可以通过默认路由转发这个IP报。 ...… 查看全部问答∨ |
两个函数分别是微秒和毫秒的延时,精确度在5%以内。LPC1343应该不适合,毕竟M3不想M0,有流水。 void sleepUs(uint32_t us){ // 1us base on 12MHz = 2, 50MHz = 8; uint32_t i = (us ...… 查看全部问答∨ |
|
请问版主和高手们: AD中的参考电压怎么选择,内部参考电压何时用2.5V和1.5V,ADC12MCTLx中的Sref位的参考电压源应该根据什么选择。对此我不明白,请懂的朋友给解释一下,谢谢了!!… 查看全部问答∨ |