ARMDSP双核处理器应用程序攻略.docx_第1页
ARMDSP双核处理器应用程序攻略.docx_第2页
ARMDSP双核处理器应用程序攻略.docx_第3页
ARMDSP双核处理器应用程序攻略.docx_第4页
ARMDSP双核处理器应用程序攻略.docx_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

ARM+DSP双核处理器应用程序攻略曾经,会单片机的工程师牛得一塌糊涂。想十年前一个会单片机的工程师几乎就是嵌入式工程师的代名词。若干年前,ARM开始暂露头角,看到单片机工程师的牛气,ARM工程师笑了。而从包括合众达在内的中国DSP三巨头开始在中国推广DSP时,所有开始使用DSP的工程师笑了。他们有理由笑,他们有资格笑。因为在那时,DSP就代表着高高在上,收入高、职位高、声誉高,典型的三高。而经过若干年的推广,DSP已经脱下了神的外衣,走下了神坛。会DSP的人越来越多。但随着DSP开发者的日渐增多,DSP的娘嫁人(TI)发现,纯DSP血统的姑娘们越来越难嫁了。时代的青年对于姑娘的要求已经不再在能做一手漂亮而高效的女红(计算)。人们希望娶到家的姑娘是出得厅堂,进得厨房,能歌而善舞。大户人家的公子希望媳妇儿如DSP般贤良淑德,又像ARM般千妖百媚。2005年TI推出了DaVinci技术,这一血统的姑娘既贤良淑德又千娇百媚。ARM926 + 64x+在世界各地的选美比赛中,DaVinci小姐一路过关斩将,一届又一届地当选为世界小姐。但后来人们发现,所有的评委都是对AV比较感兴趣的。一时间,AV门事件波及全球。在人民大众强大的呼声里,OMAPL小姐,姗姗来迟。 ARM+674x(定浮点DSP)。她是如此的大方美丽,如此的平易近人,她是无冕的后冠。接下来的几天,我会继续介续OMAPL处理器家族。在我做完基本介绍之后,我的同事even会讲述如何实现ARM+DSP的通信。OMAP-L处理器介绍 1 器件功能组成名词解释:OMAPL=OhMyApplicationProcessorLow-power edition. (Blacksword独家解释)OMAPL处理器内部构成:介绍OMAPL内部构成之前,我们先来回顾一下TI的DSP功能结构。下图是TMS320C6748的blockdiagram从图上可以看出DSP器件其实本质上就是一个DSP运算核心,通过Switch Fabric/EDMA连接了一堆片上外设而已。至于核心那部分,我们大部分只是DSP器件的使用者,而不是设计者,不需要花过多的精力去深究。我们以前讲DSP的开发:就硬件而言即将需要用到的片内外设引出来而已,把片外的外设连接到总线上而已;而做硬件,我个人认为都无所谓是否DSP工程师,因为DSP也好、ARM也好、X86也好,考验工程师的都是指定的板子硬件线路连接正确性,能不能在指定面积上布完,电路会否出现局部过热,电磁兼容性好否,高速接口线长线宽是否合理等,而这一切不会因是否DSP而有任何的不同。个人认就DSP而言,软件的开发,才是真正的DSP开发。而就软件而言,即设置好SwitchFabric以便能够选中指定的外设,然后读取指定外设上的数据,将这此处理好的数据再写到其它指定的外设上而已。从这一点上讲,开发DSP本身并非高高在上的神话。大部分所谓的DSP高手,其实严格来讲应该说是数学高手,逻辑高手,他们小小的一点手段,就可以让算法效率提高很多。真正的高手,只有实在在算法没什么可以抠的,才会使用汇编。那我们不管高手不高手的,总之其实要会写一个简单的DSP程序,做基本的处理,大家都觉得比较容易的。在第0讲中,我们提到TI从2005年推出了DaVinci系列平台。但很多人用了后,心里有着说不出的委屈,尤其是少部分因为DaVinci而被减员下来的。这部分人看到了OMAP-L,觉得OMAP-L这个平台非常“亲切”,“亲切”得让他们牙痒痒。怎么看怎么像DaVinci。且放下“亲切”的问题不谈,我们先来看看DaVinci的表妹OMAP-L到底长得什么样。盖头掀开,OMAP-L的脸蛋身材如下图(图为OMAP-L138):与表姐DaVinci相好过的人,一定能看出来。表姐表妹的区别仅在于一个胸大(在VICP),一个秀气(DSP为定浮点)但我更希望大家将目光从胸部移开,这样才有助于我们从整体上认识DaVinci与OMAP-L这对姐妹花。请大家看看OMAP-L138与TMS320C6748(代表了传统DSP)之间的联系与区别。你一定会很容易就发现:共同点就是同样是处理器核心通过Switch连接到各种不同的片上外设。而最大的不同点就是OMAP-L片内有两个处理器核心,一个ARM 一个DSP。你要是问一下有经验的DSP开发工程师,开发DSP难不难,你会得到什么答案?同样你可以问一下有经验的ARM开发工程,开发ARM难不难,你会得到什么答案?很多公司在很多项目中已经同时使用ARM和DSP,那怎么将ARM和DSP混搭出来的DaVinci/OMAP-L怎么就有很多人觉得不好用呢?其实这个问题诚然有TI的原因,但与我们本身的用法也有很大的关系。觉得他不好用、不美是很正常的。不信:你去问一下有经验的DSP工程师,ARM开发容易否?很多早期开发DaVinci的公司,一个像样的ARM工程师都拿不出来,然后就在那里叫嚷TI提供的东西不全,DaVinci的架构不好,到今天他们也还在说OMAP-L架构不好,就是看着OMAP-L看着像DaVinci。我们承认对于你的应用TI提供的软件可能相当不全。但这正在DaVinci的魅力所在,毕竟DaVinci提供的不是山寨货,而是提供给大家实现无限创意的能力。那么在基本组件方面,TI会致力于提供给大家符合Linux标准的各种驱动及软件中间件。有了标准的保证,你会发现如GUI或是RTP/RTSP等更上一个层次的软件组件上,你根本就不缺软件,因为大量的开源项目都是你的项目。我曾经有一个移植Gnash(Linux下的Flash播放器)的惨痛教训,在TI DaVinci平台仅花了几天时间,所有软件就移植成功。D1以下的基本上能达到15FPS。但在另一个厂商所谓完善的平台,确认有对于某几个特定应用的完整方案,几乎可以直接将代码用于量产。但当客户需要Flash时,找到了我。我遇到的第一个问题是该平台提供的C语言库是不完整的,不得已我给客户重新移植了C语言库以及编译器。我们都知道在嵌入式产品上要显示就通常会用到Framebuffer。我的第二个问题,就是Gnash要用到SDL,SDL最轻量的backend就是framebuffer。但我无比痛苦的发现,该平台上的framebuffer的驱动并不标准.做了无数的修改之后,终于将Gnash在客户的平台上运行起来,新的问题是该平台提供的那些完整解决方案,不能运行在新的C库上,然后是非常痛苦的改“解决方案”中程序的过程,总共浪费了好几个月。因此,我们认为TI的平台还是比较容易使用的,关键是你得让合适的人干合适的事情。后面我们会分析这个架构,并讲述基本的开发流程。下面我们看一下OMAP-L处理器家族都有哪些成员及旁系。OMAPL处理器家族成员:型 号主频(MHz)PWMDMACPURAML1L2封装McASPMcBSPMMC/SDTimer(64bit)uPPPRU其它OMAPL137375, 456332ch EDMAARM9, 674xSDRAM64K256K256BGA311GP, 1GP/WDUART, USB, LCD, I2C, HPI, eCAP, EMAC, SATAOMAPL138375, 45622 32ch EDMAARM9, 674xSDRAM, DDR/264K256K361 NFBGA1223GP, 1GP/WD12UART, USB, LCD, I2C, HPI, eCAP, EMAC, SATAOMAPL旁系之ARM成员:AM1808 OMAPL138的无DSP版本AM1806 AM1808的无EMAC及SATA版本AM1707 OMAPL137的无DSP版本OMAPL旁系之DSP成员:TMS320C6748 OMAPL138的不带ARM版本TMS320C6746 TMS320C6748阉EMAC及SATA后的版本TMS320C6742 阉得就更多了TMS320C6747 OMAPL138的阉DSP版本暂时讲到这里,稍候继续OMAP-L处理器介绍 2 SCR Switch Central Resource介绍关于ARM的核心,由于我们不再介绍,它不会因为披上了TI的外衣就不是ARM关于DSP的核心本身,我们也不再介绍,毕竟,这里我们不是要讲如何做算法的优化。因此流水线与指令集,都不在考虑之内。就一个应用而言,最主要的就是各种外设的使用。而对外设的使用而言,最重要的就是这堆玩意儿是怎么连接到CPU上的。如我们在OMAP-L处理器介绍 1中所讲,在OMAP-L处理器上,外设与CPU们是通过SCR连接在一起的。好,废话少说。上图先! 图1 OMAP-L138 Switched Central Resource看到这个图,肯定很多人与我最开始的感觉一样,什么乱七八糟的呀。里面的SCR还好说,肯定是Switch Central Resource但BR是什么呢?TI没有给出缩略语说明,但在SPRUGM7D那篇名为OMAP-L138 Application Processor System Referrence Guide第4.1节,也就是上面这个图的上面一段文字里列到The switch fabric is composed of multiple switched central resources (SCRs) and multiple bridges。显然这里的 BR就是BRidge的意思。这样这个图的作用,就显然了,就是说数据可以从哪里到哪里。而在这个算是器里面有能力决定哪个使用哪个SCR或BR的核心为ARM, DSP, EDMA以及PRU.讲到这可能已经有很多朋友在骂我罗嗦了。“那么到底该怎么决定哪个SCR甚至哪一个BR被使用才能访问到一个外设, 比如说串口?你要不说清楚,今天别想走!”(腹黑中)“我们TI,把所有的这些挂在SCR上的外设,统一进行了编址?每个设备都对应在特定的地址上,比如说串口0, 0x01c4 2000 0x01c4 2034分别对应着串口寄存器RDRMDR。客户只需要大CPU上访问0x01c4 2000就可以访问相应串口寄存器,对应的SCR及BR会自动选上” (想知道我们TI是怎么设计器件,嘿嘿嘿!)被忽悠了半天看这个图,比较不爽!(权当消遣了,学习一下芯片的实现原理)对于我们要用好器件上的外设而言,比较实惠的还是memoryMap。 下图为OMAPL138器件的MemoryMap(摘自OmapL138的datasheet). 图2 OMAPL138 MemoryMap从数据表我们可以看出如果要从DSP访问DSPL2RAM,只要在DSP代码里访问0x0080,0000到0x0083,ffff有的人可能要问题,要是我候通过ARM访问呢,那我们往下翻MemoryMap这个表(如下图) 图3 OMAPL138 MemoryMap Continued只需要在ARM里访问物理地址0x1180,00000x1183,ffff (当然是指物理地址,而不是操作系统内核地址或是用户空间地址)。前面说了各个处理器怎么看外设,尽管图一中也能看出ARM与DSP关系的一点端倪,但估计还有很多人在疑惑ARM与DSP这小两口怎么是什么关系。(废话,你都说是小两口了)。我们总结一下图1及图2,3所涉及到的MemoryMap表的的内容,我们就不难看现,其实ARM与DSP之间的关系就是如图4这样 图4 站在民政局的角度打量ARM与DSP的关系。今天我们知道了ARM及DSP怎么通过SCR访问的外设,也知ARM与DSP是怎么XXOO的。关于ARM与DSP XXOO的详细介绍,我们在下一讲介绍。敬请期待。第四讲:以SEED-DIM138/1808-Kit上的LED灯D1为例讲述如何进行相关开发(一)本文档的使用许可证: 本文档遵循GPLv2发布,因此任何人引用或修改本文档均需要在发起引用的文章的显要位置(开头或结束处)原样引入本段文字(互联网及电子文档为斜体蓝色,)及所引用版本的下一段的文档编辑人员的列表及工作内容。作者及编辑人员列表: 陈威 网名 blacksword 邮件 或 本文档的发启者及第一版作者。以SEED-DIM138-kit LED操作的层面,讲述了如何从原理图开始操作实际硬件。包括使用CCS、裸机程序、Linux下程序三种方式的实际动手。当前版本:0.1 2010-12-03 06:17分完成适用器件:操作适用于基于TI OMAP-Lx8 C6748 AM18xx处理器的SEED-DIM138/1808-kit,方法适用于TI Sitara、DaVinci、OMAP、Integra、C67xx等系列的绝大多数处理器。 原理适用于所有嵌入式处理器上的产品开发。 嵌入式的开发与PC程序不同,通常需要与定制的开发板或是产品打交道,这就意味着与PC那样的标准架构不同,所有的东西你不能依靠猜来进行。因此我们的工作要从实际硬件出发。那么本文中我们将以SEED-DIM138/1808-Kit上的LED灯D1为例讲述如何进行相关开发,也就是嵌入式的软件开发人员如何从软件的角度看硬件。一、看原理图 看原理图,是为一款嵌入式产品开发软件(纯应用层软件工程师除外)的必备技能之一。具体如何看原理图,今天我们不在这里讲述。我们看SEED-DIM138底板的原理图,知道灯D1是连接到GP613的,所图1所示。图1 SEED-DIM138-Kit套件中底板用户LED原理图 由这个图可以看出要想让灯2发光,必须置GP6_13为高电平。二、查相关器件手册,了解如何进行配置 从软件工程师的角度,所有的外设都是通过地址来进行访问或配置的。 查一下TI的芯片手册,我们发现Datasheet SPRS586x中第3章是Device Overview,其中会有一节讲述Pin Assignments,那么在这边手册中是3.7节。如图 2 所示的 R 行 17 列是 GP613 所在的引脚,该引脚是一个 GP613 及PRU0_R3031等功能的一个复用引脚。(我们知道提供的产品功能都比较强大,因此引脚的复用程度都比较大)。 因此我们首先要解决的是软件的管脚复用问题。我们发现芯片手册SPRS586x中的第3.7节是讲述Pin Multiplexing Control的。Device level pin multiplexing is controlled by registers PINMUX0 - PINMUX19 in the SYSCFG module. 根据这句话,我们可以在文档里搜索PINMUX或SYSCFG的其它章节,发现本文档中并无进一步详细信息。 因此我们需要进一步看文档 SPRUGM7x ,也就是 OMAP-L138 Applications Processor System Reference Guide这篇文档。 SPRUGM7x的第11章是专门讲述SYSCFG(System ConFiG)。其子节11.5.10是详细讲述PINMUX的。我们在里面找到关于GP613的配置说明如图3所示。 意思是说PINMUX13寄存器的11_8位设为8h即可以令该引脚工作为GPIO的GP613. 那么从软件工程师的角度就是需要知道PINMUX13寄存器的地址。 而同样这11.5节的刚开始就是重点介绍SYSCFG寄存器的,在这节的表里面我们发瑞PINMUX13寄存器对应的地址为01c1 4154h. 现在这个引脚已经是GPIO了。 然后我们就应该读具体外设的手册,那么本外设为GPIO,从TI网站OMAPL138 产品信息页 面查找并 下载到 GPIO 的用户手册 SPRUF18x TMS320C674x/OMAP-L1x Processor General-Purpose Input/Output ,根据这篇文档我们知道要使用这个GPIO引脚我们需要将该GPIO引脚的具体功能设为输出,并向该引脚输出高电平,灯D1才会亮。 而GP6对应的输入还是输出是由DIR67寄存器的GP6P13位也是本寄存的比特13控制的。而且,写0表示输出。而往该引脚输出高电平可以通过OUT_DATA67的GP6P13即比特13完成。因此现在的情况是我们需要知道DIR67及OUT_DATA67的地址。而文档SPRUF18x给出的GPIO寄存器地址对DIR67及OUT_DATA67的分配如图表7 GPIO寄存的偏移地址分配表 而这里的值是相对值,需要对照芯片的SPRS586x SPRS586x关于Memory Map的分配,发现GPIO地址起始为01e2 6000h.表8 OMAPL1x8器件的Memory Map总结一下,看文档的顺序,Datasheet-System Reference Guide-专项手册。 这也是看TI文档的基本套路。总结一下,点亮SEED-DIM138/1808-Kit上灯D1的工作流程为:1 设PINMUX13_11_8 为08h2 设GPIO DIR67的GP613位为0,配置管脚为输出3 设GPIO OUT_DATA67的GP6P13位为1下几节我们将实际通过操作CCS而不编程、裸机程序、Linux程序三种手段来以上面介绍的方法来实际点亮这个灯。三、CCS下简单几步操作点亮灯1打开CCS(3.3.82或更新版本,CCSv4.x或后续其它CCS产品), 具体仿真器的配置情况,这里我们不再描述。推荐使用XDS560系列仿真器,如我们合众达的SEED-XDS560Plus因为它确实能让你非常畅地完成我下面要进行的操作。 打开CCS后,选择连接器件的ARM端(DIM138/1808适用)或是DSP端(DIM138/6748适用)。注:需要用到相应的GEL文件。 在View菜单里选择Expressions,这是一个我们通过CCS调试程序时监测变量的一个窗口。如图3所示。 点击其中的”Add new expresion”并输入*0x01c14154作为Expression,然后在Value处入0x88。然后再分别加入: Expression: *0x01e26088 Value: 0xfffffff&(0x113) Expression: *0x01e2608c Value: 0x0|(0x113) 最后输入完的CCS Expressions窗口如图4所示。到这一步为止,你会发现板子上的LED D1已经亮了。当然在CCS下还可以使用Memory窗口来完成同样的工作。但我个人觉得Expressions窗口最好用。四、裸机编程的方法点亮LED D1 程序代码如下:引用:#define PINMUX_BASE _ADDR0x01c14120 #define PINMUX_4_LED_D1 13#define PINMUX_START_BIT_4_LED_D1 8#define PINMUX_SET_4_LED_D1 0x8#define GPIO_BASE_ADDR 0x01e26000#define GP_BANK_LED1_D1 6#define GP_PIN_4_LED1_D1 13typedef enum PIN_OUTPUT, PIN_INPUT gpio_DIR;typedef struct ledStructunsigned char pinmuxGroup;unsigned char pinmuxStartBit;unsigned char pinmuxSet;unsigned char gpioBank;unsigned char gpioPin;boolstate; / On or Off;bool pinmux(unsigned short pinMuxGroupNum, unsigned shortpinMuxStartBit,unsigned char pinMuxCmd)unsigned int *pinmux = (unsigned int*)(PINMUX_BASE _ADDR +pinMuxGroupNum *4);*pinmux=(*pinmux & (0xf pinMuxStartBit) | (pinMuxCmd pinMuxStartBit);if(*pinmux & (0xf pinMuxStartBit )!=(pinMuxCmd pinMuxStartBit)return false;elsereturn true;boolgpioSetDir(unsigned short gpioBank, unsigned chargpioBankPinNum, gpio_DIR gpioDir )unsigned int*gpioGroup = (unsigned int*) (GPIO_BASE_ADDR +(gpioBank/2)*4 );*gpioGroup = ( *gpioGroup & (0x1( gpioDir gpioBankPinNum);if( *gpioGroup & (0x1 ARM_INTERNAL_RAM .data: load ARM_INTERNAL_RAM .bss: load ARM_INTERNAL_RAM3.在evmomapl138.c文件中添加函数void boot(void) asm( .global STACKStart); asm( .global _stack); asm( .global main);asm( NOP); asm( MRS r0, cpsr); asm( BIC r0, r0, #0x1F); / CLEAR MODES asm( ORR r0, r0, #0x13); / SET SUPERVISOR mode asm( ORR r0, r0, #0xC0); / Disable FIQ and IRQ asm( MSR cpsr, r0); asm( NOP); / Set the IVT to

温馨提示

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

评论

0/150

提交评论