OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » C6713的boot汇编代指令理解问题:

共11条 1/2 1 2 跳转至

C6713的boot汇编代指令理解问题:

助工
2014-10-30 23:16:07    评分
C6713的boot汇编代指令理解问题:

1、如下两行代码取自TI的二级bootloader程序。觉得不好理解。大家看看我的中文注释的对吗???

[ b0]  b     copy_loop     ;   如果b不为0跳到copy_loop????????
[!b0]  b     copy_section_top     ;如果b为0跳到copy_section_top???????

2、以下为完整的bootloader拷贝功能代码,代码应该没问题,总觉得这两条指令放的位置不对,还没开始
复制怎么就跳转了???






;****************************************************************************
; copy sections
;****************************************************************************
        mvkl  copyTable, a3 ; load table pointer装载表的首地址
        mvkh  copyTable, a3

        
copy_section_top:
        ldw   *a3++, b0     ; byte count 装载字节数到b0寄存器
        ldw   *a3++, b4     ; load flash start (load) address 装源地址到b4寄存器
        ldw   *a3++, a4     ; ram start address  装目的地址到a4寄存器
        nop   2             

[!b0]  b copy_done         ; have we copied all sections?  如果b0寄存器值0为则跳到完成处
        nop   5

copy_loop:
        ldb   *b4++,b5      ;从源地址装载一字节数据到b5寄存器
        sub   b0,1,b0       ; decrement counter  字节数减一
[ b0]  b     copy_loop     ; setup branch if not done  如果b不为0跳到copy_loop????????
[!b0]  b     copy_section_top     ;如果b为0跳到copy_section_top???????
        zero  a1
[!b0]  and   3,a3,a1
        stb   b5,*a4++    ;开始复制???
[!b0]  and   -4,a3,a5      ; round address up to next multiple of 4
[ a1]  add   4,a5,a3       ; round address up to next multiple of 4

;****************************************************************************
; jump to entry point
;****************************************************************************
copy_done:
                mvkl .S2 _c_int00, B0
        mvkh .S2 _c_int00, B0
        b    .S2 B0
        nop   5

copyTable: 
        
                        ; count
                        ; flash start (load) address 
                        ; ram start (run) address
         
                    ;; .text
                    .word _text_size
                    .word _text_ld_start
                    .word _text_rn_start
    
                                      
                    ;; end of table
                    .word 0
                    .word 0
                    .word 0

高工
2014-10-31 21:56:52    评分
2楼
没研究过这个。研究中。。。

高工
2014-11-01 13:26:15    评分
3楼
 [ b0] b copy_loop //如果该段copy没有完成,则再次执行copy_loop ,相当于循环

 [!b0] b copy_section_top //该段转移完毕,跳转转移下一段 

整个二级bootload代码的功能是:

对EMIF进行初始化(你的程序貌没有全部贴出来),然后在copy_section_top中读取用户程序的段信息(段的Flash加载地址,段的RAM运行地址以及段的长度),在copy_loop中执行循环拷贝操作;执行完了才是jump


助工
2014-11-01 21:46:19    评分
4楼

paradoxfx  程序中的20,21行是不是应该放到 27行去啊??应为开始复制的代码是在24行啊,很困惑

 

 

1 ;****************************************************************************
2 ; copy sections
3 ;****************************************************************************
4        mvkl  copyTable, a3 ; load table pointer装载表的首地址
5        mvkh  copyTable, a3
6
7       
8   copy_section_top:
9         ldw   *a3++, b0     ; byte count 装载字节数到b0寄存器
10        ldw   *a3++, b4     ; load flash start (load) address 装载源地址到b4寄存器
11        ldw   *a3++, a4     ; ram start address  装载目的地址到a4寄存器
12        nop   2            
13
14 [!b0]  b copy_done         ; have we copied all sections?  如果b0寄存器值0为则跳到完成处
15        nop   5
16
17 copy_loop:
18        ldb   *b4++,b5      ;从源地址装载一字节数据到b5寄存器
19        sub   b0,1,b0       ; decrement counter  字节数减一
20 [ b0]  b     copy_loop     ; setup branch if not done  如果b不为0跳到copy_loop????????
21 [!b0]  b     copy_section_top     ;如果b为0跳到copy_section_top???????
22        zero  a1
23 [!b0]  and   3,a3,a1
24        stb   b5,*a4++    ;开始复制???
25 [!b0]  and   -4,a3,a5      ; round address up to next multiple of 4
26 [ a1]  add   4,a5,a3       ; round address up to next multiple of 4
27
28 ;****************************************************************************
29 ; jump to entry point
30 ;****************************************************************************
31 copy_done:
32        mvkl .S2 _c_int00, B0
33        mvkh .S2 _c_int00, B0
34        b    .S2 B0
35        nop   5
36
37 copyTable:
38       
39                        ; count
40                        ; flash start (load) address
41                        ; ram start (run) address
42        
41                    ;; .text
44                    .word _text_size
45                    .word _text_ld_start
46                    .word _text_rn_start
47   
48                                     
49                    ;; end of table
50                    .word 0
51                    .word 0
52                    .word 0

 

 

 

 

 


高工
2014-11-02 11:46:31    评分
5楼
stb b5,*a4++ ; 的意思是以及复制完了一段,然后保存到RAM。
很详细的解释你可以参考官方文档:
spra999a.pdf 

助工
2014-11-02 19:28:26    评分
6楼

官方文档也看了啊,不理解的是程序运行到了20行后,它是跳到了17行吗??我也用模拟器仿真了这段代码,他运行到20行后,后一直往下运行,到了25行才跳转到17行copy_loop ,可在25行根本就没有跳转指令啊,dsp的指令真坑爹啊..........


高工
2014-11-02 20:55:50    评分
7楼
运行到20行的情况下,只有在该段copy没有完成的情况下,才会再次执行copy_loop ,就是说会跳回17行的,多调试运行几遍看看..

助工
2014-11-03 20:51:21    评分
8楼
15行 为何是一个加了一个nop 5指令?去掉不行吗,或者用nop 3,nop 2 又有何不可???这个5 从何而来???

高工
2014-11-03 20:59:50    评分
9楼

加NOP是为了避免流水线冲突,具体的用法比如加几个这个在汇编指令集里一般会有详细讲解

如果用C编程的话,编译器也会自动加入相关的NOP的


助工
2014-11-03 21:46:56    评分
10楼

如下两条指令放在    sub   b0,1,b0 之后而没放在[ a1]  add   4,a5,a3指令之后是不是也和流水线有关??  一条条件跳转指令未执行,还占用指令周期吗?


20 [ b0]  b     copy_loop     ; setup branch if not done  如果b不为0跳到copy_loop????????

21 [!b0]  b     copy_section_top     ;如果b为0跳到copy_section_top???????

共11条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]