F280049C: ecc代码调试记录(开启ecc验错功能后)

昨天修改代码和设置以后程序不再出现报错,但是烧录又出现问题了!(土拨鼠尖叫):

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里面慢慢找。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值