当前位置: 首页 > news >正文

【ARMv8M Cortex-M33 系列 8 -- RT-Thread 移植 posix pthread】

文章目录

      • 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_DEVIOrt_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_INITpthread_system_init();
#endifreturn 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	0x12static 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__);

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

http://www.lryc.cn/news/304213.html

相关文章:

  • fastApi笔记08-Cookie和Header
  • 解决pycharm中PIL安装失败
  • 数据结构哈希表
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强
  • 【Django】Django自定义后台表单——对一个关联外键对象同时添加多个内容
  • 迷茫?没有努力的方向?没有耐心去坚持?精选书籍推荐2
  • MySQL报错:sql_mode=only_full_group_by解决方法
  • SQL表连接方式
  • 5 原型模式 Prototype
  • springboot java 项目连接es
  • MySQL学习笔记3: MySQL数据库基础
  • GB/T 17640-2023 长丝机织土工布检测
  • MedicalGPT 训练医疗大模型,实现了包括增量预训练、有监督微调、RLHF(奖励建模、强化学习训练)和DPO(直接偏好优化)
  • UE4 C++联网RPC教程笔记(一)(第1~4集)
  • 备战蓝桥杯 Day11(滚动数组优化+完全背包)
  • Java SE 入门到精通—4.抽象类与接口【Java】
  • Python 开发转 Java 简易路线 - 更新中
  • Python编程语言学习
  • Cartographer框架简述
  • 适用于 Linux、Windows 和 macOS 的免费 ONLYOFFICE 桌面应用程序
  • C++面向对象程序设计-北京大学-郭炜【课程笔记(四)】
  • 前端构建效率优化之路
  • react实现拖拽的插件
  • 解决Uncaught SyntaxError: Cannot use import statement outside a module(at XXX)报错
  • PHP如何利用post与get方式传值接收数据
  • 在Mac上搭建MongoDB环境
  • 第三十九天| 62.不同路径、63. 不同路径 II
  • 提高代码质量的 10 条编码原则
  • SHERlocked93 的 2017 年终总结
  • 【FreeRTOS基础入门】任务通知