11749|12

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

F2812:FLASH引导模式下在线调试(代码放在ram中),0x3F7FF6放置什么样的跳转指令呀? ... [复制链接]

以前记得看过一个帖子,说在0x3F7FF6~0x3F7FF7(片内FLASH最后两个字)处放一条跳转指令:LB 0x3F8000,而0x3F8000处通常也是一条跳转指令:LB _C_int00,这样就跳转到ram中应用程序的入口处执行
现在我的问题是放在FLASH中的这条跳转指令LB 0x3F8000是怎么写入的?
本人对DSP程序的开发流程不太熟悉,还请各位不吝指教,谢谢!

最新回复

好贴  详情 回复 发表于 2007-3-18 03:37
 
点赞 关注

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
以前的帖子说lb 0X3F8000是直接烧FLASH去的.但小弟也不解是如何将指令烧进去的

在程序什么地方写?该怎么写?
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这个问题值得探讨!

首先附烧写到FLASH后的程序运行过程:

1:上电运行时根据MP/MC引脚的状态决定是从片外的3fffc0处读取复位向量或者时从片内的rom的3fffc0处读取复位向量。MC方式下从片内读取,MP方式下从片外读取。
2:一般我们用的是MC方式,即从片内读取复位向量,在片内的rom 3fffc0处有一个地址为3ffc00。
3:复位后处理器从3fffc0处读取3ffc00这个地址,所以程序从3ffc00处开始执行
4:3ffc00处开始的就是initboot过程吧,根据IO管教的状态判断该进入那一种引导方式
5:在SCITXA引脚为高电平时就是flash boot方式,此时置PC=3F7FF6
6:在片内flash的3F7FF6和3F7FF7处有一个跳转指令,该跳转指令就是LB _c_int00
7:执行这个跳转指令后程序就开始运行c_int00这个函数了
8:这个函数就是建立一个c程序的运行环境,等建立完c运行环境后c_int00调用main函数
9:main函数开始就是我们自己编写的应用程序了。

以上是2812上电(复位)后运行过程的描述

如果你选择了MP方式,那么3fffc0处的复位向量可以自己设置,因为此时处理器从片外的ZONE7区的ram中读取复位向量的,当然初始化引导过程也可以自己编写。




但一直感到疑惑的是:

仿真调试时程序通常放在H0 RAM里,也就是从0x3F8000开始的存储区中,可是并没有对FLASH进行烧写,0x3F7FF6~0x3F7FF7里面怎么放入跳转指令:LB 0x3F8000,从而转到执行0x3F8000开始的程序?另外,在执行程序开始还要调用C环境初始化库程序,平时我们编写程序在RAM调试的时候也并没有在程序开始处加入LB _C_int00语句(只有在要烧写进FLASH时,会在程序开始处编写一小段调用LB 0x3F8000的汇编语句),不知仿真调试的开发流程到底是怎样的?

苛求高手赐教!
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

4
 
没有人给出答案呀

请明白的兄弟指点一下啊~
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

5
 
powerplus:
ram调试的时候0x3F8000处一般也放一条调转LB _C_int00吧

就是不明白程序放在ram里仿真调试的时候,boot mode 选择为从jump to flash,这个时候flash(0x3F7FF6)要放一条跳到ram的指令,但是这个时候还没有烧写FLASH,这条指令是怎么烧进去的??


 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
我疑问也在此,期待高手……
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
程序中的这一段:
.sect \"codestart\"

code_start:
    .if WD_DISABLE == 1
        LB wd_disable      ;Branch to watchdog disable code
    .else
        LB _c_int00        ;Branch to start of boot.asm in RTS library
    .endif

改为:
sect \"codestart\"

code_start:
    .if WD_DISABLE == 1
        LB 0x3F8000      ;Branch to watchdog disable code
    .else
        LB _c_int00        ;Branch to start of boot.asm in RTS library
    .endif
另外:*.cmd文件中的
  BEGIN      : origin = 0x3f7ff6, length = 0x000002
做完以上工作,就可以进行程序烧写,烧写完毕,检查ox3F7ff6和ox3F7ff7中的内容应为:0x8000,0x0070;
就可以进行在线RAM仿真了.当然仿真前,还要记得将以上两个部分改回来:
.sect \"codestart\"

code_start:
    .if WD_DISABLE == 1
        LB wd_disable      ;Branch to watchdog disable code
    .else
        LB _c_int00        ;Branch to start of boot.asm in RTS library
    .endif
以及:
 BEGIN      : origin = 0x3f8000, length = 0x000002
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
lvzech
多谢你的答疑!祝好
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

9
 
我的理解是flash 0x3f7ff6处那条LB 0x3f8000指令烧写一次就行了,不必每次仿真都烧一次

 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

10
 
仿真运行时,debug-->restart 后,CCS已自动将PC指针指向装载程序的入口(通常是-c-int00),按F5就可以正常运行了。所以仿真模式下,虽然硬件设计上将DSP的引导模式设为FLASH,但实际上,DSP的引导模式对仿真运行一点影响都没有。也就是说,不管0x3f7ff6中的跳转指令是什么,它都不影响仿真。

但reset CPU后,由于PC指针指向0x3ffc00,如果按F5往下运行,程序会跑死,因为程序运行到0x3f7ff6后就将跳向0x3f7ff6中指令所指向的地址,而这个地址在你上一次烧写时就已经固定了。当然你可以通过再次烧写来修改它。

另外,需注意的一点是,如果FLASH中已经烧写了一个正常的程序,此时又重新仿真下载了一个程序,restart或reset后,再按F5,程序都可以正常运行,但此时,它们运行的不是同一个程序。restart后运行的是仿真程序,而reset后运行的是FLASH中的程序。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

11
 
*.cmd改为
RAMH0s     :origin=0x3F8000,length=0x2
RAMH0       : origin = 0x3F8002, length = 0x001ffe  /* on-chip RAM block H0 */

codestart        : > RAMH0s,      PAGE = 1


其余都不变。
.sect \"codestart\"

code_start:
    .if WD_DISABLE == 1
        LB wd_disable      ;Branch to watchdog disable code
    .else
        LB _c_int00        ;Branch to start of boot.asm in RTS library
    .endif
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用:
lhfnjj 写道:
仿真运行时,debug-->restart 后,CCS已自动将PC指针指向装载程序的入口(通常是-c-int00),按F5就可以正常运行了。所以仿真模式下,虽然硬件设计上将DSP的引导模式设为FLASH,但实际上,DSP的引导模式对仿真运行一点影响都没有。也就是说,不管0x3f7ff6中的跳转指令是什么,它都不影响仿真。

但reset CPU后,由于PC指针指向0x3ffc00,如果按F5往下运行,程序会跑死,因为程序运行到0x3f7ff6后就将跳向0x3f7ff6中指令所指向的地址,而这个地址在你上一次烧写时就已经固定了。当然你可以通过再次烧写来修改它。

另外,需注意的一点是,如果FLASH中已经烧写了一个正常的程序,此时又重新仿真下载了一个程序,restart或reset后,再按F5,程序都可以正常运行,但此时,它们运行的不是同一个程序。restart后运行的是仿真程序,而reset后运行的是FLASH中的程序。
真谢谢lhfnjj,感觉这个问题讨论了半天,这位大哥说的最到点子啊!
很多讨论总觉的看了半天好象都懂,但实际上还是不懂!

  文中提到的"reset CPU后,PC指针指向0x3ffc00,如果按F5往下运行,程序会跑死"
是不是指 在仿真运行时,先debug-->restart,然后reset CPU的话会跑飞程序??
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

13
 
好贴
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表