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.
程序很短,把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 等分配都是没有超范围的。请专家帮我分析分析,万分感激!
我上传了整个工程,请大家帮我看看,谢谢!
你好,我还是有个问题,在我另个程序中,定时中断里面运行的子函数比较多,我把所有调用的子函数包括中断程序本身都搬移到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