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

CMSIS-RTOS线程创建osThreadNew

osThreadNew 是 CMSIS-RTOS(Cortex Microcontroller Software Interface Standard - Real-Time Operating System)API 中的一个函数,用于创建一个新的线程(任务)。以下是关于这个函数的详细解释:


函数原型

osThreadId_t osThreadNew(osThreadFunc_t func, void *argument, const osThreadAttr_t *attr);

参数

  1. func:

    • 类型:osThreadFunc_t
    • 说明:这是一个指向线程函数的指针。线程函数是线程执行的主体,必须符合以下原型:
      void thread_function(void *argument);
      
      其中,argument 是传递给线程函数的参数。
  2. argument:

    • 类型:void *
    • 说明:这是一个指向线程函数的参数的指针。你可以通过这个参数向线程函数传递任何数据。
  3. attr:

    • 类型:const osThreadAttr_t *
    • 说明:这是一个指向线程属性结构的指针。osThreadAttr_t 是一个结构体,用于定义线程的属性,例如优先级、栈大小等。如果设置为 NULL,则使用默认属性。

返回值

  • 类型:osThreadId_t
  • 说明:返回新创建的线程的 ID。如果创建失败,则返回 NULL

示例代码

以下是一个简单的示例,展示如何使用 osThreadNew 创建一个线程:

#include "cmsis_os.h" // 包含 CMSIS-RTOS 的头文件// 线程函数
void thread_function(void *argument) {while (1) {// 线程的主体代码printf("Thread is running with argument: %d\n", *(int *)argument);osDelay(1000); // 延时 1000ms}
}int main(void) {osKernelInitialize(); // 初始化 RTOS 内核// 创建一个线程int arg = 42; // 线程函数的参数osThreadAttr_t attr = {.name = "MyThread", // 线程名称.attr_bits = osThreadDetached, // 线程属性.cb_mem = NULL, // 线程控制块内存.cb_size = 0, // 线程控制块大小.stack_mem = NULL, // 线程栈内存.stack_size = 1024, // 线程栈大小.priority = osPriorityNormal // 线程优先级};osThreadId_t thread_id = osThreadNew(thread_function, &arg, &attr);if (thread_id == NULL) {printf("Failed to create thread\n");} else {printf("Thread created successfully\n");}osKernelStart(); // 启动 RTOS 内核while (1) {// 主线程的主体代码}
}

代码解析

  1. 线程函数

    • thread_function 是线程的主体函数,它会无限循环地打印一条消息,并延时 1000ms。
    • 参数 argument 是通过 osThreadNew 传递给线程函数的。
  2. 线程属性

    • osThreadAttr_t 结构体用于定义线程的属性,包括名称、优先级、栈大小等。
    • 在这个例子中,我们设置了线程的名称为 "MyThread",优先级为 osPriorityNormal,栈大小为 1024 字节。
  3. 创建线程

    • 使用 osThreadNew 创建线程,传递线程函数、参数和属性。
    • 如果线程创建成功,osThreadNew 会返回线程的 ID;否则返回 NULL
  4. 启动 RTOS 内核

    • 调用 osKernelStart 启动 RTOS 内核,之后线程会开始运行。

注意事项

  1. 线程函数的返回

    • 线程函数不能返回,因为它会无限循环运行。如果需要退出线程,可以使用 osThreadTerminate
  2. 线程优先级

    • 线程优先级决定了线程的调度顺序。优先级越高,线程越先运行。
  3. 线程栈大小

    • 栈大小需要根据线程函数的复杂性合理设置。如果栈大小不足,可能会导致栈溢出。
  4. 线程属性

    • 如果不需要自定义线程属性,可以将 attr 设置为 NULL,使用默认属性。

总结

osThreadNew 是 CMSIS-RTOS 中用于创建线程的函数。通过它,你可以定义线程的主体函数、传递参数,并设置线程的属性。这个函数是多线程编程的基础,广泛应用于嵌入式系统开发中。

http://www.dtcms.com/a/289607.html

相关文章:

  • JAVA国际版任务悬赏+接单系统源码支持IOS+Android+H5
  • 代码随想录算法训练营二十一天|回溯part03
  • IDEA使用技巧
  • c/c++-memory-management
  • ansible awx自动化工具学习准备
  • 牛客-两个链表的第一个公共节点
  • 安全信息与事件管理(SIEM)系统架构设计
  • TypeScript 中替代 Interface 的方案
  • PLC(可编程逻辑控制器,Programmable Logic Controller)是什么?
  • 详解如何解决Mysql主从复制延迟
  • 脚本代码:网页限制解除(改)
  • 树同构(Tree Isomorphism)
  • 生成模型与判别模型
  • 虚拟机VMware安装国产桌面系统统信UOS
  • Nginx服务器基本搭建
  • 【性能测试】性能压测3个阶段+高频面试题回答(详细)
  • 大语言模型:人像摄影的“达芬奇转世”?——从算法解析到光影重塑的智能摄影革命
  • 机器学习基础:从数据到智能的入门指南
  • 【数据集】NOAA 全球监测实验室(GML)海洋边界层(MBL)参考简介
  • 渗透笔记(XSS跨站脚本攻击)
  • 【算法300】:栈02
  • Day25| 491.递增子序列、46.全排列、47.全排列 II、回溯总结
  • JAVA面试宝典 -《API设计:RESTful 与 GraphQL 对比实践》
  • Error: You don‘t have permission to access that port.当端口被莫名占用时,kill它!
  • G1回收器垃圾回收过程
  • 30天打牢数模基础-卷积神经网络讲解
  • 将来职业从事股票市场投资工作,应该做什么?
  • Python趣味算法:借书方案知多少 | 排列组合穷举法详解
  • DeepSeek+LoRA微调大模型实战
  • 【机器学习深度学习】魔塔社区模型后缀全解析:Base、Chat、Instruct、Bit、Distill背后的技术密码