c - CC3200 Launchpad 上的 FreeRTOS 无需进行调度

标签 c scheduled-tasks freertos launchpad

我正在尝试使用 freeRTOS 在 CC3200 wifi (TI) lauchpad 板上构建一个具有多个任务的系统。我在我的 main 中创建了三个任务:

    // Create task1
    osi_TaskCreate( task1, ( signed portCHAR * ) "task1",
            OSI_STACK_SIZE, NULL, 1, NULL );

    //Two more tasks

所有三个任务都具有相同的优先级 (1),因此我希望所有三个任务都将获得相同的处理器时间。

每个任务只负责在uart端口上打印它的名字:

void task1( void *pvParameters )
{
    while(1)
    {
        Report("task1");
    }
}

不幸的是,我一直只看到任务 1 打印它的名称。我应该怎么做才能解决这个问题?

最佳答案

就我对 FreeRTOS 的内存而言,如果您确实以相同的优先级创建所有线程,那么您只有在不定义 USE_TIME_SLICING 或定义它并将其设置为“1”时才能获得您想要的平等共享'.

当多个线程竞争访问硬件资源(或共享内存资源)时,您总是希望以某种方式控制对其的访问。在这种情况下,最简单(虽然不是最快)的选择是使用互斥体,FreeRTOS 也有二进制信号量,它可以完成相同的事情并且可能会稍微快一些。一般来说,互斥体和二进制信号量是可以互换的。对于这两个的详细信息,我会去阅读有关它们的 FreeRTOS 文档,它应该会澄清问题。

如果您原谅伪代码,您希望每个线程都按照以下方式执行操作

createMutex(UART_Lock)

void task1
{
    while(1)
    {
       if(GetLockOnMutex(UART_Lock))
       {
          PrintToUART();
          ReleaseMutex();
       }
    }
}

void task2
{
    while(1)
    {
       if(GetLockOnMutex(UART_Lock))
       {
          PrintToUART();
          ReleaseMutex();
       }
    }
}

void task3
{
    while(1)
    {
       if(GetLockOnMutex(UART_Lock))
       {
          PrintToUART();
          ReleaseMutex();
       }
    }
}

因此,当每个线程进入上下文时,它将尝试获取互斥体上的锁,该互斥体用于限制对 UART 的访问。如果成功,它将发送一些内容,并且只有当打印函数返回(可能跨越多个时间片)时,它才会释放 UART 上的锁,以供另一个线程尝试获取。如果线程无法获得锁,那么它只会再次尝试,直到时间片结束。您可能有一个无法获得锁的线程将自己重新休眠,直到它下次进入上下文,但只有当您的 CPU 非常繁忙并且您必须考虑您的任务是否实际上是可调度的时,这才真正重要。

基本上,如果您不控制对 UART 的访问,并且无法保证线程在给定时间片内完成对 UART 的访问,那么调度程序可以抢占未完成的线程,而其他线程可以尝试使用 UART。

假设 UART 发送缓冲区可能会在您的情况下解决它,这是合乎逻辑的,但您真的不想依赖它,因为它只有那么大,而且没有什么可以阻止一个线程完全填满它。

关于c - CC3200 Launchpad 上的 FreeRTOS 无需进行调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27172015/

相关文章:

c# - 优先使用多线程的作业调度程序

embedded - LPC 深度 sleep 模式示例

C - 外部 ELF 加载

c - 静态链接到LAPACK

c - 我如何修改这个迭代服务器以获得最高的文件描述符?

c - 第三次添加气压计 for 循环

.net - schtasks.exe 与 ITaskScheduler

php - 我的服务器上没有 cron 作业。在没有用户输入的情况下发送电子邮件的替代方法是什么?

rtos - FreeRTOS 和 CMSIS-RTX 之间的区别

c - STM32外部中断一直触发