CMSIS-RTOS osThreadId为整数类型

时间:2016-01-07 21:00:46

标签: c rtos cmsis

我正在将产品移植到基于CMSIS的RTOS,产品需要获取32位整数的线程ID。但是,CMSIS线程ID类型(osThreadId)是完全不透明的,对struct os_thread_cb *进行了类型设置,注释可以安全地将其更改为其他内容。

那么有一种安全的设备无关方式来获取线程唯一的整数id吗?例如,我可以假设指针地址本身对于每个线程都是唯一且常量的吗?

1 个答案:

答案 0 :(得分:1)

osThreadId是指针 - Cortex-M上的指针是32位,因此转换为32位整数类型是安全的。因为它是线程的控制块的指针,所以它对该线程来说是完全唯一的。

由于您使用的是CMSIS,因此它意味着目标体系结构,但在一般情况下,为了确保可能具有可能具有不同大小指针的系统的可移植性,您可以使用 stdint.h中声明的uintptr_t 。 typedef可能很有用:

typedef uintptr_t tid_t

然后,您可以安全地将osThreadId转换为tid_t - 隐式或显式。

严格uintptr_t是一个整数类型,能够保持void*,以便回退到void*,它将与原始指针进行比较。由于任何指针类型都可以转换为void*,因此通常情况下uintptr_t可以保存任何指针,但是如果这样的事情让你担心,你可以严格地转换为{{1}在分配给void*之前 - 但实际上这可能是不必要的,当然也是在Cortex-M上。