12948|18

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教高手指教:2812的C语言中的.reset段的含义以及其在存储器中的定位 [复制链接]

疑问一:仿真调试下载程序或把程序已烧写至FLASH后脱机上电运行程序时,程序是不是必须要执行“从0X3F FFC0处复位→执行0X3F FC00地址处的初始化引导函数(Initboot) →根据GPIO选择引导模式→确定用户程序入口地址→从入口处开始执行用户程序”这一系列过程吗?对于用C语言编程时,通常在复位地址向量处(对于F240而言,复位地址在0X0000地址处?),常需要放置指令:“B  _c_int0”来规定初始化入口地址,意即C语言函数“_c_int0”完成的功能就是初始化引导函数(Initboot)的功能吗?但对F2812来说,复位向量地址为0X3F FFC0,处于ROM区,是一次性编程ROM,怎么把_c_int0这个入口地址放在0X3F FFC0处呢?
疑问二:由于引导模式由GPIO引脚状态决定,那对于一个已经设计好的DSP最小系统,引脚状态在硬件上已经固定好了,意即是不是此时只能局限于一种引导模式了?不能同时进行仿真调试和烧写至FLASH内进行硬件调试吗?(因为仿真调试时,用户程序入口地址一般在SARAMH0处,烧写至FLASH内进行允许时,用户程序入口地址在FLASH处。)


[ 本贴由 powerplus 于 2005-12-9 10:50 PM 最后编辑 ]

最新回复

引用: 谢谢楼主的热心回帖!通过您的详细分析,我现在对F2812的C语言运行过程已经基本理解了,但还是有一点不是很清楚,就是.reset段的具体含义是什么,它是C语言默认的段吗?哪里能看到关于C语言CMD文件一些资料啊? 个人愚见:.reset处也是一条跳转指令,指向InitBoot(),InitBoot()的存放地址从0x3ffc00处开始。 至于程序在ram里面仿真,我认为是不存在上电引导这个过程的,因为都是在上电状态下由ccs通过仿真器把程序load到ram里,接着当我们点击run命令按钮时程序从RAML0 0x000000处开始运行(假设在cmd里有PAGE 0:    /* Program Memory */    BEGIN      : origin = 0x000000, length = 0x000002                RAMM0      : origin = 0x000002, length = 0x0003FE    PRAMH0     : origin = 0x3FA000, length = 0x001000    RESET      : origin = 0x3FFFC0, length = 0x000002    BOOTROM    : origin = 0x3FF000, length = 0x000FC0 .......     SECTIONS {    /* Allocate program areas: */    codestart        : > BEGIN,      PAGE = 0    ramfuncs         : > RAMM0       PAGE = 0      .text            : > PRAMH0,     PAGE = 0/* code */    .cinit           : > RAMM0,      PAGE = 0/* 变量初始值 */    .pinit           : > RAMM0,      PAGE = 0    .switch          : > RAMM0,      PAGE = 0/* switch语句的跳转表 */    .reset           : > RESET,      PAGE = 0, TYPE = DSECT /* not used, */)  详情 回复 发表于 2008-12-30 11:56
 
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我看到前面也有一个朋友提出了跟我一样的问题,为什么没有帮忙回答一下呢?
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
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中读取复位向量的,当然初始化引导过程也可以自己编写。

 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

4
 
在第5步中,为选择片内FLASH,则使SCITXA为高电平。如果SCITXA还用作串口通讯,那怎么办?
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
SCITXA引脚有内部上拉,所以只要没有强制下拉的话,DSP检测的都是高电平。
对于通讯不影响。

SCITXA不用在外部上拉。不能直接接到高电平上。
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

6
 
如果不选用Flash模式,而是其它模式,需要将SCITXDA下拉为低电平,那么此种情况下又如何实现SCI通讯?
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
这里我还有两个疑问,期待您的回复,谢谢!

疑问1:由于引导模式由GPIO引脚状态决定,那对于一个已经设计好的DSP最小系统,引脚状态在硬件上已经固定好了,意即是不是此时只能局限于一种引导模式了?不能同时进行仿真调试和烧写至FLASH内进行硬件调试吗?(因为仿真调试时,用户程序入口地址一般在SARAMH0处,烧写至FLASH内进行允许时,用户程序入口地址在FLASH处。)

疑问2:我看王潞钢编写的《DSP C2000程序员高手进阶》一书,说C语言有7个定义好的段,即是.text 、.cinit、 .swith、 .bss、 .stack、 .sysmen、 .const等,那本书主要针对C240X系列的讲解,我不知道2812是否也是这7个段?但我看到EEWORLD例程中以及咱们这个论坛其他朋友给的CMD文件中都有一个.reset段,我不知道这个.reset段里面一般存放的是什么内容?是您说的跳转到C语言运行环境初始化函数“c_int00”的跳转地址吗?(但我也看到一些朋友的.CMD文件不用这个段的,用“ .reset           : > RESET,        PAGE = 0, TYPE = DSECT /* not used, */”屏蔽了,这又是什么意思啊?)很糊涂……
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
顶顶顶,我也想明白
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 
1.管脚的状态可以用跳线或拨码开关来设置
2.“ .reset           : > RESET,        PAGE = 0, TYPE = DSECT /* not used, */”
在正常使用时,并没有用到RESET段,所以TYPE = DSECT
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

10
 

可能是我资质比较低吧,也可能是我提的问题说得不清楚,青铜长老zxp3429没有办法回答我的疑问吧。到现在为止,我还是没有明白.reset段是作什么用的。

   要是如您所说的只有在采用在MP方式时才会用到,但我现在所用的SEE_DEC2812模板采用的是MC方式,但例程中所有的CMD文件都用到了.reset段了。另外,根据我分析它的原理图,引导模式是跳转到FLASH BOOT模式,但在CMD文件却把该段定位在存储空间的H0初始位置,不知为什么?(有时我想.reset段存放的内容有没有可能是C语言运行环境初始化函数“_c_int00”的起始地址呢,那么根据FLASH BOOT模式,这个时候.reset段应该定位在3F7FF6处,但例程中把它定位在H0处,所以.reset段不应该存放的是C语言运行环境初始函数“_c_int00”的起始地址,那到底存放的对应C语言编程中的什么内容呢? )

   另外,我看到前面有一个朋友提供了其烧写成功的CMD文件,他是把.reset段定位在了3F7FF6处,不知道这又是为什么?另外,我也看到咱们论坛有的朋友不用.reset段(即用到语句“ .reset  : > RESET,   PAGE = 0, TYPE = DSECT ”屏蔽掉了,但我看到在他的MEMORY文件里,其中的RESET存储块对应的是3F FFC0,这个时候不用.reset段,我想该朋友用的可能是MP方式),但在他们的CMD文件中始终有一个段定位在3F7FF6处(该段名为CODESTART,我想该段可能是该朋友自己取的,不是C语言默认的段),这又是怎么解释,真的很糊涂啊……
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
你描述的这个RESET段应该是两个不同的段,一个是CODESTART,一个是复位向量RESET,可能是有的人将CODESTART也用RESET来写。参看下面的例子,用的是CODESTART 段做程序入口而不是RESET,我个人认为这样的写法比较标准一些,因为这里不是复位入口而是你的代码入口:

    .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




MEMORY
{
PAGE 0:    /* Program Memory */
...
   FLASH_AB    : origin = 0x3EC000, length = 0x00BF80     /* on-chip FLASH */

   BEGIN_FLASH : origin = 0x3F7FF6, length = 0x000002     /* Part of FLASHA.     Used for \"boot to flash\" bootloader mode. */
   BEGIN_H0    : origin = 0x3F8000, length = 0x000002     /* Part of H0.  Used for \"boot to H0\" bootloader mode. */
   RAMH0       : origin = 0x3F8002, length = 0x001FFE     /* H0 SARAM */
/*   ZONE7       : origin = 0x3FC000, length = 0x003FC0     /* XINTF zone 7 available if MP/MCn=1 */
   ROM         : origin = 0x3FF000, length = 0x000FC0     /* boot ROM available if MP/MCn=0 */
   RESET       : origin = 0x3FFFC0, length = 0x000002     /* part of boot ROM (MP/MCn=0) or XINTF zone 7 (MP/MCn=1) */
   VECTORS     : origin = 0x3FFFC2, length = 0x00003E     /* part of boot ROM (MP/MCn=0) or XINTF zone 7 (MP/MCn=1) */

PAGE 1 :   /* Data Memory */
   RAMM0       : origin = 0x000000, length = 0x000400     /* on-chip RAM block M0 */
   RAMM1       : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */
   RAML1       : origin = 0x009000, length = 0x001000     /* on-chip RAM block L1 */

}
SECTIONS
{
。。。。
   .reset            : > RESET,            PAGE = 0, TYPE = DSECT  /* We are not using the .reset section */

  /* Data Memory (PAGE 1) sections */
   .cio              : > RAMM0,            PAGE = 1
   .bss              : > RAMM0,            PAGE = 1                /* Should be empty with large memory model */
   .ebss             : > RAML0,            PAGE = 0
   .const            : > FLASH_CD,         PAGE = 0                /* Should be empty with large memory model */
   .econst           : > FLASH_CD,         PAGE = 0      
   .stack            : > RAMM1,            PAGE = 1
   .sysmem           : > RAMM0,            PAGE = 1                /* Should be empty with large memory model */
   .esysmem          : > RAMM0,            PAGE = 1
   .switch           : > FLASH_CD,         PAGE = 0

/*** User Defined Sections ***/
   codestart         : > BEGIN_FLASH,      PAGE = 0                /* Used by file CodeStartBranch.asm */
。。。。。
}


[ 本贴由 zxp3429 于 2005-12-12 09:01 最后编辑 ]

[ 本贴由 zxp3429 于 2005-12-12 09:04 最后编辑 ]
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

12
 
此RESET段非彼RESET段,你说的这个RESET段应该是我说的CODESTART段,也就是根据GPIO引脚信号判断引导方式跳到“相应位置”执行用户程序中的“相应位置”即用户程序入口,它在程序中应该有类似下面的一个段定义。

.sect \"reset\"

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
此段地址如果指向 H0 SRAM,可能是防真时用的,此时虽然IO设置的是FLASH方式,防真程序是可以的,只是程序可能不是从code_start开始的,你可以试试;如果你想脱机使用,则要指向FLASH的3FF7FF6这个地址,并编译烧写入FLASH后执行。


[ 本贴由 zxp3429 于 2005-12-12 17:39 最后编辑 ]
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

13
 
如果硬件上设置的是FALSH引导模式,但现在我却要让程序在片内H0的RAM区仿真

文件应该怎么写呢?困惑中

[ 本贴由 chinamoon 于 2006-2-4 07:17 PM 最后编辑 ]
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

14
 
好贴 ! 顶!
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

15
 
顶一下,也有人有跟我一样的疑问,期望大侠们出现,伸出您们援助的双手,拉我们一把……
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

16
 
本来很忙,还是花点时间来回答小弟们的问题.也不知道本人是否说得清楚.

1>F2812上电复位时,引脚XMP/MC被采样,该引脚的状态决定了了在复位时引导ROM或XINF的区域7是否使能.如果XMP/MC==1,则区或7被使能,复位向量将从外部存储器中获取.大多数学习用的评估板都是采用这种复位方式.
    如果XMP/MC==0,那引导ROM被使能而XINTF的区域7为非使能.在这种情况下,得位向量从内部引导ROM存储器中获取.BootRom复位向量从BootROM地址0x3fffc0转入初始化引导程序(InitBoot)---该程序固化于ROM内.
2>执行InitBoot初始化程序后,该程序将检测GPIO的引脚(GPIOF4,GPIOF12,GPIOF3,GPIOF2)的状态,以知道用户使用何种引导模式.在制板时,应保证这些引脚的初始状态与相应的引导方式相对应.
3>当GPIOF4==1时,InitBoot程序跳转到ox3f7ff6,同时将控制权交给编程人员.
  因此.cmd文件如下:
  {
......
  BEGIN      : origin = 0x3f7ff6, length = 0x000002
  }

{
.......
  codestart        : > BEGIN,        PAGE = 0
}
4>当需要用片内18K的RAM时行仿真时,可在0x3f7ff6处预先烧写一转跳指令(只需烧写一次).如:
    LB 0x3F8000
   使程序初始化后转跳至RAM空间.然后在RAM空间内写入仿真程序即可,此时.CMD 头文件如下:
    MEMORY
{
PAGE 0 :
   /* For this example, H0 is split between PAGE 0 and PAGE 1 */  
   /* BEGIN is used for the \"boot to HO\" bootloader mode      */
   /* RESET is loaded with the reset vector only if           */
   /* the boot is from XINTF Zone 7.  Otherwise reset vector  */
   /* is fetched from boot ROM. See .reset section below      */
   
   RAMM0      : origin = 0x000000, length = 0x000400
   BEGIN      : origin = 0x3f8000, length = 0x000002   /*IN FLASH THE ORIGIN IS   0x3f7ff6, IN RAM THE ORIGIN IS 0x3f8000   */         
   PRAMH0     : origin = 0x3f8002, length = 0x000ffd   /*   */
   RESET      : origin = 0x3FFFC0, length = 0x000002
   RAML0      : origin = 0x8000,   length = 0x001000
   RAML1      : origin = 0x9000,   length = 0x001000
PAGE 1 :

   /* For this example, H0 is split between PAGE 0 and PAGE 1 */

   ARAML0    : origin = 0x8000,   length = 0x001000   /*   */
   RAMM1     : origin = 0x000400, length = 0x000400
   DRAMH0    : origin = 0x3f9000, length = 0x001000

}

5>各位小弟在学习F2812时不必太在意复位向量的起始地址,而只需知道F2812复位后的大概流程,同时注意初始化程序结束后,程序自动转跳到0x3f7ff6,然后将控制权交给用户.
使用者需要做的就是从0x3f7ff6处接过控制权,至于程序转向何处,就由自已控制了----在0x3f7ff6处安排不同的转跳指令,以决定程序执行内部FLASH还是进行内部RAM仿真.
  
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

17
 
谢谢楼主的热心回帖!通过您的详细分析,我现在对F2812的C语言运行过程已经基本理解了,但还是有一点不是很清楚,就是.reset段的具体含义是什么,它是C语言默认的段吗?哪里能看到关于C语言CMD文件一些资料啊?
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

18
 
4>当需要用片内18K的RAM时行仿真时,可在0x3f7ff6处预先烧写一转跳指令(只需烧写一次).如:
    LB 0x3F8000

--------------------------

可如何在0x3f7ff6处 烧写指令 LB 0x3F8000 ?不解啊

[ 本贴由 chinamoon 于 2006-1-28 12:56 PM 最后编辑 ]
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

19
 
引用:

谢谢楼主的热心回帖!通过您的详细分析,我现在对F2812的C语言运行过程已经基本理解了,但还是有一点不是很清楚,就是.reset段的具体含义是什么,它是C语言默认的段吗?哪里能看到关于C语言CMD文件一些资料啊?
个人愚见:.reset处也是一条跳转指令,指向InitBoot(),InitBoot()的存放地址从0x3ffc00处开始。

至于程序在ram里面仿真,我认为是不存在上电引导这个过程的,因为都是在上电状态下由ccs通过仿真器把程序load到ram里,接着当我们点击run命令按钮时程序从RAML0 0x000000处开始运行(假设在cmd里有PAGE 0:    /* Program Memory */
   BEGIN      : origin = 0x000000, length = 0x000002            
   RAMM0      : origin = 0x000002, length = 0x0003FE
   PRAMH0     : origin = 0x3FA000, length = 0x001000
   RESET      : origin = 0x3FFFC0, length = 0x000002
   BOOTROM    : origin = 0x3FF000, length = 0x000FC0
.......
    SECTIONS
{
   /* Allocate program areas: */
   codestart        : > BEGIN,      PAGE = 0
   ramfuncs         : > RAMM0       PAGE = 0  
   .text            : > PRAMH0,     PAGE = 0/* code */
   .cinit           : > RAMM0,      PAGE = 0/* 变量初始值 */
   .pinit           : > RAMM0,      PAGE = 0
   .switch          : > RAMM0,      PAGE = 0/* switch语句的跳转表 */
   .reset           : > RESET,      PAGE = 0, TYPE = DSECT /* not used, */)
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表