1 前言
这节将会描述Zephyr线程的一个特殊功能,自定义数据。
http://docs.zephyrproject.org/kernel/threads/custom_data.html
2 概念
每个线程都有一个32位的自定义数据区。 自定义数据只能由线程本身访问,并且可以由应用程序用于其选择的任何目的。 线程的默认自定义数据为零。
代码语言:javascript复制注意:自定义数据支持不适用于ISR,因为它们在单个共享内核中断处理上下文中操作。
3 操作
3.1 使用自定义数据
默认情况下,线程自定义数据支持被禁用。 配置选项CONFIG_THREAD_CUSTOM_DATA可用于启用支持。
k_thread_custom_data_set()和k_thread_custom_data_get()函数分别用于写入和读取线程的自定义数据。 线程只能访问自己的自定义数据,而不能访问另一个线程。
以下代码使用自定义数据功能记录每个线程调用特定例程的次数。
代码语言:javascript复制注意:显然,只有一个例程可以使用这种技术,因为它垄断了自定义数据特性的使用。
如下是示例代码:
代码语言:javascript复制int call_tracking_routine(void)
{
u32_t call_count;
if (k_is_in_isr()) {
/* ignore any call made by an ISR */
} else {
call_count = (u32_t)k_thread_custom_data_get();
call_count ;
k_thread_custom_data_set((void *)call_count);
}
/* do rest of routine's processing */
...
}
4 建议用法
通过使用自定义数据作为指向线程拥有的数据结构的指针,使用线程自定义数据来允许例程访问特定于线程的信息。
5 配置选项
- CONFIG_THREAD_CUSTOM_DATA
6 API
下列线程API,都在 kernel.h 中提供了:
k_thread_custom_data_set() k_thread_custom_data_get()