Xilkernel是Xilinx公司提供的用于EDK系统的小型、模块化的操作系统,支持MicroBlaze、PowerPC405以及PowerPC440处理器。支持可移植操作系统接口(POSIX)。
Xilkernel功能函数包括:线程管理、信号量、消息队列、共享内存、互斥锁、动态内存管理、软件定时、用户层中断处理API等几个方面。
------------------------------------------------------------- 1、线程管理包括如下API函数 Xilkernel支持基本的POSIX线程操作,需要配合线程设置共同作用。使用该类函数需要包含头文件pthread.h。
int pthread_create(pthread_t thread, pthread_attr_t* att, void*(*start_func)(void*),void* param) 参数:thread是存储线程ID的地址,attr存储线程属性结构体的地址,start_func线程函数名,param线程函数参数指针。 返回:0创建成功,-1线程ID无效,EINVAL无效属性,EAGAIN资源不足 创建线程并执行。
void pthread_exit(void *value_ptr) 参数:线程返回值的指针 结束一个线程,但这个函数并不是必须的。需要用到返回值时才使用。
int pthread_join(pthread_t thread, void **value_ptr) 参数:thread线程ID,value_ptr线程返回值地址指针 返回:0成功,ESRCH无效线程,EINVAL线程返回值已经被使用 停止当前线程等待目标线程执行完成并返回值。
pthread_t pthread_self(void) 返回:本线程ID
int pthread_detach(pthread_t target) 返回:0成功,ESRCH线程未创建 回收线程存储资源,但并不会结束线程。
int pthread_equal(pthread_t t1, pthread_t t2) 参数:t1和t2两个待比较线程的ID 返回:1两线程是同一线程,0其它情况
int pthread_getschedparam(pthread_t thread, int *policy, struct sched_param *param) 参数:thread线程ID,policy全局调度策略指针,param调度策略结构体地址 返回:0成功,ESRCH线程无效,EINVAL调度参数无效 函数返回个别线程的调度策略。
int pthread_setschedparam(pthread_t thread, int policy, const struct sched_param *param) 参数:thread线程ID,policy忽略,param调度策略结构体地址 返回:0成功,ESRCH线程无效,EINVAL调度参数无效 函数返回个别线程的调度策略。
int pthread_attr_init(pthread_attr_t* attr) 参数:线程属性指针 返回:0成功,1未成功,EINVAL属性无效 按照默认设置初始化线程属性对象attr
int pthread_attr_destroy (pthread_attr_t* attr) 参数:线程属性指针 返回:0成功,EINVAL错误 函数销毁线程指针对象,设置成未定义值。
int pthread_attr_setdetachstate(pthread_attr_t* attr, int dstate) 参数:attr属性结构体,dstate要设置的状态 返回:0成功,EINVAL无效参数 设置线程状态
int pthread_attr_getdetachstate(pthread_attr_t* attr, int *dstate) 参数:attr属性结构体,dstate获取的状态地址 返回:0成功,EINVAL无效参数 获取线程状态:PTHREAD_CREATE_DETACHED或者PTHREAD_CREATE_JOINABLE
int pthread_attr_setschedparam(pthread_attr_t* attr, struct sched_param *schedpar) 参数:attr属性结构体,schedpar调度参数存储地址 返回:0成功,EINVAL无效参数,ENOTSUP无效调度参数 设置线程优先级,sched_param在sched.h文件中定义
int pthread_attr_getschedparam(pthread_attr_t* attr, struct sched_param* schedpar) 参数:attr属性结构体,schedpar线程调度参数指针 返回:0成功,EINVAL无效参数 获取线程优先级。
int pthread_attr_setstack(const pthread_attr_t *attr, void *stackaddr, size_t stacksize) 参数:attr属性结构体,stacksize堆栈地址 返回:0成功,EINVAL堆栈设置不当 设置线程堆栈
int pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize) 参数:attr属性结构体,stackaddr堆栈地址指针,stacksize堆栈空间以字节为单位 返回:0成功,EINVAL无效属性 获取线程的堆栈信息
pid_t get_currentPID(void) 返回:当前正在运行的线程或操作的ID
int kill(pid_t pid) 参数:pid线程或操作ID 返回:0成功,-1未成功 终止指定线程或操作
int process_status(pid_t pid, p_stat *ps) 参数:pid操作或线程ID,ps状态存储地址 返回:无 获取当前正在运行的县城或操作的状态
int xmk_add_static_thread(void* (*start_routine)(void *), int sched_priority) 参数:start_routine线程函数,sched_priority优先级 返回:0成功,-1未成功 该函数将线程加入到启动或静态线程列表中,这个函数要在xilkernel_main()函数之前调用
int yield(void) 迫使处理器运行下一个准备好的线程或操作,当前线程或操作今日任务准备完毕队列,等待再次获取时间片运行。
------------------------------------------------------------- 2、信号量包括API函数如下 Xilkernel支持信号量操作,信号量提供高速的任务间同比和互斥机制,遵循POSIX。Xilkernel的信号量分为有名信号量和无名信号量量化总。有名信号量基于文件系统实现,无名信号量基于内存实现。信号量是实现进程间通信(IPC)的重要手段,使用该类函数需要包含头文件semaphore.h。
int sem_init(sem_t *sem, int pshared, unsigned value) 参数:sem信号量ID,pshared共享状态,value初始值 返回:0成功,-1未成功。 初始化一个信号量,并初始化信号量的值,适用于无名信号量。
int sem_destroy(sem_t* sem) 参数:sem信号量ID 返回:0成功,-1未成功 释放一个信号量资源,适用于无名信号量
int sem_getvalue(sem_t* sem, int* value) 参数:sem信号量ID,value获取值地址 返回:0成功,-1未成功 获取信号量当前值
int sem_wait(sem_t* sem) 参数:sem信号量ID 返回:0成功,-1未成功 等待信号量的值大于0,并将信号量值减1。执行对信号量的锁操作
int sem_trywait(sem_t* sem) 参数:sem信号量ID 返回:0成功,-1未成功 功能与sem_trywait()函数相同,但不阻塞进程。
int sem_timedwait(sem_t* sem, unsigned ms) 参数:sem信号量ID,ms定时器时间 返回:0成功,-1未成功 功能与sem_trywait()函数相同,等待信号量大于0过程中,通过定时器超时来停止阻塞进程。
sem_t* sem_open(const char* name, int oflag,...) 参数:name信号量对象的字符串名,oflag控制信号量创建的标识 返回:创建的或已存在的信号量ID 创建一个信号量,适用于有名的信号量
int sem_close(sem_t* sem) 参数:sem信号量ID 返回:0成功,-1未成功 关闭信号量,适用于有名信号量
int sem_post(sem_t* sem) 参数:sem信号量ID 返回:0成功,-1未成功 增加信号量的值,执行该函数为制定信号量的值加1