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.

[参考译文] SK-AM62-LP:MCU 内核停止后无法关闭 rpmsg

Guru**** 2382480 points
Other Parts Discussed in Thread: AM62P
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1465711/sk-am62-lp-can-not-close-the-rpmsg-after-mcu-core-stop

器件型号:SK-AM62-LP
主题中讨论的其他器件:TPS65219AM62P

工具/软件:

HELO

 我使用 rpmsg lib 找到了一个错误。 如果 m4fcore 已停止或从暂停状态恢复、则 在使用 rpmsg_char_close 来 关闭 rpmsg char dev 时、UART 还会打印一些错误消息。

- 如何推断:

 1.启动 m4fcore 正常。

 2.运行使用 ti_rpmsg_char lib 来初始化、打开 并从 rpmsg_char_dev_t 器件读取的演示

 3.通过执行 "echo stop >/sys/class/remoteproc/remoteproc0/state "来停止 M4F 状态。 或通过执行"rtcwake -s 5 -m mem"从暂停状态恢复

 4.终止演示,在 演示结束时,它会调用"int rpmsg_char_clos(rpmsg_char_dev_t *rcdev )" 来关闭设备 opend。  

 5.在这里,我们将看到演示块,并看到 kmsg 打印信息如下:

 

[3141.242700]无法处理虚拟地址0000000000000008处的内核 NULL 指针解除引用
[ 3141.251653]存储器中止信息:
[3141.254542] ESR = 0x0000000096006
[3141.258368] EC = 0x25:DABT (电流 EL)、IL = 32位
[3141.263738] SET = 0、FnV = 0
[3141.266785] EA = 0、S1PTW = 0
[3141.269951] FSC = 0x06:2级转换故障
[3141.274835]数据中止信息:
[3141.277716] ISV = 0、ISS = 0x00000006、ISS2 = 0x00000000
[ 3141.283197] CM = 0、WNR = 0、TND = 0、TagAccess = 0
[3141.288246] GCS = 0、覆盖层= 0、DirtyBit = 0、Xs = 0
[3141.293555] user pgtable:4K 页、48位 vas、pgdp=000000008ae07000
[3141.299990][0000000000000008] PgD=0800000087b23003、p4d=0800000087b23003、pud=0800000087a82003、PMD=0000000000000000
[3141.310796]内部错误:oops:0000000096000006 [#1] Prepend SMP
[3141.317056]链接的模块:iptable_filter iptable_nat xt_masquerade nf_nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 libcrc32c ip_tables x_tables wlan_7961_sdirpmsg_ctrpmsg_char
[3141.348887] cpu:0 pid:47091 comm: tbox_manager tainted: g O 6.6.32-ti #1.
[ 3141.357136]硬件名称:Texas Instruments AM62x LP SK (DT)
[3141.362868] pstate:600005 (nZCv daif -pan -uAO -TCO -DIT -SSB BTYPE=--)
[3141.369815] pc : kernfs_find_and_get_ns+0x20/0x74
[3141.374522] lr : sysfs_unmerge_group+0x24/0x68
[3141.378958] sp : ffff80008587bc90
[3141.382261] x29:ffffff80008587bc90 x28:ffff0000065d1c80 x27:000000000000
[ 3141.389386] x26:000000000000 x25:000000000000 x24:0000000000000000
[ 3141.396510] x23:ffff000008dc9c70 x22:000000000000 x21:ffffff800080a4b5f8
[3141.403634] x20:ffff800080a4b4c0 x19:000000000000 x18:000000000000
[ 3141.410758] X17:000000000000 x16:0000000000000000 x15:0000000000000000
[ 3141.417882] x14:000000000000 X13:00000000x12 00000000:0000000000000000
[3141.425006] x11:0000000000000000 x10:0000000000000000:0000000000000000
[3141.432129] x8 : 0000000000000000 x7 : ffffff00000679b118 x6 : ffff00000ae4e7c8.
[3141.439254] x5:000000000000 x4:000000000000 x3:0000000000480000
[3141.446377] x2 : 000000000000 x1 : ffff800080a4b5f8 x0 : 000000000000
[3141.453502]呼叫跟踪:
[3141.455939] kernfs_find_and_get_ns+0x20/0x74
[ 3141.460286] sysfs_unmerge_group+0x24/0x68
[ 3141.464373] DPM_sysfs_remove+0x30/0x6c
[3141.468206] device_del+0xa0/0x424
[ 3141.471603] cdev_device_del+0x20/0x60
[3141.475346] rpmsg_chrdev_eptdev_destroy+0x60/0x84 [rpmsg_char]
[3141.481268] rpmsg_eptDEV_ioctl+0xc8/0xe0 [rpmsg_char]
[ 3141.486401]__arm64_sys_ioctl+0xac/0xf0
[3141.490316] Invoke_syscall+0x48/0x114
[ 3141.494060] el0_Svc_common.constprop.0+0xc0/0xe0
[3141.498755] do_el0_Svc+0x1c/0x28
[3141.502062] el0_Svc+0x2C/0x84
[ 3141.505113] el0t_64_SYNC_HANDLER+0x120/0x12c
[3141.509461] el0t_64_SYNC+0x190/0x194
[3141.513121]代码:aa0003 a9025bf5 aa0103f5 aa0203f6 (f9400400)
[3141.519200]--[结束跟踪0000000000000000 ]-----

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Xiao、

    感谢您的举报。

    1)您使用的是哪个版本的 Linux SDK?

    2)您使用哪个版本的 ti-rpmsg-char 项目?

    3)你要杀死演示的确切步骤是什么? 我们是否需要任何其他信息、以便遵循您的确切步骤并查看我们的行为?

    此致、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nick:

    1) SDK 版本是10.00.07.04。

    2)  ti-rpmsg-char 版本为 0.6.7版本。

     am62-mcu-m4f0_0-fw 版本为  10.01.10、您可能 对此感兴趣。

    3)我发送一个 kill 信号(Ctrl+c )到我的演示, 在这个演示中,我捕获这个信号,并 在发生时调用"rpmsg_char_close"。

    只需确保 只有在 am62-mcu-m4f0_0-fw 停止后、  调用 rpmsg_char_close 才会阻止、 内核将显示这些行为。

    我不确定以下信息是否有帮助。   当我们尝试从深度睡眠中唤醒 soc 时、我们发现了这些情况。  然后、我们发现 A53和 M4F 之间的 rpmsg 通信不能使用、 (由于我们的 MCU 代码、rpmsg 从深度睡眠中唤醒后肯定不会正常工作、我们现在也在尝试修复这些错误。) 然后,我们要停止 M4F 并手动重新启动它,在这段尝试时间内,我们发现在重启 M4F 之前,我们无法正常地在 soc 端退出我们的应用程序。 最后、 我们发现它在退出步骤中被 rpmsg_char_close 阻止。 然后、我们   在 am62xx«ti-IPC - processor-firmware/ti-linux-firmware -之前在不同位置托管的各种 TI 固件源和二进制工程的整合中央位置中将 M4F 固件替换为 am62-mcu-m4f0_0-FW。 它会发生同样的事情,然后我们检查上面找到的关于转储信息的内核消息。

    如果我们忽略关闭 rpmsg dev 并 在重新启动 MCU 后再次重新打开 rpmsg、则它会正常工作、并且可以与 MCU 通信。 但是、如果我们不关闭它、我们不能确定这些问题会导致资源泄漏。

    此致、

    Xiao-An。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Nick  

    您能给我们一些意见吗?

    我也试图澄清这个问题,这里是我的评论

    (一)您好、 晓安。 我很好奇,想知道什么是 RPMsg 项目为你做这个实验? 或者、您只使用默认的二进制文件" am62-mcu-m4f0_0-fw"

    (2)您的"演示"是否表示 Linux 工具"rpmsg_char_simple"?

    (3)我想(猜测)我们确实按照正常步骤在进入深度睡眠模式之前关闭 A53和 R5之间的 rpmsg 服务通信。 我们是否有重新启动 rpmsg 通信的正常程序?

    谢谢你。

    Gibbs

    另一个参考、

    https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/08_03_00_19/exports/docs/linux/Foundational_Components_IPC62x.html

    https://software-dl.ti.com/mcu-plus-sdk/esd/AM62X/10_01_00_33/exports/docs/api_guide_am62x/IPC_GUIDE.html

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Gibbs:

    (1)。 只需使用默认二进制文件  " am62-mcu-m4f0_0-fw"、  

    (2)。  这个演示并不意味着 Linux 工具的 rpmsg_char_simple,但 我们写代码引用它,我们尝试了你在这里说的工具,它 有段故障 行为. 此外、只需确保 使用"echo stop >/sys/class/remoteproc/remoteproc0/state "停止远程内核 、当它运行到第155行时、它将在那里崩溃并报告段故障。

    (3)。 在这种情况下、重新启动 RPMSG 通信无效。 通常、在重新启动演示应用和 am62-mcu-m4f0_0-fw 时、与 M4内核的通信将不间断地恢复。 我们的主要目标是解决调用 rpmsg_char_close 来结束通信时发生的阻塞/崩溃问题。 如果没有解决问题、我们在调用 rpmsg_char_close 或 rpmsg_char_exit 时必须小心、因为它们在阻塞或崩溃情况下的安全性存在不确定性。

    目前、我们知道、在进入深度睡眠模式时、我们应确保在停止远程内核之前关闭 RPMSG 器件。 但是、在某些情况下、M4远程内核可能会在我们 按照"ti-rpmsg-char 库"的建议关闭之前先在其他地方停止。

    此致、

    Xiao-An。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Nick:  
    使用 SDK 的演示有一些问题、测试固件和应用程序:
    - soc rpmsg demo: rpmsg_char_simple
    - MCU FW:am62-mcu-m4f0_0-fw
    1.回波开始> /sys/class/remoteproc/remoteproc0/state
    2. rpmsg_char_simply -r 9 -n 1000000000
    3. dmesg -c
    4.回声停止> /sys/class/remoteproc/remoteproc0/state
    5.  rpmsg_char_simplet 崩溃 并报告分段故障。
    5. dmesg 检查内核消息
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、 Xiao-an & Gibbs、

    设定期望

    对此处延迟的回复表示歉意。 我几乎可以回到这个主题的工作-如果我没有在星期五再次回复,请随时 ping 该主题。

    今天我与 Anshu (https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1472535/am620-q1-mcu-work-failed-when-am62x-wakeup-return-from-deep-sleep-mode)讨论了此主题、我要键入对此主题的初始响应。 在我的下一个答复中,我将尝试复制你在我身边观察到的行为。

    这种情况下的预期行为是什么?  

    我怀疑这是一个未经测试的用例。 请记住,我们的 RemoteProc 驱动程序的"挂起"框架仍在积极开发中。 稍后将提供更多详细信息。

    当前测试的是什么?

    我们已经测试: (所有 AM6x 处理器上均为 M4F、AM64x 等处理器上为 R5F、AM62A/AM62P 上为 MCU R5F)
    * Linux 与远程内核之间的 RPMsg IPC  
    *通过回波停止将远程内核降下
    *启动远程内核并启动回波
    * Linux 与远程内核之间的 RPMsg IPC

    我们还测试了低功耗模式转换。

    我认为我们没有经过测试
    * RPMsg ,其中 Linux 端应用程序被关闭,然后备份,而不是远程内核。
    *低功耗模式转换后的 RPMsg

    我将与开发人员一起仔细检查当前正在测试的内容。

    此致、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、 Nick

     感谢您提供这些信息。  它帮助我了解更多。  您是否  在您身边复制它?

    此致、

    Xiao-An。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的先生:
    请 忘记暂停和继续、只需执行以下步骤:
    1.使用登录主板 外壳 A 、 确保 打开 M4F
    3、启动演示"rpmsg_char_simple"、 确保它始终在运行。 不要阻止它会  关闭 M4F 内核、 为了实现这些目标、我们在"-n"之后提供值1000000000  
    rpmsg_char_simple -r 9 -n 10000000000

    4.用另一个登录主板 外壳 B 、清除内核消息避免误导、并如下所示关闭 M4F 内核、  请注意,不要使用"CTRL+C"或 在 shell A 同时关闭 rpmsg_char_simple
    dmesg -c
    echo stop > /sys/class/remoteproc/remoteproc0/state
    5.现在, 再次将焦点移到 shell A 上,并关闭 rpmsg_char_simple, 您将看到"segmentation fault"错误  
    6.键入"dmesg"检查内核报告消息
    重要的关键是   RPMsg 应用程序在 M4F 内核关闭后自行关闭
    此致、
    Xiao-An
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、 Xiao-an

    我引用尼克的帖子,并基于你的帖子,我尝试再次重复你的问题

    shell A:远程 telnet 至 AM62

    Shell B:本地 UART 调试控制台(minicom)

    步骤1:shell A (您需要确保 M4 FW 已运行)

    启动 rpmsg 客户端

    rpmsg_char_simple -r 9 -n 10000000000
    
    Created endpt device rpmsg-char-9-1430, fd = 4 port = 1025                          
    Exchanging 1000000000 messages with rpmsg device rpmsg-char-9-1430 on rproc id 9 ...
                                                         
    Sending message #0: hello there 0!                   
    Received message #0: round trip delay(usecs) = 190110
    hello there 0!                                      
    Sending message #1: hello there 1!                  
    Received message #1: round trip delay(usecs) = 63905
    hello there 1!                                      
    Sending message #2: hello there 2!                  
    Received message #2: round trip delay(usecs) = 56400
    hello there 2!                                      
    Sending message #3: hello there 3!  
    
    ....

    第2步:外壳 B.

    强制关闭远程核心。

    Received message #70417: round trip delay(usecs) = 113490
    hello there 70417!
    Sending message #70418: hello there 70418!
    Received message #70418: round trip delay(usecs) = 95660
    hello there 70418!
    Sending message #70419: hello there 70419!
    Received message #70419: round trip delay(usecs) = 82365
    hello there 70419!
    Sending message #70420: hello there 70420!
    Can't write to rpmsg endpt device
    : Broken pipe
    send_msg failed for iteration 70420, ret = -1
    Segmentation fault
    root@am62xx-lp-evm:~# 
    

    root@am62xx-lp-evm:~# echo stop > /sys/class/remoteproc/remoteproc0/state
    [ 5836.487072] ------------[ cut here ]------------
    [ 5836.490917] remoteproc remoteproc0: stopped remote processor 5000000.m4fss
    [ 5836.491811] sysfs group 'power' not found for kobject 'rpmsg2'
    root@am62xx-lp-evm:~# [ 5836.506721] WARNING: CPU: 1 PID: 1467 at /fs/sysfs/group.c:282 sysfs_remove_group+0x94/0xa0
    [ 5836.515117] Modules linked in: overlay snd_soc_hdmi_codec rpmsg_ctrl rpmsg_char cfg80211 snd_soc_simple_card crct10dif_ce snd_soc_si6
    [ 5836.567648] CPU: 1 PID: 1467 Comm: rpmsg_char_simp Tainted: G      D W  O       6.6.32-ti-g6de6e418c80e-dirty #1
    [ 5836.577809] Hardware name: Texas Instruments AM62x LP SK (DT)
    [ 5836.583542] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
    [ 5836.590491] pc : sysfs_remove_group+0x94/0xa0
    [ 5836.594848] lr : sysfs_remove_group+0x94/0xa0
    [ 5836.599196] sp : ffff800084f0bcb0
    [ 5836.602499] x29: ffff800084f0bcb0 x28: ffff00000860d580 x27: 0000000000000000
    [ 5836.609626] x26: 0000000000000000 x25: 0000000000000000 x24: 0000000000000000
    [ 5836.616750] x23: ffff000023c2c070 x22: 0000000000000000 x21: ffff00000645dc00
    [ 5836.623875] x20: ffff800080c75990 x19: 0000000000000000 x18: 0000000000000000
    [ 5836.630999] x17: 0000000000000000 x16: 0000000000000000 x15: 01956565b8223d44
    [ 5836.638123] x14: 00007598ca78ed78 x13: 00000000000003e1 x12: 00000000000003e1
    [ 5836.645248] x11: 0000000000000000 x10: 00000000000009b0 x9 : ffff800084f0bb20
    [ 5836.652373] x8 : ffff00000860df90 x7 : ffff00007728b200 x6 : 0000000001d6e349
    [ 5836.659497] x5 : 0000000000000000 x4 : 0000000000000001 x3 : 000000000000020c
    [ 5836.666622] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff00000860d580
    [ 5836.673747] Call trace:
    [ 5836.676185]  sysfs_remove_group+0x94/0xa0
    [ 5836.680187]  dpm_sysfs_remove+0x5c/0x6c
    [ 5836.684020]  device_del+0xa0/0x424
    [ 5836.687418]  cdev_device_del+0x20/0x60
    [ 5836.691166]  rpmsg_chrdev_eptdev_destroy+0x60/0x84 [rpmsg_char]
    [ 5836.697089]  rpmsg_eptdev_ioctl+0xc8/0xe0 [rpmsg_char]
    [ 5836.702222]  __arm64_sys_ioctl+0xac/0xf0
    [ 5836.706136]  invoke_syscall+0x48/0x114
    [ 5836.709880]  el0_svc_common.constprop.0+0xc0/0xe0
    [ 5836.714575]  do_el0_svc+0x1c/0x28
    [ 5836.717882]  el0_svc+0x2c/0x84
    [ 5836.720933]  el0t_64_sync_handler+0x120/0x12c
    [ 5836.725280]  el0t_64_sync+0x190/0x194
    [ 5836.728934] ---[ end trace 0000000000000000 ]---
    [ 5836.733666] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000020
    [ 5836.742478] Mem abort info:
    [ 5836.745266]   ESR = 0x0000000096000006
    [ 5836.749054]   EC = 0x25: DABT (current EL), IL = 32 bits
    [ 5836.754372]   SET = 0, FnV = 0
    [ 5836.757419]   EA = 0, S1PTW = 0
    [ 5836.760560]   FSC = 0x06: level 2 translation fault
    [ 5836.765436] Data abort info:
    [ 5836.768315]   ISV = 0, ISS = 0x00000006, ISS2 = 0x00000000
    [ 5836.773796]   CM = 0, WnR = 0, TnD = 0, TagAccess = 0
    [ 5836.778844]   GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
    [ 5836.784154] user pgtable: 4k pages, 48-bit VAs, pgdp=0000000091be1000
    [ 5836.790590] [0000000000000020] pgd=0800000083be5003, p4d=0800000083be5003, pud=0800000091a4a003, pmd=0000000000000000
    [ 5836.801202] Internal error: Oops: 0000000096000006 [#12] PREEMPT SMP
    [ 5836.807544] Modules linked in: overlay snd_soc_hdmi_codec rpmsg_ctrl rpmsg_char cfg80211 snd_soc_simple_card crct10dif_ce snd_soc_si6
    [ 5836.860042] CPU: 1 PID: 1467 Comm: rpmsg_char_simp Tainted: G      D W  O       6.6.32-ti-g6de6e418c80e-dirty #1
    [ 5836.870198] Hardware name: Texas Instruments AM62x LP SK (DT)
    [ 5836.875929] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
    [ 5836.882876] pc : klist_put+0x28/0xf0
    [ 5836.886453] lr : klist_del+0x14/0x20
    [ 5836.890020] sp : ffff800084f0bcc0
    [ 5836.893323] x29: ffff800084f0bcc0 x28: ffff00000860d580 x27: 0000000000000000
    [ 5836.900449] x26: 0000000000000000 x25: 0000000000000000 x24: 0000000000000000
    [ 5836.907573] x23: ffff000023c2c070 x22: 0000000000000001 x21: ffff000003b8b100
    [ 5836.914697] x20: 0000000000000000 x19: ffff0000064f4528 x18: 0000000000000000
    [ 5836.921822] x17: 0000000000000000 x16: 0000000000000000 x15: 01956565b8223d44
    [ 5836.928946] x14: 00007598ca78ed78 x13: 00000000000003e1 x12: 00000000000003e1
    [ 5836.936070] x11: 0000000000000000 x10: 00000000000009b0 x9 : ffff800084f0bb20
    [ 5836.943194] x8 : ffff00000860df90 x7 : ffff00007728b200 x6 : 0000000001d6e349
    [ 5836.950319] x5 : 0000000000000000 x4 : 0000000000000001 x3 : 000000000000020c
    [ 5836.957443] x2 : 0000000000000000 x1 : 0000000000000001 x0 : 0000000000000000
    [ 5836.964567] Call trace:
    [ 5836.967004]  klist_put+0x28/0xf0
    [ 5836.970226]  klist_del+0x14/0x20
    [ 5836.973447]  device_del+0xb0/0x424
    [ 5836.976845]  cdev_device_del+0x20/0x60
    [ 5836.980590]  rpmsg_chrdev_eptdev_destroy+0x60/0x84 [rpmsg_char]
    [ 5836.986511]  rpmsg_eptdev_ioctl+0xc8/0xe0 [rpmsg_char]
    [ 5836.991645]  __arm64_sys_ioctl+0xac/0xf0
    [ 5836.995559]  invoke_syscall+0x48/0x114
    [ 5836.999303]  el0_svc_common.constprop.0+0xc0/0xe0
    [ 5837.003998]  do_el0_svc+0x1c/0x28
    [ 5837.007304]  el0_svc+0x2c/0x84
    [ 5837.010352]  el0t_64_sync_handler+0x120/0x12c
    [ 5837.014698]  el0t_64_sync+0x190/0x194
    [ 5837.018356] Code: 12001c36 f9400014 927ffa94 aa1403e0 (f9401295) 
    [ 5837.024436] ---[ end trace 0000000000000000 ]---
    
    root@am62xx-lp-evm:~# 
    

    对于外壳 A 和 B、控制台不会挂起

    我认为"分段故障"是合理的、因为您已经强制关闭远程 M4内核。  (请注意、M4是 rpmsg 服务器端)

    但您可以再次启动远程内核(M4)、客户端测试程序可以继续运行、并且 RPMsg 正常。

    即使我尝试"ctrl + c"来强制关闭"rpmsg_char_simple"和"重新启动测试程序"、也可以正常工作。

    因此当 M4 FW 处于活动状态时, RPmsg 通信通道始终存在,即使您尝试强制关闭 rpmsg 客户端程序也是如此。

    Gibbs

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Gibbs:

    >> 对于外壳 A 和 B、控制台都不挂起

    >>  我认为"分段故障"是合理的、因为您已经强制关闭远程 M4内核。  (请注意、M4是 rpmsg 服务器端)

    是的, 控制台不会挂起, rpmsg_char_simplex 将崩溃,我们的应用程序将在同一个 API 中挂起,我不能再同意你关于"我认为"分段故障"是合理的。

    >> 但您可以再次启动远程内核(M4)、客户端测试程序可以继续运行、并且 RPMsg 正常。

     让我们做一个这样的测试,首先添加一个延迟时间(例如: 5秒)之前关闭通道,如下面的行号155:

    目的是确保    在我们调用 rpmsg_char_close 来结束程序之前、远程内核(M4)有机会再次启动。

    现在、

    1.  在 shell A 中运行 rpmsg_char_simple,  

    2.登录 shell B,"cd /sys/class/remoteproc/remoteproc0 /"

    3.在 shell B 中运行"root@am62xx-LP-EVM:remoteproc0# echo stop > state && echo start > state "

    4. rpmsg_char_simplet 将崩溃,报告"分段故障"

    因此、  如果远程内核(M4)在之前重新启动一次而未注意到 A53、则 A53中的应用程序不知道 rpmsg 是否应关闭。

    顺便说一句,如果远程核心已经重新启动,我们必须重新打开 rpmsg 才能继续与远程核心通信,如果它不应该先关闭, 这意味着我们不释放之前分配的资源,这是非常奇怪的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Nick & Gibbs :  

     现在情况如何?

    BR

    Xiao-An

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Xiao-an

    (1)"分段故障"是由于 rpmsg_char_close (rcdev)失败、因为您已经停止远程内核、我认为此 rpmsg Endpt (FD)已经不存在。

    您的问题应该是:

    * 当客户程序尝试执行时,为什么会出现"分段故障" rpmsg_char_close(rcdev)? 如何防止出现此错误?

    *这是否意味着 M4内核停止前, M4代码应该发送一条关闭消息来通知 rpmsg_char_sample(client)? 如何实现?  

    我认为 RPMsg_client 应 首先关闭 Endpt、然后 M4进入停止状态。

    Sending message #70419: hello there 70419!
    Received message #70419: round trip delay(usecs) = 82365
    hello there 70419!
    Sending message #70420: hello there 70420!
    Can't write to rpmsg endpt device
    : Broken pipe
    send_msg failed for iteration 70420, ret = -1
    Segmentation fault
    root@am62xx-lp-evm:~# 

    (2)当我们不调用 函数时、它是否有任何副作用  rpmsg_char_close() when M4 Core manual stop?

    Gibbs

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    H Gibbs:

    (1):

    》 当客户程序尝试执行时,为什么会出现"分段故障" rpmsg_char_close(rcdev)? 如何防止出现此错误?

    是的,你是对的,"如何防止这种错误发生", 我不认为当我挂断电话,我还必须确保另一方等待我挂断前,他们做同样的.  通常情况下、每一方在自己方便的情况下挂断电话是合理的、而不会干扰对方。 换言之,当你完成时,你会挂断,当对方完成时,对方也会做同样的事情,彼此独立。

    》 *这是否意味着 M4代码应发送一条关闭消息、以便在 M4内核停止之前通知 rpmsg_char_sample (client)? 如何实现?  

    我对此有不同的选项、我认为 M4 在遇到崩溃时不能确保100%发送消息、因此我认为 SOC 端应该能够  独立调用 rpmsg_char_close、而不是 出现"分段故障"、并 在内核中报告"无法处理虚拟地址000000000020处的内核 NULL 指针解除引用"。

    (2):  

    》当我们不调用 函数时,它是否有任何副作用  rpmsg_char_close() when M4 Core manual stop?

    停止应用程序时、它应关闭并释放之前由自身打开和分配的所有资源。 这是编码设计中的通用原则。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Nick

    根据我前面的测试步骤、

    让我们首先重点讨论这个主题

    为什么会 发生"分段故障"? 我不知道这项测试是例外从你的一方。

    即使 Endpt(FD)不存在(由内核发布?)、它也应返回错误值(-1)以通知用户。

    Sending message #70419: hello there 70419!
    Received message #70419: round trip delay(usecs) = 82365
    hello there 70419!
    Sending message #70420: hello there 70420!
    Can't write to rpmsg endpt device
    : Broken pipe
    send_msg failed for iteration 70420, ret = -1
    Segmentation fault
    root@am62xx-lp-evm:~# 

    非常感谢

    Gibbs

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Gibbs、

    我可能需要几天时间来研究这个问题。 如果我在星期五之前没有回复、请随时 ping 通该问题。

    此致、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    》它应该返回错误值(-1)以通知用户。

    酷! 这是一个完美的解决方案。

    BR

    Xiao-An。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以确保我了解此处的用例。 是否担心 M4F 内核崩溃时系统会发生什么情况? 如果没有、您能帮助我了解我们关注的确切情况吗?

    这不是低功耗模式转换的问题、如另一个主题所述。 低功耗模式转换将在进入和退出低功耗时正确关闭并重新初始化 M4F 内核。

    在常规 Linux 运行时、这也应该不会成为问题。 如果 M4F 固件由于某种原因(例如、加载不同的固件或加载更新版本的固件)而被关闭、那么 Linux 系统应设计为在关闭 M4F 内核之前正确退出用户空间应用程序。

    谢谢、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Nick

    讨论仅取决于 Linux (A53)检测到  M4F 崩溃、以及 Linux 应用程序如何 正确关闭 RPmsg 套接字?

    此崩溃可能是三种情况

    (1) M4F 保持运行、但没有对 Linux 应用程序(APP)的心跳响应、APP 将在下一步中复位 M4。 (平稳关机)

    (2) M4F 保持运行、但没有对 Linux 应用程序(APP)的心跳响应、APP 将在下一步中复位 M4。 (平稳关断)

    (3)发生错误时 M4自动复位、但应用保持从 M4接收 RPMsg 并检测到 RPmsg 套接字问题。 基本上应用应该检测到这个问题,并正确关闭 RPmsg 套接字。

    根据情况(1)、应用是否可能无法使用 正常关机来重置远程内核? 唯一的选择是通过向 M4发送软件热复位来重置远程内核。 我认为这应该是一个潜在的情况。

    根据情况(2)、此条件假定"正常关机"仍然有效。 我认为没关系。

    根据情况(3)、我们使用此命令"echo stop >/sys/class/remoteproc/remoteproc0/state " 自行仿真 M4复位它、Linux 应用程序保持接收 RPMsg & Detected 错误。 根据我们的字段尝试, app (rpmsg_char_sample)不 能正确关闭 rpmsg socket (rpmsg_char_close ()),它返回"segmentation fault"。 但据我所知、此函数应该返回值"-1"。

    我们都知道、当您重新启动远程内核时、rpmsg 将再次工作。(例如:echo Sart >/sys/class/remoteproc/remoteproc0/state)。 因为我们使用 平稳关断来执行该测试。

    但是 "分段故障"可能是"自定义"应用程序的严重问题、因为它会导致意外问题、使用户的应用程序崩溃。  我们试着澄清一下。

    我们所有的讨论都基于"禁用 FFI "。

    RPMsg 是否适用于 FFI 或反向 FFI? (MCU 隔离或隔离)

    如果 MCU 隔离中的 RPMsg "不工作"、则我认为无需在本主题中深入讨论。

    尝试简化问题、

    我们所有的讨论只是强制 M4崩溃首先,我们不需要考虑深度睡眠模式的情况。

    谢谢

    Gibbs

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Gibbs、

    今晚已经很晚了,所以如果我错过了你的任何问题,请为我重新陈述,我明天会给出更多的答复。

    RPMsg 是否适用于 MCU 域隔离?  

    不可以。 隔离 MCU 域的过程会将所有 MCU 资源和存储器与主域访问隔离开来。 这意味着将用作 RPMsg 通信一部分的任何存储器缓冲区也将从 MCU 受到防火墙保护。

    "echo > stop、echo > start"是否是模拟 M4F 内核自行复位的好方法?  

    这取决于您所说的" M4F 内核正在复位自身"。

    如果您能够对 M4F 进行编程以进行自我监视、并确保它不会卡在不良状态下、那么这就可以了(例如、如果等待 XX 秒来接收来自外设的数据并且数据流停止、请执行 YYY、而不是一直循环)。 在这种情况下、M4F 不需要进行下电上电、重新启动或者任何类似的操作。

    如果 M4F 内核已真正锁定、我不希望它能够自行复位。 您可以对类似看门狗计时器的东西进行编程、该计时器在 M4F 内核停止检测看门狗时触发、但这样会复位整个芯片、或者向 Linux 发送中断以便 Linux 可以执行某些操作。

    请记住、在使用"echo > stop、echo > start"时、您仍在使用 Linux remoteproc 驱动程序在 Linux 恢复 M4F 时正确地重新初始化 RPMsg 基础架构。

    是否可以在不执行正常关机的情况下关闭内核?  

    是的、您可以、但您需要修改 Linux Remoteproc 驱动程序、以便在发送正常关机消息后发生超时时、该驱动程序不再退出。 有关在进行此类修改之前需要考虑的事项的更多信息、请参见以下内容:
    https://dev.ti.com/tirex/explore/node?node=A__AXsPVjrUN0EAU1ezb.8iuQ__AM62-ACADEMY__uiYMDcq__LATEST

    您是否建议对 ti-rpmsg-char 进行特定修改?  

    基于上述关于返回-1的讨论。 我今天没有时间真正深入这一讨论、以后需要再看一下。

    此致、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Nick

    非常感谢您的答复。

    问题。

    "rpmsg_char_close ()"返回"分割故障"而不是"值-1"

    您可以告诉我们 RPMsg 的相关驱动程序代码在哪里。

    现场侧或客户可能会尝试帮助您同时进行调试。

    Gibbs

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Gibbs、

    我能够复制您对分段故障的观察结果。 我仍然是导致正在发生的事情的根本原因-当 userspace 驱动程序调用以下 ioctl 函数时、它看起来是来自内核驱动程序本身的行为:

    https://git.ti.com/cgit/rpmsg/ti-rpmsg-char/tree/src rpmsg_char.c 

    static int _rpmsg_char_destroy_eptdev(int fd)
    {
    	int ret;
    
    	ret = ioctl(fd, RPMSG_DESTROY_EPT_IOCTL, NULL);

    我怀疑、当远程处理器正常关闭时、此端点(或端点的某些软件结构)已经被破坏、但在调用 ioctl 函数时、rpmsg_char 驱动程序代码不会检查资源的所有部分是否仍被分配。 因此、驱动程序试图访问 已释放的变量、并且出现分段故障。

    Linux 驱动程序所有者将在下周休假。 我将花更多时间自行深入了解驱动程序、但由于这可能需要对 Linux 驱动程序代码进行一些更改、而不仅仅是用户空间代码、因此我不希望在软件所有者离职时推送修复程序。

    此致、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:  

      这是我们的修复解决方案,你可以尝试一下,如果这不是最好的解决方法,请告诉我。

    --- a/sources/meta-foxconn/recipes-kernel/linux/files/linux-6.6-foxconn/drivers/rpmsg/rpmsg_char.c
    +++ b/sources/meta-foxconn/recipes-kernel/linux/files/linux-6.6-foxconn/drivers/rpmsg/rpmsg_char.c
    @@ -86,6 +86,11 @@ int rpmsg_chrdev_eptdev_destroy(struct device *dev, void *data)
                            rpmsg_destroy_ept(eptdev->ept);
                    eptdev->ept = NULL;
            }
    +       else {
    +               /* eptdev already destroyed */
    +               mutex_unlock(&eptdev->ept_lock);
    +               return 0;
    +       }
            mutex_unlock(&eptdev->ept_lock);
     
            /* wake up any blocked readers */
    @@ -191,6 +196,10 @@ static int rpmsg_eptdev_release(struct inode *inode, struct file *filp)
                            rpmsg_destroy_ept(eptdev->ept);
                    eptdev->ept = NULL;
            }
    +       else {
    +               mutex_unlock(&eptdev->ept_lock);
    +               return 0;
    +       }
            mutex_unlock(&eptdev->ept_lock);
            eptdev->remote_flow_updated = false;