海思lowlevel_init.S简单分析
2016-04-08 00:46
253 查看
@属性结构:[写寄存器则,前面加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
相关文章推荐
- Android中使用RadioButton实现QQ底部图片切换
- UIViewController中addChildViewController的作用
- 技术学习
- 快速排序
- eclipse 使用gradle构建系统时候报错
- TortoiseSVN中分支和合并实践【转】
- php的tips(接口结束符问题)
- Java 日历的制作 心得 写给自己
- java基础-----2016.4.8
- 求str最长回文子序列是求这个原字符串和它反转字符串的最长公共子序列。
- MySql主从数据库和读写分离简单剖析
- 注册cell可重用单元格注意事项
- Microsoft Build 2016 有关微软公有云Azure
- Linux环境下多进程和多线程的优缺点
- 海康SDK-javademo实现
- 计步器
- 第七十七天
- 一个.Net程序员关于学习的思考顺带思考人生
- MySql状态查看
- 【ios开发学习】UILabel添加点击事件