工具/软件:Code Composer Studio
您好,
我想询问一个特别的问题:我目前正在开发一个新的应用程序,它从RAM启动并调试,链接程序脚本附在下面。 不幸的是,我遇到了缺乏这种记忆的情况。 在我的代码中有一些工作正常的部件,所以我认为,可以将它们移动到闪存中,然后立即将它们下载到MCU中。 如何实现? 我应该在 代码中插入一些pragma节,如“#pragma code_section()”,还是有其他方法可以将经过充分验证的代码放入闪存中? 我提醒:它必须是一次性的,并且后续调试等必须只能从RAM中再次进行:-)
非常感谢您的建议。
Miroslav
/*
// TI文件$Revision:/main/11 $
//签入$日期:2009年4月15日09:57:28 $//#############################################################################################################################################.########.################./#./#./#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.
//
//文件:2.8335万_RAM_lnk.cmd
////
标题:2.8335万的链接程序命令文件RAM不足的示例
////
这仅包括2.8335万设备上的所有SARAM块。
// 这不包括闪存或OTP。
////
请记住,L0和L1受代码
//保护 安全模块。
////
这意味着在大多数情况下,您会想要移至
// 定义了更多内存的另一个内存映射文件。
//
//###########################################################################
//$TI发行:$//
$Release Date:$//####################################################################################################################################################################################################
*/
/*===================================================================================
//对于Code Composer Studio 2.2 和更高版本
//------------------
//除了此内存链接器命令文件外,
//将头链接器命令文件直接添加到项目中。
//需要头链接器命令文件,才能将
//外设结构链接到
//内存映射中的正确位置。
////
头链接器文件位于<base>\DSP2833x_Headers\cmd
////
对于BIOS应用程序,请添加: DSP2833x_Headers_BIOS.cmd
//对于非BIOS应用程序,添加:DSP2833x_Headers_nonBIOS.cmd
========================= */
/*===================================================================================
//对于2.2 之前的代码编辑器工作室
//------------------
//1)使用以下-l语句之一在
项目中包括//头链接器命令文件。 将
外围结构链接到
内存映射中的正确//位置需要头链接器//文件 */
/*取消注释此行仅包括非BIOS应用程序的文件*/*
-l DSP2833x_Headers_nonBIOS.cmd */
/*取消注释此行仅包括BIOS应用程序的文件*/*
-l DSP2833x_Headers_BIOS.cmd */
/* 2) 在项目中,将路径<base>\DSP2833x_headers\cmd添加到
库搜索路径中,路径位于project->build options,linker tab,
library search path (-i)下。
/*=========================================================================================================== */*
定义F2.8335万的内存块起始/长度
第0页用于组织程序部分
第1页用于组织数据部分
注:
F2.8335万上的内存块是一致的(即相同的
物理内存)。
这是不应出现的相同内存区域
为第0页和第1页定义。
这样做会导致程序损坏
和/或数据。
镜像l0/L1/L2和L3内存块-即
它们可以在高内存或低内存中访问。
为简单起见,此中仅使用一个实例
链接程序文件。
连续的SARAM内存块可以组合使用
如果需要创建更大的内存块。
*/
memory
{
page 0:/*
begin用于“boot to SARAM”bootloader模式 */
开始 :Origin = 0x0万,length = 0x0.0002万 /*引导至M0将在此处 */
RAMM0 :原始= 0x0.005万,长度= 0x0003B0
RAML0 :原点= 0x0.8万,长度= 0x0.1万
RAML1 :原点= 0x0.9万,长度= 0x0.1万
RAML2 :原点= 0x00A000,长度= 0x0.1万
RAML3 :原点= 0x00B000,长度= 0x0.1万
RAML4 :原点= 0x00C000,长度= 0x0.1万
//RAML5 :原点= 0x00D000,长度= 0x0.1万
//RAML6 :原点= 0x00E000,长度= 0x0.1万
//ZONE7A :原始= 0x20万,长度= 0x00FC00 /* XINTF区域7-程序空间*//*已禁用,所有外部RAM将位于数据部分*/
CSM_RSVD:原始= 0x33FF80,长度= 0x0.0076万 /* FLASHA的一部分。 在使用CSM时使用所有0x0000编程。 */
CSM_PWL:原点= 0x33FFF8,长度= 0x0.0008万 /* FLASHA的一部分。 FLASHA中的CSM密码位置 */
ADC_CAL:原点= 0x38.008万,长度= 0x0.0009万
重置 :原点= 0x3FFFC0,长度= 0x0.0002万
IQTABLES:原点= 0x3FE000,长度= 0x000b50
IQTABLES2:原点= 0x3FEB50,长度= 0x0.0008万c
FPUTABLES:原点= 0x3FEBDC,长度= 0x0006A0
引导ROM:原点= 0x3FF27C,
页面长度= 0x000D44:
/* BOOT_RSVD由启动ROM用于堆栈。 */*
此部分仅保留用于防止引导ROM在
调试过程中损坏此区域 */
BOOT_RSVD:原始= 0x0.0002万,长度= 0x0.0004万E /* M0的一部分,引导ROM将使用此堆栈*/
RAMM1 :原点= 0x0.04万,长度= 0x0.04万 /*片上RAM块M1 */
RAML5 :原点= 0x00D000,长度= 0x0.1万
RAML6 :原点= 0x00E000,长度= 0x0.1万
RAML7 :原点= 0x00F000,长度= 0x000FF0 /*片上RAM块L1 */
FLASH_FLAG:Origin = 0x00FFF0,length = 0x0万F
FLASH_CRC:origin = 0x30万,length = 0x0.0002万 /*应用CRC */
ZONE7 :原始= 0x20万,长度= 0x10万 /* 1Mx16b */
ZONE6的扩展RAM :原始= 0x10万,长度= 0x8万 /*分机NV RAM 512kx16b */
}
“
引导至SARAM”模式的{/*设置:
codegstart部分(可在DSP28_CodeStartBranch.asm中找到)
将执行重定向到用户代码的开头。 */
codesstart :>开始, 页面= 0
ramfuncts :> RAML0, Page =0
// two >表示链接器可以将.text部分拆分为多个RAM区域
.text :>> RAML0 | RAML1 | RAML2 | RAML3 | RAML4, 页面= 0
.cinit :> RAML0, 页面= 0
。Pinit :> RAML0, 页面= 0
。switch :> RAML0, 页面= 0
.stack :> RAML4, 页面= 0
.ebss :>> RAML5 | RAML7 页面= 1
。econst :>> RAML6 | RAML7, 页面= 1
个.esysmem :> RAMM1, Page =1
.sysmem :> RAML0, page =0
.cio :> RAML0, page =0
diagbuff :> RAMM1, 页面= 1
FLASH_CRC :> FLASH_CRC page = 1
FLASH_FLAG :> flash_flag page = 1
IQmath :> RAML0, Page =0
IQmathTables :> IQTABLES,页面=0,类型= NoLoad
/*如果调用IQNexp()或IQexp(),则取消注释以下部分
从IQMath.lib库中执行函数,以便利用
引导ROM中的相关IQ Math表(这可节省空间和引导ROM
为1等待状态)。 如果此部分未取消注释,请使用IQmathTables2.
将加载到其他存储器(SARAM,闪存等)中并将占用
打开空间,但0等待状态是可能的。
*/*
IQmathTables2 :> IQTABLES2, page =0,type = NoLoad
{
IQMath.lib<IQNexpTable.obj>(IQmathTablesRam)
}
*/
FPUmathTables:> FPUTABLES,page =0,type = NoLoad
DMARAML4 :> RAML4, 页面= 0
//DMARAML5 :> RAML5, 页面= 0
//DMARAML6 :> RAML6, 页面= 0
DMARAML7 :> RAML7, 页面= 1
//ZONE7DATA :> ZONE7B,页面= 1 /*重新定义如下*/
ZONE7DATA :> ZONE7, 第= 1页
ZONE6DATA :> ZONE6, 页面= 1
。重置 :>重置, 页=0,类型= DSECT /*未使用 */
CSM_rsvd :> CSM_RSVD page =0,type = DSECT /*不用于SARAM示例*/
csmpasswds :> CSM_PWL页=0,type = DSECT /*不用于SARAM示例*/
/*分配ADC_CAL函数(出厂时预编程到TI保留内存中)*/
.ADC_CAL. :load = adc_CAL,page = 0,type = NoLoad
}/*
//===================================================================
//文件结束。
//===========================================================================================================================================
*/