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/CC3200MOD:使用 UARTUtils 和 scanf 从 UART 读取数据、两个任务会阻止一个任务

Guru**** 2595805 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/587394/rtos-cc3200mod-using-uartutils-and-scanf-to-read-from-uart-with-two-tasks-blocks-one-task

器件型号:CC3200MOD

工具/软件:TI-RTOS

我有一个应用、在该应用中我从一组传感器读取数据。 其中一个在 UART 上发布了一个我想读取的字符串。 我在应用程序中使用 UARTUtils、因此使用 scanf 进行读取。 我为此创建了一个单独的任务、因此它不会阻止另一个任务(读取其他传感器并每分钟发布一次数据)。  

遗憾的是、扫描程序看起来可能会阻止/阻止另一个线程(处于更高优先级)。 我在 scanf 任务中添加了 Task_sleep、这确实有助于改善总体情况、但只能通过更改计时。 在某些情况下、scanf 仍在等待 UART 输入(每分钟只发生一次)、这可能导致另一个线程饥饿。  

在我的情况下、在 SysCallback 函数中使用 UART_writePolling 可能是问题的原因。  

我想知道、在这种情况下、我可以使用哪些替代方法来提高行为的稳健性。  

谢谢、

Sridhar

PS -我可能会为此目的使用 UART1、但我已经在使用这些引脚进行 I2C 通信。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    void readLoop (void *pvParameters){
    System_printf ("[Read Loop ] started\n");
    INT STATUS = 0;

    对于(;;){
    float myRef = 0.0、myREF2 = 0.0;
    Task_sleep (60000);<--- 我在语句的末尾有 Task_sleep、但将其移到这里是为了帮助其他任务的初始进度
    System_printf ("[Read Loop)正在等待读取数据\n"\};
    scanf ("%f、%f\r\n"、myRef、&myREF2);<---- 这会阻止其他任务的进度
    System_printf ("[Read Loop)数据为%f、%f\n"、myRef、myREF2);
    Semaphore_pend (semRead、BIOS_wait_forever);
    REF = myRef;
    REF2 = myREF2;
    Semaphore_post (semRead);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    阻止的其他线程是什么(应显示在“工具”->“ROV->详细任务”中)。 当任务调用 scanf 时、RTS (运行时支持库)锁用于防止损坏。 如果另一个任务(甚至更高优先级)调用 RTS 调用(例如 scanf、printf 等)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复、Todd!

    被阻断的任务是一个优先级更高的任务、此任务是读取不同其它传感器的主任务。 另一个任务实际上是调用 printf 调用(主要是 System_printf 调用)以进行记录。

    我主要使用 UART0进行控制台日志记录(但没有输入)。 它还用于从传感器器件获取输入(这与它接收的 Rx 无关)。

    由于 scanf 被阻止、我假设这意味着执行 printf 的另一个任务将被阻止、直到 scanf 任务获得输入? 我想、我正在通过尝试将扫描设置为尽可能接近接收间隔(每分钟一次)并使任务在此期间处于睡眠状态来缓解这种情况。

    我的情况是否还有其他可能的替代方案、以使其更强大? 我使用 UART1进行 I2C 通信。

    谢谢、
    Sridhar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以使用避免使用 printf、而只使用 System_printf。 确保.cfg 文件中的 System.SupportProxy 是 SysMin。 调试输出被保持在一个内部缓冲器中、可从 Tools->ROV->SysMin 中查看。