昨天修改代码和设置以后程序不再出现报错,但是烧录又出现问题了!(土拨鼠尖叫):
C28xx_CPU1: File Loader: Verification failed: Attempted to write past the end of memory at 0x1080600@Program C28xx_CPU1: GEL: File: D:\eve_ccs\local_ecc\Debug\local_ecc.out: Load failed.
针对这个问题我在TI E2E上查到了一个已解决的方案:
提到需要关闭自动生成ECC的功能,然后创建以ufsettings为后缀的文件。 我的代码完成第一步后就不出现报错了。选择debug——>debug configurations——>Target——>Flash Settings——>取消勾选AutoEccGeneration功能。因为第二项那个文件后缀在我的debug文件夹中并没有对应后缀的文件,所以我认为我使用版本或者驱动板应该不需要这个文件。
这个时候报错消失,但是程序烧录又出现了中断的问题:Break at address "0x3fbd46" with no debug information available, or outside of program code.这个问题之前使用例程的时候也遇到过,在之前的bolg中曾经记录过解决方法,添加memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);语句来使得程序能够正确运行
CCS调试遇到:Break at address “0x3fbd92” with no debug information available...问题-优快云博客 z文章浏览阅读363次,点赞3次,收藏5次。因为老头懒得下载control suite,就想直接让我们给他一个能运行的project,所以我先得把例程里面涉及到的文件都给复制到了project里面。开始查阅资料,有说是因为没有选择flash运行导致的,因为在TI提供的例程里,在烧录的时候显示的是FLASH和RAM,但是在我建立的新project里面,它显示的是Debug和Release。然后找到Sysctrl.c文件,在我使用的例程里面它叫sysctl.c,感觉就是找关于system control的文件,把memcpy函数添加进去。https://blog.youkuaiyun.com/crrrd/article/details/144886476?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522cd54aa7ea962646ed019f758179c5226%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=cd54aa7ea962646ed019f758179c5226&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-144886476-null-null.142^v101^control&utm_term=CCS%E8%B0%83%E8%AF%95%E9%81%87%E5%88%B0%EF%BC%9ABreak%20at%20address%20%E2%80%9C0x3fbd92%E2%80%9D%20with%20no%20debug%20information%20available...%E9%97%AE%E9%A2%98&spm=1018.2226.3001.4187
所以我认为出现这个问题仍然是由于FLASH中的内容copy到RAM中出现的问题,对代码进行逐行调试,发现是Decice_init()函数出现的问题,进一步查找将问题定位在了SysCtl_setClock(DEVICE_SETCLOCK_CFG);位置。并且验证了这段函数在执行memcpy函数时是可以正确的将对应flash扇区的数据拷贝到RAM的。
void Device_init(void)
{
//
// Disable the watchdog
//
SysCtl_disableWatchdog();
#ifdef _FLASH
//
// Copy time critical code and flash setup code to RAM. This includes the
// following functions: InitFlash();
//
// The RamfuncsLoadStart, RamfuncsLoadSize, and RamfuncsRunStart symbols
// are created by the linker. Refer to the device .cmd file.
//
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
//printf("Ramfuncs copied successfully.\n");
//
// Call Flash Initialization to setup flash waitstates. This function must
// reside in RAM.
//
Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, DEVICE_FLASH_WAITSTATES);
#endif
//
// Set up PLL control and clock dividers
//
SysCtl_setClock(DEVICE_SETCLOCK_CFG);
......
进入该函数,一直查找最终定位到问题根源:
SysCtl_setClock(uint32_t config)
{
......
else
{
//
// Configure oscillator source
//
oscSource = config & SYSCTL_OSCSRC_M;
SysCtl_selectOscSource(oscSource);
......
SysCtl_selectOscSource(uint32_t oscSource)
{
......
case SYSCTL_OSCSRC_XTAL:
//
// Select XTAL in crystal mode and wait for it to power up
//
//printf("Selected XTAL.\n");
SysCtl_selectXTAL();
break;
......
void
SysCtl_selectXTAL(void)
{
......
//
// Wait for the X1 clock to saturate
//
//printf("Waiting for X1 clock to saturate...\n");
SysCtl_pollX1Counter();
......
这个函数里面还存在一个memcpy,我怀疑在这里出现break是因为flash的数据之前已经被复制到了RAM中,并且由于flash中的数据没有发现变化,可能再次复制的时候出现了问题,被认为是重复调用(这应该是和关闭了自动生成ECC功能有关)。注释掉这行代码后,程序可以正常运行,进行flash擦除和写入的操作。
SysCtl_pollX1Counter(void)
{
memcpy((void*)&RamfuncsRunStart, (void*)&RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
uint16_t loopCount = 0U;
......
昨天定位问题折腾了半天,今天赶紧来记录一下,但是现在还没弄明白怎么看ecc修正的结果。。。资料太少了,只能在TI里面慢慢找。