文章目录
- RT-Thread POSIX Pthread
- RT-Thread Pthread 相关宏定义
- RT-Thread libc 初始化
- RT-Thread Pthread 测试
RT-Thread POSIX Pthread
pthread
是POSIX(Portable Operating System Interface)标准定义的一套线程相关的API,全称为POSIX Threads。它是在类Unix操作系统上进行线程管理和操作的一组标准接口,广泛用于实现多线程应用程序。
pthread
库提供了创建和控制线程的一系列函数,包括但不限于:
pthread_create
:创建一个新线程。pthread_exit
:终止当前线程。pthread_join
:等待一个线程的结束。pthread_detach
:将线程设置为脱离状态,使得线程结束时自动释放资源。pthread_cancel
:请求取消同一进程中的另一个线程。- 同步机制,如互斥锁(
pthread_mutex_*
)、条件变量(pthread_cond_*
)、读写锁(pthread_rwlock_*
)等。
RT-Thread Pthread 相关宏定义
RT-Thread是一个面向嵌入式设备的实时操作系统(RTOS),它拥有微内核、多线程调度等特性,并且提供丰富的组件库。RT-Thread也提供了对POSIX标准的部分支持,包括pthread
接口, 具体见rt-thread/components/libc/posix/pthreads/pthread.h
。
如果RT-Thread 中要支持pthread,那么需要使能以下宏:
/* POSIX layer and C standard library */
#define RT_USING_LIBC
#define RT_USING_PTHREADS
#define PTHREAD_NUM_MAX 32
#define RT_USING_POSIX
#define RT_USING_POSIX_MMAP
#define RT_USING_POSIX_TERMIOS
#define RT_USING_POSIX_GETLINE
#define RT_LIBC_DEFAULT_TIMEZONE 8
RT-Thread libc 初始化
libc 的初始化是在 文件 rt-thread/components/libc/posix/io/libc.c
中进行的。
int libc_system_init(void)
{
#ifdef RT_USING_POSIX_DEVIO
rt_device_t dev_console;
dev_console = rt_console_get_device();
if (dev_console)
{
libc_stdio_set_console(dev_console->parent.name, O_RDWR);
}
#endif /* RT_USING_POSIX_DEVIO */
#if defined RT_USING_PTHREADS && !defined RT_USING_COMPONENTS_INIT
pthread_system_init();
#endif
return 0;
}
INIT_COMPONENT_EXPORT(libc_system_init);
在我的测试代码中,走的是pthread_system_init()
进行初始化。
RT-Thread Pthread 测试
测试代码:
#include <rtthread.h>
#include <pthread.h>
#define TEST_STACK_SZ 1024
#define TEST_PRI 0x12
static void *pthread_test_callback(void *par)
{
rt_kprintf(" %s is called, test ok \n", __func__);
return 0;
}
typedef void *(*thread_fn_t)(void *par);
static int pthread_test_task_create(thread_fn_t fn, void *par)
{
int ret;
struct sched_param param;
pthread_attr_t attr;
pthread_t pid = 0;
rt_memset(¶m, 0x0, sizeof(param));
rt_memset(&attr, 0x0, sizeof(attr));
param.sched_priority = TEST_PRI;
pthread_attr_init(&attr);
pthread_attr_setschedparam(&attr, ¶m);
pthread_attr_setstacksize(&attr, TEST_STACK_SZ);
pthread_attr_setschedpolicy(&attr, SCHED_RR);
ret =pthread_create(&pid, &attr, fn, par);
if (ret) {
rt_kprintf("error: pthread teask create failed\n");
return -RT_ERROR;
}
return RT_EOK;
}
int pthread_main_test(void)
{
int ret;
ret = pthread_test_task_create(pthread_test_callback, RT_NULL);
if (ret == RT_ERROR) {
rt_kprintf("error: pthread main test failed\n");
return -RT_ERROR;
}
return RT_EOK;
}
如果pthread 创建任务成功并得到调度那么会打印rt_kprintf(" %s is called, test ok \n", __func__);
。
测试现象: