如何在vxworks多任务环境中打印一个没有混乱的字符串?

时间:2013-04-27 06:31:12

标签: c vxworks

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);
}

上面的代码显示:

  

这是任务这是task126738208 126672144这是任务   任务126712667214438208

     

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

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

3 个答案:

答案 0 :(得分:1)

问题在于taskLock();

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

答案 1 :(得分:0)

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

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

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

taskLock, taskLock用作内核的命令,它意味着将当前正在运行的任务保留在CPU中作为READY。

正如您在示例代码中所写,taskUnlock()函数没有参数。基本原因是启用内核和中断在系统中执行taskUnlock。

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

答案 2 :(得分:0)

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

例如:

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

成为

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