2016-01-07 44 views
2

我正在將產品移植到基於CMSIS的RTOS,並且產品需要以32位整數形式獲取線程ID。但是,CMSIS線程ID類型(osThreadId)完全不透明,請鍵入struct os_thread_cb *,並註釋可以安全地將其更改爲其他名稱。CMSIS-RTOS osThreadId爲整數類型

那麼是否有一個安全的設備無關的方式來獲得一個線程唯一的整數ID?例如,我可以假設指針地址本身對於每個線程都是唯一的並且是常量?

回答

1

osThreadId是Cortex-M上的指針指針,它們都是32位,所以強制轉換爲32位整數類型是安全的。因爲它是線程的指針控制塊,它將完全獨立於該線程。

由於您使用CMSIS,它,而意味着目標架構,但在一般情況下,以保證便攜性的系統或許與不同大小的指針,你可以用stdint.h宣佈uintptr_t。一個類型定義可能是有用的:

typedef uintptr_t tid_t 

然後你就可以放心地施放osThreadIdtid_t - 無論是含蓄或明確。

嚴格來說uintptr_t是一個整數類型,能夠容納一個void*,使得回到void*它會比較原始指針。由於任何指針類型都可以在void*之間投射,所以通常情況下uintptr_t可以容納任何指針,但是如果這樣的事情讓你擔心,那麼在分配給uintptr_t之前,您可以嚴格地投射到void*--但實際上這是可能不必要,當然在Cortex-M上也是如此。

+0

感謝您的信息!是的,我認爲Cortex-M架構是端口代碼的安全假設(這適用於所有ARM mbed兼容設備)。我沒有使用uintptr而不是uint32的選項,所以我很高興聽到針對Cortex-M的指針總是32位。 –

+0

雖然有一個解釋:我可以安全地假定osThreadGetId()返回的osThreadId指針對於給定的線程總是相同的嗎?直覺上我會這麼認爲,但文檔並沒有讓我確定。 –

+0

如果情況並非如此,那麼它就不是一個線程ID,所以我認爲無論文檔中的任何明確聲明如何,都可以假定情況如此。 – Clifford