给出了最多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常用几个汇编语言的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)