每一個內核可執行上下文都會和一個表徵這個上下文是一個task、fiber還是內核中斷處理上下文的type相關聯。
所有task、fiber上下文都有一個特殊的線程特徵值,以使它們被識別。每個task和fiber可以支持一個私有的32位的線程定製的數據值,這個值只能被它們自己訪問,並可能被應用用於任何目的,默認爲0.
注意:這個定製數據值不能用於ISRs,因爲這些操作只能在共享的內核中斷處理上下文中進行。
內核允許task或者fiber出現忙等待,也就是對處理進行指定時間週期的延遲。這種延遲的發生不需要內核進行上下文切換,因爲這通常在timer和timeout服務中進行。
目的
不同上下文中執行的操作不同的情況下,可以使用內核可執行上下文服務(kernel execution context services)來編寫代碼。
需要的延遲非常短可以保證上下文切換到其他task或者fiber時,可以使用忙等待(busy wait)
忙等待服務也可以作爲一個純nanokernel系統中的nanokernel後臺任務中延遲的一部分,這個任務不允許自動放棄CPU。
例子:
配置定製數據支持
使用THREAD_CUSTOM_DATA配置項來打開對線程定製數據的支持,默認情況下,定製數據支持是關閉的。
比如:指定上下文來處理
下面的代碼展示了一個程序是怎麼可以用線程的定製數據值來限制一個線程可能會訪問它的次數的。注意:在程序被中斷調用的時候是不計數的,中斷沒有定製數據值。
顯然,程序只可以對自身使用這個計數,因爲它對這個定製數據值的使用是獨佔的。
#define CALL_LIMIT 7 int call_tracking_routine(void) { uint32_t call_count; if (sys_execution_context_type_get() != NANO_CTX_ISR) { call_count = (uint32_t)sys_thread_custom_data_get(); if (call_count == CALL_LIMIT) return -1; call_count++; sys_thread_custom_data_set((void *)call_count); } /* do rest of routine's processing */ ... }
APIs
一下的內核可執行上下文API同時存在於microkernel.h和nanokernel中
sys_thread_self_get()
獲取當前正在執行的task或者fiber的線程id
sys_execution_context_type_get()
獲取當前正在執行的上下文(i.e. task,fiber,or ISR)
sys_thread_custom_data_set()
向當前正在執行的task或者fiber寫定製數據
sys_thread_custom_data_get()
從當前正在執行的task或fiber讀取定製數據