我正在將產品移植到基於CMSIS的RTOS,並且產品需要以32位整數形式獲取線程ID。但是,CMSIS線程ID類型(osThreadId
)完全不透明,請鍵入struct os_thread_cb *
,並註釋可以安全地將其更改爲其他名稱。CMSIS-RTOS osThreadId爲整數類型
那麼是否有一個安全的設備無關的方式來獲得一個線程唯一的整數ID?例如,我可以假設指針地址本身對於每個線程都是唯一的並且是常量?
我正在將產品移植到基於CMSIS的RTOS,並且產品需要以32位整數形式獲取線程ID。但是,CMSIS線程ID類型(osThreadId
)完全不透明,請鍵入struct os_thread_cb *
,並註釋可以安全地將其更改爲其他名稱。CMSIS-RTOS osThreadId爲整數類型
那麼是否有一個安全的設備無關的方式來獲得一個線程唯一的整數ID?例如,我可以假設指針地址本身對於每個線程都是唯一的並且是常量?
osThreadId
是Cortex-M上的指針指針,它們都是32位,所以強制轉換爲32位整數類型是安全的。因爲它是線程的指針控制塊,它將完全獨立於該線程。
由於您使用CMSIS,它,而意味着目標架構,但在一般情況下,以保證便攜性的系統或許與不同大小的指針,你可以用stdint.h宣佈uintptr_t
。一個類型定義可能是有用的:
typedef uintptr_t tid_t
然後你就可以放心地施放osThreadId
爲tid_t
- 無論是含蓄或明確。
嚴格來說uintptr_t
是一個整數類型,能夠容納一個void*
,使得回到void*
它會比較原始指針。由於任何指針類型都可以在void*
之間投射,所以通常情況下uintptr_t
可以容納任何指針,但是如果這樣的事情讓你擔心,那麼在分配給uintptr_t
之前,您可以嚴格地投射到void*
--但實際上這是可能不必要,當然在Cortex-M上也是如此。
感謝您的信息!是的,我認爲Cortex-M架構是端口代碼的安全假設(這適用於所有ARM mbed兼容設備)。我沒有使用uintptr而不是uint32的選項,所以我很高興聽到針對Cortex-M的指針總是32位。 –
雖然有一個解釋:我可以安全地假定osThreadGetId()返回的osThreadId指針對於給定的線程總是相同的嗎?直覺上我會這麼認爲,但文檔並沒有讓我確定。 –
如果情況並非如此,那麼它就不是一個線程ID,所以我認爲無論文檔中的任何明確聲明如何,都可以假定情況如此。 – Clifford