各位好,我现在使用2812 在使用memcpy()函数时,我声明了包含string.h 文件,在编译时没有提示出错但在实际上电运行后只有运行到memcpy()被拷贝的文件后就会进入非法中断interrupt void ILLEGAL_ISR(void)中,我现在怀疑是编译时没有把memcpy()函数编译进来,请教memcpy()的原型函数在哪?在使用memcpy()函数时还需要如何处理才能把这个函数真正编译进来?谢谢
Green Deng:
你好,请问你是用的哪个版本的CCS?最新版本的CCS中,memcpy的位置在C:\ti\ccs1010\ccs\tools\compiler\ti-cgt-c2000_20.2.1.LTS\lib\src
一般例程中都有定义过这个函数,我不知道你的工程是完全自己新建的吗?你可以参考一下F2812的官方例程进行修改,例程在这个软件包中:www.ti.com.cn/…/SPRC097
user6432710:
回复 Green Deng:
你好,我的工程建立在CCS3.3但现在用的是ccs10,我看到了memcyp()函数原型我也定义包含了string.h了,但程序走到被copy的函数时就会跑飞。如何可以看到程序是否正确的被拷贝到RAM中呢?现在程序如果不拷贝在flash中运行无问题。谢谢!
Green Deng:
回复 user6432710:
现在你的程序是运行到memcpy()的时候会跳转到非法中断?如果是的话就不是搬移到ram是否成功的问题了,正常如果搬移失败,应该是运行到类似delay_us这样的函数才会跳转到非法中断。
会不会是你搬移的数据太大导致memcpy函数出错?
user6432710:
回复 Green Deng:
你好,我发现copy ramfun 函数后编译出来的汇编是错误的,定位地址也没有重叠啊,怎么会汇编和C语言对应不上呢?
Green Deng:
回复 user6432710:
方便详细描述一下你的问题吗?因为F2812这款芯片年代挺久了,很长时间没接触过,而且问这方面问题的用户也不多,我不是很熟悉。
user6432710:
回复 Green Deng:
您有电话或者邮件么?这样请教沟通可以快些!
Green Deng:
回复 user6432710:
目前仅支持论坛上沟通,其他渠道非官方了
user6432710:
回复 Green Deng:
你好,我把初始化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后汇编语句就错了混乱了,什么原因会造成这种错误,目前地址没有重叠。
user6432710:
回复 Green Deng:
你好,我现在用的是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 中汇编就是错误的,地址没有重叠,请帮忙看看有什么原因会这样,谢谢!
Green Deng:
回复 user6432710:
内存中的0x3F9915区域受到代码安全模块的保护,如果CSM没有解锁,读回的就是全0x0000。如果执行此操作,将导致ITRAP0。
即使未设置密码,也会出现这种情况,但要禁用CSM,只需读取flash中地址为0x3F7FF8–0x3F7FFF的密码位置