APP下载

实时操作系统FreeRTOS移植的实验研究

2016-11-22王剑平杨晓洪

化工自动化及仪表 2016年7期
关键词:编译器二值任务调度

夏 鑫 张 果 王剑平 杨晓洪

(昆明理工大学信息工程与自动化学院,昆明 650500)

实时操作系统FreeRTOS移植的实验研究

夏 鑫 张 果 王剑平 杨晓洪

(昆明理工大学信息工程与自动化学院,昆明 650500)

分析了实时操作系统FreeRTOS的原理、内核组成与任务管理机制。完成FreeRTOS实时操作系统在S3C44b0x硬件平台上跨平台、跨编译器的移植。同时设计了固定优先级调度与二值信号量任务间的同步通信实验,验证了FreeRTOS操作系统移植的正确性和实验设计的合理性。

FreeRTOS 移植 S3C44b0x 任务同步通信 任务调度

随着计算机技术和微电子技术的推进,嵌入式技术这门新兴学科产生并且迅速发展,因此传统的单机、单任务模式已经无法满足现代嵌入式设备在功能上的需求,在这种情况下,引入操作系统是嵌入式系统发展的必然趋势。

将嵌入式设备引入操作系统,对于整个系统的硬件和软件资源,操作系统都可以合理有效地管理,这对整个系统的性能有了很大程度的提升。而当执行一个复杂的应用程序时,嵌入式操作系统可将它分解为若干个实现特定独立功能的子任务模块,模块之间则通过任务通信机制、任务管理来实现一个完整的功能,这种“自下而上”的结构化设计同时也便于系统开发。

FreeRTOS(Free Real Time Operating System)作为一个轻量级嵌入式实时操作系统,凭借其开源和完全免费的优势,满足了大多数中小型嵌入式系统对RTOS的需求,得到了越来越广泛地应用。FreeRTOS拥有源代码公开、可移植、可裁剪、调度策略灵活及轻量级等特点,适用于绝大多数处理器,在国外业界倍受开发者青睐。在此,笔者对实时操作系统FreeRTOS在S3C44b0x上的移植进行了分析研究,并设计相关实验进行验证,最后指出FreeRTOS操作系统的优势与不足。

1 FreeRTOS内核分析①

FreeRTOS内核管理(图1)包括任务管理、时间管理、内存管理和通信管理4部分[1]。

图1 FreeRTOS内核管理结构

FreeRTOS通过任务控制块对任务施行管理;时间管理包括时钟的产生管理和任务延时管理;内存管理中,FreeRTOS为用户提供了4种不同的内存分配管理方案,用户可以根据需求选择合适的一种;此外,内核中还提供任务通信管理机制,分为消息管理和任务同步管理。其中同步机制又包括信号量和互斥量,FreeRTOS没有消息邮箱同步机制,所有的同步机制都是基于消息队列来实现的[2]。

2 FreeRTOS任务管理

2.1FreeRTOS任务模型

FreeRTOS对任务数量没有限制。相较于其他实时操作系统,FreeRTOS有一个突出的特点,即在任务的优先级管理中允许不同任务之间可以设置相同的优先级。在FreeRTOS中任务可设置0~255个不同的优先级,设置的数值决定了任务的优先级别,数值越大对应任务的优先级别越高,空闲任务的优先级最低,对应的数值默认为0,它能执行的前提是CPU中不存在其他更高优先级的任务需要执行。除此之外,每当创建一个任务时,系统都会为它分配独立的任务堆栈空间和一个任务控制块TCB,而FreeRTOS整个内存空间的大小用户可以在系统配置文件中进行相应配置[3]。

2.2FreeRTOS任务调度策略

FreeRTOS实时操作系统内核在工作时可设置为两种类型,即可剥夺方式和不可剥夺方式[4]。当系统内核设置为可剥夺工作方式时,最高优先级的任务一旦就绪,总能得到CPU的控制权,系统允许优先级别高的任务抢占剥夺优先级别低的任务的CPU使用权。同时,FreeRTOS允许不同的任务之间使用相同优先级,任务调度器可以通过时间片轮询方式来执行优先级别相同的任务。此外,FreeRTOS支持抢占式和协作式混合任务调度策略。从抢占式调度时序图(图2)可以看到,task1、task2、task3和系统空闲任务idle task,所对应的优先级分别为5、2、2、0;在t3和t6时刻,任务task2处于就绪状态,剥夺空闲任务idle task对于CPU的使用权,进入运行状态,在t7时刻,CPU的使用权则被更高优先级的任务task1剥夺。

图2 抢占式调度时序

FreeRTOS支持固定优先级任务调度,即当有两个任务处于就绪状态时,系统将优先执行优先级别高的,但在某些应用场合中系统需改变任务的优先级[5]。如遇到两个相同优先级别的任务时,系统在固定优先级调度策略中,可以通过采用FIFO(先进先出)的调度机制,即先获得CPU执行权的任务先执行,实现CPU时间片轮询的调度方式,从而处理相同优先级别的任务[1,6]。如图2所示,优先级相同的任务task2和task3在t3时刻都处于就绪状态,由于task2先进就绪链表,从而task2先获得CPU执行权,按照时间片轮询调度原则执行task2与task3。

2.3任务同步通信

FreeRTOS操作系统中,任务间的同步通信是通过信号量与互斥量两种机制来实现的,其中信号量包括计数信号量、二值信号量和递归信号量[7,8]。这两种任务同步通信机制都是基于队列机制来实现的。通过获取信号量,需执行的任务获得CPU执行权,执行完后再通过释放信号量来让出CPU使用权。需要注意的是,通信的信号量必须在使用之前先创建[1,9]。

计数信号量的作用是事件计数和资源管理。在事件计数中,通过获取和给出信号量,对信号量的计数值减1或加1,来计数已发生的事件数与已处理的事件数之间的差值。在资源管理中,计数值用来统计资源的可用数目。具体的做法是:在初始化创建时先设定一个可用资源总数,当一个任务需获取资源的使用权时,先获得信号量同时计数信号量的值减1;在任务执行完后将给出信号量释放资源,信号量计数值加1;当系统没有可用资源时其计数值为0[1,10]。

二值信号量实质就是一个特殊的队列的宏[1,11]。定义一个二值信号量为深度为1的一个队列,队列不满时即为空,此时信号量的值为0或1,所以称为二值信号量。二值信号量和互斥量极为相似,两者不同的地方是互斥量包含了优先级继承机制,而二值信号量并没有包括。因此,在任务与任务、任务与中断之间同步运用最好选择二值信号量;而两个任务间相互排斥时更适合运用互斥量[12]。

利用二值信号量实现任务与中断同步的时序图如图3所示。在t2时刻中断发生,执行相应的中断服务函数,在中断服务函数中调用xSemaphoreGiveFromISR函数释放信号量。在FreeRTOS中只有带ISR结尾的API函数才能在中断处理函数中被调用。Handler_Task同步任务的优先级必须比被中断前执行的任务优先级高。中断服务例程释放信号量,同步任务被唤醒并获得CPU使用权。在t3时刻中断服务函数处理完之后,同步任务随之执行,执行完后释放信号量。同步任务又进入阻塞状态,等待下一次中断的到来。在中断服务例程中快速处理少量的操作,大量处理置于同步任务当中完成,如此便完成了中断与任务之间的同步通信。

图3 任务与中断同步时序

3 FreeRTOS的移植

3.1内核源代码

与大多数嵌入式实时操作系统一样,FreeRTOS也针对不同编译器和不同微处理器为开发者提供了移植接口的模板。但并非所有型号都有,开发者可以根据自己选用的编译器和微处理器类型选择相应或相近的模板作为参照来进行移植。在此,笔者以ARM7_LPC2129_Kiel_RVDS例程为模板,移植到S3C44b0x处理器的目标板和ADSv1.2编译器上。此外,FreeRTOS在设计时,大部分内核代码都是由C语言编写,只有很少一部分与硬件相关的代码是用汇编实现[1,12],以便于开发者移植应用。

如图4所示,FreeRTOS支持的与硬件无关的内核所有源代码包含在4个.c文件中,分别是queue.c、tasks.c、list.c和croutine.c,其中前3个是FreeRTOS 内核接口,croutine.c实现了常规功能封装,一般用于在内存资源极为有限的系统中,这里不考虑。另一部分与硬件相关的源代码,LPC2129例程中包含port.c、portasm.s、portmacro.inc和portmacro.h共4个接口文件,在移植过程中只需对这部分做相应修改即可。

图4 FreeRTOS移植接口

3.2移植接口实现

当以汇编代码来实现操作系统进行任务切换时,portmacro.h和portmacro.inc这两个宏文件起到保存和恢复现场的作用,分别保存寄存器R0~R14的值。相关程序如下:

MACRO

portSAVE_CONTEXT;保存现场

STMDB SP!,{R0}

STMDB SP,{SP}^

NOP

SUB SP,SP,#4

LDMIA SP!,{R0}

STMDB R0!,{LR}

MOV LR,R0

LDMIA SP!,{R0}

STMDB LR,{R0-LR}^

NOP

SUB LR,LR,#60

MRS R0,SPSR

STMDB LR!,{R0}

LDR R0,=ulCriticalNesting

LDR R0,[R0]

STMDB LR!,{R0}

LDR R0,=pxCurrentTCB

LDR R1,[R0]

STR LR,[R1]

MEND

参考上述代码可以根据堆栈“后进先出”的原则写出portRESTORE_CONTEXT恢复现场部分的代码,这里不做赘述。

portmacro.h文件中定义了堆栈的增长方向、一些操作系统的数据类型及临界区管理函数等与编译器相关的宏定义。

portasm.s文件在移植过程中需要根据不同CPU提供的时钟和不同的编译器语法进行修改从而给操作系统提供时钟滴答、软中断等功能。此处,编译器需修改为ADSv1.2编译器以识别语法,相关处理要以不同处理器时钟为准,这里选用S3C44b0x定时器0为系统提供时钟嘀嗒,需自行实现如下代码:

T0IR EQU 0x1e00024

T0MATCHBIT EQU (0x1<<13)

vPreemptiveTick;时钟中断0

PRESERVE8

portSAVE_CONTEXT

LDR R0,=vTaskIncrementTick

MOV LR,PC

BX R0

LDR R0,=vTaskSwitchContext

MOV LR,PC

BX R0

MOV R0,#T0MATCHBIT

LDR R1,=T0IR

STR R0,[R1]

portRESTORE_CONTEXT

vPortYieldProcessor;软中断

PRESERVE8

ADD LR,LR,#4

portSAVE_CONTEXT

LDR R0,=vTaskSwitchContext

MOV LR,PC

BX R0

portRESTORE_CONTEXT

port.c文件中包含为系统任务创建堆栈初始化、启动任务调度、时钟中断和临界保护的代码。另外需自行实现的一部分代码是,为临界保护提供的开/关CPU中断函数,这两个函数是通过对S3C44b0x中CPSR寄存器中断位写1或清0,在portasm.s文件中以汇编的形式实现的,具体代码如下:

EXPORT ARMDisableInt;关中断

ARMDisableInt

STMFD sp!,{r0}

MRS r0,cpsr

ORR r0,r0,#0xC0

MSR cpsr_c,r0

MOV pc,lr

EXPORT ARMEnableInt;开中断

ARMEnableInt

LDMFD sp!,{r0}

MRS r0,cpsr

BIC r0,r0,#0xC0

MSR cpsr_c,r0

MOV pc,lr

4 实验测试

4.1任务调度实验测试与分析

根据任务的调度算法原理,系统总是运行进入就绪态任务级最高的任务。为此,首先创建一个主任务,优先级为2,在主任务中再创建3个子任务分别是灯闪烁任务Task_LED、RTC系统时钟显示任务Task_Rtc_Disp和流水灯任务Task_GroupLed,优先级分别为5、2、2。主代码如下:

void Task_Main(void*pvParameters)

{

xTaskCreate(Task_LED,(signed portCHAR*)"Task_LED",configMINIMAL_STACK_SIZE,NULL,

skIDLE_PRIORITY+5,NULL)

xTaskCreate(Task_Rtc_Disp,…);

xTaskCreate(Task_GroupLed,…);

for( ; ; )

{

Uart_Printf("执行主任务 ");

vTaskDelay(200);

}

}

系统执行流程如图5所示。

图5 系统执行流程

串口打印的任务调度画面如图6所示。可以看出,Task_LED任务的优先级最高为5,CPU首先执行Task_LED灯闪烁任务,其他任务优先级相同,以时间片轮换调度执行,输出结果与任务调度策略分析的任务执行策略吻合。

图6 串口打印任务调度画面

4.2任务同步通信测试与分析

以二值信号量为例,进一步说明FreeRTOS操作系统中的任务间进行同步通信的过程。在二值信号量被使用之前首先需要被创建,创建一个二值信号量的代码如下:

static xSemaphoreHandle xSemaphore=NULL;

vSemaphoreCreateBinary(xSemaphore);

当二值信号量被创建成功后,根据其宏定义会释放出信号量。由于主任务的优先级最高,因此主任务通过 xSemaphoreTake函数首先获得信号量,获得CPU的执行权,最先执行Task_Main任务,代码如下:

xTaskCreate(Task_Main,(signed portCHAR*)"Task_Main",configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY+6,NULL);

void Task_Main(void*pvParameters)

{

xTaskCreate(Task_LED,…);

xTaskCreate(Task_Rtc_Disp,…);

xTaskCreate(Task_GroupLed,…);

for( ; ; )

{

if(xSemaphoreTake(xSemaphore,(portTickType)0)==pdTRUE){

Uart_Printf("执行主任务 ");

xSemaphoreGive(xSemaphore);

}

vTaskDelay(400);

}

}

通过PC串口终端打印出来的任务调度执行情况画面如图7所示。可以看出,信号量创建完成后发出并由Task_Main任务最先获取,当执行完Task_Main任务后,主任务调用xSemaphoreGive函数,随后让出CPU使用权,之后调用延迟函数vTaskDelay使主任务进入阻塞态。灯闪烁任务通过xSemaphoreTake函数获得信号量,获得CPU执行权,并开始执行,依此类推。可以看出,每个任务之间同步执行策略与任务同步执行策略的分析相符。

图7 任务调度执行情况画面

5 结束语

通过分析FreeRTOS实时操作系统内核,操作系统完成了从ARM7_LPC2129芯片到ARM7_S3C44b0x芯片、Kiel_RVDS编译器到ADSv1.2编译器的移植,并通过任务调度和任务同步通信实验测试证明,FreeRTOS具有内核小、移植简单及功能完善等特点,为嵌入式系统的开发与应用提供了一定参考。虽然FreeRTOS在我国仍处于初步应用阶段,但凭借其开源、内核小、开发周期短及支持较多处理器架构和多种集成开发环境等优势,在我国将会成为嵌入式开发者较好的选择。

[1] 余晓光.基于实时操作系统FreeRTOS的Lwip协议的移植研究[D].昆明:昆明理工大学,2013.

[2] 王铮,靳世久,李健,等.嵌入式实时操作系统C/OS-II在管道泄漏检测中的应用[J].化工自动化及仪表,2006,33(5):55~57.

[3] 黄义仿,朱晓然,赵荣珍,等.基于小波分析和矩不变量的转子故障量化特征提取研究[J].化工机械,2007,34(6):309~312.

[4] 李志丹,姜印平,李亚南.基于S3C44B0X和SL811HS的USB主/从机模块设计[J].化工自动化及仪表,2006,33(4):37~39.

[5] Sakairi T,Palachi E,Cohen C,et al.Model Based Control System Design Using SysML,Simulink,and Computer Algebra System[J].Journal of Control Science and Engineering,2013,2013:1~14.

[6] Bauer A,Leucher M,Schallhart C.Runtime Verification for LTL and TLTL[J].ACM Transactions on Software Engineering and Methodology,2011,20(4):14.

[7] 江杰,赵凤鸣,陈洪翰,等.Ethernet Powerlink调度机制与实时通信剖析[J].自动化仪表,2013,34(2):84~88.

[8] 孙伟,陈杨,张明伟,等.基于ARM CM3和RTOS的矿用电磁调速电机控制器软件设计[J].煤矿机械,2014,35(9):236~238.

[9] 甘勤操,陈西曲.基于V4L2的嵌入式视频监控系统的研究[J].武汉轻工大学学报,2014,33(1):61~64.

[10] 梁艳.基于OpenCV的ARM嵌入式网络视频监控系统[J].微型机与应用,2013,32(9):29~31.

[11] 段永颢,陈睿.基于启发式的静态中断数据竞争检测方法[J].计算机工程与设计,2013,34(1):140~145.

[12] Mu Y M,Wang R,Zhang Z H,et al.Automatic Test Method Research on the Word Part of Document Format Translator[J]. Chinese Journal of Clectronics,2013,22(1):55~60.

ExperimentalResearchonTransplantofFreeRTOS

XIA Xin, ZHANG Guo, WANG Jian-ping, YANG Xiao-hong

(FacultyofInformationEngineeringandAutomation,KunmingUniversityofScienceandTechnology,Kunming650500,China)

The FreeRTOS’ working principle, kernel composition and task management were analyzed, including FreeRTOS’ cross-platform and cross-complier transplant on S3C44b0x platform. The experiment on synchronous communication between fixed priority scheduling and binary semaphore was implemented to verify FreeRTOS transplant’s correctness and experimental design’s reasonability.

FreeRTOS, transplant, S3C44b0x, synchronization communication between tasks, task scheduling

2015-11-13

国家自然科学基金项目(61364008);云南省应用基础研究重点项目(2014FA029);云南省教育厅重点基金项目(2013Z127)

TH89

A

1000-3932(2016)07-0720-06

猜你喜欢

编译器二值任务调度
基于PEPA的云计算任务调度性能分析
基于相异编译器的安全计算机平台交叉编译环境设计
运行速度大突破华为《方舟编译器》详解
基于改进NSGA-Ⅱ算法的协同制造任务调度研究
面向网络边缘应用的新一代神经网络
基于二值图像数字水印算法研究
基于稀疏表示的二值图像超分辨率重建算法
基于曲率局部二值模式的深度图像手势特征提取
基于小生境遗传算法的相控阵雷达任务调度
云计算环境中任务调度策略