Apalis i.MX8でのMコアのHello World

Cortex-M40コアからサンプルプログラムを/ostree/deploy/torizon/var/に置き、Hello worldの実行しましたが、「Hello world」が表示されませんでした。
具体的には run m4boot_0 を実行したのち、

Power on M4 and MU
Copy M4 image from 0x95400000 to TCML 0x34fe0000
Start M4 0
bootaux complete

まで表示されますが、Hello worldは表示されず、再起動されてしまいます。
なお、M4 1 でも実験いたしましたが同様でした。

★環境
image:torizon-core-docker-apalis-imx8-Tezi_6.4.0+build.5
SoM:Apalis i.MX8QM 4GB WB IT V1.1B
Board:Apalis Evaluation Board V1.1C

設定した環境変数
loadm4image_0=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${m4_0_image}
loadm4image_1=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${m4_1_image}
m4_0_image=/ostree/deploy/torizon/var/hello_world_m40.bin
m4_1_image=/ostree/deploy/torizon/var/hello_world_m41.bin
m4boot_0=run loadm4image_0; dcache flush; bootaux ${loadaddr} 0
m4boot_1=run loadm4image_1; dcache flush; bootaux ${loadaddr} 1

確認したページ
How to Load Compiled Binaries into Cortex-M | Toradex Developer Center
How to Run Hello World on the Cortex-M | Toradex Developer Center

Hi, I’m the Toradex AI Assistant. The Toradex Support team will follow up with you shortly!

Did you like my answer?

:+1: :-1:


Based on the context provided, it seems like you are trying to run a “Hello World” application on the Cortex-M core of the Apalis iMX8 module but are encountering issues with the output not displaying as expected. Here are a few things to consider:

  1. UART Configuration: Ensure that the UART pins used by the Cortex-M core are not being taken over by the Linux kernel. You might need to apply a device tree overlay to disable the Linux kernel’s access to these pins, as mentioned in the context. This is crucial because the Linux kernel might be reconfiguring the pins, causing the Cortex-M UART output to stop.

  2. Device Tree Overlay: Make sure you have applied the correct device tree overlay for the Apalis iMX8 to disable the UART used by the Cortex-M. This is necessary to prevent the Linux kernel from interfering with the UART communication.

  3. Firmware Loading: Double-check the memory addresses and ensure that the firmware is being loaded correctly. The addresses used in your environment variables (0x95400000 to 0x34fe0000) should match the expected memory map for the Cortex-M core.

  4. Debugging: If the above steps do not resolve the issue, consider using JTAG debugging to step through the code and verify that the “Hello World” application is running as expected. This can help identify if the application is crashing or if there is another issue preventing the output.

  5. Check for Reboots: Since you mentioned that the system reboots, ensure that there are no watchdog timers or other mechanisms that might be causing the Cortex-M core to reset.

If these suggestions do not resolve the issue, you may need to consult additional resources or contact Toradex technical support for further assistance.

Please, also check if these links can help you solve your problem:

M4 Segger jlink debug reset.

@Soejima ご連絡ありがとうございます。

Mコアからのシリアル出力を確認するために、別のシリアルコンソールターミナルを開いていますか?どのようにされていますか?念のため、FreeRTOSコードのUART設定を共有していただけますか?

よろしくお願いいたします。

サンプルから変更していないため、M4 0使用時はUART0・M4 1 使用時はUART2を使用しています。(ボーレートは115200)
また、M4 1使用の際はコンソールは別で開いており、想定している別のUARTから出ていないかは確認済みです。

image

ご連絡ありがとうございます。

以下の2点をご確認ください:

  1. まず、UARTシリアル接続(Cortex-M)が正しいか確認ください。もしUSB-TTLアダプタを使用している場合は、以下の接続を確認してください。
USB-TTL Signal Apalis Eval Board (M4_0) Apalis Eval Board (M4_1)
TX MXM3_110 MXM3_6
RX MXM3_120 MXM3_8
GND SoC GND SoC GND
  1. また、U-boot変数が正しく設定されていないと思います(loadm4image_0とloadm4image_1)。以下のコマンドを実行してください:
setenv load_cmd "ext4load mmc 0:1"
setenv m4_0_image "/ostree/deploy/torizon/var/hello_world_m40.bin"
setenv m4_1_image "/ostree/deploy/torizon/var/hello_world_m41.bin"
setenv loadm4image_0 '${load_cmd} ${loadaddr} ${m4_0_image}'
setenv loadm4image_1 '${load_cmd} ${loadaddr} ${m4_1_image}'

printenv m4boot_0 
m4boot_0=run loadm4image_0; dcache flush; bootaux ${loadaddr} 0
printenv loadm4image_0 
loadm4image_0=${load_cmd} ${loadaddr} ${m4_0_image}
printenv m4boot_1
m4boot_1=run loadm4image_1 dcache flush; bootaux ${loadaddr} 1
printenv loadm4image_1 
loadm4image_1=${load_cmd} ${loadaddr} ${m4_1_image}

これでM4コアの起動が可能になるはずです。

run m4boot_0
run m4boot_1

詳しくはこちらをご確認ください:

お願いがございます:

以下のコードは、デベロッパサイトのどこで見つけられたのでしょうか?これは正しくないため、修正したいと考えています。よろしくお願いします。

loadm4image_0=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${m4_0_image}
loadm4image_1=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${m4_1_image}

以上、ご確認いただけますと幸いです。
引き続きよろしくお願いいたします。
アルバロ

回答いただきありがとうございます。
HelloWorldの出力が確認できたようです。

設定した環境変数に関しては、トライアルアンドエラーの際にデベロッパサイトの内容ではなく下記のコミュニティの変数を使用し、そのままになっていたものです。

ご確認頂きありがとうございます。
解決できて何よりです。

コミュニティの変数は使用されたこと、承知致しました。

以上、引き続きよろしくお願いいたします。
アルバロ。

1 Like