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.

TMS570LS3137: Bootloader FreeRTOS program

Part Number: TMS570LS3137

Hello everyone! I have a doubt about my bootloader program. The program is working fine. I was able to record a simple program. But now, I want to record another program, that uses FreeRTOS. I generated the .bin and modified the sys_link, and then I recorded this new program with FreeRTOS. But when I want to run the new program with FreeRTOS, the bootloader always enters in the section: svcEntry b svcEntry I really need help with this issue. I don't know what I can do to fix it.

I copied the sys_link.cmd from my FreeRTOS program:

-retain="*(.intvecs)"

/* USER CODE BEGIN (1) */
/* USER CODE END */

/*----------------------------------------------------------------------------*/
/* Memory Map */


MEMORY
{

VECTORS (X) : origin=0x00020020 length=0x00000020
FLASH_CODE (RX) : origin=0x00020040 length=0x008000-0x40 fill=0xFFFFFFFF
FLASH0 (RX) : origin=0x00028000 length=0x0014FFC0
FLASH1 (RX) : origin=0x00180000 length=0x00180000
STACKS (RW) : origin=0x08000000 length=0x00000800
KRAM (RW) : origin=0x08000800 length=0x00000800
RAM (RW) : origin=(0x08000800+0x00000800) length=(0x0003F800 - 0x00000800)


/* USER CODE BEGIN (2) */
/* USER CODE END */
}

/* USER CODE BEGIN (3) */
/* USER CODE END */

/*----------------------------------------------------------------------------*/
/* Section Configuration */

SECTIONS
{
.intvecs : {} > VECTORS
/* FreeRTOS Kernel in protected region of Flash */
.kernelTEXT : {} > FLASH0 | FLASH1
.cinit : {} > FLASH0 | FLASH1
.pinit : {} > FLASH0 | FLASH1
/* Rest of code to user mode flash region */
.text : {} > FLASH0 | FLASH1
.const : {} > FLASH0 | FLASH1
/* FreeRTOS Kernel data in protected region of RAM */
.kernelBSS : {} > KRAM
.kernelHEAP : {} > RAM
.bss : {} > RAM
.data : {} > RAM
}

Thank you so much.

  • Hi Federico,

    Can you please refer below thread once and do the modifications i suggested in your code?
    (+) TMS570LC4357: freertos bootloader application getting problem in I2C - Arm-based microcontrollers forum - Arm-based microcontrollers - TI E2E support forums

    --

    Thanks & regards,
    Jagadish.

  • Hello Jagadish,

    Thank you for your reply.

    I cannot see the image on the link. Could you please share the suggested changes again?

    I shared my sys_intvecs.asm code from my bootloader.

        .sect ".intvecs"
        .arm
    
    ;-------------------------------------------------------------------------------
    ; import reference for interrupt routines
    
        .ref _c_int00
        .ref _dabort
        .ref phantomInterrupt
        .def resetEntry
    
    ;-------------------------------------------------------------------------------
    ; interrupt vectors
    
    resetEntry
            b   _c_int00
    undefEntry
            b   undefEntry
    svcEntry
            b   svcEntry
    prefetchEntry
            b   prefetchEntry
            b   _dabort
            b   phantomInterrupt
            ldr pc,[pc,#-0x1b0]
            ldr pc,[pc,#-0x1b0]
    
        

    Thank you for your help. Let me know if you need more information about my code.

    Kind regards,

    Federico.

  • Hi Federico,

    Try to modify your application startup.c code as below:

    In your application code try to call all the functions before _mpuInit_ function into the USER CODE BEGIN (22), like as shown above.

    Do above modification and update the status. Here is my startup.c file of application for your reference.

    /** @file HL_sys_startup.c 
    *   @brief Startup Source File
    *   @date 11-Dec-2018
    *   @version 04.07.01
    *
    *   This file contains:
    *   - Include Files
    *   - Type Definitions
    *   - External Functions
    *   - VIM RAM Setup
    *   - Startup Routine
    *   .
    *   which are relevant for the Startup.
    */
    
    /* 
    * Copyright (C) 2009-2018 Texas Instruments Incorporated - www.ti.com  
    * 
    * 
    *  Redistribution and use in source and binary forms, with or without 
    *  modification, are permitted provided that the following conditions 
    *  are met:
    *
    *    Redistributions of source code must retain the above copyright 
    *    notice, this list of conditions and the following disclaimer.
    *
    *    Redistributions in binary form must reproduce the above copyright
    *    notice, this list of conditions and the following disclaimer in the 
    *    documentation and/or other materials provided with the   
    *    distribution.
    *
    *    Neither the name of Texas Instruments Incorporated nor the names of
    *    its contributors may be used to endorse or promote products derived
    *    from this software without specific prior written permission.
    *
    *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
    *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
    *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
    *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
    *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
    *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
    *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
    *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    *
    */
    
    
    /* USER CODE BEGIN (0) */
    /* USER CODE END */
    
    
    /* Include Files */
    
    #include "HL_sys_common.h"
    #include "HL_system.h"
    #include "HL_sys_vim.h"
    #include "HL_sys_core.h"
    #include "HL_esm.h"
    #include "HL_sys_mpu.h"
    #include "HL_errata_SSWF021_45.h"
    
    /* USER CODE BEGIN (1) */
    /* USER CODE END */
    
    /* USER CODE BEGIN (2) */
    /* USER CODE END */
    
    /* External Functions */
    
    /*SAFETYMCUSW 218 S MR:20.2 <APPROVED> "Functions from library" */
    extern void __TI_auto_init(void);
    /*SAFETYMCUSW 354 S MR:NA <APPROVED> " Startup code(main should be declared by the user)" */
    extern int main(void);
    /*SAFETYMCUSW 122 S MR:20.11 <APPROVED> "Startup code(exit and abort need to be present)" */
    /*SAFETYMCUSW 354 S MR:NA <APPROVED> " Startup code(Extern declaration present in the library)" */
    extern void exit(int _status);
    
    
    /* USER CODE BEGIN (3) */
    /* USER CODE END */
    void handlePLLLockFail(void);
    /* Startup Routine */
    void _c_int00(void);
    #define PLL_RETRIES 5U
    /* USER CODE BEGIN (4) */
    /* USER CODE END */
    
    #pragma CODE_STATE(_c_int00, 32)
    #pragma INTERRUPT(_c_int00, RESET)
    #pragma WEAK(_c_int00)
    
    /* SourceId : STARTUP_SourceId_001 */
    /* DesignId : STARTUP_DesignId_001 */
    /* Requirements : HL_CONQ_STARTUP_SR1 */
    void _c_int00(void)
    {
    //	register resetSource_t rstSrc;
    ///* USER CODE BEGIN (5) */
    ///* USER CODE END */
    //
    //    /* Initialize Core Registers to avoid CCM Error */
    //    _coreInitRegisters_();
    //
    //    /* Initialize Stack Pointers */
    //    _coreInitStackPointer_();
    //
    //    /* Reset handler: the following instructions read from the system exception status register
    //     * to identify the cause of the CPU reset.
    //     */
    //	rstSrc = getResetSource();
    //    switch(rstSrc)
    //    {
    //        case POWERON_RESET:
    //		/* Initialize L2RAM to avoid ECC errors right after power on */
    //		_memInit_();
    //
    //		/* Add condition to check whether PLL can be started successfully */
    //        if (_errata_SSWF021_45_both_plls(PLL_RETRIES) != 0U)
    //		{
    //			/* Put system in a safe state */
    //			handlePLLLockFail();
    //		}
    //
    ///*SAFETYMCUSW 62 S MR:15.2, 15.5 <APPROVED> "Need to continue to handle POWERON Reset" */
    //        case DEBUG_RESET:
    //        case EXT_RESET:
    //
    ///* USER CODE BEGIN (6) */
    ///* USER CODE END */
    //
    //        /* Initialize L2RAM to avoid ECC errors right after power on */
    //		if(rstSrc != POWERON_RESET)
    //		{
    //			_memInit_();
    //		}
    //
    ///* USER CODE BEGIN (7) */
    ///* USER CODE END */
    //
    ///* USER CODE BEGIN (8) */
    ///* USER CODE END */
    //
    //
    ///* USER CODE BEGIN (9) */
    ///* USER CODE END */
    //
    //        /* Enable CPU Event Export */
    //        /* This allows the CPU to signal any single-bit or double-bit errors detected
    //         * by its ECC logic for accesses to program flash or data RAM.
    //         */
    //        _coreEnableEventBusExport_();
    //
    ///* USER CODE BEGIN (10) */
    ///* USER CODE END */
    //
    //        /* Check if there were ESM group3 errors during power-up.
    //         * These could occur during eFuse auto-load or during reads from flash OTP
    //         * during power-up. Device operation is not reliable and not recommended
    //         * in this case. */
    //        if ((esmREG->SR1[2]) != 0U)
    //        {
    //           esmGroup3Notification(esmREG,esmREG->SR1[2]);
    //        }
    //
    //        /* Initialize System - Clock, Flash settings with Efuse self check */
    //        systemInit();
    //
    ///* USER CODE BEGIN (11) */
    ///* USER CODE END */
    //
    //        /* Enable IRQ offset via Vic controller */
    //        _coreEnableIrqVicOffset_();
    //
    //        /* Initialize VIM table */
    //	    vimInit();
    //
    ///* USER CODE BEGIN (12) */
    ///* USER CODE END */
    //        /* Configure system response to error conditions signaled to the ESM group1 */
    //        /* This function can be configured from the ESM tab of HALCoGen */
    //        esmInit();
    //
    ///* USER CODE BEGIN (13) */
    ///* USER CODE END */
    //
    //        break;
    //
    //        case OSC_FAILURE_RESET:
    ///* USER CODE BEGIN (14) */
    ///* USER CODE END */
    //        break;
    //
    //        case WATCHDOG_RESET:
    //        case WATCHDOG2_RESET:
    //
    ///* USER CODE BEGIN (15) */
    ///* USER CODE END */
    //        break;
    //
    //        case CPU0_RESET:
    ///* USER CODE BEGIN (16) */
    ///* USER CODE END */
    //
    ///* USER CODE BEGIN (17) */
    ///* USER CODE END */
    //
    ///* USER CODE BEGIN (18) */
    ///* USER CODE END */
    //
    //        /* Enable CPU Event Export */
    //        /* This allows the CPU to signal any single-bit or double-bit errors detected
    //         * by its ECC logic for accesses to program flash or data RAM.
    //         */
    //        _coreEnableEventBusExport_();
    //
    ///* USER CODE BEGIN (19) */
    ///* USER CODE END */
    //        break;
    //
    //        case SW_RESET:
    //
    ///* USER CODE BEGIN (20) */
    ///* USER CODE END */
    //        break;
    //
    //        default:
    ///* USER CODE BEGIN (21) */
    ///* USER CODE END */
    //        break;
    //    }
    
    /* USER CODE BEGIN (22) */
        systemInit();
        _coreEnableIrqVicOffset_();
        vimInit();
        esmInit();
    /* USER CODE END */
    
        _mpuInit_();
    	
    /* USER CODE BEGIN (23) */
    /* USER CODE END */
    
        _cacheEnable_();
    
    /* USER CODE BEGIN (24) */
    /* USER CODE END */
    
    
    /* USER CODE BEGIN (25) */
    /* USER CODE END */
    
            /* initialize global variable and constructors */
        __TI_auto_init();
    /* USER CODE BEGIN (26) */
    /* USER CODE END */
        
            /* call the application */
    /*SAFETYMCUSW 296 S MR:8.6 <APPROVED> "Startup code(library functions at block scope)" */
    /*SAFETYMCUSW 326 S MR:8.2 <APPROVED> "Startup code(Declaration for main in library)" */
    /*SAFETYMCUSW 60 D MR:8.8 <APPROVED> "Startup code(Declaration for main in library;Only doing an extern for the same)" */
        main();
    /* USER CODE BEGIN (27) */
    /* USER CODE END */
    /*SAFETYMCUSW 122 S MR:20.11 <APPROVED> "Startup code(exit and abort need to be present)" */
        exit(0);
    
    
    /* USER CODE BEGIN (28) */
    /* USER CODE END */
    
    }
    
    /* USER CODE BEGIN (29) */
    /* USER CODE END */
    
    /** @fn void handlePLLLockFail(void)
    *   @brief This function handles PLL lock fail.
    */
    /* USER CODE BEGIN (30) */
    /* USER CODE END */
    void handlePLLLockFail(void)
    {
    /* USER CODE BEGIN (31) */
    /* USER CODE END */
    	while(1)
    	{
    		
    	}
    /* USER CODE BEGIN (32) */
    /* USER CODE END */
    }
    /* USER CODE BEGIN (33) */
    /* USER CODE END */
    

    This modification is important in application startup.c code because as you can see in below pic

    systemInit and vimInit etc functions will get calling only when the reset cause is POWERON_RESET or EXT_RESET etc. But this reset cause is already read by bootloader before application access the reset cause and the bootloader code will clear the reset cause, so due to that while application reading reset cause again it will get NO_RESET instead of actual POWERON_RESET  or EXT_RESET. So due to this reason systemInit and vimInit etc functions will not get execute and our application code will not work as per intended behavior.

    So, please try to perform suggested modification.

    --

    Thanks & regards,
    Jagadish.