Просмотр исходного кода

modify kernel samples and SConscript,add scheduler_hook.c and timeslice_sample.c

yangjie 7 лет назад
Родитель
Сommit
665a14b73f

+ 1 - 1
README.md

@@ -18,7 +18,7 @@
 | mutex  | 互斥量的使用、防止优先级翻转特性 |
 | semaphore | 信号量的使用、生产者消费者模型 |
 | signal  | 信号的使用 |
-| thread | 线程的使用 |
+| thread | 线程的使用、线程优先级、线程时间片、调度器钩子 |
 | timer  | 定时器的使用 |
 
 ### 1.2 许可证

+ 5 - 1
SConscript

@@ -9,7 +9,7 @@ CPPPATH = []
 
 # add kernel samples.
 if GetDepend('KERNEL_SAMPLES_USING_THREAD'):
-    src += ['thread/*.c']
+    src += Glob['thread/*.c']
     CPPPATH += [cwd + '/thread']
 
 if GetDepend('KERNEL_SAMPLES_USING_SEMAPHORE'):
@@ -52,6 +52,10 @@ if GetDepend('KERNEL_SAMPLES_USING_SIGNAL'):
     src += Glob('signal/*.c')
     CPPPATH += [cwd + '/signal']
 
+if GetDepend('KERNEL_SAMPLES_USING_INTERRUPT'):
+    src += Glob('interrupt/*.c')
+    CPPPATH += [cwd + '/interrupt']
+	
 group = DefineGroup('kernel-samples', src, depend = ['PKG_USING_KERNEL_SAMPLES'], CPPPATH = CPPPATH)
 
 Return('group')

+ 1 - 8
dynmem/dynmem_sample.c

@@ -53,20 +53,13 @@ int dynmem_sample(void)
     rt_thread_t tid;
 
     /* 创建线程1 */
-    tid = rt_thread_create("t1",
+    tid = rt_thread_create("thread1",
                            thread1_entry, RT_NULL,
                            THREAD_STACK_SIZE,
                            THREAD_PRIORITY,
                            THREAD_TIMESLICE);
     if (tid != RT_NULL)
-    {
         rt_thread_startup(tid);
-    }
-    else
-    {
-        rt_kprintf("create t1 failed");
-        return -1;
-    }
 
     return 0;
 }

+ 4 - 10
idlehook/idlehook_sample.c

@@ -56,8 +56,8 @@ static void thread_entry(void *parameter)
         rt_thread_mdelay(500);
     }
     rt_kprintf("delete idle hook.\n");
-	
-	/* 删除空闲钩子函数 */
+    
+    /* 删除空闲钩子函数 */
     rt_thread_idle_delhook(idle_hook);
     rt_kprintf("thread1 finish.\n");
 }
@@ -71,16 +71,10 @@ int idle_hook_sample(void)
     tid = rt_thread_create("thread1",
                            thread_entry, RT_NULL, 
                            THREAD_STACK_SIZE, 
-						   THREAD_PRIORITY, THREAD_TIMESLICE);
+                           THREAD_PRIORITY, THREAD_TIMESLICE);
     if (tid != RT_NULL)
-    {
         rt_thread_startup(tid);
-    }
-    else
-    {
-        rt_kprintf("create thread1 failed");
-        return -1;
-    }
+
     return 0;
 }
 

+ 4 - 16
interrupt/interrupt_sample.c

@@ -43,32 +43,20 @@ int interrupt_sample(void)
     rt_thread_t thread;
 
     /* 创建t1线程 */
-    thread = rt_thread_create("t1", thread_entry, (void *)10,
+    thread = rt_thread_create("thread1", thread_entry, (void *)10,
                               THREAD_STACK_SIZE,
                               THREAD_PRIORITY, THREAD_TIMESLICE);
     if (thread != RT_NULL)
-    {
         rt_thread_startup(thread);
-    }
-    else
-    {
-        rt_kprintf("create t1 failed");
-        return -1;
-    }
+
 
     /* 创建t2线程 */
-    thread = rt_thread_create("t2", thread_entry, (void *)20,
+    thread = rt_thread_create("thread2", thread_entry, (void *)20,
                               THREAD_STACK_SIZE,
                               THREAD_PRIORITY, THREAD_TIMESLICE);
     if (thread != RT_NULL)
-    {
         rt_thread_startup(thread);
-    }
-    else
-    {
-        rt_kprintf("create t2 failed");
-        return -1;
-    }
+
     return 0;
 }
 

+ 4 - 16
mempool/memp_sample.c

@@ -73,32 +73,20 @@ int mempool_sample(void)
     rt_mp_init(&mp, "mp1", &mempool[0], sizeof(mempool), 80);
 
     /* 创建线程1:申请内存池 */
-    tid1 = rt_thread_create("t1", thread1_mp_alloc, RT_NULL,
+    tid1 = rt_thread_create("thread1", thread1_mp_alloc, RT_NULL,
                             THREAD_STACK_SIZE,
                             THREAD_PRIORITY, THREAD_TIMESLICE);
     if (tid1 != RT_NULL)
-    {
         rt_thread_startup(tid1);
-    }
-    else
-    {
-        rt_kprintf("create t1 failed");
-        return -1;
-    }
+
 
     /* 创建线程2:释放内存池*/
-    tid2 = rt_thread_create("t2", thread2_mp_release, RT_NULL,
+    tid2 = rt_thread_create("thread2", thread2_mp_release, RT_NULL,
                             THREAD_STACK_SIZE,
                             THREAD_PRIORITY + 1, THREAD_TIMESLICE);
     if (tid2 != RT_NULL)
-    {
         rt_thread_startup(tid2);
-    }
-    else
-    {
-        rt_kprintf("create t2 failed");
-        return -1;
-    }
+
     return 0;
 }
 

+ 5 - 26
mutex/pri_inversion.c

@@ -113,52 +113,31 @@ int pri_inversion(void)
     }
 
     /* 创建线程 1 */
-    tid1 = rt_thread_create("t1",
+    tid1 = rt_thread_create("thread1",
                             thread1_entry, 
                             RT_NULL,
                             THREAD_STACK_SIZE, 
                             THREAD_PRIORITY - 1, THREAD_TIMESLICE);
     if (tid1 != RT_NULL)
-    {
-        rt_thread_startup(tid1);
-    }
-    else
-    {
-        rt_kprintf("create t1 failed"); 
-        return -1;
-    }
-
+         rt_thread_startup(tid1);
+ 
     /* 创建线程 2 */
-    tid2 = rt_thread_create("t2",
+    tid2 = rt_thread_create("thread2",
                             thread2_entry, 
                             RT_NULL, 
                             THREAD_STACK_SIZE, 
                             THREAD_PRIORITY, THREAD_TIMESLICE);
     if (tid2 != RT_NULL)
-    {
         rt_thread_startup(tid2);
-    }
-    else
-    {
-        rt_kprintf("create t2 failed"); 
-        return -1;
-    }
 
     /* 创建线程 3 */
-    tid3 = rt_thread_create("t3",
+    tid3 = rt_thread_create("thread3",
                             thread3_entry, 
                             RT_NULL, 
                             THREAD_STACK_SIZE, 
                             THREAD_PRIORITY + 1, THREAD_TIMESLICE);
     if (tid3 != RT_NULL)
-    {
         rt_thread_startup(tid3);
-    }
-    else
-    {
-        rt_kprintf("create t3 failed"); 
-        return -1;
-    }
 
     return 0;
 }

+ 3 - 15
signal/signal_sample.c

@@ -20,10 +20,6 @@
 #define THREAD_STACK_SIZE       512
 #define THREAD_TIMESLICE        5
 
-/*
- * 为了在一个线程中访问另一个线程的控制块,所以把线程块指针中访问
- * 另一个线程的控制块,所以把线程块指针声明成全局类型以供全局访问
- */
 static rt_thread_t tid1 = RT_NULL;
 
 /* 线程1的信号处理函数 */
@@ -56,21 +52,13 @@ static void thread1_entry(void *parameter)
 int signal_sample(void)
 {
     /* 创建线程1 */
-    tid1 = rt_thread_create("t1",
+    tid1 = rt_thread_create("thread1",
                             thread1_entry, RT_NULL,
                             THREAD_STACK_SIZE,
                             THREAD_PRIORITY, THREAD_TIMESLICE);
-
-    if (tid1 != RT_NULL)
-    {
-        /* 如果获得线程控制块,启动这个线程 */
+    
+    if (tid1 != RT_NULL)       
         rt_thread_startup(tid1);
-    }
-    else
-    {
-        rt_kprintf("create t1 failed");
-        return -1;
-    }
 
     rt_thread_mdelay(300);
 

+ 70 - 0
thread/scheduler_hook.c

@@ -0,0 +1,70 @@
+/* 
+ * Copyright (c) 2006-2018, RT-Thread Development Team 
+ * 
+ * SPDX-License-Identifier: Apache-2.0 
+ * 
+ * Change Logs: 
+ * Date           Author       Notes 
+ * 2018-08-24     yangjie      the first version 
+ */ 
+ 
+ /*
+ * 程序清单:调度器钩子
+ * 在调度器钩子中打印线程切换信息
+ */
+
+#include <rtthread.h>
+
+#define THREAD_STACK_SIZE	1024
+#define THREAD_PRIORITY	    20
+#define THREAD_TIMESLICE    10
+
+/* 针对每个线程的计数器 */
+volatile rt_uint32_t count[2];
+
+/* 线程1、2共用一个入口,但入口参数不同 */
+static void thread_entry(void* parameter)
+{
+    rt_uint32_t value;
+
+    value = (rt_uint32_t)parameter;
+    while (1)
+    {
+        rt_kprintf("thread %d is running\n", value);
+        rt_thread_mdelay(1000); //延时一段时间
+    }
+}
+
+static rt_thread_t tid1 = RT_NULL;
+static rt_thread_t tid2 = RT_NULL;
+
+static void scheduler_hook(struct rt_thread* from, struct rt_thread* to)
+{
+    rt_kprintf("from: %s -->  to: %s \n", from->name , to->name);
+}
+
+int sch_hook_sample()
+{   
+    /* 设置调度器钩子 */
+    rt_scheduler_sethook(scheduler_hook);
+    
+    /* 创建线程1 */
+    tid1 = rt_thread_create("thread1", 
+                            thread_entry, (void*)1, 
+                            THREAD_STACK_SIZE, 
+                            THREAD_PRIORITY, THREAD_TIMESLICE); 
+    if (tid1 != RT_NULL) 
+        rt_thread_startup(tid1);
+
+    /* 创建线程2 */
+    tid2 = rt_thread_create("thread2", 
+                            thread_entry, (void*)2, 
+                            THREAD_STACK_SIZE, 
+                            THREAD_PRIORITY,THREAD_TIMESLICE - 5);
+    if (tid2 != RT_NULL) 
+        rt_thread_startup(tid2);
+    return 0;
+}
+
+/* 导出到 msh 命令列表中 */
+MSH_CMD_EXPORT(sch_hook_sample, sch_hook sample);

+ 2 - 9
thread/thread_sample.c

@@ -57,22 +57,15 @@ static void thread2_entry(void *param)
 /* 删除线程示例的初始化 */
 int thread_sample(void)
 {
-    /* 创建线程1,名称是t1,入口是thread1_entry*/
-    tid1 = rt_thread_create("t1",
+    /* 创建线程1,名称是thread1,入口是thread1_entry*/
+    tid1 = rt_thread_create("thread1",
                             thread1_entry, RT_NULL,
                             THREAD_STACK_SIZE,
                             THREAD_PRIORITY, THREAD_TIMESLICE);
     
     /* 如果获得线程控制块,启动这个线程 */
     if (tid1 != RT_NULL)
-    {
         rt_thread_startup(tid1);
-    }
-    else
-    {
-        rt_kprintf("create t1 failed");
-        return -1;
-    }
 
     /* 初始化线程2,名称是thread2,入口是thread2_entry */
     rt_thread_init(&thread2,

+ 68 - 0
thread/timeslice_sample.c

@@ -0,0 +1,68 @@
+/* 
+ * Copyright (c) 2006-2018, RT-Thread Development Team 
+ * 
+ * SPDX-License-Identifier: Apache-2.0 
+ * 
+ * Change Logs: 
+ * Date           Author       Notes 
+ * 2018-08-24     yangjie      the first version 
+ */ 
+ 
+ /*
+ * 程序清单:相同优先级线程按照时间片轮番调度
+ *
+ * 这个例子中将创建两个线程,每一个线程都在打印信息
+ * 
+ */
+
+#include <rtthread.h>
+
+#define THREAD_STACK_SIZE	1024
+#define THREAD_PRIORITY	    20
+#define THREAD_TIMESLICE    10
+
+/* 线程入口 */
+static void thread_entry(void* parameter)
+{
+    rt_uint32_t value;
+    rt_uint32_t count = 0;
+
+    value = (rt_uint32_t)parameter;
+    while (1)
+    {
+        if(0 == (count % 5))
+        {           
+            rt_kprintf("thread %d is running ,thread %d count = %d\n", value , value , count);      
+
+            if(count > 200)
+                return;            
+        }
+         count++;
+     }  
+}
+
+int timeslice_sample()
+{
+    rt_thread_t tid;
+    /* 创建线程1 */
+    tid = rt_thread_create("thread1", 
+                            thread_entry, (void*)1, 
+                            THREAD_STACK_SIZE, 
+                            THREAD_PRIORITY, THREAD_TIMESLICE); 
+    if (tid != RT_NULL) 
+        rt_thread_startup(tid);
+
+
+    /* 创建线程2 */
+    tid = rt_thread_create("thread2", 
+                            thread_entry, (void*)2,
+                            THREAD_STACK_SIZE, 
+                            THREAD_PRIORITY, THREAD_TIMESLICE-5);
+    if (tid != RT_NULL) 
+        rt_thread_startup(tid);
+    return 0;
+}
+
+/* 导出到 msh 命令列表中 */
+MSH_CMD_EXPORT(timeslice_sample, timeslice sample);
+