2
void print_task(void)
{
    for(;;)
    {
        taskLock();
        printf("this is task %d\n", taskIdSelf());
        taskUnlock();
        taskDelay(0);
    }
}
void print_test(void)
{
    taskSpawn("t1", 100,0,0x10000, (FUNCPTR)print_task, 0,0,0,0,0,0,0,0,0,0);
    taskSpawn("t2", 100,0,0x10000, (FUNCPTR)print_task, 0,0,0,0,0,0,0,0,0,0);
}

上面的代码显示:

这是任务这是任务126738208 126672144 这是任务这是任务126712667214438208

这是任务 这是任务 1266721441 26738208 这是任务 126672144 这是任务

在多任务中打印字符串的正确方法是什么?

4

3 回答 3

1

问题出在taskLock();

请尝试使用信号量或互斥量。

于 2013-04-27T07:14:10.393 回答
0

在多线程环境中打印的主要思想是使用打印输出的专用任务。通常在 vxWorks 中有一个日志任务,它从系统中的所有任务中获取日志消息,并仅从一个任务打印到终端。vxWorks 记录器机制的主要问题是记录器任务使用非常高的优先级并且可以改变您的系统时间。

因此,您应该创建自己的低优先级任务,从其他任务中获取消息(使用消息队列、受互斥体保护的共享内存……)。在这种情况下,有两个很大的好处:第一个,所有系统打印输出都将从一个任务中打印出来。

第二个也是最重要的好处是,系统中的实时任务不应该使用 printf() 函数浪费时间。如您所知, printf 是一个非常慢的函数,它使用系统调用,并且肯定会根据您添加的调试信息更改任务的时间。

taskLock,taskLock 作为给内核的命令使用,意思是让当前正在运行的任务在 CPU 中保持为 READY。

正如您在示例代码中所写,taskUnlock() 函数没有参数。根本原因是为了让内核和中断能够在系统中执行taskUnlock。

有许多执行任务解锁的系统调用(有时中断服务路由也会这样做)

于 2013-07-11T15:39:50.203 回答
0

与其发明自制解决方案,不如使用logMsg(). 这是打印东西的规范安全和理智的方式。在内部,它将您的消息推送到消息队列中。然后一个单独的任务从队列中取出东西并打印出来。通过使用logMsg(),您可以获得从 ISR 打印的能力,不会从同时打印的多个任务中进行交错打印,等等。

例如:

printf("this is task %d\n", taskIdSelf());

变成

logMsg("this is task %d\n", taskIdSelf(), 0,0,0,0,0,0);

于 2019-05-23T14:25:40.703 回答