甲骨文云arm实例有什么用

甲骨文云arm实例有什么用,第1张

给出了最多4核24G内存4G带宽的配置

甲骨文兑现了发射ARM驱动云的承诺,透露它将以每小时1美分的价格提供安培的80核Altra处理器。

一个帐号的存储免费额度只有200G,而每台实例的系统盘也就是引导卷,最少需占用46G,如果已经拥有了2台老的免费1C1G服务器,就已经占用了约100G额度。所以想将4C24G拆分为4台1C6G会使引导卷超出免费额度,可能会导致出现额外费用。

int GetSum(int val) //使用汇编求1+2+3++val的值

{

int sum = 0;

__asm__ __volatile__(

"MOV R5 , %1\n"//val放入寄存器r5

"MOV R1 , #0\n" //sum = 0

"MOV R2 , #1\n"//i = 1

"LOOP:\n"

" ADD R1 , R1 ,R2\n" //sum = sum + i

" ADD R2 , R2 ,#1\n" //i++

" CMP R5 , R2\n" //判断 i 是否等于val if(i==val)

" BEQ END\n" //若相等 跳转至END处 break

" B LOOP\n" //若不相等 跳转至LOOP处进入下次循环 else continue

"END:\n"

"MOV %0 , R1\n" //sum = R1

:"=r"(sum)//输出

:"r"(val)//输入

:"memory"

);

return sum;

}

随便写了个求和的例子 其余的循环大同小异 不懂可以继续探讨 运行之前请交叉编译然后在ARM平台上运行

一。从一数到十

COUNT EQU 0x30003100 ;定义变量COUNT的基地址 AREA Example1,CODE,READONLY;声明代码段Example1为只读 ENTRY ;标识程序入口

CODE32 ;声明32位ARM指令 START LDR R1,=COUNT ;将0X30003100赋给R1 MOV R0,#0 ;执行R0=0

STR R0,[R1] ;存储R0寄存器的数据到R1指向的存储单元 LOOP LDR R1,=COUNT ;将0X30003100赋给R1

LDR R0,[R1] ;将R1中的数值作为地址,取出此地址中的数据保存到R0中 ADD R0,R0,#1 ;执行R0=R0+1

CMP R0,#10 ;将R0与10进行比较

MOVHS R0,#0 ;若R0大于等于10,则R0=0

STR R0,[R1] ;存储R0寄存器的数据到R1指向的地址单元 B LOOP ;跳转到LOOP

END ;汇编文件结束

二,9的8次幂

X EQU 9 ;初始化X为9 n EQU 8 ;初始化N为8

AREA Example3,CODE,READONLY ;生明代码段Example3为只读 ENTRY ;标识程序入口路

CODE32 ;声明32位ARM指令

START LDR SP,=0x30003F00 ;把0x30003F00 赋给SP(R13) LDR R0,=X ;把9赋给R0 LDR R1,=n ;把8赋给R1

BL POW ;跳转到POW,并把下一条指令地址存入到R14中 HALT B HALT ;等待跳转

POW STMFD SP!,{R1-R12,LR} ;将R1-R12入栈,满递减堆栈 MOVS R2,R1 ;将R1赋给R2,并影响标志位 MOVEQ R0,#1 ;若Z=1,则R0=1

BEQ POW_END ;若Z=1,跳转到POW_END MOV R1,R0 ;将R0中值赋给R1 SUB R2,R2,#1 ;将R2-1的只赋给R2 POW_L1 BL DO_MUL ;跳转到DO-MUL,并把下一条指令地址存入R14中 SUBS R2,R2,#1 ;将R2-1的值赋给R2,并影响标志位 BNE POW_L1 ;若Z=0,跳转到POW_L1

POW_END LDMFD SP!,{R1-R12,PC} ;数据出栈,存入到R1-R12,PC中 DO_MUL MUL R0,R1,R0 ;把R1R0的值赋给R0 MOV PC,LR ;LR中的值赋给PC END ;汇编结束

三:从一一直加到一百

程序清单(一) C 语言实验参考程序

#define uint8 unsigned char ;定义一个无符号字符常量uint8 #define uint32 unsigned int ;定义一个无符号整型常量unint32

#define N 100 ;定义一个常量N=100(宏定义,100用N代替) uint32 sum; ;定义sum为无符号整型常量(声明一个unsigned int型的变量sum) void Main(void) ;主函数

{uint32 i; ;定义无符号整型常量i(声明一个unsigned int型的变量i) sum=0; ;sum初始值为0

for(i=0;i<=N;i++) ;i在N内自增加1(i从0开始,i<=N时循环成立) {sum+=i;} ;把sum+i赋给sum while(1); ;为真循环 }

程序清单(二) 简单的启动代码

IMPORT |Image$$RO$$Limit | ;R0输出段存储区域界线 IMPORT |Image$$RW$$Base | ;RW输出段运行时起始地址 IMPORT |Image$$ZI$$Base | ;ZI输出段运行时起始地址 IMPORT |Image$$ZI$$Limit | ;ZI输出段存储区域界线 IMPORT Main ;主函数

AREA Start,CODE,READONLY ;声明代码段start,为只读 ENTRY ;程序入口

CODE32 ;声明32位ARM指令 Reset LDR SP,=0x40003f00 ;将0x40003f00赋给SP

LDR R0,=|Image$$RO$$Limit| ;将R0输出段存储区域界线赋给R0 LDR R1,=|Image$$RW$$Base | ;将RW输出段运行时起始地址赋给R1 LDR R3,=|Image$$ZI$$Base | ;将ZI输出段运行时起始地址赋给R3 CMP R0,R1 ;比较R0和R1,相等Z=1,反之Z=0 BEQ LOOP1 ;若Z=1,则跳到LOOP1

LOOP0 CMP R1,R3 ;比较R1和R3,若R1<r3,c=0

LDRCC R2,[R0],#4 ;若C=0,读取R0地址单元内容并且存入R2,且R0=R0+4 STRCC R2,[R1],#4 ;若C=0,读取R2中的数据存入R1,且R1=R1+4 BCC LOOP0 ;若C=0,跳转到LOOP0

LOOP1 LDR R1,=|Image$$ZI$$Limit| ;将ZI输出段存储区域赋给R1 MOV R2,#0 ;把0赋给R2

LOOP2 CMP R3,R1 ;比较R1和R3,若R1<r3,c=0 strcc="" r2,[r3],#4="" ;若c="0,将R2中数据保存到内存单元R3中,且R3=R3+4" bcc="" loop2="" b="" main="" ;跳转到主程序="" end="" ;汇编结束=""

四、程序清单(一) C 语言调用汇编的参考程序

#define uint8 unsigned char ;定义一个无符号字符常量uint8 #define uint32 unsigned int ;定义一个无符号整型常量uint32

extern uint32 Add(uint32 x,uint32 y); //声明子程序Add为一个无符号整型常量,它为2个无符号整型常量x,y的和

uint32 sum; ;定义sum为无符号整型常量 void Main(void) ;无返回主程序

{sum=Add(555,168); ;sum等于555+168 while(1); ;为真循环 }

程序清单(二) 汇编加法函数程序

EXPORT Add ;声明子程序Add方便调用 AREA Start,CODE,READONLY ;声明代码段start,为只读 ENTRY ;程序入口

CODE32 ;声明32位ARM指令

Add ADD R0,R0,R1 ;将R0+R1值赋给R0 MOV PC,LR ;将LR值赋给PC

你可以自己写一个汇编的程序,把Nand Flash 中的程序搬到SDRAM中。因为S3C2410有Nor Flash和Nand Flash有两种启动方式,所以在搬移过程中略有不同。如果用Nand Flash启动可以使用下面的代码,至于Nor Flash启动就相对简单了,你可以自己研究一下。

文件1heads

@ 文件 heads

@ 作用:关闭看门狗、SDRAM 的初始化设置、搬移 Nand Flash 4K 以后

@ 的代码到 SDRAM 的指定位置、执行 SDRAM 中的代码

text

global _start

_start:

ldr r0, =0x53000000 @ Close Watch Dog Timer

mov r1, #0x0

str r1, [r0]

bl memory_setup @ Initialize memory setting

bl flash_to_sdram @ Copy code to sdram

ldr sp, =0x34000000 @ Set stack pointer

ldr pc, =main @ execute the code in SDRAM

文件2:flashs

@ 文件 flashs

@ 作用:设置 Nand Flash 的控制寄存器、读取 Nand Flash

@ 中的代码到 SDRAM 的指定位置

equ NFCONF, 0x4e000000

equ NFCMD, 0x4e000004

equ NFADDR, 0x4e000008

equ NFDATA, 0x4e00000c

equ NFSTAT, 0x4e000010

equ NFECC, 0x4e000014

global flash_to_sdram

flash_to_sdram:

@ Save return addr

mov r10,lr

@ Initialize Nand Flash

mov r0,#NFCONF

ldr r1,=0xf830

str r1,[r0]

@ First reset and enable Nand Flash

ldr r1,[r0]

bic r1, r1, #0x800

str r1,[r0]

ldr r2,=NFCMD

mov r3,#0xff

str r3,[r2]

@ for delay

mov r3, #0

1:

subs r3, r3, #1

bne 1b

@ Wait until Nand Flash bit0 is 1

wait_nfstat:

ldr r2,=NFSTAT

ldr r3,[r2]

tst r3,#0x01

beq wait_nfstat

@ Disable Nand Flash

ldr r0,=NFCONF

ldr r1,[r0]

orr r1,r1,#0x8000

str r1,[r0]

@ Initialzie stack

ldr sp,=4096

@ Set arguments and call

@ function nand_read defined in nand_readc

ldr r0,=0x30000000

mov r1,#4096

mov r2,#1024

bl nand_read

@ return

mov pc,r10

文件3:interruptc

/

文件 interruptc

作用:设置并响应按键中断

/

#include "printfh"

#define GPECON ((volatile unsigned long )0x56000040)

#define GPEDAT ((volatile unsigned long )0x56000044)

#define GPEUP ((volatile unsigned long )0x56000048)

#define GPFCON ((volatile unsigned long )0x56000050)

#define GPFDAT ((volatile unsigned long )0x56000054)

#define GPFUP ((volatile unsigned long )0x56000058)

#define GPGCON ((volatile unsigned long )0x56000060)

#define GPGDAT ((volatile unsigned long )0x56000064)

#define GPGUP ((volatile unsigned long )0x56000068)

#define EINTMASK ((volatile unsigned long )0x560000a4)

#define INTMSK ((volatile unsigned long )0X4a000008)

#define PRIORITY ((volatile unsigned long )0x4a00000c)

#define EINTPEND ((volatile unsigned long )0x560000a8)

#define INTPND ((volatile unsigned long )0X4a000010)

#define SRCPND ((volatile unsigned long )0X4a000000)

#define BIT_EINT0 (0x1 << 0)

#define BIT_EINT2 (0x1 << 2)

#define BIT_EINT8_23 (0x1 << 5)

#define SET_KEY_INTERRUPT_REG() ({ \

GPGCON = (GPGCON & (~((3<<12)|(3<<4)))) | ((1<<12)|(1<<4)) ; \

GPGDAT = GPGDAT & (~((1<<6)|(1<<2))); \

GPECON = (GPECON & (~((3<<26)|(3<<22)))) | ((1<<26)|(1<<22)); \

GPEDAT = GPEDAT & (~((1<<13)|(1<<11))); \

GPGCON = (GPGCON & (~((3<<22)|(3<<6)))) | ((2<<22)|(2<<6)) ; \

GPFCON = (GPFCON & (~((3<<4)|(3<<0)))) | ((2<<4)|(2<<0)) ; \

})

__inline void ClearPending(int bit)

{

SRCPND = bit;

INTPND = bit;

}

void init_irq( ) {

GPFCON = ((0x1<<8) | (0x1 << 10) | (0x1 << 12) | (0x1 << 14)); // Set the led D9~D12 output

/

GPGCON = (GPGCON & (~((3<<12)|(3<<4)))) | ((1<<12)|(1<<4)) ; // GPGCON6,2 set output

// GPGCON6:KSCAN1

// GPGCON2:KSCAN3

GPGDAT = GPGDAT & (~((1<<6)|(1<<2))); // GPGDAT6,2 output 0

GPECON = (GPECON & (~((3<<26)|(3<<22)))) | ((1<<26)|(1<<22)); // GPECON13,11 set output

GPEDAT = GPEDAT & (~((1<<13)|(1<<11))); // GPEDAT13,11 output 0

GPGCON = (GPGCON & (~((3<<22)|(3<<6)))) | ((2<<22)|(2<<6)) ; // GPGCON11,3 set EINT

GPFCON = (GPFCON & (~((3<<4)|(3<<0)))) | ((2<<4)|(2<<0)) ; // GPFDAT2,0 set EINT

/

// Use the defined micro instead of above code

SET_KEY_INTERRUPT_REG();

GPFUP |= (1<<0) | (1<<2); // Up

GPGUP |= (1<<3) | (1<<11); // Up

EINTPEND |= (1 << 19) | (1 << 11); // Clear eint 11,19

EINTMASK &= (~((1 << 19) | (1 << 11))); // Enable EINT11,19

ClearPending(BIT_EINT0|BIT_EINT2|BIT_EINT8_23); // Enable EINT0,2 and the EINT8_23

INTMSK &= (~0x25);

return;

}

int Key_Scan( void )

{

int i;

for(i = 0; i < 1000 ;i++) ;

GPGDAT = (GPGDAT &(~((1<<6)|(1<<2)))) | (1<<6) | (0<<2) ; //GPG6,2 output 0

GPEDAT = (GPEDAT &(~((1<<13)|(1<<11)))) | (1<<13) | (1<<11) ; //GPE13,11 output 0

if( (GPFDAT&(1<< 0)) == 0 ) return 16 ;

else if( (GPFDAT&(1<< 2)) == 0 ) return 15 ;

else if( (GPGDAT&(1<< 3)) == 0 ) return 14 ;

else if( (GPGDAT&(1<<11)) == 0 ) return 13 ;

GPGDAT = (GPGDAT &(~((1<<6)|(1<<2)))) | (0<<6) | (1<<2) ; //GPG6,2 output 0

GPEDAT = (GPEDAT & (~((1<<13)|(1<<11)))) | (1<<13) | (1<<11) ; //GPE13,11 output 0

if( (GPFDAT&(1<< 0)) == 0 ) return 11 ;

else if( (GPFDAT&(1<< 2)) == 0 ) return 8 ;

else if( (GPGDAT&(1<< 3)) == 0 ) return 5 ;

else if( (GPGDAT&(1<<11)) == 0 ) return 2 ;

GPGDAT = (GPGDAT & (~((1<<6)|(1<<2)))) | (1<<6) | (1<<2) ; //GPG6,2 output 0

GPEDAT = (GPEDAT & (~((1<<13)|(1<<11)))) | (1<<13) | (0<<11) ; //GPE13,11 output 0

if( (GPFDAT&(1<< 0)) == 0 ) return 10 ;

else if( (GPFDAT&(1<< 2)) == 0 ) return 7 ;

else if( (GPGDAT&(1<< 3)) == 0 ) return 4 ;

else if( (GPGDAT&(1<<11)) == 0 ) return 1 ;

GPGDAT = (GPGDAT & (~((1<<6)|(1<<2)))) | (1<<6) | (1<<2) ; //GPG6,2 output 0

GPEDAT = (GPEDAT & (~((1<<13)|(1<<11)))) | (0<<13) | (1<<11) ; //GPE13,11 output 0

if( (GPFDAT&(1<< 0)) == 0 ) return 12 ;

else if( (GPFDAT&(1<< 2)) == 0 ) return 9 ;

else if( (GPGDAT&(1<< 3)) == 0 ) return 6 ;

else if( (GPGDAT&(1<<11)) == 0 ) return 3 ;

else return 0xff ;

}

void EINT_Handle( void ) {

GPGCON = (GPGCON & (~((3<<22)|(3<<6)))) | ((0<<22)|(0<<6)) ; //GPG11,3 set input

GPFCON = (GPFCON & (~((3<<4)|(3<<0)))) | ((0<<4)|(0<<0)) ; //GPF2, 0 set input

if(INTPND==BIT_EINT8_23) {

if(EINTPEND&(1<<11))

EINTPEND |= 1<< 11;

if(EINTPEND&(1<<19))

EINTPEND |= 1<< 19;

ClearPending(BIT_EINT8_23);

}

else if(INTPND==BIT_EINT0) {

ClearPending(BIT_EINT0);

} else if(INTPND==BIT_EINT2) {

ClearPending(BIT_EINT2);

}

int key = Key_Scan() ;

if( key != 0xff ) {

uart_printf( "K%d is pressed!\n", key ) ;

GPFDAT = ~(key << 4);

}

SET_KEY_INTERRUPT_REG();

return;

}

文件4:mems

@ 文件 mems

@ 作用:SDRAM 的初始化设置

@ 关于初始化的更多细节,请参考我的前一篇随笔

global memory_setup @ 导出 memory_setup, 使其对链接器可见

memory_setup:

mov r1, #0x48000000

adrl r2, mem_cfg_val

add r3, r1, #134

1:

@ write initial values to registers

ldr r4, [r2], #4

str r4, [r1], #4

cmp r1, r3

bne 1b

mov pc, lr

align 4

mem_cfg_val:

long 0x22111110 @ BWSCON

long 0x00000700 @ BANKCON0

long 0x00000700 @ BANKCON1

long 0x00000700 @ BANKCON2

long 0x00000700 @ BANKCON3

long 0x00000700 @ BANKCON4

long 0x00000700 @ BANKCON5

long 0x00018005 @ BANKCON6

long 0x00018005 @ BANKCON7 9bit

long 0x008e07a3 @ REFRESH

long 0x000000b2 @ BANKSIZE

long 0x00000030 @ MRSRB6

long 0x00000030 @ MRSRB7

文件5:nand_readc

/ 文件 nand_readc

作用:从 Nand Flash 中读取一块数据到 SDRAM 中的指定位置

/

#define NFCONF ((volatile unsigned long )0x4e000000)

#define NFCMD ((volatile unsigned long )0x4e000004)

#define NFADDR ((volatile unsigned long )0x4e000008)

#define NFDATA ((volatile unsigned long )0x4e00000c)

#define NFSTAT ((volatile unsigned long )0x4e000010)

#define NFECC ((volatile unsigned long )0x4e000014)

#define NAND_SECTOR_SIZE 512

#define NAND_BLOCK_MASK 0x1ff

void wait_idle() {

int i;

for (i = 0; i < 50000; ++i) ;

}

int nand_read(unsigned char buf, unsigned long start_addr, int size){

int i, j;

/

detect the argument

/

if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {

return -1;

}

/ chip Enable /

NFCONF &= ~0x800;

for (i=0; i<10; i++) {

;

}

for (i=start_addr; i < (start_addr + size); i+=NAND_SECTOR_SIZE) {

NFCMD = 0;

/ Write Address /

NFADDR = i & 0xff;

NFADDR = (i >> 9) & 0xff;

NFADDR = (i >> 17) & 0xff;

NFADDR = (i >> 25) & 0xff;

wait_idle();

for(j=0; j < NAND_SECTOR_SIZE; j++) {

buf++ = (NFDATA & 0xff);

}

}

NFCONF |= 0x800; / chip disable /

return 0;

}

文件6:sdramc

/ 文件 sdramc

作用:循环点 FS2410 开发板上的 D9、D10、D11、D12

四个发光二极管。

/

#define GPFCON ((volatile unsigned long )0x56000050)

#define GPFDAT ((volatile unsigned long )0x56000054)

int main()

{

int i,j;

while(1) {

for (i = 0; i <4; ++i) {

GPFCON = 0x1<<(8+i2);

GPFDAT = 0x0;

// for delay

for(j=0;j<50000;++j) ;

}

}

}

文件7:nandlds

SECTIONS {

first 0x00000000 : { heado memo flasho nand_reado }

second 0x30000000 : AT(4096) { sdramo }

}

文件8:Makefile

sdram:heads flashs mems sdramc

arm-linux-gcc -c -o heado heads

arm-linux-gcc -c -o memo mems

arm-linux-gcc -c -o flasho flashs

arm-linux-gcc -c -o nand_reado nand_readc

arm-linux-gcc -c -o sdramo sdramc

arm-linux-ld -Tnandlds heado memo flasho nand_reado sdramo -o sdram_tmpo

arm-linux-objcopy -O binary -S sdram_tmpo sdram

clean:

rm -f o

rm -f sdram

好了,你把这些文件拷下去,执行make命令就能生成可执行的二进制代码sdram,把sdram烧写到板子上就能运行了。祝你好运

1)

linux二进制可执行文件是无法得转换为代码的,所以修改不了代码,只能找源码去改,改完了重新交叉编译再写进开发板上。

2)

使用linux多线程问题,A中满足条件创建线程B,线程B中满足条件创建线程C,如果你线程A和B没有退出,A和B都会继续执行

实例程序如下:main中十秒后创建线程A ,A中10秒后创建B,B线程十秒后创建线程C,每个线程中都会有打印信息,当出现pthread A pthread B pthread C同时出现时,证明三个线程同时存活

此程序编译时需加-phread参数,例如:cc pthread_joinc -pthread

#include <stdioh>

#include <stdlibh>

#include <stringh>

#include <sys/typesh>

#include <pthreadh>

void A();//线程函数声明

void B();

void C();

void A()

{

pthread_t b;

int i = 0;

while(i < 50)

{

if (++i == 10)

pthread_create(&b, NULL, (void )B, NULL );//创建线程B

sleep(1);

printf("pthread A\n");

}

pthread_join(b, NULL);

return 0;

}

void B()

{

pthread_t c;

int i = 0;

while(i < 30)

{

if (++i == 10)

pthread_create(&c, NULL, (void )C, NULL );//创建线程C

printf("pthread B\n");

sleep(1);

}

pthread_join(c, NULL);

return 0;

}

void C()

{

int i = 0;

while(i < 10)//C线程执行10秒后退出,资源在B线程中pthread_join函数回收

{

printf("pthread C\n");

sleep(1);

i++;

}

return 0;

}

int main()

{

pthread_t a;

int i = 0;

while(i < 100)

{

if (++i == 10)

pthread_create(&a, NULL, (void )A, NULL );//创建线程A

printf("i = %d\n", i );

sleep(1);

}

pthread_join(a, NULL);

return 0;

}

以上是多线程程序的例子

但是,如果你想一个程序调用另一个程序时,你可以这样做:

比如你有三个可执行程序aout bout cout

运行aout当符合某个程序时使用system("/bout");调用程序bout,在bout程序中以同样的方法调用程序cout。但此时已经不是多线程了,而是三个不同的进程,进程aout bout 和cout

也可以在上面的程序中十秒的时候创建子进程后,在子进程中以system("/bout");来运行程序bout

ARM+LINUX路线,主攻嵌入式Linux *** 作系统及其上应用软件开发目标: (1) 掌握主流嵌入式微处理器的结构与原理(初步定为arm9) (2) 必须掌握一个嵌入式 *** 作系统 (初步定为uclinux或linux,版本待定) (3) 必须熟悉嵌入式软件开发流程并至少做一个嵌入式软件项目。 从事嵌入式软件开发的好处是: (1)目前国内外这方面的人都很稀缺。这一领域入门门槛较高,所以非专业IT人员很难切入这一领域;另一方面,是因为这一领域较新,目前发展太快,大多数人无条件接触。 (2)与企业计算等应用软件不同,嵌入式领域人才的工作强度通常低一些(但收入不低)。 (3)哪天若想创业,搞自已的产品,嵌入式不像应用软件那样容易被盗版。硬件设计一般都是请其它公司给订做(这叫“贴牌”:OEM),都是通用的硬件,我们只管设计软件就变成自己的产品了。 (4)兴趣所在,这是最主要的。 从事嵌入式软件开发的缺点是: (1)入门起点较高,所用到的技术往往都有一定难度,若软硬件基础不好,特别是 *** 作系统级软件功底不深,则可能不适于此行。 (2)这方面的企业数量要远少于企业计算类企业。 (3)有少数公司经常要硕士以上的人搞嵌入式,主要是基于嵌入式的难度。但大多数公司也并无此要求,只要有经验即可。 (4)平台依托强,换平台比较辛苦。 兴趣的由来: 1、成功观念不同,不虚度此生,就是我的成功。 2、喜欢思考,挑战逻辑思维。 3、喜欢C C是一种能发挥思维极限的语言。关于C的精神的一些方面可以被概述成短句如下: 相信程序员。 不要阻止程序员做那些需要去做的。 保持语言短小精干。 一种方法做一个 *** 作。 使得它运行的够快,尽管它并不能保证将是可移植的。 4、喜欢底层开发,讨厌vb类开发工具(并不是说vb不好)。 5、发展前景好,适合创业,不想自己要死了的时候还是一个工程师。 方法步骤: 1、基础知识: 目的:能看懂硬件工作原理,但重点在嵌入式软件,特别是 *** 作系统级软件,那将是我的优势。 科目:数字电路、计算机组成原理、嵌入式微处理器结构。 汇编语言、C/C++、编译原理、离散数学。 数据结构和算法、 *** 作系统、软件工程、网络、数据库。 方法:虽科目众多,但都是较简单的基础,且大部分已掌握。不一定全学,可根据需要选修。 主攻书籍:the c++ programming language(一直没时间读)、数据结构-C2。 2、学习linux: 目的:深入掌握linux系统。 方法:使用linux—〉linxu系统编程开发—〉驱动开发和分析linux内核。先看深,那主讲原理。看几遍后,看情景分析,对照深看,两本交叉,深是纲,情是目。剖析则是011版,适合学习。最后深入代码。 主攻书籍:linux内核完全剖析、unix环境高级编程、深入理解linux内核、情景分析和源代。 3、学习嵌入式linux: 目的:掌握嵌入式处理器其及系统。 方法:(1)嵌入式微处理器结构与应用:直接arm原理及汇编即可,不要重复x86。 (2)嵌入式 *** 作系统类:ucOS/II简单,开源,可供入门。而后深入研究uClinux。 (3)必须有块开发板(arm9以上),有条件可参加培训(进步快,能认识些朋友)。 主攻书籍:毛德 *** 的《嵌入式系统》及其他arm9手册与arm汇编指令等。 4、深入学习: A、数字图像压缩技术:主要是应掌握MPEG、mp3等编解码算法和技术。 B、通信协议及编程技术:TCP/IP协议、80211,Bluetooth,GPRS、GSM、CDMA等。 2010-8-21 16:46 回复 12290173 2楼C、网络与信息安全技术:如加密技术,数字证书CA等。 D、DSP技术:Digital Signal Process,DSP处理器通过硬件实现数字信号处理算法。 说明:太多细节未说明,可根据实际情况调整。重点在于1、3,不必完全按照顺序作。对于学习c++,理由是c++不只是一种语言,一种工具,她还是一种艺术,一种文化,一种哲学理念、但不是拿来炫耀得东西。对于linux内核,学习编程,读一些优秀代码也是有必要的。 注意: 要学会举一反多,有强大的基础,很多东西简单看看就能会。想成为合格的程序员,前提是必须熟练至少一种编程语言,并具有良好的逻辑思维。一定要理论结合实践。 不要一味钻研技术,虽然挤出时间是很难做到的,但还是要留点余地去完善其他的爱好,比如宇宙,素描、机械、管理,心理学、游戏、科幻**。还有一些不愿意做但必须要做的! 技术是通过编程编程在编程编出来的。永远不要梦想一步登天,不要做浮躁的人,不要觉得路途漫上。而是要编程编程在编程,完了在编程,在编程!等机会来了在创业(不要相信有奇迹发生,盲目创业很难成功,即便成功了发展空间也不一定很大)。 嵌入式书籍推荐 Linux基础 1、《Linux与Unix Shell 编程指南》 C语言基础 1、《C Primer Plus,5th Edition》美Stephen Prata着 2、《The C Programming Language, 2nd Edition》美Brian W Kernighan David M Rithie(K & R)着 3、《Advanced Programming in the UNIX Environment,2nd Edition》(APUE) 4、《嵌入式Linux应用程序开发详解》 Linux内核1、《深入理解Linux内核》(第三版) 2、《Linux内核源代码情景分析》毛德 *** 胡希明著 研发方向 1、《UNIX Network Programming》(UNP) 2、《TCP/IP详解》 3、《Linux内核编程》 4、《Linux设备驱动开发》(LDD) 5、《Linux高级程序设计》 杨宗德著硬件基础 1、《ARM体系结构与编程》杜春雷着 2、S3C2410 Datasheet 英语基础 1、《计算机与通信专业英语》 系统教程 1、《嵌入式系统――体系结构、编程与设计》 2、《嵌入式系统――采用公开源代码和StrongARM/Xscale处理器》毛德 *** 胡希明着 3、《Building Embedded Linux Systems》 4、《嵌入式ARM系统原理与实例开发》 杨宗德著理论基础 1、《算法导论》 2、《数据结构(C语言版)》 3、《计算机组织与体系结构性能分析》 4、《深入理解计算机系统》美Randal E Bryant David O''Hallaron着 5、《 *** 作系统:精髓与设计原理》 6、《编译原理》 7、《数据通信与计算机网络》 8、《数据压缩原理与应用》 C语言书籍推荐 1 The C programming language 《C程序设计语言》 2 Pointers on C 《C和指针》 3 C traps and pitfalls 《C陷阱与缺陷》 4 Expert C Lanuage 《专家C编程》 5 Writing Clean Code -----Microsoft Techiniques for Developing Bug-free C Programs 《编程精粹--Microsoft 编写优质无错C程序秘诀》 6 Programming Embedded Systems in C and C++ 《嵌入式系统编程》 7《C语言嵌入式系统编程修炼》 8《高质量C++/C编程指南》林锐 尽可能多的编码,要学好C,不能只注重C本身。算法,架构方式等都很重要。 这里很多书其实是推荐而已,不必太在意,关键还是基础,才是重中之重!!!

ARM嵌入式系统结构与编程(第2版) 目录第1章绪论11嵌入式系统定义111嵌入式系统发展历程112嵌入式系统的定义与特点12嵌入式 *** 作系统121嵌入式实时 *** 作系统122实时 *** 作系统的典型应用13嵌入式技术在工程领域的应用14嵌入式技术的发展趋势思考与练习题第2章ARM技术与ARM体系结构21ARM体系结构版本与内核211ARM体系结构版本212ARM内核版本命名规则213主流ARM处理器内核系列与应用22ARM内核模块23ARM处理器的工作模式24内部寄存器241通用寄存器及其分布242程序状态寄存器25ARM异常处理26存储方式与存储器映射机制27ARM流水线技术分析思考与练习题第3章ARM指令集寻址方式31ARM指令的编码格式32数据处理指令寻址方式33Load/Store指令寻址331地址计算方法332字、无符号字节寻址333半字、有符号字节寻址34批量Load/Store指令寻址方式35协处理器指令寻址方式思考与练习题第4章ARM指令集系统41数据处理指令411基本数据处理指令412乘法指令413杂类的数据处理指令42ARM分支指令43加载/存储指令431加载/存储字、无符号字节指令432半字、有符号字节访问指令44批量加载/存储指令441基本批量字数据加载/存储指令442用户模式下的批量字数据加载/存储指令443带PSR *** 作的批量字数据加载指令45交换指令46程序状态寄存器PSR访问指令47协处理器 *** 作指令471协处理器数据 *** 作指令472协处理器加载/存储指令473ARM寄存器与协处理器寄存器数据传输指令48异常产生指令思考与练习题第5章Thumb指令51Thumb数据处理指令511寄存器移位指令512低位寄存器算术运算指令513ALU *** 作指令514带高位寄存器 *** 作的Thumb指令515带SP/PC的算术运算指令52Thumb存储器 *** 作指令521字节、半字和字的加载/存储指令522批量加载/存储指令53Thumb分支指令531B分支指令532带链接的分支指令533带状态切换的分支指令54Thumb软中断指令55Thumb指令功能码段分析551Thumb与ARM实现功能比较552Thumb与ARM性能比较思考与练习题第6章ARM汇编伪指令与伪 *** 作61汇编语言伪指令611ARM汇编语言伪指令612Thumb汇编语言伪指令62ARM汇编语言伪 *** 作63ARM汇编伪 *** 作631符号定义伪 *** 作632数据定义伪 *** 作633汇编代码控制伪 *** 作634汇编信息报告控制伪 *** 作635指令集类型标识伪 *** 作636文件包含伪 *** 作637其他类型伪 *** 作64GNU ARM汇编伪 *** 作641符号定义伪 *** 作642数据定义伪 *** 作643汇编与反汇编代码控制伪 *** 作644预定义控制伪 *** 作思考与练习题第7章汇编语言程序设计71ARM编译环境下汇编语句711ARM编译环境下汇编语句格式712ARM编译环境下汇编语句中符号规则72GNU环境下汇编语句与编译说明721GNU环境下ARM汇编语句格式722GNU环境下ARM汇编程序编译73ARM汇编语言程序设计规范74ARM汇编语言程序设计实例解析思考与练习题第8章ARM汇编语言与嵌入式C混合编程81嵌入式C编程规范82嵌入式C程序设计中的位运算83嵌入式C程序设计中的几点说明831volatile限制符832地址强制转换与多级指针833预处理的使用84嵌入式C程序设计格式85过程调用标准ATPCS与AAPCS851寄存器使用规则852数据栈使用规则853参数传递规则86ARM汇编语言与嵌入式C混合编程861内嵌汇编862ARM汇编语言与嵌入式C程序相互调用思考与练习题第9章S3C44B0/S3C2410/S3C2440硬件结构与关键技术分析91处理器简介92S3C44B0/S3C2410/S3C2440存储控制器921S3C44B0存储控制与地址空间922S3C2410/S3C2440存储控制与地址空间923S3C44B0/S3C2410/S3C2440存储位宽控制924S3C44B0/S3C2410/S3C2440存储器接口时序分析925S3C44B0/S3C2410存储控制寄存器926SDRAM接口电路设计927S3C44B0存储器初始化实例93S3C2410/S3C2440 NAND Flash控制器94S3C44B0/S3C2410/S3C2440时钟电源管理941S3C44B0/S3C2410/S3C2440时钟管理942S3C44B0/S3C2410/S3C2440电源管理943S3C44B0/S3C2410/S3C2440时钟与电源管理专用寄存器95S3C44B0/S3C2410/S3C2440通用 I/O端口951端口控制描述952端口寄存器953通用I/O接口设计实例96S3C44B0/S3C2410/S3C2440中断机制961S3C44B0中断控制器962S3C2410/S3C2440中断控制器963S3C44B0/S3C2410/S3C2440中断控制特殊功能寄存器964S3C44B0/S3C2410/S3C2440中断控制器设计实例思考与练习题第10章S3C44B0/S3C2410/S3C2440通信与LCD接口技术101S3C44B0/S3C2410/S3C2440 UART1011UART原理1012S3C44B0/S3C2410/S3C2440 UART模块1013S3C44B0/S3C2410/S3C2440 UART *** 作1014UART中断与波特率的计算1015S3C44B0/S3C2410/S3C2440 UART专用功能寄存器1016S3C44B0/S3C2410 UART设计实例102S3C44B0/S3C2410/S3C2440 I2C总线接口1021I2C总线原理1022S3C44B0/S3C2410/S3C2440 I2C总线功能模块1023S3C44B0/S3C2410/S3C2440 I2C总线 *** 作1024S3C44B0/S3C2410/S3C2440 I2C专用功能寄存器1025S3C44B0/S3C2410/S3C2440 I2C总线设计实例103S3C44B0/S3C2410/S3C2440 LCD控制器1031LCD简介1032S3C44B0/S3C2410/S3C2440 LCD控制器模块1033S3C44B0/S3C2410/S3C2440 LCD控制器专用功能寄存器1034S3C44B0/S3C2410/S3C2440 LCD控制器设计实例思考与练习题附录AS3C44B0/S3C2410/S3C2440封装与I/O复用信息附录B链接定位与系统引导程序附录CARM嵌入式系统结构课程考核标准试题参考文献

(此目录为2013年7月更新的第2版)

以上就是关于甲骨文云arm实例有什么用全部的内容,包括:甲骨文云arm实例有什么用、arm 汇编高手进! 使用arm汇编指令 实现for循环结构、arm常用几个汇编语言的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9764221.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存