APP下载

μ C/OS-Ⅱ操作系统在NiosⅡ上的移植研究

2010-04-21吴爱平长江大学电子信息学院湖北荆州434023

长江大学学报(自科版) 2010年4期
关键词:信号量堆栈内核

吴爱平 (长江大学电子信息学院,湖北荆州434023)

李勇华 (中石化胜利石油管理局钻井研究院,山东东营257000)

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

1 实时嵌入式操作系统μ C/OS-Ⅱ

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

2 NiosⅡ的构建

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

3 μ C/OS-Ⅱ在NiosⅡ上的移植

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

图1 SOPC Builder中NiosⅡ系统组件

3.1 HAL系统库

对基于NiosⅡ的软核 CPU而言,其设计开发使用NiosⅡIDE软件工具,该软件开发工具为NiosⅡ核提供HAL系统库[8]。HAL系统库是一个简化的运行环境,为底层硬件通信程序提供简单器件驱动接口,HAL应用程序接口(API)和ANSI C标准库集成在一起,用户可以通过HAL API通用设备模型访问硬件资源,如图3所示。ANSI C标准库与HAL的紧密结合使得软件开发成为可能[9]。例如可使用ANSI C标准库的I/O函数来操作字符模式设备和文件,如printf()、scanf()等。

图2 μ C/OS-Ⅱ硬件/软件体系结构

3.2 与处理器相关文件的编写

1)OS_CPU.H的编写 在OS_CPU.H文件中定义了与处理器(实际上是与编译器相关)的数据类型、堆栈增长方向以及系统软中断。定义了与处理器相关的宏,主要是进入临界区的OS_ENTER_CRITICAL()和退出临界区的OS_EXIT_CRITICAL()。

2)OS_CPU_C.C的编写 在OS_CPU_C.C文件中,需要编写6个与操作系统有关的函数。这6个函数是:OSTaskStkInit()、OSTaskCreatHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()和OSTaskTickHook()。在6个函数中只需对OSTaskStkInit()编写代码,后5个Hook函数必须声明,它们是由系统函数调用的钩挂函数,让用户能在操作系统中加入自己需要的一些功能,也可以为空函数,其内部可以没有代码。

OSTaskCreate()和OSTaskCreateExt()通过调用OSTaskStkInit()来初始化任务的堆栈结构,它需要的参数是任务代码起始地址、参数指针、任务堆栈顶端的地址。初始化任务的栈结构工作结束后,堆栈看起来就像中断刚发生过一样,所有寄存器都保存在堆栈中,从而可以利用中断返回指令使就绪的任务运转起来。NiosⅡ处理器的堆栈方向是地址由高到低递减方式。

图3 HAL系统库结构

3)OS_CPU_A.ASM的编写 该文件包括4个函数都涉及对寄存器的处理,跟处理器有关,由于不同处理器有不同寄存器,所以操作系统在这个文件里给用户留下4个函数接口,以便用户根据所选处理器编写相应的汇编程序以完成固定功能。μ C/OS-Ⅱ的移植要求用户编写4个汇编语言函数:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。OSStartHighRdy()函数由OSStart()调用,用来启动优先级最高的任务执行,负责从最高优先级任务的TCB控制块中获得该任务的堆栈指针sp,通过sp依次将CPU现场恢复;OSCtxSw()函数是一个任务级的任务切换函数,是在任务需要进行切换时被OS_TASK_SW()调用;OSIntCtxSw()函数是中断级的任务切换函数,被OSIntExit()调用,是在ISR中执行中断任务切换;OSTick ISR()函数是时钟节拍中断处理函数,在调用OSStart()后才可启动。它的主要任务是负责处理时钟中断,为内核提供时钟节拍。

4 移植测试

μ C/OS-Ⅱ移植完成后,需要进行测试,以验证移植的μ C/OS-Ⅱ是否能正常工作。测试中建立了10个任务:INITIALIZE_TASK为初始化任务;PRINT_STAT US_TASK为打印状态任务;light_led为点亮流水灯任务;light_LCD为液晶显示任务;SEG_Display为数码管显示任务;GETSEM_TASK1和GETSEM_TASK2任务是竞争由信号量保护的共享资源;RECEIVE_TASK1和RECEIVE_TASK2任务是周期性地从队列中取出数据;SEND_TASK任务是将增加的数据添加到消息队列中。硬件系统在Quartus II中配置编译完毕后,下载到DEⅡ板的FPGA芯片上,然后将在μ C/OS-Ⅱ内核上添加了任务的软件系统进行编译,下载到FPGA芯片内的NiosⅡ硬件系统中,系统开始运行。在NiosⅡIDE的控制台上可以看到PRINT_STATUS_TASK任务的执行情况如图4(a)和图4(b)所示;从DEⅡ板上可以看到light_led、light_LCD、SEG_Display这3个任务的执行情况,测试效果如图5所示。

图4 NiosⅡ IDE的控制台监控图

PRINT_STAT US_TASK任务的作用是在NiosⅡIDE的控制台上周期性地显示 “长江大学电子信息学院”、send_task发送的消息数、received_task1和received_task2接收到的消息数、得到信号量的任务名、getsem_task1和getsem_task1获得信号量的次数。图4(a)所示内容与图4(b)所示内容间隔3s钟交替出现,唯独变化的是其中的数据,从图4(a)和图 4(b)中看到SEND_TASK发送的消息数是1170,3s后SEND_TASK发送的消息数是1182,从中可以知道SEND_TASK任务每3s发送12条消息。同样可知RECEIVE_TASK1每3s接收9条消息,RECEIVE_TASK2每3s接收3条消息。

light_LCD任务使得在液晶上第1排显示Beijing Olimpics,第2排滚动显示Sichuan stand,Jiayou China!;SEG_Display任务使8个数码管分别显示12345678,1s后又显示 87654321,1s后又同时显示12345678,如此每一秒变化一次,无限循环下去;light_led任务让LED从左到右依次流水显示,每一秒变化一次,到头后再从右端开始点亮,无限循环下去。

图5 任务light_led、light_LCD、SEG_Display执行情况静态截图

通过对NiosⅡIDE的控制台监测和DE II板的实际硬件测试可以看出每个任务都只是在执行自己的操作,任务之间除了通过信号量、消息队列通信外,互相之间没有任何干扰,实时性非常好。

5 结 语

μ C/OS-Ⅱ作为优秀的实时操作系统已经被移植到许多体系结构的硬核微处理器上,笔者成功地将μ C/OS-Ⅱ嵌入式操作系统移植到了NiosⅡ软核微处理器上,实现了整个平台稳定可靠的运行。μ C/OS-Ⅱ和NiosⅡ相结合,可以构成一种基于可配置的软核处理器的嵌入式开发平台,该平台软、硬件均可按照用户需求进行剪裁配置,最大程度地提供了系统设计的灵活性,因此具有实际应用价值。

[1]安辉,孙昌志.颚藽/OS-Ⅱ操作系统在DSP上的移植及应用 [J].自动化技术与应用,2008,27(1):65~69.

[2]徐杰,宋建成.μ C/OS-Ⅱ操作系统在ARM7上移植的实现 [J].工矿自动化,2009,(6):49~52.

[3]周文.μ C/OS-Ⅱ在 AT89S51单片机上的移植 [J].计算机与现代化,2008,(4):17~22.

[4]孟庆峰.实时内核μ C/OS在S3C44B0XII上移植的研究与实现 [J],安徽电子信息职业技术学院学报,2008,(1):57~60.

[5]Altera.NiosⅡProcessor Reference Handbook[EB/OL].http://www.altera.com/literature/lit-nio2.jsp,2009.

[6]Labrosse J J.嵌入式实时操作系统uC/OS-Ⅱ[M].第2版.邵贝贝 译.北京:北京航天航空大学出版社,2003.

[7]巨政权,原亮.SOPC系统建立及μ Clinux移植实现 [J].微计算机信息,2009,25(4):43~45.

[8]李兰英.NiosⅡ嵌入式软核SOPC设计原理及应用[M].北京:北京航空航天大学出版社,2006.

[9]任爱锋.基于FPGA的嵌入式系统设计[M].西安:电子科技大学出版社,2004.

猜你喜欢

信号量堆栈内核
基于行为监测的嵌入式操作系统堆栈溢出测试*
强化『高新』内核 打造农业『硅谷』
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
Nucleus PLUS操作系统信号量机制的研究与测试
基于堆栈自编码降维的武器装备体系效能预测
微生物内核 生态型农资
硬件信号量在多核处理器核间通信中的应用
μC/OS- -III对信号量的改进
Linux操作系统信号量机制的实时化改造