通过cmd文件将text段分配在片内程序存储器中,其他段分配在ce3连接的512k的32位sram中,进行仿真时无法将函数指针赋值给片外sram中的变量,导致程序跑飞
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.
通过cmd文件将text段分配在片内程序存储器中,其他段分配在ce3连接的512k的32位sram中,进行仿真时无法将函数指针赋值给片外sram中的变量,导致程序跑飞
cmd代码如下:
MEMORY
{
VECS: o = 00000000h l = 00000200h /*Internal PROG RAM*/
boot_load: o = 00000200h l = 00000200h
PMEM: o = 00000400h l = 0000FC00h /*Internal PROG RAM*/
DMEM: o = 80000000h l = 0000FA00h /*Internal DATA RAM*/
CE1BOOT: o = 01400200h l = 00000200h
CE1VECS: o = 01400000h l = 00000200h /*CE1:512K,FLASH*/
CE1PMEM: o = 01400400h l = 0000FA00h
CE1init: o = 01410000h l = 003F0000h
CE0: o = 00400000h l = 00C00000h /*CE0:12M*/
CE2: o = 02000000h l = 01000000h /*CE2:16M,SDRAM*/
/*CE3: o = 03000000h l = 00080000h*/ /*CE3:512K*/
CE3VECS: o = 03000000h l = 00000200h /*CE1:512K,FLASH*/
CE3PMEM: o = 03000200h l = 0000FC00h
CE3DMEM: o = 0300FE00h l = 00070200h
}
SECTIONS
{
.vectors> CE3VECS
.text > CE3PMEM
.pinit > CE3DMEM
.cinit > CE3DMEM
.data > CE3DMEM
.switch > CE3DMEM
.const > CE3DMEM
.econst > CE3DMEM
.cio > CE3DMEM
.stack > CE3DMEM
.bss > CE3DMEM
.ebss > CE3DMEM
.sysmem > CE3DMEM
.far > CE3DMEM
.csldata > CE3DMEM
}
刚才验证了一下,都放在CE3片外RAM中,问题依旧!但是,如果将.far段放在DMEM中,.text和.vectors段放在PMEM中,程序运行正常!
不是说看汇编代码有没有问题,这是编译器产生的,能有什么问题,而是根据汇编代码一步步看它操作的寄存器在哪一步把这个不对的值取进来了,因为光看C代码一条语句就过去了,中间可能经过好多条汇编,通过汇编代码的单步跟踪才能发现更多细节。
上面的图在调用时是将*SP[1]的值取出来给B4了,那么这个值应该就是从SP堆栈取出来的,那为什么这时堆栈里的值是这个,什么时候存进来的,就从从前面一点开始跟踪,你也看到A9是这个值,但现在这个值不是从A9直接赋值过来的,从汇编里看没有这样的代码,但是有一个A9赋值到*A5的过程,你可以前后对比一个*A5与后面的*SP[1]是不是同一个地址,如果是,那么就显然这个值是从A9通过堆栈传过来的。如果前面假设是对的,那么为什么会这样的?应该是堆栈溢出了,看一下内存栈顶是不是被改写过了,或者就在当前代码位看SP是不是超出分配的范围了。
简单一点,把.stack改大点试试。
代码是函数结构体,这个值应该是指向一个函数的指针
chip1553IE 是一个全局变量:
CHIP1553_CPU32TO16 chip1553IE ={ { &chip1553CPU32to16Funcs,0x00500000,0x00504000, 0x18, 4096 } };
主函数:
void main()
{
while(1)
{
CHIP1553I c=chip1553IE.parent;
CHIP1553I_FUNCS* cf=c.funcsI;
UINT regBase=c._regBase;
UINT memBase=c._memBase;
UINT regWordLen=c._regWordLen;
UINT memWordLen=c._memWordLen;
}
}
结构体:
typedef struct chip1553i_funcs CHIP1553I_FUNCS;
typedef struct chip1553i
{
CHIP1553I_FUNCS* funcsI; /**< 接口函数(用于多态)*/
UINT _regBase; /**< 在CPU寻址空间的1553芯片寄存器基地址*/
UINT _memBase; /**< 在CPU寻址空间的1553芯片RAM基地址*/
UINT _regWordLen; /**< 寄存器的有效范围,以字为单位*/
UINT _memWordLen; /**< Mem的有效范围,以字为单位*/
}CHIP1553I;
struct chip1553i_funcs
{
STATUS (*initial)(CHIP1553I* chip);
STATUS (*regRead)(CHIP1553I* chip, UINT offset, USHORT* outData);
STATUS (*regWrite)(CHIP1553I* chip, UINT offset, USHORT inData);
UINT (*memRead)(CHIP1553I* chip, UINT offset, USHORT* outData, UINT maxWords);
UINT (*memWrite)(CHIP1553I* chip, UINT offset, USHORT* inData, UINT count);
UINT (*memWriteSameWord)(CHIP1553I* chip, UINT offset, UINT count, USHORT wordVal);
void (*isr)(CHIP1553I* chip);/**<中断服务函数,提供给用户挂接中断*/
};
正确的值: