sopc课件第八章.ppt_第1页
sopc课件第八章.ppt_第2页
sopc课件第八章.ppt_第3页
sopc课件第八章.ppt_第4页
sopc课件第八章.ppt_第5页
免费预览已结束,剩余225页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章目录,8.1异常处理程序的开发8.1.1NiosII异常分类8.1.2硬件抽象层的实现8.1.3中断服务程序(ISRs),8.2缓存和紧耦合存储器的编程8.2.1复位后缓存的初始化8.2.2设备驱动程序中缓存的编程8.2.3装载程序或自更新程序的编写8.2.4多主/多CPU系统中缓存的管理8.2.5紧耦合存储器概述8.2.6紧耦合存储器接口8.2.7使用紧耦合存储器创建NiosII系统,8.3C/OS-II实时操作系统8.3.1C/OS-II实时操作系统简介8.3.2C/OS-II在NiosII上的移植8.3.3NiosIIIDE中C/os-II工程的实现8.3.4软硬件要求8.3.5在NiosII中建立C/os-II工程,8.4以太网与轻量IP8.4.1轻量IP概述8.4.2轻量IP协议栈的使用8.4.3NiosIIIDE中轻量IP的配置8.4.4设计实例的软硬件环境8.4.5实例的设计文件8.4.6软件开发流程8.4.7SimpleSocketServer设计概述,8.5NiosII多处理器系统8.5.1多处理器系统设计概述8.5.2多处理器系统的优势8.5.3NiosII多处理器系统硬件设计8.5.4NiosII多处理器系统的资源共享8.5.5NiosII多处理器系统软件设计8.5.6NiosII多处理器系统设计实例,8.6定制NiosII用户指令8.6.1NiosII定制指令综述8.6.2定制指令实现方式8.6.3定制指令设计示例,8.7定制基于Avalon的用户外设8.7.1设计概述8.7.2组件开发流程8.7.3设计实例PWM从端口,8.1异常处理程序的开发8.1.1NiosII异常分类8.1.2硬件抽象层的实现8.1.3中断服务程序(ISRs),8.1异常处理程序的开发8.1.1NiosII异常分类8.1.2硬件抽象层的实现8.1.3中断服务程序(ISRs),NiosII处理器的异常分为两大类:硬件中断异常软件异常,8.1.1NiosII异常分类,软件异常又分为:未实现指令软件陷阱其他异常,8.1异常处理程序的开发8.1.1NiosII异常分类8.1.2硬件抽象层的实现8.1.3中断服务程序(ISRs),(2)确定ipending是否不为零。若ipending有非零位,则异常是一个硬件中断;若所有位均为0,则异常是一软件异常。,HAL系统库提供的异常处理程序位于异常地址,它采用以下方法区分硬件中断和软件异常:,(1)确定estatus寄存器的EPIE位是否被允许。若不允许,则是一个软件异常;若EPIE允许,则继续下一步。,8.1.2硬件抽象层的实现,alt_irq_entry若NiosII系统包含硬件中断,顶层汇编子程序alt_irq_entry位于异常地址。这个汇编子程序检查产生了何种类型中断,调用相应子程序。软件中断调用一个Software_exception;硬件中断调用Alt_irq_handler子程序,该方法使用如下3个子程序:alt_irq_entry()alt_irq_handler()software_exception(),software_exceptionsoftware_exception子程序确定软件中断源。它主要确定引起软中断的未实现指令,并调用相应的指令仿真子程序。,若NiosII系统不包含产生硬件中断的外设,software_exception子程序直接被放在异常地址,另外,alt_irq_entry和alt_irq_handler不被链接到工程。,alt_irq_handler函数alt_irq_handler()确定中断源(例如,引起中断的设备中断号)和执行已注册的相应的处理函数。IRQ0优先级最高,IRQ31最低。,1未实现指令software_exception为每一条未实现指令定义了一个仿真子程序,采用这种方式,可支持NiosII的所有指令,而并不是所有NiosII的指令都可由硬件实现。另一方面,若一条指令由硬件实现,决不会发生相应指令的软件中断。仿真子程序很小,从一个目标NiosII核中去掉它们不会有什么影响。未实现指令和无效指令含义不同,software_exception子程序不能检测或响应一个无效指令。若指令字中的OP和OPX域的编码未定义,其指令执行结果也未定义。,2软件陷阱异常处理当前,software_exception对软件陷阱异常执行一个空操作。虽然没有陷阱处理程序,在alt_exception.s中代码仍检测OP和OPX编码。当陷阱的OP/OPX条件满足时,软件中断被发起,可以转到用户自己的陷阱处理程序。祥见alt_exception.s中的注释。,3其他的异常类型未来NiosII处理器核可能定义新的异常类型。HAL实现未考虑当前未定义的异常类型。,8.1异常处理程序的开发8.1.1NiosII异常分类8.1.2硬件抽象层的实现8.1.3中断服务程序(ISRs),NiosII处理器与外设的通讯通常由中断来实现。当某外设提出IRQ时,相对处理器的正常执行流产生了一个异常。当中断发生时,相应的ISR必须处理该中断且中断处理完后使处理器返回到处理前的状态。,8.1.3硬件抽象层的实现,下面讨论HAL系统库中中断处理的框架,1ISRs的HALAPI2.利用alt_irq_register()函数注册ISR3ISR的编写4.ISRs的允许和禁止5ISR的快速处理6描述ISR性能的参数7ISRs的调试8编写ISRs方法小结,1ISRs的HALAPI,利用HALAPI实现ISRs分为2步。首先,为某一特定外设中断写一中断服务程序。其次,必须使用alt_irq_register()函数注册该ISRs。在ISR执行期间,程序中可用alt_irq_enable_all()和alt_irq_disable_all()函数允许和禁止中断。注意:禁止中断影响中断延迟,故影响系统性能。,2.利用alt_irq_register()函数注册ISR,HAL把alt_irq_register()函数指针注册到一查找表中,当某一个ISR出现时,HAL在查找表中查找该IRQ且调度(dispatch)已注册的ISR。若ISR成功注册,从alt_irq_register()返回后,相应中断(由id定义)被允许。,3ISR的编写,用户编写的ISR必须与alt_irq_register()要求的原型匹配,ISR函数的原型应该与voidisr(void*context,alt_u32id)原型匹配。Context和id参数的定义与alt_irq_register()函数中的定义相同。ISR函数负责清除或屏蔽相应的中断条件,之后返回到中断处理程序。ISRs运行环境受到一定限制,在ISRs中许多HALAPI调用不可用。例如,在ISRs中不允许访问HAL文件系统。一般来讲,ISR中决不应包括那些可能影响等待中断的函数调用。,注意:当最慢的ISR中指令少于70条指令时,允许中断嵌套增加了较高优先级中断的中断延迟。此时中断处理程序中不应该开中断。,4.ISRs的允许和禁止,HAL提供alt_irq_disable()、alt_irq_enable()、alt_irq_disable_all()、alt_irq_enable_all()和alt_irq_enabled()等函数,允许在某段程序之前关中断,之后再开中断。alt_irq_disable()和alt_irq_enable()可禁止和允许某个中断,alt_irq_disable_all()禁止所有中断,返回一个上下文相关值。调用alt_irq_enable_all()开放所有中断,且传递上下文参数,采用这种方式,中断返回到调用alt_irq_disable_all()之前的状态。若中断被允许,alt_irq_enabled()返回一非零值,允许程序检查中断的状态。注意:关中断的时间应尽可能短,原因是当关中断时间增加时,最大中断延迟也增加。,6描述ISR性能的参数,表8-1注:(1)表中数字表示CPU时钟周期。,表8-1中断的性能参数,表8-1列出了每种NiosII核的中断延迟、响应时间和恢复时间。,7ISRs的调试,在NiosIIIDE环境下通过在ISR内设断点可对ISR进行调试。调试器完当执行到断点处,全停止处理器的运行,同时,系统中硬件继续工作。因此当处理器停止时,其他的IRQs可能被忽略。利用Debugger可单步调试ISR,但其他采用中断驱动的设备驱动程序的状态只有当处理器回到正常的状态时才有效。必须使处理器复位才能使系统回到已知状态。在单步期间,Ipending寄存器(ct14)被屏蔽为全0,这使得单步期间CPU不响应IRQs。结果,若单步调试需读取ipending寄存器的异常处理程序(例_irq_entry()或alt_irq_handler())时,代码无法检测任何已登记的IRQs。断点不影响软件异常的调试。可以在ISR中设断点(且单步运行),因为异常处理程序已使用Ipengding来确定哪个IRQ引起了异常。,8编写ISRs方法小结,使用HALAPI提供的alt_irq_register()函数注册ISR。编写的ISR函数应与原型voidisr(void*context,alt_u32id)匹配。尽可能减少ISR中的任务量。从中断返回后,再对耗时较长的任务进行处理。ISR可使用消息传递机制通知ISR以外的耗时长的任务。在ISR内部不要使用C标准库中的I/O函数,比如printf()。在ISR中使用alt_irq_interruptible(),alt_irq_non_interruptible()允许和禁止高优先级的ISRs,若ISR很短,没有必要在其内部允许较高优先级的中断。要得到最快的执行性能,异常处理程序和ISR代码应存放在快速存储器中。,8.2缓存和紧耦合存储器的编程8.2.1复位后缓存的初始化8.2.2设备驱动程序中缓存的编程8.2.3装载程序或自更新程序的编写8.2.4多主/多CPU系统中缓存的管理8.2.5紧耦合存储器概述8.2.6紧耦合存储器接口8.2.7使用紧耦合存储器创建NiosII系统,8.2缓存和紧耦合存储器的编程,NiosII处理器核可以包含指令和数据缓存。幸运的是:大部分建立在HAL系统库上的软件,不需要对缓存进行特别的考虑,均可在NiosII处理器上正常运行。但某些程序必须直接管理缓存。,NiosII提供一些方法来进行以下操作:,初始化指令和数据缓存行。刷新指令和数据缓存行。装载和存储指令时,旁路数据缓存。,8.2缓存和紧耦合存储器的编程8.2.1复位后缓存的初始化8.2.2设备驱动程序中缓存的编程8.2.3装载程序或自更新程序的编写8.2.4多主/多CPU系统中缓存的管理8.2.5紧耦合存储器概述8.2.6紧耦合存储器接口8.2.7使用紧耦合存储器创建NiosII系统,8.2缓存和紧耦合存储器的编程8.2.1复位后缓存的初始化8.2.2设备驱动程序中缓存的编程8.2.3装载程序或自更新程序的编写8.2.4多主/多CPU系统中缓存的管理8.2.5紧耦合存储器概述8.2.6紧耦合存储器接口8.2.7使用紧耦合存储器创建NiosII系统,8.2.2设备驱动程序中缓存的编程,HAL提供C语言的宏IORD和IOWR,用来扩展旁路数据缓存的汇编指令。IORD宏对ldwio指令进行扩展,IOWR宏对stwio指令进行扩展,HAL设备驱动程序访问设备寄存器时应使用这些宏。,表8-2旁路数据缓存的HALI/O宏,8.2缓存和紧耦合存储器的编程8.2.1复位后缓存的初始化8.2.2设备驱动程序中缓存的编程8.2.3装载程序或自更新程序的编写8.2.4多主/多CPU系统中缓存的管理8.2.5紧耦合存储器概述8.2.6紧耦合存储器接口8.2.7使用紧耦合存储器创建NiosII系统,8.2.3装载程序或自更新程序的编写,把指令写入存储器的软件,例如装载程序或自更新程序应保证对指令缓存和CPU流水(pipleline)中的原有指令进行刷新。刷新分别由flushi和flushp指令来完成。另外,若使用未旁路数据缓存的存储指令将新指令写入存储器时,必须使用flushd指令从数据缓存中刷新新指令到存储器中。,下面程序段写一条新指令到存储器中:,/*Assumenewinstructioninr4andinstructionaddressalreadyinr5.*/stwr4,0(r5)flushd0(r5)flushir5flushpStw指令将r4中的新指令写到r5所指示的地址处。若数据缓存存在,指令被写到数据缓存且相应行被标识为“脏”。Flushi指令使与r5中地址相关的数据缓存行无效。最后flushp指令保证CPU流水在r5指示的地址处没有对过时指令进行预取。注意上面代码使用stw/flushd对,而没有使用stwio指令,使用stwio指令不刷新数据缓存,因而过时的数据被留在数据缓存中,HALAPI没有提供缓存管理函数。,8.2缓存和紧耦合存储器的编程8.2.1复位后缓存的初始化8.2.2设备驱动程序中缓存的编程8.2.3装载程序或自更新程序的编写8.2.4多主/多CPU系统中缓存的管理8.2.5紧耦合存储器概述8.2.6紧耦合存储器接口8.2.7使用紧耦合存储器创建NiosII系统,8.2.4多主/多CPU系统中缓存的管理,Ldio/stio指令旁路数据缓存。Bit-31提供了旁路数据缓存的另一种选择方法。使用Bit-31缓存旁路,ld/st指令可用于旁路数据缓存,条件是地址的最高位(bit31)被设置为1。Bit-31仅在CPU内部使用,在实际地址访问时Bit-31被强制为0。这使得最大字节寻址范围为31位。,Bit-31Cache旁路,8.2缓存和紧耦合存储器的编程8.2.1复位后缓存的初始化8.2.2设备驱动程序中缓存的编程8.2.3装载程序或自更新程序的编写8.2.4多主/多CPU系统中缓存的管理8.2.5紧耦合存储器概述8.2.6紧耦合存储器接口8.2.7使用紧耦合存储器创建NiosII系统,图8-1是一个简单的NiosII系统的方块图,其中包括紧耦合存储器和其他Avalon组件。,图8-1具有紧耦合指令和数据存储器的NiosII系统,2软件指南,对使用紧耦合存储器的NiosII软件,应注意:软件访问紧耦合存储器地址和访问其他存储器地址一样。对紧耦合存储器进行缓存操作没有任何影响。,8.2缓存和紧耦合存储器的编程8.2.1复位后缓存的初始化8.2.2设备驱动程序中缓存的编程8.2.3装载程序或自更新程序的编写8.2.4多主/多CPU系统中缓存的管理8.2.5紧耦合存储器概述8.2.6紧耦合存储器接口8.2.7使用紧耦合存储器创建NiosII系统,8.2缓存和紧耦合存储器的编程8.2.1复位后缓存的初始化8.2.2设备驱动程序中缓存的编程8.2.3装载程序或自更新程序的编写8.2.4多主/多CPU系统中缓存的管理8.2.5紧耦合存储器概述8.2.6紧耦合存储器接口8.2.7使用紧耦合存储器创建NiosII系统,8.2.7使用紧耦合存储器创建NiosII系统,系统创建步骤如下:(1)修改一个包含紧耦合存储器的参考设计。(2)在SOPCBuilder中创建紧耦合存储器。(3)连接紧耦合存储器到主端口。(4)更改紧耦合存储器的地址。(5)將NiosII异常地址指向紧耦合存储器。(6)添加一个性能计数器。(7)产生硬件系统。(8)创建一个使用紧耦合存储器的软件工程。(9)指定独立的异常堆栈。(10)改变工程的编译属性。(11)运行基于新硬件的软件。,8.3C/OS-II实时操作系统8.3.1C/OS-II实时操作系统简介8.3.2C/OS-II在NiosII上的移植8.3.3NiosIIIDE中C/os-II工程的实现8.3.4软硬件要求8.3.5在NiosII中建立C/os-II工程,8.3C/OS-II实时操作系统8.3.1C/OS-II实时操作系统简介8.3.2C/OS-II在NiosII上的移植8.3.3NiosIIIDE中C/os-II工程的实现8.3.4软硬件要求8.3.5在NiosII中建立C/os-II工程,8.3.1C/OS-II实时操作系统简介,C/OS-II的构思巧妙,结构简洁精炼,可读性强,同时又具备了实时操作系统的全部功能,其体系结构如图8-7所示。,图8-7C/OS-II体系结构,8.3C/OS-II实时操作系统8.3.1C/OS-II实时操作系统简介8.3.2C/OS-II在NiosII上的移植8.3.3NiosIIIDE中C/os-II工程的实现8.3.4软硬件要求8.3.5在NiosII中建立C/os-II工程,C/OS-II是一种通用的实时内核,它是一个可移植的、可裁剪的、抢占式的、实时的多任务内核。从1992年以来,除了NiosII处理器外,该OS已应用于数百个商业应用场合,已被移植到超过40个不同结构的处理器。C/OS-II提供下列服务:,任务(线程)事件标志消息传递存储器管理信号量时间管理,8.3.2C/OS-II在NiosII上的移植,1C/OS-II结构,C/OS-II在NiosII处理器上的移植是HAL的一个超集,C/OS-II调度器和相应的C/OS-IIAPI对HAL环境进行了扩展,在C/OS-II工程中可调用所有的HALAPI。,图8-8C/OS-II程序结构图,图8-8是建立在C/OS-II上的程序结构图以及与HAL的关系图。注意,多线程的环境影响某些HAL的函数。,2C/OS-II多线程调试,当调试C/OS-II应用程序时,debugger可显示应用程序中所有线程的当前状态,包括寄存器的值。Debugger无法改变当前线程,或者单步运行不同的线程。,3C/OS-II设备驱动程序,在components下的HAL目录下,在inc和src子目录下,提供每个外设(例如,一个SOPCBuilder器件)的include文件和源文件。除了HAL目录,某个component也可能包含提供针对C/OS-II环境的代码的UCOSII目录。与HAL目录类似,UCOSII目录包含inc和src子目录。当在NiosIIIDE中建立C/OS-II工程时,这些子目录自动添加到源和include的搜索路径中。,4安全线程HAL驱动程序,为了方便同一驱动程序在HAL和C/OS-II环境中的移植,Altera定义了一组与OS无关的宏,用来提供对OS的访问。当编译C/OS-II工程时,宏扩展到一个C/OS-IIAPI调用,当编译单线程HAL工程时,宏扩展成空,在Altera提供的设备驱动程序中使用这些宏,当编写具有类似可移植性的设备驱动程序时也可以使用这些宏。,表8-3列出了可用的宏及它们的功能。表中头文件的路径是:/components/micrium_uc_osii/UCOSII/inc。,表8-3线程安全的HAL驱动器所使用的与OS无关的宏,5Newlib中ANSIC标准库,基于C/OS-II的程序也能调用ANSIC标准库函数。在多线程环境中要保证C标准库函数是线程安全的,必须注意一些问题。Newlib中C库把所有的全局变量存在一个由-inpure-ptr指针指示的结构中。然而Altera的C/OS-II接口为每个任务创建一个新的结构实例。根据上下关开关,-inpure-ptr被更新并指向这个结构的当前任务。采用这种方法,由-inpure-ptr指向的结构内容被当作是本地线程,例如,通过这种机理,每个任务有它自己的错误号(errno)。,8.3C/OS-II实时操作系统8.3.1C/OS-II实时操作系统简介8.3.2C/OS-II在NiosII上的移植8.3.3NiosIIIDE中C/os-II工程的实现8.3.4软硬件要求8.3.5在NiosII中建立C/os-II工程,要创建基于C/OS-II的程序,必须首先为C/OS-II工程中的系统库设置相应属性,NiosIIIDE提供RTOS选项,允许控制C/OS-II内核的配置。传统地,必须在文件OS_CFG.h中用#define去配置C/OS-II,而NiosIIIDE却提供一个GUI允许对每个选项进行配置。所以不需要编辑头文件或源代码,即可配置C/OS-II选项。GUI的设置反映在系统库中的system.h文件中,而OS_CFG.h简单地包括system.h。,8.3.3NiosIIIDE中C/os-II工程的实现,1通用选项,表8-4列出了C/OS-II的通用选项。,表8-4通用选项,2事件标志选项,表8-5列出了所有的事件标志选项。,表8-5事件标志选项,3MutexSettings,表8-6列出了所有的互斥选项。,表8-6MutexSettings,4SemaphoresSettings,表8-7列出了所有的信号量选项。,表8-7SemaphoresSettings,5MailboxesSettings,表8-8列出了所有的邮箱选项。,表8-8MailboxesSettings,6QueuesSettings,表8-9列出了所有的队列选项。,表8-9QueuesSettings,7.MemoryManagementSettings,表8-10列出了存储器管理选项。,表8-10MemoryManagementSettings,8.MiscellaneousSettings,表8-11列出了杂项选项。,表8-11MiscellaneousSettings,9.TaskManagementSettings,表8-12列出了任务管理选项。,表8-12TaskManagementSettings,10.TimeManagementSettings,表8-13列出了时间管理选项。,表8-13TimeManagementSettings,8.3C/OS-II实时操作系统8.3.1C/OS-II实时操作系统简介8.3.2C/OS-II在NiosII上的移植8.3.3NiosIIIDE中C/os-II工程的实现8.3.4软硬件要求8.3.5在NiosII中建立C/os-II工程,8.3.4软硬件要求,本节介绍的设计实例软硬件要求如下:QuartusIIversion4.1SP1或以上版本。NiosII嵌入式处理器版本1.01或以上版本。Nios开发板StratixIIEdition、CycloneEdition、StratixEdition或StratixProfessionalEdition。AlteraUSB-Blaster或ByteBlaster电缆。,8.3C/OS-II实时操作系统8.3.1C/OS-II实时操作系统简介8.3.2C/OS-II在NiosII上的移植8.3.3NiosIIIDE中C/os-II工程的实现8.3.4软硬件要求8.3.5在NiosII中建立C/os-II工程,8.3.5在NiosII中建立C/os-II工程,图8-9应用程序简化的结构图,如图8-9所示,设计中有5个活动的任务。Send_task将增加的数据添加到消息队列中,receive_task1和receive_task2周期地从队列中取出数据,getsem_task1和getsem_task2竞争由信号量保护的共享资源。另外还有两个图中未表示的任务:初始化和打印状态信息。创建NiosII处理器的C/OS-II软件的步骤如下:(1)创建一个NiosIIIDE工程。(2)配置NiosII软件库工程。(3)编译和运行NiosII软件工程。,8.4以太网与轻量IP8.4.1轻量IP概述8.4.2轻量IP协议栈的使用8.4.3NiosIIIDE中轻量IP的配置8.4.4设计实例的软硬件环境8.4.5实例的设计文件8.4.6软件开发流程8.4.7SimpleSocketServer设计概述,8.4以太网与轻量IP8.4.1轻量IP概述8.4.2轻量IP协议栈的使用8.4.3NiosIIIDE中轻量IP的配置8.4.4设计实例的软硬件环境8.4.5实例的设计文件8.4.6软件开发流程8.4.7SimpleSocketServer设计概述,8.4.1轻量IP概述,LightweightIP(LWIP)是TCP/IP组的small_footprint实现。IWIPTCP/IP实现的关键是:在提供全部TCP/IP的同时减少了资源的使用。IWIP被设计用于具有存贮容量有限的嵌入式系统,使它适用于NiosII处理器系统。,LWIP包括下列特性:IP包括在多个网络接口上转发的数据包。Internet信报控制协议(ICMP)用于网络维护和调试。用户数据报协议(UDP)。TCP包括阻塞控制、RTT估计和快速恢复和快速重发。动态主机配置协议(DHCP)。以太网地址解析协议(ARP)。标准套接字API。,Altera的LWIP端口使用C/OSIIRTOS多线程环境。所以,要使用LWIP,必须建立基于C/OSIIRTOS的C/C+工程。NiosII处理器系统也必须包含以太网接口。目前,Altera提供的LWIP驱动程序仅支持SMSCLAN91C111MAC/PHY设备,该设备也是开发板上所使用的。LWIP驱动程序采用中断驱动,所以必须保证以太网组件的中断被连接。Altera的LWIP接口是基于HAL的通用以太网设备模型。根据这个模型,你可编写新的驱动程序以支持任意目标以太网MAC(mediaaccesscontroller),便于维护访问硬件的HAL和套接字API的一致性。,2LWIP的文件和目录,在NiosIIIDE环境中,在C/C+程序中使用LWIP无需编写源代码,Altera提供参考源代码。缺省状态下,文件安装在componentsAltera_LwipUCOSII目录下。UCOSIIsrcdownloadsLwip_1.1.0目录包含原始的LWIPV1.1.0源代码;UCOSIIsrcdownloadsLwip4ucosii目录含有为C/OSII端口编写的源码。LWIP的Altera端口是基于协议栈的1.1.0版本,对代码进行封装并将它集成到HAL系统库。有关LWIP的背景信息和许可详情,请参考/projects/lwip/网址。,8.4以太网与轻量IP8.4.1轻量IP概述8.4.2轻量IP协议栈的使用8.4.3NiosIIIDE中轻量IP的配置8.4.4设计实例的软硬件环境8.4.5实例的设计文件8.4.6软件开发流程8.4.7SimpleSocketServer设计概述,8.4.2轻量IP协议栈的使用,LWIP协议栈的主要接口是标准的套接字接口,除了套接字接口以外,可以调用下列函数对堆栈和驱动程序初始化。Lwip_stack_init()Lwip_devices_init()HAL系统代码调用下列简单函数设置MAC地址和IP地址。init_done_func()get_mac_addr()get_ip_addr(),1NiosII系统需求,为了能够使用LWIP,NiosII系统必须满足下列条件:系统硬件必须包括中断允许的以太网接口。系统库必须基于C/OSII。,3堆栈初始化,为了初始化堆栈,调用OSStart启动C/OSII调度程序之前调用函数lwip_stack_int()。(1)lwip_stack_int()lwip_stack_init()对协议栈进行设置。它的原型是:voidlwip_stack_init(intthread_prio,void(*init_done_func)(void*),void*arg),lwip_stack_int()返回空且有下列参数:thread_prioTCP/IP主线程的优先级。init_done_func指向堆栈初始化后被调用函数的指针。arg传递到init_done_func()的一个参数,通常被设为0。(2)init_done_func()堆栈初始化后必须调用init_done_func(),init_done_func()函数必须调用lwip_devices_init(),该函数初始化所有已安装的以太网设备驱动程序,之后创建接收任务。init_done_func()的原型是:voidint_done_func(void*arg)。,(4)get_mac_addr()与get_ip_address(),LWIP系统码在设备初始化过程中调用get_mac_addr()和get_ip_address()。用户通过编写这些函数,在系统中可将MAC和IP地址存放在任意位置,从而代替在设备驱动程序中固定位置的硬编码(hard-coded),即可增加系统的灵活性。例如,某些系统将MAC地址存放在Flash存储器中,而其他系统将MAC地址存放在片上内嵌的存储器中。两个函数的参数是IWIP内部使用的设备结构,但不需要知道结构的细节,只需要了解如何填写MAC和IP地址。,get_mac_addr()的原型是:err_tgat_mac_addr(alt_lwip_dev*lwip_dev)。在函数内,用户必须填写alt_lwip_dev结构中定义MAC地址的相关域:,unsignedcharlwip_devnetifhwaddr_lenMAC地址的长度,应该是6。unsignedcharlwIP_devnetifhwaddr0-5设备的MAC地址。get_mac_addr()的原型在头文件UCOSIIincalt_lwip_dev.h中。Netif结构在文件UCOSIIsrcdownloadslwip-1.1.0srcincludelwipnetif.h中被定义。,4套接字接口的调用,以太网设备初始化结束后,后面的程序应该使用套接字API访问IP栈。必须使用sys_thread_new()函数创建使用套接字API与IP栈对话的新任务。sys_thread_new()函数是创建线程的IWIPOS端口层中的一部分,它调用C/OSII的OSTaskCreate()函数,且进行其他一些IWIP特定的操作。,sys_thread_new()函数的原型是:sys_thread_tsys_thread_new(void(*thread)(void*arg),void*arg,intprio);其原型在ucosIIsrcdownloadslwIP-1.1.0srcincludelwIPsys.h.头文件中定义。可用语句#include“lwIP/sys.h”包含它。其他有关OS端口层的详细内容可参考目录UCOSIIsrcdownloadslwip4ucosiiucos-ii下的sys_arch.c文件。,8.4以太网与轻量IP8.4.1轻量IP概述8.4.2轻量IP协议栈的使用8.4.3NiosIIIDE中轻量IP的配置8.4.4设计实例的软硬件环境8.4.5实例的设计文件8.4.6软件开发流程8.4.7SimpleSocketServer设计概述,8.4.3NiosIIIDE中轻量IP的配置,在文件lwipopts.h.中需要用#define对IWIP的协议栈的多个选项进行配置。利用NiosIIIDE提供的GUI,不用编辑源代码,就可以配置IWIP选项。大部分常用的选项通过GUI都可以修改,但也有某些选项必须在lwipopts.h.中通过手动修改。下面描述可以通过NiosIIIDE进行配置的选项,GUI为每个选项提供缺省值。可根据需要进行修改。,1轻量TCP/IP栈的通用设置,ARP和IP协议总是被允许,表8-14列出了协议的选项。,表8-14ProtocolOptions,表8-15列出了影响TCP/IP栈整体特性的全局选项。,8-15全局选项,5TCP选项,表8-16列出了TCP选项。,表8-16TCP选项,表8-17存储器选项,8.4以太网与轻量IP8.4.1轻量IP概述8.4.2轻量IP协议栈的使用8.4.3NiosIIIDE中轻量IP的配置8.4.4设计实例的软硬件环境8.4.5实例的设计文件8.4.6软件开发流程8.4.7SimpleSocketServer设计概述,8.4以太网与轻量IP8.4.1轻量IP概述8.4.2轻量IP协议栈的使用8.4.3NiosIIIDE中轻量IP的配置8.4.4设计实例的软硬件环境8.4.5实例的设计文件8.4.6软件开发流程8.4.7SimpleSocketServer设计概述,下面的7个源代码文件组成了IWIP的设计实例SimpleSocketServer。alt_error_handler.c包含SimpleSocketServer(SSS)、IWIP和C/OS-II3种错误的处理程序。alt_error_handler.h3种错误处理程序的函数定义和原型说明。led.c包含LED管理任务。lwip_init.c定义main()函数,对IWIP和C/OS-II进行初始化,init_done_func()是IWIP的回调函数。network_utilities.c定义管理MAC和IP地址的函数。simple_socket_server.c定义利用IWIP套接字接口并且创建所有C/OS-II资源的任务和函数。simple_socket_server.h定义所有的任务原型、任务优先级和其他被使用的C/OS-II资源。,8.4以太网与轻量IP8.4.1轻量IP概述8.4.2轻量IP协议栈的使用8.4.3NiosIIIDE中轻量IP的配置8.4.4设计实例的软硬件环境8.4.5实例的设计文件8.4.6软件开发流程8.4.7SimpleSocketServer设计概述,8.4以太网与轻量IP8.4.1轻量IP概述8.4.2轻量IP协议栈的使用8.4.3NiosIIIDE中轻量IP的配置8.4.4设计实例的软硬件环境8.4.5实例的设计文件8.4.6软件开发流程8.4.7SimpleSocketServer设计概述,8.4.7SimpleSocketServer设计概述,1NiosII软件结构,图8-26显示了NiosII软件结构层。,图8-26分层的软件模型,lwIPSoftwareComponent该层通过套接字API为应用层和应用系统初始化层提供网络服务。Application-SpecificSystemInitialization该层从main()中激活的C/OS-II和IWIP软件组件初始化函数,也包含所有应用程序的任务、信号量、队列和事件标志的实时操作系统任务间通讯资源的创建。Application最外一层包含SimpleSocketServer任务、LED管理任务和网络实用程序DHCP超时任务。图8-27描述了SimpleSocketServer的结构。图中显示了所有初始化完成后的系统状态。IWIP软件接收以太网数据包,数据包中包含来自Telnet客户端程序的LED命令。IWIP软件通过TCP/IP协议处理接收的以太网数据包,通过套接字API将数据包提交给套接字服务器任务,之后数据包中的LED命令被释放且被送到LED命令队列,等待LED管理任务进行处理。,图8-26SimpleSocketServer数据流图,2软件设计命名约定,在SimpleSocketServer设计中使用大写字母的缩写词为软件模块命名,每个软件模块中代表公共资源的变量命名也采用同样的约定,而用带有下画线的小写字母表示内部使用的私有资源或函数。实例中软件模块命名如表8-18所示。,表8-18软件模块首缩词与名称,SSSLEDLightshowSemSSSLEDLightshowSem是C/OSII的LED显示信号量。每次更新LED(U8和U9)显示时,LED7SegLightshowTask检查这个信号量。LEDManagementTask()获取信号量,通过pend,退出LED7SegLightshowTask(),使灯显示关闭;放弃信号量,通过post,使灯显示ON。当用户通过TCP/IP套接字发送开关灯显示命令时,LEDManagementTask()响应SSSSimpleSocketServerTask()发送的CMD_LEDS_LIGHTSHOW命令,进行以上操作。SSSAttainedIPAddressSemSSSAttainedIPAddressSem是C/OSII的IP地址信号量。当IP地址已被设置时,这个信号量被发送。打开套接字之前,为了等待一个有效的IP地址,应用程序能够pend这个信号量。,在lwip_devices_init()中,以太网数据包接收处理任务创建时的优先级是LWIP_RX_ETHER_TASK_PRIORITY。当一个以太网数据包被接收时,以太网接收中断处理程序清除该位,将一个消息放在该任务的队列中。高优先级的任务lwip_dev_rx()负责读入数据包,发送它们到IWIPTCP/IP网络栈任务。,(3)SSSInitialTask()(simple_socket_server.c)这个任务的功能是初始化操作系统的数据结构,创建其他任务。这个任务在初始化完成后删除自己。创建SSSLEDCommandQ、SSSLEDLightshowSemaphore和SSSLEDEventFlag等实时操作系统资源。创建非IWIP任务,包括LED任务。(4)网络公用程序任务(network_utilities.c)如果在2分钟内DHCP服务器没有设置动态地址,NETUTILSDHCPTimeoutTask()设置一个静态IP地址。,(5)SSSSimpleSocketServerTask()(simple_socket_server.c)创建一个为TCP/IP连接服务的套接字,绑定到套接字,侦听来自客户端的TCP/IP连接请求。为输入的TCP/IP连接调用sss_handle_accept()。调用sss_handle_receive()为TCP/IP连接服务。如果需要多个TCP/IP连接,可以修改这个任务,创建处理每个为TCP/IP连接的其他任务。调用sss_reset_connection()、sss_send_menu()和sss_exec_command()。当数据包被接收时,LED命令被释放且通过SSSLEDCommandQ被传递到LEDManagementTask()。,(6)LEDTasks(leds.c)LEDManagementTask()执行SSSLEDCommandQ上接收的命令,若接收的命令是CMD_LEDS_LIGHTSHOW,则开/关SSSLEDLightshowSem信号量;若接收的命令是CMD_LEDS_BIT_TOGGLE,则将命令发送到SSSLEDEventFlag,操作LEDSD0D7;若接收的命令是CMD_QUIT,则结束应用程序。LED7SegLightshowTask()使7段LED随机显示。基于SSSLEDLightshowSem信号量,发送到LEDManagementTask()的命令CMD_LEDS_LIGHTSHOW控制这个任务挂起和更新LED。,另一方面,注意不要同时在几个任务中过分使用作业分布,原因如下:额外的任务需要额外的CPU执行时间来完成任务上下文切换。优先级的级数是有限的。在C/OSII中,每个任务有它自己的优先级,任务的优先级没必要用完。,只要命令被传递,LEDManagementTask()被调度从SSSLEDCommandQ移除一个消息。虽然它是由一个很少发生的异常引起的,队列满条件仍然必须被处理。,LED_MANAGEMENT_TASK_PRIORITY将任务优先级设为7,LEDManagementTask()是一个消费者任务,其优先级高于互补的生产者任务SSSSimpleSocketServerTask()。LED_7SEG_LIGHTSHOW_TASK_PRIORITY有一个低优先级18。这个任务的优先级最低,因为它类似于空闲任务。当系统无其他任务要完成时,系统给7段LEDs送随机数。,(4)TCP/IP的吞吐率性能在只有一个PC机与Nios开发板(StratixEdition)连接的封闭的网络中,下面的UDP吞吐率(兆位/秒)被测试。基准程序使用IWIP套接字接口和COSII实时操作系统。板子运行在50MHz,被配置为标准参考设计且NiosII/score改为NiosII/fcore。UDP发送的吞吐率为5.16Mbps,UDP接收的吞吐率为3.44Mbps。由于TCP协议的开销,TCP吞吐率的性能将会较低。(5)任务栈大小任务栈的空间需求与NiosII处理器、HAL、RTOS和软件组件的配置有关。程序运行时,检查任务栈顶端的一个简单的方法是,在NiosIIIDE存储器窗口,对STK数组值进行经验检测。对任务的检测将显示所有已使用的栈空间,未使用的栈显示为0。0的显示一直延伸到下一个相邻的任务栈的开始。,8.5NiosII多处理器系统8.5.1多处理器系统设计概述8.5.2多处理器系统的优势8.5.3NiosII多处理器系统硬件设计8.5.4NiosII多处理器系统的资源共享8.5.5NiosII多处理器系统软件设计8.5.6NiosII多处理器系统设计实例,8.5NiosII多处理器系统8.5.1多处理器系统设计概述8.5.2多处理器系统的优势8.5.3NiosII多处理器系统硬件设计8.5.4NiosII多处理器系统的资源共享8.5.5NiosII多处理器系统软件设计8.5.6NiosII多处理器系统设计实例,8.5NiosII多处理器系统8.5.1多处理器系统设计概述8.5.2多处理器系统的优势8.5.3NiosII多处理器系统硬件设计8.5.4NiosII多处理器系统的资源共享8.5.5NiosII多处理器系统软件设计8.5.6NiosII多处理器系统设计实例,8.5.2多处理器系统的优势,多处理器系统的性能得到提高,但同时其系统的复杂程度也增加。所以多处理器系统一般用于工作站和使用分载(load-sharing)的复杂算法(称之为对称多处理,SMP)的高端的PC计算。对大部分嵌入式系统,当SMP的开销太大时,使用多个处理器执行不同的任务和功能正引起越来越多的兴趣。Altera的FPGA为开发非对称的嵌入式多处理器系统提供了一个理想的平台。为了提供理想的系统性能,使用SOPCBuilder工具很容易对硬件进行修改和调整,可以很快完成不同配置系统的设计、编译和评估。,8.5NiosII多处理器系统8.5.1多处理器系统设计概述8.5.2多处理器系统的优势8.5.3NiosII多处理器系统硬件设计8.5.4NiosII多处理器系统的资源共享8.5.5NiosII多处理器系统软件设计8.5.6NiosII多处理器系统设计实例,1.独立的多个处理器,当独立的多处理器系统包含多个处

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论