《sopc课件第八章.ppt》由会员分享,可在线阅读,更多相关《sopc课件第八章.ppt(231页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、本章讨论本章讨论Nios II处理器系统的深入处理器系统的深入设计设计内容包括内容包括:(1)异常处理程序的开发异常处理程序的开发(2)缓存和紧耦合存储器的编程缓存和紧耦合存储器的编程(3)C/os II实时操作系统实时操作系统(4)以太网与轻量以太网与轻量IP(5)Nios II多处理器系统多处理器系统(6)定制定制Nios II用户指令和定制基于用户指令和定制基于Avalon的用户外设等。的用户外设等。第八章第八章 目录目录n8.1 异常处理程序的开发异常处理程序的开发 8.1.1 Nios II异常分类异常分类 8.1.2 硬件抽象层的实现硬件抽象层的实现 8.1.3 中断服务程序(中断
2、服务程序(ISRs)n8.2 缓存和紧耦合存储器的编程缓存和紧耦合存储器的编程 8.2.1 复位后缓存的初始化复位后缓存的初始化 8.2.2 设备驱动程序中缓存的编程设备驱动程序中缓存的编程 8.2.3 装载程序或自更新程序的编写装载程序或自更新程序的编写 8.2.4 多主多主/多多CPU系统中缓存的管理系统中缓存的管理 8.2.5 紧耦合存储器概述紧耦合存储器概述 8.2.6 紧耦合存储器接口紧耦合存储器接口 8.2.7 使用紧耦合存储器创建使用紧耦合存储器创建Nios II系统系统n8.3 C/OS-II实时操作系统实时操作系统 8.3.1 C/OS-II实时操作系统简介实时操作系统简介
3、8.3.2 C/OS-II 在在Nios II上的移植上的移植 8.3.3 Nios II IDE中中C/os-II工程的实现工程的实现 8.3.4 软硬件要求软硬件要求 8.3.5 在在Nios II中建立中建立C/os- II工程工程 n8.4 以太网与轻量以太网与轻量IP 8.4.1 轻量轻量IP概述概述 8.4.2 轻量轻量IP协议栈的使用协议栈的使用 8.4.3 Nios II IDE中轻量中轻量IP的配置的配置 8.4.4 设计实例的软硬件环境设计实例的软硬件环境 8.4.5 实例的设计文件实例的设计文件 8.4.6 软件开发流程软件开发流程 8.4.7 Simple Socket
4、 Server设计概述设计概述n8.5 Nios II多处理器系统多处理器系统 8.5.1 多处理器系统设计概述多处理器系统设计概述 8.5.2 多处理器系统的优势多处理器系统的优势 8.5.3 Nios II多处理器系统硬件设计多处理器系统硬件设计 8.5.4 Nios II多处理器系统的资源共享多处理器系统的资源共享 8.5.5 Nios II多处理器系统软件设计多处理器系统软件设计 8.5.6 Nios II多处理器系统设计实例多处理器系统设计实例 n8.6 定制定制Nios II用户指令用户指令 8.6.1 Nios II定制指令综定制指令综述述 8.6.2 定制指令实现方式定制指令实
5、现方式 8.6.3 定制指令设计示例定制指令设计示例n8.7 定制基于定制基于Avalon的用户外的用户外设设 8.7.1 设计概述设计概述 8.7.2 组件开发流程组件开发流程 8.7.3 设计实例设计实例 PWM从端从端口口 8.1 异常处理程序的开发异常处理程序的开发 8.1.1 Nios II异常分类异常分类 8.1.2 硬件抽象层的实现硬件抽象层的实现 8.1.3 中断服务程序(中断服务程序(ISRs) 8.1 异常处理程序的开发异常处理程序的开发 8.1.1 Nios II异常分类异常分类 8.1.2 硬件抽象层的实现硬件抽象层的实现 8.1.3 中断服务程序(中断服务程序(ISR
6、s) NiosII处理器的异常分为两大类:处理器的异常分为两大类:n 硬件中断异常n 软件异常 8.1.1 Nios II异常分类异常分类 软件异常软件异常又分为:又分为:l 未实现指令l 软件陷阱l 其他异常 8.1 异常处理程序的开发异常处理程序的开发 8.1.1 Nios II异常分类异常分类 8.1.2 硬件抽象层的实现硬件抽象层的实现 8.1.3 中断服务程序(中断服务程序(ISRs) (2)确定)确定ipending是否不为零。若是否不为零。若ipending有非有非零位,则异常是一个硬件中断;若所有位均为零位,则异常是一个硬件中断;若所有位均为0,则异常是一软件异常。则异常是一软
7、件异常。HAL系统库提供的异常处理程序位于异常地址,它系统库提供的异常处理程序位于异常地址,它采用以下方法区分采用以下方法区分硬件中断硬件中断和和软件异常软件异常: (1)确定)确定estatus寄存器的寄存器的EPIE位是否被允许。位是否被允许。若不允许,则是一个软件异常;若若不允许,则是一个软件异常;若EPIE允许,则继允许,则继续下一步。续下一步。8.1.2 硬件抽象层的实现硬件抽象层的实现 alt_irq_entry 若若Nios II系统包含硬件中断,顶层汇编子程序系统包含硬件中断,顶层汇编子程序alt_irq_entry位于异常地址。这个汇编子程序检查位于异常地址。这个汇编子程序检
8、查产生了何种类型中断,调用相应子程序。软件中断产生了何种类型中断,调用相应子程序。软件中断调用一个调用一个Software_exception;硬件中断调用;硬件中断调用Alt_irq_handler子程序子程序 该方法使用如下该方法使用如下3个子程序:个子程序:lalt_irq_entry( )lalt_irq_handler( )lsoftware_exception( )software_exception software_exception子程序确定软件中断源。它子程序确定软件中断源。它主要确定引起软中断的未实现指令,并调用相应的主要确定引起软中断的未实现指令,并调用相应的指令仿真子
9、程序。指令仿真子程序。若若Nios II系统不包含产生硬件中断的外设,系统不包含产生硬件中断的外设,software_exception子程序直接被放在异常地址,子程序直接被放在异常地址,另外,另外,alt_irq_entry和和alt_irq_handler不被链接到不被链接到工程。工程。alt_irq_handler 函数函数alt_irq_handler()确定中断源(例如,引起()确定中断源(例如,引起中断的设备中断号)和执行已注册的相应的处理函中断的设备中断号)和执行已注册的相应的处理函数。数。IRQ0优先级最高,优先级最高,IRQ31最低。最低。 1 1未实现指令未实现指令 sof
10、tware_exception为每一条未实现指令定义为每一条未实现指令定义了一个仿真子程序,采用这种方式,可支持了一个仿真子程序,采用这种方式,可支持Nios II的所有指令,而并不是所有的所有指令,而并不是所有Nios II的指令都可的指令都可由硬件实现。另一方面,若一条指令由硬件实现,由硬件实现。另一方面,若一条指令由硬件实现,决不会发生相应指令的软件中断。仿真子程序很决不会发生相应指令的软件中断。仿真子程序很小,从一个目标小,从一个目标Nios II核中去掉它们不会有什么核中去掉它们不会有什么影响。未实现指令和无效指令含义不同,影响。未实现指令和无效指令含义不同,software_exc
11、eption子程序不能检测或响应一个子程序不能检测或响应一个无效指令。若指令字中的无效指令。若指令字中的OP和和OPX域的编码未域的编码未定义,其指令执行结果也未定义。定义,其指令执行结果也未定义。2 2软件陷阱异常处理软件陷阱异常处理 当前,当前,software_exception对软件陷阱异常执行对软件陷阱异常执行一个空操作。虽然没有陷阱处理程序,在一个空操作。虽然没有陷阱处理程序,在alt_exception.s中代码仍检测中代码仍检测OP和和OPX编码。当编码。当陷阱的陷阱的OP/OPX条件满足时,软件中断被发起,可条件满足时,软件中断被发起,可以转到用户自己的陷阱处理程序。祥见以转
12、到用户自己的陷阱处理程序。祥见alt_exception.s中的注释。中的注释。 3 3其他的异常类型其他的异常类型 未来未来Nios II处理器核可能定义新的异常类型。处理器核可能定义新的异常类型。HAL实现未考虑当前未定义的异常类型。实现未考虑当前未定义的异常类型。 8.1 异常处理程序的开发异常处理程序的开发 8.1.1 Nios II异常分类异常分类 8.1.2 硬件抽象层的实现硬件抽象层的实现 8.1.3 中断服务程序(中断服务程序(ISRs) Nios II处理器与外设的通讯通常由中断来实现。当处理器与外设的通讯通常由中断来实现。当某外设提出某外设提出IRQ时,相对处理器的正常执行
13、流产生时,相对处理器的正常执行流产生了一个异常。当中断发生时,相应的了一个异常。当中断发生时,相应的ISR必须处理必须处理该中断且中断处理完后使处理器返回到处理前的状该中断且中断处理完后使处理器返回到处理前的状态态。8.1.3 硬件抽象层的实现硬件抽象层的实现下面讨论HAL系统库中中断处理的框架1 1ISRsISRs的的HAL APIHAL API2. 2. 利用利用alt_irq_register()alt_irq_register()函数注册函数注册ISRISR 3 3ISRISR的编写的编写 4. ISRs4. ISRs的允许和禁止的允许和禁止5 5ISRISR的快速处理的快速处理6 6
14、描述描述ISRISR性能的参数性能的参数7 7ISRsISRs的调试的调试8 8编写编写ISRsISRs方法小结方法小结1ISRs的HAL APIn利用HAL API实现ISRs分为2步。首先,为某一特定外设中断写一中断服务程序。其次,必须使用alt_irq_register()函数注册该ISRs。在ISR执行期间,程序中可用alt_irq_enable_all()和alt_irq_disable_all()函数允许和禁止中断。n注意:禁止中断影响中断延迟,故影响系统性能。2. 利用alt_irq_register()函数注册ISR nHAL把alt_irq_register()函数指针注册到
15、一查找表中,当某一个ISR出现时,HAL在查找表中查找该IRQ且调度(dispatch)已注册的ISR。n若ISR成功注册,从alt_irq_register()返回后,相应中断(由id定义)被允许。3ISR的编写 n用户编写的ISR必须与alt_irq_register()要求的原型匹配,ISR函数的原型应该与void isr(void*context, alt_u32 id)原型匹配。nContext和id参数的定义与alt_irq_register()函数中的定义相同。ISR函数负责清除或屏蔽相应的中断条件,之后返回到中断处理程序。nISRs运行环境受到一定限制,在ISRs中许多HAL
16、API调用不可用。例如,在ISRs中不允许访问HAL文件系统。一般来讲,ISR中决不应包括那些可能影响等待中断的函数调用。注意:当最慢的ISR中指令少于70条指令时,允许中断嵌套增加了较高优先级中断的中断延迟。此时中断处理程序中不应该开中断。4. ISRs的允许和禁止nHAL提供alt_irq_disable()、alt_irq_enable()、 alt_irq_disable_all()、alt_irq_enable_all()和 alt_irq_enabled()等函数,允许在某段程序之前关中断,之后再开中断。alt_irq_disable()和alt_irq_enable()可禁止和允
17、许某个中断,alt_irq_disable_all()禁止所有中断,返回一个上下文相关值。调用alt_irq_enable_all()开放所有中断,且传递上下文参数,采用这种方式,中断返回到调用alt_irq_disable_all()之前的状态。若中断被允许,alt_irq_enabled()返回一非零值,允许程序检查中断的状态。n注意:关中断的时间应尽可能短,原因是当关中断时间增加时,最大中断延迟也增加。5ISR的快速处理要提高ISRs的性能,应遵守以下原则:n把异常地址映射到快速存储器可提高异常处理程序的执行速度。例如,与速度较慢的SDRAM相比,应优先选择具有零等待状态的片上RAM。这
18、不是通过软件选择的,异常地址在系统创建时就已被确定,是很容易修改的Nios II CPU硬件的一个属性。nISR函数也应该映射到快速存储器。n一般地,在ISR中应避免进行长时间的计算。6描述ISR性能的参数表8-1注:(1)表中数字表示CPU时钟周期。表8-1中断的性能参数表8-1列出了每种Nios II核的中断延迟、响应时间和恢复时间。7ISRs的调试 在Nios II IDE环境下通过在ISR内设断点可对ISR进行调试。调试器完当执行到断点处,全停止处理器的运行,同时,系统中硬件继续工作。因此当处理器停止时,其他的IRQs可能被忽略。利用Debugger可单步调试ISR,但其他采用中断驱动
19、的设备驱动程序的状态只有当处理器回到正常的状态时才有效。必须使处理器复位才能使系统回到已知状态。在单步期间,Ipending寄存器(ct14)被屏蔽为全0,这使得单步期间CPU不响应IRQs。结果,若单步调试需读取ipending寄存器的异常处理程序(例_irq_entry()或alt_irq_handler())时,代码无法检测任何已登记的IRQs。断点不影响软件异常的调试。可以在ISR中设断点(且单步运行),因为异常处理程序已使用Ipengding来确定哪个IRQ引起了异常。8编写ISRs方法小结n使用HAL API提供的alt_irq_register()函数注册ISR。n编写的ISR函
20、数应与原型void isr(void*context,alt_u32 id) 匹配。n尽可能减少ISR中的任务量。n从中断返回后,再对耗时较长的任务进行处理。ISR可使用消息传递机制通知ISR以外的耗时长的任务。n在ISR内部不要使用C标准库中的I/O函数,比如printf()。n在ISR中使用alt_irq_interruptible(),alt_irq_non_interruptible()允许和禁止高优先级的ISRs,若ISR很短,没有必要在其内部允许较高优先级的中断。n要得到最快的执行性能,异常处理程序和ISR代码应存放在快速存储器中。 8.2 缓存和紧耦合存储器的编程缓存和紧耦合存储
21、器的编程l 8.2.1 复位后缓存的初始化复位后缓存的初始化l 8.2.2 设备驱动程序中缓存的编程设备驱动程序中缓存的编程 l 8.2.3 装载程序或自更新程序的编写装载程序或自更新程序的编写 l 8.2.4 多主多主/多多CPU系统中缓存的管理系统中缓存的管理l 8.2.5 紧耦合存储器概述紧耦合存储器概述l 8.2.6 紧耦合存储器接口紧耦合存储器接口l 8.2.7 使用紧耦合存储器创建使用紧耦合存储器创建Nios II系统系统8.2 缓存和紧耦合存储器的编程 Nios II处理器核可以包含指令和数据缓存。幸运的是:大部分建立在HAL系统库上的软件,不需要对缓存进行特别的考虑,均可在Ni
22、os II处理器上正常运行。但某些程序必须直接管理缓存。Nios II提供一些方法来进行以下操作: 初始化指令和数据缓存行。 刷新指令和数据缓存行。 装载和存储指令时,旁路数据缓存。 8.2 缓存和紧耦合存储器的编程缓存和紧耦合存储器的编程l 8.2.1 复位后缓存的初始化复位后缓存的初始化l 8.2.2 设备驱动程序中缓存的编程设备驱动程序中缓存的编程 l 8.2.3 装载程序或自更新程序的编写装载程序或自更新程序的编写 l 8.2.4 多主多主/多多CPU系统中缓存的管理系统中缓存的管理l 8.2.5 紧耦合存储器概述紧耦合存储器概述l 8.2.6 紧耦合存储器接口紧耦合存储器接口l 8.
23、2.7 使用紧耦合存储器创建使用紧耦合存储器创建Nios II系统系统8.2.1 复位后缓存的初始化n复位后,指令和数据缓存的内容是随机的,程序必须首先对其初始化。n软件不能禁止Nios II的缓存。为了能正常进行操作,处理器复位时会使与复位处理程序地址相关的指令缓存行无效,这迫使指令缓存从存储器中取出与该缓存行相应的指令。复位处理程序的地址必须与指令缓存行的大小对齐。n复位处理程序的前8条指令必须初始化指令缓存的其余部分。Nios II initiiniti指令用于初始化指令缓存行。不要使用flushiflushi指令初始化指令缓存行,原因是它可能引起不可预知的结果。 8.2 缓存和紧耦合存
24、储器的编程缓存和紧耦合存储器的编程l 8.2.1 复位后缓存的初始化复位后缓存的初始化l 8.2.2 设备驱动程序中缓存的编程设备驱动程序中缓存的编程 l 8.2.3 装载程序或自更新程序的编写装载程序或自更新程序的编写 l 8.2.4 多主多主/多多CPU系统中缓存的管理系统中缓存的管理l 8.2.5 紧耦合存储器概述紧耦合存储器概述l 8.2.6 紧耦合存储器接口紧耦合存储器接口l 8.2.7 使用紧耦合存储器创建使用紧耦合存储器创建Nios II系统系统8.2.2 设备驱动程序中缓存的编程 HAL提供C语言的宏IORDIORD和IOWRIOWR,用来扩展旁路数据缓存的汇编指令。IORDI
25、ORD宏对ldwioldwio指令进行扩展,IOWRIOWR宏对stwiostwio指令进行扩展,HAL设备驱动程序访问设备寄存器时应使用这些宏。表8-2 旁路数据缓存的HAL I/O宏 宏 功能IORD(BASE,REGNUM)读寄存器的值,该寄存器基地址为BASE,偏移量为REGNUM。假设偏移量是相对总线地址宽度的偏移。IOWR(BASE,REGNUM,DATA)写数据DATA到寄存器中去,该寄存器基地址为BASE。偏移量为REGNUM,假设偏移量是相对总线地址宽度的偏移。IORD_32DIRECT(BASE,OFFSET)在地址BASE+OFFSET地址处进行一次32位的读操作。IOR
26、D_16DIRECT(BASE,OFFSET)在地址BASE+OFFSET地址处进行一次16位的读操作。IORD_8DIRECT(BASE,OFFSET)在地址BASE+OFFSET地址处进行一次8位的读操作。IOWR_32DIRECT(BASE,REGNUM,DATA)在地址BASE+OFFSET地址处进行一次32位的写操作,写入数据为DATA。IOWR_16DIRECT(BASE,REGNUM,DATA)在地址BASE+OFFSET地址处进行一次16位的写操作,写入数据为DATA。IOWR_8DIRECT(BASE,REGNUM,DATA)在地址BASE+OFFSET地址处进行一次8位的写
27、操作,写入数据为DATA。 8.2 缓存和紧耦合存储器的编程缓存和紧耦合存储器的编程l 8.2.1 复位后缓存的初始化复位后缓存的初始化l 8.2.2 设备驱动程序中缓存的编程设备驱动程序中缓存的编程 l 8.2.3 装载程序或自更新程序的编写装载程序或自更新程序的编写 l 8.2.4 多主多主/多多CPU系统中缓存的管理系统中缓存的管理l 8.2.5 紧耦合存储器概述紧耦合存储器概述l 8.2.6 紧耦合存储器接口紧耦合存储器接口l 8.2.7 使用紧耦合存储器创建使用紧耦合存储器创建Nios II系统系统8.2.3 装载程序或自更新程序的编写 把指令写入存储器的软件,例如装载程序或自更新程
28、序应保证对指令缓存和CPU流水(pipleline)中的原有指令进行刷新。刷新分别由flushiflushi和flushpflushp指令来完成。另外,若使用未旁路数据缓存的存储指令将新指令写入存储器时,必须使用flushdflushd指令从数据缓存中刷新新指令到存储器中。下面程序段写一条新指令到存储器中:下面程序段写一条新指令到存储器中:/* Assume new instruction in r4 and instruction address already in r5.*/stw r4, 0(r5)flushd 0(r5)flushi r5flushpnStw指令将r4中的新指令写到r
29、5所指示的地址处。若数据缓存存在,指令被写到数据缓存且相应行被标识为“脏”。Flushi指令使与r5中地址相关的数据缓存行无效。最后flushp指令保证CPU流水在r5指示的地址处没有对过时指令进行预取。n注意上面代码使用stw/flushd对,而没有使用stwio指令,使用stwio指令不刷新数据缓存,因而过时的数据被留在数据缓存中,HAL API没有提供缓存管理函数。 8.2 缓存和紧耦合存储器的编程缓存和紧耦合存储器的编程l 8.2.1 复位后缓存的初始化复位后缓存的初始化l 8.2.2 设备驱动程序中缓存的编程设备驱动程序中缓存的编程 l 8.2.3 装载程序或自更新程序的编写装载程序
30、或自更新程序的编写 l 8.2.4 多主多主/多多CPU系统中缓存的管理系统中缓存的管理l 8.2.5 紧耦合存储器概述紧耦合存储器概述l 8.2.6 紧耦合存储器接口紧耦合存储器接口l 8.2.7 使用紧耦合存储器创建使用紧耦合存储器创建Nios II系统系统8.2.4 多主多主/多多CPU系统中缓存的管理系统中缓存的管理nLdio/stioLdio/stio指令旁路数据缓存。Bit-31提供了旁路数据缓存的另一种选择方法。使用Bit-31缓存旁路,ld/stld/st指令可用于旁路数据缓存,条件是地址的最高位(bit31)被设置为1。Bit-31仅在CPU内部使用,在实际地址访问时Bit-
31、31被强制为0。这使得最大字节寻址范围为31位。Bit-31 CacheBit-31 Cache旁路旁路 8.2 缓存和紧耦合存储器的编程缓存和紧耦合存储器的编程l 8.2.1 复位后缓存的初始化复位后缓存的初始化l 8.2.2 设备驱动程序中缓存的编程设备驱动程序中缓存的编程 l 8.2.3 装载程序或自更新程序的编写装载程序或自更新程序的编写 l 8.2.4 多主多主/多多CPU系统中缓存的管理系统中缓存的管理l 8.2.5 紧耦合存储器概述紧耦合存储器概述l 8.2.6 紧耦合存储器接口紧耦合存储器接口l 8.2.7 使用紧耦合存储器创建使用紧耦合存储器创建Nios II系统系统8.2.
32、5 紧耦合存储器概述n若总是需要缓存的性能,可将代码或数据存放在紧耦合存储器中,紧耦合存储器是旁路缓存的快速片上存储器,且保证了低延迟。紧耦合存储器有最好的存储器访问性能,可采用和其他存储器一样的方法分配代码和数据到紧耦合存储器。nNios II提供紧耦合主端口,在高性能的应用场合,紧耦合主端口提供对片上存储器可靠且固定的小延迟的访问。它连接指令和数据存储器,允许对可执行代码的固定且小延迟的n读访问,也允许对数据的固定且小延迟的读写访问。在Nios II核中,紧耦合主端口是不同于嵌入式处理器的指令和数据主端口的附加的指令和数据主端口。紧耦合存储器可以从多方面提高系统的性能:n 仅当处理中断时,
33、可使用独立的异常堆栈。n 数据的快速缓存。n 快速的中断处理和临界循环(critical loop)。n 固定的访问时间,没有随机延迟。 n 资源占用率低。若对存储器的需求较小,所有的程序和数据代码可以存放在紧耦合存储器对中。1硬件设计指南硬件设计指南n 紧耦合主端口是CPU上的附加的主端口。n SOPC Builder 片上存储器组件是唯一能够与 Nios II核上的紧耦合主端口连接的存储器。n 处理器上的紧耦合主端口必须只与一个片上存储 器从端口连接。从端口不能与其他主端口共享。n 即使它是双端口存储器,每个片上存储器最多与一个紧耦合主端口连接。n 数据或指令紧耦合主端口是否存在取决于Ni
34、os II核的类型。n 当使用片上存储器组件作为Nios II紧耦合存储 器时,必须将它配置为RAM,而不能为ROM。n 一个2K字节的紧耦合存储器比2个1K字节的紧耦合存储器节省逻辑单元。图8-1是一个简单的Nios II系统的方块图,其中包括紧耦合存储器和其他Avalon组件。图8-1 具有紧耦合指令和数据存储器的Nios II系统2软件指南软件指南n对使用紧耦合存储器的Nios II软件,应注意:n软件访问紧耦合存储器地址和访问其他存储器地址一样。n对紧耦合存储器进行缓存操作没有任何影响。 8.2 缓存和紧耦合存储器的编程缓存和紧耦合存储器的编程l 8.2.1 复位后缓存的初始化复位后缓
35、存的初始化l 8.2.2 设备驱动程序中缓存的编程设备驱动程序中缓存的编程 l 8.2.3 装载程序或自更新程序的编写装载程序或自更新程序的编写 l 8.2.4 多主多主/多多CPU系统中缓存的管理系统中缓存的管理l 8.2.5 紧耦合存储器概述紧耦合存储器概述l 8.2.6 紧耦合存储器接口紧耦合存储器接口l 8.2.7 使用紧耦合存储器创建使用紧耦合存储器创建Nios II系统系统8.2.6 8.2.6 紧耦合存储器接口紧耦合存储器接口 紧耦合存储器接口是一个连接紧耦合主端口和紧耦合从端口的与Avalon类似的接口,被设计来与一个片上存储器的端口连接。设计紧耦合存储器时有以下几点限制:n
36、紧耦合从端口必须是片上存储器。n 只有一个主端口和一个从端口能被连接到一给定的紧耦合存储器接口,使紧耦合存储器接口为一个点对点的连接。n 紧耦合从端口的数据总线是32位的,紧耦合存储器接口不支持总线宽度的动态变化。n 紧耦合从端口读延迟为1个周期,写延迟为0,没有等待状态。 8.2 缓存和紧耦合存储器的编程缓存和紧耦合存储器的编程l 8.2.1 复位后缓存的初始化复位后缓存的初始化l 8.2.2 设备驱动程序中缓存的编程设备驱动程序中缓存的编程 l 8.2.3 装载程序或自更新程序的编写装载程序或自更新程序的编写 l 8.2.4 多主多主/多多CPU系统中缓存的管理系统中缓存的管理l 8.2.
37、5 紧耦合存储器概述紧耦合存储器概述l 8.2.6 紧耦合存储器接口紧耦合存储器接口l 8.2.7 使用紧耦合存储器创建使用紧耦合存储器创建Nios II系统系统8.2.7 8.2.7 使用紧耦合存储器创建使用紧耦合存储器创建Nios IINios II系统系统系统创建步骤如下:(1) 修改一个包含紧耦合存储器的参考设计。(2) 在SOPC Builder中创建紧耦合存储器。(3) 连接紧耦合存储器到主端口。(4) 更改紧耦合存储器的地址。(5) 將Nios II异常地址指向紧耦合存储器。(6) 添加一个性能计数器。(7) 产生硬件系统。(8) 创建一个使用紧耦合存储器的软件工程。(9) 指定
38、独立的异常堆栈。(10) 改变工程的编译属性。(11) 运行基于新硬件的软件。 8.3 C/OS-II8.3 C/OS-II实时操作系统实时操作系统l 8.3.1 C/OS-II8.3.1 C/OS-II实时操作系统简介实时操作系统简介l 8.3.2 C/OS-II 8.3.2 C/OS-II 在在Nios IINios II上的移植上的移植l 8.3.3 Nios II IDE 8.3.3 Nios II IDE中中C/os-IIC/os-II工程的实现工程的实现 l 8.3.4 8.3.4 软硬件要求软硬件要求l 8.3.5 8.3.5 在在Nios IINios II中建立中建立C/os
39、- IIC/os- II工程工程 8.3 C/OS-II8.3 C/OS-II实时操作系统实时操作系统l 8.3.1 C/OS-II8.3.1 C/OS-II实时操作系统简介实时操作系统简介l 8.3.2 C/OS-II 8.3.2 C/OS-II 在在Nios IINios II上的移植上的移植l 8.3.3 Nios II IDE 8.3.3 Nios II IDE中中C/os-IIC/os-II工程的实现工程的实现 l 8.3.4 8.3.4 软硬件要求软硬件要求l 8.3.5 8.3.5 在在Nios IINios II中建立中建立C/os- IIC/os- II工程工程 8.3.1
40、C/OS-II实时操作系统简介C/OS-II的构思巧妙,结构简洁精炼,可读性强,同时又具备了实时操作系统的全部功能,其体系结构如图8-7所示。图8-7 C/OS-II体系结构 8.3 C/OS-II8.3 C/OS-II实时操作系统实时操作系统l 8.3.1 C/OS-II8.3.1 C/OS-II实时操作系统简介实时操作系统简介l 8.3.2 C/OS-II 8.3.2 C/OS-II 在在Nios IINios II上的移植上的移植l 8.3.3 Nios II IDE 8.3.3 Nios II IDE中中C/os-IIC/os-II工程的实现工程的实现 l 8.3.4 8.3.4 软硬
41、件要求软硬件要求l 8.3.5 8.3.5 在在Nios IINios II中建立中建立C/os- IIC/os- II工程工程 C/OS-II是一种通用的实时内核,它是一个可移植的、可裁剪的、抢占式的、实时的多任务内核。从1992年以来,除了Nios II处理器外,该OS已应用于数百个商业应用场合,已被移植到超过40个不同结构的处理器。C/OS-II提供下列服务:l 任务(线程)l 事件标志l 消息传递l 存储器管理l 信号量l 时间管理8.3.2 C/OS-II 在Nios II上的移植1C/OS-II结构 C/OS-II在Nios II处理器上的移植是HAL的一个超集,C/OS-II调度
42、器和相应的C/OS-II API对HAL环境进行了扩展,在C/OS-II工程中可调用所有的HAL API。图8-8 C/OS-II程序结构图图8-8是建立在C/OS-II上的程序结构图以及与HAL的关系图。注意,多线程的环境影响某些HAL的函数。2 2C/OS-IIC/OS-II多线程调试多线程调试 当当调试C/OS-II应用程序时,debugger可显示应用程序中所有线程的当前状态,包括寄存器的值。Debugger无法改变当前线程,或者单步运行不同的线程。3C/OS-II设备驱动程序 在components下的HAL目录下,在inc和src子目录下,提供每个外设(例如,一个SOPC Buil
43、der器件)的include文件和源文件。除了HAL目录,某个component也可能包含提供针对C/OS-II环境的代码的UCOSII目录。与HAL目录类似,UCOSII目录包含inc和src子目录。当在Nios II IDE中建立C/OS- II工程时,这些子目录自动添加到源和include的搜索路径中。4安全线程HAL驱动程序 为了方便同一驱动程序在HAL和C/OS-II环境中的移植,Altera定义了一组与OS无关的宏,用来提供对OS的访问。当编译C/OS-II工程时,宏扩展到一个C/OS-II API调用,当编译单线程HAL工程时,宏扩展成空,在Altera提供的设备驱动程序中使用这
44、些宏,当编写具有类似可移植性的设备驱动程序时也可以使用这些宏。表8-3列出了可用的宏及它们的功能。表中头文件的路径是:/components/ micrium_uc_osii/UCOSII/inc。表8-3 线程安全的HAL驱动器所使用的与OS无关的宏Macro定义宏的头文件C/OS-II实现单线程的HAL实现ALT_FLAG_GRP(group)os/alt_flag.h对名字为group的 flag group 创建一个指针。空语句ALT_EXTERN_FLAG_GRP(group) os/alt_flag.h为名字为group的flag group指针的创建一个外部参考。空语句ALT_S
45、TATIC_FLAG_GRP(group) os/alt_flag.h对名字为group的flag group 创建一个静态指针。空语句ALT_FLAG_CREATE(group, flags)os/alt_flag.h调用OSFlagCreate()来初始化flag group指针,group的名字为group,flags的值flags。宏的返回值是错误代码。调用成功时返回0ALT_FLAG_PEND(group, flags,wait_type,timeout)os/alt_flag.h调用OSFlagPend(),前4个输入参数分别设置为group、flags、wait_type和tim
46、eout,宏的返回值是错误码。调用成功时返回0ALT_FLAG_POST(group, flags,opt)os/alt_flag.h调用OSFlagPost(),前3个输入参数分别设置为group、flags、和opt,宏的返回值是错误码。调用成功时返回0ALT_SEM(sem)os/alt_sem.h对名字sem创建一个OS_EVENT指针。空语句ALT_EXTERN_SEM(sem)os/alt_sem.h对名字为sem的OS_EVENT指针创建一个外部参考。空语句ALT_STATIC_SEM(sem)os/alt_sem.h对名字sem创建一个静态OS_EVENT指针。空语句ALT_S
47、EM_CREATE(sem, value)os/alt_sem.h调用OSSemCreate(),用参数value初始化OS_EVENT指针sem。成功时返回0,否则返回值为负。调用成功时返回0ALT_SEM_PEND(sem, timeout)os/alt_sem.h调用OSFlagPend(),前2个输入参数分别为设置为sem, timeout ,宏的返回值是错误码。调用成功时返回0ALT_SEM_POST(sem)os/alt_sem.h调用OSSemPost(),输入参数为sem。调用成功时返回05Newlib中ANSI C标准库 基于C/OS-II的程序也能调用ANSI C标准库函数
48、。在多线程环境中要保证C标准库函数是线程安全的,必须注意一些问题。Newlib中C库把所有的全局变量存在一个由- -inpure-ptrinpure-ptr指针指示的结构中。然而Altera的C/OS-II接口为每个任务创建一个新的结构实例。根据上下关开关,-inpure-ptr-inpure-ptr被更新并指向这个结构的当前任务。采用这种方法,由-inpure-ptr-inpure-ptr指向的结构内容被当作是本地线程,例如,通过这种机理,每个任务有它自己的错误号(errno)。 8.3 C/OS-II8.3 C/OS-II实时操作系统实时操作系统l 8.3.1 C/OS-II8.3.1 C
49、/OS-II实时操作系统简介实时操作系统简介l 8.3.2 C/OS-II 8.3.2 C/OS-II 在在Nios IINios II上的移植上的移植l 8.3.3 Nios II IDE8.3.3 Nios II IDE中中C/os-IIC/os-II工程的实现工程的实现 l 8.3.4 8.3.4 软硬件要求软硬件要求l 8.3.5 8.3.5 在在Nios IINios II中建立中建立C/os- IIC/os- II工程工程 n要创建基于C/OS-II的程序,必须首先为C/OS-II工程中的系统库设置相应属性,Nios II IDE提供RTOS选项,允许控制C/OS-II内核的配置。
50、n传统地,必须在文件OS_CFG.hOS_CFG.h中用#define去配置C/OS-II,而Nios II IDE却提供一个GUI允许对每个选项进行配置。所以不需要编辑头文件或源代码,即可配置C/OS-II选项。GUI的设置反映在系统库中的system.hsystem.h文件中,而OS_CFG.hOS_CFG.h简单地包括system.hsystem.h。8.3.3 Nios II IDE8.3.3 Nios II IDE中中C/os-IIC/os-II工程的实现工程的实现 1通用选项 表表8-4列出了列出了C/OS-II的通用选项。表8-4 通用选项选项描述Maximum number o