CMSIS-RTOS osThreadId 到整数类型
CMSIS-RTOS osThreadId to integer type
我正在将产品移植到基于 CMSIS 的 RTOS,产品需要获取线程 ID 作为 32 位整数。但是,CMSIS 线程 id 类型 (osThreadId
) 是完全不透明的,类型定义为 struct os_thread_cb *
并附有注释,可以安全地将其更改为其他内容。
那么有没有一种安全的独立于设备的方法来获取线程唯一的整数 ID?例如,我可以假设指针地址本身对于每个线程都是唯一且不变的吗?
osThreadId
是一个指针 - Cortex-M 上的指针是 32 位的,因此转换为 32 位整数类型是安全的。因为它是线程的 控制块 的指针,所以它对于该线程来说是完全唯一的。
由于您使用的是 CMSIS,它更像是暗示了目标架构,但在一般情况下,为了确保对可能具有不同大小指针的系统的可移植性,您可以使用 中声明的 uintptr_t
stdint.h。 typedef 可能有用:
typedef uintptr_t tid_t
然后您可以安全地将 osThreadId
转换为 tid_t
- 隐式或显式。
严格来说 uintptr_t
是一个能够容纳 void*
的整数类型,因此转换回 void*
它将与原始指针进行比较。由于任何指针类型都可以转换为 void*
,因此通常情况下 uintptr_t
可以容纳任何指针,但是如果您担心这些事情,您可以严格转换为 void*
在分配给 uintptr_t
之前 - 但实际上这可能是不必要的,当然 Cortex-M.
我正在将产品移植到基于 CMSIS 的 RTOS,产品需要获取线程 ID 作为 32 位整数。但是,CMSIS 线程 id 类型 (osThreadId
) 是完全不透明的,类型定义为 struct os_thread_cb *
并附有注释,可以安全地将其更改为其他内容。
那么有没有一种安全的独立于设备的方法来获取线程唯一的整数 ID?例如,我可以假设指针地址本身对于每个线程都是唯一且不变的吗?
osThreadId
是一个指针 - Cortex-M 上的指针是 32 位的,因此转换为 32 位整数类型是安全的。因为它是线程的 控制块 的指针,所以它对于该线程来说是完全唯一的。
由于您使用的是 CMSIS,它更像是暗示了目标架构,但在一般情况下,为了确保对可能具有不同大小指针的系统的可移植性,您可以使用 中声明的 uintptr_t
stdint.h。 typedef 可能有用:
typedef uintptr_t tid_t
然后您可以安全地将 osThreadId
转换为 tid_t
- 隐式或显式。
严格来说 uintptr_t
是一个能够容纳 void*
的整数类型,因此转换回 void*
它将与原始指针进行比较。由于任何指针类型都可以转换为 void*
,因此通常情况下 uintptr_t
可以容纳任何指针,但是如果您担心这些事情,您可以严格转换为 void*
在分配给 uintptr_t
之前 - 但实际上这可能是不必要的,当然 Cortex-M.