Ambiq Apollo4 with pw_system#

Warning

This target is in a very preliminary state and is under active development. This demo gives a preview of the direction we are heading with pw_system, but it is not yet ready for production use.

This target configuration uses pw_system on top of FreeRTOS and the AmbiqSuite SDK HAL.

Setup#

To use this target, Pigweed must be set up to use FreeRTOS and the AmbiqSuite SDK HAL for the Apollo4 series. The FreeRTOS repository can be downloaded via pw package, and the AmbiqSuite SDK can be downloaded from the Ambiq website.

Once the AmbiqSuite SDK package has been downloaded and extracted, the user needs to set dir_pw_third_party_ambiq_SDK build arg to the location of extracted directory:

$ gn args out

Then add the following lines to that text file:

# Path to the extracted AmbiqSuite SDK package.
dir_pw_third_party_ambiq_SDK = "/path/to/AmbiqSuite_R4.3.0"

# Path to the FreeRTOS source directory.
dir_pw_third_party_freertos = "/path/to/pigweed/third_party/freertos"

Building and Running the Demo#

This target has an associated demo application that can be built and then flashed to a device with the following commands:

ninja -C out pw_system_demo

See also

The Ambiq Apollo4 for more info on flashing the Apollo4 board.

Once the board has been flashed, you can connect to it and send RPC commands via the Pigweed console:

pw-system-console -d /dev/{ttyX} -b 115200 \
  --proto-globs pw_rpc/echo.proto \
  --token-databases \
    out/apollo4_pw_system.size_optimized/obj/pw_system/bin/system_example.elf

Replace {ttyX} with the appropriate device on your machine. On Linux this may look like ttyACM0, and on a Mac it may look like cu.usbmodem***.

When the console opens, try sending an Echo RPC request. You should get back the same message you sent to the device.

>>> device.rpcs.pw.rpc.EchoService.Echo(msg="Hello, Pigweed!")
(Status.OK, pw.rpc.EchoMessage(msg='Hello, Pigweed!'))

You can also try out our thread snapshot RPC service, which should return a stack usage overview of all running threads on the device in Host Logs.

>>> device.rpcs.pw.thread.proto.ThreadSnapshotService.GetPeakStackUsage()

Example output:

20220826 09:47:22  INF  PendingRpc(channel=1, method=pw.thread.ThreadSnapshotService.GetPeakStackUsage) completed: Status.OK
20220826 09:47:22  INF  Thread State
20220826 09:47:22  INF    5 threads running.
20220826 09:47:22  INF
20220826 09:47:22  INF  Thread (UNKNOWN): IDLE
20220826 09:47:22  INF  Est CPU usage: unknown
20220826 09:47:22  INF  Stack info
20220826 09:47:22  INF    Current usage:   0x20002da0 - 0x???????? (size unknown)
20220826 09:47:22  INF    Est peak usage:  390 bytes, 76.77%
20220826 09:47:22  INF    Stack limits:    0x20002da0 - 0x20002ba4 (508 bytes)
20220826 09:47:22  INF
20220826 09:47:22  INF  ...

You are now up and running!

See also

The pw_console User Guide for more info on using the the pw_console UI.