转载自:http://blog.csdn.net/wangzaiwei2006/article/details/6358714
名称:
线程信息
函数名 :
cyg_thread_self, cyg_thread_idle_thread , cyg_thread_get_stack_base , cyg_thread_get_stack_size , cyg_thread_measure_stack_usage , cyg_thread_get_next , cyg_thread_get_info , cyg_thread_get_id , cyg_thread_find - 获得基本线程信息
概要 :
[cpp] view plaincopy
#include <cyg/kernel/kapi.h>
cyg_handle_t cyg_thread_self(void);
cyg_handle_t cyg_thread_idle_thread(void);
cyg_addrword_t cyg_thread_get_stack_base(cyg_handle_t thread);
cyg_uint32 cyg_thread_get_stack_size(cyg_handle_t thread);
cyg_uint32 cyg_thread_measure_stack_usage(cyg_handle_t thread);
cyg_bool cyg_thread_get_next(cyg_handle_t *thread, cyg_uint16 *id);
cyg_bool cyg_thread_get_info(cyg_handle_t thread, cyg_uint16 id, cyg_thread_info *info);
cyg_uint16 cyg_thread_get_id(cyg_handle_t thread);
cyg_handle_t cyg_thread_find(cyg_uint16 id);
说明:
这些函数可用于获取一些关于系统的各个线程的基本信息。通常这些信息在实际应用中很少或没有任何意义,但它们可以在调试过程中非常有用。
cyg_thread_self返回当前线程的句柄。这和当前线程被创建时调用 cyg_thread_create 填写的值相同。这个句柄随后可以传递给其它函数例如 cyg_thread_get_priority 使用。
cyg_thread_idle_thread返回系统空闲线程的句柄。这个线程是由内核自动创建,所以应用程序代码除此之外没有其他方式来获取这些信息。
cyg_thread_get_stack_base和 cyg_thread_get_stack_size 返回有关特定线程的堆栈信息。返回的值将匹配线程时被创建时传递给 cyg_thread_create 的值。
cyg_thread_measure_stack_usage仅在配置选项 CYGFUN_KERNEL_THREADS_STACK_MEASUREMENT 启用时生效。返回值线程到目前为止使用其堆栈空间的最大字节数。请注意,这不应该被视为一个真正的上限,例如有可能当前测试运行的特定线程没有在函数中调用的最深点中断。不过这个返回值仍然可以给我们一些关于线程堆栈需求度的有用信息。
cyg_thread_get_next用来枚举系统中所有当前线程。该函数应该在 thread 和 id 被设置为 0 的地方进行首次调用。返回的时候 thread 和 id 就会被设置为第一个线程的 thread 和 id ,在随后的调用中,这些参数会被设置为上次调用的返回值。每次系统中下一个进程的句柄和 ID 会被装入,直到返回一个错误值 -- 这意味着线程链表的结束。(这段翻译的好拗口。。。看下面那例子就懂了)
cyg_thread_get_info会根据给出的 thread 和 id 参数所描述的线程的线程信息来填充 cyg_thread_info 结构。返回的信息包括线程的句柄和 ID ,它的状态和名称,优先级和栈参数。如果线程不存在则函数返回 false 。
在<cyg/kernel/kapi.h> 中 cyg_thread_info 结构定义如下,但可能在将来会扩展增加新的成员,所以不要依赖于它的大小:
[cpp] view plaincopy
typedef struct
{
cyg_handle_t handle;
cyg_uint16 id;
cyg_uint32 state;
char *name;
cyg_priority_t set_pri;
cyg_priority_t cur_pri;
cyg_addrword_t stack_base;
cyg_uint32 stack_size;
cyg_uint32 stack_used;
} cyg_thread_info;
cyg_thread_get_id返回一个线程区别于其他线程的唯一线程 ID 。
cyg_thread_find根据 id 返回一个线程句柄,如果该线程不存在,则返回一个 0 句柄。
(上面俩函数就是一个根据句柄得到id 一个根据 id 得到句柄)
有效上下文 :
cyg_thread_self只能在一个线程上下文中调用。 cyg_thread_idle_thread 可以在线程或者 DSR 的上下文中进行调,但是必须要在系统初始化以后。 cyg_thread_get_stack_base , cyg_thread_get_stack_size 和 cyg_thread_measure_stack_usage 可以在指定的线程被创建后的任何时间被调用,但是衡量堆栈使用情况要涉及至少在部分线程堆栈上的循环,所以该操作应该在线程的上下文中完成。 cyg_thread_get_id 可以在任何上下文中进行调用,只要调用线程能确保所给的线程句柄是有效的。
范例 :
简单使用cyg_thread_get_next 和 cyg_thread_get_info 的例子如下:
[cpp] view plaincopy
#include <cyg/kernel/kapi.h>
#include <stdio.h>
void show_threads(void)
{
cyg_handle_t thread = 0;
cyg_uint16 id = 0;
while( cyg_thread_get_next( &thread, &id ) )
{
cyg_thread_info info;
if( !cyg_thread_get_info( thread, id, &info ) )
break;
printf("ID: %04x name: %10s pri: %d/n",
info.id, info.name?info.name:"----", info.set_pri );
}
}
阅读(1926) | 评论(0) | 转发(0) |