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/TM4C1294NCPDT:在任务调用函数内进行信标发布和挂起

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/613581/rtos-tm4c1294ncpdt-semaphore-post-and-pend-inside-task-calling-function

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

您好!

我想在我的每个任务中使用两个打印语句、

1.由 System_printf ("String")完成的 CCS 打印;希望此打印通过 JTAG 完成。

由我完成的 UART 打印、用于在 Teraterm 控制台中打印、下面是我在代码中执行的示例代码。

/*以下初始化在 main.c 中进行*/

   Semaphore_Params_init (&Sem_UART_Params);
   Semaphore_construction (&Sem_UART_Struct, 1,&Sem_UART_Params);
   /*获取实例句柄*/
   SEM_UART_Handle = Semaphore_handle (&Sem_UART_Structe);

/*下面是 UART 打印函数,用于在每个任务中调用*/
void UartPrint( const char *fmt,...)

 Semaphore_pend (Sem_UART_Handle、BIOS_WAIT_FOREVE);

/*与字符串一起使用的代码*/

Semaphore_post (Sem_UART_Handle);

/*下面是我在 CCS 控制台中以及使用 UART*/的串行端口控制台中打印的任务

空任务()

System_printf ("字符串");

system_flush();

UART_PRINT ("字符串");

我的问题是:

1.能否在任务内部调用的函数中使用信标发布和挂起?

我正在 UART 打印中使用互斥锁、以便另一个 UART 打印不会同时丢失在控制台中打印的任何字符。 问题是、如果我使用许多任务、CSS 和 UART 都打印不均匀

字符串字符到控制台。

3.两个控制台只能打印相同的字符? 但顺序完全不同。为什么?

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

    您好、Manohar、

    [引用 user="Manohar B"]我能否在任务内部调用的函数中使用信标发布和挂起?[/quot]

    是的。 您可以执行此操作。

    [引用 user="Manohar B"]2.I 在 UART 打印中使用互斥锁、以便另一个 UART 打印不会同时丢失在控制台中打印的任何字符。 问题是、如果我使用许多任务、CSS 和 UART 都打印不均匀

    它取决于任务的优先级。 假设您要在任务1中打印优先级为1 (低)的"hello"、在优先级为2 (高)的任务2中打印"weather"。 如果任务1正在运行、并且在 System_flush 之后但在 UART_PRINT 之前、任务2已准备好运行(例如、它的 Task_sleep 已过期)。 任务2将开始运行、并且可以调用全部3个函数。 因此最终输出将是 CCS

    你好

    天气

    但在 UART 上是这样的  

    天气  

    你好

    注意:UART_WRITE 可能会阻止、因此也会将上下文切换到较低优先级的任务。

    Todd

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

    我有一个 HWI、在其中使用相同的 CCS 打印和 UART 打印、问题是我无法在 ISR 中使用 CCS 打印或 UART 打印。 当提出 ISR 后停止打印时。

    /*下面是我的 ISR 函数*/
    void DigitalInputISRHandler()



    System_printf ("HWI 被提出\n");
    system_flush();

    UART_PRINT ("HWI 被提出\n");

    (*(volatile uint32_t *) clearFlagaddr)= bit_shift;
    GPIO_TOGGLE (Board_LED0);


    如果我既不使用打印、则每当 ISR 发出时 LED 都会切换。 但如果我使用其中一种打印、整个程序将停止。

    我的问题:
    1、UART print 是我创建的具有信标的函数、问题是因为信标吗?
    System_flush()函数实际上在做什么? 此函数是否也具有信标?
    3.为什么不能在 ISR 中同时使用这两个 print 语句?


    此致、
    Manohar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我希望您在 UartPrint 函数中使用 UART_WRITE。 这是一个问题、因为您只能从任务调用此 API。 在内部、它调用具有超时的 Semaphore_pend 函数、而 ISR 中不允许超时。

    我假设您在.cfg 文件中使用 SysMin。 在这种情况下、System_printf/System_flush 应该起作用。 System_printf 将 ASCII 字符串写入内部缓冲区(如果已满、则进行覆盖)。 System_flush 将数据刷写到 CIO 缓冲器中。 当 CIO 已满或数据中有换行符时、断点被命中、CCS 读取数据并将其显示到 CCS 控制台中。 CCS 随后会恢复目标。 在 ISR 中发生的这种情况应该是可以的(除了它会使实时信息混乱)。 您能否确认您正在使用 SysMin? 如果您调用 System_flush、会发生什么情况。 您的系统堆栈是否不够大? 您可以检入 Tools->ROV->Hwi->Module 以查看系统堆栈峰值。

    Todd