gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:35:07 25 4
gpt4 key购买 nike

我正在尝试使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com