线程初始化

线程的初始化可以使用下面的函数接口完成:

  1. rt_err_t rt_thread_init(struct rt_thread* thread,
  2. const char* name,
  3. void (*entry)(void* parameter), void* parameter,
  4. void* stack_start, rt_uint32_t stack_size,
  5. rt_uint8_t priority, rt_uint32_t tick);

rt_thread_init函数用来初始化静态线程对象。而线程句柄(或者说线程控制块指针),线程栈由用户提供。静态线程是指,线程控制块、线程运行栈一般都设置为全局变量,在编译时就被确定、被分配处理,内核不负责动态分配内存空间。需要注意的是,用户提供的栈首地址需做系统对齐(例如ARM上需要做4字节对齐)。

线程安全

安全

中断例程

可调用

函数参数


  1. 参数 描述

  1. thread 线程句柄。线程句柄由用户提供出来,并指向对应的线程控制块内存地址。
  2.  
  3. name 线程的名称;线程名称的最大长度由rtconfig.h中定义的RT_NAME_MAX宏指定,多余部分会被自动截掉。
  4.  
  5. entry 线程入口函数;
  6.  
  7. parameter 线程入口函数参数;

stack_start 线程栈起始地址;

  1. stack_size 线程栈大小,单位是字节。在大多数系统中需要做栈空间地址对齐(例如ARM体系结构中需要向4字节地址对齐)。
  2.  
  3. priority 线程的优先级。优先级范围根据系统配置情况(rtconfig.h中的RT_THREAD_PRIORITY_MAX宏定义),如果支持的是256级优先级,那么范围是从0 255,数值越小优先级越高,0代表最高优先级。
  4.  
  5. tick 线程的时间片大小。时间片(tick)的单位是操作系统的时钟节拍。当系统中存在相同优先级线程时,这个参数指定线程一次调度能够运行的最大时间长度。这个时间片运行结束时,调度器自动选择下一个就绪态的同优先级线程进行运行。

函数返回

返回值:返回RT_EOK;

下面给出一个线程初始化的例子,如下代码:

  1. /*
  2. * 程序清单:初始化静态线程
  3. *
  4. * 这个程序会初始化2个静态线程,它们拥有共同的入口函数,但参数不相同
  5. */
  6. #include <rtthread.h>
  7.  
  8. #define THREAD_PRIORITY 25
  9. #define THREAD_STACK_SIZE 512
  10. #define THREAD_TIMESLICE 5
  11.  
  12. /* 线程1控制块 */
  13. static struct rt_thread thread1;
  14. /* 线程1栈 */
  15. ALIGN(4)
  16. static rt_uint8_t thread1_stack[THREAD_STACK_SIZE];
  17. /* 线程2控制块 */
  18. static struct rt_thread thread2;
  19. /* 线程2栈 */
  20. ALIGN(4)
  21. static rt_uint8_t thread2_stack[THREAD_STACK_SIZE];
  22.  
  23. /* 线程入口 */
  24. static void thread_entry(void* parameter)
  25. {
  26. rt_uint32_t count = 0;
  27. rt_uint32_t no = (rt_uint32_t) parameter; /* 获得正确的入口参数 */
  28.  
  29. while (1)
  30. {
  31. /* 打印线程计数值输出 */
  32. rt_kprintf("thread%d count: %d\n", no, count ++);
  33.  
  34. /* 休眠10个OS Tick */
  35. rt_thread_delay(10);
  36. }
  37. }
  38.  
  39. /* 用户应用入口 */
  40. int rt_application_init()
  41. {
  42. rt_err_t result;
  43.  
  44. /* 初始化线程1 */
  45. result = rt_thread_init(&thread1, "t1", /* 线程名:t1 */
  46. thread_entry, (void*)1, /* 线程的入口是thread_entry,入口参数是1 */
  47. &thread1_stack[0], sizeof(thread1_stack), /* 线程栈是thread1_stack */
  48. THREAD_PRIORITY, 10);
  49. if (result == RT_EOK) /* 如果返回正确,启动线程1 */
  50. rt_thread_startup(&thread1);
  51. else
  52. return -1;
  53.  
  54. /* 初始化线程2 */
  55. result = rt_thread_init(&thread2, "t2", /* 线程名:t2 */
  56. thread_entry, (void*)2, /* 线程的入口是thread_entry,入口参数是2 */
  57. &thread2_stack[0], sizeof(thread2_stack), /* 线程栈是thread2_stack */
  58. THREAD_PRIORITY + 1, 10);
  59. if (result == RT_EOK) /* 如果返回正确,启动线程2 */
  60. rt_thread_startup(&thread2);
  61. else
  62. return -1;
  63.  
  64. return 0;
  65. }