您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

SoC前段(ARM)嵌入式体系开辟实作训练(下)

发布日期:2011-04-17

   指令实行
   在RISC的精简指令中,它含有多种意义,因此较难懂白。但在Debugger对CPU掌握的全透明下,就可明朗白楚看到指令的实行, 也加深对CPU的相识。为了寓目指令与组合语言的实行,我们来开一窗口共讲授它到处窗口的意义。起重要把ICE与Creator接上,并实行Domingo进程如图1图2。
 

图1 Pocket ARM ICE 与Creator的接线图
 

图2 Domingo IDE窗口画面
 

Example

在command下键入以下指令,以便等一下寓目其各指令实行结果。固然不甚相识指令,但在实行后,窗口会表现有变动(赤色值)的信息,您就会体悟原来云云。

STMIAR0,{R1-R5}

实行这个指令后,会将R1~R5等寄存器之内涵值保存到R0寄存器所指的影象体地址。
 

寄存器值
 

   影象体变革
 
 


进程实行
以keypad与7-seg为例,在project中去download一现成的进程来寓目其实行,并在keypad上按键,而寓目7-seg的变革。看了以后,发觉它并不陌生,与8051也差未几,只是惊奇Domingo操纵环境比早期的ICE有着天壤之别的人机操纵接口。
 


 

操纵接口

上图中重要进程内容如下:
int main(void)
{

__enable_interrupt();
Initial_Creator();
EnableInterrupt(BIT_GMASK);

while (1)
{
UC ch;
while(KEYPAD_get_key(&ch) != OK);
for (i=0;i<1000;i++)
{
_7SEG_put_led(1,0);
_7SEG_put_led(2,0);
_7SEG_put_led(3,0);
_7SEG_put_led(0,ch);
}
}

DisableInterrupt(BIT_GMASK);
return(0);
}
在利用debug/load module加载已经compiler完成之进程后,实行free go便可测试进程之精确性并且举行debug。
 
 
进程创建与Compile流程
1.创建project
创建专案以办理您的相干进程并可将自定义的事变环境保存起来。
2.Edit
打开Editor以编辑新创建的进程或打开一个已创建的进程。固然,这可以是Assembly或C语言的进程。

3.Compile
Domingo IDE增援外部的Compiler进程,透过一些大略的设置步调,您可以直接在这个整合式的接口中实行compile与link来build您的project,也可以用make的方法只针对变动处build以增快速率。若您在compile的进程中发明白错误,还可以直接在错误消息处double click以快速地直接跳至产生误错的源代码位置方便您的除错。

4.ICE的连接
固然除了硬件的接线外,还必要在Domingo中实行connect以与ICE精确地连接起来,此时目标板的控制权才会交给ICE。

5.Download
将compile完毕的进程档download至目标板的RAM区,Domingo增援多种格局的除错档,因此即便是没有整在Domingo接口中的外部除错档也可以下载下来哦。

6.Debug
在Domingo强而有力的除错成果增援下,信托这不会是一个太大的困难,不过倒是一个最紧张的部份,没有好东西的增援,这里将会是您整个开辟专案中最费时的一个部份。

7.烧录
进程完成了,如有必要再共同一些影象体位置的修改后就可以透过ICE直接烧录至ROM内里了。

8.独立测试
好啦,ICE的任务完成了!这时您已经可以将ICE与目标板退出让体系板独立运作了,测试一下,是不是告成了呢?整个流程与过去8位元8051的做法好像大同小异,但着实内里却又大有文章,想高级至32位元开辟的您,要是没有一个好的Debugger与ICE将会困难重重。
 
 
体系办理
这是32bit ARM CPU与8051截然差别的地方,一个单独的CPU core是不克不及动的,它要加上一些外围周边资源才华动起来,比方放进程的ROM区、放数据的RAM区、BUS连接的方法、cache/buffer的环境。这些资源要设置好,才华启动CPU实行指令。以下做一些形貌:
一个包括了ARM core的微控制器皆会架构一个体系办理者(System Manager)来办理体系所提供的全部周边资源,其重要的成果有以下几种:
˙仲裁周边之优先级:由于ARM微控制器所提供的周边成果很多,故会产生多个周边同时请求举行存取的环境,这时体系办理者便会依据控制器内牢固的优先级次序,仲裁数个周边的体系总线存取请求。
˙影象体所需的控制信号:提供存取影象体时,所需的影象体控制信号。比方:DMA控制器或CPU孕育产生了一个相映射到DRAM bank的地址时,体系办理者的DRAM控制器会孕育产生所需的标准/EDO存取信号大概是SDRAM存取信号。
˙I/O所需的控制信号:提供ROM/SRAM大概外部I/O bank之间总线传输所需的信号。
˙内/外部总线宽度差别之补偿:补偿外部影象体总线和内部数据总线之间,差别总线宽度之数据流。

而针对体系影象体办理部分,各个memory bank的位置、大小皆由current bank base pointer和current bank end pointer之设置所决定。故我们可利用base bank pointer/next bank pointer的见解去创建一个连续的影象体应对。这个见解也便是将next bank的base pointer设置为与current bank的end pointer雷同的地址。但是有一点必须细致的,便是这些连续地址不可有重叠的地方。

在可定址的空间范畴里,种种bank的肇始地址并不是牢固的,我们可以利用体系寄存器去组态一个bank肇始地址为bank的基底指标,而这个地址的分析度为64K byte,故bank的肇始地址会定义为”基底指标左移16位元”,而bank的结束地址为”下一个指标左移16位元的地址值减1”。

然而在power-on或reset之后,控制全部bank的adress pointer寄存器皆会初始化为默认值;在这个环境下,除了ROM bank0的next pointer以外的全部bank pointer皆会被设置为0。这也便是说,除了ROM bank0以外全部的bank,在体系启动后,皆会成为未定义状态。
ROM bank0的next pointer和base pointer在重置后分别会为0x200和0x000。这代表体系在重置后会主动定义ROM bank0的肇始地址由0开始,并且统共拥有32Mbyte的空间,其算法如下:
 

base point = 0x000
next point = 0x200
故ROM bank0的地址范畴为0x000 0000 ~ 0x1ff ffff(32Mbyte)
其谋略的方法为:
肇始地址 = 0x000左移16位元,故为0x000 0000
结束地址 = 0x200左移16位元-1,故为0x200 0000-0x1 = 0x1ff ffff
 


由于体系启动后,会由0x0的地址开始举措,故这个ROM bank0的初始定义便是为了使体系可以控制利用者所提供贮存在外部ROM的boot code,以使体系可以精确的启动。boot code的举措内容会依照利用者所需求的筹划来撰写,一样平常会做体系初始化的事变以及依据实际上的外部影象体应用和周边装置组态重新配置体系影象体map。
 

图3 重置后的体系影象体map
 

为了控制周边成果以及影象体的操纵,体系办理者利用一些专用的特别寄存器集(如表1所示)来举行控制和办理。经过筹划这些特别寄存器之内含值,可以阐明下列事变:
˙影象体范例
˙外部总线宽度存取周期
˙控制信号时序(比方RAS和CAS)
˙memory bank位置
˙memory bank的大小可在随意的地址空间去利用
每个memory bank base pointer的地址分析度皆为64Kbyte(共16位元),而base address pointer为10bit,故整个可定址的影象体空间为16Mword=64Mbyte(如表2所示)。
 

表1 体系办理者寄存器
 

                                                 表2 根本的memory bank地址构成
 
 
 
PCM
在Domingo中PCM便是在设置此一体系成果,因每个人私家所计划的硬件都差别,如未在PCM中设置精确,那Domingo对进程指令的存取就无法精确动,就像您在coding进程,在一开始也要初始化这些相映射的值,CPU才华精确的举措。
ARM为基底的Embedded System,其影象体体系(尤其是DARM)要能利用之前,通常要颠末连续串的设置举措,而利用者要是每次利用ICE在下载进程到影象体之前都要手动地去实行上述初始化影象体事变的话,着实是一件很费力的事。而PCM下令则可为利用者代为实行上述例行之设置事变。
有以下二个要领可以打开PCM设置窗口
■利用configRconfig PCM.......下令
■利用configRHardware Options下令
进入Hardware Options设置窗口后再按Config PCM...按钮
 

图4 PCM窗口
 

以下阐明PCM窗口内各按钮之成果
■Import
加载一个先前保存好的PCM文件
■Export
将如今PCM之设置存入指定之文件内。
■Move Up
将选定之设置列向上移动一列。
■Move Down
将选定之设置列向下移动一列。
■Delete
将选定之设置列删除。
■Delete All
将全部之设置删除。
■Modify
举行修改选定之设置列,并出现以下之设置窗口
 

图5 嵌入式体系架构
 

利用者可透过以上窗口来修改,名称、地址、设置值及数据长度等相位。完成后请按Done钮设置成修改好之事变。
■Insert
将选定之设置列向下推,并在此插入一个设置列,此时会出现以下之设置窗口,供设置之用。
 

图6
 

在Name的栏位内要是要利用CPU内定的寄存器名称时,则可点选System Name并利用右侧下拉菜单来选择一个已存在寄存器,在选择完毕后右侧的Address及Size栏位亦会被主动设置完成,你只必要输入Value项目即可。
若为自定名称的话,则请点选User Defined之后再依序输入Name、Address、Value及Size各栏位,末了按Insert即可。若要结束设置事变则按Done按钮。
■Append
同Insert下令,其差别在于Append是将新项目参加到末了的一设置列。
■Apply
利用此按钮可以将如今之设置项目立即对CPU及目标板做一次设置之事变。
 
 
Embedded Linux
有了CPU、指令与软件的技能后,再来就可创建体系见解,作业体系是一个学期的课程,不是在这里三言二语就可讲完,我们仅作重点阐明。因是用现成Open Source的Linux进程,因此为了开辟产品,财产界都只针对需本身需参加或修改的部份处理惩罚即可,也较快完成软件Porting,除非您是要澈底相识整个OS架构,也想本身创造一个OS,那就需深入各部份。因此Porting告成才是最紧张的。
在这架构下就可明白本身所要开辟的是那一部份软件,只要针对它的相干界面相识,就可动手。因此如只开辟AP S/W,那固然就不需进入到相识CPU的H/W,用Compiler、Debugger东西即可。但将来的产品,SoC嵌入式体系产品都不但云云罢了,它需与H/W连接,它不但用到Compiler、Debugger,更需ICE的增援与其他硬件东西。因此如能创建对CPU与H/W的相识,将来的生长空间就更开阔,更有附加代价了。如图7所示,在Linux OS与H/W的中间那一层便是我们要去创建的本领。
 

图7
 
 
 
Device driver
这是在Linux下一个嵌入式体系产品必经之路,它依差别硬件而有差别之进程,但只要一个通,其他就容易了。因它与硬件有很密切接洽干系性,我们已在Creator板上有些driver,在ICE与Domingo操纵下,就容易相识它的进程了。因进程占篇幅,就不在此形貌。
 
FPGA之IP实作
FPGA上之IP开辟、验证,这又是一学期的课程,在此我们也仅以重点式阐明。在周边IP FPGA模块连讨论上,可调换差别FPGA或CPLD模块(将来性)。在如今的Create Ph-FPGA-XC2S上,它的重要特点是:(一)可做根本组合逻辑与序向逻辑实作,(二)与ARM CPU进程精密连合之逻辑计划,(三)软件或硬件最佳化选择之评估,(四)序列 ←→并列数据转换。

其他可发挥的硬件成果如下:
FPGA:
XC2S30-5(30K gate counts)
■Codec:
˙16-Bit,26-KSPS
˙Built-in Microphone
■Analog To Digital:
8-Bit serial I/O ADC with 2 channel multiplexer
■SRAM:
128K×8Bit,12ns
■7 Segment LED×1
■9 LED Lamps
■4 Way DIP Switch
■1 Tag Switch
■1 DC Buzzer for tone generation
■PS2 Connector ×1 for PS2 keyboard or mouse
■Build in Xilinx download cable header circuit

我们仅以大略之解码成果做典范,但它需共同Xilinx ISE 4.1 以上东西来开辟,再Download入板上。就可由CPU实行进程去驱动逻辑IP,在LED上看到表现的结果,以作育体系化思索,创作的本领。

【典范】:由ARM CPU送来的值经逻辑解码、Latch表如今LED上
--
-- MICROTIME COMPUTER INC.
--

library IEEE,synopsys;
use synopsys.attributes.all;
use IEEE.std_logic_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all;

entity TEST is
port (
GSR_IN : in STD_LOGIC;
IO_ADDR : in std_logic_vector(15 downto 0);
IO_DATA : inout std_logic_vector(15 downto 0);
nECS3 : in std_logic;
IO_nOE : in std_logic;
IO_nWE : in std_logic;
IO : inout std_logic_vector(9 downto 0);
LED : out std_logic_vector(7 downto 0)
);

end TEST;

architecture TEST of TEST is

signal GSR1, nGSR1 : std_logic;
signal PORT_READ : std_logic;
signal CS_PORT : std_logic;
signal sIO_nWE, sIO_nOE : std_logic;
signal FPGA_CTRL : std_logic_vector(7 downto 0);

begin
-- #####################################################################
-- #################### GSR
-- #####################################################################
GSR1 <= GSR_IN;
nGSR1 <= not GSR_IN;

-- #####################################################################
-- ##### DECODING
-- #####################################################################
CS_PORT <= ’1’ when(nECS3=’0’ and IO_ADDR(11 downto 8)=X"0") else ’0’;
PORT_READ <= ’1’ when(CS_PORT=’1’and sIO_nOE=’0’) else ’0’;

LED <= FPGA_CTRL;

IO_DATA <= "000000" & IO when(PORT_READ=’1’) else "ZZZZZZZZZZZZZZZZ";

-- #####################################################################
-- ##### IO PORT
-- #####################################################################
p_PORT_WR : process (GSR1, sIO_nWE)
begin
if(GSR1 = ’0’)then
FPGA_CTRL <= X"00";
elsif(rising_edge(sIO_nWE)) then
if(CS_PORT = ’1’) then
FPGA_CTRL <= IO_DATA(7 downto 0);
end if;
end if;
end process;

end TEST;