TI中文支持网
TI专业的中文技术问题搜集分享网站

F28335 FLASH全部搬移到ram中运行出现的问题

程序很短,把flash的程序全部搬移到ram中运行。

.stack : > RAMM0 PAGE = 1
.ebss : > RAML4L5L6L7 PAGE = 1
.esysmem : > RAMM1 PAGE = 1

.text : LOAD = FLASHA, PAGE = 0  
RUN = RAM_L0L1L2L3, PAGE = 0
LOAD_START(_text_loadstart),
RUN_START(_text_runstart),
SIZE(_text_size)

上面这个RAM_L0L1L2L3是程序空间,定义成 : origin = 0x008000, length = 0x006000

RAML4L5L6L7 是数据空间定义成      : origin = 0x00E000, length = 0x002000

现在发现这个程序烧写在部分板子中是能正常运行的(观察中断 toggle的呼吸灯),但是有些板子中,上电后怎么都不能正常运行(呼吸灯不闪),连上仿真器能看到是进了illegal_isr了,有些板子用硬件狗TPS3828-33DBVT复位多次后,程序又能正常运行了,开始以为是硬件电路的问题。

但是我更改上面程序空间和数据空间的分配后,不能正常的板子也可以一上电就能跑起来,但是另一些本来好着的板子又不能运行了,这样感觉好像是cmd的问题,我查看map,.txt 等分配都是没有超范围的。请专家帮我分析分析,万分感激!

我上传了整个工程,请大家帮我看看,谢谢!

user3786970:

回复 Eric Ma:

好的,谢谢你,问题已经解决。

程序很短,把flash的程序全部搬移到ram中运行。

.stack : > RAMM0 PAGE = 1
.ebss : > RAML4L5L6L7 PAGE = 1
.esysmem : > RAMM1 PAGE = 1

.text : LOAD = FLASHA, PAGE = 0  
RUN = RAM_L0L1L2L3, PAGE = 0
LOAD_START(_text_loadstart),
RUN_START(_text_runstart),
SIZE(_text_size)

上面这个RAM_L0L1L2L3是程序空间,定义成 : origin = 0x008000, length = 0x006000

RAML4L5L6L7 是数据空间定义成      : origin = 0x00E000, length = 0x002000

现在发现这个程序烧写在部分板子中是能正常运行的(观察中断 toggle的呼吸灯),但是有些板子中,上电后怎么都不能正常运行(呼吸灯不闪),连上仿真器能看到是进了illegal_isr了,有些板子用硬件狗TPS3828-33DBVT复位多次后,程序又能正常运行了,开始以为是硬件电路的问题。

但是我更改上面程序空间和数据空间的分配后,不能正常的板子也可以一上电就能跑起来,但是另一些本来好着的板子又不能运行了,这样感觉好像是cmd的问题,我查看map,.txt 等分配都是没有超范围的。请专家帮我分析分析,万分感激!

我上传了整个工程,请大家帮我看看,谢谢!

user3786970:

回复 Eric Ma:

你好,我还是有个问题,在我另个程序中,定时中断里面运行的子函数比较多,我把所有调用的子函数包括中断程序本身都搬移到ram中,发现和把.txt全部搬移到ram中相比,运行时间还是长了一些,从之前的66us增加到了90us,我想问一下,这个是不是有什么地方我没有写好,还有没有提升的空间?

程序很短,把flash的程序全部搬移到ram中运行。

.stack : > RAMM0 PAGE = 1
.ebss : > RAML4L5L6L7 PAGE = 1
.esysmem : > RAMM1 PAGE = 1

.text : LOAD = FLASHA, PAGE = 0  
RUN = RAM_L0L1L2L3, PAGE = 0
LOAD_START(_text_loadstart),
RUN_START(_text_runstart),
SIZE(_text_size)

上面这个RAM_L0L1L2L3是程序空间,定义成 : origin = 0x008000, length = 0x006000

RAML4L5L6L7 是数据空间定义成      : origin = 0x00E000, length = 0x002000

现在发现这个程序烧写在部分板子中是能正常运行的(观察中断 toggle的呼吸灯),但是有些板子中,上电后怎么都不能正常运行(呼吸灯不闪),连上仿真器能看到是进了illegal_isr了,有些板子用硬件狗TPS3828-33DBVT复位多次后,程序又能正常运行了,开始以为是硬件电路的问题。

但是我更改上面程序空间和数据空间的分配后,不能正常的板子也可以一上电就能跑起来,但是另一些本来好着的板子又不能运行了,这样感觉好像是cmd的问题,我查看map,.txt 等分配都是没有超范围的。请专家帮我分析分析,万分感激!

我上传了整个工程,请大家帮我看看,谢谢!

Eric Ma:

回复 user3786970:

运行时间你测的是定时中断那个函数的吗?

我的理解:

如果你要把定时中断的函数都放在RAM中,包括调用的子函数。那么应该如下设置

Timer0 ISR{

调用A函数;

调用B函数;

…}

那么就要通过

#pragma CODE_SECTION(timer_isr, "ramfuncs");

#pragma CODE_SECTION(A "ramfuncs");

#pragma CODE_SECTION(B,"ramfuncs");

把这些函数映射到RAM。调用前记得MEMORY COPY。

如此即可。

你可以单独,看反汇编,从而看到代码是跑在flash还是RAM。

Eric

程序很短,把flash的程序全部搬移到ram中运行。

.stack : > RAMM0 PAGE = 1
.ebss : > RAML4L5L6L7 PAGE = 1
.esysmem : > RAMM1 PAGE = 1

.text : LOAD = FLASHA, PAGE = 0  
RUN = RAM_L0L1L2L3, PAGE = 0
LOAD_START(_text_loadstart),
RUN_START(_text_runstart),
SIZE(_text_size)

上面这个RAM_L0L1L2L3是程序空间,定义成 : origin = 0x008000, length = 0x006000

RAML4L5L6L7 是数据空间定义成      : origin = 0x00E000, length = 0x002000

现在发现这个程序烧写在部分板子中是能正常运行的(观察中断 toggle的呼吸灯),但是有些板子中,上电后怎么都不能正常运行(呼吸灯不闪),连上仿真器能看到是进了illegal_isr了,有些板子用硬件狗TPS3828-33DBVT复位多次后,程序又能正常运行了,开始以为是硬件电路的问题。

但是我更改上面程序空间和数据空间的分配后,不能正常的板子也可以一上电就能跑起来,但是另一些本来好着的板子又不能运行了,这样感觉好像是cmd的问题,我查看map,.txt 等分配都是没有超范围的。请专家帮我分析分析,万分感激!

我上传了整个工程,请大家帮我看看,谢谢!

user3786970:

回复 Eric Ma:

谢谢你的回复,运行时间我测的是整个定时中断函数的时间,从一进中断设个断点,运行到中断最后一句再设一个断点,看这两个断点的clock 计数值来测算时间。

中断程序本身和其调用的所有子函数都用#pragma code_section 放在ramfuncs内,也memory copy了,用反汇编看了,确实是跑在ram中 0x008000到0x00C000内,运行时间确实是长了。

我的ram定义是合起来了,这样应该没问题吧?

RAM_L0L1L2L3: origin = 0x008000, length = 0x004000

ramfuncs : LOAD = FLASHD, RUN = RAM_L0L1L2L3, LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), PAGE = 0

赞(0)
未经允许不得转载:TI中文支持网 » F28335 FLASH全部搬移到ram中运行出现的问题
分享到: 更多 (0)