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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐