Part Number:TMS320F280039C
测试时发现软件执行时,有很多变量非0值,而是随机值,想问一下如何上电把所有RAM片先清0?
谢谢大家了
Yale Li:
我建议给变量初始化的时候赋初值为0。
,
? ?:
没办法直接整片初始化RAM吗? 我尝试了几种方法都不可以…….
,
? ?:
void Main_RamDataClear(int StarAddr, int DataLen){ // 将DSP RAM的起始地址转换为32位整数指针 volatile uint32_t *ram_ptr = (volatile uint32_t *)StarAddr;
// 计算RAM的大小(以32位字为单位) uint32_t ram_size_in_words = DataLen / sizeof(uint32_t);
// 遍历RAM并清零 for(uint32_t i = 0; i < ram_size_in_words; ++i) { *ram_ptr++ = 0; }}使用这种方式给RAM初始化完全不起作用
,
Yale Li:
为什么有这种需求?
,
? ?:
不知道为什么0039C的RAM有初始值,上电的时候如果不初始化有一些变量会有初始值,导致程序会有执行的风险,所以想通过初始化RAM的方式来处理,避免不初始化时使用。
,
? ?:
不初始化程序会乱跑,0039C跟其他芯片不同上电有初始值。
,
Yale Li:
RAM全部清零是不大可能的。
能否具体指明一下哪些非初始化变量需要被清零?比如局部变量
,
? ?:
局部变量还好,主要时全局变量有初值,因此每个变量都需要先给初值才能用,想上电一次都初始化,但是目前没有操作成功,还是每个变量都初始化的做法才行。
,
Yale Li:
全局变量属于.bss段(uninitialized),.cinit段(initialized)是用于初始化全局变量的表。初始化时,全局变量的值被从.cinit段复制出来并存储到.bss段。
如果使用了 –rom_model 选项,这个过程就在 _c_int00 函数中被执行。 _c_int00 函数在main函数之前被调用。