CMSIS-RTOS线程创建osThreadNew
osThreadNew是CMSIS-RTOS API中用于创建新线程的关键函数。该函数接受三个参数:线程执行函数指针、传递给线程的参数指针,以及定义线程属性的结构体指针(可设为NULL使用默认值)。函数返回线程ID,创建失败时返回NULL。示例展示了如何定义线程函数、设置线程属性(名称、优先级、栈大小等),并使用该函数创建线程。需注意线程函数应为无限循环,合理设置栈大小,并正确管理线程优先级。该函
·
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);
参数
-
func:- 类型:
osThreadFunc_t - 说明:这是一个指向线程函数的指针。线程函数是线程执行的主体,必须符合以下原型:
其中,void thread_function(void *argument);argument是传递给线程函数的参数。
- 类型:
-
argument:- 类型:
void * - 说明:这是一个指向线程函数的参数的指针。你可以通过这个参数向线程函数传递任何数据。
- 类型:
-
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) {
// 主线程的主体代码
}
}
代码解析
-
线程函数:
thread_function是线程的主体函数,它会无限循环地打印一条消息,并延时 1000ms。- 参数
argument是通过osThreadNew传递给线程函数的。
-
线程属性:
osThreadAttr_t结构体用于定义线程的属性,包括名称、优先级、栈大小等。- 在这个例子中,我们设置了线程的名称为
"MyThread",优先级为osPriorityNormal,栈大小为1024字节。
-
创建线程:
- 使用
osThreadNew创建线程,传递线程函数、参数和属性。 - 如果线程创建成功,
osThreadNew会返回线程的 ID;否则返回NULL。
- 使用
-
启动 RTOS 内核:
- 调用
osKernelStart启动 RTOS 内核,之后线程会开始运行。
- 调用
注意事项
-
线程函数的返回:
- 线程函数不能返回,因为它会无限循环运行。如果需要退出线程,可以使用
osThreadTerminate。
- 线程函数不能返回,因为它会无限循环运行。如果需要退出线程,可以使用
-
线程优先级:
- 线程优先级决定了线程的调度顺序。优先级越高,线程越先运行。
-
线程栈大小:
- 栈大小需要根据线程函数的复杂性合理设置。如果栈大小不足,可能会导致栈溢出。
-
线程属性:
- 如果不需要自定义线程属性,可以将
attr设置为NULL,使用默认属性。
- 如果不需要自定义线程属性,可以将
总结
osThreadNew 是 CMSIS-RTOS 中用于创建线程的函数。通过它,你可以定义线程的主体函数、传递参数,并设置线程的属性。这个函数是多线程编程的基础,广泛应用于嵌入式系统开发中。
更多推荐



所有评论(0)