版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、何宾2021.02 本章主要引见操作系统及板级支持包。该章内容主要包括: 1Xilinx微核接口; 2LibXil规范C库; 3板级支持包; 4Xilkernel核; 5LibXil库。 其中重点引见了Xilkernel核,内容包括:Xilkernel核概述、Xilkernel构成、建立Xilkernel运用程序、Xilkernel处置模型、Xilkernel调度模型、POSIX接口、Xilkernel API接口、存储器维护、系统初始化、Xilkernel定制等内容。 Xilinx的微核Xilinx Microkernel,XMK包含三个不同的软件实体,经过它用户运用程序可以与规范C和Mat
2、h库,LibXil库,Xilkernel或独立运转的操作系统相接。 规范C库由newlib和libc组成,该库包含了规范C的函数,例如,stdio,stdlib,string例程。数学库是newlib数学库的扩展,提供了规范的数学函数。 LibXil库由下面构成: 1LibXil Driver-Xilinx的设备驱动程序; 2LibXil MFS-Xilinx的存储文件系统Memory File System, MFS; 3LibXil Flash-并行Flash编程库; 4LibXil lsf-串行Flash编程库; Xilinx提供独立板级支持包Board Support Package,
3、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提供对硬件的小的接口。向应用程序提供所要求的最少的功能。 B
4、SP提供的一些典型的函数包括: 1设置中断 2系统异常 3配置缓存 4其它硬件指定的功能。 LibXil是指设备驱动程序,在软件平台中被包含用来向系统中的外设提供接口。 这些驱动伴随EDK提供,并且被Libgen配置。 后面详细引见设备驱动的概念和在软件平台中适配的方法。 Xilkernel是一个简单的嵌入式处置器的核,能根据系统进展定制。 Xilkernel有嵌入式核的那些关键的特征: 1多义务; 2优先级驱动的抢先调度; 3进程间通讯; 4同步和中断处置。 Xilkernel是一个小的,模块化的,用户定制,能用在不同的系统配置环境。 运用程序能以不同方式,静态的和Xilkernel衔接构成
5、单独的可执行文件。 LibXil MFS提供简单的存储文件系统,使得很容易通过运用输入-输出文件来访问数据。 这个系统经过改动安装区域的源文件,很容易配置满足工程要求。 LibXil Flash :提供对并行Flash的访问,这些Flash与普通的Flash接口一致。 支持Intel和AMD的CFI Common Flash Interface芯片。 LibXil lsf是一个系统内Flash库。 支持Xilinx系统内Flash和外部的串行FlashAtmel的AT45XXXD,Intel的S33和ST的M25PXX。 该库使得高层软件能和串行Flash通讯。 EDK库和设备驱动提供规范C库
6、函数和访问外设的函数。 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,fastmath.h,
7、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
8、库函数,必需运用如下方式编译: 1mb-gcc 对MicroBlaze处置器; 2powerpc-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。这些函数代码太大,不顺应嵌入式处置器的运用。这些函数的原型在stdio.h。
9、 留意:C规范I/O例程比如printf,scanf,vfprintf在默认情况下是行缓冲的。将其变成无缓冲格式的,必需调用setvbuf。 比如: setvbufstdout,NULL,_IONBF,0; 这些输入/输出例程要求在新一行用CR和LF终了。 除了规范的C函数,EDK处置器库提供了下面的小的I/O函数: 1void printchar *;打印字符串到MSS文件中指定的规范输 出的外设 2void putnumint;转换整数到16进制的字符串,并打印字 符串到外设 3void xil_printfconst *char ctl1,与printf函数类似,但代码 更小,不支持浮点
10、数 MicroBlaze处置器和PowerPC处置器C库支持规范的存储器管理函数,比如malloc, calloc, free。 经过运用堆来动态的分配存储器。堆指针从低向高增加运转时不能添加。分配堆至少128字节,察看函数前往值以确定正确的分配堆。 对一切处置器可以运用libgcc.a库来用软件实现整数和浮点算术运算。 当硬件不支持运用指令的算术运算原语时,编译器为一切的处置器插入对这些例程的调用。 默许情况下,整数乘法经过运用库函数例程_mulsi3实现软件。 假设编译器mb-gcc选择-mno-xl-soft-mul时,整数乘法可以运用硬件实现。 整数除法和求模操作经过运用库函数例程_d
11、ivsi3和_modsi3实现软件。可以定制运用硬件除法器来实现除法指令。 双精度乘法,除法和求模函数运用库函数_muldi3,_divdi3,moddi3实现。 无符号的这些操作相对于有符号的操作就是其前缀为_u,而不是_。 一切的浮点的加、减、乘、除和转换操作运用C库里的软件函数实现。 板级支持包BSP是软件模块的最底层,用来访问处置器指定的功能。当运用程序直接访问板/处置器运用独立的BSP,BSP在操作系统层下面。 当系统运用MicroBlaze处置器,并且没有运用OS时,Libgen自动在libxil.a工程库中建立独立的BSP。 MicroBlaze处置器BSP的函数类型主要有: 中
12、断处置; 异常处置; 指令缓存处置; 数据缓存处置; FSL接口宏; FSL宏标志; pseudo-asm宏; PVR访问例程和宏; 文件处置; 错误码。 运用中断处置函数,必需在源文件中包含头文件 mb_interface.h。MicroBlaze的中断管理函数有: void microblaze_enable_interruptsvoid void microblaze_disable_interruptsvoid void microblaze_register_handleXInterruptHandler Handler, void *DataPtr 这个功能在MicroBlaze3
13、.0以前不可用。运用异常处置函数,必需在源文件中包含头文件mb_interface.h。当在MHS中正确的配置了硬件异常处置,这些函数才干正常运行。MicroBlaze的异常处置函数有: void microblaze_disable_exceptionsvoid void microblaze_enable_exceptionsvoid void microblaze_register_exception_handleXuint8 Exceptionld, XExceptionHandler Handler, void *DataPtr 运用指令缓存函数,必需在源文件中包含头文件mb_int
14、erface.h。MicroBlaze的指令缓存处置函数有: void microblaze_enable_icachevoidvoid microblaze_disable_icachevoidvoid microblaze_init_icache_rangeint cache_addr,int cache_size 运用数据缓存函数,必需在源文件中包含头文件mb_interface.h。MicroBlaze的数据缓存处置函数有: 1void microblaze_enable_dcachevoid 使能Microblaze处置器的数据缓存 2void microblaze_disable_
15、dcachevoid 制止Microblaze处置器的数据缓存 3void microblaze_flush_dcache 刷新整个数据缓存,当运用回写缓存时,运用这个函数 4void microblaze_flush_dcache_rangeunsigned int cache_addr, unsigned int cache_len 刷新指定的数据缓存的范围 5void microblaze_invalidate_dcache 使数据缓存无效 6void microblaze_flush_invalidate_rangeunsigned int cache_addr, unsigned i
16、nt 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_dcache; #endif micr
17、oblaze_disable_dcache; /* Clean up ICache */ microblaze_invalidate_icache; microblaze_disable_icache; BSP提供了FSL接口宏,用于访问经过FSL衔接的硬件加速器。FSL接口宏主要包括: 1 getfslxval,id,flags 在Microblaze的输入FSL上,执行得到功能。指令的语义由FSL 的宏flag确定; 2 putfslxval,id,flags 在Microblaze的输出FSL上,执行输出功能。指令的语义由FSL的宏flag确定; 3 tgetfslxval,id,fla
18、gs 在Microblaze的输入FSL上,测试得到功能。指令的语义由FSL的宏flag确定; 4 tputfslxval,id,flags 在Microblaze的输出FSL上,测试输出功能。指令的语义由FSL的宏flag确定; 5 getdfslxval,id,flags 在Microblaze的输入FSL上,执行得到功能。指令的语义由FSL的宏flag确定; 6 putdfslxval,id,flags 在Microblaze的输出FSL上,执行输出功能。指令的语义由FSL的宏flag确定; 7 tgetdfslxval,id,flags 在Microblaze的输入FSL上,测试得到功
19、能。指令的语义由FSL的宏flag确定; 8 tputdfslxval,id,flags 在Microblaze的输出FSL上,测试输出功能。指令的语义由FSL的宏flag确定; 9 fsl_isinvalidinvalid 测试最后的FSL操作前往为有效数据; 10 fsl_iserrorerror 检查最后的FSL操作设置一个错误标志; FSL的宏标志包含: FSL_DEFAULT,FSL_NONBLOCKING,FSL_EXCEPTION, FSL_CONTROL,FSL_ATOMIC, FSL_NONBLOCKING_EXCEPTION,FSL_NONBL OCKING_ATOMIC,
20、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 mggprrn:从通用存放器rn中前往值; 2 mfm
21、sr:从MSR存放器中前往当前值; 3 mfesr:从异常形状存放器ESR中前往当前值; 4 mfear :从异常地址存放器EAR中前往当前值; 5 mffsr:从浮点形状存放器FPS中前往当前值; 6 mtmsrv:将值v移到msr存放器中; 7 mtgprrn,v:将值v挪动到通用存放器rn中; 8 microblaze_getfpex_operand_a:前往最后缺陷浮点指令的操 作数A; 9 microblaze_getfpex_operand_b:前往最后缺陷浮点指令的操 作数B; MicroBlaze提供了可配置的处置器版本存放器PVR。PVR的内容运用pvr_t数据构造获得,该数
22、据构造是32位的数组,数组的每个字对应PVR存放器。PVR字的数目由配置所决议。为了运用宏,必需在源文件中包含pvr.h头文件。访问PVR的方法: 1运用microblaze_get_pvr函数来填充PVR数据到pvr_t数据构造 中; 2在随后的步骤中,可以运用PVR访问宏得到PVR的数据; PVR访问函数为: int microblaze_get_pvrpvr_t *pvr 文件处置的函数有: int fcnt1int fd, int cmd, long arg 该函数经过cmd命令对文件描画符fd进展操作。由于独立的BSP不提供文件系统,这个函数只用来作为完整性。 Xilinx硬件笼统层
23、包含下面:类型xil_types;存放器IOxil_io;异常xil_exception;缓存xil_cache;断言xil_assert;外部头文件;测试存储器xil_testmem;测试存放器xil_testio;测试缓存xil_testcache。 由于API函数封装了这些底层的硬件笼统层操作,对于程序设计来说,很少直接运用这些硬件笼统层操作,所以对该部分不进展进一步的引见,假设需求的话,参考Xilinx的库参考手册。 XilKernel核是一个小的、强壮的和模块化的核: 1允许定制,使得设计者可以根据大小和功能对核进展裁减; 2在嵌入式核kernel内,运用POSIX Portable
24、 Operating System Interface,可移植操作系统接口API支持核core的 特征 3支持MicroBlaze、PowerPC405和PowerPC440处置器 XilKernel的进程间通讯IPC效力用来实现高层效力比如网络,视频和音频,并且运用这些效力来运转程序。 下面给出了那些影响在下一个工程中运用核的决议性 要素: 1典型的嵌入式控制运用由多个义务组成,这些义务需求按 照一个特定的序列或布置来执行。随着所涉及的控制义务的添加, 人工组织子义务和分时享用所要求的任务变得非常困难。当复杂度 添加时,这样一个程序的呼应才干和性能大大降低。 2分解这些义务作为单独的运用程序
25、,并且在一个操作系统上 实现这些运用程序会变得更加直观。 3一个核允许在一个笼统层上编写代码,而不是在微控制器级独立代码上编写代码。 4很多普通常规的运用程序都依赖于操作系统的效力,比如文件系统,时间管理等。 5Xilkernel是一个小的库,它提供了这些必需的效力。移植或运用通用和开放的源码库比如图像或网络协议也要求某些形式的OS效力。 1、经过裁减功能,使其对一个系统具有高度的可扩展性 2、经过XPS在很短时间内完成核的配置和运用 3、核的强壮性:经过参数有效性检查维护系统调用,并且正确 的前往可移植性操作系统接口POSIX错误代码 4、POSIX API目的是嵌入式核,包括:轮循或严厉优
26、先级调度的线程同步化效力-信号量和互斥锁IPC效力-音讯队列和共享存储器动态缓冲池存储器分配软件定时器用户级中断处置5、经过核的静态线程的创建和启动6、对核的系统调用接口7、为MicroBlaze处置器的异常处置8、经过可用的MicroBlaze处置器MMU的存储器维护Xilkernel模块用户运用程序用户运用程序Xilkernel系统调用句柄系统调用句柄调度程序调度程序中断和异常句柄中断和异常句柄软件定时器软件定时器线程管理线程管理信号量信号量音讯队列音讯队列共享存储器共享存储器动态缓冲区管理动态缓冲区管理用户级中断处置用户级中断处置图图8.2 Xilkernel构造构造 Xilkernel
27、由核函数的方式构成,这将导致一个简单的核衔接模型。 为了建立Xilkernel,必需在软件平台中包含Xilkernel,合理的配置它,并且运转Libgen来产生Xilkernel库。 所设计的运用程序独立的开发或者作为XPS里的独立的运用文件工程。 当开发完运用程序后,将Xilkernel与其进展衔接,然后建立最终的核映像文件。Xilkernel核产生后的文件为libxilkernel.a。在在SW平台上包含和平台上包含和配置配置Xilkernel用用Libgen产生库产生库libxilkernel.a运用程序源文件运用程序源文件包含在包含在SW工程中设工程中设计编译参数计编译参数创建工程创建
28、工程build project可执行的核映像文件可执行的核映像文件衔接衔接图图8.3 Xilkernel开发流程开发流程 Xilkernel内部也支持类似更强大的传统的OS的衔接和独立的可执行的方法。 传统的操作系统由独立的映像文件,每个运转在核上的运用程序作为独立的文件。因此,Xilinx引荐运用更简单和更简约的库衔接方式。XPS支持这种方式,更容易运用。它对于调式,下载和启动都非常方便。对于有独立运转的这种高要求情况下,要求运用独立可执行模式。下面给出了运用核衔接方式的运用程序开发步骤: 1、运用程序应包含xmk.h文件作为首要的文件 #include “xmk.h 2、所设计的运用软件工
29、程与libxil.a衔接。该库包含真实的核函数。运用程序和该库衔接将构成最终的核和运用程序映像文件。 3、Xilkernel担任MicroBlaze和PowerPC处置器第一级中断和异常处置。因此,设计人员不能直接处置中断。而在用户级上处置异常和中断; 4、运用最终的与核衔接的软件运用工程的衔接脚本特性来控制核的存储器映射,可以运用自动的脚本产生来帮助设计。 5、运用程序必需提供main,这是核映像文件中的执行的开场点。在main里,可以做需求的初始化和设置。核坚持未启动和休眠形状,在运用程序设置完成后,假设想启动核,调用xilkernel_main来启动核,使能中断,将控制转移给运用程序。在
30、调用xilkernel_main以前,必需使能系统级特性。 这些是典型的机器形状特性,比如缓存的使能,硬件异常的使能,必需总是翻开,即使从一个运用程序到另一个运用程序进展上下文切换context switch。 在运用程序的线程中,不允许随意改动机器形状。如果在修正机器形状时,产生了上下文的切换,将导致随后的线程执行时,没有使能形状;所以必需在修正形状以前,锁定上下文切换和中断。 Xilkernel内的执行单位unit称为进程上下文process context。在进程上下文级上进展调度。 这没有线程群的概念,这些群连在一同构成传统上的进程。 对于资源来说,一切的线程是平等的。POSIX 线程
31、API是最根本的用户可见到进程上下文的接口。这也提供了一些额外的其它的接口,它不是POSIX的一部分。使用线程标识符来操作线程。运用进程标识符pid_t来操作标识最根本的进程上下文。 Xilkernel支持优先级驱动,时间片抢先调度SCHED_PRIO或者简单的轮循SCHED_RR调度。这是全局调度战略而不能根据每个线程修正。在产生核时必须被静态配置。 在SCHED_RR,有一个简单的预备队列和每个进程上下文在一个可配置的时间片执行,当超出时间片时,就执行队列的下一个进程上下文。 在SCHED_PRIO,有很多预备队列,它们有优先级,优先级0是系统内的最高优先级,值越高优先级越低。在同一优先级
32、的义务,采用轮循和时间片进展调度。 对于上面的调度模型,预备队列的长度也可配置。如果在核中有等待队列信号量,音讯队列等,采用SCHED_PRIO模型时,被配置成优先级队列。否那么,被配置成FIFO队列。 图6.4 进程上下文形状PROC_NEW:一个新创建的进程PROC_READY:一个预备执行的进程PROC_RUN:正在运转的进程PROC_WAIT:由于资源被阻塞的进程PROC_DELAY:一个等待超时的进程PROC_TIMED_WAIT:一个由于资源被阻塞的进程,有一个相关的超时 Xilkernel支持最根本的POSIX线程API。 线程的创建和操作是以规范POSIX符号来实现的。 线程运
33、用独一的pthread_t标号来标识。 系统中所创建的进程都有一个核封装,当线程终了的时候,将控制权交给核封装。因此在线程代码的末尾不需要一个指定的退出函数。 来自块开场符号BSS存储器池基于系统中的最大线程静态分配代表线程自动的分配线程堆栈。也可以为每一个去创建的线程动态分配定制的存储器作为堆栈。 整个线程模块是可选的,可以配置成输入或输出来作为软件规范的一部分。 1int pthread_createpthread_t thread, pthread_attr_t* att, void*start_funcvoid*,void* param 创建线程并执行 参数:thread是存储线程ID
34、的地址,attr存储线程属性结 构体的地址,start_func线程函数名,param线程函 数参数指针。 前往:0创建胜利,-1线程ID无效,EINVAL无效属性, EAGAIN资源缺乏。 2void pthread_exitvoid *value_ptr 参数:线程前往值的指针 终了一个线程,但这个函数并不是必需的。需求用到返 回值时才运用。 3nt pthread_joinpthread_t thread, void *value_ptr 参数:thread线程ID,value_ptr线程前往值地址指针 前往:0胜利,ESRCH无效线程,EINVAL线程前往值 曾经被运用停顿当前线程等待
35、目的线程执行完成 并前往值。 4pthread_t pthread_selfvoid 前往:本线程ID 5int pthread_detachpthread_t target 前往:0胜利,ESRCH线程未创建回收线程存储资源, 但并不会终了线程 6int pthread_equalpthread_t t1, pthread_t t2 参数:t1和t2两个待比较线程的ID 前往:1两线程是同一线程,0其它情况 7int pthread_getschedparampthread_t thread, int *policy, struct sched_param *param 参数:thread线
36、程ID,policy全局调度战略指针,param 调度战略构造体地址 前往:0胜利,ESRCH线程无效,EINVAL调度参数无 效 函数前往个别线程的调度战略。 8int pthread_setschedparampthread_t thread, int policy, const struct sched_param *param 参数:thread线程ID,policy忽略,param调度战略构造 体地址 前往:0胜利,ESRCH线程无效,EINVAL调度参数无 效 函数设置个别线程的调度战略。 9int pthread_attr_initpthread_attr_t* attr 参数:
37、线程属性指针 前往:0胜利,1未胜利,EINVAL属性无效 按照默许设置初始化线程属性对象attr 10int pthread_attr_destroy pthread_attr_t* attr 参数:线程属性指针 前往:0胜利,EINVAL错误 函数销毁线程指针对象,设置成未定义值。 11int pthread_attr_setdetachstatepthread_attr_t* attr, int dstate 参数:attr属性构造体,dstate要设置的形状 前往:0胜利,EINVAL无效参数 设置线程形状 12int pthread_attr_getdetachstatepthrea
38、d_attr_t* attr, int *dstate 参数:attr属性构造体,dstate获取的形状地址 前往:0胜利,EINVAL无效参数 获取线程形状:PTHREAD_CREATE_DETACHED 或者PTHREAD_CREATE_JOINABLE 13int pthread_attr_setschedparampthread_attr_t* attr, struct sched_param *schedpar 参数:attr属性构造体,schedpar调度参数存储地址 前往:0胜利,EINVAL无效参数,ENOTSUP无效调 度参数 设置线程优先级,sched_param在sche
39、d.h文件中定义 14int pthread_attr_getschedparampthread_attr_t* attr, struct sched_param* schedpar 参数:attr属性构造体,schedpar线程调度参数指针 前往:0胜利,EINVAL无效参数 获取线程优先级。 15int pthread_attr_setstackconst pthread_attr_t *attr,_ void *stackaddr, size_t stacksize 参数:attr属性构造体,stacksize堆栈地址 前往:0胜利,EINVAL堆栈设置不当 设置线程堆栈 16int p
40、thread_attr_getstackconst pthread_attr_t *attr, void *stackaddr, size_t *stacksize 参数:attr属性构造体,stackaddr堆栈地址指针, stacksize堆栈空间以字节为单位 前往:0胜利,EINVAL无效属性 获取线程的堆栈信息 17pid_t get_currentPIDvoid 前往:当前正在运转的线程或操作的ID 18int killpid_tpid 参数:pid线程或操作ID 前往:0胜利,-1未胜利 终止指定线程或操作 19int process_statuspid_t pid, p_stat
41、 *ps 参数:pid操作或线程ID,ps形状存储地址 前往:无 获取当前正在运转的线程或操作的形状 20int xmk_add_static_threadvoid* *start_routinevoid *, int sched_priority 参数:start_routine线程函数,sched_priority优先级 前往:0胜利,-1未胜利 该函数将线程参与到启动或静态线程列表中,这个 函数要在xilkernel_main函数之前调用 21int yieldvoid 迫使处置器运转下一个预备好的线程或操作,当前 线程放回义务预备终了队列,等待再次获取时间片 运 行 Xilkernel
42、支持核分配POSIX信号量,信号量能用于同步。POSIX信号量能计算信号量,它也能计算低于0的信号量表示阻塞的进程。Xilkernel也提供一些接口用于命名的信号量。在系统初始化时,能配置核内所分配的信号量的数量和信号量等待队列的长度。 信号量模块是可选的,在初始化时可以配置成输入或输出。假设运用音讯队列,必需包含该模块。 1int sem_initsem_t *sem, int pshared, unsigned value 参数:sem信号量ID,pshared共享形状,value初始值 前往:0胜利,-1未胜利。 初始化一个信号量,并初始化信号量的值。 2 int sem_destroy
43、sem_t* sem 参数:sem信号量ID 前往:0胜利,-1未胜利 释放一个信号量资源 3int sem_getvaluesem_t* sem, int* value 参数:sem信号量ID,value获取值地址 前往:0胜利,-1未胜利 获取信号量当前值 4int sem_waitsem_t* sem 参数:sem信号量ID 前往:0胜利,-1未胜利 等待信号量的值大于0,并将信号量值减1。执行对信 号量的锁操作 5int sem_trywaitsem_t* sem 参数:sem信号量ID 前往:0胜利,-1未胜利 功能与sem_trywait函数一样,但不阻塞进程。 6int sem_
44、timedwaitsem_t* sem, unsigned_ms 参数:sem信号量ID,ms定时器时间 前往:0胜利,-1未胜利 功能与sem_trywait函数一样,等待信号量大于0过程 中,经过定时器超时来停顿阻塞进程。 7sem_t* sem_openconst char* name, int oflag,. 参数:name信号量对象的字符串名,oflag控制信号量 创建的标识 前往:创建的或已存在的信号量ID创建一个信号量 8int sem_closesem_t* sem 参数:sem信号量ID 前往:0胜利,-1未胜利 封锁信号量 9int sem_postsem_t* sem 参
45、数:sem信号量ID 前往:0胜利,-1未胜利 添加信号量的值,执行该函数为制定信号量的值加1 10int sem_unlinkconst char* name 参数:name信号量名 前往:0胜利,-1未胜利 移除信号量 Xilkernel支持核分配X/Open系统接口XSI音讯队列。XSI是POSIX下可选的接口集。 音讯队列可以用于一个IPC机制。 音讯队列可以包容恣意大小的音讯。 在初始化时,必需合理的分配存储空间。在核内所分配的音讯队列构造的数量和音讯队列的长度也能在系统初始化时配置。该模块依赖于信号量模块,在系统中有动态存储器分配模块。 假设需求的话,这里有一个更强大的音讯队列功能
46、可以配置。中选择扩展的音讯队列接口时,malloc和free被用来分配和释放音讯空间。因此,恣意大小的音讯能被传送,而不需求确认缓冲存储器分配API能处置恣意大小的恳求。 1int msggetkey_t key, int msgflg 参数:key音讯队列的队列标识,msgflg音讯队列创 建选项 前往:独一且非负的音讯队列ID 创建音讯队列 2int msgctlint msqid, int cmd, struct msqid_ds* buf 参数:msqid音讯队列ID,cmd命令,buf数据指针 前往:0胜利,-1未胜利 以命令控制音讯队列 3int msgsndint msqid,
47、const void *msgp, size_t msgsz, int msgflg 参数:msqid音讯队列ID,magp音讯缓存指针, msgsz音讯大小,msgflg音讯发送选项 前往:0胜利,-1未胜利 向音讯队列发送一个音讯 4ssize_t msgrcvint msqid, void *msgp, size_t nbytes, long msgtyp, int msgflg 参数:msqid音讯队列ID,msgp复制接纳的音讯存 放地址,nbytes指定接纳音讯的缓存大小, msgtyp不支持,msgflg控制接纳音讯操作 前往:接纳到的字节数,-1不胜利 从音讯队列接纳一个音讯
48、Xilkernel支持核分配的XSI共享存储器。XSI是X/Open系统接口,是POSIX下可选的接口集。 共享存储器是普通的,低延迟的IPC机制。 在运转时,所要求的共享存储器块必需被标识,并且在系统配置时指明。 由这个规范,缓冲存储器被分配到每一个共享存储器区域。 目前,在运转时的共享存储器块不能被动态的分配。 1int shmgetkey_t key, size_t size, int shmflg 参数:key共享内存标识,size共享内存大小, shmflg创建选项 前往:非负独一的共享内存ID,-1未胜利 获取共享内存的ID 2int shmctlint shmid, int cm
49、d, struct shmid_ds *buf 参数:shmid共享内存ID,cmd命令,buf形状接纳 缓存 前往:0胜利,-1未胜利 实现对共享内存的控制操作 3void* shmatint shmid, const void *shmaddr, int flag 参数:shmid共享内存ID,shmaddr未用,flag设置共 享内存附属选项 前往:共享内存的起始地址,NULL未胜利 把共享内存映射到调用该函数的地址空间,方便进程 对其访问 4int shm_dtvoid *shmaddr 参数:shmaddr共享内存地址 前往:0胜利,-1未胜利 解除进程对共享内存的映射 Xilker
50、nel提供支持用于核分配的POSIX线程互斥锁。这个同步机制和pthread_ API一同运用。在系统阐明时,就能配置系统中互斥锁的数量和互斥锁等待队列的长度。支持: 1PTHREAD_MUTEX_DEFALUT 2PTHREAD_MUTEX_RECURSIVE 类型的互斥锁。 互斥锁模块是可选的,在系统阐明时,可以配置成输入或输出。 1int pthread_mutex_initpthread_mutex_t* mutex, const pthread_mutexattr_t* attr 参数:mutex互斥锁ID地址,attr互斥锁创建属性结 构体 前往:0胜利前往ID到地址中,EAGAI
51、N资源缺乏 初始化互斥锁 2int pthread_mutex_destroypthread_mutex_t* mutex 参数:mutex互斥锁ID 前往:0胜利,EINVAL无效ID 释放互斥资源,执行该函数后,互斥资源变为未初 始化形状。 3int pthread_mutex_lockpthread_mutex_t* mutex 参数:mutex互斥锁ID 前往:0胜利锁定,-1未胜利 加锁操作,某个线程调用该函数为互斥锁资源加 锁,保证操作时其它线程不能访问这个资源。假设 资源已被锁定,那么阻塞调用。 4int pthread_mutex_trylockpthread_mutex_t*
52、 mutex 参数:mutex互斥锁ID 前往:0胜利,EINVAL无效ID,EBUSY资源已被 锁定,-1其它错误 尝试锁定资源,假设资源未被锁定那么胜利前往,假设资 源已被锁定,也不会阻塞调 5int pthread_mutex_unlockpthread_mutex_t* mutex 参数:mutex互斥锁ID 前往:0胜利,EINVAL无效ID,-1其它错误 解锁互斥资源 6int pthread_mutexattr_initpthread_mutexattr_t* attr 参数:attr属性构造体地址 前往:0胜利,EINVAL无效属性 初始化互斥资源的属性 7int pthrea
53、d_mutexattr_destroypthread_mutexattr_t* attr 参数:attr属性构造体 前往:0胜利,EINVAL无效属性 撤除互斥资源的属性,使得互斥资源的属性变为未初始 化形状 8int pthread_mutexattr_settypepthread_mutexattr_t* attr, int type 参数:attr属性构造体,type互斥锁类型 前往:0胜利,EINVAL无效属性或类型不支持 在共享资源的属性中设置资源类型 9int pthread_mutexattr_gettypepthread_mutexattr_t* attr, int *type
54、 参数:attr属性构造体,type类型存储地址 前往:0胜利,EINVAL无效属性 获取属性中的资源类型 核提供了一个缓冲存储器分配方案,能用于需求动态分配存储空间的运用程序。这些接口对于规范C存储分配例程是可交换的。规范的malloc和free速度慢,而且代码比较大。分配例程从存储器池中切换一块存储器,用户将其传给缓冲存储器管理程序。 缓冲存储器管理程序管理存储器池。设计者可以动态建立新的存储器缓冲池。设计者也可以根据运用程序的要求静态指定不同存储器块的大小和这种存储器块的数量。 1int bufcreatemembuf_t *mbuf, void *memptr, int nblks,
55、size_t blksiz 参数:mbuf缓冲池ID地址,memptr可用缓冲池, nblks缓冲池内存储块数量,blksiz每个存储块 字节数 前往:0胜利并存储缓冲池ID,-1错误 建立一个缓冲池 2int bufdestroymembuf_t mbuf 参数:mbuf缓冲池ID 前往:0胜利,-1错误 破坏一个缓冲池 3void* bufmallocmembuf_t mbuf, size_t siz 参数:mbuf缓冲池ID,size所需内存块大小 前往:恳求到的内存起始地址,NULL未胜利 从缓冲池中恳求一块内存 4void buffreemembuf_t mbuf, void* me
56、m 参数:mbuf缓冲池ID,mem内存块地址 释放指定的内存,释放后内存回到缓冲池,等待其 他线程恳求 Xilkernel提供软件定时器功能,用于时间相关的处理。该模块可选,并且配置为输入/输出。下面给出软件定时器接口函数: 1unsigned int xget_clock_ticks 前往:节拍数 获取Xilkernel启动到该函数调用之间的时间节拍数 2time_t timetime_t *timer 参数:timer存储被要求的时间信息 前往:秒数 获取Xilkernel启动到该函数调用之间的时间秒数 3unsigned sleepunsigned int ms 参数:ms毫秒数 前往
57、:休眠间秒数 休眠进程毫秒数 Xilkernel担任对根本中断的处置,而不需求用户运用程序直接处置。即使核没有任何中断,那系统也被简单的定时器中断用于调度来驱动。核处置主定时器中断,运用它作为调度。在系统初始化时,定时器中断被初始化,并且与向量代码衔接。此外,当经过中断控制器opb_intc衔接多个中断时,Xilkernel也可以处置。中断处置脚本完成下面的义务: 1当前执行进程的上下文被保管在上下文存储区域这里的上下文实践是指现场; 2制止中断,直到中断处置终了 当执行中断程序时,不运用用户运用程序的堆栈,这样就减轻了进程堆栈的负担 假设需求的话,这里有一个更强大的音讯队列功能可以配置。 中
58、选择扩展的音讯队列接口时,malloc和free被用来分配和释放音讯空间。 因此,恣意大小的音讯能被传送,而不需求确认缓冲存储器分配API能处置恣意大小的恳求。 核终了第一级中断句柄,在该点将控制转移到第二级中断句柄。只是中断控制器中最主要的中断句柄例程。从这点开场,为中断控制器调用用户为不同外设指定的中断句柄。 在MicroBlaze核中,假设定时器经过中断控制器连接,经过登记本身作为那个中断的句柄,使核并没有看见但处置了主定时器中断核的嘀嗒。 设计者的中断句柄可以执行任何所要求的中断处置行为,包括进展系统调用。因此,句柄不能调用阻塞系统的调用,否那么整个核被阻塞,系统进入暂停形状。运用所设
59、计的句柄做最少的中断处置。 当用户级的中断句柄被效力后,第一级的中断句柄再次得到控制权。它将决议能否前面的中断处置引起核内重新调度的恳求。 假设存在这样一个恳求,那么调用核调度程序,并且执行合理的重新调度。当调度程序确定了下一个要执行的进程,新进程的上下文就被恢复,中断重新使能。 当在系统中的Xilkernel在运用有多重中断时,可使用Xilkernel用户级中断处置API。下面给出了用户级中断处置API: 1unsigned int register_int_handlerint_id_t id, void *handlervoid*, void *callback 参数:id中断号;han
60、dler用户定义中断处置函数; callback是handler的参数 前往:XST_SUCCESS表示胜利,其它表示出错详见 xstatus.h文件 注册用户中断函数关联 2void unregister_int_handlerint_id_t id 参数:id中断号 取消用户中断函数关联 3void enable_interruptint_id_t id 参数:中断号 在中断控制器中使能对应中断 4void disable_interruptint_id_t id 参数:中断号 在中断控制器中制止对应中断 5void acknowledge_interruptint_id_t id 参数:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 虚拟转让合同范本
- 软件著作权出让合同范本
- 地下室外墙安装合同范本
- 道路检查车租赁合同范本
- 《化学反应工程》(朱炳辰)课后习题答案
- 希腊过户合同范本
- 健康讲座合同范本
- 超市应急预案
- 周转房合同范本
- 《锅炉安全技术监察规程》第三章
- 《音乐鉴赏(第二版)》大学生音乐鉴赏全套教学课件
- 期末卷(试题)-2024-2025学年二年级上册数学苏教版
- 光谱内镜技术用于喉癌预后预测
- 《成人有创机械通气气道内吸引技术操作》标准解读
- 2025年中考数学一轮复习:48道压轴题汇编(较难含答案)
- 国家开放大学(广西)《云计算及应用》作业1-5参考答案
- 2020海湾GST-HX-240B火灾声光警报器安装使用说明书
- GB/T 44068-2024LTE移动通信终端支持北斗定位的技术要求
- 2024年秋新北师大版七年级上册数学教学课件 4.2.1 角
- PFMEA课件培训学习
- 2024-2030年中国CVD和和ALD前体行业市场发展趋势与前景展望战略分析报告
评论
0/150
提交评论