本文主要介绍C6455的二级boot的启动程序,参考文档为:

  • SPRUEC6G - TMS320C645x/C647x DSP Bootloader User’s Guide
  • SPRU732J - TMS320C64x/C64x+ DSP CPU and Instruction Set Reference Guide
  • SPRU186W - TMS320C6000 Assembly Language Tools v7.4 User’s Guide
  • SPRA999A1 - Creating a Second-Level Bootloader for FLASH Bootloading on TMS320C6000 Platform With Code Composer Studio

  之前没有注意一个问题,就是CCS的版本还有一个限制,我们用的仿真器是seed-xds560v2,它的文档里说明了,最高只支持CCS v6,所以我现在又换回了CCS v6.2.0的版本。

  上面是一个小插曲,下面进入正题。

  SPRUEC6G能够获取的有用信息并不多。启动模式由BOOTMODE[3:0]这几个引脚的复位时的状态决定。C6455内部有一块ROM存放了bootloader程序,会根据所配置的启动模式开启所需要的外设。这些外设在bootloader中的启用后,即使退出bootloader程序,它们也还是会保持启用的状态。然后它关于从EMIF启动的介绍也很少,只有说直接运行外部存储器中的代码。这个实际上的意思是,这个就要求接在CE3上的Flash要能够支持片上执行,只有NOR Flash可以,而NAND Flash做不到这一点。然后第6章,创建启动镜像也没有介绍从EMIF启动相关的内容,从I2C或者EMAC启动的话没有直接可以执行代码的条件,所以需要用到Boot Parameter Table、Boot Config Table。但如果直接从EMIF启动,就可以直接用汇编指令写启动代码,所以这部分内容暂时也没有参考价值。
  EMIF的二级Bootloader主要参考SPRA999A1这个文档。但这个文档也只能是参考,它并没有介绍C64x+架构的DSP的启动,而只是有C64x架构的相关介绍,所以文档中的和C6455的实际情况也有点出入。而且文档中大部分介绍的是带BIOS系统的二级启动,与我们现在刚开始的裸核程序也有一点区别。
  因为没有找到更多的和C6455的Boot相关的文档,而C64x架构的DSP内部ROM的第一级bootloader会先把外部存储器中的前1k地址空间的代码搬运到内部的address 0处开始运行,所以我们也可以认为C6455是先运行外部存储器中前1k地址空间内的代码,我们要做的就是把一段启动代码放到这1k地址空间中。这一段启动代码只能靠汇编编写,因为这时候C语言环境还没有建立。利用这段代码,我们将代码的主体部分搬运到L2空间,这样就让那些代码段的实际位置和run address吻合了。在退出bootloaer之后,程序进入“_c_int00”的程序入口,建立C语言环境,再进入main函数,开始执行主程序。
  SPRA999A1中的2.3节介绍了“Writing the Secondary Bootloader”,这里给的示例代码先对EMIF进行初始化,再根据boot table的格式搬运代码。因为C6455在配置为从EMIF启动后,EMIF已经由内部ROM初始化,所以我们不再需要对EMIF进行初始化。所以只需要后面那些“copy section”的部分。

       .list.title  "Flash bootup utility for 6455 dsk".option D,T.length 102.width  140COPY_TABLE    .equ    0xb0000400.sect ".boot_load".global _boot
_boot:
;************************************************************************
;* Debug Loop -  Comment out B for Normal Operation
;************************************************************************zero B1
_myloop:  ; [!B1] B _myloop  nop  5
_myloopend: nop;****************************************************************************
;* Copy code sections
;****************************************************************************mvkl  COPY_TABLE, a3   ; load table pointermvkh  COPY_TABLE, a3ldw   *a3++, b1        ; Load entry pointcopy_section_top:ldw   *a3++, b0        ; byte count ldw   *a3++, a4        ; ram start addressnop   3[!b0]  b copy_done            ; have we copied all sections?nop   5copy_loop:ldb   *a3++,b5sub   b0,1,b0          ; decrement counter
[ b0]  b     copy_loop        ; setup branch if not done
[!b0]  b     copy_section_topzero  a1
[!b0]  and   3,a3,a1stb   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:b    .S2 b1nop   5

  整个boot.asm的代码如上所示,代码不长,功能也很简单。
  要看懂这部分代码可以查阅SPRU732J的第三章,这一章专门介绍了指令集,3.11节有对所有指令的介绍。如果搜索不方便,可以在附录A,Instruction Compatibility中通过首字母索引的方式找到某个指令,并通过超链接跳转到详细介绍的页面。这些指令除了注意它的功能以外,还需要注意它的delay slot,可以通过它提供的例子比较好地理解。
  还有一些指令是汇编器的指令(Assembler Directives),就是以一个“.”开始的指令,比如上面的“.title”、“.option”之类的指令,可以在SPRU186W的第四章找到相关的说明。
  有一个非常建议的设置,就是可以打开“–asm_listing”的选项,这样在编译之后就会得到一个和源文件名称相同,后缀为“.lst”的list文件,好像是一个源文件对应一个lst文件。比如这里的这段启动代码,它的文件名是“boot.asm”,文件中加入了“.list”指令,然后如果也按照下面的流程进行了设置,在编译后就可以在Debug目录下得到一个“boot.lst”文件,里面是汇编器汇编后得到的机器码。这个文件在后面比对我们生成的boot table时非常有用。

#mermaid-svg-cdUG9JhmPxObAhps .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-cdUG9JhmPxObAhps .label text{fill:#333}#mermaid-svg-cdUG9JhmPxObAhps .node rect,#mermaid-svg-cdUG9JhmPxObAhps .node circle,#mermaid-svg-cdUG9JhmPxObAhps .node ellipse,#mermaid-svg-cdUG9JhmPxObAhps .node polygon,#mermaid-svg-cdUG9JhmPxObAhps .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-cdUG9JhmPxObAhps .node .label{text-align:center;fill:#333}#mermaid-svg-cdUG9JhmPxObAhps .node.clickable{cursor:pointer}#mermaid-svg-cdUG9JhmPxObAhps .arrowheadPath{fill:#333}#mermaid-svg-cdUG9JhmPxObAhps .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-cdUG9JhmPxObAhps .flowchart-link{stroke:#333;fill:none}#mermaid-svg-cdUG9JhmPxObAhps .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-cdUG9JhmPxObAhps .edgeLabel rect{opacity:0.9}#mermaid-svg-cdUG9JhmPxObAhps .edgeLabel span{color:#333}#mermaid-svg-cdUG9JhmPxObAhps .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-cdUG9JhmPxObAhps .cluster text{fill:#333}#mermaid-svg-cdUG9JhmPxObAhps div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-cdUG9JhmPxObAhps .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-cdUG9JhmPxObAhps text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-cdUG9JhmPxObAhps .actor-line{stroke:grey}#mermaid-svg-cdUG9JhmPxObAhps .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-cdUG9JhmPxObAhps .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-cdUG9JhmPxObAhps #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-cdUG9JhmPxObAhps .sequenceNumber{fill:#fff}#mermaid-svg-cdUG9JhmPxObAhps #sequencenumber{fill:#333}#mermaid-svg-cdUG9JhmPxObAhps #crosshead path{fill:#333;stroke:#333}#mermaid-svg-cdUG9JhmPxObAhps .messageText{fill:#333;stroke:#333}#mermaid-svg-cdUG9JhmPxObAhps .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-cdUG9JhmPxObAhps .labelText,#mermaid-svg-cdUG9JhmPxObAhps .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-cdUG9JhmPxObAhps .loopText,#mermaid-svg-cdUG9JhmPxObAhps .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-cdUG9JhmPxObAhps .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-cdUG9JhmPxObAhps .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-cdUG9JhmPxObAhps .noteText,#mermaid-svg-cdUG9JhmPxObAhps .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-cdUG9JhmPxObAhps .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-cdUG9JhmPxObAhps .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-cdUG9JhmPxObAhps .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-cdUG9JhmPxObAhps .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cdUG9JhmPxObAhps .section{stroke:none;opacity:0.2}#mermaid-svg-cdUG9JhmPxObAhps .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-cdUG9JhmPxObAhps .section2{fill:#fff400}#mermaid-svg-cdUG9JhmPxObAhps .section1,#mermaid-svg-cdUG9JhmPxObAhps .section3{fill:#fff;opacity:0.2}#mermaid-svg-cdUG9JhmPxObAhps .sectionTitle0{fill:#333}#mermaid-svg-cdUG9JhmPxObAhps .sectionTitle1{fill:#333}#mermaid-svg-cdUG9JhmPxObAhps .sectionTitle2{fill:#333}#mermaid-svg-cdUG9JhmPxObAhps .sectionTitle3{fill:#333}#mermaid-svg-cdUG9JhmPxObAhps .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cdUG9JhmPxObAhps .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-cdUG9JhmPxObAhps .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cdUG9JhmPxObAhps .grid path{stroke-width:0}#mermaid-svg-cdUG9JhmPxObAhps .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-cdUG9JhmPxObAhps .task{stroke-width:2}#mermaid-svg-cdUG9JhmPxObAhps .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cdUG9JhmPxObAhps .taskText:not([font-size]){font-size:11px}#mermaid-svg-cdUG9JhmPxObAhps .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cdUG9JhmPxObAhps .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-cdUG9JhmPxObAhps .task.clickable{cursor:pointer}#mermaid-svg-cdUG9JhmPxObAhps .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-cdUG9JhmPxObAhps .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-cdUG9JhmPxObAhps .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-cdUG9JhmPxObAhps .taskText0,#mermaid-svg-cdUG9JhmPxObAhps .taskText1,#mermaid-svg-cdUG9JhmPxObAhps .taskText2,#mermaid-svg-cdUG9JhmPxObAhps .taskText3{fill:#fff}#mermaid-svg-cdUG9JhmPxObAhps .task0,#mermaid-svg-cdUG9JhmPxObAhps .task1,#mermaid-svg-cdUG9JhmPxObAhps .task2,#mermaid-svg-cdUG9JhmPxObAhps .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-cdUG9JhmPxObAhps .taskTextOutside0,#mermaid-svg-cdUG9JhmPxObAhps .taskTextOutside2{fill:#000}#mermaid-svg-cdUG9JhmPxObAhps .taskTextOutside1,#mermaid-svg-cdUG9JhmPxObAhps .taskTextOutside3{fill:#000}#mermaid-svg-cdUG9JhmPxObAhps .active0,#mermaid-svg-cdUG9JhmPxObAhps .active1,#mermaid-svg-cdUG9JhmPxObAhps .active2,#mermaid-svg-cdUG9JhmPxObAhps .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-cdUG9JhmPxObAhps .activeText0,#mermaid-svg-cdUG9JhmPxObAhps .activeText1,#mermaid-svg-cdUG9JhmPxObAhps .activeText2,#mermaid-svg-cdUG9JhmPxObAhps .activeText3{fill:#000 !important}#mermaid-svg-cdUG9JhmPxObAhps .done0,#mermaid-svg-cdUG9JhmPxObAhps .done1,#mermaid-svg-cdUG9JhmPxObAhps .done2,#mermaid-svg-cdUG9JhmPxObAhps .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-cdUG9JhmPxObAhps .doneText0,#mermaid-svg-cdUG9JhmPxObAhps .doneText1,#mermaid-svg-cdUG9JhmPxObAhps .doneText2,#mermaid-svg-cdUG9JhmPxObAhps .doneText3{fill:#000 !important}#mermaid-svg-cdUG9JhmPxObAhps .crit0,#mermaid-svg-cdUG9JhmPxObAhps .crit1,#mermaid-svg-cdUG9JhmPxObAhps .crit2,#mermaid-svg-cdUG9JhmPxObAhps .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-cdUG9JhmPxObAhps .activeCrit0,#mermaid-svg-cdUG9JhmPxObAhps .activeCrit1,#mermaid-svg-cdUG9JhmPxObAhps .activeCrit2,#mermaid-svg-cdUG9JhmPxObAhps .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-cdUG9JhmPxObAhps .doneCrit0,#mermaid-svg-cdUG9JhmPxObAhps .doneCrit1,#mermaid-svg-cdUG9JhmPxObAhps .doneCrit2,#mermaid-svg-cdUG9JhmPxObAhps .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-cdUG9JhmPxObAhps .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-cdUG9JhmPxObAhps .milestoneText{font-style:italic}#mermaid-svg-cdUG9JhmPxObAhps .doneCritText0,#mermaid-svg-cdUG9JhmPxObAhps .doneCritText1,#mermaid-svg-cdUG9JhmPxObAhps .doneCritText2,#mermaid-svg-cdUG9JhmPxObAhps .doneCritText3{fill:#000 !important}#mermaid-svg-cdUG9JhmPxObAhps .activeCritText0,#mermaid-svg-cdUG9JhmPxObAhps .activeCritText1,#mermaid-svg-cdUG9JhmPxObAhps .activeCritText2,#mermaid-svg-cdUG9JhmPxObAhps .activeCritText3{fill:#000 !important}#mermaid-svg-cdUG9JhmPxObAhps .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cdUG9JhmPxObAhps g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-cdUG9JhmPxObAhps g.classGroup text .title{font-weight:bolder}#mermaid-svg-cdUG9JhmPxObAhps g.clickable{cursor:pointer}#mermaid-svg-cdUG9JhmPxObAhps g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-cdUG9JhmPxObAhps g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-cdUG9JhmPxObAhps .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-cdUG9JhmPxObAhps .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-cdUG9JhmPxObAhps .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-cdUG9JhmPxObAhps .dashed-line{stroke-dasharray:3}#mermaid-svg-cdUG9JhmPxObAhps #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-cdUG9JhmPxObAhps #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-cdUG9JhmPxObAhps #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-cdUG9JhmPxObAhps #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-cdUG9JhmPxObAhps #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-cdUG9JhmPxObAhps #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-cdUG9JhmPxObAhps #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-cdUG9JhmPxObAhps #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-cdUG9JhmPxObAhps .commit-id,#mermaid-svg-cdUG9JhmPxObAhps .commit-msg,#mermaid-svg-cdUG9JhmPxObAhps .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cdUG9JhmPxObAhps .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cdUG9JhmPxObAhps .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cdUG9JhmPxObAhps g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cdUG9JhmPxObAhps g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-cdUG9JhmPxObAhps g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-cdUG9JhmPxObAhps g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-cdUG9JhmPxObAhps g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-cdUG9JhmPxObAhps g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-cdUG9JhmPxObAhps .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-cdUG9JhmPxObAhps .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-cdUG9JhmPxObAhps .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-cdUG9JhmPxObAhps .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-cdUG9JhmPxObAhps .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-cdUG9JhmPxObAhps .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-cdUG9JhmPxObAhps .edgeLabel text{fill:#333}#mermaid-svg-cdUG9JhmPxObAhps .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-cdUG9JhmPxObAhps .node circle.state-start{fill:black;stroke:black}#mermaid-svg-cdUG9JhmPxObAhps .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-cdUG9JhmPxObAhps #statediagram-barbEnd{fill:#9370db}#mermaid-svg-cdUG9JhmPxObAhps .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-cdUG9JhmPxObAhps .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-cdUG9JhmPxObAhps .statediagram-state .divider{stroke:#9370db}#mermaid-svg-cdUG9JhmPxObAhps .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-cdUG9JhmPxObAhps .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-cdUG9JhmPxObAhps .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-cdUG9JhmPxObAhps .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-cdUG9JhmPxObAhps .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-cdUG9JhmPxObAhps .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-cdUG9JhmPxObAhps .note-edge{stroke-dasharray:5}#mermaid-svg-cdUG9JhmPxObAhps .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-cdUG9JhmPxObAhps .error-icon{fill:#522}#mermaid-svg-cdUG9JhmPxObAhps .error-text{fill:#522;stroke:#522}#mermaid-svg-cdUG9JhmPxObAhps .edge-thickness-normal{stroke-width:2px}#mermaid-svg-cdUG9JhmPxObAhps .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-cdUG9JhmPxObAhps .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-cdUG9JhmPxObAhps .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-cdUG9JhmPxObAhps .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-cdUG9JhmPxObAhps .marker{fill:#333}#mermaid-svg-cdUG9JhmPxObAhps .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-cdUG9JhmPxObAhps {color: rgba(0, 0, 0, 0.75);font: ;}

CCS Build
C6000 Compiler
Advanced Options
勾选Generate listing file

  代码中的“.title”、“.option”、“.width”、“.length”都是和那个list文件相关的一些设置,没有很大作用,所以可以不用关心。

COPY_TABLE    .equ    0xb0000400

  指定了copy table 的首地址。具体的copy table是靠hex6x.exe这个工具生成的,主要在下一篇文章进行介绍。boot table 的格式在SPRUEC6G的6.2.2中介绍得比较详细。主要依次包括以下三个部分

  • 程序入口地址,在boot程序完成后,最后需要跳转的目的
  • 对于每个要COFF格式的section
    • section的字节数
    • 搬运的目的地址
    • 主体部分(代码或者数据)
  • 结束标识(0x00000000)

  “.sect”指定了这里的代码都是放在“.boot_load”这个段里。紧接着的“Debug Loop”明显是为了调试用的,对实际的功能没有影响。最后的“Jump to entry point”也很好理解,就是跳转到程序入口。所以主要就是“Copy code sections”中的内容。

ldw   *a3++, b1        ; Load entry point
ldw   *a3++, b0        ; byte count
ldw   *a3++, a4        ; ram start address
nop   3

  mvkh、mvkl指令将copy table的首地址赋给A3寄存器,A3相当于存储器访问的指针。B1寄存器存放了程序入口地址。B0寄存器存放的是某个section 的字节数,A4存放的是搬运某个section的目的首地址。代码中的nop指令都是为了满足ldw指令和跳转指令的delay slot需求才插入的。ldw指令的delay slot是4,跳转指令的delay slot是5。
  紧接着的是判断B0是否为0,若为0则跳转到copy done。也就是检测到copy table 的结束标识时就结束这里的循环。

  copy_loop:ldb   *a3++,b5sub   b0,1,b0          ; decrement counter[ b0]  b     copy_loop        ; setup branch if not done[!b0]  b     copy_section_topzero  a1[!b0]  and   3,a3,a1stb   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

  这里总共有内外两层循环,外层的是copy_section的循环,因为不只一个section需要copy;内层的是copy loop,是对每个字节的复制。
  我们可以分几种情况来讨论一下一上这段代码。ldb指令从外部存储器获取一个字节的数据存入B5寄存器中,这个需要再另外执行4条指令才能在B5寄存器中得到结果。sub指令是没有delay slot的,B0立即减一,然后对B0进行判断,如果B0不为零,那么接着继续在copy loop的小循环中;如果B0为零,就跳转到下一个section的copy。
  对于B0不为零的情况,从第4行依次向下数5条指令,可以发现程序会运行到第9行,但因为B0不为零,前面的带[!b0]的条件都不满足,所以对应的指令也就相当于是“nop”,这时只是用“stb”指令,完成复制一个字节的操作。
  对于B0为零的情况,从第5行依次向下数5条指令,可以发现程序会运行到第10行,而且前面的[!b0]条件都满足,对应指令也都会执行。这里的and指令的第一个操作数是有符号立即数,会进行符号位扩展,相当于检测每个section的大小是否是4字节的整数倍。这个在SPRUEC6G的6.2.2.3中的第8点也有体现。原文是这样的:

Correct any sections that are not multiples of 32 bits. The C compiler always generates sections whose lengths are multiples of 32 bits. This may not be the case for any sections declared in assembly. For little endian systems, the byte order must be swapped for these remaining bytes.

  所以这部分程序就是依次将boot table中的代码和数据逐字节地依次复制到了指定的位置,也就完成了boot loader的基本功能。
  今天写这个的时候又想到了一个问题,就是这个我们写的这部分加入到原本的整个工程中之后。其实这部分代码只运行一次,而且它是直接在外部存储器中运行的,所以它并不会在L2上。虽然我们在链接的cmd文件中将它分配到L2中,但实际运行起来的时候,L2的那部分空间并没有这些代码,所以是有这么1k的地址空间被浪费了。包括在仿真调试的时候,我们用仿真器将代码放到L2上,虽然这时候L2上的那段空间是有这部分启动代码的,但这部分代码永远也不会被执行,所以这1k的地址空间也是浪费了的。那么有没有什么办法再把这部分空间利用起来呢?好像在链接cmd文件的SECTION那部分有介绍用UNION声明来讲不同的段放到同一地址空间,不过现在还没到纠结那1k空间的地步,先就只在这里挖个坑。

TMS320C6455入门实践(六)——编写boot程序相关推荐

  1. TMS320C6455入门实践(三)——PLL相关

    目录 PLL1和PLL1控制器 PLL2和PLL2控制器 CSL的使用 本文主要介绍TMS320C6455的时钟相关的内容,参考文档为: SPRS276M - TMS320C6455 Fixed-Po ...

  2. (转)Inno Setup入门(六)——在程序目录下创建文件夹

    本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17250789 创建文件夹可以使用[dirs]段实现,代码如下: [s ...

  3. STM32_基础入门(六)_程序调试

    持续关注阿杰在线更新保姆式笔记~~坚持日更 参考资料 <STM32F1开发指南-库函数版本>3.4小节和6.4小节 <STM32中文参考手册V10>29章 目录 一.前言 二. ...

  4. android ndk 界面开发教程,AndroidStudio NDK开发最佳入门实践

    AndroidStudio NDK开发最佳入门实践 网上一些介绍AndroidStudio NDK入门的教程,感觉都不是很完整和全面,也没有告诉初学AndroidStudio NDK的同学们一些需要注 ...

  5. 从入门到入土:[linux实践]-pam|编写基于libpam的用户认证程序|编写基于PAM认证的应用程序|详细说明|实验步骤|实验截图

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 编写基于libpam的用户认证程序|编写基于PAM认证的应用 ...

  6. 明解C语言入门篇_第8章_动手编写各种程序吧

    前言 本文为业余学习<明解C语言入门篇>的记录,包含代码清单和练习题. 开始学习时间:2022年8月21日 +++++++++++++++++++++++++++++++ 第1章 初识C语 ...

  7. 推荐系统入门(六):新闻推荐实践1(附代码)

    推荐系统入门(六):新闻推荐实践1 目录 推荐系统入门(六):新闻推荐实践1 前言 赛题简介 数据概况 评价方式理解 Baseline 总结 参考资料 前言 相关系列笔记: 推荐系统入门(一):概述 ...

  8. ubuntu系统下c语言入门以及编写简单程序

    目录 一,hello world入门 二,在windows系统中编写简单程序 三,在ubuntu系统下用makefile方式编写程序 一,hello world入门 在linux操作系统中打开终端 1 ...

  9. 六轴机械手程序 用信捷XD5和威纶触摸屏编写

    六轴机械手程序 用信捷XD5和威纶触摸屏编写. 此程序已经实际设备上批量应用,程序成熟可靠,借鉴价值高,程序有注释. YID:6643645620226313工控数码编程

最新文章

  1. fedora mysql默认密码忘记_Linux fedora 24 忘记密码图形化界面修改root密码的方法
  2. iphone震动反馈怎么设置_如何评价 iPhone 上的振动反馈?
  3. java 线程 单例_多线程单例模式
  4. Largest Number 179
  5. 数据交互之封装request请求(微信小程序篇)
  6. 高度设置为100%无效的解决办法
  7. Redis客户端工具如何连接宝塔Redis服务器
  8. 《人工智能:一种现代的方法》笔记(一)
  9. 现代高频开关电源技术与应用随堂练习_六款简单的开关电源电路设计原理图详解...
  10. python 基础学习(小甲鱼)
  11. 英语背单词有用吗_对于大学生英语背单词软件哪个好可以用_最好的背单词
  12. 学习python第五天
  13. 【CFD理论】对流项-02
  14. iOS开发证书不受信任
  15. 【解决】Python程序运行时所占内存越来越大
  16. hadoop入门介绍(一)
  17. 货币金融学之基本概念
  18. Unity中Destory()、DestoryImmediate()和GameObject==null问题
  19. 关于制作赛车游戏的一些入门知识
  20. NetBeans中文字体显示问题

热门文章

  1. 使用john 1.9 破解centos7密码
  2. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第54讲:PHP smarty模板内建函数
  3. 程序员下班关闭显示器,却从不关电脑,你知道为什么吗?
  4. vue ElementUI实现的记事日历
  5. TRIZ系列-创新原理-2-抽取原理
  6. 仿百度网盘html页面源码,仿百度云主界面
  7. 如何系统的自学网络安全
  8. 12306登录验证码识别
  9. (泡在网上的日子)(各种源码)
  10. linux目录对应windows,linux目录和Windows目录对比