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.

[参考译文] RTOS/CC3235MODSF:单线程应用、具有1ms 节拍和微秒等待时间

Guru**** 2540720 points
Other Parts Discussed in Thread: CC3235MODSF

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/799290/rtos-cc3235modsf-monothread-application-with-1ms-tick-and-microsec-wait

器件型号:CC3235MODSF

工具/软件:TI-RTOS

您好!

我有一个包含 cc3235modsf 和 TI-RTOS 的项目。 它基于 http 获取示例、在该示例中、我在单个任务中执行所有操作。  

我正在尝试驱动几个 GPIO 以尽可能快地传输数据。  

它基本上如下所示:  

环路1
环路2
驱动数据输出
等待2usec 以获得稳定的数据
驱动时钟输出 

起初速度非常慢。 我注意到 TI-RTOS 的周期从1ms 降低到100us 确实提高了性能。 我假设对 usleep()的调用退出了线程,它必须等待下一个节拍才能继续。 我的说明是否正确?

问题是、使用100usec 节拍时、速度仍然不够快、我想我无法将节拍周期降低到最大速度所需的值。

在无需等待的情况下尽快完成所有任务的正确方法是什么?

谢谢、

C é dric

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

    您的睡眠假设应该正确。 我可以向 TI-RTOS 团队进行验证。

    您可以使用硬件计时器获得更小的延迟、但我认为您无法启动中断例程并在2微秒内实现数据输出。 RTOS 不能保证您的时间限制。 即使您的应用只是一个线程、主机驱动程序(sl_Task)也是与 NWP 连接的单独线程。 还有另一个关于 TI 驱动程序延迟与 driverlib 的讨论、您可能会发现它很有用、但它不会接近您的2微秒周期: e2e.ti.com/.../674855

    以这种速度进行位拆裂 GPIO 的用例是什么?

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

    您好、Sarah、  

    感谢您的反馈和链接!

    用例是通过某种并行通信来驱动电子墨水显示屏。

    我刚刚尝试使用 MAP_UutilsDelay 进行所有几微秒的等待。 它可以校正慢运行时间。 我还没有检查延迟是否正确、但我认为应该检查。  

    这是否会导致 RTOS 或主机驱动程序出现问题(只要我将其仅用于<= ~10usec)?

    此致、

    C é dric

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

    C é dric、您好!

    主机驱动程序优先级和上下文切换由 RTOS 处理。 我将与 TI-RTOS 团队的某个人联系以进行评论。

    如果要更改 Clock.tickPeriod 的值、请注意主机驱动程序超时基于此节拍周期。 user.h 中的 define SL_TIMESTAMP_TICKS_IN_10_milliseconds 当前硬编码为默认的1000 μ s 周期。 您必须更新此值并重新构建 simplelink 库以避免同步错误。 (此值将基于未来版本中配置的节拍周期。)

    此致、
    Sarah

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

    以下是使用时的规格(来自  )

    usleep()函数将调用线程的执行暂停(至少)微秒"

    对于 TI-RTOS、"至少"是时钟周期(默认为1ms)。 由于引入的开销、我们通常不建议将此周期缩短太多、如果是 Sarah 提到的、其他组件假定节拍为1ms、  

    您可能希望仅使用时间戳模块并旋转2us (例如、获取时间戳、直到当前时间戳从第一个时间开始为+2us)。 您在哪里执行此操作:Hwi? SwiTM 或任务? 我假设任务是因为您调用 usleep、这是一个阻塞调用。 旋转是非阻塞式、因此它将停止较低(或相同)级别的优先级任务。 如果还可以,就去吧。 如果没有、则根据需要调整优先级。

    您能否依靠通过寄存器或其他器件获知的"拥有稳定数据"来运转? 这是一种更清洁的方法。

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道必须在其他地方改变这一刻度。 然后、我将保持在1ms。

    所有工作都是在一个任务中完成的。 其优先级设置为1、而 sl_Task 优先级设置为9。
    MAP_UtilsDelay 似乎可以满足我的需求、它不会退出线程、但 sl_task 可以在需要时抢占。 我已经使用示波器检查了时序、对于我的以下定义、它似乎是正确的。

    #define tick_per_loop 6.
    #define WAIT_US_BUS_BUS_BUSY (x)(MAP_UtilsDelay ((SYS_CLK / TICK _PER_LOOP / 1000000)* x))

    我认为不需要"拥有稳定数据"的方法、因为在开始该过程时所有数据都可用。

    感谢 Sarah 和 Todd 的帮助!