Posts

Showing posts from November, 2011

Differences between ASIC, ASSP and ASIP

ASIC (Application Specified Integrated Circuit) is a customized integrated circuit. It is usually used by a person or company for a very limited usage. So when it is developed, only the person or company who orders it can use it. It is not useful for other usages, for example, an IC designed for a specific line of cellular phones of a company, whereby no other products can use it except the cell phones belonging to that product line. - ASIC is just built for one and only one customer. - ASIC is used only in one product line - Only volume production of ASICs for one product can make sense which means low unit cost for high volume products, otherwise the cost is not efficient. - Can exploit parallelism to achieve high performance - Low power consumption ASSP (Application Specified Standard Processor) is an integrated circuit that implements a specific function that appeals to a wide market, which means its function is specified for example a motor drive chip. But it is used widel...

Common commands in Linux

VI operations: dd is used to delete one line yy is used to copy one line p is used to paste one line GCC some useful operations: -g is used to compile the program so that the debug program GDB can debug the execution. -l is used to link the library, for example,  -lm means to link "math" library. -o used to name the execution file. GDB some useful commands: list : used to list the program in the source code. break (line number) : used to set the break point. run : run the program in GDB. next(or n) : used to execute program step by step. continue : execute the program until the end. quit(or q) : exit GDB. (press ENTER) : reexecute the last command.

关于2440init.s之一(转载)

2440的初始化 程序 ,也可以说是bootloader中的精华部分,承载着程序执行的第一条指令 的重要任务,所有得程序要想执行,那么首先必须过Init.s这一关啊。 那么Init究竟做了些什么呢,咳,这的确是一个头大的问题,起初真的是一头雾水啊 首先,定义了入口地址,一般处理器上电以后,都会从存储器的0地址开始执行,好了,现 在就有第一个问题出现了,这个存储器的0地址是个什么概念; 要解决这个问题,首先必须弄清楚你的 系统 有哪些存储器。一般来说,不外乎rom和ram, 还有flash,flash是很重要的,因为我们的程序就放在那儿。可是我们知道,flash的物理 地址一般不会是从0开始啊,呵呵,的确是这么回事,那这个0到底是什么呢,很简单,偏 移量啊,就是flash的base+xx,这个xx就是0,^_^,就这么简单 接下来,出现第二个问题,程序从0地址执行,那么下一个要执行的 代码 是什么呢,他是通 过什么跳转到第二个代码呢? 这个问题的回答要针对具体的处理器了,一般代码的存放都是连续存放的,就是第一个地 址,第二个地址,代码占多大空间,那么第二个地址就是第一个地址+第一条指令占居的 空间 比如说我们现在使用的2440,它是32位宽的,就是说每条指令译码后,为一个32位的二进 制数,它的不同的位分别代表了这个指令要做什么。那么这样一条代码在存储器中就要占 据32位。那我们知道现在一般存储器都是按字节存放的,如此算来,一条指令要占据4个字 节,事实上也确实如此。 由此我们得知,假如说我们的第一条指令存放在0x00000000处,那么第二条指令就应该存 放在0x00000004处了。^_^一点都不假。并且,这里还要说明一点,由于它每条指令都是4 字节,也即一个字的宽度,同时 arm 在寻址的时候,是字对齐的,所以,arm的地址位的低 两位(如A1,A0)在到存储器中寻找的时候,是没有效的,因为存储器按字节存取,而一 条指令占4个字节,所以呢,处理器每次都是4个字节的拿或放,因而2^2=4,所以A1和A0的 变化,只会出现0x00000001,0x00000002,0x00000003这样的数,而这样的数在寻址的时 候,都是指向了0x00000000起始的四个字节,所以啊,即使出现这样的数,都会 自动 ...

ARM指令中如何判断一个立即数是有效立即数(转载)

arm指令 立即数(一) 2011-04-13 16:55 在ARM处理器的汇编语言中,对指令语法格式中的<shifter_operand>的常数表达式有这样的规定:“该常数必须对应8位位图,即常数是由一个8位的常数循环移位偶数位得到的。 首先从ARM指令系统的语法格式说起。 一条ARM指令语法格式分为如下几个部分: <opcode>{<cond>}{S} <Rd>,<Rn>{,<shifter_operand>} 其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,而{<cond>}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。 Opcode      指令助记符,如LDR,STR  等 Cond              执行条件,如EQ,NE  等               S                      是否影响CPSR  寄存器的值,书写时影响CPSR,否则不影响               Rd                    目标寄存器 Rn                    第一个操作数的寄存器 shifter_operand            第二个操作数 其指令编码格式如下: 31-28 27-25 24-21 20    ...

计算机中的存储段类型

计算机中的存储管理中有三个数据段: 代码段(.text)、数据段(.data)以及BSS段(.bss). 这里首先区分一下.data与.bss,两个段存放的都是数据,区别是data段中的数据是带有初始化的,所以运行前其在代码段中的存储要包括段的大小以及初始化值,而bss段中的数据是不带有初始化值的,所以其在运行前在代码段中只包含段的大小信息,故未初始化的变量如果定义多了,代码会很小(其实仔细想想这是一句废话,变量不初始化,代码段中就不包含初始化信息,代码自然就小了). note:其实仔细想想,编译器这样做是有一定的道理的。如果只用bss的话,有时候我们需要在变量中放入一些非常重要的初始化数据。如果我们都是用data段的话,本来一些不需要初始化的变量都要被迫地初始化一些值,这是对程序存储空间的浪费。

ARM中的RO、RW、ZI的内容

RO = 代码段(.text) + 常量数据段(.constdata) + ...(something I don't know now) RW = 变量数据段(.data) ZI = BSS数据段(.bss) 这里RO运行前运行后都只保存在flash中;RW运行前保存在flash中,运行后copy至RAM;ZI同RW一样,只是ZI在flash中没有初始化值。

arm汇编中的literal pools

        literal pools是一个用于存储32bit数据的字池,由于机器码的操作数operand2只有12位,所以其能操作的 立即数 是及其有限的,因此不得不使用一个literal pools来配合指令执行操作。这样一个ldr指令就有可能需要两个32bit的存储空间来完成一个任务。 如果一段代码中需要访问字池时,编译器首先寻找现有的字池,看看里面是否有想要的数据,如果没有则自动在代码段结尾处创建一个字池,当然也可以使用伪指令LTORG来自行创建一个字池。下面说一下字池的位置: 1、字池的位置一般是放在一个代码段的结束位置(一个代码段一般用AREA来定义),一般是在END的后面,或者下一个段(即下一个AREA指令)之前。 2、也可以使用伪指令LTORG自定义一个位置,但一般是在无条件跳转指令的后面,以保证literal pools不会被误当做可执行指令被执行。 3、还有一点,字池的位置要在指令的可执行位置范围内,即要在距离PC指针4k的范围内 (原因同样是因为operand2只有12位,即可寻址范围只有4k) 。     举例如下:         start                 bl func1                 bl func2         stop                 mov r0,#0x18               ...

adr与ldr的区别

adr与 ldr r0, =label 的区别: adr 和 ldr r0, =label(这里不包括ldr的一般用法) 都是pseudo-instruction 。 adr r0, label与ldr r0, =label实际上实现的功能都是一样儿的,都是将label的地址存放到r0中,但是由于adr中用的是相对地址且使用一个汇编指令完成,故其寻址范围限制在4k的范围内。但是ldr则不同,由于其使用了literal pools,寻址范围可以在4G的任意范围(但是切记literal pools的位置仍然要在4k之内)。如果说两者之间有什么不同的话,那就是:使用ldr要比使用adr浪费一些存储空间(如果label距离PC不是很远的情况下,使用adr是合理的)。 使用arm的启动代码2440init.s来举例如下: 代码未作任何修改的代码如下: copy_proc_beg          adr        r0, ResetEntry         ldr        r2, BaseOfROM         cmp        r0, r2         ldreq      r0, TopOfROM         beq        InitRam               ldr        r3, TopOfROM 其反汇编结果如下:    copy_proc_beg          0x00000268:    e24f0f9c    ..O.    SUB     ...

Playing game Blockbreaker in hyperterminal through 8051(Assembly language)

Image
Use keyboard to send move orders to 8051 microcontroller through RS232. 8051 calculate the position of paddle and the ball, check if the bricks are hit. Then 8051 return the result to hyperterminal to display the game interface through RS232. All written in assembly language. You can refer to the following website to learn how to control the cursor and display colour in hyperterminal. http://ascii-table.com/ansi-escape-sequences-vt-100.php The serial port configuration is:         Baud rate: 19200         Data bits: 8         Parity check: none         Stop bits: 1         Flow control: none Game is shown below: Source code: #include <sfr51.inc> ; 8051 sfr and ports are defined here HONR EQU 95 ; ASCII of "_" VERT EQU 124 ; ASCII of "|" SPACE EQU 32 ; ASCII of space FRAME_TOPLEFT_...