1 / 145

第八章 Xilinx 操作系统及库

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

brice
Download Presentation

第八章 Xilinx 操作系统及库

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第八章 Xilinx操作系统及库 何宾 2012.02

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

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

  4. Xilinx的微核 LibXil库由下面构成: 1)LibXil Driver-Xilinx的设备驱动程序; 2)LibXil MFS-Xilinx的存储文件系统(Memory File System, MFS); 3)LibXil Flash-并行Flash编程库; 4)LibXil lsf-串行Flash编程库; Xilinx提供独立板级支持包(Board Support Package, BSP,后来Xilinx称为Standard平台)和Xilkernel。

  5. 用户应用程序 Xilkernel Xil MFS Xil lsf XilFlash 独立BSP Xilinx驱动 C,Math和GCC库 图8.1 XMK结构 Xilinx的微核结构

  6. Xilinx的微核 用户的应用程序通过不同的方法和XMK的不同组成部 分进行接口。 除了一些交互外,库之间是独立的。比如,Xilkernel 使用BSP。BSP和Xilinx驱动构成了对底层硬件的抽象。 XMK的库和OS依赖于标准的C库组成部分。数学库 libm.a可以用来和用户的应用程序连接。

  7. Xilinx的微核-板级支持包BSP BSP是单线程库。BSP提供对硬件的小的接口。向应 用程序提供所要求的最少的功能。 BSP提供的一些典型的函数包括: (1)设置中断 (2)系统异常 (3)配置缓存 (4)其它硬件指定的功能。

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

  9. Xilinx的微核-Xilkernel Xilkernel是一个简单的嵌入式处理器的核,能根据系 统进行定制。 Xilkernel有嵌入式核的那些关键的特征: (1)多任务; (2)优先级驱动的抢先调度; (3)进程间通信; (4)同步和中断处理。

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

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

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

  13. Xilinx的微核-LibXil lsf LibXil lsf是一个系统内Flash库。 支持Xilinx系统内Flash和外部的串行Flash(Atmel 的AT45XXXD,Intel的S33和ST的M25PXX)。 该库使得高层软件能和串行Flash通信。

  14. 标准C库 EDK库和设备驱动提供标准C库函数和访问外设的函 数。 EDK库由Libgen根据MSS文件为每个工程自动配置。 这些库和include文件保存在当前工程lib和include目录下。 mb-gcc的选项-l和-L用来将这些目录添加到库搜索路 径中。

  15. 标准的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;

  16. 标准的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

  17. 标准的C库(lib.a) 程序访问标准的C库函数,必须使用如下方式编译: 1)mb-gcc <C file>(对MicroBlaze处理器); 2)powerpc-eabi-gcc<C file>(对PowerPC处理器),访 问libm数学函数,指定lm选项;

  18. Xilinx C库(libxil.a) Xilinx的C库为MicroBlaze处理器包含下面的目标文件: 1)_exception_handler.o,_interrupt_handler.o, _program_clean.o,_program_init.o 2)默认情况下提供异常和中断句柄。 libxil.a被自动包含。

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

  20. 输入/输出函数 比如: 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函数类似,但代码 更小,不支持浮点数)

  21. 存储器管理函数 MicroBlaze处理器和PowerPC处理器C库支持标准的存 储器管理函数,比如malloc(), calloc(), free()。 通过使用堆来动态的分配存储器。堆指针从低向高增 加(运行时不能增加)。分配堆至少128字节,观察函数 返回值以确定正确的分配堆。

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

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

  24. MicroBlaze处理器-浮点算术运算 所有的浮点的加、减、乘、除和转换操作使用C库里 的软件函数实现。

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

  26. MicroBlaze处理器BSP 当系统使用MicroBlaze处理器,并且没有使用OS时, Libgen自动在libxil.a工程库中建立独立的BSP。 MicroBlaze处理器BSP的函数类型主要有: • 中断处理; • 异常处理; • 指令缓存处理; • 数据缓存处理; • FSL接口宏; • FSL宏标志; • pseudo-asm宏; • PVR访问例程和宏; • 文件处理; • 错误码。

  27. 中断处理 使用中断处理函数,必须在源文件中包含头文件 mb_interface.h。MicroBlaze的中断管理函数有: • void microblaze_enable_interrupts(void) • void microblaze_disable_interrupts(void) • void microblaze_register_handle(XInterruptHandler Handler, void *DataPtr)

  28. 异常处理 这个功能在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)

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

  30. 数据缓存处理 使用数据缓存函数,必须在源文件中包含头文件 mb_interface.h。MicroBlaze的数据缓存处理函数有: (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) 刷新指定的数据缓存的范围

  31. 数据缓存处理 (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 ();

  32. 数据缓存处理 2.初始化数据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();

  33. 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确定;

  34. 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操作设置一个错误标志;

  35. FSL宏标志 FSL的宏标志包含: FSL_DEFAULT,FSL_NONBLOCKING,FSL_EXCEPTION, FSL_CONTROL,FSL_ATOMIC, FSL_NONBLOCKING_EXCEPTION,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

  36. pseudo-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;

  37. PVR访问例程和宏 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)

  38. 文件处理 文件处理的函数有: int fcnt1(int fd, int cmd, long arg) 该函数通过cmd命令对文件描述符fd进行操作。由 于独立的BSP不提供文件系统,这个函数只用来作为完 整性。

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

  40. Xilkernel核 XilKernel核是一个小的、健壮的和模块化的核: 1)允许定制,使得设计者可以根据大小和功能对核进行裁减; 2)在嵌入式核(kernel)内,使用POSIX (Portable Operating System Interface,可移植操作系统接口)API支持核(core)的 特征 3)支持MicroBlaze、PowerPC405和PowerPC440处理器 XilKernel的进程间通信IPC服务用来实现高层服务(比 如网络,视频和音频),并且使用这些服务来运行程序。

  41. Xilkernel核 下面给出了那些影响在下一个工程中使用核的决定性 因素: 1)典型的嵌入式控制应用由多个任务组成,这些任务需要按 照一个特定的序列或安排来执行。随着所涉及的控制任务的增加, 人工组织子任务和分时享用所要求的工作变得十分困难。当复杂度 增加时,这样一个程序的响应能力和性能大大降低。 2)分解这些任务作为单独的应用程序,并且在一个操作系统上 实现这些应用程序会变得更加直观。

  42. Xilkernel核 3)一个核允许在一个抽象层上编写代码,而不是在微控制器 级独立代码上编写代码。 4)很多普通常规的应用程序都依赖于操作系统的服务,比如 文件系统,时间管理等。 5)Xilkernel是一个小的库,它提供了这些必须的服务。移植或 使用通用和开放的源码库(比如图像或网络协议)也要求某些形 式的OS服务。

  43. Xilkernel包含的关键特征 1、通过裁减功能,使其对一个系统具有高度的可扩展性 2、通过XPS在很短时间内完成核的配置和使用 3、核的健壮性:通过参数有效性检查保护系统调用,并且正确 的返回可移植性操作系统接口POSIX错误代码 4、POSIX API目标是嵌入式核,包括: • 轮循或严格优先级调度的线程 • 同步化服务-信号量和互斥锁 • IPC服务-消息队列和共享存储器 • 动态缓冲池存储器分配 • 软件定时器 • 用户级中断处理

  44. Xilkernel模块 用户应用程序 用户级中断处理 Xilkernel 系统调用句柄 调度程序 中断和异常句柄 软件定时器 线程管理 信号量 消息队列 共享存储器 动态缓冲区管理 图8.2 Xilkernel结构 Xilkernel包含的关键特征 5、通过核的静态线程的创建和启动 6、对核的系统调用接口 7、为MicroBlaze处理器的异常处理 8、通过可用的MicroBlaze处理器MMU的存储器保护

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

  46. 在SW平台上包含和配置Xilkernel 用Libgen 产生库 libxilkernel.a 连接 包含在SW工程中设计编译参数 创建工程 build project 可执行的核映像文件 应用程序源文件 图8.3 Xilkernel开发流程 建立Xilkernel应用程序

  47. 建立Xilkernel应用程序 Xilkernel内部也支持类似更强大的传统的OS的连接和 独立的可执行的方法。 传统的操作系统由独立的映像文件,每个运行在核上 的应用程序作为独立的文件。因此,Xilinx推荐使用更简 单和更简洁的库连接模式。XPS支持这种模式,更容易 使用。它对于调式,下载和启动都非常方便。对于有独 立运行的这种高要求情况下,要求使用独立可执行模 式。 下面给出了使用核连接模式的应用程序开发步骤:

  48. 建立Xilkernel应用程序 1、应用程序应包含xmk.h文件作为首要的文件 #include “xmk.h” 2、所设计的应用软件工程与libxil.a连接。该库包含真 实的核函数。应用程序和该库连接将形成最终的核和应用 程序映像文件。 3、Xilkernel负责MicroBlaze和PowerPC处理器第一级 中断和异常处理。因此,设计人员不能直接处理中断。而 在用户级上处理异常和中断; 4、使用最终的与核连接的软件应用工程的连接脚本特 性来控制核的存储器映射,可以使用自动的脚本产生来帮 助设计。

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

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

More Related