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.

MSPM0L1227: aeabi_uidvmod.S was not found

Part Number: MSPM0L1227
Other Parts Discussed in Thread: UNIFLASH

Tool/software:

Hi,

My customer has a question below. Could you answer their question ?

 

The following error occurred at the Flash Read. Do you have any idea to solve this ?

Source file '..\..\..\..\..\llvm-project\compiler-rt\lib\builtins\arm\aeabi_uidivmod.S' was not found.

 

What’s the "aeabi_uidivmod.S" file ?

Is it what will be generated in this folder when something is built ?

Should they intentionally put this file in this folder? Where is this file?

 

Thanks and regards,

Hideaki

  • Hi Hideaki,

    What steps does your customer perform to get this error? Is this in Uniflash / CCS? We could use a little more background on the problem here.

  • Hi Dylan,

    Thank you for your reply. Sorry for my short explanation.

    They're using their own test code, and read 32bit data from arbitrary address in Flash by using pointer.
    Then, __aeabi_uidiv() is called at the same timing every execution, but the following error occurs.

    Source file '..\..\..\..\..\llvm-project\compiler-rt\lib\builtins\arm\aeabi_uidivmod.S' was not found.

    __aeabi_uidiv() seems to be a division function, but there is no division in the code of 32bit read.

    In the map file, there is a .S file which probably contain the above function in C:\ti\ccs2001\ccs\tools\compiler\ti-cgt-armllvm_4.0.1.LTS\lib\armv6m-ti-none-eabi/libclang_rt.builtins.a, and it can be built.

    Could you please give them some advices to their questions in the previous post above.

    Thanks and regards,
    Hideaki

  • I am a bit confused about the call stack that eventually calls this function, and correct me if I am wrong but it sounds like you are not sure where it comes from either? 

    So in the application code you just read some data out from memory with a pointer and at that line you get this error? Maybe it would be more clear if you posted the code snippet that generates this error. You shouldn't need any sub-calls to read out from memory with a pointer so I think I am missing something.

    Also, did the customer write this code out or is this based on one of our examples?

  • Hi Dylan,

    Apologize for my delayed response. I got some parts of their code which generates this error. Could you check the code if it has a problem ?

    UINT32	Address;
    UINT32	*pAddress;
    UINT8	Size;
    UINT8   *SendLength;
            Tmp
    UINT8   Type;
    UINT8   RcvData[4];
    UINT8   ReadData[128];
    UINT8   SendData[131];
        :
        :
        :
    
        if ( State >= 1 ) {	
            *SendLength = REPLY_SIZE;
            SendData[0] = STATE_FALSE;
            break;
        } else {
            Tmp = RcvData[1] ^ 0xFF;
            if ( RcvData[0] == Tmp ) {
            Type     = RcvData[0];
            pAddress = &SET_ADDR;             /* 0x00002000 */ 
            Address  = (UINT32)pAddress;
            Size = 4;
            /* Read */
            ReadEEPROM( &ReadData[0], Address, Size );  /* Error Occurred here!! */
            :
            :
            :
            :
            }
        }
    
    
    /* Get 32bit data from appropriate address by using pointer, and store every 1 byte to array. */
    
    void	ReadEEPROM( UINT8 *ReadData, UINT32 Address, UINT8 Size )
    {
    	UINT8 i,j,k;
        UINT32 *tmpAddress;
        
        j = Size >> 2;
        k = Size % 4;
    
        /* If less than 4 byte */
        if( j == 0){
            j = j + 1; 
            k = 0;
        }
        
        if( k == 1 ){
            tmpAddress = (UINT32 *)(Address + (4*j));    
            ReadData[j*4] = *tmpAddress;
        }else if( k == 2){
            tmpAddress = (UINT32 *)(Address + (4*j));
            ReadData[j*4]     = *tmpAddress;
            ReadData[(j*4)+1] = *tmpAddress >> 8;
        }else if( k == 3){
            tmpAddress = (UINT32 *)(Address + (4*j));
            ReadData[j*4]     = *tmpAddress;
            ReadData[(j*4)+1] = *tmpAddress >> 8;
            ReadData[(j*4)+2] = *tmpAddress >> 16;
        }else{
            /* If k==0, nothing to do */
        }
    
        for ( i = 0; i < j; i++ ) {
            tmpAddress = (UINT32 *)(Address + (4*i));      /* Error Occurred here!! */ 
            ReadData[(i*4)]   = *tmpAddress;
            ReadData[(i*4)+1] = *tmpAddress >> 8;
            ReadData[(i*4)+2] = *tmpAddress >> 16;
            ReadData[(i*4)+3] = *tmpAddress >> 24;
        }
    
    }

    Thanks and regards,

    Hideaki

  • Hi Hideaki,

    The line generating the error looks fine to me. What is the toolchain being used here? I havent seen this error before and can't find many resources on it. 

  • Hi Dylan,

     

    We’ve gotten some more questions and additional information from the customer.

     

    Is there any restriction when reading data from the address 0x0000_0800 after programming on 0x0000_0400 in the Flash ?

    The reason why they’re asking this question is that the error occurred when the above procedure is done.

    1. The programmed value can be confirmed visually on the memory map of CCS even after Program.
    2. After that, the system stops with an error if the value on Flash memory is gotten by MCU FW,.

    The ECC setting is invalid.

     

    If it is only Read without Program, the Read has succeeded in the MCU FW.

     

    Also, after Program, they read the “STSCMD” register and confirm that it becomes to “3”, then they jjudged that Program is successful. Is there anything else that is necessary?

     

     

    Actually, error occurred at the address “0x0000_0C20” and “0x0000_0400”, and they confirmed that an error occurs even if the sector is changed.

     

    Do you have any idea to solve this ?

     

    Thanks and regards,

    Hideaki