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

上传人(卖家):晟晟文业 文档编号:4524708 上传时间:2022-12-16 格式: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页
点击查看更多>>
资源描述

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

2、件实体,通过它用户应用程序可以与标准C和Math库,LibXil库,Xilkernel或独立运行的操作系统相接。标准C库由newlib和libc组成,该库包含了标准C的函数,例如,stdio,stdlib,string例程。数学库是newlib数学库的扩展,提供了标准的数学函数。LibXil库由下面构成:1)LibXil Driver-Xilinx的设备驱动程序;2)LibXil MFS-Xilinx的存储文件系统(Memory File System,MFS);3)LibXil Flash-并行Flash编程库;4)LibXil lsf-串行Flash编程库;Xilinx提供独立板级支持包(

3、Board Support Package,BSP,后来Xilinx称为Standard平台)和Xilkernel。图图8.1 XMK结构结构用户应用程序用户应用程序XilkernelXilFlashXil MFSXil lsf独立独立BSPXilinx驱动驱动C,Math和和GCC库库 用户的应用程序通过不同的方法和XMK的不同组成部分进行接口。除了一些交互外,库之间是独立的。比如,Xilkernel使用BSP。BSP和Xilinx驱动构成了对底层硬件的抽象。XMK的库和OS依赖于标准的C库组成部分。数学库libm.a可以用来和用户的应用程序连接。BSP是单线程库。BSP提供对硬件的小的接口

4、。向应用程序提供所要求的最少的功能。BSP提供的一些典型的函数包括:(1)设置中断 (2)系统异常 (3)配置缓存 (4)其它硬件指定的功能。LibXil是指设备驱动程序,在软件平台中被包含用来向系统中的外设提供接口。这些驱动伴随EDK提供,并且被Libgen配置。后面详细介绍设备驱动的概念和在软件平台中适配的方法。Xilkernel是一个简单的嵌入式处理器的核,能根据系统进行定制。Xilkernel有嵌入式核的那些关键的特征:(1)多任务;(2)优先级驱动的抢先调度;(3)进程间通信;(4)同步和中断处理。Xilkernel是一个小的,模块化的,用户定制,能用在不同的系统配置环境。应用程序能

5、以不同模式,静态的和Xilkernel连接形成单独的可执行文件。LibXil MFS提供简单的存储文件系统,使得很容易通过使用输入-输出文件来访问数据。这个系统通过改变安装区域的源文件,很容易配置满足工程要求。LibXil Flash:提供对并行Flash的访问,这些Flash与普通的Flash接口一致。支持Intel和AMD的CFI(Common Flash Interface)芯片。LibXil lsf是一个系统内Flash库。支持Xilinx系统内Flash和外部的串行Flash(Atmel的AT45XXXD,Intel的S33和ST的M25PXX)。该库使得高层软件能和串行Flash通

6、信。EDK库和设备驱动提供标准C库函数和访问外设的函数。EDK库由Libgen根据MSS文件为每个工程自动配置。这些库和include文件保存在当前工程lib和include目录下。mb-gcc的选项-l和-L用来将这些目录添加到库搜索路径中。该库为MicroBlaze和PowerPC处理器提供了标准的C函数。可以根据下面路径下的这些标准C函数找到头文件。/gnu/include 其中:为EDK的安装路径;为powerpc-eabi或microblaze;为sol,nt,lin;为powerpc-eabi或microblaze-xilinx-elf;Lib.c目录和函数有:_ansi,fast

7、math.h,machine/,reent.h,stdlib.h,utime.h,_syslist.h,fcnt1.h,malloc.h,regdef.h,string.h,utmp.h,ar.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 程

8、序访问标准的C库函数,必须使用如下方式编译:1)mb-gcc(对MicroBlaze处理器);2)powerpc-eabi-gcc(对PowerPC处理器),访问libm数学函数,指定lm选项;Xilinx的C库为MicroBlaze处理器包含下面的目标文件:1)_exception_handler.o,_interrupt_handler.o,_program_clean.o,_program_init.o 2)默认情况下提供异常和中断句柄。libxil.a被自动包含。EDK库包含标准C函数用于I/O,比如printf和scanf。这些函数代码太大,不适应嵌入式处理器的应用。这些函数的原型在

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

10、似,但代码 更小,不支持浮点数)MicroBlaze处理器和PowerPC处理器C库支持标准的存储器管理函数,比如malloc(),calloc(),free()。通过使用堆来动态的分配存储器。堆指针从低向高增加(运行时不能增加)。分配堆至少128字节,观察函数返回值以确定正确的分配堆。对所有处理器可以使用libgcc.a库来用软件实现整数和浮点算术运算。当硬件不支持使用指令的算术运算原语时,编译器为所有的处理器插入对这些例程的调用。默认情况下,整数乘法通过使用库函数例程_mulsi3实现(软件)。如果编译器mb-gcc选择-mno-xl-soft-mul时,整数乘法可以使用硬件实现。整数除法

11、和求模操作通过使用库函数例程_divsi3和_modsi3实现(软件)。可以定制使用硬件除法器来实现除法指令。双精度乘法,除法和求模函数使用库函数_muldi3,_divdi3,moddi3实现。无符号的这些操作相对于有符号的操作就是其前缀为_u,而不是_。所有的浮点的加、减、乘、除和转换操作使用C库里的软件函数实现。板级支持包BSP是软件模块的最底层,用来访问处理器指定的功能。当应用程序直接访问板/处理器使用独立的BSP,BSP在操作系统层下面。当系统使用MicroBlaze处理器,并且没有使用OS时,Libgen自动在libxil.a工程库中建立独立的BSP。MicroBlaze处理器BS

12、P的函数类型主要有:中断处理;异常处理;指令缓存处理;数据缓存处理;FSL接口宏;FSL宏标志;pseudo-asm宏;PVR访问例程和宏;文件处理;错误码。使用中断处理函数,必须在源文件中包含头文件 mb_interface.h。MicroBlaze的中断管理函数有:void microblaze_enable_interrupts(void)void microblaze_disable_interrupts(void)void microblaze_register_handle(XInterruptHandler Handler,void *DataPtr)这个功能在MicroBlaz

13、e3.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)使用指令缓存函数,必须在源文件中包含头文件mb_in

14、terface.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。MicroBlaze的数据缓存处理函数有:(1)void microblaze_enable_dcache(void)使能Microblaze处理器的数据缓存 (2)void microblaze

15、_disable_dcache(void)禁止Microblaze处理器的数据缓存 (3)void microblaze_flush_dcache()刷新整个数据缓存,当使用回写缓存时,使用这个函数 (4)void microblaze_flush_dcache_range(unsigned int cache_addr,unsigned int cache_len)刷新指定的数据缓存的范围 (5)void microblaze_invalidate_dcache()使数据缓存无效 (6)void microblaze_flush_invalidate_range(unsigned int c

16、ache_addr,unsigned int cache_len)使指定范围的数据缓存无效 下面给出初始化指令和数据缓存的一段代码:1初始化指令Cache microblaze_invalidate_icache();microblaze_enable_icache();2初始化数据DCache microblaze_invalidate_dcache();microblaze_enable_dcache();3在程序的结尾,应该使用下面的代码对缓存进行恢复操作。#if XPAR_MICROBLAZE_DCACHE_USE_WRITEBACK=0 microblaze_invalidate_d

17、cache();#endif microblaze_disable_dcache();/*Clean up ICache*/microblaze_invalidate_icache();microblaze_disable_icache();BSP提供了FSL接口宏,用于访问通过FSL连接的硬件加速器。FSL接口宏主要包括:(1)getfslx(val,id,flags)在Microblaze的输入FSL上,执行得到功能。指令的语义由FSL 的宏flag确定;(2)putfslx(val,id,flags)在Microblaze的输出FSL上,执行输出功能。指令的语义由FSL的宏flag确定;

18、(3)tgetfslx(val,id,flags)在Microblaze的输入FSL上,测试得到功能。指令的语义由FSL的宏flag确定;(4)tputfslx(val,id,flags)在Microblaze的输出FSL上,测试输出功能。指令的语义由FSL的宏flag确定;(5)getdfslx(val,id,flags)在Microblaze的输入FSL上,执行得到功能。指令的语义由FSL的宏flag确定;(6)putdfslx(val,id,flags)在Microblaze的输出FSL上,执行输出功能。指令的语义由FSL的宏flag确定;(7)tgetdfslx(val,id,flag

19、s)在Microblaze的输入FSL上,测试得到功能。指令的语义由FSL的宏flag确定;(8)tputdfslx(val,id,flags)在Microblaze的输出FSL上,测试输出功能。指令的语义由FSL的宏flag确定;(9)fsl_isinvalid(invalid)测试最后的FSL操作返回为有效数据;(10)fsl_iserror(error)检查最后的FSL操作设置一个错误标志;FSL的宏标志包含:FSL_DEFAULT,FSL_NONBLOCKING,FSL_EXCEPTION,FSL_CONTROL,FSL_ATOMIC,FSL_NONBLOCKING_EXCEPTION

20、,FSL_NONBL OCKING_ATOMIC,FSL_EXCEPTION_CONTROL,FSL_EXCEPTION_ATOMIC,FSL_CONTROL_ATOMIC,FSL_NONBLOCKING_EXCEPTION_CONTROL,FSL_NONBLOCKING_EXCEPTION_ATOMIC,FSL_EXCEPTION_CONTROL_ATOMIC,FSL_NONBLOCKING_EXCEPTION_CONTROL_ATOMIC BSP提供了访问MicroBlaze不同寄存器的宏,为了使用这些宏,必须在源文件中包含mb_interface.h。这些宏主要有:(1)mggpr(rn

21、):从通用寄存器rn中返回值;(2)mfmsr():从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;MicroBlaze提供了可配置

22、的处理器版本寄存器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)文件处理的函数有:int fcnt1(int fd,int cmd,long arg)该函数通过cmd命令对文件描述符fd进行操作。由于独立的BSP

23、不提供文件系统,这个函数只用来作为完整性。Xilinx硬件抽象层包含下面:类型(xil_types);寄存器IO(xil_io);异常(xil_exception);缓存(xil_cache);断言(xil_assert);外部头文件;测试存储器(xil_testmem);测试寄存器(xil_testio);测试缓存(xil_testcache)。由于API函数封装了这些底层的硬件抽象层操作,对于程序设计来说,很少直接使用这些硬件抽象层操作,所以对该部分不进行进一步的介绍,如果需要的话,参考Xilinx的库参考手册。XilKernel核是一个小的、健壮的和模块化的核:1)允许定制,使得设计者可

24、以根据大小和功能对核进行裁减;2)在嵌入式核(kernel)内,使用POSIX(Portable Operating System Interface,可移植操作系统接口)API支持核(core)的 特征 3)支持MicroBlaze、PowerPC405和PowerPC440处理器 XilKernel的进程间通信IPC服务用来实现高层服务(比如网络,视频和音频),并且使用这些服务来运行程序。下面给出了那些影响在下一个工程中使用核的决定性因素:1)典型的嵌入式控制应用由多个任务组成,这些任务需要按照一个特定的序列或安排来执行。随着所涉及的控制任务的增加,人工组织子任务和分时享用所要求的工作变得

25、十分困难。当复杂度增加时,这样一个程序的响应能力和性能大大降低。2)分解这些任务作为单独的应用程序,并且在一个操作系统上实现这些应用程序会变得更加直观。3)一个核允许在一个抽象层上编写代码,而不是在微控制器级独立代码上编写代码。4)很多普通常规的应用程序都依赖于操作系统的服务,比如文件系统,时间管理等。5)Xilkernel是一个小的库,它提供了这些必须的服务。移植或使用通用和开放的源码库(比如图像或网络协议)也要求某些形式的OS服务。1、通过裁减功能,使其对一个系统具有高度的可扩展性 2、通过XPS在很短时间内完成核的配置和使用 3、核的健壮性:通过参数有效性检查保护系统调用,并且正确 的返

26、回可移植性操作系统接口POSIX错误代码 4、POSIX API目标是嵌入式核,包括:轮循或严格优先级调度的线程 同步化服务-信号量和互斥锁 IPC服务-消息队列和共享存储器 动态缓冲池存储器分配 软件定时器 用户级中断处理5、通过核的静态线程的创建和启动6、对核的系统调用接口7、为MicroBlaze处理器的异常处理8、通过可用的MicroBlaze处理器MMU的存储器保护Xilkernel模块用户应用程序用户应用程序Xilkernel系统调用句柄系统调用句柄调度程序调度程序中断和异常句柄中断和异常句柄软件定时器软件定时器线程管理线程管理信号量信号量消息队列消息队列共享存储器共享存储器动态缓

27、冲区管理动态缓冲区管理用户级中断处理用户级中断处理图图8.2 Xilkernel结构结构 Xilkernel由核函数的形式构成,这将导致一个简单的核连接模型。为了建立Xilkernel,必须在软件平台中包含Xilkernel,合理的配置它,并且运行Libgen来产生Xilkernel库。所设计的应用程序独立的开发或者作为XPS里的独立的应用文件工程。当开发完应用程序后,将Xilkernel与其进行连接,然后建立最终的核映像文件。Xilkernel核产生后的文件为libxilkernel.a。在在SW平台上包含和平台上包含和配置配置Xilkernel用用Libgen产生库产生库libxilker

28、nel.a应用程序源文件应用程序源文件包含在包含在SW工程中设工程中设计编译参数计编译参数创建工程创建工程build project可执行的核映像文件可执行的核映像文件连接连接图图8.3 Xilkernel开发流程开发流程 Xilkernel内部也支持类似更强大的传统的OS的连接和独立的可执行的方法。传统的操作系统由独立的映像文件,每个运行在核上的应用程序作为独立的文件。因此,Xilinx推荐使用更简单和更简洁的库连接模式。XPS支持这种模式,更容易使用。它对于调式,下载和启动都非常方便。对于有独立运行的这种高要求情况下,要求使用独立可执行模式。下面给出了使用核连接模式的应用程序开发步骤:1、

29、应用程序应包含xmk.h文件作为首要的文件#include“xmk.h”2、所设计的应用软件工程与libxil.a连接。该库包含真实的核函数。应用程序和该库连接将形成最终的核和应用程序映像文件。3、Xilkernel负责MicroBlaze和PowerPC处理器第一级中断和异常处理。因此,设计人员不能直接处理中断。而在用户级上处理异常和中断;4、使用最终的与核连接的软件应用工程的连接脚本特性来控制核的存储器映射,可以使用自动的脚本产生来帮助设计。5、应用程序必须提供main(),这是核映像文件中的执行的开始点。在main()里,可以做需要的初始化和设置。核保持未启动和休眠状态,在应用程序设置完

30、成后,如果想启动核,调用xilkernel_main()来启动核,使能中断,将控制转移给应用程序。在调用xilkernel_main()以前,必须使能系统级特性。这些是典型的机器状态特性,比如缓存的使能,硬件异常的使能,必须总是打开,即使从一个应用程序到另一个应用程序进行上下文切换(context switch)。在应用程序的线程中,不允许随便改变机器状态。如果在修改机器状态时,产生了上下文的切换,将导致随后的线程执行时,没有使能状态;所以必须在修改状态以前,锁定上下文切换和中断。Xilkernel内的执行单位(unit)称为进程上下文(process context)。在进程上下文级上进行调

31、度。这没有线程群的概念,这些群连在一起构成传统上的进程。对于资源来说,所有的线程是平等的。POSIX 线程API是最基本的用户可见到进程上下文的接口。这也提供了一些额外的其它的接口,它不是POSIX的一部分。使用线程标识符来操作线程。使用进程标识符pid_t来操作标识最基本的进程上下文。Xilkernel支持优先级驱动,时间片抢先调度(SCHED_PRIO)或者简单的轮循(SCHED_RR)调度。这是全局调度策略而不能根据每个线程修改。在产生核时必须被静态配置。在SCHED_RR,有一个简单的准备队列和每个进程上下文在一个可配置的时间片执行,当超出时间片时,就执行队列的下一个进程上下文。在SC

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

33、lkernel支持最基本的POSIX线程API。线程的创建和操作是以标准POSIX符号来实现的。线程使用唯一的pthread_t标号来标识。系统中所创建的进程都有一个核封装,当线程结束的时候,将控制权交给核封装。因此在线程代码的末尾不需要一个指定的退出函数。来自块开始符号BSS存储器池(基于系统中的最大线程静态分配)代表线程自动的分配线程堆栈。也可以为每一个去创建的线程动态分配定制的存储器作为堆栈。整个线程模块是可选的,可以配置成输入或输出来作为软件规范的一部分。(1)int pthread_create(pthread_t thread,pthread_attr_t*att,void*(*s

34、tart_func)(void*),void*param)创建线程并执行 参数:thread是存储线程ID的地址,attr存储线程属性结 构体的地址,start_func线程函数名,param线程函 数参数指针。返回:0创建成功,-1线程ID无效,EINVAL无效属性,EAGAIN资源不足。(2)void pthread_exit(void*value_ptr)参数:线程返回值的指针 结束一个线程,但这个函数并不是必须的。需要用到返 回值时才使用。(3)nt pthread_join(pthread_t thread,void*value_ptr)参数:thread线程ID,value_ptr

35、线程返回值地址指针 返回:0成功,ESRCH无效线程,EINVAL线程返回值 已经被使用停止当前线程等待目标线程执行完成 并返回值。(4)pthread_t pthread_self(void)返回:本线程ID (5)int pthread_detach(pthread_t target)返回:0成功,ESRCH线程未创建回收线程存储资源,但并不会结束线程 (6)int pthread_equal(pthread_t t1,pthread_t t2)参数:t1和t2两个待比较线程的ID 返回:1两线程是同一线程,0其它情况 (7)int pthread_getschedparam(pthrea

36、d_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线程无效,EINVAL调度参数无 效 函数设置个

37、别线程的调度策略。(9)int pthread_attr_init(pthread_attr_t*attr)参数:线程属性指针 返回:0成功,1未成功,EINVAL属性无效 按照默认设置初始化线程属性对象attr (10)int pthread_attr_destroy(pthread_attr_t*attr)参数:线程属性指针 返回:0成功,EINVAL错误 函数销毁线程指针对象,设置成未定义值。(11)int pthread_attr_setdetachstate(pthread_attr_t*attr,int dstate)参数:attr属性结构体,dstate要设置的状态 返回:0成功

38、,EINVAL无效参数 设置线程状态 (12)int pthread_attr_getdetachstate(pthread_attr_t*attr,int *dstate)参数:attr属性结构体,dstate获取的状态地址 返回:0成功,EINVAL无效参数 获取线程状态:PTHREAD_CREATE_DETACHED 或者PTHREAD_CREATE_JOINABLE (13)int pthread_attr_setschedparam(pthread_attr_t*attr,struct sched_param*schedpar)参数:attr属性结构体,schedpar调度参数存储地

39、址 返回:0成功,EINVAL无效参数,ENOTSUP无效调 度参数 设置线程优先级,sched_param在sched.h文件中定义 (14)int pthread_attr_getschedparam(pthread_attr_t*attr,struct sched_param*schedpar)参数:attr属性结构体,schedpar线程调度参数指针 返回:0成功,EINVAL无效参数 获取线程优先级。(15)int pthread_attr_setstack(const pthread_attr_t*attr,_ void*stackaddr,size_t stacksize)参数:

40、attr属性结构体,stacksize堆栈地址 返回:0成功,EINVAL堆栈设置不当 设置线程堆栈 (16)int pthread_attr_getstack(const pthread_attr_t*attr,void*stackaddr,size_t*stacksize)参数:attr属性结构体,stackaddr堆栈地址指针,stacksize堆栈空间以字节为单位 返回:0成功,EINVAL无效属性 获取线程的堆栈信息 (17)pid_t get_currentPID(void)返回:当前正在运行的线程或操作的ID (18)int kill(pid_tpid)参数:pid线程或操作ID

41、 返回:0成功,-1未成功 终止指定线程或操作 (19)int process_status(pid_t pid,p_stat*ps)参数:pid操作或线程ID,ps状态存储地址 返回:无 获取当前正在运行的线程或操作的状态 (20)int xmk_add_static_thread(void*(*start_routine)(void*),int sched_priority)参数:start_routine线程函数,sched_priority优先级 返回:0成功,-1未成功 该函数将线程加入到启动或静态线程列表中,这个 函数要在xilkernel_main()函数之前调用 (21)int

42、 yield(void)迫使处理器运行下一个准备好的线程或操作,当前 线程放回任务准备完毕队列,等待再次获取时间片 运 行 Xilkernel支持核分配POSIX信号量,信号量能用于同步。POSIX信号量能计算信号量,它也能计算低于0的信号量(表示阻塞的进程)。Xilkernel也提供一些接口用于命名的信号量。在系统初始化时,能配置核内所分配的信号量的数量和信号量等待队列的长度。信号量模块是可选的,在初始化时可以配置成输入或输出。如果使用消息队列,必须包含该模块。(1)int sem_init(sem_t*sem,int pshared,unsigned value)参数:sem信号量ID,p

43、shared共享状态,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未成功 获取信号量当前值 (4)int sem_wait(sem_t*sem)参数:sem信号量ID 返回:0成功,-1未成功 等待信号量的值大于0,并将信号量值减1。执行对信 号量的锁操作 (5)int sem_trywa

44、it(sem_t*sem)参数:sem信号量ID 返回:0成功,-1未成功 功能与sem_trywait()函数相同,但不阻塞进程。(6)int sem_timedwait(sem_t*sem,unsigned_ms)参数:sem信号量ID,ms定时器时间 返回:0成功,-1未成功 功能与sem_trywait()函数相同,等待信号量大于0过程 中,通过定时器超时来停止阻塞进程。(7)sem_t*sem_open(const char*name,int oflag,.)参数:name信号量对象的字符串名,oflag控制信号量 创建的标识 返回:创建的或已存在的信号量ID创建一个信号量 (8)i

45、nt sem_close(sem_t*sem)参数:sem信号量ID 返回:0成功,-1未成功 关闭信号量 (9)int sem_post(sem_t*sem)参数:sem信号量ID 返回:0成功,-1未成功 增加信号量的值,执行该函数为制定信号量的值加1 (10)int sem_unlink(const char*name)参数:name信号量名 返回:0成功,-1未成功 移除信号量 Xilkernel支持核分配X/Open系统接口XSI消息队列。XSI是POSIX下可选的接口集。消息队列可以用于一个IPC机制。消息队列可以容纳任意大小的消息。在初始化时,必须合理的分配存储空间。在核内所分配

46、的消息队列结构的数量和消息队列的长度也能在系统初始化时配置。该模块依赖于信号量模块,在系统中有动态存储器分配模块。如果需要的话,这里有一个更强大的消息队列功能可以配置。当选择扩展的消息队列接口时,malloc和free被用来分配和释放消息空间。因此,任意大小的消息能被传送,而不需要确认缓冲存储器分配API能处理任意大小的请求。(1)int msgget(key_t key,int msgflg)参数:key消息队列的队列标识,msgflg消息队列创 建选项 返回:唯一且非负的消息队列ID 创建消息队列 (2)int msgctl(int msqid,int cmd,struct msqid_d

47、s*buf)参数:msqid消息队列ID,cmd命令,buf数据指针 返回:0成功,-1未成功 以命令控制消息队列 (3)int msgsnd(int msqid,const void*msgp,size_t msgsz,int msgflg)参数:msqid消息队列ID,magp消息缓存指针,msgsz消息大小,msgflg消息发送选项 返回:0成功,-1未成功 向消息队列发送一个消息 (4)ssize_t msgrcv(int msqid,void*msgp,size_t nbytes,long msgtyp,int msgflg)参数:msqid消息队列ID,msgp复制接收的消息存 放

48、地址,nbytes指定接收消息的缓存大小,msgtyp不支持,msgflg控制接收消息操作 返回:接收到的字节数,-1不成功 从消息队列接收一个消息 Xilkernel支持核分配的XSI共享存储器。XSI是X/Open系统接口,是POSIX下可选的接口集。共享存储器是普通的,低延迟的IPC机制。在运行时,所要求的共享存储器块必须被标识,并且在系统配置时指明。由这个规范,缓冲存储器被分配到每一个共享存储器区域。目前,在运行时的共享存储器块不能被动态的分配。(1)int shmget(key_t key,size_t size,int shmflg)参数:key共享内存标识,size共享内存大小,

49、shmflg创建选项 返回:非负唯一的共享内存ID,-1未成功 获取共享内存的ID (2)int shmctl(int shmid,int cmd,struct shmid_ds*buf)参数:shmid共享内存ID,cmd命令,buf状态接收 缓存 返回:0成功,-1未成功 实现对共享内存的控制操作 (3)void*shmat(int shmid,const void*shmaddr,int flag)参数:shmid共享内存ID,shmaddr未用,flag设置共 享内存附属选项 返回:共享内存的起始地址,NULL未成功 把共享内存映射到调用该函数的地址空间,方便进程 对其访问 (4)in

50、t shm_dt(void*shmaddr)参数:shmaddr共享内存地址 返回:0成功,-1未成功 解除进程对共享内存的映射 Xilkernel提供支持用于核分配的POSIX线程互斥锁。这个同步机制和pthread_ API一起使用。在系统说明时,就能配置系统中互斥锁的数量和互斥锁等待队列的长度。支持:1)PTHREAD_MUTEX_DEFALUT 2)PTHREAD_MUTEX_RECURSIVE 类型的互斥锁。互斥锁模块是可选的,在系统说明时,可以配置成输入或输出。(1)int pthread_mutex_init(pthread_mutex_t*mutex,const pthread

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

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(第八章Xilinx操作系统及库课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|