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.

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 等分配都是没有超范围的。请专家帮我分析分析,万分感激!

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

  • 看你的程序,没有调用InitFlash();初始化flash。

    还有如果.text段是编译后把所有代码放在这个段中,即从main的第一个代码就应该是执行.text段了,所以按道理你在main的第一条语句你就必须调用memcopy把代码复制到RAM中,这样子才不会跑飞。

    但是我还是觉得你程序中的CMD定义不好,不必把所有的代码否复制到RAM,尤其是把.text都复制到RAM。你还是按照TI的flash例程去做吧.

    Eric

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

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

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

    我的理解:

    如果你要把定时中断的函数都放在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

  • 谢谢你的回复,运行时间我测的是整个定时中断函数的时间,从一进中断设个断点,运行到中断最后一句再设一个断点,看这两个断点的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