aboutsummaryrefslogtreecommitdiff
path: root/applications/message_handler_openamp/README.md
blob: e1d1bb0a05bb0a9bb88e41006c412812832d90b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# Enabling trace resource in the message_handler_openamp application

The message_handler_openamp application provides support for logging to a trace buffer via the trace entry in the resource table. The following instructions briefly describe one way of enabling the trace resource in the firmware's resource table:

1. Enable building message_handler_openamp with trace buffer support by setting the CMake BOOL cache entry ENABLE_REMOTEPROC_TRACE_BUFFER to ON in the target's CMakeLists.txt

2. Update the target's linker scripts to include an `ethosu_core_trace_buffer` section that is placed in the DRAM as shown in the examples below. The linker-defined symbols for the trace buffer's address and size are later used by the message_handler_openamp to setup the trace buffer in the resource table.

linker-script.ld:
```
SECTIONS
{
  .dram ():
  {
    /* Trace buffer */
    __ethosu_core_trace_buffer_start__ = .;
    *(ethosu_core_trace_buffer)
    __ethosu_core_trace_buffer_size__ = ABSOLUTE(. - __ethosu_core_trace_buffer_start__);
  } > DRAM_REGION
```

scatter-file.scatter:
```
LOAD_REGION_DRAM DRAM_ADDRESS DRAM_SIZE
{
    /* Trace buffer */
    trace_buffer (DRAM_ADDRESS + 0x20000) FIXED
    {
        * (ethosu_core_trace_buffer)
    }
}
```

3. Allocate the trace buffer and place it in the section defined above using the `section` attribute. Finally, implement the `fputc` function in the retarget file so that writes to stderr and stdout are redirected to the trace buffer. Example:

retarget.c:
```
#define TRACE_BUFFER_SIZE 0xXXXX
__attribute__((section("ethosu_core_trace_buffer"))) char trace_buffer[TRACE_BUFFER_SIZE] = {0};
int fputc(int ch, FILE *f) {
    (void)f;
    uint8_t c = (uint8_t)ch;

    static uint32_t write = 0;
    trace_buffer[write % TRACE_BUFFER_SIZE] = c;
    write++;

    return c;
}
```