【ARMv8M Cortex-M33 系列 8 -- RT-Thread 移植 posix 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(&param, 0x0, sizeof(param));
	rt_memset(&attr, 0x0, sizeof(attr));

	param.sched_priority = TEST_PRI;

	pthread_attr_init(&attr);
	pthread_attr_setschedparam(&attr, &param);
	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__);

测试现象:
在这里插入图片描述

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-20 11:54:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-20 11:54:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-20 11:54:04       82 阅读
  4. Python语言-面向对象

    2024-02-20 11:54:04       91 阅读

热门阅读

  1. pip源设置为国内源

    2024-02-20 11:54:04       50 阅读
  2. 微服务中的熔断、降级和限流

    2024-02-20 11:54:04       47 阅读
  3. 学习 Kubernetes(K8s)、常用命令

    2024-02-20 11:54:04       62 阅读
  4. K8S学习

    2024-02-20 11:54:04       53 阅读
  5. 蓝桥杯刷题--python-9(2023填空题2)

    2024-02-20 11:54:04       57 阅读
  6. 2.Angular组件概述

    2024-02-20 11:54:04       50 阅读
  7. 自存放忘 angular 动态加载子节点

    2024-02-20 11:54:04       40 阅读
  8. 消息中间件:Puslar、Kafka、RabbigMQ、ActiveMQ

    2024-02-20 11:54:04       42 阅读