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.

[参考译文] CC3235SF:I2S 数据传输、不带切换线程

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1404863/cc3235sf-i2s-data-transfer-without-switching-thread

器件型号:CC3235SF

工具与软件:

嗨、团队:

我正在  为我的项目使用 CC3235SF 微控制器。 我有一个问题。 我想在 I2S 上传输数据、以便使用 DMA 播放音频文件、并且不会临时切换上下文/线程。 还有其他并行运行的任务、例如 WiFi 任务、SlNetConn_process、slspawn 任务和我定义的三个任务。

当我只运行一个播放音频+ WiFi 任务的任务时、我能够清晰地听到音频、但当我在并行音频中运行另一个任务时、音频播放不正确。 它的速度越来越慢、出现很多噪声。

我要实现的是、我要临时禁用 CPU 调度程序临时/禁用上下文或线程切换、并在音频播放完成后启用 CPU 调度程序/上下文或线程切换。 如何在 POSIX 线程中实现这一点? 我正在使用 SDK -> simplelink_cc32xx_sdk_6_10_00_05。

我正在从内部闪存读取 MP3文件、然后将其解码为 PCM 脉冲、并通过 I2S 发送数据。

我正在将正在播放音频的线程的优先级、WiFi 线程、sl_spawn 设置为9、将另一个线程的优先级设置为1。

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

    你好、Vinod、

    我认为 I2S 驱动程序应已具有 DMA 支持。 也许我不建议使用优先级为9的3个线程、并且将它们分散开来。 我还建议从一个任务开始、然后慢慢添加另一个任务、然后您可以开始识别瓶子颈。

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

    尊敬的 Sabeeh:

    CC3235SF 支持用于 I2S 数据传输的 DMA。 该部件能够正常工作。

    在我的 用例中、将一个 MP3帧转换为 PCM 格式(约10-11ms)需要一些时间。 我将使用四个缓冲器来传输 MP3解码文件。 在添加这四个缓冲区以及音频样本数据后、我使用列表启动 I2S 事务  、并且在每个缓冲区传输后、我将信号量从写回 发送到任务、以填充已发送的缓冲区、并继续执行这些操作、直到完整的 MP3文件被解码并发送为止。 我将使用 DMA 进行 I2S 数据传输、因此能够在通过 DMA 发送数据时并行加载数据。  

    现在、如果该数据转换因上下文切换 而中断、并且如果数据未按时在缓冲区中加载、则会通过 I2S 传输错误的数据、从而导致噪声 和 不清楚的音频输出。 因此 、相关要求是 在缓冲器恢复之前的一定时间内加载缓冲器。

    为了实现这一点,我想暂时禁用上下文切换,并在一段时间后 恢复它。 是否可以运行代码的关键段而无需线程/上下文切换和中断?
    e.g -> taskENTER_CRITICAL ();//输入临界区
    //关键段代码
    taskEXIT_Critical ();//退出关键段

    Hwip_disable ();-这会起作用吗?

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

    你好、Vinod、

    该函数禁用所有硬件中断。 您使用的是 FreeRTOS 还是 TI-RTOS?

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

    https://www.freertos.org/Documentation/02-Kernel/04-API-references/04-RTOS-kernel-control/01-taskENTER_CRITICAL_taskEXIT_CRITICAL

    这是我在 FreeRTOS 文档上找到的链接。 也许这就是你所需要的。  

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

    尊敬的 Sabeeh:

    感谢您的答复。 问题在于优化级别。 我已将中的编译器优化级别更改为 出错 最终目的 3级进程间优化 . 之后、我的问题已经得到解决。