嗨对话框
我将编写好的程序进行调试,编译好的文件大小如下:
程序大小:代码= 16556 RO-数据= 1600 RW-数据= 64 ZI-数据= 10284
则fromelf:创建hex文件...
点击KEIL调试按钮后提示“0X .....”指令引用的“0X .....”内存,该内存不能为读。
将部分程序屏蔽掉,大小如下
程序大小:代码= 15796 RO-数据= 1568 RW-数据= 64 ZI-数据= 10248
则fromelf:创建hex文件...
点调试按钮程序就可以正常下载调试运行,请问是内存超过了芯片定义范围引起的么?
针对中内存定义:
开始尺寸大小启动
IROM1 0x20000000 0x5000处IRAM1 0x20005100 0x5600
IROM2 0x21000 0x13F00 IRAM2为0x8000为0x1000
设备:
暂时没看出什么问题,如果内存超过了芯片定义范围,一般编译的时候就会报错了。
另外,你有试过,直接用smartsnippets的引导模式直接下你编译后的箱子吗?这样可以确认是不是KEIL的问题...
使用smartsnippets烧录到外部闪存中也是不能运行,出现的问题点很奇怪,就是点击进入调试还没有运行,KEIL就出错了,点击错误提示框就强行退出了,比如我添加官方的文件spi.cspi_flash.c或者其他的app_sec.c等文件并编译以后就不行,感觉是代码量不能超过16000,去掉这些文件后,代码量小点就正常了
如果方便的话,你能把出错情况下的箱子文件,生成的地图文件,以及用到的scatterfile文件(不确定你用的是不是默认的)传上来吗?
就是这个工程文件,屏蔽掉一些文件就能进入调试
你可以比一下,之前不行是因为SECTOR_ERASE_WRITE这个函数耗时比较长,看门狗直接启动了。
你加了这个函数以后是不是也是在下载到公羊的时候就出错了,我之前也是屏蔽这个函数就行,但是搞不懂的是看门狗不是应该在程序下载到公羊运行之后才起作用么,只是把程序下载到公羊还没运行就死掉了,还是说KEIL下载的过程中,看门狗是一直保持运行的刚才又尝试出一个奇怪的现象:spi_flash_test()这个函数并没有在任何地方调用的情况下,把它定义出来之后也出相同问题。
之前讲错了在。函数空隙SECTOR_ERASE_WRITE(无效)里面设置了局部变量的数组,4K,uint8_t SPI_FLASH_SECTOR_BUF [4096]。
你单步跟的时候,走到spi_flash_read_data函数里面
spi_cs_low();// CS拉低这里的pi_driver_cs_pad.port,spi_driver_cs_pad.pin值还是对的,P0_3
.................
spi_cs_high();//pi_driver_cs_pad.port,spi_driver_cs_pad.pin,这里已经不对了,被你上面的rd_data_ptr开始的数组内容覆盖了。
不要在单个函数的栈上分配这么大的数组。如果需要,建议在scatterfile里面事先定义好存储空间。
等下,你还能进单步调试.....?情况看来和我这边不一样,我是无法调试。你一直都能进入调试状态么,你的KEIL版本是多少
打开这个相同路径的工程文件,这个是在原来能使用的基础上添加了app_sec.c,并且在da14580_config.h中的#define CFG_APP_SEC也出相同错误
你用我给你的工程(已经把看门狗关掉,打开DEVELOPMENT_DEBUG),然后把SECTOR_ERASE_WRITE加回去,设置断点,就可以单步走。
我尝试过了你修改过的这个工程文件,但进不了调试的错误还是频繁出现,我考虑换台电脑装莱凯勒试试。后面发给你这个工程呢,它没有使用这么长的函数,我只是在原来能使用的基础上添加了app_sec.c和app_sec_task.c并且在da14580_config.h中的#define CFG_APP_SEC也出相同错误,也是观赏犬引起的么,
还有就是怎样在scatterfile中定义存储空间。
看了你的代码,如果P02是高电平正常。如果是低电平,就会出错,停在set_pad_functions函数里面的最后设中断输入的地方。和你配置的这句有关SetWord16(GPIO_IRQ2_IN_SEL_REG,0×0005);//选择IRQ2中断的I / O口,转十进制数和寄存器表中对应
谢谢,我发现问题了,之前进不了调试是莱凯勒软件的问题,我把软件版本升级到5.18之后就不报错了,至于CPU停止工作我再调试修改下,应该可以的