本文使用了rt-thread自带的钩子函数和显示函数进行了实验,从rt-thread自带的延时函数rt_thread_delay()函数入手,对rt-thread系统的调度器进行分析。主要参考资料是野火的rt-thread手册和rt-thread官方文档,汇编部分的指令是参考的cortex-M3权威参考手册,实验版本是rt-thread3.1.5
1、实验准备
- 使用三个线程,内部调用延时函数,每个线程内部延时1s。
- 使用系统自带的钩子函数,在调度器实现调度的时候打印线程状态和名称。
- 使用系统自带的调试函数,打印出 to thread 和 from thread 的名称与优先级以及remove thread 和 insert thread。
主要代码如下
main.c的代码部分
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
/*线程控制块*/
static rt_thread_t Task1 = RT_NULL;
static rt_thread_t Task2 = RT_NULL;
static rt_thread_t Task3 = RT_NULL;
/*线程入口函数*/
static void Task1_thread_entry(void* parameter);
static void Task2_thread_entry(void* parameter);
static void Task3_thread_entry(void* parameter);
/*钩子函数钩上的函数*/
void task_inithock(rt_thread_t thread)
{
rt_kprintf("%s start\r\n",thread->name);
}
void task_suspendhock(rt_thread_t thread)
{
rt_kprintf("%s suspend\r\n",thread->name);
}
void task_resumehock(rt_thread_t thread)
{
rt_kprintf("%s resume\r\n",thread->name);
}
int main(void)
{
rt_thread_inited_sethook(task_inithock);
rt_thread_suspend_sethook(task_suspendhock);
rt_thread_resume_sethook(task_resumehock);
/*创建线程1*/
Task1 = rt_thread_create("task1",
Task1_thread_entry,
RT_NULL,
512,
20,
200);
if(Task1 != RT_NULL)
rt_thread_startup(Task1);
else
return -1;
/*创建线程2*/
Task2 = rt_thread_create("task2",
Task2_thread_entry,
RT_NULL,
512,
28,
200);
if(Task2 != RT_NULL)
rt_thread_startup(Task2);
else
return -1;
/*创建线程3*/
Task3 = rt_thread_create("task3",
Task3_thread_entry,
RT_NULL,
512,
22,
200);
if(Task3 != RT_NULL)
rt_thread_startup(Task3);
else
return -1;
rt_kprintf("开始执行\r\n");
}
static void Task1_thread_entry(void* parameter)//优先级25
{
int i = 0;
while(1)
{
rt_kprintf(" 任务一开始执行 \r\n");
rt_thread_mdelay(1000);
rt_kprintf(" 任务一执行完毕 \r\n");
}
}
static void Task2_thread_entry(void* parameter)//优先级28
{
int i = 0;
while(1)
{
rt_kprintf(" 任务二开始执行 r\n");
rt_thread_mdelay(1000);
rt_kprintf(" 任务二执行完毕 \r\n");
}
}
static void Task3_thread_entry(void* parameter)//优先级为22
{
while(1)
{
rt_kprintf(" 任务三开始执行 \r\n");
rt_thread_mdelay(1000);
rt_k