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.

[参考译文] CCS/MSP-EXP432P401R:无法在"...处找到源文件 "错误

Guru**** 2546020 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/580917/ccs-msp-exp432p401r-can-t-find-a-source-file-at-error

部件号:MSP-EXP432P401R

工具/软件:Code Composer Studio

我有一个模块化数学模型,我可以轻松地扩展和收缩。 我的模块中最多有6个模块的代码刷新没有问题,但是当我尝试存储更多内容时,我收到一个运行时错误:它显示:

在"C:\space\msp432-driverlib\build\MSP432P4xx/flash.c"中找不到源文件
找到文件或编辑源查找路径以包括其位置。

在最大代码大小的情况下,我使用闪存的59 % 和SRAM的49 %。

非常感谢为我指明正确方向的任何帮助。

谢谢!

-Edgar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否直接复制粘贴? 在/flash.c.之前有反斜线和一个正斜杠 如果您右键单击项目,然后单击“属性”->“生成”->“包含”选项,则可能是此正斜杠导致了此问题?

    实际上,公约似乎实际上可能是正斜杠,所以也许正斜杠实际上是要去的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为这是内存分配问题。 看起来我有足够的内存,但我遇到了问题。 在那里,如果我仍然无法找出问题,我会进一步调查并提出更准确的问题。

    谢谢!

    -Edgar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    哦,等待!  好的,我已经看到了,并且知道你要引用的内容(我只是从未注意到最后一个斜杠被颠倒,所以它使我有点失望)。  下面显示的是“Locate File...(查找文件...)”。  您正在尝试逐步执行代码,然后遇到这种情况?

    如果您按“定位文件”按钮,将通过在出现的窗口中导航到driverlib文件夹来选择该文件夹。  我的地址位于:C:\ti\tirrex-content\simplelink_msp432_sdk_1_30_00_40\sources\ti\devices\msp432p4xx\driverlib (当我第一次按下按钮时,我的Library文件夹打开到一个TI文件夹,这让人感到困惑,而不是正确的文件夹。  转至“计算机”-> C:/下的TI文件夹

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢,是的。 这把我带到了正确的位置。 但是,我仍然需要弄清楚为什么我在flash.c文件中被挂断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否详细解释一下您在这种情况下所说的"挂断"是什么意思?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,John:

    当然可以。

    当我挂机时,我在flash.c msp432库源文件中以while循环结束:

    /*而连拍读取尚未完成*/
    While (((FLCTL->RDBRST_CTLSTAT和FLCTL_RDBRST_CTLSTAT_BRST_STAT_MASK)
    != FLCTL_RDBRST_CTLSTAT_BRST_STAT_3)
    {
    __no_operation();
    }
    

    我已经将此记录到我的代码中,它试图在非易失性闪存中存储一些永久信息。 我的代码与msp432库提供的代码示例完全相同。 这里是:

    #define Permanent Information_start 0x0003F000
    
    store_data_in_NV_flash((((uint8_t*)& Permanent Information,Permanent _information_start,256);//存储在flash
    
    中//下面的函数定义:
    
    /*******************************************************************************************************************
    *@fn. store_data_in_NV_flash
    *
    *@brief	此函数将存储在指定源位置中的信息存储在StartflashAddress
    *
    *@param uint8_t *targetLocation -指向数组开始的指针,用于从
    *
    **@param	UINT32_t StartflashAddress -开始地址的数量中检索信息 在闪存中写入
    *
    **@param uint16_t numberOfBtes -要编程到闪存的所需字节数
    *
    *@return N/A
    *
    *************************************************************************************************** /
    void store_data_in_NV_flash(uint8_t *sourceLocation, UINT32_t flashStartAddress, uint16_t numberOfBytes){
    
    
    	MAP_Flashctl_enableWordProgramming ( flash_eded_write_mode );MAP_Flashctl_setWaitState(flash_Bank1,2)
    
    	;
    
    
    /* Unprotecting Info Bank 1, Sector 31 */
    MAP_Flashctl_unprotectSector (FLASH_MAIN_MEMORY_SPACE_BANK1,FLASH_SECTOR31);
    
    /*正在尝试擦除扇区。 在此函数中,API将
    自动尝试清除最大尝试次数。 */
    MAP_FlashCtl_eraseSector(flashStartAddress);
    
    
    
    /*正在尝试对内存进行编程。 在此函数中,API将
    自动尝试设定最大尝试次数。 如果失败,
    在无限循环内陷印*/
    MAP_Flashctl_programMemory(sourceLocation,
    (void*) flashStartAddress, numberOfBytes);
    
    MAP_FlashCTL_ProtectSector(FLASH_MAIN_MEMORY_SPACE_BANK1,FLASH_SECTOR31);
    } 

    请注意,在我的代码中定义的Permanent information_start位置与在示例中定义的位置相同。 我怀疑我遇到了内存分配问题,这是基于我 的Permanent information_start在内存中的位置,但100 % 不确定。

    如前所述,在我尝试在程序存储器中对较大的数学模型进行编程之前,我对该函数或其他任何功能都没有任何问题(该模型在对微控制器上的整个代码进行初始编程时进行编程)。

    请告诉我,如果这表明您可能会帮助我的一些错误。

    谢谢!

    -Edgar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否参考 了flash_program_memory.c示例?  

    听起来,您是在说,只有当您的信息太大时,程序才会出现问题。  闪存扇区是每个4 KB , 您存储的数据有多大?  ithe flash_mase_erase.c 示例 通过写入8 KB 而不是仅从扇区30开始的4 KB ,将较大的数据大小写入两个扇区(30和31)。)  您是否尝试过将起始地址更改为扇区30并写入8 KB 空间而不是4 KB 空间,如本示例所示?

    注:此命令map_Flashctl_setWaitState(flash_Bank1,2);用于在MCLK高于闪存时允许闪存所需的读/写时间(通过添加等待状态)。   有关规格,请参阅数据表的表5-8。  您可能还需要相应地调用setCoreVoltageLevel()函数。  如果您只设置闪存库1的等待状态,我强烈建议您也添加功能调用,以设置闪存库0的等待状态。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,John:
    感谢您的回复。 我已经离开了几天,但现在我又要解决这个问题了。
    让我更好地解释一下。
    我有一个模型在编程时加载。 它似乎已正确分配到设备的SRAM区域(以0x2000_3A74结尾)。 在操作过程中,我收集外围设备的信息,然后从位置开始将其存储在NV闪存中
    #define Permanent information_start 0x0003F000,仅256字节。 我不确定这两个看似独立的内存位置为什么会重叠,但我知道这正是问题的原因。 这是否能让您更好地了解可能发生的情况?
    谢谢!
    -Edgar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Edgar,

    似乎您正在根据您的代码执行正确的步骤,以便只使用256字节写入此扇区。  您说您的代码在某处"挂起"了吗?  我想您的意思是,当您使用播放/暂停按钮进行调试时,它在代码中保持在同一行,而在运行您的功能对闪存进行编程后,再也不运行其他代码?  它在哪里被"挂断"?  在等待中断(wfi)或某种类型的重置处理程序中?

    您是否尝试使用调试内存浏览器视图来验证擦除/写入操作正在进行?  您可以使用断点来更好地了解这一点。  您说过将模型加载到以 0x2000_3A74结尾的设备上;对于256字节,我假设起始地址为0x2000_2A74? 对吗?  您是否验证了编程时加载的此数学模型的位置?  在编程时,您使用什么方法加载此项?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,John:

    当主程序开始运行时,256字节存储在主闪存中,从0x0003_F000开始(闪存库1,扇区31)。 数学模型在程序上载到微控制器时存储。 据我所了解,数学模型存储在SRAM中(从0x2000_0000开始0000开始)。 如果模型足够小(<~11k字节),则我没有问题。 否则,如果使用>~11k字节模型,则在代码中执行以下driverlib函数时我会卡住:

    /*正在尝试擦除扇区。 在此函数中,API将
    自动尝试清除最大尝试次数。 */
    MAP_FlashCtl_eraseSector(flashStartAddress); 

    当我暂停调试时,它显示我在flash.c驱动程序库中的以下函数中被捕获。

    布尔Flashctl_verifyMemory(void* verifyAddr, UINT32_t length,
    UINT_fast8_t模式)
    {
    uINT32_t内存模式,地址,otpOffset;
    uINT32_t b0WaitState, b1WaitState, intStatus;
    UINT32_t bankOneStart, startBank, endBank;
    uINT_fast8_t b0readMode,b1readMode;
    UINT_fast8_t内存类型;
    布尔值;
    
    断言(pattern == flash_0_pattern || pattern == flash_1_pattern);
    
    /*保存中断上下文并禁用程序中断
    *操作
    */
    intStatus = cpu_primask();
    interrup_disableMaster();
    
    /*转换和确定我们需要使用的内存*/
    Addr =(UINT32_t)验证地址;
    memoryType =
    (地址>__main_memory_end_)? FLASH_INFO_SPACE:FLASH_MAIN_SPACE;
    
    /*假定失败*/
    RES =假;
    
    /*了解我们所在的银行*/
    if(addr > sysctl_getFlashSize())
    {
    bankOneStart =__INFO_FLASH_TECT_MID_;
    }
    否则
    {
    bankOneStart = sysctl_getFlashSize()/2;
    }
    startBank = addr <(bankOneStart)? FLASH_BANK0:FLASH_BANK1;
    endBank =(addr + length)<(bankOneStart)? FLASH_BANK0:FLASH_BANK1;
    
    /*保存上下文和更改读取模式*/
    b0WaitState = FlashCtl_getWaitState(startBank);
    b0readMode = Flashctl_getReadMode(startBank);
    
    /*设置等待状态以考虑模式*/
    Flashctl_setWaitState(startBank,(2 * b0WaitState)+1);
    
    如果(startBank!= endBank)
    {
    b1WaitState = FlashCtl_getWaitState(endBank);
    b1readMode = Flashctl_getReadMode (endBank);
    Flashctl_setWaitState(endBank,(2 * b1WaitState)+1);
    }
    
    /*更改为相关的验证模式*/
    如果(pattern == flash_1_pattern)
    {
    Flashctl_setReadMode (startBank,flash_erase_verify_read_mode);
    
    如果(startBank!= endBank)
    {
    Flashctl_setReadMode(endBank, flash_erase_verify_read_mode);
    }
    
    内存模式= 0xFFFFFFFFF;
    } 否则
    {
    Flashctl_setReadMode (startBank,flash_program_verify_read_mode);
    
    如果(startBank!= endBank)
    {
    Flashctl_setReadMode(endBank, flash_program_verify_read_mode);
    }
    
    memoryPattern =0;}
    
    
    /*处理字节访问*/
    while ((addr & 0x03)&&(长度> 0))
    {
    如果(HWREG8(addr+)!=(((uint8_t)内存模式))
    转到FlashVerifyCleanup;
    长度--;
    }
    
    /*确保我们与128位地址对齐*/
    while (((addr & 0x0F))&&(长度> 3))
    {
    如果(HWREG32(addr)!=内存模式)
    转到FlashVerifyCleanup;
    
    addr = addr +4;
    length = length -4;
    }
    
    /*突发验证*/
    IF (长度> 63)
    {
    /*根据需要设置/清除信息闪存标志*/
    如果(地址>__main_memory_end__)
    {
    FLCTL->RDBRST_CTLSTAT =(FLCTL->RDBRST_CTLSTAT
    &~FLCTL_RDBRST_CTLSTAT_MEM_TYPE_MASK)
    | FLCTL_RDBRST_CTLSTAT_MEM_TYPE_1;
    otpOffset =__info_flash_tech_start_;
    } 否则
    {
    FLCTL->RDBRST_CTLSTAT =(FLCTL->RDBRST_CTLSTAT
    &~FLCTL_RDBRST_CTLSTAT_MEM_TYPE_MASK)
    | FLCTL_RDBRST_CTLSTAT_MEM_TYPE_0;
    otpOffset =__main_memory_start_;
    }
    
    /*清除任何遗留的故障标志并准备突发验证*/
    BITBAND_PERI(FLCTL->RDBRST_CTLSTAT,
    FLCTL_RDBRST_CTLSTAT_CLR_STAT_OFS)= 1;
    FLCTL->RDBRST_FAILNT =0;
    FLCTL->RDBRST_STARTADDR=地址- otpOffset;
    FLCTL->RDBRST_LEN =(长度和0xFFFFFFF0);
    地址+= FLCTL->RDBRST_LEN;
    长度=长度和0xF;
    
    /*开始突发检验*/
    FLCTL->RDBRST_CTLSTAT =(FLCTL_RDBRST_CTLSTAT_STOP_FAIL |模式)
    | memoryType | FLCTL_RDBRST_CTLSTAT_START);
    
    /*而连拍读取尚未完成*/
    While (((FLCTL->RDBRST_CTLSTAT和FLCTL_RDBRST_CTLSTAT_BRST_STAT_MASK)
    != FLCTL_RDBRST_CTLSTAT_BRST_STAT_3)
    {
    __no_operation();
    }
    
    /*检查验证/访问错误/失败*/
    如果(BITBAND_PERI(FLCTL->RDBRST_CTLSTAT,
    FLCTL_RDBRST_CTLSTAT_CMP_ERR_OFS)
    || BITBAND_PERI(FLCTL->RDBRST_CTLSTAT,
    FLCTL_RDBRST_CTLSTAT_ADDR_ERR_OFS)
    |||FLCTL->RDBRST_FAILCNT)
    {
    转到FlashVerifyCleanup;
    }
    }
    
    /*剩余单词*/
    同时(长度> 3)
    {
    如果(HWREG32(addr)!=内存模式)
    转到FlashVerifyCleanup;
    
    addr = addr +4;
    length = length -4;
    }
    
    /*剩余字节*/
    while (长度> 0)
    {
    如果(HWREG8(addr+)!=(((uint8_t)内存模式))
    转到FlashVerifyCleanup;
    长度--;
    }
    
    /*如果我们做到了这一点,就意味着没有发生故障*/
    RES =真;
    
    FlashVerifyCleanup:
    
    /*清除读取突发信号并返回*/
    BITBAND_PERI(FLCTL->RDBRST_CTLSTAT,
    FLCTL_RDBRST_CTLSTAT_CLR_STAT_OFS)= 1;
    
    Flashctl_setReadMode (startBank,b0readMode);
    Flashctl_setWaitState(startBank, b0WaitState);
    
    如果(startBank!= endBank)
    {
    Flashctl_setReadMode (endBank, b1readMode);
    Flashctl_setWaitState(endBank, b1WaitState);
    }
    
    IF (intStatus == 0)
    interrup_enableMaster();
    
    返回res;
    } 

    特别地,我一直被这一循环卡住:

    /*而连拍读取尚未完成*/
    While (((FLCTL->RDBRST_CTLSTAT和FLCTL_RDBRST_CTLSTAT_BRST_STAT_MASK)
    != FLCTL_RDBRST_CTLSTAT_BRST_STAT_3)
    {
    __no_operation();
    }
    


    因此,在SRAM中加载数据似乎会导致在尝试执行特定于闪存的驱动程序库功能时出现问题。 您是否知道导致此问题的原因?

    谢谢!

    -Edgar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否可以更具体地说明此中断的数学模型的大小?  闪存库被划分为4 KB 扇区,因此我预计断裂点将是4的倍数。  4,8或12 KB。  如果将模型存储在0x0003_F000中,则只有4 KB 空间才会溢出到 数据表定义的保留内存位置

    也许您可以尝试将数据存储在第1列气缸组的29,30和31区中,看看产生了什么结果?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,John:
    型号本身从未上载到主闪存中。 在微控制器编程过程中(分别在.h和.c文件中)声明并初始化模型。 我假设编译器决定将模型存储在SRAM中(从0x2000_0000开始0000开始)。 我的MSP432版本具有64k字节SRAM功能。 因此,12k字节的模型不应该是问题,但它是问题。 所以,我不知道为什么存储在64k字节SRAM中的12k字节数学模型会影响闪存函数,特别是MAP_FlashCTL_eraseSector(flashStartAddress)驱动程序。
    希望这能更清楚一点。
    -Edgar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Edgar,

    我一直在试图在我一方重复这个问题,但至今未能做到。  您是否可以以附件的形式发送您的一些代码,以便我可以在自己的设备上运行它?  

    当我尝试将12 KB 写入4 KB 扇区时,我确实进入了default_handler,但我并没有陷入您描述的相同循环中。  此外,您是否正在使用最新版本 的SDK (单击此处查看链接)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [QUOTE USER="raged") John,您好,
    型号本身从未上载到主闪存中。
    -Edgar

    [/引述]

    在某种程度上,*所有*都是闪存。 否则,处理器如何在重置后恢复RAM的内容? 现在,启动代码可能会将内容移动到RAM中,但它必须在闪存中启动。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Keith,是的,您回答正确。 是否有一种简单的方法来确定闪存中加载特定代码的位置? 或者,是否有一种方法可以指示应该加载代码的位置(可能使用CCS特定 的#pragma 语句)?
    谢谢!
    -Edgar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当你说“一段代码”时,我假设你指的是数据。

    如果您更改了如下cmd文件 : e2e.ti.com/.../msp432p401r.txt ,则可以在主{}之前调用以下命令:

    #pragma set_data_section(".MyData")

    const unsigned int hello =5;

     

    您会看到如下内容 (优化可能会删除闪存中存储的变量(如果该变量从未在代码中使用过),因此您可能需要在主菜单中使用类似int a = hello的内容。):


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是否解决了您的问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,John:
    感谢您的建议。 当我将cmd文件修改为您建议的文件时,我收到以下错误:
    "#1.0099万-D程序将不适合可用内存。对".bss"节大小0xc612进行定位运行失败。
    可用内存范围:"
    我存储数据的方式如下:
    我创建了一个.h文件,该文件可初始化数据结构的多个实例(数据结构只是几个输入)。
    然后,在.c文件中,初始化包含上述数据结构的不同数组。 这样做是否会发现固有问题?
    我需要这些结构和数组来使用数据来评估测量的变量。
    请告诉我。
    谢谢!
    -Edgar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面是我如何重现该问题的方法:

    #pragma set_data_section(".MyData")

    uINT8_t hello[4097];

    对于0到4096的数组大小,一切都按我的预期工作。  输入4097后,我收到与您的错误类似的以下错误:


    我注意到您的错误不同,并将.bss作为一个部分,这是奇怪的。  您是否出于某种原因尝试将信息存储在此部分而不是.MyData部分?  此外,0xC612是5.0706万 字节。  这是您的信息大小吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,John:

    感谢您的帮助。 我的问题是如何声明和初始化数据结构数组。 当我在.h文件中声明数组,然后在相应的.c文件中初始化数组时,编译器以某种方式在奇怪的位置分配数据。 我让它工作的方式是使用以下语法声明/初始化. c文件中的数组(一个模块显示为示例):

    structure_custom_data module_1[module_1_number_of_elements]={
    [0].vallue_1= 5,
    [0].vallue_2= 365,
    [0].vallue_3= 1,
    [0].vallue_4=-1,
    [0].vallue_5=66,
    [0].vallue_6=-1,
    [1].vallue_1= 8,
    [1].vallue_2= 326,
    [1].vallue_3= 2,
    [1].vallue_4=-1,
    [1].vallue_5= 30,
    [1].vallue_6=-1,
    [2].vallue_1= 0,
    [2].vallue_2= 14,
    [2].vallue_3= 3,
    [2].vallue_4=-1,
    [2].vallue_5= 22,
    [2].vallue_6=-1,
    [3].vallue_1= 2,
    [3].vallue_2= 13,
    [3].vallue_3= 4,
    [3].vallue_4=-1,
    [3].vallue_5= 7,
    [3].vallue_6=-1,
    } 

    这样,我就可以毫无问题地编译和执行我的程序。 希望这对将来的其他人有用。

    -Edgar