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.

[参考译文] TMS320C6657:使用 MSMCSRAM 时 PDK I2C 驱动程序出现问题

Guru**** 2574125 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/629249/tms320c6657-problem-with-pdk-i2c-driver-when-using-msmcsram

器件型号:TMS320C6657

您好!

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

我的工具链版本为:

IPC 版本:3.46.0.02

SYS/BIOS 版本:6.46.5.55

XDCtools:3.32.0.06

TI-RTOS:2.0.1.23

c665x PDK:2.0.6

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

我最近需要在 m 项目中加入 anI2C 支持、因此我决定在阻塞模式下使用 PDK 中提供的 I2C 驱动程序。 我还使用 PDK OSAL。

在初始化时、我的 SCL 线路被驱动为恒定低电平、并且进一步使用 I2C 驱动器会导致恒定阻断。

经过进一步调查、这种行为似乎是由于我的 IPC 代码而发生的。

具体而言、使用"HeapBufMP_create"会导致此行为。 我使用此函数在 MSMCRAM 上创建2个用于 IPC 的存储器块、每个块大小为9608字节。

我想知道 PDK I2C 驱动程序或 OSAL 是否使用 MSMCSRAM、如果使用、如何防止这种冲突? 如果不是、会发生什么情况? 在我的项目中、除了以外、没有任何内容映射到 MSMCSRAM

SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');

映射到整个 MSMCSRAM 中。

希望您能帮我解决这个问题。

谢谢、

Alex

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

    我已通知软件团队。 他们的反馈将在此处发布。

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

    I2C 驱动程序只是一个库、μn`t 被放置在特定的存储器中、因此您的 TI RTOS 应用程序会将驱动程序代码段放置在适当的存储器中。 编译代码时、编译器必须在文件夹中生成.map 文件、该文件将指示每个代码段和数据段的放置位置。

    由于您使用 IPC、因此应比较主内核和从内核的.map 文件、并检查是否存在任何重叠段。 是否可以使用 IPC 运行 I2C 应用程序?

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

    您好、Rahul、

    是的、我知道它只是一个库、由用户放置、但是我希望运行时的库代码使用 MSMCSRAM 的某些部分来同步驱动程序在多核环境中的使用、这将解释 IPC 的任务。 我从你的评论中了解到,情况并非如此。 我将尝试进一步描述 I2C 驱动程序和 IPC 的用法:

    我的项目使用 PDK 中的 I2C 驱动程序+ OSAL 以及 IPC RTSC 模块。

    默认情况下、我的平台将代码、数据和堆栈段放置在 DDR3中、因此 I2C 驱动程序被分配给 DDR。 关于 MSMCSRAM、整个 MSMCSRAM 由 IPC 使用:

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

    从.map 文件:

    TI.sdo.ipc.SharedRegion_0

    0 0c000000 00100000 NoLoad 段

    0c000000 00100000 --hole --

    这在两个内核的两个.map 文件上都是相同的。

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

    从.cfg 文件中:

    VAR IPC = xdc.useModule('ti.sdo.ipc.Ipc');

    VAR Notify = xdc.useModule('ti.sdo.ipc.Notify');

    VAR HeapBufMP = xdc.useModule('ti.sdo.ipc.heaps.HeapBufMP');

    VAR GateHWSem = xdc.useModule('ti.sdo.ipc.gates.GateHWSem');

    VAR MultiProc = xdc.useModule('ti.sdo.utils.MultiProc');

    Ipc.procSync = IPC.ProcSync_All;

    VAR namelist = MultiProc.getDeviceProcNames ();

    MultiProc.setConfig(null、名称列表);

    /*避免在 MessageQ 传输中浪费共享内存*/

    对于(var i = 0;i < MultiProc.numProcessors;i++){

    Ipc.setEntryMeta({

    RemoteProId:i、

    setupMessageQ:false

    // setupNotify:true、

    });

    /*共享内存基址和长度*/

    VAR SHAREMDE= 0x0C000000;

    VAR SHAREDMEMSIZE = 0x00100000;

    /*

    *需要定义共享区域。 IPC 模块使用此功能

    *以制作可移植指针。 所有处理器都需要添加此内容

    *使用其共享存储器区域的基址进行调用。

    *如果处理器无法访问内存,请勿添加。

    *

    VAR SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');

    SharedRegion.setEntryMeta(0、

    {基地址:SHAREMMEM,

    Len:SHAREDMEMSIZE、

    ownerProId:0、

    高速缓冲启用:true

    高速缓存行大小:128、

    IsValid:true

    // createHeap:true、

    名称:"MSMCSRAM_0"

    });

    core0项目和 core1项目均使用此.cfg 代码。

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

    一切都正常、我进行了 IPC 通信、直到我决定使用 PDK 的 I2C 驱动程序和 OSAL。

    关于 I2C 驱动程序和 OSAL、在.map 文件中、我看到所有内容都放置在 DDR3存储器中。

    I2C_init ()

    I2C_Params_init (&pHandle->i2cParams)、

    pHandle->i2cHandle = I2C_open (I2C_Instance、&pHandle->i2cParams)、

    我不运行 OSAL 初始化函数或任何其他函数、这可能是一个问题?????????????

    上述函数在两个内核上的 BIOS_start()之前的 main()中运行。

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

    #define INTERRUPT_LINE 0

    #define MSG_EVENT_ID 10.

    #define ACK_EVENT_ID 11.

    #define PLS_EVENT_ID 12.

    #define MSW_EVENT_ID 13.

    IPC_START()

    notify_registerEvent (pObject->destCorNum、interrupt_line、MSG_EVENT_ID、

    (notify_FnNotifyCbck) IPC_msg_arelarn_CB、空)

    notify_registerEvent (pObject->destCorNum、interrupt_line、ack_event_ID、

    (notify_FnNotifyCbck) IPC_ack_ary_arcb、空)

    notify_registerEvent (pObject->destCorNum、interrupt_line、PLS_EVENT_ID、

    (notify_FnNotifyCbck) ipc_pls_ary_arry_cb、空)

    notify_registerEvent (pObject->destCorNum、interrupt_line、MSW_EVENT_ID、

    (notify_FnNotifyCbck) IPC_msw_arued_CB、空)

    上述内容也在 BIOS_start()之前运行,但在 I2C 输入并在两个内核上打开之后运行。

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

    在两个内核上运行文件夹代码、然后:

    /*创建/使用堆*/

    if (pObject->selfCorNum =0){

    /*

    *创建将用于分配内存的堆。

    *

    HeapBufMP_Params_init (&pObject->heapBufParams);

    pObject->heapBufParams.RegionID = 0;

    pObject->heapBufParams.name = heap_name;

    pObject->heapBufParams.numBlocks = 2;

    pObject->heapBufParams.blocksize = heap_BUF_size;

    pObject->heapHandle = HeapBufMP_create (&pObject->heapBufParams);

    if (pObject->heapHandle == NULL){

    System_abort ("HeapBufMP_create failed\n");

    否则

    /*打开另一个处理器创建的堆。 循环、直至打开。 *

    执行

    状态= HeapBufMP_open (heap_name、&pObject->heapHandle);

    /*

    *睡眠1个时钟周期以避免远程处理器脱机

    *如果打开失败则使用中断

    *

    如果(状态< 0){

    Task_sleep (1);

    } while (status < 0);

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

     

    我看到的是、如果我从上面的代码中删除 HeapBufMP_create (&pObject->heapBufParams)、I2C 驱动程序就可以正常运行。 但是、如果该函数运行、则 I2C 驱动器会出现故障。

    在 I2C 上的第一次传输中、SCL 线路被保持在恒定的低电平上、并且进一步使用此驱动器会导致无限阻断。

    我正在尝试了解 HeapBufMP_create 如何会导致 I2C 驱动程序出现问题。

    可能是 OSAL 电平上发生了碰撞?? 还是同步 i2c/IPC 运行的多处理器信号?

    是否需要对 PDK 的 OSAL 库执行其初值? 可能 BIOS_start 函体之前的初始项会导致问题?

     

    正在等待您的帮助...

     

    此致

    Alex

     

     

     

     

     

     

     

     

     

     

     

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

    P.S. 除了用于 IPC 目的的 MSMCSRAM 之外、内核之间没有重叠段。

    此外、我使用两个平台定义、 其中每个定义的代码、存储器和堆栈部分映射到 DDR 的单独半部分。

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

    如果独立于 IPC 代码运行、I2C 驱动程序代码运行正常。 n`t 驱动程序使用 PDK OSAL、但如果查看 OSAL 实现、它仅用于 HWI (中断)、计时器和信标、并且不为堆配置提供任何挂钩。 OSAL 设置堆中只有对堆的引用。 您是否看到它在映射文件中的位置。

    您的堆存储器段在.map 文件中的什么位置? 您是否可以使用不同的堆段来为 IPC 分配内存、如下所述:
    e2e.ti.com/.../229392

    此致、
    Rahul