主题: C2000WARE 中讨论的其他器件
工具/软件:
我在 TI TMDSCNCD28335原型板上开发了用于 SCI 通信的固件。 如果我使用了 RAM 链接器文件并使用 CCS 进行调试、则没有问题。 如果我在编译时在不打开 CCS 上的--ramfunc 选项的情况下使用了闪存链接器文件、那么固件似乎 也起作用、因为我可以在电路板和我的 PC 之间建立 UART 通信。 但是,每当我打开--ramfunc 选项时,固件就停止工作。 即使关闭--ramfunc 选项、但将 ramfunc 属性添加到固件中的任何函数、固件也停止工作。 导致此问题的原因是什么?
这是我的链接器文件的代码。 提前感谢您的帮助。
--mapfile_contents=all
移动数据
{
第0页:/*程序存储器*/
/*存储器(RAM/FLASH/OTP)块可移至 Page1以进行数据分配*/
ZONE0:origin = 0x004000、length = 0x001000 /* XINTF 区域0 */
RAML0:origin = 0x008000、length = 0x001000 /*片上 RAM 块 L0 */
RAML1:origin = 0x009000、length = 0x001000 /*片上 RAM 块 L1 */
RAML2:origin = 0x00A000、length = 0x001000 /*片上 RAM 块 L2 */
RAML3:origin = 0x00B000、length = 0x001000 /*片上 RAM 块 L3 */
ZONE6:origin = 0x01000000、length = 0x100000 /* XINTF 区域6 */
ZONE7A:origin = 0x0200000、length = 0x00FC00 /* XINTF 区域7 -程序空间*/
FLASHH:origin = 0x300000、length = 0x008000 /*片上闪存*/
FLASHG:origin = 0x308000、length = 0x008000 /*片上闪存*/
FLASHF:origin = 0x310000、长度= 0x008000 /*片上闪存*/
FLASHE:origin = 0x318000、长度= 0x008000 /*片上闪存*/
FLASHD:origin = 0x320000、长度= 0x008000 /*片上闪存*/
FLASHC:origin = 0x328000、length = 0x008000 /*片上闪存*/
FLASHA:origin = 0x338000、length = 0x007F80 /*片上闪存*/
CSM_RSVD:origin = 0x33FF80、length = 0x000076 /* FLASHA 的一部分。 当 CSM 正在使用时、使用所有0x0000进行编程。 */
begin:origin = 0x33FFF6、length = 0x000002 /* FLASHA 的一部分。 用于"引导至闪存"引导加载程序模式。 */
CSM_PWL:origin = 0x33FFF8、length = 0x000008 /* FLASHA 的一部分。 FLASHA 中的 CSM 密码位置*/
OTP:origin = 0x380400、length = 0x000400 /* On-chip OTP */
ADC_CAL:origin = 0x380080、length = 0x000009 /*保留存储器中的 ADC_cal 函数*/
IQTABLES:origin = 0x3FE000、length = 0x000b50 /* Boot ROM 中的 IQ 数学表*/
IQTABLES2:origin = 0x3FEB50、length = 0x00008c /* Boot ROM 中的 IQ 数学表*/
FPUTABLES:origin = 0x3FEBDC、length = 0x0006A0 /* Boot ROM 中的 FPU 表*/
ROM:origin = 0x3FF27C、length = 0x000D44 /* Boot ROM */
重置:origin = 0x3FFFC0、长度= 0x000002 /*引导 ROM 的一部分*/
Vectors:origin = 0x3FFFC2、length = 0x00003E /*引导 ROM 的一部分*/
第1页:/*数据内存*/
/*存储器(RAM/FLASH/OTP)块可移动到 PAGE0以进行程序分配*/
/*寄存器保留在页1上*/
boot_RSVD:origin = 0x000000、length = 0x000050 /* M0的一部分、引导 ROM 将用于堆栈*/
RAMM0:origin = 0x000050、length = 0x0003B0 /*片上 RAM 块 M0 */
RAMM1:origin = 0x000400、length = 0x000400 /*片上 RAM 块 M1 */
RAML4:origin = 0x00C000、length = 0x001000 /*片上 RAM 块 L1 */
RAML5:origin = 0x00D000、length = 0x001000 /*片上 RAM 块 L1 */
RAML6:origin = 0x00E000、length = 0x001000 /*片上 RAM 块 L1 */
RAML7:origin = 0x00F000、length = 0x001000 /*片上 RAM 块 L1 */
ZONE7B:origin = 0x20FC00、length = 0x000400 /* XINTF zone 7 - data space */
FLASHB:origin = 0x330000、length = 0x008000 /*片上闪存*/
}
/*将段分配给存储器块。
注意:
DSP28_CodeStartBranch.asm 中的 codestart 用户定义段用于重定向代码
引导至闪存时执行
ramfuncs 用户定义的段、用于将要从闪存复制到 RAM 中的函数存储
*/
很重要
{
/*分配程序区域:*/
.cinit:> FLASHA PAGE = 0 //C 启动时全局变量
.pinit:> FLASHA、page = 0 //启动时要调用的构造函数表
.text:> FLASHA PAGE = 0 //对于程序代码
codestart:> begin page = 0
#ifdef _TI_COMPILER_VERSION__
#if __TI_COMPILER_VERSION_>= 15009000
.TI.ramfunc:{}load = FLASHD、//FLASHD、
RUN = RAML0、
LOAD_START (_RamfuncsLoadStart)、
LOAD_END (_RamfuncsLoadEnd)、
RUN_START (_RamfuncsRunStart)、table (BINIT)、
页面= 0
#else
ramfuncs : load = FLASHD,
RUN = RAML0、
LOAD_START (_RamfuncsLoadStart)、
LOAD_END (_RamfuncsLoadEnd)、
RUN_START (_RamfuncsRunStart)、
页面= 0
#endif
#endif
.binit:> RAML1、第0页
csmpasswds:> CSM_PWL PAGE = 0
CSM_rsvd:> CSM_RSVD 页面= 0 //CSM_rsvd:符号
/*分配未初始化的数据段:*/
.stack :> RAML3 PAGE = 0 //> RAMM1 PAGE = 1 //用于函数调用栈
.ebss :> RAML4 PAGE = 1 //对于未初始化的变量
.esysmem :> RAML6 PAGE = 1 //对于动态内存分配池、请使用--heap size
.CIO:> RAML5、PAGE = 1
/*初始化段进入闪存*/
/*要使 SDFlash 对这些内容进行编程、它们必须分配至页0 */
.econst:> FLASHA page = 0 //显式初始化或包含字符串文字的全局常量变量。
//字符串文字放置在.econst:.string 子段中以启用更大的字段
//链接时放置控制
.switch:> FLASHA page = 0 //大型 switch 语句的跳转表
/*分配 IQ 数学区域:*/
IQMath:> FLASHC page = 0 /*数学代码*/
IQmathTables:> IQTABLES、PAGE = 0、TYPE = NOLOAD
/*如果调用 IQNexp()或 IQexp()、则取消注释以下部分
IQmath.lib 库中的函数、以便利用
引导 ROM 中的相关 IQ 数学表(这可以节省空间和引导 ROM
为1等待状态)。 如果未取消注释此部分、则为 IQmathTables2
将加载到其他存储器(SARAM、闪存等)并存储数据
可增加空间、但等待状态为0。
*/
/*
IQmathTables2:> IQTABLES2、page = 0、type = noLoad
{
IQmath.lib (IQmathTablesRam)
}
*/
FPUmathTables :> FPUTABLES, PAGE = 0, TYPE = NOLOAD
/*分配可通过 DMA 访问的 RAM 段:*/
DMARAML4:> RAML4、PAGE = 1
DMARAML5:> RAML5、PAGE = 1
DMARAML6:> RAML6、PAGE = 1
DMARAML7 :> RAML7, page = 1.
/*分配 XINTF 区域7的0x400以存储数据*/
ZONE7DATA:> ZONE7B、PAGE = 1
/*.reset 是编译器使用的标准段。 它包含*/
/*_c_int00表示 C 代码的起始地址。 /*
/*在使用引导 ROM 时、此段和 CPU 矢量*/
/*表不需要。 因此、此处将默认类型设置为*/
/* DSECT */
.reset:> reset、page = 0、type = DSECT
vectors :> vectors page = 0, type = DSECT
/*分配 ADC_cal 函数(由出厂时预编程到 TI 保留的存储器中)*/
.adc_cal:load = ADC_CAL、page = 0、type = NoLoad
}
/*
//==============================================================================
//文件结尾。
//==============================================================================
*/
此致、
Weiliang