尊敬的香榭丽舍
TI 的示例项目只是具有自动初始化变量的功能、但没有清除 RAM 内容的功能。 您能否建议您使用一种方法清除所有 RAM 内容、但保留自动初始化变量值?
谢谢。。。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
尊敬的香榭丽舍
TI 的示例项目只是具有自动初始化变量的功能、但没有清除 RAM 内容的功能。 您能否建议您使用一种方法清除所有 RAM 内容、但保留自动初始化变量值?
谢谢。。。
尊敬的 Jack:
标准 C 启动例程应清除所有静态存储变量(SSV)并初始化具有初始化程序的变量。 据我所知、由于这些 MCU 上具有 ECC 的 RAM 在没有初始化的情况下不可用(请参阅 DxINIT、LSxINIT 等寄存器)、引导 ROM 会清除(初始化)所有 RAM、因此 C 编译器不必清除 SSV。 这是正确的、但仅适用于正常启动电源。 调试时、不会调用引导 ROM 中的 RAM 清除例程、也不会清除 SSV。 链接器 RAM 初始化模型不起作用、因为通常需要在不重新加载的情况下重新启动程序。
在用于 C2000的 TI C 编译器中、您可以定义 _system_pre_init ()例程、该例程在使用初始化程序初始化变量之前调用。 您可以添加该代码以通过某种方式清除.ebss 段。
例如、您可以为.ebss 指定一些存储器、如 GS0、然后使用 GS0INIT 寄存器初始化 GS0。
2.您也可以使用 memset()来初始化.ebss。
在 cmd 文件中:
ebss:> RAMGS23,PAGE = 1,RUN_START (_EbssStart),RUN_SIZE (_EbssSize),table (ebsstable )
要使用链接器的???_start 和?_end 地址,.ebss 必须是连续的。 这就是我连接 GS2和 GS3存储器的原因。
代码中
#if defined (_debug)
#include
int _system_pre_init (void)
{
extern int EbssSize、EbssStart;
memset (EbssStart、0、(size_t)&ssSize);
返回1;
}
#endif
Edward
附件是我很久以前为28335修改的代码。
请参阅第143行左右的函数"stack_fill"。 您可能需要修改__STACK_END 和__STACK_SIZE 符号以适合您的应用。
此函数在第98行上调用。 请注意、c_init00会在后面的109行调用。
尊敬的 Jack:
我想我已经解释过了如何操作。 默认情况下,C2000链接器->高级选项->符号管理->指定程序入口点... =_c_int00。 在 C 语言中、您需要删除前导下划线:
void c_int00 (void);
因此、将链接器设置中的_c_int00替换为_MystartUp、然后在 C 中创建函数 void MystartUp (void)、该函数在 exit 时会调用 c_int00 ()。 由于是 C 语言,因此您可以从 MystartUp()调用 DisableDog (),根本不需要 ASM。 抱歉,我必须在 memset()上方插入栈初始化,但是,由于 ROM 初始化并使用栈,我认为堆栈初始化根本不是必需的。
void c_int00 (void);
无效 MyStartup (无效)
{
asm (" MOV SP、#0x3000");// 指定 栈底地址 */
DisableDog ();
memset ((void*) 0x3000/*指定 RAM start*/、0、0x1000/* RAM 块大小*/);
//针对不连续的 RAM 块重复 memset。
c_int00();
}
如果原因是标准归零,那么只清除.ebss 就足够了。 用于不同架构的任何其他 C 编译器只会清除 ebss 或 BSS。
Edward