如何在vxworks多任务环境下打印无无序字符串


void print_task(void)
{
    for(;;)
    {
        taskLock();
        printf("this is task %dn", 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任务

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

问题出在taskLock();

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

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

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

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

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

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

与其发明一个自制的解决方案,不如直接使用logMsg()。它是标准的安全& &;这是打印东西的好方法。在内部,它将消息推送到消息队列中。然后一个单独的任务从队列中取出内容并打印出来。通过使用logMsg(),您获得了从ISR打印的能力,而不是从多个任务同时打印的交错打印,等等。

例如:

printf("this is task %dn", taskIdSelf());

logMsg("this is task %dn", taskIdSelf(), 0,0,0,0,0,0);

最新更新