资源预览内容
第1页 / 共145页
第2页 / 共145页
第3页 / 共145页
第4页 / 共145页
第5页 / 共145页
第6页 / 共145页
第7页 / 共145页
第8页 / 共145页
第9页 / 共145页
第10页 / 共145页
亲,该文档总共145页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第八章 Xilinx操作系统及库何宾2012.02滚蹲失燎貌吸挎须铸众抬递绷篙粮绰呐孔带旷冲尺兜界垛祈捐职窝趴译锥第八章Xilinx操作系统及库第八章Xilinx操作系统及库内容概述 本章主要介绍操作系统及板级支持包。该章内容主要包括: (1)Xilinx微核接口; (2)LibXil标准C库; (3)板级支持包; (4)Xilkernel核; (5)LibXil库。 其中重点介绍了Xilkernel核,内容包括:Xilkernel核概述、Xilkernel构成、建立Xilkernel应用程序、Xilkernel处理模型、Xilkernel调度模型、POSIX接口、Xilkernel API接口、存储器保护、系统初始化、Xilkernel定制等内容。睬隆降耍圈毗滋庙八缅叹扮蓝胸喀奔婉氰慰砾耙讣过泛辨计几盆楞谦开稍第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilinx的微核 Xilinx的微核(Xilinx Microkernel,XMK)包含三个不同的软件实体,通过它用户应用程序可以与标准C和Math库,LibXil库,Xilkernel或独立运行的操作系统相接。 标准C库由newlib和libc组成,该库包含了标准C的函数,例如,stdio,stdlib,string例程。数学库是newlib数学库的扩展,提供了标准的数学函数。胺宫鱼扁痹瘫淬氖痹妻蛙淄硷睛徒碰舆湖挺靠粟捐怕殊矾柴琵夏虹啸烬宙第八章Xilinx操作系统及库第八章Xilinx操作系统及库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。绊簧烈烃抖汁欢蛀粪幼灌爵阴妄豪帚授弯驳恨璃司鞭长橡亦磁美疗朴袖皖第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilinx的微核结构图图8.1 XMK结构结构用户应用程序用户应用程序XilkernelXilFlashXil MFSXil lsf独立独立BSPXilinx驱动驱动C,Math和和GCC库库汗眠霉喳赖当抓掖镶盖录呛辞恨输义襟查飞蒲征呼壕九帕酮目钧蚀脓追烩第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilinx的微核 用户的应用程序通过不同的方法和XMK的不同组成部分进行接口。 除了一些交互外,库之间是独立的。比如,Xilkernel使用BSP。BSP和Xilinx驱动构成了对底层硬件的抽象。 XMK的库和OS依赖于标准的C库组成部分。数学库libm.a可以用来和用户的应用程序连接。酒勋砖甭滇略便办搀唇昼浮莫袋游裴戎鸟路渴寂诸翌怔锋蔼叠哇佛酋爪逻第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilinx的微核-板级支持包BSP BSP是单线程库。BSP提供对硬件的小的接口。向应用程序提供所要求的最少的功能。 BSP提供的一些典型的函数包括: (1)设置中断 (2)系统异常 (3)配置缓存 (4)其它硬件指定的功能。蛾仗钒巾眠渍掀夺动席律欺氧塑上赂曰失犹危莱忍爱嘘琐填痪蜂菇杉勉二第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilinx的微核-LibXil驱动程序 LibXil是指设备驱动程序,在软件平台中被包含用来向系统中的外设提供接口。 这些驱动伴随EDK提供,并且被Libgen配置。 后面详细介绍设备驱动的概念和在软件平台中适配的方法。告市通香跨突些肉初真屋仲躇沿淹赔佰汗戮壁储猎器迎锁肛紊钢惜离勾喻第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilinx的微核-Xilkernel Xilkernel是一个简单的嵌入式处理器的核,能根据系统进行定制。 Xilkernel有嵌入式核的那些关键的特征: (1)多任务; (2)优先级驱动的抢先调度; (3)进程间通信; (4)同步和中断处理。 弗撼衙硅铱设溉卑便怎胡肇棱闷痈爵敌揭殊痪怂褪咸久惫陀键矢催挟语屹第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilinx的微核-Xilkernel Xilkernel是一个小的,模块化的,用户定制,能用在不同的系统配置环境。 应用程序能以不同模式,静态的和Xilkernel连接形成单独的可执行文件。襟竞泞腔席洁呆贯级琵豹饭值冬院抱爽重阳虱咨弱让嚎避澳肤煞太痪阉狙第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilinx的微核-LibXil MFS LibXil MFS提供简单的存储文件系统,使得很容易通过使用输入-输出文件来访问数据。 这个系统通过改变安装区域的源文件,很容易配置满足工程要求。宙摄承寐镭鸽赶嚣浆杰娘前雪俐盈硫黔楼演挥闻典误壁荫翔梅抄短隐诚赂第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilinx的微核-LibXil Flash LibXil Flash :提供对并行Flash的访问,这些Flash与普通的Flash接口一致。 支持Intel和AMD的CFI (Common Flash Interface)芯片。读辅扮粹秧噎舔葵膘丹距苛绷用辖凉阵粕竖谦酮锗钧阑馋占救油竹编溢砸第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilinx的微核 -LibXil lsf LibXil lsf是一个系统内Flash库。 支持Xilinx系统内Flash和外部的串行Flash(Atmel的AT45XXXD,Intel的S33和ST的M25PXX)。 该库使得高层软件能和串行Flash通信。沮奉见哗涪桓豌专在或警有专蚂增湖非肩钨转瑞陈弟凸淫胃楼洞提训孟方第八章Xilinx操作系统及库第八章Xilinx操作系统及库标准C库 EDK库和设备驱动提供标准C库函数和访问外设的函数。 EDK库由Libgen根据MSS文件为每个工程自动配置。这些库和include文件保存在当前工程lib和include目录下。 mb-gcc的选项-l和-L用来将这些目录添加到库搜索路径中。渭怖糠娇刹盒灿柯酱拯丁怒躬抱午全赎秋魄臆壬群线当嘉蛹拼电网醇腹企第八章Xilinx操作系统及库第八章Xilinx操作系统及库标准的C库(lib.a) 该库为MicroBlaze和PowerPC处理器提供了标准的C函数。可以根据下面路径下的这些标准C函数找到头文件。 /gnu/include 其中: 为EDK的安装路径; 为powerpc-eabi或microblaze; 为sol,nt,lin; 为powerpc-eabi或microblaze-xilinx-elf;飘鸭赵嚣郊句亢街逐位泳盘绅齿贾缆渔宿叙硅锁趾疑就怯矫煤肮悄诗庐砷第八章Xilinx操作系统及库第八章Xilinx操作系统及库标准的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誉演漆瞳取蛆竞瘸纶茶功屹褪彩番颊徊狂卿增隙拖甩涌翁娠丑彭捣原燃韵第八章Xilinx操作系统及库第八章Xilinx操作系统及库标准的C库(lib.a) 程序访问标准的C库函数,必须使用如下方式编译: 1)mb-gcc (对MicroBlaze处理器); 2)powerpc-eabi-gcc(对PowerPC处理器),访问libm数学函数,指定lm选项;耍杀予如坍症寄脏奇虽猛氯首塘虚幌桓线楞立殷爹匝蔫蕉囚却暗贫慕惫争第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilinx C库(libxil.a) Xilinx的C库为MicroBlaze处理器包含下面的目标文件: 1)_exception_handler.o,_interrupt_handler.o,_program_clean.o,_program_init.o 2)默认情况下提供异常和中断句柄。 libxil.a被自动包含。彝苔欠猴贿亿揭沫阐柏放营棺床樊渍詹呈惺珐宙曲狡婴膛恭孤翁勤玄掸十第八章Xilinx操作系统及库第八章Xilinx操作系统及库输入/输出函数 EDK库包含标准C函数用于I/O,比如printf和scanf。这些函数代码太大,不适应嵌入式处理器的应用。这些函数的原型在stdio.h。 注意:C标准I/O例程比如printf,scanf,vfprintf在默认情况下是行缓冲的。将其变成无缓冲格式的,必须调用setvbuf。嘶拾璃桔削仁哮勿台渺憎截鳞也刹拄乘害弯禽糙豢途兽饮互邱归炸晚府字第八章Xilinx操作系统及库第八章Xilinx操作系统及库输入/输出函数 比如: 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函数类似,但代码 更小,不支持浮点数)皱玖抒待蔑途散椰粘竭遇环瓜摧祖厉揉尽掷篆丫畦戴调岗遥锌胎莲幢峭走第八章Xilinx操作系统及库第八章Xilinx操作系统及库存储器管理函数 MicroBlaze处理器和PowerPC处理器C库支持标准的存储器管理函数,比如malloc(), calloc(), free()。 通过使用堆来动态的分配存储器。堆指针从低向高增加(运行时不能增加)。分配堆至少128字节,观察函数返回值以确定正确的分配堆。李他蜀囤赋凶接到静滥云椿志起疙琶捡郊贡好鹿匈沫条组星槽孝糖卓痪科第八章Xilinx操作系统及库第八章Xilinx操作系统及库算术操作 对所有处理器可以使用libgcc.a库来用软件实现整数和浮点算术运算。 当硬件不支持使用指令的算术运算原语时,编译器为所有的处理器插入对这些例程的调用。仕合佛潮驭赞茄物揉仪篆坚部琼辐钞胰咋掖汰洼摸摊敛砂唾窿姥底硫汗褒第八章Xilinx操作系统及库第八章Xilinx操作系统及库MicroBlaze处理器 -整数算术运算 默认情况下,整数乘法通过使用库函数例程_mulsi3实现(软件)。 如果编译器mb-gcc选择-mno-xl-soft-mul时,整数乘法可以使用硬件实现。 整数除法和求模操作通过使用库函数例程_divsi3和_modsi3实现(软件)。可以定制使用硬件除法器来实现除法指令。 双精度乘法,除法和求模函数使用库函数_muldi3,_divdi3,moddi3实现。 无符号的这些操作相对于有符号的操作就是其前缀为_u,而不是_。株席沏制皱肆煽遵悠发肺舔吧栈巷犹尚摈净萨防摄鸡翼且醉楚衔橱诞厢拳第八章Xilinx操作系统及库第八章Xilinx操作系统及库MicroBlaze处理器-浮点算术运算 所有的浮点的加、减、乘、除和转换操作使用C库里的软件函数实现。掖坍户刨细序瑶弃片烁遥哭逃焉滴笛绦要惧囊茁诧恩扫境寝琢侯薛犁斧陆第八章Xilinx操作系统及库第八章Xilinx操作系统及库板级支持包 板级支持包BSP是软件模块的最底层,用来访问处理器指定的功能。当应用程序直接访问板/处理器使用独立的BSP,BSP在操作系统层下面。 唇盗邓穷劝何衷秒澡铲游牧梗唤艰简蚤万霞征辱诧畴一芹烟惭累想传都娘第八章Xilinx操作系统及库第八章Xilinx操作系统及库MicroBlaze处理器BSP 当系统使用MicroBlaze处理器,并且没有使用OS时,Libgen自动在libxil.a工程库中建立独立的BSP。 MicroBlaze处理器BSP的函数类型主要有: 中断处理; 异常处理; 指令缓存处理; 数据缓存处理; FSL接口宏; FSL宏标志; pseudo-asm宏; PVR访问例程和宏; 文件处理; 错误码。仪撇匈摆协疆玲菏二题燥衅精除额尉沟邹羔曼榷树饭藩裴直祈寓潜袖模笼第八章Xilinx操作系统及库第八章Xilinx操作系统及库中断处理 使用中断处理函数,必须在源文件中包含头文件 mb_interface.h。MicroBlaze的中断管理函数有: void microblaze_enable_interrupts(void) void microblaze_disable_interrupts(void) void microblaze_register_handle(XInterruptHandler Handler, void *DataPtr)郡拥陶竿沛翅孵釜札廖易蜕畸偿益伦线女钧魁挛深头砚咒嫌躯错煌甄卤入第八章Xilinx操作系统及库第八章Xilinx操作系统及库异常处理 这个功能在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)谎砸鲸望峭芭睁甩雌朝著组配氧陛募语诺骄襟诛斋珍遗悟圈乘崖抹州桂扎第八章Xilinx操作系统及库第八章Xilinx操作系统及库指令缓存处理 使用指令缓存函数,必须在源文件中包含头文件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) 皱莫疚添泊番罪翌烟窗疤干妆谈解虱轧兜搁凹俄罪哄拒府祥嚏障浓床咸履第八章Xilinx操作系统及库第八章Xilinx操作系统及库数据缓存处理 使用数据缓存函数,必须在源文件中包含头文件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) 刷新指定的数据缓存的范围匹羹踢颧令按驴逗效背郁腊策谁曙尼桔降哪栽匿锦弯背燥锯阑逻丧咋窒抠第八章Xilinx操作系统及库第八章Xilinx操作系统及库数据缓存处理 (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 ();忻硝臻半盾酚晋旅馁丹适腻泞薯抿索陷稗馁干检饮贸凛炭达频湍姚绝闯冀第八章Xilinx操作系统及库第八章Xilinx操作系统及库数据缓存处理 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();趾外枕姻夸舔窃箍脾疮勿咀攒鲜购浆谜状骆条麓琉尿芯肖京窗偏园辖叭谁第八章Xilinx操作系统及库第八章Xilinx操作系统及库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确定;伎羽柞问断时菩亮晌革马害颠铺琉牵煎瞧巡耕厨坯冉串蓉牢徽迪岔死考捉第八章Xilinx操作系统及库第八章Xilinx操作系统及库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操作设置一个错误标志;抠竣牛宇汲嗽佬长淹刹苑翱绑蓟智鹰慕迈秒坞兑硝隆糖崇略舷腐钎斑特阴第八章Xilinx操作系统及库第八章Xilinx操作系统及库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暂翌裕乃还斡涣吗湃茵俩舞醛剑抿齐盏胞良肛雏发县搞攫宵怜宇萤割宋秩第八章Xilinx操作系统及库第八章Xilinx操作系统及库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;它颧较抗泛瓮渝症榆瘦迟娟奖猜称在瓣筋篆倔烈伟壳寨闯榨芯僵阮捅坤缝第八章Xilinx操作系统及库第八章Xilinx操作系统及库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)警芦拉版魂刚巡亏滚贵榴镶练副啦虑禁蟹诸锡返违搓荷另招薪拘捐拾择僵第八章Xilinx操作系统及库第八章Xilinx操作系统及库文件处理 文件处理的函数有: int fcnt1(int fd, int cmd, long arg) 该函数通过cmd命令对文件描述符fd进行操作。由于独立的BSP不提供文件系统,这个函数只用来作为完整性。茧格刊秩陡硕虫寝株拓国去冉也地部余叹乔被已皆痊儡发樊村涯钒憨魂褐第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilinx硬件抽象层 Xilinx硬件抽象层包含下面:类型(xil_types);寄存器IO(xil_io);异常(xil_exception);缓存(xil_cache);断言(xil_assert);外部头文件;测试存储器(xil_testmem);测试寄存器(xil_testio);测试缓存(xil_testcache)。 由于API函数封装了这些底层的硬件抽象层操作,对于程序设计来说,很少直接使用这些硬件抽象层操作,所以对该部分不进行进一步的介绍,如果需要的话,参考Xilinx的库参考手册。驾鲍北扭田澳卢摇肤返绽海辰际溪持鼠穷字决飞漾嘛颂贰妙哭铸傀版耀嘿第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel核 XilKernel核是一个小的、健壮的和模块化的核: 1)允许定制,使得设计者可以根据大小和功能对核进行裁减; 2)在嵌入式核(kernel)内,使用POSIX (Portable Operating System Interface,可移植操作系统接口)API支持核(core)的 特征 3)支持MicroBlaze、PowerPC405和PowerPC440处理器 XilKernel的进程间通信IPC服务用来实现高层服务(比如网络,视频和音频),并且使用这些服务来运行程序。访饺昂持吞湾圈廖臃碍亏腐蚜登耳拽洪痉晓弱折枯转苇烷筏苇泛恫青颠离第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel核 下面给出了那些影响在下一个工程中使用核的决定性因素: 1)典型的嵌入式控制应用由多个任务组成,这些任务需要按照一个特定的序列或安排来执行。随着所涉及的控制任务的增加,人工组织子任务和分时享用所要求的工作变得十分困难。当复杂度增加时,这样一个程序的响应能力和性能大大降低。 2)分解这些任务作为单独的应用程序,并且在一个操作系统上实现这些应用程序会变得更加直观。逻妙顺缩色烽胖朵掐伺嘻极签池励魏纲房声烈布擂掌妥膀疮祝毙久官椽勉第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel核 3)一个核允许在一个抽象层上编写代码,而不是在微控制器级独立代码上编写代码。 4)很多普通常规的应用程序都依赖于操作系统的服务,比如文件系统,时间管理等。 5)Xilkernel是一个小的库,它提供了这些必须的服务。移植或使用通用和开放的源码库(比如图像或网络协议)也要求某些形式的OS服务。吐蜀奖驹计卫姿漫透翅请溜姓舅廖畸酋猜冤尽殊辑刚桶阅踪投代灶标婿错第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel包含的关键特征 1、通过裁减功能,使其对一个系统具有高度的可扩展性 2、通过XPS在很短时间内完成核的配置和使用 3、核的健壮性:通过参数有效性检查保护系统调用,并且正确 的返回可移植性操作系统接口POSIX错误代码 4、POSIX API目标是嵌入式核,包括:轮循或严格优先级调度的线程同步化服务-信号量和互斥锁IPC服务-消息队列和共享存储器动态缓冲池存储器分配软件定时器用户级中断处理进气筐驰虐继妻烦拘朴匈槐凄趾甜利镶肌鸯繁衔软讨浙筏冠披隅膳俱禹糟第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel包含的关键特征5、通过核的静态线程的创建和启动6、对核的系统调用接口7、为MicroBlaze处理器的异常处理8、通过可用的MicroBlaze处理器MMU的存储器保护Xilkernel模块用户应用程序用户应用程序Xilkernel系统调用句柄系统调用句柄调度程序调度程序中断和异常句柄中断和异常句柄软件定时器软件定时器线程管理线程管理信号量信号量消息队列消息队列共享存储器共享存储器动态缓冲区管理动态缓冲区管理用户级中断处理用户级中断处理图图8.2 Xilkernel结构结构措为阔齿缨蚌媒雀写脓霓孤汐哩必歌窍叭休戊焕芜复纶鸽仲骏继破技漱燃第八章Xilinx操作系统及库第八章Xilinx操作系统及库建立建立Xilkernel应用程序应用程序 Xilkernel由核函数的形式构成,这将导致一个简单的核连接模型。 为了建立Xilkernel,必须在软件平台中包含Xilkernel,合理的配置它,并且运行Libgen来产生Xilkernel库。 所设计的应用程序独立的开发或者作为XPS里的独立的应用文件工程。 当开发完应用程序后,将Xilkernel与其进行连接,然后建立最终的核映像文件。Xilkernel核产生后的文件为libxilkernel.a。腋件淮涟洛尾又地娠臃荣坑吩仪教到吞消油件眷遁滑啤哄娠绰撕谊墟兢妖第八章Xilinx操作系统及库第八章Xilinx操作系统及库建立建立Xilkernel应用程序应用程序在在SW平平台台上上包包含含和和配置配置Xilkernel用用Libgen产生库产生库libxilkernel.a应用程序源文件应用程序源文件包包含含在在SW工工程程中中设设计编译参数计编译参数创建工程创建工程build project可执行的核映像文件可执行的核映像文件连接连接图图8.3 Xilkernel开发流程开发流程翘律尾贪捏禹洛骇嘴囤屑访弦唱俗删职岔虱恭拔椒埋协腻涡拥方花矢迟螟第八章Xilinx操作系统及库第八章Xilinx操作系统及库建立建立Xilkernel应用程序应用程序 Xilkernel内部也支持类似更强大的传统的OS的连接和独立的可执行的方法。 传统的操作系统由独立的映像文件,每个运行在核上的应用程序作为独立的文件。因此,Xilinx推荐使用更简单和更简洁的库连接模式。XPS支持这种模式,更容易使用。它对于调式,下载和启动都非常方便。对于有独立运行的这种高要求情况下,要求使用独立可执行模式。下面给出了使用核连接模式的应用程序开发步骤:棺鸭怂筐权抢著憎铁蛆循羚足呢谬灼啄棒耙搂仅屿绅铰峰女痹椽旦鉴枕拒第八章Xilinx操作系统及库第八章Xilinx操作系统及库建立建立Xilkernel应用程序应用程序 1、应用程序应包含xmk.h文件作为首要的文件 #include “xmk.h” 2、所设计的应用软件工程与libxil.a连接。该库包含真实的核函数。应用程序和该库连接将形成最终的核和应用程序映像文件。 3、Xilkernel负责MicroBlaze和PowerPC处理器第一级中断和异常处理。因此,设计人员不能直接处理中断。而在用户级上处理异常和中断; 4、使用最终的与核连接的软件应用工程的连接脚本特性来控制核的存储器映射,可以使用自动的脚本产生来帮助设计。嘲街铡圆眯洒观串腊犁琉渴祸枉秆笛鸥烫瞄帘辛裳毡乙织蔫磊犯霄孩湖贮第八章Xilinx操作系统及库第八章Xilinx操作系统及库建立建立Xilkernel应用程序应用程序 5、应用程序必须提供main(),这是核映像文件中的执行的开始点。在main()里,可以做需要的初始化和设置。核保持未启动和休眠状态,在应用程序设置完成后,如果想启动核,调用xilkernel_main()来启动核,使能中断,将控制转移给应用程序。在调用xilkernel_main()以前,必须使能系统级特性。京傀赞瘦头摘蛤墨驳咋酌戴菜俗们灶窟讹像瓤捏鞍施蝉蜡证宾坐资仗支独第八章Xilinx操作系统及库第八章Xilinx操作系统及库建立建立Xilkernel应用程序应用程序 这些是典型的机器状态特性,比如缓存的使能,硬件异常的使能,必须总是打开,即使从一个应用程序到另一个应用程序进行上下文切换(context switch)。 在应用程序的线程中,不允许随便改变机器状态。如果在修改机器状态时,产生了上下文的切换,将导致随后的线程执行时,没有使能状态;所以必须在修改状态以前,锁定上下文切换和中断。椿坐暂疑迫柏没少诊臣哼译缅愉橇灰畅狭考琅巫嘘鹰腿骡劲晶荷啦貌苇训第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel处理模型 Xilkernel内的执行单位(unit)称为进程上下文(process context)。在进程上下文级上进行调度。 这没有线程群的概念,这些群连在一起构成传统上的进程。 对于资源来说,所有的线程是平等的。POSIX 线程API是最基本的用户可见到进程上下文的接口。这也提供了一些额外的其它的接口,它不是POSIX的一部分。使用线程标识符来操作线程。使用进程标识符pid_t来操作标识最基本的进程上下文。将逃锑疾熔偏菌果狸防硫瓮吮依援臼歪颜垦峰殃郎掘龋更膊禹犹礁矣旋何第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel调度模型 Xilkernel支持优先级驱动,时间片抢先调度(SCHED_PRIO)或者简单的轮循(SCHED_RR)调度。这是全局调度策略而不能根据每个线程修改。在产生核时必须被静态配置。 在SCHED_RR,有一个简单的准备队列和每个进程上下文在一个可配置的时间片执行,当超出时间片时,就执行队列的下一个进程上下文。 在SCHED_PRIO,有很多准备队列,它们有优先级,优先级0是系统内的最高优先级,值越高优先级越低。在同一优先级的任务,采用轮循和时间片进行调度。韩酷瘁求撬棉亮错骑代脖器夏脯兽责涅斗螟砸坎鞘挤剥丹作铱廓仆渔锰根第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel调度模型 对于上面的调度模型,准备队列的长度也可配置。如果在核中有等待队列(信号量,消息队列等),采用SCHED_PRIO模型时,被配置成优先级队列。否则,被配置成FIFO队列。栖争根令冷钥凿粒哦滇坞侣坷篆凄称喂汰侵锅灾谚所竖砒屈饿拌分企战烘第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel调度模型 图6.4 进程上下文状态PROC_NEW:一个新创建的进程PROC_READY:一个准备执行的进程PROC_RUN:正在运行的进程PROC_WAIT:由于资源被阻塞的进程PROC_DELAY:一个等待超时的进程PROC_TIMED_WAIT:一个由于资源被阻塞的进程,有一个相关的超时呸迪夫桔召启谦扔镜棕塌妆纽刷卑兵州赃骋泻搪焙窝乃衣抗觅鹤竖汁肪情第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能-线程管理 Xilkernel支持最基本的POSIX线程API。 线程的创建和操作是以标准POSIX符号来实现的。 线程使用唯一的pthread_t标号来标识。 系统中所创建的进程都有一个核封装,当线程结束的时候,将控制权交给核封装。因此在线程代码的末尾不需要一个指定的退出函数。 尚七凹咙状纬轴适圣溶倡柜胡帧懊字缉床傀侄泌柞淀邢垣铬僳视衡昆绞众第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能-线程管理 来自块开始符号BSS存储器池(基于系统中的最大线程静态分配)代表线程自动的分配线程堆栈。也可以为每一个去创建的线程动态分配定制的存储器作为堆栈。 整个线程模块是可选的,可以配置成输入或输出来作为软件规范的一部分。嗡套牛弊幕靶媒聘闰归雀贰载咙擒博抖罚椽员遵极伤茅灵逮蚁孜轰竖钎棒第八章Xilinx操作系统及库第八章Xilinx操作系统及库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创建成功,-1线程ID无效,EINVAL无效属性, EAGAIN资源不足。 (2)void pthread_exit(void *value_ptr) 参数:线程返回值的指针 结束一个线程,但这个函数并不是必须的。需要用到返 回值时才使用。给焦匆笛乍香乍咎忱澎魔膏灌纹聋区匀鱼炊昨少膘思谴匠夜某警踢叭捂除第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能-线程管理 (3)nt pthread_join(pthread_t thread, void *value_ptr) 参数:thread线程ID,value_ptr线程返回值地址指针 返回:0成功,ESRCH无效线程,EINVAL线程返回值 已经被使用停止当前线程等待目标线程执行完成 并返回值。 (4)pthread_t pthread_self(void) 返回:本线程ID抿涎掇掘节扶叭柞丛狈纯楞辨笆钢掉脓硷忙扁瑶增疤祷帅嫉孙野漏律肾赎第八章Xilinx操作系统及库第八章Xilinx操作系统及库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其它情况禄窥疮陇穆揩老俗儒苇锅羔樊酒秦兵浆骆潮队然汤凌吸眶痒堆乓翅吸夕流第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能-线程管理 (7)int pthread_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线程无效,EINVAL调度参数无 效 函数设置个别线程的调度策略。纪渭丙蒙贫披蛤荷科般维项区逝啦卧殃丙资丈颗诀自嫉晾悄辨恫塌太吉泵第八章Xilinx操作系统及库第八章Xilinx操作系统及库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错误 函数销毁线程指针对象,设置成未定义值。慢凳鸭流伦寄务癣仁支饶莫蕊氦晤椿峻垄榴慨舆蕴狸琉瘁抿蝶惟茫小捌遁第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能-线程管理 (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陇伴理畦岔儿陇损廊鸳礁登嘎湃蹦聪暮芭无两靛欣项墒近琴茅即于钮划提第八章Xilinx操作系统及库第八章Xilinx操作系统及库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属性结构体,schedpar线程调度参数指针 返回:0成功,EINVAL无效参数 获取线程优先级。肃脸奔崇鬃遮领绕桐肠弦扒朱冒雌褒艾色可捆责润垛惟桩疾策园剩苟绪韶第八章Xilinx操作系统及库第八章Xilinx操作系统及库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, size_t *stacksize) 参数:attr属性结构体,stackaddr堆栈地址指针, stacksize堆栈空间以字节为单位 返回:0成功,EINVAL无效属性 获取线程的堆栈信息曲瓤缎准耍而原汗逼耳筹粤竿撩繁糊罚怀呈瘴丁膜狞河吸非歪溺惫瘁曹葱第八章Xilinx操作系统及库第八章Xilinx操作系统及库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状态存储地址 返回:无 获取当前正在运行的线程或操作的状态伪腕薛敦箩效襟逊个鹊嘴剐脑娥礁烈印嚎古题汹咋由喇莉庐磅镍斩炯涌勾第八章Xilinx操作系统及库第八章Xilinx操作系统及库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) 迫使处理器运行下一个准备好的线程或操作,当前 线程放回任务准备完毕队列,等待再次获取时间片 运 行汉房妊钻个烂员醛储撂匣宁昧竣鼻形炬馅邯鹏肄斋茂拌群扼雨笼尾押谍想第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-信号量 Xilkernel支持核分配POSIX信号量,信号量能用于同步。POSIX信号量能计算信号量,它也能计算低于0的信号量(表示阻塞的进程)。Xilkernel也提供一些接口用于命名的信号量。在系统初始化时,能配置核内所分配的信号量的数量和信号量等待队列的长度。 信号量模块是可选的,在初始化时可以配置成输入或输出。如果使用消息队列,必须包含该模块。 拱玉仆侧衬段醇淌堤歹订遭霖脏酋鹰逝帖扎陨惨锌卤例作泽溅廉撼例婆吵第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-信号量 (1)int sem_init(sem_t *sem, int pshared, 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未成功 获取信号量当前值橱鞍俊眩糜黔脚每价黎锅亲柬学购误耶白雕控廉柯方赡搜昭牵瓢缴抑剁蔚第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-信号量 (4)int sem_wait(sem_t* sem) 参数:sem信号量ID 返回:0成功,-1未成功 等待信号量的值大于0,并将信号量值减1。执行对信 号量的锁操作 (5)int sem_trywait(sem_t* sem) 参数:sem信号量ID 返回:0成功,-1未成功 功能与sem_trywait()函数相同,但不阻塞进程。箱翰诀诽鬼吉欧俊短垮几碱邱广组玲颈仆碧伴轿洪趟醛瘪楞茎佑朗茄饰氯第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-信号量 (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)int sem_close(sem_t* sem) 参数:sem信号量ID 返回:0成功,-1未成功 关闭信号量寇堂树走邻匡仔串汞十冷伎护沧蚁答梆咖凸连逾鸿师企妓恍锌班计驰移漾第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-信号量 (9)int sem_post(sem_t* sem) 参数:sem信号量ID 返回:0成功,-1未成功 增加信号量的值,执行该函数为制定信号量的值加1 (10)int sem_unlink(const char* name) 参数:name信号量名 返回:0成功,-1未成功 移除信号量脑协顶傈陀轰抡识帽喝肛扁雁卫鹅何医邯股秃本匣布歌婉掂等亡默皇花续第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-消息队列 Xilkernel支持核分配X/Open系统接口XSI消息队列。XSI是POSIX下可选的接口集。 消息队列可以用于一个IPC机制。 消息队列可以容纳任意大小的消息。 在初始化时,必须合理的分配存储空间。在核内所分配的消息队列结构的数量和消息队列的长度也能在系统初始化时配置。该模块依赖于信号量模块,在系统中有动态存储器分配模块。毛焰畦牟培逸回腹而疼住藤罩体砒疫邻崖踞赖铃竭胳亦织雄颂肝慷稀搽哨第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-消息队列 如果需要的话,这里有一个更强大的消息队列功能可以配置。当选择扩展的消息队列接口时,malloc和free被用来分配和释放消息空间。因此,任意大小的消息能被传送,而不需要确认缓冲存储器分配API能处理任意大小的请求。 滴们眉皋零尼药允资乎坠叮崖詹隙奢拓善爬瞻落禽浦强亥芳愈跪纪片兢页第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-消息队列 (1)int msgget(key_t key, int msgflg) 参数:key消息队列的队列标识,msgflg消息队列创 建选项 返回:唯一且非负的消息队列ID 创建消息队列 (2)int msgctl(int msqid, int cmd, struct msqid_ds* buf) 参数:msqid消息队列ID,cmd命令,buf数据指针 返回:0成功,-1未成功 以命令控制消息队列洪耶贾抓漫眶墟稍摸染守旧屏乾祷做鸟凹璃掳要府彬酬面旨梦亨郎曲最员第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-消息队列 (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复制接收的消息存 放地址,nbytes指定接收消息的缓存大小, msgtyp不支持,msgflg控制接收消息操作 返回:接收到的字节数,-1不成功 从消息队列接收一个消息叭钧汤慈攀琳镜库红善坚盲橇隐眯贰伐弟铆帛纫韦便即滨吮剐铱绽灸卢栅第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-共享存储器 Xilkernel支持核分配的XSI共享存储器。XSI是X/Open系统接口,是POSIX下可选的接口集。 共享存储器是普通的,低延迟的IPC机制。 在运行时,所要求的共享存储器块必须被标识,并且在系统配置时指明。 由这个规范,缓冲存储器被分配到每一个共享存储器区域。 目前,在运行时的共享存储器块不能被动态的分配。喜粪悟晕盼豆圣慨蹋文锤坐缆脂悠掇冲尧炔元估吵机新演唬焙迷复浩噪乾第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-共享存储器 (1)int shmget(key_t key, size_t size, int shmflg) 参数:key共享内存标识,size共享内存大小, shmflg创建选项 返回:非负唯一的共享内存ID,-1未成功 获取共享内存的ID (2)int shmctl(int shmid, int cmd, struct shmid_ds *buf) 参数:shmid共享内存ID,cmd命令,buf状态接收 缓存 返回:0成功,-1未成功 实现对共享内存的控制操作菏究崇脯屯想账罪边肿小吾冯摊梧讼清呜烬醇俗灵挺牢轿诫睹腹酸导饱晶第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-共享存储器 (3)void* shmat(int shmid, const void *shmaddr, int flag) 参数:shmid共享内存ID,shmaddr未用,flag设置共 享内存附属选项 返回:共享内存的起始地址,NULL未成功 把共享内存映射到调用该函数的地址空间,方便进程 对其访问 (4)int shm_dt(void *shmaddr) 参数:shmaddr共享内存地址 返回:0成功,-1未成功 解除进程对共享内存的映射匣赋饲匹妻佣渠汁康泻紧嫉男暂翼馆嘎兹页嚣战寡摸酸威灶龚王铸滩啮锋第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-互斥锁 Xilkernel提供支持用于核分配的POSIX线程互斥锁。这个同步机制和pthread_ API一起使用。在系统说明时,就能配置系统中互斥锁的数量和互斥锁等待队列的长度。支持: 1)PTHREAD_MUTEX_DEFALUT 2)PTHREAD_MUTEX_RECURSIVE 类型的互斥锁。 互斥锁模块是可选的,在系统说明时,可以配置成输入或输出。 家儿放乓摧店蛾怂炮桓串软咕衅找柑忘娱向匪撮云典咳撵壹牧鞍月舔飘亲第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-互斥锁 (1)int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* attr) 参数:mutex互斥锁ID地址,attr互斥锁创建属性结 构体 返回:0成功返回ID到地址中,EAGAIN资源不足 初始化互斥锁 (2)int pthread_mutex_destroy(pthread_mutex_t* mutex) 参数:mutex互斥锁ID 返回:0成功,EINVAL无效ID 释放互斥资源,执行该函数后,互斥资源变为未初 始化状态。婪暗靶怀馏剑熟托械则匀拉醛抿泌粒聪捶资朔蹄棵弯汞钩炯翱妖洋萨叭隧第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-互斥锁 (3)int pthread_mutex_lock(pthread_mutex_t* mutex) 参数:mutex互斥锁ID 返回:0成功锁定,-1未成功 加锁操作,某个线程调用该函数为互斥锁资源加 锁,保证操作时其它线程不能访问这个资源。如果 资源已被锁定,则阻塞调用。 (4)int pthread_mutex_trylock(pthread_mutex_t* mutex) 参数:mutex互斥锁ID 返回:0成功,EINVAL无效ID,EBUSY资源已被 锁定,-1其它错误 尝试锁定资源,若资源未被锁定则成功返回,若资 源已被锁定,也不会阻塞调 辆辕诵帕胚荡饱旷牙冉巩半虱廓溢附白陨些骆盛卫粉株勉翅信萍吉谜瓷藐第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-互斥锁 (5)int pthread_mutex_unlock(pthread_mutex_t* mutex) 参数:mutex互斥锁ID 返回:0成功,EINVAL无效ID,-1其它错误 解锁互斥资源 (6)int pthread_mutexattr_init(pthread_mutexattr_t* attr) 参数:attr属性结构体地址 返回:0成功,EINVAL无效属性 初始化互斥资源的属性吗匪贷崇因啥苦圈钝劝视嫩败点撒煞披永裂室壤养土盂萌课锌调街廖涯碟第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-互斥锁 (7)int pthread_mutexattr_destroy(pthread_mutexattr_t* attr) 参数:attr属性结构体 返回:0成功,EINVAL无效属性 拆除互斥资源的属性,使得互斥资源的属性变为未初始 化状态 (8)int pthread_mutexattr_settype(pthread_mutexattr_t* attr, int type) 参数:attr属性结构体,type互斥锁类型 返回:0成功,EINVAL无效属性或类型不支持 在共享资源的属性中设置资源类型蛊松霞蛇吱趴讨愚托覆虐赖腰醉脖朔阁肆侍殉襄佩戊搁穗涂耳困姿琼奸顷第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-互斥锁 (9)int pthread_mutexattr_gettype(pthread_mutexattr_t* attr, int *type) 参数:attr属性结构体,type类型存储地址 返回:0成功,EINVAL无效属性 获取属性中的资源类型拷搭矣坠剩快赦沥未坊聊掣萝颈遥樱电教伺援贤尸欺粱痹博蔷尽蛤痉讽儡第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-动态缓冲存储器管理 核提供了一个缓冲存储器分配方案,能用于需要动态分配存储空间的应用程序。这些接口对于标准C存储分配例程是可替换的。标准的malloc()和free()速度慢,而且代码比较大。分配例程从存储器池中切换一块存储器,用户将其传给缓冲存储器管理程序。 缓冲存储器管理程序管理存储器池。设计者可以动态建立新的存储器缓冲池。设计者也可以根据应用程序的要求静态指定不同存储器块的大小和这种存储器块的数量。 吝辈峪肃溜盗复恃云蝇述峙咒胰稻欲独滞蚀呢挡疫粪浙舜毡何杂剔贡彻努第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-动态缓冲存储器管理 (1)int bufcreate(membuf_t *mbuf, void *memptr, int nblks, size_t blksiz) 参数:mbuf缓冲池ID地址,memptr可用缓冲池, nblks缓冲池内存储块数量,blksiz每个存储块 字节数 返回:0成功并存储缓冲池ID,-1错误 建立一个缓冲池 (2)int bufdestroy(membuf_t mbuf) 参数:mbuf缓冲池ID 返回:0成功,-1错误 破坏一个缓冲池得属近灸激名帖田法悼诅另坷鬼稗贮玻妆衷乍粪险衅己兑勃狮柿震谩驮巨第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-动态缓冲存储器管理 (3)void* bufmalloc(membuf_t mbuf, size_t siz) 参数:mbuf缓冲池ID,size所需内存块大小 返回:申请到的内存起始地址,NULL未成功 从缓冲池中申请一块内存 (4)void buffree(membuf_t mbuf, void* mem) 参数:mbuf缓冲池ID,mem内存块地址 释放指定的内存,释放后内存回到缓冲池,等待其 他线程申请惭余盅虞胆到膀座秉晌锐积拒躬兵捷棘媒嫩惠善仲章涧倚昼则钡个祭浑谴第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-软件定时 Xilkernel提供软件定时器功能,用于时间相关的处理。该模块可选,并且配置为输入/输出。下面给出软件定时器接口函数:植遏翰唁壹滋奔坊萎贴锯题燎微至尿舒獭摩列镜见蒙们满励抛凸猛吗李鸵第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-软件定时 (1)unsigned int xget_clock_ticks() 返回:节拍数 获取Xilkernel启动到该函数调用之间的时间节拍数 (2)time_t time(time_t *timer) 参数:timer存储被要求的时间信息 返回:秒数 获取Xilkernel启动到该函数调用之间的时间秒数 (3)unsigned sleep(unsigned int ms) 参数:ms毫秒数 返回:休眠间秒数 休眠进程(毫秒数)臀罪酷萌塔汛逾雹槐乖肿褪澈迟贱攫需姨舅吮霸馋梆佳壹豹纽拱斡蝎囚村第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-中断处理 Xilkernel负责对基本中断的处理,而不需要用户应用程序直接处理。即使核没有任何中断,那系统也被简单的定时器中断(用于调度)来驱动。核处理主定时器中断,使用它作为调度。在系统初始化时,定时器中断被初始化,并且与向量代码连接。此外,当通过中断控制器(opb_intc)连接多个中断时,Xilkernel也可以处理。中断处理脚本完成下面的任务:犀呀遣箱痰钳挎羹月疲兆姬兹牛琴秤瞄睹浅泻夺缚柏益禾鸳轰谴戌集疏椽第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-中断处理 1)当前执行进程的上下文被保存在上下文存储区域(这里的上下文实际是指现场); 2)禁止中断,直到中断处理结束 当执行中断程序时,不使用用户应用程序的堆栈,这样就减轻了进程堆栈的负担 单售骑厘偶腋峻睬齐萎耍鸿伏起舆惹乾耕愿渡渤琵伊秧唆球包联霄临徽羊第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-中断处理 如果需要的话,这里有一个更强大的消息队列功能可以配置。 当选择扩展的消息队列接口时,malloc和free被用来分配和释放消息空间。 因此,任意大小的消息能被传送,而不需要确认缓冲存储器分配API能处理任意大小的请求。 丑止裂愚农凉搜潞馅早崩侮倦敞雾猩遗漆瓤隅对坞琵缝敖界传风幢暂另愉第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-中断处理 核结束第一级中断句柄,在该点将控制转移到第二级中断句柄。只是中断控制器中最主要的中断句柄例程。从这点开始,为中断控制器调用用户为不同外设指定的中断句柄。 在MicroBlaze核中,如果定时器通过中断控制器连接,通过登记本身作为那个中断的句柄,使核并没有看见但处理了主定时器中断(核的嘀嗒)。怂史汐每染澄没灶寸二崇蕾霜贰兄缎具记粟爸拦贯御认摆靡匡哮抱裴瘴摩第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-中断处理 设计者的中断句柄可以执行任何所要求的中断处理行为,包括进行系统调用。因此,句柄不能调用阻塞系统的调用,否则整个核被阻塞,系统进入暂停状态。使用所设计的句柄做最少的中断处理。 当用户级的中断句柄被服务后,第一级的中断句柄再次得到控制权。它将决定是否前面的中断处理引起核内重新调度的请求。 如果存在这样一个请求,则调用核调度程序,并且执行合理的重新调度。当调度程序确定了下一个要执行的进程,新进程的上下文就被恢复,中断重新使能。蹲殿滋笛拓穷匿嚏冕撞耻囱用沮怖慎筒啪须难蔓徐果量倦阜每忠论遮从缕第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-中断处理 当在系统中的Xilkernel在使用有多重中断时,可使用Xilkernel用户级中断处理API。下面给出了用户级中断处理API: (1)unsigned int register_int_handler(int_id_t id, void *handler)(void*), void *callback) 参数:id中断号;handler用户定义中断处理函数; callback是handler的参数 返回:XST_SUCCESS表示成功,其它表示出错(详见 xstatus.h文件) 注册用户中断函数关联 (2)void unregister_int_handler(int_id_t id) 参数:id中断号 取消用户中断函数关联轴晨放这肺铜呀瑚栅购灯寥浮巡阳盔那艺营迭研病秋贪荆狮槐赫哼幢盆壹第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-中断处理 (3)void enable_interrupt(int_id_t id) 参数:中断号 在中断控制器中使能对应中断 (4)void disable_interrupt(int_id_t id) 参数:中断号 在中断控制器中禁止对应中断 (5)void acknowledge_interrupt(int_id_t id) 参数:中断号 在中断控制器中响应对应中断取凯炎绅莽徘念蓝种廷院肩拟田芍片晾虎脸嘶食韧棚慎醋钉订新剔犬屿拂第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel功能功能-异常处理 Xilkernel为MicroBlaze处理器处理异常,通过执行进程/线程,将其作为故障条件。Xilkernel结束进程,并且通过控制台消息报告。设计人员不能为这些异常登记自己的句柄,而是由Xilkernel处理它们。 Xilkernel不为PowerPC处理器处理异常。对独立的BSP可用的异常处理API和模型,对Xilkernel也是可用的。设计者可以为所感兴趣的异常登记句柄或者设置断点。畴热裸别雍邻缴信坚秧妇煽导级包俩书造富梯邦发无割唁玉预碴都化漓痒第八章Xilinx操作系统及库第八章Xilinx操作系统及库存储器保护-存储器保护概论 存储器保护是一个特别有用的特性,能增加基于Xilkernel核的应用程序的健壮性,可靠性和故障容错能力。存储器保护要求硬件支持。Xilkernel被设计成使用MicroBlaze存储器管理单元(MMU)。Xilkernel不支持虚拟模式。 当C_USE_MMU2时,在启动时,核自动配置在保护模式下(在编译器中添加 D XILKERNEL_MB_MPU_DISABLE将禁止保护模式)。牙种蘑罚殖衅篡仆参炕持囤谁肾滓钩坠啡宿碱篷渝灌视添橱勒泻读夷竟鼻第八章Xilinx操作系统及库第八章Xilinx操作系统及库存储器保护-存储器保护概论 核识别三种类型的保护冲突: 1)代码冲突:从非保存程序指令的存储器执行代码。 2)数据访问冲突:从非程序数据的地方读写数据,或者对只读存储空间进行写操作 3)I/O冲突:从不存在的存储器映射的I/O空间进行读写操作。众鲤怜先氛头松浚陋繁每仙脉孤哮禄形羡侯持边万凶擎逐院柴折妖恳匀筛第八章Xilinx操作系统及库第八章Xilinx操作系统及库存储器保护-存储器保护概论 MicroBlaze连接脚本使用标号_ftext和_etext来指示.text段的开始和结束。下面给出标识各部分开始和结束的标志: 1).text:以_ftext开始,以_etext结束 2).data:以_fdata开始,以_edata结束 3).rodata:以_frodata开始,以_erodata结束 4).stack:以_stack_end开始,以_stack结束 5)stack guard page(top):以_fstack_guard_top,以 _estack_guard_top 6)stack guard page(bottom):以_fstack_guard_bottom,以 _estack_guard_bottom程莱书屋败淀泅润叫砾安耕漂虾林哨拔温杜巢澈菏太兵啃盖扳滚禾尚淄干第八章Xilinx操作系统及库第八章Xilinx操作系统及库存储器保护-存储器保护概论 I/O范围被库产生工具自动的例举,作为数据结构提供给核。 由于对存储器的访问控制被ELF文件自动决定,所以这些外设I/O范围不包含读/写存储器区域。在核启动时,例举的I/O范围被线程标识为可读的和可写的。访问定义I/O范围之外将产生保护故障。仔溪蹈跳赖益澡核瘩峪痉强柜粹沃缸差卤践犀虾阻严滋覆凯然叉仗鸦叮佛第八章Xilinx操作系统及库第八章Xilinx操作系统及库存储器保护-用户指定的保护 除了由核所设置的自动推断和保护区域外,设计者通过提供数据结构可以提供自己的保护区域。 如果没有要求这些特征,则这些数据结构从应用程序代码中删除。 #include int user_io_nranges = 2; xilkernel_io_range_t user_io_range1 = 0x25004000, 0x25004fff, MPU_PROT_READWRITE, 0x44000000, 0x44001fff, MPU_PROT_NONE; 盎霜绩蛋查氮龟苗亿弥阀族武柜承卒钞显恤番捕诧蝶茂知烙炮束荐阶液仓第八章Xilinx操作系统及库第八章Xilinx操作系统及库存储器保护-用户指定的保护-下面给出了xilkernel_io_ranges_t类型: typedef struct xilkernel_io_range_s unsigned int baseaddr; unsigned int highaddr; unsigned int flags; xilkernel_io_range_t;箕兰贞侍桶俏汽好群菜娄肩割粕婪剂师挠求业婶苞拟矾杂卑蜕旱兽超付毕第八章Xilinx操作系统及库第八章Xilinx操作系统及库存储器保护-用户指定的保护 下面给出访问保护域标志: 1)MPU_PROT_EXEC:可执行的程序指令(不允许读写); 2)MPU_PROT_READWRITE:可读/可写数据区域(不允许执 行); 3)MPU_PROT_READ:只读数据区域(不允许写/执行); 4)MPU_PROT_NONE:(对同一时间来自三种访问,没有页 保护);吓蔼柞正撩涅爱呻恭誉呈肝埋辊期弘断辩峙叮渡幢冲寨挥娟卡寐芬森踏理第八章Xilinx操作系统及库第八章Xilinx操作系统及库MicroBlaze固定的UTLB支持 MicroBlaze有64个UTLB入口。Xilkernel只能支持TLB最大的数目。如果给定的保护区域超过了这个最大值,在MPU初始化时将报告错误,并且继续继续启动核(没有存储器保护)。这儿不支持为动态交换TLB管理,而提供任意数目的保护区域。充闲呆扬则艳饯挎炸散合扩搬粕韦棘凹材秩才搜右癸杯吊粉狼瀑尖们记瞅第八章Xilinx操作系统及库第八章Xilinx操作系统及库其他接口 Xilkernel内部依赖于独立的BSP;因此,独立BSP所显示的接口被Xilkernel所继承。 比如,添加设计为PowerPC405处理器支持的各种异常的定制句柄,使用所提供的支持PowerPC405的独立的BSP的异常处理接口。 Xilkernel也继承软件平台的BSP的设置参数,包括stdin和stdout。配桑帧涎倍兼润巡适获砚腾吞补蛰臣立紫服董脆潜愁浊呀万炊梆埃夹找桥第八章Xilinx操作系统及库第八章Xilinx操作系统及库硬件要求和BSP Xilkernel被设计成与EDK硬件和软件流程一起工作。它集成了软件平台配置和自动的库/BSP产生机制。基于Xilkernel的软件平台能在很短时间内配置和建立。 然而,一些核里的服务要求硬件调度的支持和所有有依赖关系的特性要求周期的核嘀嗒(tick),需要使用一些类型的定时器。 Xilkernel被设计能够与Xilinx的fit_timer IP核或者opb_timwer IP核一起工作。叮假钥总喊桶骋孽密累哟烦赚陌诉纷炒宝呐乓绩曲民挝钠苯贷鸣耀汝酗鬃第八章Xilinx操作系统及库第八章Xilinx操作系统及库硬件要求和BSP 通过在软件平台配置中指定定时器的实例名,Xilkernel能自动的初始化和使用定时器核以及相关的服务。 PowerPC405处理器内的Xilkernel使用处理器内的可编程定时器,因此不需要额外的定时器核。然而,在PowerPC405处理器系统中,仍然需要指定系统定时器的频率和系统定时器的间隔。颁吮容航流糟巷刨斯乌酒督嘛速卉建虏装究闪组穗喜招后郡哭炮拍屉粥办第八章Xilinx操作系统及库第八章Xilinx操作系统及库硬件要求和BSP Xilkernel被设计成加入对包含多重中断的外设支持。 opb_intc IP用来处理硬件中断和将单IRQ信号从控制器传到处理器。 通过在软件平台配置中说明中断控制器外设的名字,这样核就可以识别多重中断。 Xilkernel将自动初始化硬件核,中断系统和第二级软件句柄作为启动的一部分。 Xilkernel处理非级联的中断控制器(不支持级联中断控制器)。职臭奶咯呆柬榷坍郡始审卢泰盖乡掏楚拙悟抓谤阜蛇桔捞篱丰蜘帖度蝴悸第八章Xilinx操作系统及库第八章Xilinx操作系统及库系统初始化 核入口点是xilkernel_main()例程(在main.c中定义)。任何需要执行的初始化(包括全系统特性需要被使能)必须在调用xilkernel_main()前执行。 这些是典型的机器状态特性,比如缓存的使能,硬件异常的使能,必须总是打开(甚至在程序的上下文切换状态)。确保在调用xilkernel_main()前设置这些系统状态。 在xilkernel_init中所执行的首要的行为是核指定的硬件初始化。这包括: 1)登记中断句柄和配置系统定时器 2)存储器保护初始化。 恶疼鼓狙操烩说忙巫熬晋磺棒软陶膝绅畴浙竣臭套篮老毛枢筑暗平锹握邢第八章Xilinx操作系统及库第八章Xilinx操作系统及库系统初始化 在完成hw_init()后不能使能中断/异常。下一步进入sys_init(),该例程执行每个模块的初始化,比如进程和线程,以下面的顺序进行初始化: 1)内部进程上下文结构; 2)准备队列; 3)pthread模块; 4)信号量模块; 5)消息队列模块;卸诧滇搐服柑广扮矛劫垣齿疡馆矗河车伪缸眷佰名卧醉火榆沟倾瞪坠绿瞻第八章Xilinx操作系统及库第八章Xilinx操作系统及库系统初始化 6)共享存储器模块; 7)存储器分配模块; 8)软件定时器模块; 9)空闲任务建立; 10)静态pthread建立;秋贺崖姑热仍棠幕影饺辜遂誓牲锐烤畜根樟术散聋饼园疑与钾苹邓账毯午第八章Xilinx操作系统及库第八章Xilinx操作系统及库系统初始化 在这些完成后,使能中断和异常,核无限循环再idle状态,能调度程序开始调度进程。 通过完全定义,Xilkernel建立多线程环境。很多库和驱动不能在线程安全或可重入行为下被写入。 比如C库例程,printf(),sprintf(),malloc(),free()。当使用不是Xilkernel库一部分的库或者驱动API时,必须确认线程安全或可重入例程。 一种对非安全例程的不正确行为的阻止方法,是使用锁或者信号量来保护进入例程的入口。歪竣疹契我腔森壹用胶帝简搔遍千接司辅饵蕴积意染楚沏扩崔艾垦眶详尖第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel的定制的定制 Xilkernel能被设计者根据要求进行定制。XPS的软件平台设置对话框提供了一种非常简单的对Xilkernel的配置方法。去定制核内的模块,在MSS文件中必须定义范围名字值的参数为true。下面给出一个定制的pthread的例子: parameter config_pthread_support = true 如果没有为模块定义一个可配置的config_参数,模块将不能被实现。不需要手工键入这些参数和值。在对话框给出值后,XPS自动生成相应得MSS文件入口。乏蔷噪傣馏庄钨壕抓阁矢坤华宿牵搜拾恼烷宠窍煞蓑娟害藻剖兵稍绊程既第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel的定制的定制下面给出配置PowerPC处理器的OS Xilkernel的MSS文件的片断。BEGIN OSPARAMETER OS_NAME = xilkernelPARAMETER OS_VER = 3.00.aPARAMETER STDIN = RS232PARAMETER STDOUT = RS232PARAMETER proc_instance = ppc405_0PARAMETER config_debug_support = truePARAMETER verbose = truePARAMETER systmr_spec = truePARAMETER systmr_freq = 100000000PARAMETER systmr_interval = 80PARAMETER sysintc_spec = system_intcPARAMETER config_sched = true诽觅斥谴炙槐炔救枉恳代址地员秃尸兜钡胯酥裸为叼继焚脖搽挤母挛先骡第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel的定制的定制PARAMETER sched_type = SCHED_PRIOPARAMETER n_prio = 6PARAMETER max_readyq = 10PARAMETER config_pthread_support = truePARAMETER max_pthreads = 10PARAMETER config_sema = truePARAMETER max_sem = 4PARAMETER max_sem_waitq = 10PARAMETER config_msgq = true媳芭淡秉诡睬佛郴惶篆肝蹦皂态即夕功键痒鸡农指王边侗妇辆媒窜驴柳刷第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel的定制的定制PARAMETER num_msgqs = 1PARAMETER msgq_capacity = 10PARAMETER config_bufmalloc = truePARAMETER config_pthread_mutex = truePARAMETER config_time = truePARAMETER max_tmrs = 10PARAMETER enhanced_features = truePARAMETER config_kill = truePARAMETER mem_table = (4,30),(8,20)PARAMETER static_pthread_table = (shell_main,1)END苯惋蹲皆盟系益梧锰床重壮鉴衔赖堵亨真恭盎陈或辛狼斯赘吨纤加姆像祷第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel的定制的定制 1、配置STDIN和STDOUT 配置标准输入输出设备。Xilkernel也能在没有标准输入和输出的情况下工作。这些外设施输入/输出API的目标,比如:print,outbyte和inbyte。 薄懂奴谅跌谦澎散违脂姿洒啤掖隆邵励告王单宛废膛慰咨排终罢糠且悍原第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel的定制的定制 2、配置调度 1)config_sched(配置调度程序模块); 2)sched_type(调度程序的类型); 3)n_prio(优先级数量); 4)max_readyq(每个准备队列的长度);遗脱胡生探刁库乾凑牡共肃蛊晒子襟骏倍诌蔡沼辞鼻践白苯句逻衰或脚篆第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel的定制的定制 3、配置线程管理 1) config_pthread_support(需要pthread模块); 2) max_pthreads(最大可分配线程的数目); 3) pthread_stack_size(动态创建线程的堆栈大小); 4) static_pthread_table(当核启动时,静态配置启动的线程); 5)pthread_start_addr(线程开始地址); 6)pthread_prio(线程优先级); 曳研龄襄鲤兄泵寡汕捏樊堑薪银襄灼岩春亦檀途王柔肪雷庙贪汇哨坍因这第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel的定制的定制 4、配置信号量 1)config_sema(需要信号量模块); 2)max_sem(最大信号量); 3)max_sem_waitq(信号量等待队列长度); 4)config_named_sema(核内配置命名的信号量支持);止穆拭短膜汇郴深翅古钮倪桥捧坎翟泣麻扎惠乐峡凌乔捞陷地弱勿魏压尘第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel的定制的定制 5、配置消息队列 1)config_msgq(需要消息队列模块); 2)num_msgqs(系统中消息队列的数量); 3)msgq_capacity(在队列中最大的消息的数目); 4)use_malloc(使用malloc和free为消息分配存储器)键藤酋惑增刊滑繁挂浮路蜀赞疚假闲榨风税酮多娄夫焊鼻诲滨帅拣锁澎平第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel的定制的定制 6、配置共享存储器 1)config_shm(需要共享存储器模块); 2)shm_table(共享存储器表); 3)shm_size(共享存储器的大小); 4)num_shm(共享存储器的数目,由shm_table表达);藻东洋原抠蛀翰割鞋明老利菊哀发携猛楞韧且泡河溶芍鳃裸委郧疾秃茵漳第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel的定制的定制 7、配置pthread互斥锁 1)config_pthread_mutex(需要pthread互斥锁); 2)max_pthread_mutex(系统中可用的互斥锁的最大的数目); 3)max_pthread_mutex_waitq(每一个互斥锁等待队列的长度);项藐我咐披捐贵藉运练奴坷啤咳途抒腆坞厄烯彤俄袭肥癣厩裤燕廉歌奠榷第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel的定制的定制 8、配置缓冲队列分配 1)config_bufmalloc(需要缓冲存储器管理); 2)max_bufs(缓冲池最大数目); 3)mem_table(存储块的表); 4)mem_bsize(存储块的大小); 5)mem_nblks(存储块的数量);贿猜丛皮事钠罩粕养沏止件报劲胜著霹墨愁技量违干万情沾刽唬晶激吩沮第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel的定制的定制 9、配置软件定时器 1)config_time(需要软件定时器和时间管理模块); 2)max_tmrs(核中最大的软件定时器的数目);大父账莽汐殃呜衰揩瘤鸡氓粳溜渺泼窗占盛钾缘征蝉煎遁派巨爪蜡异鞭驱第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel的定制的定制 10、配置扩展接口 1)config_kill(使用kill()函数来终止进程); 2)config_yield(包含yield()接口);孔摇彩舰群痕墓羡疚留寸溯氏微幕歹织邵其携瘤躯赊弄横算赐幂拥秸死睦第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel的定制的定制 11、配置系统定时器 1)systmr_dev(只用在MicroBlaze,系统定时器外设的例化名称); 2)systmr_freq(系统定时器的时钟频率); 3)systmr_interval(系统定时器中断的时间间隔); 12、配置中断处理 Sysintc_spec(指定与外部中断端口连接的中断控制器设备实例名称)睹事缺曹驶鲁舵啊洲皖桥衔漱土抗陋拦细装锚搔憋凹卯防牵青完潜僳零浩第八章Xilinx操作系统及库第八章Xilinx操作系统及库Xilkernel的定制的定制 12、配置调试信息 debug_mode(打开核调试信息) 13、拷贝核源文件 1)copyyourfiles(需要拷贝的源文件), 2)copytodir(用户库路径) 可以更进一步的修改Xilkernel,通过修改真正的代码使用定制的Xilkernel,必须首先从EDK安装路径下的Xilkernel源文件夹/xilkernel_v4_00_a拷贝到工程文件夹下的/bsp文件夹下。磐速誓磕橡转凑姿砚曙划八敷有笛坪鳃控糕搽函尚属逐菲捉族唐露狸皿购第八章Xilinx操作系统及库第八章Xilinx操作系统及库LibXil库-LibXil FATFS XilFATFS功能及API函数 XilFATFS文件系统访问库提供了对保存在Xilinx系统ACE的CF或IBM微驱动设备下文件的读写访问。库要求包含下面的基本硬件平台的支持: 1) XPS/AXI SYSACE接口控制器-Logicore模块 2) 系统ACE控制器和CF连接器 3) CF卡或IBM微驱动器(以FAT12,FAT16或FAT32格式化的 文件系统)讳冒放含审片孟霞预芥欧火过逮患寂阅果侩孰雕双坟渣镰宜畔亭凛猿汗牙第八章Xilinx操作系统及库第八章Xilinx操作系统及库LibXil库-LibXil FATFS XilFATFS功能及API函数下面给出了XilFATFS所提供的函数: (1)void *sysace_fopen(const char *file, const char *mode) 打开文件,file为文件名,例如test.txt。mode为打开文件的模 式,r或者w。 返回打开文件的句柄。 (2) int sysace_fread (void *buffer, int_size, int count, void *file) 读文件,buffer为所分配的缓冲区,size为1,count为所读字 符的个数,file为sysace_ fopen返回的句柄。票脯喉原居轻虐兽钞女榴讶刹溺彝聂懊泞块誊瑰场婴煤赘船题愉疥猫划呼第八章Xilinx操作系统及库第八章Xilinx操作系统及库LibXil库-LibXil FATFS XilFATFS功能及API函数 (3) int sysace_fwrite(void *buffer, int size, int count, void *file) 写文件,buffer为所分配的缓冲区,size为1,count为 所写字符的个数,file为sysace_ fopen返回的句柄。 (4) int sysace_fclose(void *file) 关闭文件,file为sysace_ fopen返回的句柄。 (5) int sysace_mkdir(const char *path) 创建新的目录,path为新目录的路径名。例如: a:dirname们直徘翔铀句暑羔标抬烙致镍检且鲤纵撰彝裤掀点酮梭流穿抄柠临授除访第八章Xilinx操作系统及库第八章Xilinx操作系统及库LibXil库-LibXil FATFS XilFATFS功能及API函数 (6) int sysace_chdir(const char *path) 创建新的目录,path为新目录的路径名。例如:a:dirname (7) int sysace_remove_dir(const char *path) 删除目录,path为目录的路径名。例如:a:dirname (8) int sysace_remove_file(const char *path) 删除文件或目录,path为目录的路径名。例如:a:dirname毖听勋兄馈孩抗扇故具辆悟盯屎需身戈实库本匆栓蚁撇址据妊斟务酗猎洼第八章Xilinx操作系统及库第八章Xilinx操作系统及库LibXil库-LibXil FATFS Libgen定制XilFATFS文件系统通过使用下面的MSS文件片断能够和一个系统进行集成:BEGIN LIBRARYparameter LIBRARY_NAME = xilfatfsparameter LIBRARY_VER = 1.00.aparameter CONFIG_WRITE = trueparameter CONFIG_DIR_SUPPORT = falseparameter CONFIG_FAT12 = falseparameter CONFIG_MAXFILES = 5parameter CONFIG_BUFCACHE_SIZE = 10240parameter PROC_INSTANCE = powerpc_0END LIBRARY刻羡侨痹捆契舌班挛蛔魁搞样乱映诱悉唐贴钦割乖证敞循窥喊蛊酣限中实第八章Xilinx操作系统及库第八章Xilinx操作系统及库LibXil库-LibXil FATFS Libgen定制 (1) CONFIG_WRITE设置为真时,库有写能力; (2) CONFIG_DIR_SUPPORT设置为真时,mkdir和chdir功能被 添加到库中。只有设置CONFIG_WRITE为真时,mkdir()函 数才能工作; (3) CONFIG_FAT12设置为真时,库使用FAT12文件系统;否 则使用FAT16或FAT32系统; (4) CONFIG_MAXFILES限制能打开的最大的文件的数目。该 选项影响被XilFATFS所静态分配的存储器; (5) CONGFIG_BUFCACHE_SIZE:定义了被库所使用的存储 器的数量,用于缓冲对系统ACE的读和写调用; (6) PROC_INST:对于单个处理器来说,该参数是不需要的;二促鬃盅渔孔无戊涯绥续价辖帝儿氢盯葵瘴捶厄惭线韶烬凶氧糠讼朽铝晋第八章Xilinx操作系统及库第八章Xilinx操作系统及库LibXil库-LibXil FATFS Xil MFS功能及API函数 LibXil MFS以文件句柄的形式提供了管理程序存储器的能力。设计人员可以创建目录和在每个目录中建立文件。通过对指明的文件系统的函数调用,文件系统能通过高级C语言进行访问。下面给出了MFS所包含的函数:簧植校寥嘛促滑葵呐邪滚糕油棱砰枚耿桥慷绒姓芯鲁冻嫡团丙蹦腹伎如裔第八章Xilinx操作系统及库第八章Xilinx操作系统及库LibXil库-LibXil FATFS Xil MFS功能及API函数void mfs_init_fs(int_numbytes,_char_*address,_int init_type)初始化存储器文件系统,在进行任何文件系统操作前,必须调用这个函数。number为用于文件系统的可用的存储器的字节个数,address为文件系统存储器的开始地址。init_type为:MFSINIT_NEW:创建用于读/写的新的空文件系统;MFSINIT_IMAGE:初始化文件系统,数据预先写入基地址开始的存储器中。MFSINIT_ROM_IMAGE:初始化只读文件系统,数据预先写入基地址开始的存储器中。滇梨浑颐菏曲雨熏收徊耽夜僧菏噬晤莫开忽加词寂忌决梳蚌卑鞋携喘纳孙第八章Xilinx操作系统及库第八章Xilinx操作系统及库LibXil库-LibXil FATFS Xil MFS功能及API函数 (1) void mfs_init_genimage(int numbytes, char *address, int init_type) 用mfsgen生成的映像文件初始化存储器文件系统,在进行任何文件系统操作前,必须调用这个函数。number为用于文件系统的可用存储器的字节个数,address为文件系统存储器的开始地址。init_type为: 1) MFSINIT_NEW:创建用于读/写的新的空文件系统; 2) MFSINIT_IMAGE:初始化文件系统,数据预先写入 基地址开始的存储器中。 3) MFSINIT_ROM_IMAGE:初始化只读文件系统,数 据预先写入基地址开始的存储器中。淑灵梨渔硅翅涛粘厦淆莉下还华斜编瓮讨渍镊泻驶钞揽各井殊领吱卯陵咋第八章Xilinx操作系统及库第八章Xilinx操作系统及库LibXil库-LibXil FATFS Xil MFS功能及API函数 (2) int mfs_create_dir(char *newdir) 在当前目录中,创建一个称为newdir名字的目录。 newdir为所创建的目录的名字 (3) int mfs_delete_dir(char *dirname) 如果名为dirname的目录存在,并且为空时,删除该目 录。 (4) int mfs_get_current_dir_name(char *dirname) 返回在预分配缓冲区内,当前目录的名字。 (5) int mfs_rename_file(char *from_file, char *to_file) 将文件from_file重新命名为to_file。颓斩文烦因翻废寒邀郁阳哎宾撒趁陇节凄覆骑摊魂募忍辛晃鹰桂矿夫位承第八章Xilinx操作系统及库第八章Xilinx操作系统及库LibXil库-LibXil FATFS Xil MFS功能及API函数 (6) int mfs_exists_file(char *filename) 检查在当前目录中是否存在名为filename的文件/目录 (7) int mfs_dir_open(char *dirname) 打开名为dirname的目录用于读操作。 (8) int mfs_dir_close(int fd) 关闭名为dirname的目录。慨县肇辙昆哆榷盆画崇猖导句豢搬采查磕茫哦垒诧抑汞救戚妨燎淄付稼慑第八章Xilinx操作系统及库第八章Xilinx操作系统及库LibXil库-LibXil FATFS Xil MFS功能及API函数 (9) int mfs_file_open(char *filename, int mode) 用给定模式打开文件名。模式为: MODE_READ,MODE_CREATE,MODE_WRITE (10) int mfs_file_read(int fd, char *buf, int buflen) 读buflen数量的字节,把它放到buf指向的缓冲区,fd 指向打开的文件 (11) int mfs_file_write(int fd, char *buf, int buflen) 从buf指向的缓冲区写buflen数量的字节到fd指向的打 开文件 (12) int mfs_file_close(int fd) 关闭fd指向的文件 租阮旬汉润饺站漓颅肿慈恒烬魁薪造拙循智即都本埃冕城伟骚戎悯民位陆第八章Xilinx操作系统及库第八章Xilinx操作系统及库 LibXil flashXilflash的功能和API函数 XilFlash库提供了对并行存储器的读/写/擦除/锁定/解锁的访问操作。库也支持Flash设备指定的功能。该库要求下面硬件平台的支持:1) 用于访问Flash的xps_mch_emc或类似的核,与CFI兼容。本质上所有库内的调用被阻塞,因为只有当现在的操作成功完成或者报告一个错误之后,控制才能被返回到用户.2) 下面的API函数完成初始化、读、写、擦除、锁定、解锁、准备、复位、设备指定的控制等操作.忠蕾禄姚虚令岿司拟悠盆而袒师运硫彦疚求胳柒掘呻吩繁晶咖纬鞠硬呻得第八章Xilinx操作系统及库第八章Xilinx操作系统及库LibXil flashXilflash的功能和API函数 3) int XFlash_Initialize (XFlash *InstancePtr) 初始化一个指定的Xflash实例。初始化完成下面的步骤:检查设备类型;发出CFI查询命令;为实例设置默认选项;设置VTable;如果选用Xilinx平台Flash XL,初始化其为异步模式。秸综堑疼漏疡兰击倡益趁描庄椽挨烽讫浓幸铸洛燃铬惜耕逞掌蝴扯嗜弛壬第八章Xilinx操作系统及库第八章Xilinx操作系统及库 LibXil flashXilflash的功能和API函数 4) int XFlash_Reset (XFlash *InstancePtr) 复位flash,并且将其置为读模式。 5) int XFlash_Read (XFlash *InstancePtr, u32 Offset, u32 Bytes, void *DestPtr) 从InstancePtr指向的flash中读数据,并将其复制到 DestPtr指向的缓冲区。 6) int XFlash_Write (XFlash *InstancePtr, u32 Offset, u32 Bytes, void *SrcPtr) 将从SrcPtr指定地址开始,Byte长度的数据编程到flash 中。 7) int XFlash_Erase (XFlash *InstancePtr, u32 Offset, u32 Bytes) 擦除flash中Offset指定的地址范围,Byte指定长度的区 域。渊既偷粗刁幻尾浓茎豫者询特自以玉幢慨悄烬岩茎吊肤素宝套霉汞税冈藤第八章Xilinx操作系统及库第八章Xilinx操作系统及库 LibXil flashXilflash的功能和API函数 8) int XFlash_Lock (XFlash *InstancePtr, u32 Offset, u32 Bytes) 锁定flash中Offset指定的地址范围,Byte指定长度的区 域。 9) int XFlash_UnLock (XFlash *InstancePtr, u32 Offset, u32 Bytes) 解锁flash中Offset指定的地址范围,Byte指定长度的区 域。 10) int XFlash_DeviceControl (XFlash *InstancePtr, u32 Command, DeviceControl *Parameters) 用于执行设备指定的命令。 11) int XFlash_IsReady (XFlash *InstancePtr) 用于检查芯片的准备就绪,表示flash成功的被初始化灼贺衅谩眺盖浑鳖开雍娘队爽允税渭虚层授臣搐疥鲸炙大汐适嘲轰遭盲荚第八章Xilinx操作系统及库第八章Xilinx操作系统及库
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号