Sear

  • 格式:pdf
  • 大小:255.54 KB
  • 文档页数:4

长江大学学报(自然科学版) 2010年6月第7卷第2期:理工 Journal of Yangtze University(Nat Sci Edit) Jun.2010.Vo1.7 No.2:Sci&Eng 

 ̄c/os一11操作系统在NiosⅡ上的移植研究 吴爱平 (长江大学电子信息学院,湖北荆州434023) 李勇华 (中石化胜利石油管理局钻井研究院,山东东营257000) 

[摘要]根据Nios II特点,阐述了将实时操作系统 c/0 Ⅱ移植到Nios II处理器的方法,利用Altera公 司的Quartus 1I软件和Nios 1I IDE集成开发编译环境,编写了3个移植文件,实现了嵌入式软硬件平台 接口。通过Nios 1I IDE的在线观测和DE2板的实际硬件测试表明,创建的任务运行稳定可靠。 [关键词]uc/os-Ⅱ;Nios II;嵌入式系统;移植 [中图分类号]TP301.6;TP391.72 [文献标识码]A [文章编号]1673—1409(2010)02一N096—04 

嵌入式系统是将先进的计算机技术、半导体技术和电子技术与各个行业的具体应用相结合后的产 物,目前嵌入式系统已经渗透到日常生活的各个领域,其在工业、服务业、消费电子等领域的应用范围 都在不断扩大口]。嵌入式系统由硬件和软件两大部分组成。通常软件部分主要基于实时操作系统(简称 RTOS),在特定的RTOS之上开发应用软件;硬件部分主要是以某一个硬核微处理器芯片为核心,如 DSP,ARM,单片机等 ],这些硬核均来自于第3方公司,且无法裁剪处理器硬件资源,造成设计 资源的浪费和设计的不便。笔者以Altera公司推出的Nios II软核处理器为例 ],阐述了基于Nios 1I 处理器的移植方法。该方法弥补了硬处理器的不足,大大促进了软硬件协同设计。基于Nios II处理器 的实时操作系统具有可裁剪、可扩充、可升级的灵活设计方式及在系统可编程的灵活功能。 

1实时嵌人式操作系统 ̄c/os-Ⅱ C/OS—II是一款源代码开放的实时操作系统内核,是专为嵌入式应用而设计的。其代码大部分是 用移植性很强的ANSI—C编写;可通过条件编译对提供的系统服务进行裁减;完全抢占式的内核,总 是运行处于就绪态的最高优先级的任务;每个任务被赋予唯一的优先级并使用自己独立的堆栈;还可提 供多种系统服务,如邮箱、消息队列、信号量、内存管理和时间管理等相关函数L6]。 

2 Nios 11的构建 NiosⅡ系列嵌入式处理器是一款采用流水线技术、单指令流的RISC CPU,广泛应用于嵌入式系 统。Nios II嵌入式CPU支持32位指令集、32位数据线宽度、32个通用寄存器、32个外部中断源、 2GB寻址空间,包含高达256个用户自定义的CPU定制指令 ]。Nios 1I的所有数据、程序都是通过 Avalon总线传输的。通过使用Altera的QuartusⅡ软件以及SOPC Builder工具可以轻松地构建Nios Ⅱ内核。该设计中需添加NiosII CPU核、Avalon三态总线桥、系统ID、片内存储器、片外存储器接 口、PIO、定时器、液晶显示接口等,同时定制和配置它们的功能、分配外设地址及中断号、设定复位 地址、最后生成NiosII系统。定制好的NiosⅡ处理器软核如图1所示。 

3 I ̄C/OS-Ⅱ在NiosⅡ上的移植 . 所谓移植就是使一个实时内核能在其他微处理器或微控制器上运行,即编写与处理器相关代码。图2 所示为 C/os-II的结构以及与硬件的关系。从图2中可以看出完成移植工作主要是将OS—CPU.H、OS— CPUA.ASM、OSCPUc C进行修改。 

[收稿日期]2010一o2—12 [作者简介]吴爱平(1977一),男,2000年大学毕业,硕士,讲师,现主要从事信号采集与处理方面的教学与研究工作。 第7卷第2期:理工 吴爱平等: ̄c/os-II操作系统在Nios II上的移植研究 Targ融’一一一~ De ̄.1ceFaI''Iy:匡! !!— : Clock 撼 ~ … … 回 圃 

1Use Cdm … 10 施Narne Description aOcl【 B骶;e End RQ 回 日cpII一日 NiOs“Proces8j0r inatmctionmaster Avalon M矗sler cIIc ●。· datamaster AvaIon Mastel' I柏0 lI啕31 ÷_、 L——· agJIe gJI’a hJIe AvelonsIave OIO1'口2800 oxol?02fff 团 曰tri lime bridge e Av ̄ct,-MMTristateBndge av@on s ̄ve Aved∞sIave  ̄lk 

回 e Ⅱ酣稚e er Aval。n Tr.嘟毹e№鞋sr 田嘶JIa鼋hJ Flash Memory(CF0 dk 瓣h01409000 0x01 7fffff 

回 -——·-——J 圈el' ̄illnI.日 SRAM 16Bt 512K clk 毋ol01880000 OxOlefffff 回 ————— 田0由 -日 SDR Controller clk_50 口x口口●O0口口0 OzOOffffff 团 ——-— 田帅erJ Irterv ̄TWner clk OxOl ̄03000 oxo[90301f 团 -—— 田t nerJ Interval Timer dk 甜h015030P'O 0x01,0303f 回 ----·· 田IcdJ82。7-口 Character LCD cIl‘ hO1903040 OxOI90304f 回 —---·- 田led_red PIo(Parallel l ) “OxOI 90 ̄050 0=01903051 回 ’----- 田Ied—曩l‘e∞ P10(ParelieI1JO) c撤 谴h0150 ̄060 OxOl 903061" 团 —-··· 田SIEG7 0isp ̄ SEG7 LUT 8 clk 0:=01 903078 Ox01 90307b 回 h——- 田onchip_rm On CNp Memory(RAM or F ̄OM) c嗽 l辐 Oz01901000 OxO1 901fff 

■ …● iIa日口■m目 —T日t11■“llEiI■■fl h■H●‘—●__ 

图1 SOPC Builder中NiosⅡ系统组件 3.1 HAL系统库 对基于Nios lI的软核CPU而言, 其设计开发使用NiosⅡIDE软件工具, 该软件开发工具为Nios II核提供HAL 系统库[8]。HAL系统库是一个简化的 运行环境,为底层硬件通信程序提供简 单器件驱动接口,HAL应用程序接口 (API)和ANSI C标准库集成在一起, 用户可以通过HAL API通用设备模型 访问硬件资源,如图3所示。ANSI C 标准库与HAL的紧密结合使得软件开 发成为可能_g]。例如可使用ANSI C标 准库的I/O函数来操作字符模式设备和 文件,如printf()、scanf()等。 3.2与处理器相关文件的编写 1)OSCPU.H的编写 在OSCPU.H文件中定义了与处理器(实际上 是与编译器相关)的数据类型、堆栈增 长方向以及系统软中断。定义了与处理 器相关的宏,主要是进入临界区的OS一 

软件部分 应用软件 (用户代码) 

pC/OS.II核心代码 (与处理 无 ) gC/OS-II配置代码 OS C(浆EC oS SEMC (与应用相关) 

OS FLAGC OS 1.AS C 0SⅣBOC.C OS 11 皿C OS~匝MC UCOSⅡ.C OSCFGH 

0S MUTE)(.C UCOSⅡ.H INCLUDESH OS QC 

gC ̄0S4I移植(与Nios II相关代码) 0SCIrO.H OSCPU.A.ASM oscPuC.C 

硬件部分 FPGA中构建NiosⅡ 

图2 ̄c/os一Ⅱ硬件/软件体系结构 ENTER CRITICAL()和退出临界区的OS—EXIT—CRITICAL()。 2)OS CPU C.C的编写 在OS CPU—C.C文件中,需要编写6个与操作系统有关的函数。 这6个函数是:0STaskStkInit()、OSTaskCreatHook()、OSTaskDelHook()、0STaskSwHook ()、OSTaskStatHook()和0STaskTickHook()。在6个函数中只需对0STaskStklnit()编写代 码,后5个Hook函数必须声明,它们是由系统函数调用的钩挂函数,让用户能在操作系统中加入自己 需要的一些功能,也可以为空函数,其内部可以没有代码。 OSTaskCreate()和OSTaskCreateExt()通过调用0STaskStkInit()来初始化任务的堆栈结 ·98· 长江大学学报(自然科学版) 2010年6月 构,它需要的参数是任务代码起始地址、参数指针、任务堆 栈顶端的地址。初始化任务的栈结构工作结束后,堆栈看起 来就像中断刚发生过一样,所有寄存器都保存在堆栈中,从 而可以利用中断返回指令使就绪的任务运转起来。NiosⅡ 处理器的堆栈方向是地址由高到低递减方式。 3)0SCPU

A.ASM的编写 该文件包括4个函数 

都涉及对寄存器的处理,跟处理器有关,由于不同处理器有 不同寄存器9所以操作系统在这个文件里给用户留下4个函 数接口,以便用户根据所选处理器编写相应的汇编程序以完 成固定功能。uc/os-H的移植要求用户编写4个汇编语言 函数:oSStartHighRdy()、OSCtxSw()、OSIntCtxSw 

用户应用程序 l c标准库I 

设备 设备 设备 驱动 驱动 驱动 

Nios II处理器硬件系统 

图3 HAL系统库结构 ()、OSTickISR()。OSStartHighRdy()函数由OSStart()调用,用来启动优先级最高的任务执行, 负责从最高优先级任务的TCB控制块中获得该任务的堆栈指针sp,通过sp依次将CPU现场恢复; OSCtxSw()函数是一个任务级的任务切换函数,是在任务需要进行切换时被0S—TASK—SW() 调用;OSIntCtxSw()函数是中断级的任务切换函数,被OSIntExit()调用,是在ISR中执行中断 任务切换;OSTick ISR()函数是时钟节拍中断处理函数,在调用OSStart()后才可启动。它的主要 任务是负责处理时钟中断,为内核提供时钟节拍。 ‘ 

4‘移植测试 uc/os-II移植完成后,需要进行测试,以验证移植的uC/Os-H是否能正常工作。测试中建立了 1O个任务:INITIALIZE—TASK为初始化任务;PRINT~STATUS—TASK为打印状态任务;light led为点亮流水灯任务;light—LCD为液晶显示任务;SEG—Display为数码管显示任务;GETSEM TASK1和GETSEM—TASK2任务是竞争由信号量保护的共享资源;RECEIVE—TASK1和RE— CEIVETASK2任务是周期性地从队列中取出数据;SEND—TASK任务是将增加的数据添加到消息