当前位置:首页 > 电源 > 数字电源
[导读]引言  为了便于操作系统在不同硬件结构上进行移植,美国微软公司首先提出了将底层与硬件相关的部分单独设计成硬件抽象层(Hardware Abstraction Layer,HAL)的思想。硬件抽象层的引入大大推动了嵌入式操作系统的通

引言

  为了便于操作系统在不同硬件结构上进行移植,美国微软公司首先提出了将底层与硬件相关的部分单独设计成硬件抽象层(Hardware Abstraction Layer,HAL)的思想。硬件抽象层的引入大大推动了嵌入式操作系统的通用程度,为嵌入式操作系统的广泛应用提供了可能。

μC/OS-II简介

  μC/OS-II实时操作系统是一种开发源码的实时操作系统,可固化,可剪裁,具有高稳定性和可靠性。它最鲜明的特点就是源码公开,便于移植和维护。目前μC/OS-II版本2.52,通过了美国航空管理局的安全认证,其稳定性和可用性是经过实践的。μC/OS-II的应用已经覆盖了诸多领域,如照相机、医疗器械、音像设备等。

2  硬件抽象层简介

  硬件抽象层隐藏特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。它通过硬件抽象层接口向操作系统以及应用程序提供对硬件进行抽象后的服务。它主要有以下特点:

①  硬件相关性。作为操作系统与硬件之间的接口,硬件抽象层(HAL)必须为操作系统提供具体操作硬件的方法。
②  操作系统相关性。不同的操作系统具有各自的软件层次结构,因此,不同的操作系统具有特定的硬件接口形式。

  硬件抽象层是一个处于硬件之上,操作系统之下的软件层次。它主要功能包括:

①  对系统硬件进行初始化;
②  为操作系统提供各种操作硬件的接口函数。

  系统硬件的初始化方法,主要由硬件厂家提供;操作系统的各种硬件接口函数和宏定义,则需要通过硬件和操作系统的使用者在熟悉了操作系统和硬件平台后自行编写。μC/OS-II需要完成的硬件接口主要包括:类型的定义、任务上下文切换、中断处理、任务堆栈初始化和定时处理。

  图1为硬件抽象层的功能示意图。


图1  硬件抽象层功能示意图

3  在LPC2292上构建硬件抽象层

3.1  LPC2292简介

  LPC2292/LPC2294 微控制器是基于一个支持实时仿真和嵌入式跟踪的16/32 位ARM7TDMIS CPU,带有256 KB 嵌入的高速Flash 存储器。128 位宽度的存储器接口和独特的加速结构使32 位代码能够在最高时钟速率下运行。对代码规模有严格控制的应用可使用16 位Thumb 模式将代码规模减小30%以上,而性能的损失却很小。

  由于LPC2292/LPC2294 的144 脚封装、极低的功耗、多个32 位定时器、8 通道10 位ADC、2/4 (LPC2292/LPC2294)高级CAN、PWM 通道以及多达9 个外部中断引脚,使它们特别适用于汽车、工业控制应用以及医疗系统和容错维护总线。LPC2292/LPC2294 含有76(使用了外部存储器)到112 个(单片)可用GPIO 口。由于内置了宽范围的串行通信接口,它们也非常适合于通信网关、协议转换器以及许多其他的应用中。

3.2  类型定义

  在将μC/OS-II移植到LPC2292处理器上时,首先进行基本配置和数据类型定义。重新定义数据类型是为了增加代码的可移植性,因为不同的编译器所提供的同一数据类型的数据长度并不相同,例如int型,在有的编译器中是16 位,而在另外一些编译器中则是32 位。所以,为了便于移植,需要重新定义数据类型。μC/OS-II类型定义如下:

  typedef unsigned char BOOLEAN;/*布尔变量*/
  typedef unsigned char INT8U;/*无符号8位整型变量*/
  typedef signed char INT8S;/*有符号8位整型变量*/
  typedef unsigned short INT16U;/*无符号16位整型变量*/
  typedef signed short INT16S;/*有符号16位整型变量*/
  typedef unsigned int INT32U;/*无符号32位整型变量*/
  typedef signed intINT32S;/*有符号32位整型变量*/
  typedef floatFP32;/*单精度浮点数(32位长度)*/
  typedef doubleFP64;/*双精度浮点数(64位长度)*/
  typedef INT32UOS_STK;/*堆栈是32位宽度*/

3.3  任务堆栈初始化

  在μC/OS-II中,函数OSTaskStkInit()对任务堆栈进行初始化,在LPC2292中,任务堆栈空间由高到低依次为PC ,LR,R12 ,R11,…,R1,R0,CPSR,SPSR。 在进行堆栈初始化以后,OSTaskStkInit ( ) 返回新的堆栈栈顶指针。图2为任务堆栈增长的方向。其初始化过程如下:

  *stk = (OS_STK) task;/*PC*/
  *--stk = (OS_STK) task;/*LR*/  //寄存器初始化R12到R1
  *--stk = 0;/*R12*/
  *--stk = 0;/*R1*/
  *--stk = (OS_STK)pdata;/* R0,参数*/
  *--stk = (USER_USING_MODE|0x00);/*SPSR,允许IRQ、FIQ中断*/[!--empirenews.page--]


图2  堆栈增长的方向

3.4  任务上下文切换

  任务上下文管理负责嵌入式操作系统内核中任务管理部分对任务寄存器上下文的创建、删除以及切换等操作。任务的寄存器上下文是操作系统内核所管理的任务的重要组成部分,是CPU内核的寄存器中内容的映像,因此上下文管理的实现依赖于CPU 内核中寄存器的组织,是与体系结构密切相关的。通用硬件抽象层的任务上下文管理统一定义体系结构中的寄存器上下文的保护格式,提供了任务管理对任务上下文的基本操作的API接口。

  μC/OS-II的任务切换其实就是通过改变PC中的内容来实现的。将PC指向新任务开始运行的地方,同时将当前任务(被抢占任务)环境保存到相应的任务堆栈中,将新任务环境从任务堆栈中恢复到相应的寄存器中。

  μC/OS-II用OS_TASK_SW()完成任务级切换。将μC/OS-II移植到LPC2292上,其任务切换代码如下:

  ;OS_TASK_SW
  ;/************************************************
  ;① 在当前任务(被抢占任务)的堆栈保存当前任务环境
  ;/************************************************
  STMFDSP!, {LR};LR中其实是任务切换时对应的PC值
  STMFDSP!, {LR}
  STMFDSP!, {R0?R12}
  MRSR0,CPSR
  STMFDSP!,{R0}
  ;/************************************************
  ;② 获取当前任务(被抢占任务)控制块地址,地址在R0;获取当
  ;前任务(被抢占任务)SP地址,在R1;保存新SP到当前任务(被
  ;抢占任务)的TCB
  ;/************************************************
  LDRR0,=OSTCBCur
  LDRR1,[R0]
  STRSP,[R1]
  ;/**********************************************
  ;③ 获取新最高优先级任务控制块地址,保存最高优先级任务
  ;地址到当前任务地址
  ;/************************************************
  LDRR2,=OSTCBHighRdy
  LDRR1,[R2]
  STRR1,[R0]
  ;/************************************************
  ;④ 获取当前新任务SP
  ;/************************************************
  LDRSP,[R1]
  ;/************************************************
  ;⑤ 恢复任务环境
  ;/************************************************
  LDMFDSP!,{R0}
  MSRSPSR_csxf,R0
  LDMFDSP!,{R0?R12,PC}^

3.5  中断结构和中断处理程序的设计

  中断结构和中断处理程序的设计是嵌入式操作系统HAL中最重要的组成部分。中断机制是操作系统内核实现与外部设备通信、任务系统调用、进行出错处理,以及实现对任务的实时调度的重要手段。因此,硬件抽象层中断系统的管理部分是整个硬件抽象层中的关键。

  μC/OS-II采用了二次跳转的办法。首先在ARM处理器定义的中断向量处安放跳转指令,跳转到指定位置后,再进行位置的第二次映射。其中位置的映射是通过一个汇编定义的宏来实现的。将μC/OS-II移植到LPC2292中,其宏汇编的定义如下:

MACRO
  $IRQ_Label HANDLER $IRQ_Exception_Function
  EXPORT$IRQ_Label; 输出的标号
  IMPORT$IRQ_Exception_Function; 引用的外部标号

$IRQ_Label
  SUBLR, LR, #4; 计算返回地址
  STMFDSP!, {R0?R3, R12, LR}; 保存任务环境
  MRSR3, SPSR; 保存状态
  STMFDSP, {R3, SP, LR}^; 保存用户状态的R3、SP、LR,注意不能回写
  BL$IRQ_Exception_Function; 调用C语言的中断处理程序
  ;/************************************************
  ;比较当前任务控制块和最高优先级任务控制块是否一致,如果一致则直接恢复任务环境;否则,在中断退出时需要进行任务切换,CPU将运行优先级最高的任务,而不是中断前运行的任务
  ;***********************************************
  LDRR0, =OSTCBHighRdy
  LDRR0, [R0]
  LDRR1, =OSTCBCur
  LDRR1, [R1]
  CMPR0, R1
  ADDSP, SP, #4*3
  MSRSPSR_cxsf, R3
  LDMEQFDSP!, {R0?R3, R12, PC}^; 恢复环境
  LDRPC, =OS_TASK_SW; 调用进行任务切换
MEND

  为了使用ISR的汇编宏,每个受μC/OS-II管理的ISR都必须按宏汇编要求的格式,在文件IRQ.S中定义:

  XXXX_HANDLERHANDLERXXXX_Exception

  其中:

  XXXX_HANDLER是ISR的起始地址,即汇编宏的起始地址,在初始化向量中断控制器时作为中断向量的地址使用。用户按中断源来命名,即把其中的XXXX换为具体的中断源名称。

  XXXX_Exception是用户用C语言实现编写的功能函数名。该函数供汇编宏调用,用户可以按实际的中断源来命名,即把XXXX换为具体的中断源名称。

3.6  定时管理

  μC/OS-II需要一个周期性的中断源来产生系统时钟节拍。μC/OS-II利用了LPC2292的Timer0作为定时器产生时钟节拍。其实现步骤为:

  添加中断句柄Timer0_HandlerHANDLER Timer0_Exception配置中断源定时器T0IR = 0xffffffff;T0TC = 0;T0TCR = 0x01;T0MCR = 0x03;T0MR0 = (Fpclk / OS_TICKS_PER_SEC);配置向量中断控制器extern void Timer0_Handler(void);VICVectAddr0 = (uint32)Timer0_Handler;VICVectCntl0 = (0x20 | 0x04);使能中断VICIntEnable = 1<<4;

4  总结

  硬件抽象层的出现,使得嵌入式操作系统的设计者不需要考虑嵌入式系统硬件环境差异较大的问题,可以专心设计通用的操作系统,而将与硬件的接口部分留给硬件抽象层来实现,这样大大提高了嵌入式操作系统在不同硬件平台之间的移植能力。本文基于LPC2292硬件平台,详细介绍了μC/OS-II硬件抽象层的构建方法,对其向其他平台的移植提供了参考。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在半导体制造中,《国际器件和系统路线图》将5nm工艺定义为继7nm节点之后的MOSFET 技术节点。截至2019年,三星电子和台积电已开始5nm节点的有限风险生产,并计划在2020年开始批量生产。

关键字: 芯片 华为 半导体

北京时间10月18日消息,富士康周二表示,希望有一天能够为特斯拉公司生产汽车。眼下,富士康正在加大电动汽车的制造力度,以实现业务多元化。

关键字: 富士康 芯片 半导体 特斯拉

近日,中国工程院院士倪光南在数字世界专刊撰文指出,一直以来,我国芯片产业在“主流 CPU”架构上受制于人,在数字经济时代,建议我国积极抓住时代机遇,聚焦开源RISC-V架构,以全球视野积极谋划我国芯片产业发展。

关键字: 倪光南 RISC-V 半导体 芯片

新能源汽车市场在2022年有望达到600万辆规模,为芯片产业带来较大的发展机遇。2022年,我国芯片供应比去年有所缓解,但仍紧张。中期来看,部分类别芯片存在较大结构性短缺风险,预计2022年芯片产能缺口仍难以弥补。这两年...

关键字: 新能源 汽车 芯片

汽车芯片和半导体领域要深度地融合,不仅仅是简单的供需关系,应该是合作关系,把汽车芯片导入到整车厂的应用。为缓解汽车产业“缺芯”,国内汽车芯片产业正探索越来越多的方式完善生态。为了促进汽车半导体产业的快速发展,弥补国内相关...

关键字: 智能化 汽车 芯片

汽车“缺芯”之下,国产芯片的未来是一片蓝海。在过去很长一段时间内,“缺芯”“少魂”是我国汽车企业的短板弱项,车规级芯片、操作系统的自主可控程度不高。其中,我国车规级芯片自给率小于5%,且多以低端产品为主,关键芯片均受制于...

关键字: 智能化 汽车 芯片

流水账式的推文比较乱,不够系统,也形成不了好的宣传效应,所以我整理了一个硬件基础知识框架,后面推文会围绕这个展开,中间也会穿插一些项目和实际应用例程。

关键字: 硬件 项目 例程

之前,美国运营商AT&T曾宣布,今年年底推出5G网络,而随着时间的推移,2019年会有越来越多的国家和地区商用5G网络,在这样的大环境下,芯片厂商提前布局也就是情理之中的事情了。

关键字: 运营商 5G网络 芯片

日本车用MCU大厂瑞萨电子发布公告称,该公司将于8月31日完全关闭滋贺工厂,并将土地转让给日本大坂的ARK不动产株式会社。瑞萨电子曾在2018年6月宣布,滋贺工厂将在大约两到三年内关闭,该工厂的硅生产线已于2021年3月...

关键字: MCU ARK 芯片

目前,各式芯片自去年第4季起开始紧缺,带动上游晶圆代工产能供不应求,联电、力积电、世界先进等代工厂早有不同程度的涨价,以联电、力积电涨幅最大,再加上疫情影响,产品制造的各个环节都面临着极为紧张的市场需求。推估今年全年涨幅...

关键字: 工厂 芯片 晶圆代工

数字电源

15504 篇文章

关注

发布文章

编辑精选

技术子站

关闭