Xilinx实际操作系统和库_第1页
Xilinx实际操作系统和库_第2页
Xilinx实际操作系统和库_第3页
Xilinx实际操作系统和库_第4页
Xilinx实际操作系统和库_第5页
已阅读5页,还剩137页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Xilinx实际操作系统和库内容概述

本章主要介绍操作系统及板级支持包。该章内容主要

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

Xilinx的微核(XilinxMicrokernel,XMK)包含三个不同的软件实体,通过它用户应用程序可以与标准C和Math库,LibXil库,Xilkernel或独立运行的操作系统相接。标准C库由newlib和libc组成,该库包含了标准C的函数,例如,stdio,stdlib,string例程。数学库是newlib数学库的扩展,提供了标准的数学函数。Xilinx的微核

LibXil库由下面构成:

1)LibXilDriver-Xilinx的设备驱动程序;

2)LibXilMFS-Xilinx的存储文件系统(Memory,

MFS);

3)LibXilFlash-并行Flash编程库;

4)LibXillsf-串行Flash编程库;

Xilinx提供独立板级支持包(BoardSupportPackage,BSP,后来Xilinx称为Standard平台)和Xilkernel。Xilinx的微核结构图8.1XMK结构用户应用程序XilkernelXilFlashXilMFSXillsf独立BSPXilinx驱动C,Math和GCC库Xilinx的微核

用户的应用程序通过不同的方法和XMK的不同组成部分进行接口。除了一些交互外,库之间是独立的。比如,Xilkernel使用BSP。BSP和Xilinx驱动构成了对底层硬件的抽象。

XMK的库和OS依赖于标准的C库组成部分。数学库libm.a可以用来和用户的应用程序连接。Xilinx的微核

-板级支持包BSP

BSP是单线程库。BSP提供对硬件的小的接口。向应用程序提供所要求的最少的功能。

BSP提供的一些典型的函数包括:

(1)设置中断(2)系统异常(3)配置缓存(4)其它硬件指定的功能。Xilinx的微核

-LibXil驱动程序

LibXil是指设备驱动程序,在软件平台中被包含用来向系统中的外设提供接口。这些驱动伴随EDK提供,并且被Libgen配置。后面详细介绍设备驱动的概念和在软件平台中适配的方法。Xilinx的微核

-Xilkernel

Xilkernel是一个简单的嵌入式处理器的核,能根据系统进行定制。

Xilkernel有嵌入式核的那些关键的特征:

(1)多任务;

(2)优先级驱动的抢先调度;

(3)进程间通信;

(4)同步和中断处理。

Xilinx的微核

-Xilkernel

Xilkernel是一个小的,模块化的,用户定制,能用在不同的系统配置环境。应用程序能以不同模式,静态的和Xilkernel连接形成单独的可执行文件。Xilinx的微核

-LibXilMFSLibXilMFS提供简单的存储文件系统,使得很容易通过使用输入-输出文件来访问数据。这个系统通过改变安装区域的源文件,很容易配置满足工程要求。Xilinx的微核

-LibXilFlash

LibXilFlash:提供对并行Flash的访问,这些Flash与普通的Flash接口一致。支持Intel和AMD的CFI(CommonFlashInterface)芯片。Xilinx的微核

-LibXillsfLibXillsf是一个系统内Flash库。支持Xilinx系统内Flash和外部的串行Flash(Atmel的AT45XXXD,Intel的S33和ST的M25PXX)。该库使得高层软件能和串行Flash通信。标准C库

EDK库和设备驱动提供标准C库函数和访问外设的函数。

EDK库由Libgen根据MSS文件为每个工程自动配置。这些库和include文件保存在当前工程lib和include目录下。

mb-gcc的选项-l和-L用来将这些目录添加到库搜索路径中。标准的C库(lib.a)

该库为MicroBlaze和PowerPC处理器提供了标准的C函数。可以根据下面路径下的这些标准C函数找到头文件。

<XILINX_EDK>/gnu/<processor>/<platform>/<processor-lib>/include

其中:<XILINX_EDK>为EDK的安装路径;

<processor>为powerpc-eabi或microblaze;

<platform>为sol,nt,lin;

<processor-lib>为powerpc-eabi或microblaze-xilinx-elf;标准的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.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)

程序访问标准的C库函数,必须使用如下方式编译:

1)mb-gcc<Cfile>(对MicroBlaze处理器);

2)powerpc-eabi-gcc<Cfile>(对PowerPC处理器),访问libm数学函数,指定lm选项;XilinxC库(libxil.a)Xilinx的C库为MicroBlaze处理器包含下面的目标文件:

1)_exception_handler.o,_interrupt_handler.o,_program_clean.o,_program_init.o2)默认情况下提供异常和中断句柄。

libxil.a被自动包含。输入/输出函数

EDK库包含标准C函数用于I/O,比如printf和scanf。这些函数代码太大,不适应嵌入式处理器的应用。这些函数的原型在stdio.h。注意:C标准I/O例程比如printf,scanf,vfprintf在默认情况下是行缓冲的。将其变成无缓冲格式的,必须调用setvbuf。输入/输出函数

比如:

setvbuf(stdout,NULL,_IONBF,0);这些输入/输出例程要求在新一行用CR和LF结束。除了标准的C函数,EDK处理器库提供了下面的小的I/O函数:

1)voidprint(char*);(打印字符串到MSS文件中指定的标准输出的外设)

2)voidputnum(int);(转换整数到16进制的字符串,并打印字符串到外设)

3)voidxil_printf(const*charctl1,…)(与printf函数类似,但代码更小,不支持浮点数)存储器管理函数MicroBlaze处理器和PowerPC处理器C库支持标准的存储器管理函数,比如malloc(),calloc(),free()。通过使用堆来动态的分配存储器。堆指针从低向高增加(运行时不能增加)。分配堆至少128字节,观察函数返回值以确定正确的分配堆。算术操作

对所有处理器可以使用libgcc.a库来用软件实现整数和浮点算术运算。当硬件不支持使用指令的算术运算原语时,编译器为所有的处理器插入对这些例程的调用。MicroBlaze处理器

-整数算术运算

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

-浮点算术运算

所有的浮点的加、减、乘、除和转换操作使用C库里的软件函数实现。板级支持包

板级支持包BSP是软件模块的最底层,用来访问处理器指定的功能。当应用程序直接访问板/处理器使用独立的BSP,BSP在操作系统层下面。MicroBlaze处理器BSP

当系统使用MicroBlaze处理器,并且没有使用OS时,Libgen自动在libxil.a工程库中建立独立的BSP。

MicroBlaze处理器BSP的函数类型主要有:中断处理;异常处理;指令缓存处理;数据缓存处理;

FSL接口宏;

FSL宏标志;

pseudo-asm宏;

PVR访问例程和宏;文件处理;错误码。中断处理

使用中断处理函数,必须在源文件中包含头文件mb_interface.h。MicroBlaze的中断管理函数有:

voidmicroblaze_enable_interrupts(void)voidmicroblaze_disable_interrupts(void)voidmicroblaze_register_handle(XInterruptHandlerHandler,void*DataPtr)异常处理

这个功能在MicroBlaze3.0以前不可用。使用异常处理函数,必须在源文件中包含头文件mb_interface.h。当在MHS中正确的配置了硬件异常处理,这些函数才能正常运行。MicroBlaze的异常处理函数有:

voidmicroblaze_disable_exceptions(void)voidmicroblaze_enable_exceptions(void)voidmicroblaze_register_exception_handle(Xuint8Exceptionld,XExceptionHandlerHandler,void*DataPtr)指令缓存处理

使用指令缓存函数,必须在源文件中包含头文件mb_interface.h。MicroBlaze的指令缓存处理函数有:voidmicroblaze_enable_icache(void)voidmicroblaze_disable_icache(void)voidmicroblaze_init_icache_range(intcache_addr,intcache_size)数据缓存处理

使用数据缓存函数,必须在源文件中包含头文件mb_interface.h。MicroBlaze的数据缓存处理函数有:

(1)voidmicroblaze_enable_dcache(void)使能Microblaze处理器的数据缓存

(2)voidmicroblaze_disable_dcache(void)禁止Microblaze处理器的数据缓存

(3)voidmicroblaze_flush_dcache()刷新整个数据缓存,当使用回写缓存时,使用这个函数(4)voidmicroblaze_flush_dcache_range(unsignedintcache_addr,unsignedintcache_len)

刷新指定的数据缓存的范围数据缓存处理

(5)voidmicroblaze_invalidate_dcache()

使数据缓存无效(6)voidmicroblaze_flush_invalidate_range(unsignedintcache_addr,unsignedintcache_len)

使指定范围的数据缓存无效下面给出初始化指令和数据缓存的一段代码:

1.初始化指令Cachemicroblaze_invalidate_icache();microblaze_enable_icache();数据缓存处理2.初始化数据DCachemicroblaze_invalidate_dcache();microblaze_enable_dcache();3.在程序的结尾,应该使用下面的代码对缓存进行恢复操作。

#ifXPAR_MICROBLAZE_DCACHE_USE_WRITEBACK==0microblaze_invalidate_dcache();#endifmicroblaze_disable_dcache();/*CleanupICache*/microblaze_invalidate_icache();microblaze_disable_icache();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上,测试输出功能。指令的语义由FSL的宏flag确定;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)在Microblaze的输出FSL上,测试输出功能。指令的语义由FSL的宏flag确定;(9)fsl_isinvalid(invalid)测试最后的FSL操作返回为有效数据;(10)fsl_iserror(error)检查最后的FSL操作设置一个错误标志;FSL宏标志

FSL的宏标志包含:

FSL_DEFAULT,FSL_NONBLOCKING,FSL_EXCEPTION,

FSL_CONTROL,FSL_ATOMIC,

FSL_NONBLOCKING_EXCEPTION,FSL_NONBLOCKING_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_ATOMICpseudo-asm宏

BSP提供了访问MicroBlaze不同寄存器的宏,为了使用这些宏,必须在源文件中包含mb_interface.h。这些宏主要有:

(1)mggpr(rn):从通用寄存器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;PVR访问例程和宏MicroBlaze提供了可配置的处理器版本寄存器PVR。PVR的内容使用pvr_t数据结构获得,该数据结构是32位的数组,数组的每个字对应PVR寄存器。PVR字的数目由配置所决定。为了使用宏,必须在源文件中包含pvr.h头文件。访问PVR的方法:

1)使用microblaze_get_pvr()函数来填充PVR数据到pvr_t数据结构中;2)在随后的步骤中,可以使用PVR访问宏得到PVR的数据;PVR访问函数为:

intmicroblaze_get_pvr(pvr_t*pvr)文件处理

文件处理的函数有:

intfcnt1(intfd,intcmd,longarg)

该函数通过cmd命令对文件描述符fd进行操作。由于独立的BSP不提供文件系统,这个函数只用来作为完整性。Xilinx硬件抽象层

Xilinx硬件抽象层包含下面:类型(xil_types);寄存器IO(xil_io);异常(xil_exception);缓存(xil_cache);断言(xil_assert);外部头文件;测试存储器(xil_testmem);测试寄存器(xil_testio);测试缓存(xil_testcache)。由于API函数封装了这些底层的硬件抽象层操作,对于程序设计来说,很少直接使用这些硬件抽象层操作,所以对该部分不进行进一步的介绍,如果需要的话,参考Xilinx的库参考手册。Xilkernel核

XilKernel核是一个小的、健壮的和模块化的核:

1)允许定制,使得设计者可以根据大小和功能对核进行裁减;

2)在嵌入式核(kernel)内,使用POSIX(PortableOperatingSystemInterface,可移植操作系统接口)API支持核(core)的特征

3)支持MicroBlaze、PowerPC405和PowerPC440处理器

XilKernel的进程间通信IPC服务用来实现高层服务(比如网络,视频和音频),并且使用这些服务来运行程序。Xilkernel核

下面给出了那些影响在下一个工程中使用核的决定性因素:

1)典型的嵌入式控制应用由多个任务组成,这些任务需要按照一个特定的序列或安排来执行。随着所涉及的控制任务的增加,人工组织子任务和分时享用所要求的工作变得十分困难。当复杂度增加时,这样一个程序的响应能力和性能大大降低。

2)分解这些任务作为单独的应用程序,并且在一个操作系统上实现这些应用程序会变得更加直观。Xilkernel核

3)一个核允许在一个抽象层上编写代码,而不是在微控制器级独立代码上编写代码。

4)很多普通常规的应用程序都依赖于操作系统的服务,比如文件系统,时间管理等。

5)Xilkernel是一个小的库,它提供了这些必须的服务。移植或使用通用和开放的源码库(比如图像或网络协议)也要求某些形式的OS服务。Xilkernel包含的关键特征1、通过裁减功能,使其对一个系统具有高度的可扩展性

2、通过XPS在很短时间内完成核的配置和使用

3、核的健壮性:通过参数有效性检查保护系统调用,并且正确的返回可移植性操作系统接口POSIX错误代码

4、POSIXAPI目标是嵌入式核,包括:轮循或严格优先级调度的线程同步化服务-信号量和互斥锁IPC服务-消息队列和共享存储器动态缓冲池存储器分配软件定时器用户级中断处理Xilkernel包含的关键特征5、通过核的静态线程的创建和启动6、对核的系统调用接口7、为MicroBlaze处理器的异常处理8、通过可用的MicroBlaze处理器MMU的存储器保护Xilkernel模块用户应用程序Xilkernel系统调用句柄调度程序中断和异常句柄软件定时器线程管理信号量消息队列共享存储器动态缓冲区管理用户级中断处理图8.2Xilkernel结构建立Xilkernel应用程序

Xilkernel由核函数的形式构成,这将导致一个简单的核连接模型。为了建立Xilkernel,必须在软件平台中包含Xilkernel,合理的配置它,并且运行Libgen来产生Xilkernel库。所设计的应用程序独立的开发或者作为XPS里的独立的应用文件工程。当开发完应用程序后,将Xilkernel与其进行连接,然后建立最终的核映像文件。Xilkernel核产生后的文件为libxilkernel.a。建立Xilkernel应用程序在SW平台上包含和配置Xilkernel用Libgen产生库libxilkernel.a应用程序源文件包含在SW工程中设计编译参数创建工程buildproject可执行的核映像文件连接图8.3Xilkernel开发流程建立Xilkernel应用程序Xilkernel内部也支持类似更强大的传统的OS的连接和独立的可执行的方法。传统的操作系统由独立的映像文件,每个运行在核上的应用程序作为独立的文件。因此,Xilinx推荐使用更简单和更简洁的库连接模式。XPS支持这种模式,更容易使用。它对于调式,下载和启动都非常方便。对于有独立运行的这种高要求情况下,要求使用独立可执行模式。下面给出了使用核连接模式的应用程序开发步骤:建立Xilkernel应用程序1、应用程序应包含xmk.h文件作为首要的文件

#include“xmk.h”2、所设计的应用软件工程与libxil.a连接。该库包含真实的核函数。应用程序和该库连接将形成最终的核和应用程序映像文件。

3、Xilkernel负责MicroBlaze和PowerPC处理器第一级中断和异常处理。因此,设计人员不能直接处理中断。而在用户级上处理异常和中断;

4、使用最终的与核连接的软件应用工程的连接脚本特性来控制核的存储器映射,可以使用自动的脚本产生来帮助设计。建立Xilkernel应用程序

5、应用程序必须提供main(),这是核映像文件中的执行的开始点。在main()里,可以做需要的初始化和设置。核保持未启动和休眠状态,在应用程序设置完成后,如果想启动核,调用xilkernel_main()来启动核,使能中断,将控制转移给应用程序。在调用xilkernel_main()以前,必须使能系统级特性。建立Xilkernel应用程序

这些是典型的机器状态特性,比如缓存的使能,硬件异常的使能,必须总是打开,即使从一个应用程序到另一个应用程序进行上下文切换(contextswitch)。在应用程序的线程中,不允许随便改变机器状态。如果在修改机器状态时,产生了上下文的切换,将导致随后的线程执行时,没有使能状态;所以必须在修改状态以前,锁定上下文切换和中断。Xilkernel处理模型

Xilkernel内的执行单位(unit)称为进程上下文(processcontext)。在进程上下文级上进行调度。这没有线程群的概念,这些群连在一起构成传统上的进程。对于资源来说,所有的线程是平等的。POSIX线程API是最基本的用户可见到进程上下文的接口。这也提供了一些额外的其它的接口,它不是POSIX的一部分。使用线程标识符来操作线程。使用进程标识符pid_t来操作标识最基本的进程上下文。Xilkernel调度模型

Xilkernel支持优先级驱动,时间片抢先调度(SCHED_PRIO)或者简单的轮循(SCHED_RR)调度。这是全局调度策略而不能根据每个线程修改。在产生核时必须被静态配置。在SCHED_RR,有一个简单的准备队列和每个进程上下文在一个可配置的时间片执行,当超出时间片时,就执行队列的下一个进程上下文。在SCHED_PRIO,有很多准备队列,它们有优先级,优先级0是系统内的最高优先级,值越高优先级越低。在同一优先级的任务,采用轮循和时间片进行调度。Xilkernel调度模型

对于上面的调度模型,准备队列的长度也可配置。如果在核中有等待队列(信号量,消息队列等),采用SCHED_PRIO模型时,被配置成优先级队列。否则,被配置成FIFO队列。Xilkernel调度模型

图6.4进程上下文状态PROC_NEW:一个新创建的进程PROC_READY:一个准备执行的进程PROC_RUN:正在运行的进程PROC_WAIT:由于资源被阻塞的进程PROC_DELAY:一个等待超时的进程PROC_TIMED_WAIT:一个由于资源被阻塞的进程,有一个相关的超时Xilkernel功能-线程管理

Xilkernel支持最基本的POSIX线程API。线程的创建和操作是以标准POSIX符号来实现的。线程使用唯一的pthread_t标号来标识。系统中所创建的进程都有一个核封装,当线程结束的时候,将控制权交给核封装。因此在线程代码的末尾不需要一个指定的退出函数。

Xilkernel功能-线程管理

来自块开始符号BSS存储器池(基于系统中的最大线程静态分配)代表线程自动的分配线程堆栈。也可以为每一个去创建的线程动态分配定制的存储器作为堆栈。整个线程模块是可选的,可以配置成输入或输出来作为软件规范的一部分。Xilkernel功能-线程管理

(1)intpthread_create(pthread_tthread,pthread_attr_t*att,void*(*start_func)(void*),void*param)

创建线程并执行参数:thread是存储线程ID的地址,attr存储线程属性结构体的地址,start_func线程函数名,param线程函数参数指针。返回:0创建成功,-1线程ID无效,EINVAL无效属性,

EAGAIN资源不足。(2)voidpthread_exit(void*value_ptr)

参数:线程返回值的指针结束一个线程,但这个函数并不是必须的。需要用到返回值时才使用。Xilkernel功能-线程管理

(3)ntpthread_join(pthread_tthread,void**value_ptr)

参数:thread线程ID,value_ptr线程返回值地址指针

返回:0成功,ESRCH无效线程,EINVAL线程返回值已经被使用停止当前线程等待目标线程执行完成并返回值。(4)pthread_tpthread_self(void)

返回:本线程IDXilkernel功能-线程管理

(5)intpthread_detach(pthread_ttarget)

返回:0成功,ESRCH线程未创建回收线程存储资源,但并不会结束线程(6)intpthread_equal(pthread_tt1,pthread_tt2)

参数:t1和t2两个待比较线程的ID

返回:1两线程是同一线程,0其它情况Xilkernel功能-线程管理

(7)intpthread_getschedparam(pthread_tthread,int*policy,structsched_param*param)

参数:thread线程ID,policy全局调度策略指针,param

调度策略结构体地址

返回:0成功,ESRCH线程无效,EINVAL调度参数无效函数返回个别线程的调度策略。(8)intpthread_setschedparam(pthread_tthread,intpolicy,conststructsched_param*param)

参数:thread线程ID,policy忽略,param调度策略结构体地址返回:0成功,ESRCH线程无效,EINVAL调度参数无效函数设置个别线程的调度策略。Xilkernel功能-线程管理

(9)intpthread_attr_init(pthread_attr_t*attr)

参数:线程属性指针返回:0成功,1未成功,EINVAL属性无效按照默认设置初始化线程属性对象attr

(10)intpthread_attr_destroy(pthread_attr_t*attr)

参数:线程属性指针返回:0成功,EINVAL错误函数销毁线程指针对象,设置成未定义值。Xilkernel功能-线程管理

(11)intpthread_attr_setdetachstate(pthread_attr_t*attr,intdstate)

参数:attr属性结构体,dstate要设置的状态返回:0成功,EINVAL无效参数设置线程状态(12)intpthread_attr_getdetachstate(pthread_attr_t*attr,int*dstate)

参数:attr属性结构体,dstate获取的状态地址返回:0成功,EINVAL无效参数获取线程状态:PTHREAD_CREATE_DETACHED

或者PTHREAD_CREATE_JOINABLEXilkernel功能-线程管理

(13)intpthread_attr_setschedparam(pthread_attr_t*attr,structsched_param*schedpar)

参数:attr属性结构体,schedpar调度参数存储地址返回:0成功,EINVAL无效参数,ENOTSUP无效调度参数设置线程优先级,sched_param在sched.h文件中定义(14)intpthread_attr_getschedparam(pthread_attr_t*attr,structsched_param*schedpar)

参数:attr属性结构体,schedpar线程调度参数指针返回:0成功,EINVAL无效参数获取线程优先级。Xilkernel功能-线程管理

(15)intpthread_attr_setstack(constpthread_attr_t*attr,_void*stackaddr,size_tstacksize)

参数:attr属性结构体,stacksize堆栈地址返回:0成功,EINVAL堆栈设置不当设置线程堆栈(16)intpthread_attr_getstack(constpthread_attr_t*attr,void**stackaddr,size_t*stacksize)

参数:attr属性结构体,stackaddr堆栈地址指针,

stacksize堆栈空间以字节为单位返回:0成功,EINVAL无效属性获取线程的堆栈信息Xilkernel功能-线程管理

(17)pid_tget_currentPID(void)

返回:当前正在运行的线程或操作的ID

(18)intkill(pid_tpid)

参数:pid线程或操作ID

返回:0成功,-1未成功终止指定线程或操作(19)intprocess_status(pid_tpid,p_stat*ps)

参数:pid操作或线程ID,ps状态存储地址返回:无获取当前正在运行的线程或操作的状态Xilkernel功能-线程管理

(20)int

xmk_add_static_thread(void*(*start_routine)(void*),intsched_priority)

参数:start_routine线程函数,sched_priority优先级返回:0成功,-1未成功该函数将线程加入到启动或静态线程列表中,这个函数要在xilkernel_main()函数之前调用(21)intyield(void)

迫使处理器运行下一个准备好的线程或操作,当前线程放回任务准备完毕队列,等待再次获取时间片运行Xilkernel功能-信号量

Xilkernel支持核分配POSIX信号量,信号量能用于同步。POSIX信号量能计算信号量,它也能计算低于0的信号量(表示阻塞的进程)。Xilkernel也提供一些接口用于命名的信号量。在系统初始化时,能配置核内所分配的信号量的数量和信号量等待队列的长度。信号量模块是可选的,在初始化时可以配置成输入或输出。如果使用消息队列,必须包含该模块。Xilkernel功能-信号量

(1)intsem_init(sem_t*sem,intpshared,unsignedvalue)

参数:sem信号量ID,pshared共享状态,value初始值返回:0成功,-1未成功。初始化一个信号量,并初始化信号量的值。

(2)intsem_destroy(sem_t*sem)参数:sem信号量ID

返回:0成功,-1未成功释放一个信号量资源

(3)intsem_getvalue(sem_t*sem,int*value)参数:sem信号量ID,value获取值地址返回:0成功,-1未成功获取信号量当前值Xilkernel功能-信号量

(4)intsem_wait(sem_t*sem)参数:sem信号量ID

返回:0成功,-1未成功等待信号量的值大于0,并将信号量值减1。执行对信号量的锁操作

(5)intsem_trywait(sem_t*sem)参数:sem信号量ID

返回:0成功,-1未成功功能与sem_trywait()函数相同,但不阻塞进程。Xilkernel功能-信号量

(6)intsem_timedwait(sem_t*sem,unsigned_ms)参数:sem信号量ID,ms定时器时间返回:0成功,-1未成功功能与sem_trywait()函数相同,等待信号量大于0过程中,通过定时器超时来停止阻塞进程。(7)sem_t*sem_open(constchar*name,intoflag,...)

参数:name信号量对象的字符串名,oflag控制信号量创建的标识返回:创建的或已存在的信号量ID创建一个信号量

(8)intsem_close(sem_t*sem)参数:sem信号量ID

返回:0成功,-1未成功关闭信号量Xilkernel功能-信号量

(9)intsem_post(sem_t*sem)参数:sem信号量ID

返回:0成功,-1未成功增加信号量的值,执行该函数为制定信号量的值加1

(10)intsem_unlink(constchar*name)

参数:name信号量名返回:0成功,-1未成功移除信号量Xilkernel功能-消息队列

Xilkernel支持核分配X/Open系统接口XSI消息队列。XSI是POSIX下可选的接口集。消息队列可以用于一个IPC机制。消息队列可以容纳任意大小的消息。在初始化时,必须合理的分配存储空间。在核内所分配的消息队列结构的数量和消息队列的长度也能在系统初始化时配置。该模块依赖于信号量模块,在系统中有动态存储器分配模块。Xilkernel功能-消息队列

如果需要的话,这里有一个更强大的消息队列功能可以配置。当选择扩展的消息队列接口时,malloc和free被用来分配和释放消息空间。因此,任意大小的消息能被传送,而不需要确认缓冲存储器分配API能处理任意大小的请求。Xilkernel功能-消息队列

(1)intmsgget(key_tkey,intmsgflg)

参数:key消息队列的队列标识,msgflg消息队列创建选项返回:唯一且非负的消息队列ID

创建消息队列(2)intmsgctl(intmsqid,intcmd,structmsqid_ds*buf)

参数:msqid消息队列ID,cmd命令,buf数据指针返回:0成功,-1未成功以命令控制消息队列Xilkernel功能-消息队列

(3)intmsgsnd(intmsqid,constvoid*msgp,size_tmsgsz,intmsgflg)

参数:msqid消息队列ID,magp消息缓存指针,

msgsz消息大小,msgflg消息发送选项返回:0成功,-1未成功向消息队列发送一个消息(4)ssize_tmsgrcv(intmsqid,void*msgp,size_tnbytes,longmsgtyp,intmsgflg)

参数:msqid消息队列ID,msgp复制接收的消息存放地址,nbytes指定接收消息的缓存大小,

msgtyp不支持,msgflg控制接收消息操作返回:接收到的字节数,-1不成功从消息队列接收一个消息Xilkernel功能-共享存储器

Xilkernel支持核分配的XSI共享存储器。XSI是X/Open系统接口,是POSIX下可选的接口集。共享存储器是普通的,低延迟的IPC机制。在运行时,所要求的共享存储器块必须被标识,并且在系统配置时指明。由这个规范,缓冲存储器被分配到每一个共享存储器区域。目前,在运行时的共享存储器块不能被动态的分配。Xilkernel功能-共享存储器

(1)intshmget(key_tkey,size_tsize,intshmflg)

参数:key共享内存标识,size共享内存大小,

shmflg创建选项返回:非负唯一的共享内存ID,-1未成功获取共享内存的ID

(2)intshmctl(intshmid,intcmd,structshmid_ds*buf)

参数:shmid共享内存ID,cmd命令,buf状态接收缓存返回:0成功,-1未成功实现对共享内存的控制操作Xilkernel功能-共享存储器

(3)void*shmat(intshmid,constvoid*shmaddr,intflag)

参数:shmid共享内存ID,shmaddr未用,flag设置共享内存附属选项返回:共享内存的起始地址,NULL未成功把共享内存映射到调用该函数的地址空间,方便进程对其访问(4)intshm_dt(void*shmaddr)

参数:shmaddr共享内存地址返回:0成功,-1未成功解除进程对共享内存的映射Xilkernel功能-互斥锁Xilkernel提供支持用于核分配的POSIX线程互斥锁。这个同步机制和pthread_API一起使用。在系统说明时,就能配置系统中互斥锁的数量和互斥锁等待队列的长度。支持:1)PTHREAD_MUTEX_DEFALUT2)PTHREAD_MUTEX_RECURSIVE

类型的互斥锁。互斥锁模块是可选的,在系统说明时,可以配置成输入或输出。

Xilkernel功能-互斥锁

(1)intpthread_mutex_init(pthread_mutex_t*mutex,constpthread_mutexattr_t*attr)

参数:mutex互斥锁ID地址,attr互斥锁创建属性结构体

返回:0成功返回ID到地址中,EAGAIN资源不足

初始化互斥锁(2)intpthread_mutex_destroy(pthread_mutex_t*mutex)

参数:mutex互斥锁ID

返回:0成功,EINVAL无效ID

释放互斥资源,执行该函数后,互斥资源变为未初始化状态。Xilkernel功能-互斥锁

(3)intpthread_mutex_lock(pthread_mutex_t*mutex)

参数:mutex互斥锁ID

返回:0成功锁定,-1未成功

加锁操作,某个线程调用该函数为互斥锁资源加锁,保证操作时其它线程不能访问这个资源。如果资源已被锁定,则阻塞调用。(4)intpthread_mutex_trylock(pthread_mutex_t*mutex)

参数:mutex互斥锁ID

返回:0成功,EINVAL无效ID,EBUSY资源已被锁定,-1其它错误

尝试锁定资源,若资源未被锁定则成功返回,若资源已被锁定,也不会阻塞调Xilkernel功能-互斥锁

(5)intpthread_mutex_unlock(pthread_mutex_t*mutex)

参数:mutex互斥锁ID

返回:0成功,EINVAL无效ID,-1其它错误

解锁互斥资源(6)intpthread_mutexattr_init(pthread_mutexattr_t*attr)

参数:attr属性结构体地址

返回:0成功,EINVAL无效属性

初始化互斥资源的属性Xilkernel功能-互斥锁

(7)intpthread_mutexattr_destroy(pthread_mutexattr_t*attr)

参数:attr属性结构体

返回:0成功,EINVAL无效属性

拆除互斥资源的属性,使得互斥资源的属性变为未初始化状态(8)intpthread_mutexattr_settype(pthread_mutexattr_t*attr,inttype)

参数:attr属性结构体,type互斥锁类型

返回:0成功,EINVAL无效属性或类型不支持

在共享资源的属性中设置资源类型Xilkernel功能-互斥锁

(9)intpthread_mutexattr_gettype(pthread_mutexattr_t*attr,int*type)

参数:attr属性结构体,type类型存储地址

返回:0成功,EINVAL无效属性

获取属性中的资源类型Xilkernel功能-动态缓冲存储器管理

核提供了一个缓冲存储器分配方案,能用于需要动态分配存储空间的应用程序。这些接口对于标准C存储分配例程是可替换的。标准的malloc()和free()速度慢,而且代码比较大。分配例程从存储器池中切换一块存储器,用户将其传给缓冲存储器管理程序。缓冲存储器管理程序管理存储器池。设计者可以动态建立新的存储器缓冲池。设计者也可以根据应用程序的要求静态指定不同存储器块的大小和这种存储器块的数量。

Xilkernel功能-动态缓冲存储器管理

(1)intbufcreate(membuf_t*mbuf,void*memptr,intnblks,size_tblksiz)

参数:mbuf缓冲池ID地址,memptr可用缓冲池,

nblks缓冲池内存储块数量,blksiz每个存储块字节数返回:0成功并存储缓冲池ID,-1错误建立一个缓冲池(2)intbufdestroy(membuf_tmbuf)

参数:mbuf缓冲池ID

返回:0成功,-1错误破坏一个缓冲池Xilkernel功能-动态缓冲存储器管理

(3)void*bufmalloc(membuf_tmbuf,size_tsiz)

参数:mbuf缓冲池ID,size所需内存块大小返回:申请到的内存起始地址,NULL未成功从缓冲池中申请一块内存(4)voidbuffree(membuf_tmbuf,void*mem)

参数:mbuf缓冲池ID,mem内存块地址释放指定的内存,释放后内存回到缓冲池,等待其他线程申请Xilkernel功能-软件定时Xilkernel提供软件定时器功能,用于时间相关的处理。该模块可选,并且配置为输入/输出。下面给出软件定时器接口函数:Xilkernel功能-软件定时

(1)unsignedintxget_clock_ticks()

返回:节拍数获取Xilkernel启动到该函数调用之间的时间节拍数(2)time_ttime(time_t*timer)

参数:timer存储被要求的时间信息返回:秒数获取Xilkernel启动到该函数调用之间的时间秒数(3)unsignedsleep(unsignedintms)

参数:ms毫秒数返回:休眠间秒数休眠进程(毫秒数)Xilkernel功能-中断处理Xilkernel负责对基本中断的处理,而不需要用户应用程序直接处理。即使核没有任何中断,那系统也被简单的定时器中断(用于调度)来驱动。核处理主定时器中断,使用它作为调度。在系统初始化时,定时器中断被初始化,并且与向量代码连接。此外,当通过中断控制器(opb_intc)连接多个中断时,Xilkernel也可以处理。中断处理脚本完成下面的任务:Xilkernel功能-中断处理

1)当前执行进程的上下文被保存在上下文存储区域(这里的上下文实际是指现场);

2)禁止中断,直到中断处理结束当执行中断程序时,不使用用户应用程序的堆栈,这样就减轻了进程堆栈的负担

Xilkernel功能-中断处理

如果需要的话,这里有一个更强大的消息队列功能可以配置。当选择扩展的消息队列接口时,malloc和free被用来分配和释放消息空间。因此,任意大小的消息能被传送,而不需要确认缓冲存储器分配API能处理任意大小的请求。

Xilkernel功能-中断处理

核结束第一级中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论