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.

[参考译文] Linux/AM5718:GateMP 共享内存问题

Guru**** 2606725 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/652870/linux-am5718-gatemp-shared-memory-issue

器件型号:AM5718

工具/软件:Linux

尊敬的团队,

我长时间运行 GateMP 示例。该示例使用 A15和 DSP 之间的 GateMP 来保护共享存储器,、但有时它无法保护。

我遵循 Linux 代码 GateHWSpinlock.c

在 GateHWSpinlock_start 中

----------------------------------------

   /*如果不支持 hwspinlock_user 驱动程序,则返回/dev/mem */
   MOD->FD =打开("/dev/hwspinlock、O_RDWR);
   if (Mod->FD < 0){
       MOD->FD =打开("/dev/mem、O_RDWR | O_SYNC);
   }
   否则{
       MOD->HwuseLockDrv = true;
   }
----------------------------------------

/dev/dictionary 没有 spinclock 设备,请使用/dev/mem?

我看到 spruhz7f.pdf 的第5421页。  它说:"只能在禁用中断的情况下保持自旋锁。"

但在函数 GateHWSpinlock_enter 中

----------------------------------------

IArgh GateHWSpinlock_enter (GateHWSpinlock_Object *。obj)

   volatile uint32 *baseAddr = Mod->baseAddr;
   struct hwspinlock_user_lock data ={
       .id = obj->lockNum、
       .timeout = 10、
   };
   IArg 键;
   bool 锁定;

   key = IGateProvider_enter (obj->localGate);

   /*如果已输入 GATE,只需使用当前键返回*/
   obj->nested++;
   if (obj->nested > 1){
       RETURN (KEY);
   }

   /*输入自旋锁*/
   while (1){
       if (Mod->useHwlockDrv){
           Locked =!ioctl (Mod->FD、HWSPINLOCK_USER_LOCK、&data);
       }
       否则{
           /*读取自旋锁,当我们得到它时返回非零值*/
           Locked =(baseAddr[obj->lockNum]=0);
       }

       如果(已锁定){
           中断;
       }

       obj->nested--;
       IGateProvider_leave (obj->localGate、key);
       key = IGateProvider_enter (obj->localGate);
       obj->nested++;//重新嵌套栅极*/
   }

   返回(键);



----------------------------------------

函数 IGateProvider_enter 使用 pthread_mutex_lock。

我找不到 禁用 中断的操作。

代码是否确实确保了 hwspinlock 正常工作?

这是我的错误日志。

-->主要:
CMEM_init 成功
->Main_main:
->GateMPApp_create:
GateMPApp_create:主机已就绪
-- GateMPApp_create:
--> GateMPApp_exec:
GateMPApp_exec:使用主机创建的门
GateMPApp_exec:使用从器件创建的门
GateMPApp_exec:意外的变量 value.Test 失败。
GateMPApp_exec:以前的值:518、c[ 3647.514352] omap_hwmod:mu1_dsp1:_wait_target_disable 失败
当前值= 1
-- GateMPApp_exec:-268435456
<-- Main_main:
[3647.527235] omap_hwmod:mu0_dsp1:_wait_target_disable 失败
<--主要:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Fei Liang、

    Linux 用户空间无法禁用中断。 由于测试是单线程的、因此使用互斥量来确保没有其他线程中断它。

    当您提到长时间运行 GateMP 测试时、您是否意味着您重复运行该测试? 从错误日志和代码分析中可以看出、内存已启动。 您是否同时运行了其他应用程序?

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

    感谢您的回复。

    这是我的脚本。我认为只有一个进程正在运行。

    --------------------------------------------------
    root@am57xx-EVM:~# cat test.sh
    !/bin/bash

    killall ti-mctd
    而事实是如此
    操作
    reload_dsp_firmware.sh
    睡眠1
    rmmod cmemk.ko
    insmod cmemk.ko
    /GateMPApp.host
    完成
    --------------------------------------------------

    如果我将循环移动到 GateMPApp.host 中,它可以工作。

    如下所示:


    --------------------------------------------------

    main_host.c

    int Main_main (空)

       INT        STATUS = 0;

       printf ("->Main_main:\n");

       /*开始应用阶段*/

       /*应用程序创建阶段*/
       status = GateMPApp_create();

       如果(状态< 0){
           离开;
       }
    while (1){
       /*应用程序执行阶段*/
       status = GateMPApp_exec();

       如果(状态< 0){
           离开;
       }

    --------------------------------------------------

    DSP 固件

    --------------------------------------------------

    gatempapp.c

    空 smain (UARg arg0、UARg arg1)

       INT                STATUS = 0;

       log_print0 (Diags_entry | Diags_info、"->smain:");

       /*初始化模块*/
       SERVER_INIT();

       /*打开 Diags_info trace */
       diags_setMask ("Server+F");

       /*服务器设置阶段*/
       status = Server_create();

       如果(状态< 0){
           离开;
       }
       while (1){
       /*服务器执行阶段*/
       status = Server_exec();

       如果(状态< 0){
           离开;
       }
       }

    --------------------------------------------------

    非常奇怪

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

    如何使用 unbind / bind 命令重新加载 DSP 固件? 您也可以展示一下吗?

    雷克斯