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.

关于memcpy函数问题

各位好,我现在使用2812 在使用memcpy()函数时,我声明了包含string.h 文件,在编译时没有提示出错但在实际上电运行后只有运行到memcpy()被拷贝的文件后就会进入非法中断interrupt void ILLEGAL_ISR(void)中,我现在怀疑是编译时没有把memcpy()函数编译进来,请教memcpy()的原型函数在哪?在使用memcpy()函数时还需要如何处理才能把这个函数真正编译进来?谢谢

  • 你好,请问你是用的哪个版本的CCS?最新版本的CCS中,memcpy的位置在C:\ti\ccs1010\ccs\tools\compiler\ti-cgt-c2000_20.2.1.LTS\lib\src
    一般例程中都有定义过这个函数,我不知道你的工程是完全自己新建的吗?你可以参考一下F2812的官方例程进行修改,例程在这个软件包中:www.ti.com.cn/.../SPRC097
  • 你好,我的工程建立在CCS3.3但现在用的是ccs10,我看到了memcyp()函数原型我也定义包含了string.h了,但程序走到被copy的函数时就会跑飞。如何可以看到程序是否正确的被拷贝到RAM中呢?现在程序如果不拷贝在flash中运行无问题。谢谢!

  • 现在你的程序是运行到memcpy()的时候会跳转到非法中断?如果是的话就不是搬移到ram是否成功的问题了,正常如果搬移失败,应该是运行到类似delay_us这样的函数才会跳转到非法中断。
    会不会是你搬移的数据太大导致memcpy函数出错?
  • 你好,我发现copy ramfun 函数后编译出来的汇编是错误的,定位地址也没有重叠啊,怎么会汇编和C语言对应不上呢?

  • 方便详细描述一下你的问题吗?因为F2812这款芯片年代挺久了,很长时间没接触过,而且问这方面问题的用户也不多,我不是很熟悉。
  • 您有电话或者邮件么?这样请教沟通可以快些!
  • 目前仅支持论坛上沟通,其他渠道非官方了
  • 你好,我把初始化flash函数从 flash CD 3ee815地址 通过memcpy()函数搬运到ram 中运行 ,运行开始地址是3f9915 。编译后map如下:

    FLASH_SET_FUNCS

    *          0    003ee815    00000017     RUN ADDR = 003f9915

                     003ee815    00000017     DSP281x_SysCtrl.obj (FLASH_SET_FUNCS)

    我查看了在3ee815地址上汇编后的语句是正确的,但搬运到ram后汇编语句就错了混乱了,什么原因会造成这种错误,目前地址没有重叠。

  • 你好,我现在用的是2812 ccs10.0   调试中搬运程序一直有问题,我的定义如下:

     PRAMH0      : origin = 0x3F8000, length = 0x002000  /*used as program segment*/  page0

     FLASH_SET_FUNCS  : LOAD = FLASHCD, PAGE = 0
            RUN = PRAMH0 ,    PAGE = 0

            RUN_START(_FLASH_SET_FUNCS_runstart),
            LOAD_START(_FLASH_SET_FUNCS_loadstart),
            LOAD_END(_FLASH_SET_FUNCS_loadend)

    memcpy(&FLASH_SET_FUNCS_runstart, &FLASH_SET_FUNCS_loadstart,
        &FLASH_SET_FUNCS_loadend - &FLASH_SET_FUNCS_loadstart);

    编译后map如下:

    FLASH_SET_FUNCS
    *          0    003ec000    00000017     RUN ADDR = 003f8000
                      003ec000    00000017     DSP281x_SysCtrl.obj (FLASH_SET_FUNCS)

    flash 中地址 003ec000 中汇编是正确的但到ram地址003f8000 中汇编就是错误的,地址没有重叠,请帮忙看看有什么原因会这样,谢谢!

  • 内存中的0x3F9915区域受到代码安全模块的保护,如果CSM没有解锁,读回的就是全0x0000。如果执行此操作,将导致ITRAP0。
    即使未设置密码,也会出现这种情况,但要禁用CSM,只需读取flash中地址为0x3F7FF8–0x3F7FFF的密码位置
  • 你好,我使用的是2812应该是未设置CSM保护。关于csm的信息在map中如下:

    MEMORY CONFIGURATION

             name            origin    length      used     unused   attr    fill
    ----------------------  --------  ---------  --------  --------  ----  --------
    PAGE 0:
      PASSWDS               003f7ff8   00000008  00000000  00000008  RWIX
    PAGE 1: 

       CSM_PWL               003f7ff8   00000008  00000008  00000000  RWIX

    CsmPwlFile
    *          1    003f7ff8    00000008     UNINITIALIZED
                      003f7ff8    00000008     DSP281x_GlobalVariableDefs.obj (CsmPwlFile)  

    在程序中关于csm的如下:

    #pragma DATA_SECTION(CsmRegs,"CsmRegsFile");
    volatile struct CSM_REGS CsmRegs = 
     { 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
       0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x0000 };

    //----------------------------------------
    #pragma DATA_SECTION(CsmPwl,"CsmPwlFile");
    volatile struct CSM_PWL CsmPwl;

    请问如何能禁止scm保护?

    另一个问题是,我上面的同样程序使用emecyp()搬运到RAML0L1中就不会出现错误,可以正常执行。如果你说PRAMH0被保护写不进去,但我看到PRAMH0地址里也有代码,只是不是搬运过来的正确代码但也不是00。?

    FLASH_SET_FUNCS  : LOAD = FLASHCD, PAGE = 0
            RUN = RAML0L1 ,    PAGE = 0

            RUN_START(_FLASH_SET_FUNCS_runstart),
            LOAD_START(_FLASH_SET_FUNCS_loadstart),
            LOAD_END(_FLASH_SET_FUNCS_loadend)

  • 你好,目前csm区域的代码如下:

    3f7ff8:   FFFF        ITRAP1      

    3f7ff9:   FFFF        ITRAP1      

    3f7ffa:   FFFF        ITRAP1      

    3f7ffb:   FFFF        ITRAP1      

    3f7ffc:   FFFF        ITRAP1      

    3f7ffd:   FFFF        ITRAP1      

    3f7ffe:   FFFF        ITRAP1      

    3f7fff:   FFFF        ITRAP1      

    是不是这种状态代表CSM没有锁定保护状态?

  • 你好,下面是memcyp()函数的汇编:

    memcpy(&FLASH_SET_FUNCS_runstart, &FLASH_SET_FUNCS_loadstart,
    3eeaa7:   8F7EC000    MOVL         XAR5, #0x3ec000
    3eeaa9:   8F3EC017    MOVL         XAR4, #0x3ec017
    3eeaab:   A0A9        MOVL         @ACC, XAR5
    3eeaac:   564100A4    SUBL         @XAR4, ACC
    3eeaae:   A8A9        MOVL         @ACC, XAR4
    3eeaaf:   8F3F8000    MOVL         XAR4, #0x3f8000
    3eeab1:   767EEB4B    LCR          memcpy

    下面是程序代码和map信息

     FLASH_SET_FUNCS  : LOAD = FLASHCD, PAGE = 0
            RUN =  PRAMH0 ,    PAGE = 0

            RUN_START(_FLASH_SET_FUNCS_runstart),
            LOAD_START(_FLASH_SET_FUNCS_loadstart),
            LOAD_END(_FLASH_SET_FUNCS_loadend)

    FLASH_SET_FUNCS
    *          0    003ec000    00000017     RUN ADDR = 003f8000
                      003ec000    00000017     DSP281x_SysCtrl.obj (FLASH_SET_FUNCS)

    现在看地址定位和程序及map都没错啊?但为什么PRAMH0里面就拷贝不进去程序呢?

  • 你好,在编译过程中默认调用memcyp()函数在哪里?你们有这个函数的原型么?我看到memcyp()函数汇编如下:

            __memcpy:
    3eeb80:   5200        CMPB         AL, #0x0
    3eeb81:   80A4        MOVZ         AR7, @AR4
    3eeb82:   EC07        SBF          7, EQ
    3eeb83:   9CFF        ADDB         AL, #-1
    3eeb84:   88A9        MOVZ         AR6, @AL
    3eeb85:   9285        MOV          AL, *XAR5++
    3eeb86:   9687        MOV          *XAR7++, AL
    3eeb87:   000EFFFE    BANZ         -2,AR6--
    3eeb89:   0006        LRETR       

    这个汇编对应的c函数在哪里可以找到?谢谢

  • 确实密码区为全F的话是没有加密状态。因为太久没用F2812了,我刚看了一下F2812的例程,例程中内存复制用的是MemCopy函数,具体的你可以参考:
    C:\tidcs\c28\DSP281x\v120\DSP281x_examples_ccsv4\flash
    memcpy函数的代码我在第一条回复中已经给出:C:\ti\ccs1010\ccs\tools\compiler\ti-cgt-c2000_20.2.1.LTS\lib\src
  • 你好,是的您上次回答后我知道,memcpy函数的代码我在:C:\ti\ccs1010\ccs\tools\compiler\ti-cgt-c2000_20.2.1.LTS\lib\src,我已经把这路径包含连接中了,但我看默认状态下编译成的memcyp函数的汇编和C:\ti\ccs1010\ccs\tools\compiler\ti-cgt-c2000_20.2.1.LTS\lib\src里memcyp函数的汇编是不一样的,说明函数的原型也不同。因为默认状态下编译后memcyp搬运到H0 ram的函数会出错但如果搬运到其他ram里就不会错,我把C:\ti\ccs1010\ccs\tools\compiler\ti-cgt-c2000_20.2.1.LTS\lib\src 里德memcyp()函数源代码拷贝到我自己的工程文件中改了名字编译再使用发现可以将函数正常搬运到H0 ram中。当我通过特殊路径强制指定mencyp路径时编译会出下面的错误提示:#10056 symbol "_memcpy" redefined: first defined in "D:/DSP_CYC/CYC_DSP/hvac2801/Debug/source/DSP281x_Adc.obj"; redefined in "D:/DSP_CYC/CYC_DSP/hvac2801/Debug/source/adc_covnert.obj"

    所以我的问题是:1、默认状态下mencyp函数定义在哪?能不能看到这个函数的定义和原型

                                 2、如何设置能保证编译器会使用到C:\ti\ccs1010\ccs\tools\compiler\ti-cgt-c2000_20.2.1.LTS\lib\src中的memcyp函数。

                                 3、默认状态使用的memcyp函数为什么针对不同地址的ram作用结果是不同的?

  • 能否提供TI DSP 技术支持电话或者邮箱,我目前在使用 2812过程中遇到了很难解决的问题,谢谢!

  • F2812芯片确实现在用的不多。TI这边暂时没有提供电话或者邮箱渠道的技术支持,我这边建议你去英文E2E论坛上发帖咨询相关问题,E2E上会有产品线上的工程师为你解答:
    e2e.ti.com/.../171