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.

Compiler/TDA4VM: the output is overlap via the AppUtils_Printf

Part Number: TDA4VM

Tool/software: TI C/C++ Compiler

Dear Sir:

  I am using psdk_rtos_auto_j7_07_00_00_11.

  I find a issue that the function's(AppUtils_Printf) output is overlap via uart bus.

  And my code :

  

void tsk_sample0_main(UArg a0, UArg a1)
{
    AppUtils_Printf(APP_UTILS_PRINT_MSG_NORMAL, " Hello sample0000!\n");
}
void tsk_sample1_main(UArg a0, UArg a1)
{
    AppUtils_Printf(APP_UTILS_PRINT_MSG_NORMAL, " Hello sample1111!\n");
}
int main(void)
{
    Task_Params taskParams;

    Error_Block eb;
    Error_init(&eb);

    Task_Params_init(&taskParams);
    taskParams.priority     = 2;
    Task_create(tsk_sample0_main, &taskParams, &eb);
    Task_create(tsk_sample1_main, &taskParams, &eb);

    AppUtils_Init();

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

And the output:

  

 Hello sample1111!

 Hello sample1111!

the "Hello sample0000!" is not output.

  • Hi,

    Can you please provide the below details:

    1. Which core is this code running on?

    2. Which UART instance is being used here?

    3. The AppUtils_Printf() is a local utility function used by many components in the PSDKRA, can you please tell me which SW component have you referred while creating this example?

    Regards,

    Karan

  • Dear Karan,

      thanks for your reply.

      >1. Which core is this code running on?

         mcu1_0

      >2. Which UART instance is being used here?

         sorry, I don't know about that.

         and how I check it?

      >3. The AppUtils_Printf() is a local utility function used by many components in the PSDKRA, can you please tell me which SW component have you referred while creating this example?

         example: can_profile_app. And I delete some component about CAN feature, app_utils and utils_prf is enabled. 

         I don't compile PDK in this example, this example used some components include ti.csl.aer5f & sciclient.aer5f & ti.drv.uart.aer5f & ti.board.aer5f & ti.drv.i2c.aer5f & ti.drv.i2c.aer5f & ti.osal.aer5f.

         I think there is not other task except for task_sample0_main & task_sample1_main.

  • Dear Karan,

      To stay the same environment, I repeat this issue at the can_profile_app example.

      PDK:   psdk_rtos_auto_j7_07_00_00_11.

      I only modify a source file (referring main_tirtos.c):

         mcusw/mcuss_demos/profiling/can/main_tirtos.c

               > I only add 2 tasks: Sample0_TaskFxn & Sample1_TaskFxn, and they call AppUtils_Printf() at the same time.

     and build:

       gmake can_profile_app BOARD=j721e_evm SOC=j721e BUILD_PROFILE=release CORE=mcu1_0 BUILD_OS_TYPE=tirtos

      and the output (referring log.txt):

       Sample String-1111!!!

       Sample String-1111!!!

      the same issue:  "Sample String-0000!!!" don't output.

    /*
    *
    * Copyright (c) 2019-2020 Texas Instruments Incorporated
    *
    * All rights reserved not granted herein.
    *
    * Limited License.
    *
    * Texas Instruments Incorporated grants a world-wide, royalty-free, non-exclusive
    * license under copyrights and patents it now or hereafter owns or controls to make,
    * have made, use, import, offer to sell and sell ("Utilize") this software subject to the
    * terms herein.  With respect to the foregoing patent license, such license is granted
    * solely to the extent that any such patent is necessary to Utilize the software alone.
    * The patent license shall not apply to any combinations which include this software,
    * other than combinations with devices manufactured by or for TI ("TI Devices").
    * No hardware patent is licensed hereunder.
    *
    * Redistributions must preserve existing copyright notices and reproduce this license
    * (including the above copyright notice and the disclaimer and (if applicable) source
    * code license limitations below) in the documentation and/or other materials provided
    * with the distribution
    *
    * Redistribution and use in binary form, without modification, are permitted provided
    * that the following conditions are met:
    *
    * *       No reverse engineering, decompilation, or disassembly of this software is
    * permitted with respect to any software provided in binary form.
    *
    * *       any redistribution and use are licensed by TI for use only with TI Devices.
    *
    * *       Nothing shall obligate TI to provide you with source code for the software
    * licensed and provided to you in object code.
    *
    * If software source code is provided to you, modification and redistribution of the
    * source code are permitted provided that the following conditions are met:
    *
    * *       any redistribution and use of the source code, including any resulting derivative
    * works, are licensed by TI for use only with TI Devices.
    *
    * *       any redistribution and use of any object code compiled from the source code
    * and any resulting derivative works, are licensed by TI for use only with TI Devices.
    *
    * Neither the name of Texas Instruments Incorporated nor the names of its suppliers
    *
    * may be used to endorse or promote products derived from this software without
    * specific prior written permission.
    *
    * DISCLAIMER.
    *
    * THIS SOFTWARE IS PROVIDED BY TI AND TI'S LICENSORS "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 TI AND TI'S LICENSORS 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.
    *
    */
    
    /**
     *  \file can_profile.h.c
     *
     *  \brief Main file for TI-RTOS build
     */
    
    /* ========================================================================== */
    /*                             Include Files                                  */
    /* ========================================================================== */
    /* XDCtools Header files */
    #include <xdc/std.h>
    #include <xdc/runtime/Error.h>
    #include <xdc/runtime/System.h>
    /* BIOS Header files */
    #include <ti/sysbios/BIOS.h>
    #include <ti/sysbios/knl/Task.h>
    
    #include <ti/csl/arch/csl_arch.h>
    #include <ti/csl/soc.h>
    #include <ti/csl/cslr.h>
    
    #include <ti/osal/osal.h>
    #include <ti/osal/TaskP.h>
    
    #include "CanApp_Startup.h"
    #include "can_profile.h"
    #include "CanIf.h"
    
    /* ========================================================================== */
    /*                           Macros & Typedefs                                */
    /* ========================================================================== */
    
    /* Test application stack size */
    #define APP_TASK_STACK                  (10U * 1024U)
    /**< Stack required for the stack */
    #define CAN_PROFILE_DEMO_TASK_NAME      ("CAN PROFILE")
    #define SAMPLE0_TASK_NAME      ("SAMPLE")
    #define SAMPLE1_TASK_NAME      ("SAMPLE")
    /**< Task name */
    
    /* ========================================================================== */
    /*                         Structure Declarations                             */
    /* ========================================================================== */
    
    /* None */
    
    /* ========================================================================== */
    /*                          Function Declarations                             */
    /* ========================================================================== */
    
    static Void CanApp_TaskFxn(UArg a0, UArg a1);
    static Void Sample0_TaskFxn(UArg a0, UArg a1);
    static Void Sample1_TaskFxn(UArg a0, UArg a1);
    static void CanApp_Shutdown(void);
    
    /* ========================================================================== */
    /*                            Global Variables                                */
    /* ========================================================================== */
    /* application stack */
    static uint8_t CanApp_TaskStack[APP_TASK_STACK] __attribute__((aligned(32)));
    static uint8_t Sample0_TaskStack[APP_TASK_STACK] __attribute__((aligned(32)));
    static uint8_t Sample1_TaskStack[APP_TASK_STACK] __attribute__((aligned(32)));
    /**< Stack for the task */
    static canAppTaskObj_t  CanApp_TestPrms;
    /**< Test parameters */
    static HwiP_Handle      CanApp_IsrHndls[CAN_MAX_CONTROLLER];
    /**< Stores the ISR handles */
    extern SemaphoreP_Handle CanIf_TxConfirmationSemaphore;
    /**< TX Confirmation semaphore, would be posted when TX completes */
    extern SemaphoreP_Handle CanIf_RxConfirmationSemaphore;
    /**< Rx Confirmation semaphore, would be posted when TX completes */
    /* ========================================================================== */
    /*                            External Variables                              */
    /* ========================================================================== */
    extern uint32 CanIf_DrvStatus;
    /**< CAN IF Driver Status, defined in CanIf.c */
    
    /* ========================================================================== */
    /*                          Function Definitions                              */
    /* ========================================================================== */
    
    int main(void)
    {
        Task_Handle task;
        Error_Block eb;
        Task_Params taskParams;
    
    #ifdef UART_ENABLED
        AppUtils_Init();
    #endif
        CanApp_Startup();
        CanApp_PowerAndClkSrc();
    
        /* Initialize dummy CAN IF */
        CanIf_Init(NULL);
    
        if (CANIF_DRV_INITIALIZED == CanIf_DrvStatus)
        {
            Error_init(&eb);
    
            /* Initialize the task params */
            Task_Params_init(&taskParams);
            taskParams.instance->name = CAN_PROFILE_DEMO_TASK_NAME;
            /* Set the task priority higher than the default priority (1) */
            taskParams.priority     = 2;
            taskParams.stack        = CanApp_TaskStack;
            taskParams.stackSize    = sizeof (CanApp_TaskStack);
    
            task = Task_create(CanApp_TaskFxn, &taskParams, &eb);
            if(NULL == task)
            {
                BIOS_exit(0);
            }
    
    		taskParams.instance->name = SAMPLE0_TASK_NAME;
            taskParams.priority     = 2;
            taskParams.stack        = Sample0_TaskStack;
            taskParams.stackSize    = sizeof (Sample0_TaskStack);
    
            task = Task_create(Sample0_TaskFxn, &taskParams, &eb);
            if(NULL == task)
            {
                BIOS_exit(0);
            }
    
    		taskParams.instance->name = SAMPLE1_TASK_NAME;
            taskParams.priority     = 2;
            taskParams.stack        = Sample1_TaskStack;
            taskParams.stackSize    = sizeof (Sample1_TaskStack);
    
            task = Task_create(Sample1_TaskFxn, &taskParams, &eb);
            if(NULL == task)
            {
                BIOS_exit(0);
            }
            BIOS_start();    /* does not return */
        }
        else
        {
            AppUtils_Printf(MSG_NORMAL, MSG_APP_NAME
                    " Error : CAN IF not initialized !!!\n");
        }
    
        return(0);
    }
    
    static Void CanApp_TaskFxn(UArg a0, UArg a1)
    {
    
        CanApp_PlatformInit();
        Utils_prfInit();
    
        Utils_prfLoadRegister (TaskP_self(), CAN_PROFILE_DEMO_TASK_NAME);
    
        CanApp_TestPrms.numTxPackets = APP_NUM_MSG_PER_ITERATION;
        CanApp_TestPrms.numIterations = APP_NUM_ITERATION;
    
        TaskP_yield();
    
        CanApp_ProfileTest(&CanApp_TestPrms);
    
        CanApp_Shutdown();
    
        Utils_prfLoadUnRegister (TaskP_self());
        Utils_prfDeInit();
        return;
    }
    static Void Sample0_TaskFxn(UArg a0, UArg a1)
    {
    	Task_sleep(2000);
    	AppUtils_Printf(MSG_NORMAL, " Sample String-0000!!!\n");
    }
    static Void Sample1_TaskFxn(UArg a0, UArg a1)
    {
    	Task_sleep(2000);
    	AppUtils_Printf(MSG_NORMAL, " Sample String-1111!!!\n");
    }
    /** \brief Application tear down functions */
    static void CanApp_Shutdown(void)
    {
        uint32 idx;
    
        for (idx = 0U; idx < CAN_MAX_CONTROLLER; idx++)
        {
            if (NULL != CanApp_IsrHndls[idx])
            {
                if (HwiP_OK != HwiP_delete(CanApp_IsrHndls[idx]))
                {
                    AppUtils_Printf(MSG_NORMAL, MSG_APP_NAME
                                    " Error!!! Could not De register"
                                    " the ISR for instance %d!!!\n", idx);
                    break;
                }
            }
        }
    
        if (NULL != CanIf_TxConfirmationSemaphore)
        {
            SemaphoreP_delete(CanIf_TxConfirmationSemaphore);
            if (NULL != CanIf_RxConfirmationSemaphore)
            {
                SemaphoreP_delete(CanIf_RxConfirmationSemaphore);
            }
        }
        return;
    }
    

    SBL Revision: 01.00.09.02 (Sep 18 2020 - 10:33:17)
    
    SYSFW  ver: 20.04.1-v2020.04a (Terrific Lla
    
    CAN Profile App:Variant - Pre Compile being used !!!
    
    CAN Profile App: Successfully Enabled CAN Transceiver MCU MCAN0!!!
    
    CAN Profile App: Successfully Enabled CAN Transceiver MCU MCAN1!!!
    
    CAN Profile App:Will Transmit & Receive (Internal-loopback) 10000 Messages, 2 times
    
     Sample String-1111!!!
    
     Sample String-1111!!!
    
    CAN Profile App:NOTE : Operating in interrupt mode!
    
    CAN Profile App:Transmit & Receive (Internal-loopback)  10000 packets 2 times
    
    CAN Profile App:Average of 86.18534 usecs per packet 
    
    CAN Profile App:Average of 11565 packets in 1 second with CPU Load 4.912140% 
    
    
    CAN Profile App:Packets sent: 20000, Packets recv: 20000 in total time: 3458534 us
    
    
    CAN Profile App:Measured Load: Total CPU: 5.059189%, HWI: 3.689935%, SWI:0.054399% TSK: 1.167806%
    
    
    CAN Profile App:Message Id Received 800000c0 Message Length is 64	 
    
    CAN Profile App:Test completed for 0 instance 
    
    
    
    CAN Profile App: 8192 bytes used for stack 
    
    CAN Profile App:Profiling completes sucessfully!!!

  • Hi,

    I was able to see the same behavior, I added a loop instead of just printing once. I saw that the prints were wrong for the first time but then onwards worked find.

    Looking at the implementation of the AppUtils_Printf() I made a change and then it works fine. I still am not fully sure if this is a bug, so I will keep you posted on this.

    Meanwhile you can make the same modification as me to solve the issue:

    diff --git a/mcal_drv/mcal/examples/utils/src/app_utils.c b/mcal_drv/mcal/examples/utils/src/app_utils.c
    index d084dd7..618a617 100755
    --- a/mcal_drv/mcal/examples/utils/src/app_utils.c
    +++ b/mcal_drv/mcal/examples/utils/src/app_utils.c
    @@ -429,7 +429,7 @@ void AppUtils_LogResult (uint32 testResult)
      */
     void AppUtils_Printf (uint32 type,const char *pcString, ...)
     {
    -    static char printBuffer[APP_UTILS_PRINT_MAX_STRING_SIZE];
    +    char printBuffer[APP_UTILS_PRINT_MAX_STRING_SIZE];
         va_list arguments;
    
         /* Start the varargs processing. */

    Regards,

    Karan

  • Dear Karan,

      thanks for your response.

      And it works fine.

    Regards,

    Huanggl.

  • Hi Huanggl,

    I'm keeping this thread open just to convey the information if this was a bug.

    Regards,

    Karan