海思lowlevel_init.S简单分析

	@属性结构:[写寄存器则,前面加8个0]0b0xxxx0000xxxx101[读寄存器则,后面补8个0]
	.text
	.align	2
	.global	init_registers
	.type	init_registers, %function
init_registers:
	@ args = 0, pretend = 0, frame = 0
	@ frame_needed = 0, uses_anonymous_args = 0
	@ link register save eliminated.
	ldr	r2, [r0, #0]
	cmp	r2, #0
	mov	r6, #1
	bne	.L43 @寄存器地址不为0,则跳转到 .L43
.L2:
	ldr	r3, [r0, #4]
	cmp	r3, #0
	bne	.L43
	ldr	r3, [r0, #8]
	cmp	r3, #0
	ldrne	ip, [r0, #12]
	bne	.L3
	ldr	ip, [r0, #12]
	cmp	ip, #0
	beq	.L6 @所有值(4个)均为0时,退出函数,否则(至少有一个不为0)则跳到.L3
.L3:
	cmp	r1, #0
	beq	.L7 @绝对跳转到 .L7
.L45:
	tst	ip, #2
	beq	.L8
	and	r4, ip, #248
	mov	r4, r4, lsr #3
	add	r4, r4, #1
	cmp	r4, #32
	movne	r4, r6, asl r4
	andne	ip, ip, #63488
	ldr	r5, [r2, #0]
	movne	ip, ip, lsr #11
	subne	r4, r4, #1
	bicne	r5, r5, r4, asl ip
	ldrne	r4, [r0, #4]
	ldreq	ip, [r0, #4]
	orrne	ip, r5, r4, asl ip
	cmp	r3, #0
	str	ip, [r2, #0]
	beq	.L11
.L29:
@ 38 "lowlevel_init.c" 1
	nop
@ 0 "" 2
	subs	r3, r3, #1
	bne	.L29
.L11:
	add	r0, r0, #16 @下一个“块”,4个字    “一个轮回的开始”
.L46:
	ldr	r2, [r0, #0]
	cmp	r2, #0
	beq	.L2 @寄存器地址为0,跳转到.L2继续检查,其余3个变量是否为0
	@否则,循环之前的操作
.L43:
	cmp	r1, #0 @r1恒为0
	ldr	r3, [r0, #8] @ r3为delay值
	ldr	ip, [r0, #12] @ ip为Attr值
	bne	.L45 @不会执行

@4个数值有一个有值都会到这里来处理
@ r2位寄存器地址
.L7:
	tst	ip, #4 @对寄存器进行写操作,同时执行需要正常启动时该位是1,其余情况为0,因为前3位是指代excel里面的Y和N这两项,即执行时需要的条件
	beq	.L18 @如果此位为0,查下是否为对寄存器进行读操作
@以下是写操作做的工作(若不为31位操作,对,start-1号位置开始置(bits+1)个1)
	and	r4, ip, #248 @ r4 = ip&0xF8;提取属性参数里关于“bit to be writed or readed”或者“start bit to be writed or readed”这两项参数
	mov	r4, r4, lsr #3 @逻辑右移,即,提取“bit to be writed or readed”
	add	r4, r4, #1
	cmp	r4, #32 @要写的位是否为31个
	movne	r4, r6, asl r4 @r6 一直为1,若不是31位时,r4 = 1<<(1+bits);
	andne	ip, ip, #63488 @0xF800
	ldr	r5, [r2, #0] @r5为此时寄存器的值
	movne	ip, ip, lsr #11 @若不是31位时,通过右移提取到“start bit to be writed or readed”值
	subne	r4, r4, #1 @此时r4二进制包含(1+bits)个“1”
	bicne	r5, r5, r4, asl ip @若不是31位时,从“start”处开始清零(1+bits)个位,!!!!!!!感觉这句多此一举
	ldrne	r4, [r0, #4] @若不是31位时,r4为需要写入的值
	ldreq	ip, [r0, #4] @要写31位时,将需要写入的值,写到ip中,(譬如excel表中的C7区域的值)
	orrne	ip, r5, r4, asl ip @若不是31位时,从“start”处开始置一(1+bits)个位
	cmp	r3, #0
@***************************修改寄存器的值***********************************
	str	ip, [r2, #0]
	beq	.L11 @不延时,直接指向下一块,继续运行
	@若只修改某几位的话就先延时,再指向下一块
	
@。。。。。。。。。。。。。延时函数。。。。。。。。。。。。
.L32:
@ 38 "lowlevel_init.c" 1
	nop
@ 0 "" 2
	subs	r3, r3, #1
	bne	.L32
@。。。。。。。。。。。。。延时函数。。。。。。。。。。。。

	add	r0, r0, #16
	b	.L46
.L8:
	tst	ip, #131072 
	bne	.L13
	cmp	r3, #0
	beq	.L11
.L31:
@ 38 "lowlevel_init.c" 1
	nop
@ 0 "" 2
	subs	r3, r3, #1
	bne	.L31
	add	r0, r0, #16
	b	.L46
.L18:
	tst	ip, #262144 @ip & 0x40000
	bne	.L22 @此位为1,代表对寄存器进行读操作,且执行需要正常启动
	
	否则,此位为0代表,对寄存器写,同时,执行不需要正常启动,,以下代码是,直接将指针指到下一块,对后续的寄存器进行操作
	cmp	r3, #0
	beq	.L11
	
@。。。。。。。。。。。延时函数。。。。。。。。。。。。。
.L34:
@ 38 "lowlevel_init.c" 1
	nop
@ 0 "" 2
	subs	r3, r3, #1
	bne	.L34
	@。。。。。。。。。。。延时函数。。。。。。。。。。。。。
	
	add	r0, r0, #16 @延时后再将指针指到下一块,跳转到.L46
	b	.L46
.L13:
	and	r4, ip, #16252928
	mov	r4, r4, lsr #19
	add	r4, r4, #1
	mov	r7, r6, asl r4
	ldr	r5, [r0, #4]
	mov	r8, ip, lsr #27
	sub	r7, r7, #1
.L16:
	ldr	ip, [r2, #0]
	cmp	r4, #32
	andne	ip, r7, ip, lsr r8
@ 38 "lowlevel_init.c" 1
	nop
@ 0 "" 2
	cmp	r5, ip
	bne	.L16
	cmp	r3, #0
	beq	.L11
.L30:
@ 38 "lowlevel_init.c" 1
	nop
@ 0 "" 2
	subs	r3, r3, #1
	bne	.L30
	add	r0, r0, #16
	b	.L46

@读操作所做的工作
.L22:
	and	r4, ip, #16252928
	mov	r4, r4, lsr #19
	add	r4, r4, #1
	mov	r8, r6, asl r4
	ldr	r5, [r0, #4]
	sub	r8, r8, #1
	mov	r7, ip, lsr #27
.L25:
	ldr	ip, [r2, #0]
	cmp	r4, #32
	andne	ip, r8, ip, lsr r7
@ 38 "lowlevel_init.c" 1
	nop
@ 0 "" 2
	cmp	r5, ip
	bne	.L25
	
@延时为0,则直接下一块的操作
	cmp	r3, #0
	beq	.L11
	
@。。。。。。。延时函数。。。。。。。。。。
.L33:
@ 38 "lowlevel_init.c" 1
	nop
@ 0 "" 2
	subs	r3, r3, #1
	bne	.L33
@。。。。。。。延时函数。。。。。。。。。。

	add	r0, r0, #16
	b	.L46 @延时后再指向下一块单元,操作
	
@.L6是退出函数
.L6:
@ 38 "lowlevel_init.c" 1
	nop
@ 0 "" 2
	bx	lr

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值