打印
[应用相关]

基于STM32F4的FreeRTOS_笔记2_打印输出字符串

[复制链接]
1711|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
基于STM32F4的FreeRTOS_笔记2_打印输出字符串

关于printf()
在此用printf()函数代替示例中的vPrintString()函数,以实现通过串口将相应的字符串打印至串口助手上。对此,ST的库函数中有相应的例程,需要将以下代码添加到程序中:



沙发
goodluck09876|  楼主 | 2018-9-11 10:56 | 只看该作者
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

使用特权

评论回复
板凳
goodluck09876|  楼主 | 2018-9-11 10:56 | 只看该作者
需要勾选Use MicroLIB和添加stdio.h头文件;

/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  USART_SendData(USART1, (uint8_t) ch);

  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  {}

  return ch;
}

使用特权

评论回复
地板
goodluck09876|  楼主 | 2018-9-11 10:57 | 只看该作者
通过同一个任务代码创建两个任务实例,以此实现两个任务分别打印输出Task 1 is running和Task 2 is running。

void vTaskFunction(void *pvParameters)
{
    /* 需要打印输出的字符串从入口参数传入,强制转换为字符串指针。 */
    const char *pcTaskName = (char *)pvParameters;
    volatile unsigned long ul;

    while(1)
    {
        /* 打印输出任务名 */
        printf(pcTaskName);

        /* 用以产生一个周期延时 */
        for(ul = 0; ul < mainDELAY_LOOP_COUNT; ul++)
        {
        }
    }
}

使用特权

评论回复
5
goodluck09876|  楼主 | 2018-9-11 10:57 | 只看该作者
static const char *pcTextForTask1 = "Task 1 is running\r\n";
static const char *pcTextForTask2 = "Task 2 is running\r\n";

int main(void)
{
    /* Perform any hardware setup necessary. */
    prvSetupHardware();

    /* --- APPLICATION TASKS CAN BE CREATED HERE --- */
    /* 由相同的任务代码创建多个任务,仅是传入的参数不同。 */
    xTaskCreate(vTaskFunction, "Task 1", 1000, (void *)pcTextForTask1, 1, NULL);
    xTaskCreate(vTaskFunction, "Task 2", 1000, (void *)pcTextForTask2, 1, NULL);

    /* Start the created tasks running. */
    vTaskStartScheduler();

    /* Execution will only reach here if there was insufficient heap to
    start the scheduler. */
    while(1);
}

使用特权

评论回复
6
goodluck09876|  楼主 | 2018-9-11 10:57 | 只看该作者
不难看出输出结果未达到预期,这是因为时间片长度太短,以致在一个时间片长度内未能输出全部字符串便被另一个任务所打断,参考《FreeRTOS实时内核使用指南》第17页的相关内容,不妨将configTICK_RATE_HZ设为100(HZ),效果如下图所示:

使用特权

评论回复
7
磨砂| | 2018-9-11 13:10 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
8
晓伍| | 2018-9-11 13:13 | 只看该作者
楼主的讲解很详细

使用特权

评论回复
9
木木guainv| | 2018-9-12 19:38 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
10
goodluck09876|  楼主 | 2018-9-12 21:01 | 只看该作者
不用客气,一起探讨吧!

使用特权

评论回复
11
dingbo95| | 2018-9-12 22:42 | 只看该作者
其实跟裸机也没什么区别

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

220

主题

5843

帖子

21

粉丝