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
}
