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.

[参考译文] TMS320C6678:与 NDK NIMU 的 OSAL 集成

Guru**** 2550070 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/600683/tms320c6678-osal-integration-with-ndk-nimu

器件型号:TMS320C6678
Thread 中讨论的其他器件:SYSBIOS

您好!

我的客户正在使用具有 OpenMP 运行时的 NDK、这些在 ProcSDK 版本03.03.00中提供。

他们使用 NIMU_emacExample_EVMC6678C66BiosExampleProject 作为代码库来集成 OpenMP 运行时(及其应用代码)、 默认情况下使用 NIMU_osal.c。
您可以在以下路径中找到该文件。

C:\ti\pdk_c667x_2_0_5\packages/ti\transport \ndk\Nimu\examples\HelloWorld\src\Nimu_osal.c

他们现在正在研究 NIMU osal 集成,如果真的可以将 OSAL_qmss/cppiBeginMemAccess()和 OSAL_qmss/cppiEndMemAccess()留空,他们就在徘徊。

/**
*@b 说明
*@n
* 该函数用于指示存储器块为
* 即将访问的内容。 如果内存块已缓存、则*
表示应用程序需要确保
* 高速缓存使用实际存储器中的数据进行更新。
*
*@param[in] blockPtr
* 要失效的块的地址
*
*@param[in] size
* 要失效的块的大小

*@retval
* 不适用
*/
void OSAL_cppiBeginMemAccess (void *blockPtr、uint32_t size)
{
/*仅多核应用程序需要缓存一致性保护*/
return;
}

//**
*@b Description
*@n
* 该函数用于指示存储器块具有
* 已完成访问。 如果内存块被缓存、则*
应用程序需要确保缓存的内容
* 会立即更新到实际存储器。
*
*@param[in] blockPtr
* 要写回的块的地址
*
*@param[in] size
* 要回写的块的大小

*@retval
* 不适用
*/
void OSAL_cppiEndMemAccess (void * blockPtr、uint32_t size)
{
/*仅多核应用程序需要缓存一致性保护*/
返回;
}

。。
…


/**
*@b 说明
*@n
* 该函数用于指示存储器块为
* 即将访问的内容。 如果内存块已缓存、则*
表示应用程序需要确保
* 高速缓存使用实际存储器中的数据进行更新。
*
*@param[in] blockPtr
* 要失效的块的地址
*
*@param[in] size
* 要失效的块的大小

*@retval
* 不适用
*/
void OSAL_qmsBeginMemAccess (void *blockPtr、uint32_t size)
{

/*仅多核应用程序需要缓存一致性保护*/
return;
}

//**
*@b Description
*@n
* 该函数用于指示存储器块具有
* 已完成访问。 如果内存块被缓存、则*
应用程序需要确保缓存的内容
* 会立即更新到实际存储器。
*
*@param[in] blockPtr
* 要写回的块的地址
*
*@param[in] size
* 要回写的块的大小

*@retval
* 不适用
*/
void OSAL_qmssEndMemAccess (void * blockPtr、uint32_t size)
{

/*仅多核应用程序需要缓存一致性保护*/
返回;
} 




这些函数中的注释建议将这些函数用作栅极、以保持内核之间的高速缓存一致性。
由于 OpenMP 主线程仅在 core0上运行、其他从内核适用于从 core0派送的 OpenMP 并行区域、因此 NDK 栈仅在 core0上运行。
在此用例中,它们是否可以将函数保留为空?

此致、
Naoki

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

    我已将此内容转发给 OpenMP 专家。 他们的反馈应发布在此处。

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

    正如您所关注的那样、OpenMP 需要保持多核的高速缓存一致性、"OpenMP 运行时使用 Keystone 和 Keystone II 处理器的队列管理器子系统(QMSS)并默认初始化"(downloads.ti.com/.../integrating_apps_with_qmss.html)、您可能希望使用 pdk_c667x_2_0_5\packages/ti\translation_ipc66\example_nimosal 项目中的 cpi/qmss osal 函数。

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

    较新的 OpenMP 库(例如2.06.00.00)不再对 Keystone I 和 II 器件使用 QMSS。 文件中已禁用基于 QMSS 的硬件队列的使用 ti/runtime/openmp/src/tomp_defs.h、因此 OpenMP 不需要 QmsOsal。 OpenMP 中的高速缓存一致性的重要作用是使用 cache.wTE 标志,例如:

    VAR Cache = xdc.useModule('ti.sysbios.family.c66.Cache');
    Cache.setMarMeta(msmcNcVirt.base、msmcNcVirt.len、0);
    Cache.setMarMeta(OpenMP.ddrBase、OpenMP*、Cache.PC| Cache.PFX.Cache.WTE);
    Cache.setMarMeta(OpenMP.msmcBase、OpenMP*、高速缓存。PC|Cache。PFX|高速缓存。WTE);

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

    感谢您的通知。 至于更改的原因、我将检查您的主题:

    e2e.ti.com/.../618232

    此致、
    Naoki