在RT-Thread中的线程时间片轮转调度中,其中线程thread1和线程thread2共用一个入口函数thread entry,thread1的时间片为10,thread2的时间片为5,用输入参数parameter,在thread entry函数中添加代码 (if判断语句),实现线程1和线程2运行态分别在flag1和flag2周期在0和1两个状态交替转换,并在虚拟逻辑分析仪中添加flag1和flag2的bit观察点;添加代码实现创建第3个线程thread,优先级与前2个任务相同,时间片与任务2相同。入口函数依然使用thread entry函数。并在thread entry函数中添加代码,实现与前两个任务类似的fag3。在合适位置设置断点,观察任务3状态在就绪、运行和挂起之间的转换;在入口函数中打印当前在运行的线程状态;通过设置断点和逻辑分析仪观察分析3个线程的运行时间和顺序,计算分析3个任务的占用cpu的时间比例,要求条理清晰明了。
时间: 2024-02-26 12:57:13 浏览: 146
下面是实现该功能的代码示例:
```c
#include <rtthread.h>
// flag1和flag2分别表示线程1和线程2的状态
static int flag1 = 0;
static int flag2 = 1;
static int flag3 = 0;
static void thread_entry(void *parameter)
{
int thread_id = (int)parameter;
while (1)
{
if (thread_id == 1)
{
flag1 = !flag1;
}
else if (thread_id == 2)
{
flag2 = !flag2;
}
else if (thread_id == 3)
{
flag3 = !flag3;
}
rt_thread_mdelay(10);
}
}
int rt_application_init(void)
{
rt_thread_t thread1, thread2, thread3;
thread1 = rt_thread_create("thread1", thread_entry, (void *)1, 1024, 10, 10);
if (thread1 != RT_NULL)
{
rt_thread_startup(thread1);
}
thread2 = rt_thread_create("thread2", thread_entry, (void *)2, 1024, 10, 5);
if (thread2 != RT_NULL)
{
rt_thread_startup(thread2);
}
thread3 = rt_thread_create("thread3", thread_entry, (void *)3, 1024, 10, 5);
if (thread3 != RT_NULL)
{
rt_thread_startup(thread3);
}
while (1)
{
rt_kprintf("current running thread: %s\n", rt_thread_self()->name);
rt_thread_mdelay(1000);
}
return 0;
}
```
在该代码中,我们创建了三个线程 thread1、thread2 和 thread3,它们都共用一个入口函数 thread_entry。在该函数中,我们使用输入参数 parameter 来区分不同的线程。然后根据输入的线程id,分别在不同的时间片周期中将 flag1、flag2 或 flag3 状态取反。
在初始化函数 rt_application_init 中,我们先创建了 thread1 和 thread2 两个线程,并分别给它们设置不同的时间片和优先级。然后创建了 thread3 线程,也设置了它的时间片与 thread2 相同。
在 while 循环中,我们不断打印当前正在运行的线程的名称,用于观察线程的运行状态。同时,我们也使用 rt_thread_mdelay 函数来延时一段时间,以便线程能够切换运行态和就绪态。
在虚拟逻辑分析仪中,我们添加了 flag1、flag2 和 flag3 的 bit 观察点,用于观察不同线程的状态变化。通过设置断点和逻辑分析仪观察分析三个线程的运行时间和顺序,可以计算分析三个任务的占用 CPU 的时间比例。
阅读全文