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.

c6701片外sram仿真



通过cmd文件将text段分配在片内程序存储器中,其他段分配在ce3连接的512k的32位sram中,进行仿真时无法将函数指针赋值给片外sram中的变量,导致程序跑飞

  • yan zou 说:
    text段分配在片内程序存储器中,其他段分配在ce3连接的512k的32位sram中,进行仿真时无法将函数指针赋值给片外sram中的变量,导致程序跑飞

    text段在片内,其它在CE3,那么程序代码在片内,其它数据等段在片外,怎么把函数指针赋值给片外呢?片外又没有代码,函数指针的赋值不是代码,跑飞不是很自然的事么。

  • 是不是把片内程序存储器内的代码都放在片外sram就可以了,由于我的sram是连接在ce3上,是不是有必要将内部程序存储器配置为cache模式。

  • 没有这个限制。

    cmd怎么写的?代码是怎么访问的?

  • 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中,程序运行正常!

  • 等等,你说的仿真是软件仿真(simulator),还是在板子上用仿真器调试?

  • 在板子上用仿真器调试!

  • 程序不正常是什么情况?中断跑飞,还是主程序不能进入main?

  • 可以正常进入main函数,但是如果使用CE3,则函数指针指向0x03030303地址,用DMEM的时候,就可以指向正确地址。截图:

    错误:

    正确:

  • 工程里有用到中断吗?是不是在那个函数里配置使能中断了?

    把那个函数的内容也贴上来看一下。对了上面错误的图的函数地址是奇数,应该是4字节对齐的才对。从map文件里看这个函数的地址是多少呢?分辨是编译时就错了,还是调用时出的错。

  • 函数为了测试外部RAM特意写的,用到函数指针。里没有使用中断,编译完的地址是对的,应该是调用时出错。

    编译完地址:

  • 几点建议:

    #1. 现在代码都是放到CE3,且能进入main,说明本身是能在CE3运行的。

    #2. 上面是把一个函数的地址取出来赋值给cf,是取值就错了,这里还没并没有运行是吧。可以单步跟踪一下汇编代码以及CPU的寄存器,看是在从取值到赋值过程中,寄存器的值在哪一步出错了。

    #3. 如果是想测试SRAM,可以做个内存测试程序运行在片上RAM,切换不同的数据模式读写SRAM做校验。

  • chip1553IE在运行前值就错了,从汇编代码里没看出有什么问题:

    但是CPU寄存器A9的值是0x03030303,不知道是不是有问题:

    另外,之前已经用程序测试过片外SRAM的读写性能,没有问题!

  • 不是说看汇编代码有没有问题,这是编译器产生的,能有什么问题,而是根据汇编代码一步步看它操作的寄存器在哪一步把这个不对的值取进来了,因为光看C代码一条语句就过去了,中间可能经过好多条汇编,通过汇编代码的单步跟踪才能发现更多细节。

    上面的图在调用时是将*SP[1]的值取出来给B4了,那么这个值应该就是从SP堆栈取出来的,那为什么这时堆栈里的值是这个,什么时候存进来的,就从从前面一点开始跟踪,你也看到A9是这个值,但现在这个值不是从A9直接赋值过来的,从汇编里看没有这样的代码,但是有一个A9赋值到*A5的过程,你可以前后对比一个*A5与后面的*SP[1]是不是同一个地址,如果是,那么就显然这个值是从A9通过堆栈传过来的。如果前面假设是对的,那么为什么会这样的?应该是堆栈溢出了,看一下内存栈顶是不是被改写过了,或者就在当前代码位看SP是不是超出分配的范围了。

    简单一点,把.stack改大点试试。

  • A9的值,是从*A5[0]来的,*A5地址:

    地址对应的内存的值:

  • 对了,.far改为片内DMEM,其它都不变,值就是正确的

  • #1. 看一下0x03030303这个地方具体是个啥?

    #2. 在CCS下载程序后,不运行,地址0x03017EA8的值是多少?

  • 0x03030303处:

    ccs下载未运行时,0x03017ea8的值就是0x03030303:

  • 下载后就是这个值,那是编译链接时就有问题了?

    你这部分代码是怎么实现的?是C++还是函数结构体?本身这个值又应该是多少?

    .far段是数据段,按绝对地址访问的,放哪应该没有关系的啊.

  • 代码是函数结构体,这个值应该是指向一个函数的指针

    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);/**<中断服务函数,提供给用户挂接中断*/
    };

    正确的值:

  • 上周问题仍未解决,请帮忙确认!见上贴回复!