- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在将产品移植到基于 CMSIS 的 RTOS,该产品需要获取 32 位整数形式的线程 ID。然而,CMSIS 线程 id 类型 (osThreadId
) 是完全不透明的,类型定义为 struct os_thread_cb *
并附有注释,可以安全地将其更改为其他类型。
那么是否有一种安全的设备无关方式来获取线程唯一的整数 ID?例如,我可以假设指针地址本身对于每个线程都是唯一且不变的吗?
最佳答案
osThreadId
是一个指针 - Cortex-M 上的指针是 32 位的,因此转换为 32 位整数类型是安全的。由于它是指向线程的控制 block 的指针,因此对于该线程来说它将是完全唯一的。
由于您使用的是 CMSIS,它更像是暗示了目标架构,但在一般情况下,为了确保对可能具有不同大小指针的系统的可移植性,您可以使用 stdint 中声明的 uintptr_t
。嗯。 typedef 可能有用:
typedef uintptr_t tid_t
然后您可以安全地将 osThreadId
转换为 tid_t
- 隐式或显式。
严格来说,uintptr_t
是一种能够容纳 void*
的整数类型,因此转换回 void*
时,它将比较为等于原始指针。由于任何指针类型都可以与 void*
相互转换,通常情况下 uintptr_t
可以容纳任何指针,但是如果您担心这些事情,您可以严格在分配给 uintptr_t
之前转换为 void*
- 但实际上这可能是不必要的,在 Cortex-M 上当然也是如此。
关于CMSIS-RTOS osThreadId 到整数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34665071/
我正在将产品移植到基于 CMSIS 的 RTOS,该产品需要获取 32 位整数形式的线程 ID。然而,CMSIS 线程 id 类型 (osThreadId) 是完全不透明的,类型定义为 struct
我是一名优秀的程序员,十分优秀!