第八章Xilinx操作系统及库课件.ppt

上传人:牧羊曲112 文档编号:2111013 上传时间:2023-01-12 格式:PPT 页数:145 大小:375.94KB
返回 下载 相关 举报
第八章Xilinx操作系统及库课件.ppt_第1页
第1页 / 共145页
第八章Xilinx操作系统及库课件.ppt_第2页
第2页 / 共145页
第八章Xilinx操作系统及库课件.ppt_第3页
第3页 / 共145页
第八章Xilinx操作系统及库课件.ppt_第4页
第4页 / 共145页
第八章Xilinx操作系统及库课件.ppt_第5页
第5页 / 共145页
点击查看更多>>
资源描述

《第八章Xilinx操作系统及库课件.ppt》由会员分享,可在线阅读,更多相关《第八章Xilinx操作系统及库课件.ppt(145页珍藏版)》请在三一办公上搜索。

1、第八章 Xilinx操作系统及库,何宾2012.02,第八章 Xilinx操作系统及库何宾,内容概述,本章主要介绍操作系统及板级支持包。该章内容主要包括:(1)Xilinx微核接口;(2)LibXil标准C库;(3)板级支持包;(4)Xilkernel核;(5)LibXil库。其中重点介绍了Xilkernel核,内容包括:Xilkernel核概述、Xilkernel构成、建立Xilkernel应用程序、Xilkernel处理模型、Xilkernel调度模型、POSIX接口、Xilkernel API接口、存储器保护、系统初始化、Xilkernel定制等内容。,内容概述 本章主要介绍操作系统及板

2、级支持包。该章,Xilinx的微核,Xilinx的微核(Xilinx Microkernel,XMK)包含三个不同的软件实体,通过它用户应用程序可以与标准C和Math库,LibXil库,Xilkernel或独立运行的操作系统相接。标准C库由newlib和libc组成,该库包含了标准C的函数,例如,stdio,stdlib,string例程。数学库是newlib数学库的扩展,提供了标准的数学函数。,Xilinx的微核 Xilinx的微核(Xil,Xilinx的微核,LibXil库由下面构成:1)LibXil Driver-Xilinx的设备驱动程序;2)LibXil MFS-Xilinx的存储文

3、件系统(Memory File System,MFS);3)LibXil Flash-并行Flash编程库;4)LibXil lsf-串行Flash编程库;Xilinx提供独立板级支持包(Board Support Package,BSP,后来Xilinx称为Standard平台)和Xilkernel。,Xilinx的微核 LibXil库由下面构成,Xilinx的微核结构,Xilinx的微核结构图8.1 XMK结构用户应用程序Xil,Xilinx的微核,用户的应用程序通过不同的方法和XMK的不同组成部分进行接口。除了一些交互外,库之间是独立的。比如,Xilkernel使用BSP。BSP和Xil

4、inx驱动构成了对底层硬件的抽象。XMK的库和OS依赖于标准的C库组成部分。数学库libm.a可以用来和用户的应用程序连接。,Xilinx的微核 用户的应用程序通过不同的方法,Xilinx的微核-板级支持包BSP,BSP是单线程库。BSP提供对硬件的小的接口。向应用程序提供所要求的最少的功能。BSP提供的一些典型的函数包括:(1)设置中断(2)系统异常(3)配置缓存(4)其它硬件指定的功能。,Xilinx的微核-板级支持包BSP BSP是,Xilinx的微核-LibXil驱动程序,LibXil是指设备驱动程序,在软件平台中被包含用来向系统中的外设提供接口。这些驱动伴随EDK提供,并且被Libg

5、en配置。后面详细介绍设备驱动的概念和在软件平台中适配的方法。,Xilinx的微核-LibXil驱动程序 Lib,Xilinx的微核-Xilkernel,Xilkernel是一个简单的嵌入式处理器的核,能根据系统进行定制。Xilkernel有嵌入式核的那些关键的特征:(1)多任务;(2)优先级驱动的抢先调度;(3)进程间通信;(4)同步和中断处理。,Xilinx的微核-Xilkernel Xi,Xilinx的微核-Xilkernel,Xilkernel是一个小的,模块化的,用户定制,能用在不同的系统配置环境。应用程序能以不同模式,静态的和Xilkernel连接形成单独的可执行文件。,Xilin

6、x的微核-Xilkernel Xilk,Xilinx的微核-LibXil MFS,LibXil MFS提供简单的存储文件系统,使得很容易通过使用输入-输出文件来访问数据。这个系统通过改变安装区域的源文件,很容易配置满足工程要求。,Xilinx的微核-LibXil MFS L,Xilinx的微核-LibXil Flash,LibXil Flash:提供对并行Flash的访问,这些Flash与普通的Flash接口一致。支持Intel和AMD的CFI(Common Flash Interface)芯片。,Xilinx的微核-LibXil Flash,Xilinx的微核-LibXil lsf,LibX

7、il lsf是一个系统内Flash库。支持Xilinx系统内Flash和外部的串行Flash(Atmel的AT45XXXD,Intel的S33和ST的M25PXX)。该库使得高层软件能和串行Flash通信。,Xilinx的微核-LibXil lsf,标准C库,EDK库和设备驱动提供标准C库函数和访问外设的函数。EDK库由Libgen根据MSS文件为每个工程自动配置。这些库和include文件保存在当前工程lib和include目录下。mb-gcc的选项-l和-L用来将这些目录添加到库搜索路径中。,标准C库 EDK库和设备驱动提供标准C库函数,标准的C库(lib.a),该库为MicroBlaze

8、和PowerPC处理器提供了标准的C函数。可以根据下面路径下的这些标准C函数找到头文件。/gnu/include 其中:为EDK的安装路径;为powerpc-eabi或microblaze;为sol,nt,lin;为powerpc-eabi或microblaze-xilinx-elf;,标准的C库(lib.a)该库为MicroBla,标准的C库(lib.a),Lib.c目录和函数有:_ansi,fastmath.h,machine/,reent.h,stdlib.h,utime.h,_syslist.h,fcnt1.h,malloc.h,regdef.h,string.h,utmp.h,ar.

9、h,float.h,math.h,setjmp.h,sys/,assert.h,grp.h,paths.h,signal.h,termios.h,ctype.h,ieeefp.h,process.h,stdarg.h,time.h,dirent.h,limits.h,pthread.h,stddef.h,unctrl.h,errno.h,locale.h,pwd.h,stdio.h,unistd.h,标准的C库(lib.a)Lib.c目录和函,标准的C库(lib.a),程序访问标准的C库函数,必须使用如下方式编译:1)mb-gcc(对MicroBlaze处理器);2)powerpc-eabi-

10、gcc(对PowerPC处理器),访问libm数学函数,指定lm选项;,标准的C库(lib.a)程序访问标准的C库函数,必,Xilinx C库(libxil.a),Xilinx的C库为MicroBlaze处理器包含下面的目标文件:1)_exception_handler.o,_interrupt_handler.o,_program_clean.o,_program_init.o 2)默认情况下提供异常和中断句柄。libxil.a被自动包含。,Xilinx C库(libxil.a)Xilinx,输入/输出函数,EDK库包含标准C函数用于I/O,比如printf和scanf。这些函数代码太大,不

11、适应嵌入式处理器的应用。这些函数的原型在stdio.h。注意:C标准I/O例程比如printf,scanf,vfprintf在默认情况下是行缓冲的。将其变成无缓冲格式的,必须调用setvbuf。,输入/输出函数 EDK库包含标准C函数用于I/O,输入/输出函数,比如:setvbuf(stdout,NULL,_IONBF,0);这些输入/输出例程要求在新一行用CR和LF结束。除了标准的C函数,EDK处理器库提供了下面的小的I/O函数:1)void print(char*);(打印字符串到MSS文件中指定的标准输 出的外设)2)void putnum(int);(转换整数到16进制的字符串,并打印

12、字 符串到外设)3)void xil_printf(const*char ctl1,)(与printf函数类似,但代码 更小,不支持浮点数),输入/输出函数 比如:,存储器管理函数,MicroBlaze处理器和PowerPC处理器C库支持标准的存储器管理函数,比如malloc(),calloc(),free()。通过使用堆来动态的分配存储器。堆指针从低向高增加(运行时不能增加)。分配堆至少128字节,观察函数返回值以确定正确的分配堆。,存储器管理函数 MicroBlaze处理器和P,算术操作,对所有处理器可以使用libgcc.a库来用软件实现整数和浮点算术运算。当硬件不支持使用指令的算术运算原

13、语时,编译器为所有的处理器插入对这些例程的调用。,算术操作 对所有处理器可以使用libgcc.a库来,MicroBlaze处理器-整数算术运算,默认情况下,整数乘法通过使用库函数例程_mulsi3实现(软件)。如果编译器mb-gcc选择-mno-xl-soft-mul时,整数乘法可以使用硬件实现。整数除法和求模操作通过使用库函数例程_divsi3和_modsi3实现(软件)。可以定制使用硬件除法器来实现除法指令。双精度乘法,除法和求模函数使用库函数_muldi3,_divdi3,moddi3实现。无符号的这些操作相对于有符号的操作就是其前缀为_u,而不是_。,MicroBlaze处理器-整数算

14、术运算,MicroBlaze处理器-浮点算术运算,所有的浮点的加、减、乘、除和转换操作使用C库里的软件函数实现。,MicroBlaze处理器-浮点算术运算 所,板级支持包,板级支持包BSP是软件模块的最底层,用来访问处理器指定的功能。当应用程序直接访问板/处理器使用独立的BSP,BSP在操作系统层下面。,板级支持包 板级支持包BSP是软件模块的最底层,MicroBlaze处理器BSP,当系统使用MicroBlaze处理器,并且没有使用OS时,Libgen自动在libxil.a工程库中建立独立的BSP。MicroBlaze处理器BSP的函数类型主要有:中断处理;异常处理;指令缓存处理;数据缓存处

15、理;FSL接口宏;FSL宏标志;pseudo-asm宏;PVR访问例程和宏;文件处理;错误码。,MicroBlaze处理器BSP 当系统使用M,中断处理,使用中断处理函数,必须在源文件中包含头文件 mb_interface.h。MicroBlaze的中断管理函数有:void microblaze_enable_interrupts(void)void microblaze_disable_interrupts(void)void microblaze_register_handle(XInterruptHandler Handler,void*DataPtr),中断处理 使用中断处理函数,必须

16、在源文件中包含,异常处理,这个功能在MicroBlaze3.0以前不可用。使用异常处理函数,必须在源文件中包含头文件mb_interface.h。当在MHS中正确的配置了硬件异常处理,这些函数才能正常运行。MicroBlaze的异常处理函数有:void microblaze_disable_exceptions(void)void microblaze_enable_exceptions(void)void microblaze_register_exception_handle(Xuint8 Exceptionld,XExceptionHandler Handler,void*DataPtr

17、),异常处理 这个功能在MicroBlaze3.0以前,指令缓存处理,使用指令缓存函数,必须在源文件中包含头文件mb_interface.h。MicroBlaze的指令缓存处理函数有:void microblaze_enable_icache(void)void microblaze_disable_icache(void)void microblaze_init_icache_range(int cache_addr,int cache_size),指令缓存处理 使用指令缓存函数,必须在源文件中,数据缓存处理,使用数据缓存函数,必须在源文件中包含头文件mb_interface.h。Micro

18、Blaze的数据缓存处理函数有:(1)void microblaze_enable_dcache(void)使能Microblaze处理器的数据缓存(2)void microblaze_disable_dcache(void)禁止Microblaze处理器的数据缓存(3)void microblaze_flush_dcache()刷新整个数据缓存,当使用回写缓存时,使用这个函数(4)void microblaze_flush_dcache_range(unsigned int cache_addr,unsigned int cache_len)刷新指定的数据缓存的范围,数据缓存处理 使用数据缓

19、存函数,必须在源文件中包含头,数据缓存处理,(5)void microblaze_invalidate_dcache()使数据缓存无效(6)void microblaze_flush_invalidate_range(unsigned int cache_addr,unsigned int cache_len)使指定范围的数据缓存无效 下面给出初始化指令和数据缓存的一段代码:1初始化指令Cache microblaze_invalidate_icache();microblaze_enable_icache();,数据缓存处理(5)void microblaze_i,数据缓存处理,2初始化数据

20、DCache microblaze_invalidate_dcache();microblaze_enable_dcache();3在程序的结尾,应该使用下面的代码对缓存进行恢复操作。#if XPAR_MICROBLAZE_DCACHE_USE_WRITEBACK=0 microblaze_invalidate_dcache();#endif microblaze_disable_dcache();/*Clean up ICache*/microblaze_invalidate_icache();microblaze_disable_icache();,数据缓存处理 2初始化数据DCache,

21、FSL接口宏,BSP提供了FSL接口宏,用于访问通过FSL连接的硬件加速器。FSL接口宏主要包括:(1)getfslx(val,id,flags)在Microblaze的输入FSL上,执行得到功能。指令的语义由FSL 的宏flag确定;(2)putfslx(val,id,flags)在Microblaze的输出FSL上,执行输出功能。指令的语义由FSL的宏flag确定;(3)tgetfslx(val,id,flags)在Microblaze的输入FSL上,测试得到功能。指令的语义由FSL的宏flag确定;(4)tputfslx(val,id,flags)在Microblaze的输出FSL上,测

22、试输出功能。指令的语义由FSL的宏flag确定;,FSL接口宏 BSP提供了FSL接口宏,用于访问,FSL接口宏,(5)getdfslx(val,id,flags)在Microblaze的输入FSL上,执行得到功能。指令的语义由FSL的宏flag确定;(6)putdfslx(val,id,flags)在Microblaze的输出FSL上,执行输出功能。指令的语义由FSL的宏flag确定;(7)tgetdfslx(val,id,flags)在Microblaze的输入FSL上,测试得到功能。指令的语义由FSL的宏flag确定;(8)tputdfslx(val,id,flags)在Microbla

23、ze的输出FSL上,测试输出功能。指令的语义由FSL的宏flag确定;(9)fsl_isinvalid(invalid)测试最后的FSL操作返回为有效数据;(10)fsl_iserror(error)检查最后的FSL操作设置一个错误标志;,FSL接口宏(5)getdfslx(val,i,FSL宏标志,FSL的宏标志包含:FSL_DEFAULT,FSL_NONBLOCKING,FSL_EXCEPTION,FSL_CONTROL,FSL_ATOMIC,FSL_NONBLOCKING_EXCEPTION,FSL_NONBL OCKING_ATOMIC,FSL_EXCEPTION_CONTROL,FS

24、L_EXCEPTION_ATOMIC,FSL_CONTROL_ATOMIC,FSL_NONBLOCKING_EXCEPTION_CONTROL,FSL_NONBLOCKING_EXCEPTION_ATOMIC,FSL_EXCEPTION_CONTROL_ATOMIC,FSL_NONBLOCKING_EXCEPTION_CONTROL_ATOMIC,FSL宏标志 FSL的宏标志包含:,pseudo-asm宏,BSP提供了访问MicroBlaze不同寄存器的宏,为了使用这些宏,必须在源文件中包含mb_interface.h。这些宏主要有:(1)mggpr(rn):从通用寄存器rn中返回值;(2)m

25、fmsr():从MSR寄存器中返回当前值;(3)mfesr():从异常状态寄存器ESR中返回当前值;(4)mfear():从异常地址寄存器EAR中返回当前值;(5)mffsr():从浮点状态寄存器FPS中返回当前值;(6)mtmsr(v):将值v移到msr寄存器中;(7)mtgpr(rn,v):将值v移动到通用寄存器rn中;(8)microblaze_getfpex_operand_a():返回最后缺陷浮点指令的操 作数A;(9)microblaze_getfpex_operand_b():返回最后缺陷浮点指令的操 作数B;,pseudo-asm宏 BSP提供了访问MicroB,PVR访问例程

26、和宏,MicroBlaze提供了可配置的处理器版本寄存器PVR。PVR的内容使用pvr_t数据结构获得,该数据结构是32位的数组,数组的每个字对应PVR寄存器。PVR字的数目由配置所决定。为了使用宏,必须在源文件中包含pvr.h头文件。访问PVR的方法:1)使用microblaze_get_pvr()函数来填充PVR数据到pvr_t数据结构 中;2)在随后的步骤中,可以使用PVR访问宏得到PVR的数据;PVR访问函数为:int microblaze_get_pvr(pvr_t*pvr),PVR访问例程和宏 MicroBlaze提供了,文件处理,文件处理的函数有:int fcnt1(int fd

27、,int cmd,long arg)该函数通过cmd命令对文件描述符fd进行操作。由于独立的BSP不提供文件系统,这个函数只用来作为完整性。,文件处理 文件处理的函数有:,Xilinx硬件抽象层,Xilinx硬件抽象层包含下面:类型(xil_types);寄存器IO(xil_io);异常(xil_exception);缓存(xil_cache);断言(xil_assert);外部头文件;测试存储器(xil_testmem);测试寄存器(xil_testio);测试缓存(xil_testcache)。由于API函数封装了这些底层的硬件抽象层操作,对于程序设计来说,很少直接使用这些硬件抽象层操作,

28、所以对该部分不进行进一步的介绍,如果需要的话,参考Xilinx的库参考手册。,Xilinx硬件抽象层 Xilinx硬件抽象层,Xilkernel核,XilKernel核是一个小的、健壮的和模块化的核:1)允许定制,使得设计者可以根据大小和功能对核进行裁减;2)在嵌入式核(kernel)内,使用POSIX(Portable Operating System Interface,可移植操作系统接口)API支持核(core)的 特征 3)支持MicroBlaze、PowerPC405和PowerPC440处理器 XilKernel的进程间通信IPC服务用来实现高层服务(比如网络,视频和音频),并且使

29、用这些服务来运行程序。,Xilkernel核 XilKernel核是一,Xilkernel核,下面给出了那些影响在下一个工程中使用核的决定性因素:1)典型的嵌入式控制应用由多个任务组成,这些任务需要按照一个特定的序列或安排来执行。随着所涉及的控制任务的增加,人工组织子任务和分时享用所要求的工作变得十分困难。当复杂度增加时,这样一个程序的响应能力和性能大大降低。2)分解这些任务作为单独的应用程序,并且在一个操作系统上实现这些应用程序会变得更加直观。,Xilkernel核,Xilkernel核,3)一个核允许在一个抽象层上编写代码,而不是在微控制器级独立代码上编写代码。4)很多普通常规的应用程序都

30、依赖于操作系统的服务,比如文件系统,时间管理等。5)Xilkernel是一个小的库,它提供了这些必须的服务。移植或使用通用和开放的源码库(比如图像或网络协议)也要求某些形式的OS服务。,Xilkernel核 3)一个核允许在一个抽象层上,Xilkernel包含的关键特征,1、通过裁减功能,使其对一个系统具有高度的可扩展性 2、通过XPS在很短时间内完成核的配置和使用 3、核的健壮性:通过参数有效性检查保护系统调用,并且正确 的返回可移植性操作系统接口POSIX错误代码 4、POSIX API目标是嵌入式核,包括:轮循或严格优先级调度的线程同步化服务-信号量和互斥锁IPC服务-消息队列和共享存储

31、器动态缓冲池存储器分配软件定时器用户级中断处理,Xilkernel包含的关键特征 1、通过裁减功能,,Xilkernel包含的关键特征,5、通过核的静态线程的创建和启动6、对核的系统调用接口7、为MicroBlaze处理器的异常处理8、通过可用的MicroBlaze处理器MMU的存储器保护,Xilkernel包含的关键特征5、通过核的静态线程的创建和,建立Xilkernel应用程序,Xilkernel由核函数的形式构成,这将导致一个简单的核连接模型。为了建立Xilkernel,必须在软件平台中包含Xilkernel,合理的配置它,并且运行Libgen来产生Xilkernel库。所设计的应用程序

32、独立的开发或者作为XPS里的独立的应用文件工程。当开发完应用程序后,将Xilkernel与其进行连接,然后建立最终的核映像文件。Xilkernel核产生后的文件为libxilkernel.a。,建立Xilkernel应用程序 Xilkern,建立Xilkernel应用程序,建立Xilkernel应用程序在SW平台上包含和配置Xilk,建立Xilkernel应用程序,Xilkernel内部也支持类似更强大的传统的OS的连接和独立的可执行的方法。传统的操作系统由独立的映像文件,每个运行在核上的应用程序作为独立的文件。因此,Xilinx推荐使用更简单和更简洁的库连接模式。XPS支持这种模式,更容易使

33、用。它对于调式,下载和启动都非常方便。对于有独立运行的这种高要求情况下,要求使用独立可执行模式。下面给出了使用核连接模式的应用程序开发步骤:,建立Xilkernel应用程序 Xilkernel内,建立Xilkernel应用程序,1、应用程序应包含xmk.h文件作为首要的文件#include“xmk.h”2、所设计的应用软件工程与libxil.a连接。该库包含真实的核函数。应用程序和该库连接将形成最终的核和应用程序映像文件。3、Xilkernel负责MicroBlaze和PowerPC处理器第一级中断和异常处理。因此,设计人员不能直接处理中断。而在用户级上处理异常和中断;4、使用最终的与核连接的

34、软件应用工程的连接脚本特性来控制核的存储器映射,可以使用自动的脚本产生来帮助设计。,建立Xilkernel应用程序 1、应用程序应包,建立Xilkernel应用程序,5、应用程序必须提供main(),这是核映像文件中的执行的开始点。在main()里,可以做需要的初始化和设置。核保持未启动和休眠状态,在应用程序设置完成后,如果想启动核,调用xilkernel_main()来启动核,使能中断,将控制转移给应用程序。在调用xilkernel_main()以前,必须使能系统级特性。,建立Xilkernel应用程序 5、应用程序必须,建立Xilkernel应用程序,这些是典型的机器状态特性,比如缓存的使

35、能,硬件异常的使能,必须总是打开,即使从一个应用程序到另一个应用程序进行上下文切换(context switch)。在应用程序的线程中,不允许随便改变机器状态。如果在修改机器状态时,产生了上下文的切换,将导致随后的线程执行时,没有使能状态;所以必须在修改状态以前,锁定上下文切换和中断。,建立Xilkernel应用程序 这些是典型的,Xilkernel处理模型,Xilkernel内的执行单位(unit)称为进程上下文(process context)。在进程上下文级上进行调度。这没有线程群的概念,这些群连在一起构成传统上的进程。对于资源来说,所有的线程是平等的。POSIX 线程API是最基本的用

36、户可见到进程上下文的接口。这也提供了一些额外的其它的接口,它不是POSIX的一部分。使用线程标识符来操作线程。使用进程标识符pid_t来操作标识最基本的进程上下文。,Xilkernel处理模型 Xilkernel,Xilkernel调度模型,Xilkernel支持优先级驱动,时间片抢先调度(SCHED_PRIO)或者简单的轮循(SCHED_RR)调度。这是全局调度策略而不能根据每个线程修改。在产生核时必须被静态配置。在SCHED_RR,有一个简单的准备队列和每个进程上下文在一个可配置的时间片执行,当超出时间片时,就执行队列的下一个进程上下文。在SCHED_PRIO,有很多准备队列,它们有优先级

37、,优先级0是系统内的最高优先级,值越高优先级越低。在同一优先级的任务,采用轮循和时间片进行调度。,Xilkernel调度模型 Xilkernel,Xilkernel调度模型,对于上面的调度模型,准备队列的长度也可配置。如果在核中有等待队列(信号量,消息队列等),采用SCHED_PRIO模型时,被配置成优先级队列。否则,被配置成FIFO队列。,Xilkernel调度模型 对于上面的调度模型,,Xilkernel调度模型,图6.4 进程上下文状态,PROC_NEW:一个新创建的进程PROC_READY:一个准备执行的进程PROC_RUN:正在运行的进程PROC_WAIT:由于资源被阻塞的进程PRO

38、C_DELAY:一个等待超时的进程PROC_TIMED_WAIT:一个由于资源被阻塞的进程,有一个相关的超时,Xilkernel调度模型 图6.4 进程上下文状态PR,Xilkernel功能-线程管理,Xilkernel支持最基本的POSIX线程API。线程的创建和操作是以标准POSIX符号来实现的。线程使用唯一的pthread_t标号来标识。系统中所创建的进程都有一个核封装,当线程结束的时候,将控制权交给核封装。因此在线程代码的末尾不需要一个指定的退出函数。,Xilkernel功能-线程管理 Xilkerne,Xilkernel功能-线程管理,来自块开始符号BSS存储器池(基于系统中的最大线

39、程静态分配)代表线程自动的分配线程堆栈。也可以为每一个去创建的线程动态分配定制的存储器作为堆栈。整个线程模块是可选的,可以配置成输入或输出来作为软件规范的一部分。,Xilkernel功能-线程管理 来自块开始符号,Xilkernel功能-线程管理,(1)int pthread_create(pthread_t thread,pthread_attr_t*att,void*(*start_func)(void*),void*param)创建线程并执行 参数:thread是存储线程ID的地址,attr存储线程属性结 构体的地址,start_func线程函数名,param线程函 数参数指针。返回:0

40、创建成功,-1线程ID无效,EINVAL无效属性,EAGAIN资源不足。(2)void pthread_exit(void*value_ptr)参数:线程返回值的指针 结束一个线程,但这个函数并不是必须的。需要用到返 回值时才使用。,Xilkernel功能-线程管理(1)int pthre,Xilkernel功能-线程管理,(3)nt pthread_join(pthread_t thread,void*value_ptr)参数:thread线程ID,value_ptr线程返回值地址指针 返回:0成功,ESRCH无效线程,EINVAL线程返回值 已经被使用停止当前线程等待目标线程执行完成 并返

41、回值。(4)pthread_t pthread_self(void)返回:本线程ID,Xilkernel功能-线程管理(3)nt pth,Xilkernel功能-线程管理,(5)int pthread_detach(pthread_t target)返回:0成功,ESRCH线程未创建回收线程存储资源,但并不会结束线程(6)int pthread_equal(pthread_t t1,pthread_t t2)参数:t1和t2两个待比较线程的ID 返回:1两线程是同一线程,0其它情况,Xilkernel功能-线程管理(5)int pth,Xilkernel功能-线程管理,(7)int pthre

42、ad_getschedparam(pthread_t thread,int*policy,struct sched_param*param)参数:thread线程ID,policy全局调度策略指针,param 调度策略结构体地址 返回:0成功,ESRCH线程无效,EINVAL调度参数无 效 函数返回个别线程的调度策略。(8)int pthread_setschedparam(pthread_t thread,int policy,const struct sched_param*param)参数:thread线程ID,policy忽略,param调度策略结构 体地址 返回:0成功,ESRCH线

43、程无效,EINVAL调度参数无 效 函数设置个别线程的调度策略。,Xilkernel功能-线程管理(7),Xilkernel功能-线程管理,(9)int pthread_attr_init(pthread_attr_t*attr)参数:线程属性指针 返回:0成功,1未成功,EINVAL属性无效 按照默认设置初始化线程属性对象attr(10)int pthread_attr_destroy(pthread_attr_t*attr)参数:线程属性指针 返回:0成功,EINVAL错误 函数销毁线程指针对象,设置成未定义值。,Xilkernel功能-线程管理(9)int,Xilkernel功能-线程管

44、理,(11)int pthread_attr_setdetachstate(pthread_attr_t*attr,int dstate)参数:attr属性结构体,dstate要设置的状态 返回:0成功,EINVAL无效参数 设置线程状态(12)int pthread_attr_getdetachstate(pthread_attr_t*attr,int*dstate)参数:attr属性结构体,dstate获取的状态地址 返回:0成功,EINVAL无效参数 获取线程状态:PTHREAD_CREATE_DETACHED 或者PTHREAD_CREATE_JOINABLE,Xilkernel功能-

45、线程管理(11)int,Xilkernel功能-线程管理,(13)int pthread_attr_setschedparam(pthread_attr_t*attr,struct sched_param*schedpar)参数:attr属性结构体,schedpar调度参数存储地址 返回:0成功,EINVAL无效参数,ENOTSUP无效调 度参数 设置线程优先级,sched_param在sched.h文件中定义(14)int pthread_attr_getschedparam(pthread_attr_t*attr,struct sched_param*schedpar)参数:attr属性结

46、构体,schedpar线程调度参数指针 返回:0成功,EINVAL无效参数 获取线程优先级。,Xilkernel功能-线程管理(13)in,Xilkernel功能-线程管理,(15)int pthread_attr_setstack(const pthread_attr_t*attr,_ void*stackaddr,size_t stacksize)参数:attr属性结构体,stacksize堆栈地址 返回:0成功,EINVAL堆栈设置不当 设置线程堆栈(16)int pthread_attr_getstack(const pthread_attr_t*attr,void*stackaddr

47、,size_t*stacksize)参数:attr属性结构体,stackaddr堆栈地址指针,stacksize堆栈空间以字节为单位 返回:0成功,EINVAL无效属性 获取线程的堆栈信息,Xilkernel功能-线程管理(15)in,Xilkernel功能-线程管理,(17)pid_t get_currentPID(void)返回:当前正在运行的线程或操作的ID(18)int kill(pid_tpid)参数:pid线程或操作ID 返回:0成功,-1未成功 终止指定线程或操作(19)int process_status(pid_t pid,p_stat*ps)参数:pid操作或线程ID,ps

48、状态存储地址 返回:无 获取当前正在运行的线程或操作的状态,Xilkernel功能-线程管理(17,Xilkernel功能-线程管理,(20)int xmk_add_static_thread(void*(*start_routine)(void*),int sched_priority)参数:start_routine线程函数,sched_priority优先级 返回:0成功,-1未成功 该函数将线程加入到启动或静态线程列表中,这个 函数要在xilkernel_main()函数之前调用(21)int yield(void)迫使处理器运行下一个准备好的线程或操作,当前 线程放回任务准备完毕队列

49、,等待再次获取时间片 运 行,Xilkernel功能-线程管理(20),Xilkernel功能-信号量,Xilkernel支持核分配POSIX信号量,信号量能用于同步。POSIX信号量能计算信号量,它也能计算低于0的信号量(表示阻塞的进程)。Xilkernel也提供一些接口用于命名的信号量。在系统初始化时,能配置核内所分配的信号量的数量和信号量等待队列的长度。信号量模块是可选的,在初始化时可以配置成输入或输出。如果使用消息队列,必须包含该模块。,Xilkernel功能-信号量 Xilkernel支,Xilkernel功能-信号量,(1)int sem_init(sem_t*sem,int ps

50、hared,unsigned value)参数:sem信号量ID,pshared共享状态,value初始值 返回:0成功,-1未成功。初始化一个信号量,并初始化信号量的值。(2)int sem_destroy(sem_t*sem)参数:sem信号量ID 返回:0成功,-1未成功 释放一个信号量资源(3)int sem_getvalue(sem_t*sem,int*value)参数:sem信号量ID,value获取值地址 返回:0成功,-1未成功 获取信号量当前值,Xilkernel功能-信号量(1)int sem_,Xilkernel功能-信号量,(4)int sem_wait(sem_t*s

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号