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.

TDA4VM: Task_sleep does not return in SysBios application with Linux

Part Number: TDA4VM
Other Parts Discussed in Thread: SYSBIOS

Hi,

I have a TDA4EVM here which runs linux (psdk-linux-j7-evm-07_02_00_07), and a SysBios application for MCU2_0. Linux and SysBios should run in parallel.
I boot the board with Linux, then connect CCS via jtag emulator to the MCU2_0 (without any GEL instructions) stop the core, load and start my SysBios app.

It runs fine, until it hits the first Task_sleep instruction. From this point, it never returns and spins only in the Idle function. I suspect maybe a problem with the timer, could you please give me a hint what I should check next? And how?

These are the SysBios files:

main.c

/*
 *  ======== main.c ========
 */

#include <xdc/std.h>

#include <xdc/runtime/Error.h>
#include <xdc/runtime/System.h>

#include <ti/sysbios/BIOS.h>

#include <ti/sysbios/knl/Task.h>


#include "board.h"
#include "board_cfg.h"
#include <ti/drv/sciclient/sciclient.h>


void ipc_initSciclient()
{
    Sciclient_ConfigPrms_t        config;

    /* Now reinitialize it as default parameter */
    Sciclient_configPrmsInit(&config);

    Sciclient_init(&config);
}

/*
 *  ======== taskFxn ========
 */
Void taskFxn(UArg a0, UArg a1)
{
    System_printf("enter taskFxn()\n");

    Task_sleep(10);

    System_printf("exit taskFxn()\n");

    System_flush(); /* force SysMin output to console */
}

/*
 *  ======== main ========
 */
Int main()
{ 
    Task_Handle task;
    Error_Block eb;

    System_printf("enter main()\n");
    System_flush(); /* force SysMin output to console */

    //Comment this block if running MCU1_0, because there will be Board_init done() !
    Board_STATUS boardReturn = 0;
    Board_initCfg boardCfg;

    //Must be called before board init
    ipc_initSciclient();

    boardCfg = (BOARD_INIT_PINMUX_CONFIG | BOARD_INIT_UART_STDIO | BOARD_INIT_MODULE_CLOCK_MAIN);

    boardReturn = Board_init(boardCfg);
    if(boardReturn != BOARD_SOK)
    {
        System_printf("Board init failed!\n");
        BIOS_exit(0);
    }

    Error_init(&eb);
    task = Task_create(taskFxn, NULL, &eb);
    if (task == NULL) {
        System_printf("Task_create() failed!\n");
        BIOS_exit(0);
    }

    BIOS_start();    /* does not return */
    return(0);
}

SysBios config:

/* =============================================================================
 *   Copyright (c) Texas Instruments Incorporated 2018
 *
 *  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.
 */
var Defaults = xdc.useModule('xdc.runtime.Defaults');
var Diags = xdc.useModule('xdc.runtime.Diags');
var Error = xdc.useModule('xdc.runtime.Error');
var Log = xdc.useModule('xdc.runtime.Log');
var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
var Main = xdc.useModule('xdc.runtime.Main');
var Memory = xdc.useModule('xdc.runtime.Memory')
var System = xdc.useModule('xdc.runtime.System');
var Text = xdc.useModule('xdc.runtime.Text');
var Clock = xdc.useModule('ti.sysbios.knl.Clock');
var Task = xdc.useModule('ti.sysbios.knl.Task');
var Semaphore = xdc.useModule('ti.sysbios.knl.Semaphore');
var HeapBuf = xdc.useModule('ti.sysbios.heaps.HeapBuf');
var GateSwi = xdc.useModule('ti.sysbios.gates.GateSwi');

var BIOS = xdc.useModule('ti.sysbios.BIOS');
var Hwi = xdc.useModule('ti.sysbios.family.arm.v7r.keystone3.Hwi');
var Core = xdc.useModule('ti.sysbios.family.arm.v7r.keystone3.Core');
var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
var SysMin = xdc.useModule('xdc.runtime.SysMin');

/* System stack size (used by ISRs and Swis) */
Program.stack = 0x2000;

/* Place vector table in separate section - by default this goes to 0x0 which
 * is reserved by SBL */
Program.sectMap[".vecs"] = "RESET_VECTORS";

var Task = xdc.useModule('ti.sysbios.knl.Task');
Task.defaultStackSize = 0x4000;
Task.common$.namedInstance = true;
Task.common$.namedModule = true;

/* Enable cache */
var Cache = xdc.useModule('ti.sysbios.family.arm.v7r.Cache');
Cache.enableCache = true;

/*
 * Direct CIO to UART
 */
/* System.SupportProxy = SysUart; */
System.SupportProxy = SysMin;
System.extendedFormats += "%f";
/*
 * Program.argSize sets the size of the .args section.
 * The examples don't use command line args so argSize is set to 0.
 */
Program.argSize = 0x0;

/*
 * Uncomment this line to globally disable Asserts.
 * All modules inherit the default from the 'Defaults' module.  You
 * can override these defaults on a per-module basis using Module.common$.
 * Disabling Asserts will save code space and improve runtime performance.
Defaults.common$.diags_ASSERT = Diags.ALWAYS_OFF;
 */

/*
 * Uncomment this line to keep module names from being loaded on the target.
 * The module name strings are placed in the .const section. Setting this
 * parameter to false will save space in the .const section.  Error and
 * Assert messages will contain an "unknown module" prefix instead
 * of the actual module name.
Defaults.common$.namedModule = false;
 */

/* Create default heap and hook it into Memory */
var heapMemParams = new HeapMem.Params;
heapMemParams.size = 16384*4;
var heap0 = HeapMem.create(heapMemParams);

Memory.defaultHeapInstance = heap0;

/*
 * Minimize exit handler array in System.  The System module includes
 * an array of functions that are registered with System_atexit() to be
 * called by System_exit().
 */
System.maxAtexitHandlers = 4;

/*
 * Uncomment this line to disable the Error print function.
 * We lose error information when this is disabled since the errors are
 * not printed.  Disabling the raiseHook will save some code space if
 * your app is not using System_printf() since the Error_print() function
 * calls System_printf().
Error.raiseHook = null;
 */

/*
 * Uncomment this line to keep Error, Assert, and Log strings from being
 * loaded on the target.  These strings are placed in the .const section.
 * Setting this parameter to false will save space in the .const section.
 * Error, Assert and Log message will print raw ids and args instead of
 * a formatted message.
Text.isLoaded = false;
 */

/*
 * Uncomment this line to disable the output of characters by SysMin
 * when the program exits.  SysMin writes characters to a circular buffer.
 * This buffer can be viewed using the SysMin Output view in ROV.
SysMin.flushAtExit = false;
 */

/*
 * Create and install logger for the whole system
 */
var loggerBufParams = new LoggerBuf.Params();
loggerBufParams.numEntries = 32;
var logger0 = LoggerBuf.create(loggerBufParams);
Defaults.common$.logger = logger0;
Main.common$.diags_INFO = Diags.ALWAYS_ON;

BIOS.libType = BIOS.LibType_Custom;
BIOS.cpuFreq.lo = 1000000000;
BIOS.cpuFreq.hi = 0;

var coreId = java.lang.System.getenv("CORE");

var DMTimer = xdc.useModule('ti.sysbios.timers.dmtimer.Timer');
DMTimer.checkFrequency = false;
for (var i=0; i < DMTimer.numTimerDevices; i++) {
    DMTimer.intFreqs[i].lo = 19200000;
    DMTimer.intFreqs[i].hi = 0;
}

if(coreId=="mcu1_0")
{
    Core.id = 0;
    /* DM timer cfg */
    Clock.timerId = 1;
}
if(coreId=="mcu1_1")
{
    Core.id = 1;
    /* DM timer cfg */
    Clock.timerId = 2;
}
if(coreId=="mcu2_0")
{
    Core.id = 0;
    Clock.timerId = 0;
    /* DMTimer #12 - in general, address is 0x024x0000 where x is timer # */
    DMTimer.timerSettings[0].baseAddr = 0x024c0000;
    DMTimer.timerSettings[0].intNum = 168;
}
if(coreId=="mcu2_1")
{
    Core.id = 1;
    Clock.timerId = 1;
    /* DMTimer #13 - in general, address is 0x024x0000 where x is timer # */
    DMTimer.timerSettings[1].baseAddr = 0x024d0000;
    DMTimer.timerSettings[1].intNum = 169;
}
if(coreId=="mcu3_0")
{
    Core.id = 0;
    Clock.timerId = 2;
    /* DMTimer #14 - in general, address is 0x024x0000 where x is timer # */
    DMTimer.timerSettings[2].baseAddr = 0x024e0000;
    DMTimer.timerSettings[2].intNum = 170;
}
if(coreId=="mcu3_1")
{
    Core.id = 1;
    Clock.timerId = 3;
    /* DMTimer #15 - in general, address is 0x024x0000 where x is timer # */
    DMTimer.timerSettings[3].baseAddr = 0x024f0000;
    DMTimer.timerSettings[3].intNum = 171;
}

/* Set base address of Vector Interrupt Manager */
if((coreId=="mcu2_0") || (coreId=="mcu2_1") || (coreId=="mcu3_0") || (coreId=="mcu3_1"))
{
    var Hwi = xdc.useModule('ti.sysbios.family.arm.v7r.keystone3.Hwi');
    Hwi.vimBaseAddress = 0x0ff80000;
}

/* Sysbios supports workaround for Silicon issue jira.itg.ti.com/.../K3_OPEN_SI-148
 * Details of silicon issue : confluence.itg.ti.com/.../#10 The same interrupt cannot be nested back-2-back within another interrupt
 * Sysbios Requirement Details: jira.itg.ti.com/.../SYSBIOS-1419
 * Workaround requires use of a resevred dummyIRQ.
 * Using DummyIRQ#383 as per cslr_intr_mss.h it is a reserved interrupt not connected to any
 * peripheral interrupt sources
 */
if((coreId=="mcu1_0") || (coreId=="mcu1_1"))
{
    Hwi.dummyIRQ                   = 383;
}
if((coreId=="mcu2_0") || (coreId=="mcu2_1") || (coreId=="mcu3_0") || (coreId=="mcu3_1"))
{
    Hwi.dummyIRQ                   = 511;
}

var Reset = xdc.useModule("xdc.runtime.Reset");
Reset.fxns[Reset.fxns.length++] = "&utilsCopyVecs2ATcm";

/*
 * Initialize MPU and enable it
 *
 * Note: MPU must be enabled and properly configured for caching to work.
 */
xdc.loadCapsule("r5_mpu.xs");

var Load = xdc.useModule('ti.sysbios.utils.Load');

/* load calculation related settings */
Load.swiEnabled   = true;
Load.hwiEnabled   = true;
Load.taskEnabled  = true;
Load.updateInIdle = false;

/* Check if application needs to update with custom configuration options */
/* Caution: This should be at the end of this file after all other common cfg */
var cfgUpdate = java.lang.System.getenv("XDC_CFG_UPDATE")
if ((cfgUpdate != '')&&(cfgUpdate != null))
{
    xdc.print("Loading configuration update " + cfgUpdate);
    xdc.loadCapsule(cfgUpdate);
}

linker-file:

/* linker options */
--fill_value=0
--stack_size=0x2000
--heap_size=0x1000

-e __VECS_ENTRY_POINT
--retain="*(.utilsCopyVecsToAtcm)"


MEMORY
{
    R5F_TCMA_SBL_RSVD(X): ORIGIN = 0x00000000 , LENGTH = 0x100

    /* Refer the user guide for details on persistence of these sections */
    OCMC_RAM_BOARD_CFG (RWIX)   : origin=0x41C80000 length=0x2000
    OCMC_RAM_SCISERVER (RWIX)   : origin=0x41C82000 length=0x60000
    RESET_VECTORS (X)           : origin=0x41CE2000 length=0x100
    OCMC_RAM (RWIX)             : origin=0x41CE2100 length=0x1DA00
    OCMC_RAM_X509_HEADER (RWIX) : origin=0x41CFFB00 length=0x500

    R5F_TCMB0(RWIX)     : ORIGIN = 0x41010000 , LENGTH = 0x00008000
    DDR0 (RWIX)         : ORIGIN = 0x80000000 , LENGTH = 0x80000000
    MSRAM (RWIX)        : ORIGIN = 0x03600000 , LENGTH = 0x80000       /* 512K OCMC, used for allocation of ICSSG port queues */
    MSMC3 (RWIX)        : ORIGIN = 0x70040000 , LENGTH = 0x7B0000      /* 8MB - 320KB */
}

SECTIONS
{
    .vecs       : {
        __VECS_ENTRY_POINT = .;
    } palign(8) > RESET_VECTORS
    .text_boot {
        *boot.aer5f*<*boot.o*>(.text)
     }  palign(8)   > R5F_TCMB0
    .text:xdc_runtime_Startup_reset__I     : {} palign(8) > R5F_TCMB0
    .text:ti_sysbios_family_arm_v7r_Cache* : {} palign(8) > R5F_TCMB0
    .text:ti_sysbios_family_arm_MPU*       : {} palign(8) > R5F_TCMB0
    .utilsCopyVecsToAtcm                   : {} palign(8) > R5F_TCMB0

    .text       : {} palign(8)   > DDR0
    .cinit      : {} palign(8)   > DDR0
    .bss        : {} align(8)    > DDR0
    .far        : {} align(8)    > DDR0
    .const      : {} palign(8)   > DDR0
    .data       : {} palign(128) > DDR0
    .sysmem     : {} align(8)    > DDR0
    .stack      : {} align(4)    > DDR0
    .data_buffer: {} palign(128) > DDR0
    .bss.devgroup*: {} align(4)    > DDR0
    .const.devgroup*: {} align(4)    > DDR0
    .boardcfg_data: {} align(4)    > DDR0

    /* USB or any other LLD buffer for benchmarking */
    .benchmark_buffer: (NOLOAD) {} align (8) > DDR0

}

  • This is a screenshot from the ROV view regarding Clock and Timer, I don't know if this helps to diagnose:

    Values from Clock/Timer does not change after the application hit the first Task_sleep. However, I'm not sure if they should at this point.

    Thank you very much and best regards,
    Thomas

  • Hi Thomas,

    Apologies for no response on this thread.

    Can you please confirm that this same application, have you been able to run standalone with CCS or SBL and the problem comes only when running with Linux (by using JTAG)?

    Also, is this an SDK example, if yes, then I can try replicating it on my setup to give you more pointers?

    Regards,

    Karan