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.

TMDSEVM572X: IPC between m4 and a15 using ex11_ping example

Part Number: TMDSEVM572X

Hello TI

I am having difficulty trying to run IPC examples on ipc_3_50_04_08 (using Code Composer Studio) that comes installed with the SDK. My goal is to be able to communicate between cortex m4 and cortex a15. I followed the instructions on the readme.txt file (file attached) and everything went well. The reference example I'm using for my application is ex11_ping. I have also tried using the instructions from IPC_Lab_1_Hello.pdf but no success.

However, when in debug mode (in CCS) and the server_host.xa15fg and server_ipu1.xem4 are loaded, I don't see anything from UART console. Can you kindly provide me directions on how to accomplish this using my EVM?

Thanks and Best Regards

#
#  ======== readme.txt ========
#

ping - Send a message between all cores in the system

Overview
=========================================================================
This example is used to exercise every communication path between all
processors in the system (including local delivery on the current
processor). The example is also organized in a suitable manner to develop
an application with different compute units on each processor.

Each executable will create two tasks: 1) the server task, and 2) the
application task. The server task creates a message queue and then waits
on that queue for incoming messages. When a message is received, the
server task simply sends it back to the original sender.

The application task creates its own message queue and then opens every
server message queue in the system (including the server queue on the
local processor). The task sends a message to a server and waits for the
message to be returned. This is repeated for each server in the system
(including the local server).


Build Instructions
=========================================================================

 1. Setup a development area. A typical setup might look like this. The
    Depot folder contains installed products. The work folder contains
    each of the examples (eg. hello, ping, etc.). Each example contains
    its own products.mak file which will include a parent products.mak
    file if it exists. The parent file must be created by you.

    testbench/
     |_ Depot/
     |   |_ bios_m_mm_pp_bb/
     |   |_ gnu_arm_vv_bb/
     |   |_ ipc_m_mm_pp_bb/
     |   |_ ti_c6x_m_m_p/
     |   |_ ti_tms470_m_m_p/
     |   |_ xdctools_m_mm_pp_bb/
     |
     |_ work/
         |_ ping/
         |   |_ dsp1/
         |   |_ dsp2/
         |   |_ host/
         |   |_ ipu1/
         |   |_ ipu1-0/
         |   |_ ipu1-1/
         |   |_ ipu2/
         |   |_ shared/
         |   |_ makefile
         |   |_ products.mak
         |   |_ readme.txt
         |
         |_ products.mak

    In the ping example, there is a top-level makefile which simply builds
    each of the lower directories. There is a directory for each processor
    named by the IPC processor name. The folder named 'shared' contains
    common files used by all executables, such as config.bld which defines
    the memory map.

 2. Unpack the ping.zip file into the work folder.

    cd work
    unzip <...>/ping.zip

 3. Setup the build environment. Edit products.mak and set the install paths
    as defined by your physical development area. Each example has its own
    products.mak file; you may also create a products.mak file in the parent
    directory which will be used by all examples.

    DEPOT = /testbench/Depot

    BIOS_INSTALL_DIR                = $(DEPOT)/bios_m_mm_pp_bb
    IPC_INSTALL_DIR                 = $(DEPOT)/ipc_m_mm_pp_bb
    XDC_INSTALL_DIR                 = $(DEPOT)/xdctools_m_mm_pp_bb

    gnu.targets.arm.A15F            = $(DEPOT)/gnu_arm_vv_bb
    ti.targets.elf.C66              = $(DEPOT)/ti_c6x_m_m_p
    ti.targets.arm.elf.M4           = $(DEPOT)/ti_tms470_m_m_p
    ti.targets.arp32.elf.ARP32_far  = $(DEPOT)/ti_arp32_m_m_p

 4. Build the example. This will build only debug versions of the executables.
    Edit the lower makefiles and uncomment the release goals to build both
    debug and release executables.

    cd ping
    make

    Look in the following folders for the generated files. All executables
    are copied to these folders for convenience; it makes it easier when
    loading them into CCS.

    install/ping/debug/
    install/ping/release/

 5. Optional. Use the install goal to copy the executables to a specific
    folder of your choice.

    cd ping
    make install EXEC_DIR=/<full pathname>/<platform>

    The executables are copied to the following folders.

    /<full pathname>/<platform>/ping/debug
    /<full pathname>/<platform>/ping/release


Build Configuration
=========================================================================

This example can be built for a subset of all available processors. For
example, you might want to build and run this example for the following
processors: HOST, DSP1, DSP2, IPU1, IPU2. Use the following instructions to configure
this example for a subset of processors.

Note: you must always run the set of processors you configured and built.
In this example, you must run the DSP1, EVE1, and EVE2 executables; you
cannot run just one of them. Because the IPC has been configured for
ProcSync_ALL, all processors must participate in the call to Ipc_start().

 1. Specify the processor list in the top-level makefile.

    edit ping/makefile

    Edit the list of processors in the PROCLIST variable.

# ipu1: implies smp mode
# ipu1-0 ipu1-1: implies non-smp mode
# eve1, eve2, eve3, eve4 not added by default. Can be added as needed.
# PROCLIST = dsp1 dsp2 eve1 eve2 eve3 eve4 ipu1 ipu2 host
PROCLIST = dsp1 dsp2 ipu1 ipu2 host

 2. Clean and rebuild the example.

    cd ping
    make clean
    make

    Look in the following folders for the generated files.

    ping/install/ping/debug
    ping/install/ping/release


Running with CCS on Virtio VPVayu simulator
=========================================================================
 1. Launch Virtio VPVayu

    Start > Innovator
    File > Open Project or File > C:/Virtio/Platforms/VPVayu/VPVayu.vsp

    Toolbar > vayu_general (Platform)

    If you are using the CortexA15_0 core (with HOST):
        Params > User Parameters
        ArmCortexA15_DebugEnable: true

        Params > VPVayu SDP > Vayu > CPU_SS
        InitValue_Core0: 0

    If you are *not* using the CortexA15_0 core (no host):
        Params > User Parameters
        ArmCortexA15_DebugEnable: false

        Params > VPVayu SDP > Vayu > CPU_SS
        InitValue_Core0: 1

    Build/Run > Start or Go (F5), this launches the Virtio Vayu simulator

    Wait for the following message in the Output Window
    CortexA15x2CT_FM: CADI Debug Server started

    Minimize the windows.
    * note: The Cockpit::VPVayu window will indicate '(Not Responding)'.

 2. Launch CCS

    Start > CCS_5_3_0
    Launch one of the following target configurations:
    + VPVayu_5.2
    + VPVayu_5.2_no_host

 3. Place HOST in non-secure mode. If you forget this, the SYS/BIOS tick
    will not run

    In Debug window, select CortexA15_0
    Scripts > Vayu Configuration > enterNonSecureMode

 4. Hide unused cores. This just removes clutter from the Debug window.
    Select any cores you will not be using, then select RMB > Hide Cores.

 5. Group remaining cores. This is more of a convenience than a necessity.

    In Debug window, select cores:
    + IPU1_core_0
    + IPU1_core_1
    RMB > Group cores

    In Debug window, select cores:
    + IPU2_core_0
    + IPU2_core_1
    RMB > Group cores

    In Debug window, select cores:
    + DSP_1
    + DSP_2
    + EVE_1
    + EVE_2
    + EVE_3
    + EVE_4
    RMB > Group cores

 6. Load each executable onto its respective processor. Note that the CCS
    processor name may not match exactly with the executable name. Use
    the following mapping.

    server_dsp1.xe66      --> DSP_1
    server_dsp2.xe66      --> DSP_2
    server_eve1.xearp32f  --> EVE_1
    server_eve2.xearp32f  --> EVE_2
    server_eve3.xearp32f  --> EVE_3
    server_eve4.xearp32f  --> EVE_4
    server_ipu1.xem4      --> IPU1_core_0
    server_ipu2.xem4      --> IPU2_core_0
    server_host.xa15fg    --> CortexA15_0

    When loading the executable onto IPU1 or IPU2, you only need to load
    core_0, not both cores. After loading core_0, select core_1 and just
    load symbols, then restart the core to update the PC register.

 7. Set a software breakpoint in each executable's "done" function. Use the
    CCS Disassembly window. For the Benelli processors, you will need to set
    the same breakpoint on both cores. Use the following mapping of CCS
    processor names to function names.

    DSP_1        --> MainDsp1_done
    DSP_2        --> MainDsp2_done
    EVE_1        --> MainEve1_done
    EVE_2        --> MainEve2_done
    EVE_3        --> MainEve3_done
    EVE_4        --> MainEve4_done
    IPU1_core_0  --> MainIpu1_done
    IPU1_core_1  --> MainIpu1_done
    IPU2_core_0  --> MainIpu2_done
    IPU2_core_1  --> MainIpu2_done
    CortexA15_0  --> MainHost_done

 8. Run the processors. I recommend running CortexA15_0 first, then other
    processors. As each processor hits the "done" breakpoint, make a note
    and let the processor continue. Do this for each processor. If the
    CortexA15_0 status shows 'Suspended - Cross-triggering', then simply
    run it again.

    Select CortexA15_0 > Run > Resume (F8)
    Select Group3 > Run > Resume (F8)
    Select Group2 (Synchronous) > Run > Resume (F8)
    Select Group1 (Synchronous) > Run > Resume (F8)

 9. Inspecting log events. Use the CCS RTOS Object View (ROV) to inspect
    the LoggerBuf module for each processor. You should see log events from
    both the server task and the application task.

    Select CortexA15_0 > Run > Suspend
    Select Group3 > Run > Suspend
    Select Group2 > Run > Suspend
    Select Group1 > Run > Suspend

    Select CortexA15_0
    Open ROV window
    Select LoggerBuf module

    There should be several log events in window. Repeat this for each
    processor. The number of events will depend on how many processors
    are configured into your configuration.

IPC_Lab_1_Hello.pdf

  • Hi Chris,

    I am trying to understand your statement "everything went well" and the subsequent question. Can you confirm that the release images are working but the debug images are not?

    regards

    Suman

  • Hello Suman
    I used this project

    (e2e.ti.com/.../rtos-am5746-request-to-prepare-the-ex11_ping-project-available-to-be-building-on-ccs) 

    as reference for m4 and A15 as I could not get the debug and release version to work.

    My goal is to use IPC between m4 and a15. Can you create a project I could import that I can build on CCS?
    I would like to use this project as my code base for my application.

    Thanks and Regards

  • Hello Suman

    Hope you're doing well.

    I wanted to find out if you've been able to look at my previous post:

    My goal is to use IPC between m4 and a15. Can you create a project I could import that I can build on CCS?
    I would like to use this project as my code base for my application.

    Thanks and Regards

  • Hi Chris,
    Is this issue still open?
    If yes, can you please mention current state of the issue.
    Also, please mention if you are working on a custom board or is it a TI EVM.

    The reference example I'm using for my application is ex11_ping.

    Is the default ex11_ping example working fine fore you?

    Regards,
    Parth