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.
各位好,我现在使用2812 在使用memcpy()函数时,我声明了包含string.h 文件,在编译时没有提示出错但在实际上电运行后只有运行到memcpy()被拷贝的文件后就会进入非法中断interrupt void ILLEGAL_ISR(void)中,我现在怀疑是编译时没有把memcpy()函数编译进来,请教memcpy()的原型函数在哪?在使用memcpy()函数时还需要如何处理才能把这个函数真正编译进来?谢谢
你好,我的工程建立在CCS3.3但现在用的是ccs10,我看到了memcyp()函数原型我也定义包含了string.h了,但程序走到被copy的函数时就会跑飞。如何可以看到程序是否正确的被拷贝到RAM中呢?现在程序如果不拷贝在flash中运行无问题。谢谢!
你好,我把初始化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 中汇编就是错误的,地址没有重叠,请帮忙看看有什么原因会这样,谢谢!
你好,我使用的是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函数在哪里可以找到?谢谢
你好,是的您上次回答后我知道,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作用结果是不同的?