APP下载

一种基于Cortex-M3的任务核心机制的设计与实现

2020-12-28方敏

电脑知识与技术 2020年33期

摘要:嵌入式实时操作系统是整个嵌入式实时系统的核心,采用嵌入式实时操作系统( RTOS)可以更合理、更有效地利用CPU资源,简化应用软件设计,缩短系统开发时间。该文基于Cortex-M3芯片内核,设计并实现了一种针对RTOS的任务核心机制,包括任务切换、任务时间片切换、任务延时接口实现、临界区保护、多优先级任务等功能,从而高效率实现了基于RTOS任务管理,提高了系统的实时性和可靠性。

关键词:Cortex-M3:RTOS;任务机制;切换;多优先级

中图分类号:TP316 文献标识码:A

文章编号:1009-3044(2020)33-0074-02

开放科学(资源服务)标识码(OSID):

1 背景

在后PC时代,嵌入式的发展逐渐取代PC成为时代主流,嵌入式实系统的应用日益广泛[1]。嵌入式实时操作系统( RTOS)是以应用为中心,以计算机技术[2]为基础,软硬可裁剪[3],适应应用系统对功能、可靠性[4]、成本、體积、功耗等严格要求,当外界事件或数据产生时,能够接受并以足够快的速度予以处理[5]。其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应[6],调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。

RTOS系统如果要有更好的事件实时处理机制,需要对任务机制进行设计,让其对任务进行较好的管理,设计任务的切换,任务时间片设计、任务延时接口处理、临界区及调度锁的保护、多优先级任务等。

2 Cortex-M3芯片内核

Cortex-M3是ARM公司开发的CPU内核。Cortex-M3是一个32位处理器内核,内部的数据路径是32位,寄存器是32位,存储器接口是32位。Cortex-M3采用哈佛架构,拥有独立的指令总线和数据总线,取指与数据访问可以同时进行。

Cortex-M3支持小端模式、大端模式。Cortex-M3内核通过接口总线的形式挂载了储存器、外设、中断等组成一个MCU,如图1所示:

Cortex-M3预先定义了“粗线条的”存储器映射。通过把片上外设的寄存器映射到外设区,就可以简单地以访问内存的方式来访问这些外设的寄存器,从而控制外设的工作。各个分区存储器映射如图2所示:

3 任务核心机制的设计与实现

3.1任务切换

任务切换又叫上下文切换,当操作系统需要运行其他任务时,操作系统首先会保存和当前任务相关的寄存器的内容到当前任务的栈中,然后从将要加载的任务的栈中取出之前保存的全部寄存器的内容并加载到相关的寄存器中,从而继续运行被加载的任务[7]。

构建一个最小的两个任务切换运行的小系统,目的是理解RTOS任务切换的核心原理[8]。有两个任务,分别执行taskIEn-try和task2Entry。功能是分别对相应的变量进行周期性置0置1,每次完成从1->0的切换后,自动切换至另一个任务中运行。这样便实现了两个任务交替性地使用一段时间CPU,对相应变量值修改。仿真结果如图3所示:

3.2 任务时间片的实现

构建一个最小的基于时间片切换的任务系统,目的是理解RTOS时间片切换的核心原理。在上个任务切换实现的基础上中,改用SysTick定时器来使taskl和task2均等的占用CPU,即配置其多久切换一次。配置SysTick定时器:

void tSetSysTickPeriod(uint32_t ms)

SysTick->LOAD= ms*SystemCoreClock/1000 -1;

NVIC_SetPriority

(SysTick_IRQn,

(1《_NVIU1RIO_BITS) -1);

SysTick->VAL=0;

SysTick->CTRL= SysTick_CTRL_CLKSOURCE_Msk l

SysTick_CTRL_TICKINT_Msk f

SYsTick_CTRL_ENABLE_Msk;

}

3.3临界区和保护锁的保护

3.3.1临界区的保护

使用关中断保护临界区,由于共享资源的访问存在于任务与任务,任务与中断ISR之间,那么只需要防止任务在访问共享资源时切换到其它任务或防止中断发生。

uint32_t tTaskEnterCritical (void)//进入临界区 返回进入之前的临界区状态值

{

uint32_t primask= _get_PRIMASKO;

_disable_irq0;

//CPSID I

return primask;

//退出临界区,恢复之前的临界区状态status进入临界区之前的CPU返回进入临界区之前的临界区状态值

void tTaskExitCritical (uint32_t status){

一set_PRIMASK(status);

3.3.2 调度锁保护

调度锁保护能在多个任务共享资源时进行保护,其工作原理是上锁时,禁止任务切换。无论何种情况,即使时间片用完了,仍运行原任务,直至解锁时,才允许任务切换。

1)初始化调度锁计数器:

schedLockCount=0:

2)禁止任务调度(调度器上锁):

uint32_t status= tTaskEnterCritical0;

if (schedLockCount< 255)

schedLockCount++;

tTaskExitCritical(status);

3)允许任务调度(调度器解锁):

uint32_t status= tTaskEnterCritical0;

if (schedLockCount>01

if (--schedLockCount==01

‘TaskSched0;

tTaskExitCritical(status);

3.4 多优先级任务

任务数量无限,而资源有限。当多个任务在等待同一资源或事件时,如果资源或事件不能在任务间共享,应该由哪个任务来处理?根据实际应用特点,为任务指定优先级。优先级更高的任务,具备对CPU、事件和资源的优先处理权和占有权。

RTOS维护一个就绪表,指明哪些优先级的任务等待占用CPU运行,每个表项对应一个任务,对应一种优先级。为了便于快速找到优先级更高的任务,使用了就绪位图,如图4所示:

3.5 任务的实现

为使系统完整,加入任务挂起与唤醒、任务删除和任务状态查询等接口实现。未创建:只定义了任务代码,未调用tTas-klnit0初始化。就绪:任务已经创建,且等待机会占用CPU运行。运行:任务正在占用CPU运行代码。延时:任务调用了tTaskDelay0延时。挂起:暂停任务运行。

进入临界区:

uint32_t status= tTaskEnterCritical0;

不允许对已经进入延时状态的任务挂起:iff! (task->state&TINYOS_TASK—STATE_DELAYED)

增加挂起计数,仅当该任务被执行第一次挂起操作时,才考虑是否要执行任务切换操作:

if (++task->suspendCount<=1)

task->state l= TINYOS_TASK—STATE_SUSPEND;

tTaskSchedUnRdy(task);

if (task==currentTask)

tTaskSched0;

4 结束语

本文的解决方案和实施过程成功开发了一个小型的嵌入式实时操作系统,解决了RTOS任务核心机制。经测试,实现了任务管理的高可用性。

RTOS系统具有更好的事件实时处理机制,当事件发生时,或有更高优先级的任务需要运行时,均能快速切换过去,做更重要更紧急的事情,解决了前后台实时性不能保证的缺点;有通用的任务管理框架,开发不同项目时可重复利用,简化了开发难度,更加接近于人处理问题的思考方式,解决了前后台系统强迫人按照机器的工作顺序方式思考编码的缺陷。

参考文献:

[1]王颖洁,周宽久,李明楚.实时嵌入式系统的WCET分析与预测研究综述[J].计算机科学,2019,46(S1):16-22.

[2]孙涛,杨建勋,罗军,等.通用操作系统安全保护技术研究与实现[J].信息系统工程,2020(5):59-61,63.

[3]杨鸿珍,王云烨,吴建伟,等。基于人工智能的高可信嵌入式操作系统设计[J].现代电子技术,2020,43(16):153-155,158.

[4]丁如艺,张激,李嘉伟.嵌入式系统平台抽象层设计与接口实现[J].计算机系统应用,2020,29(3):108-113.

[5]吴利生.基于ARM Cortex-A9 MPCore嵌入式多核操作系統内核研究与实现[J].数字技术与应用,2020(3):134-135.

[6]黄忠建,代红兵,王蕾.嵌入式Forth操作系统实时调度算法研究[J].计算机应用研究,2019,36(9):2700-2703,2721.

[7]刘进英,董涛.基于嵌入式操作系统RTX-51的单片机多任务编程[J].电子技术与软件工程,2019(23):235-236.

[8]代红兵,周永录,安红萍,等.嵌入式Forth虚拟机架构的多任务调度算法设计与实现[J].计算机应用研究,2019,36(2):472-475,485.

【通联编辑:谢媛媛】

作者简介:方敏(1981-),女,四川眉山人,讲师,硕士,研究方向为软件工程。