0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于SPARC微处理器ERC32实现板级支持包BSP的开发

牵手一起梦 来源:单片机与嵌入式系统应用 作者:樊超 , 桂先洲 2020-10-04 17:56 次阅读

一个优秀的RTOS(Real-Time Operating system)不但要拥有一个高可靠、多任务的实时内核,还应具有可剪裁和可移植的能力。RTEMS(the Real - Time Executivefor Multiprocessor Systems)就是这样的系统,它提供的环境可以满足高性能的嵌入式多任务实时应用。目前,RTEMS支持的CPU系列有:A29k、ARM、H8300、1386、1960、M68k、MIPS、PPC和SPARC等。

板级支持包BSP(Board Support Package)是嵌入式实时系统的基础部分,也是实现系统可移植性的关键。它负责上电时的硬件初始化、启动嵌入式操作系统或应用程序模块、提供底层硬件驱动,为上层软件提供访问底层硬件的手段。BSP针对目标板设计,其结构和功能随目标板的不同而呈现较大的差异。在将嵌入式系统移植到一种新的CPU时,必须提供相应的板级支持包。

本文参考SPARC微处理器ERC32的BSP,主要讨论RTEMS的BSP开发过程。

1 RTEMS体系结构

RTEMS采用微内核基础上的层次化结构,如图l所示。这种结构只把那些绝对必需的系统功能置于内核之中(如中断管理、上下文切换、内存访问管理、时间管理、线程及线程间的通信与同步管理等),而把那些并非必需的系统功能(如文件系统、网络、远程过程调用等)置于微内核之上在用户模式下运行。

基于SPARC微处理器ERC32实现板级支持包BSP的开发

RTEMS的板级支持包是启动代码、连接器脚本和编译规范文件(specs)和设备驱动程序的集合,它们针对不同目标机的硬件环境剪裁RTEMS。

2 RTEMS启动过程

处理器加电或复位时,基于RTEMS的应用程序初始化或者重新初始化。BSP中的启动代码负责为RTEMS应用程序建立运行环境。

RTEMS启动过程的顺序如下:

① 执行BSP中的启动代码;

② 调用rtems_initialize_executive;

③ 局部和全局应用程序的初始化。

处理器复位时,首先执行BSP的启动代码。BSP必须将所有的硬件初始化为一个静止状态,然后操作系统才能初始化。rtems_initialize_executive指令不返回启动代码,它将导致最高优先级的初始化任务开始执行。初始化任务用于完成局部或全局依赖于RTEMS的应用程序初始化。

3 BSP开发过程

下面以SPARC微处理器ERC32为例,说明RTEMSBSP的开发步骤:

①建立开发环境。开发模式采用宿主机/目标机模式。宿主机运行环境采用Linux系统,目标机为ERC32。宿主机和目标机通过串口连接。交叉开发工具采用添加了RTEMS补丁的GNU工具链(GCC,GDB,Newlib,binary utilities)。

② 选择BSP模板。通常是根据操作系统提供的BSP模板,选择与应用硬件环境最为相似的参考设计,针对具体的目标机对参考BSP进行必要的修改和增删,以形成自己的BSP。选择一个适当的BSP模板可以达到事半功倍的效果。

③建立新bsp目录。将模板BSP整个目录拷贝到适当的目录下(如libbsp/),重命名为mybsp。

④ 建立bsp配置文件。拷贝任意一个BSP.cfg,重命名为mybsp.cfg,修改相关的体系结构定义,如:RTEMS_CPU_MODEL,RTEMS_BSP,CPU_CFLAGS和制定make_exe规则。

⑤修改makefile文件。对mybsp-bsp中每一个Makefile.in文件,运行acpolish,并检查运行的结果,例如:

cd /mybsp - bsp/some_subdir

/path_to_SACOS/t00ls/update/acpolishMakefile.new

再次运行acpolish:

/path_to_SACOS/tools/update/acpolishMakefile.in

将Makefile.new和Makefile.in进行比较。如果不相同,则重新编辑Makefile.new,多次运行acpolish,直到连续两次产生的Makefile.in相同。

⑥ 修改启动代码。建立自陷表、基本的CPU初始化、设置中断堆栈等。

⑦ 配置RTEMS。设置RTEMS相关全局变量和常量、RTEMS配置表、CPU依赖信息表、系统初始化任务表,以及用户初始化任务表等,除完成相关的系统功能之外,提供板上外设的设备驱动程序。

⑧调试和测试。建立RTEMS执行映像,利用串口下载可执行映像到目标机,测试BSP的正确性。

3.1 启动代码实现

BSP的启动代码主要包含在五个文件中。它们是Start.s、boardinit.S、bootcard.c、bspstart.C和main.C。

Start.s包含了用于硬件初始化的汇编语言代码,它是RTEMS的引导ROM入口。入口点SYM(start)是目标机上电后执行的第一段程序。SYM(start)的工作是完成将控制转移到C程序boot_card()所需要的最少的设置,如初始化堆栈和禁止外部中断等。它的具体操作包括:

①定义自陷表。这个自陷表是SPARC V7体系共有的,可从参考BSP中复制。

②初始化处理器。

a)初始化自陷基地址寄存器TBR,即将自陷表地址写入TBR;

b)初始化处理器状态寄存器PSR,设置系统为最高优先级运行模式,禁止所有可屏蔽中断;

c)设置窗口无效寄存器WIM;

d)初始化堆栈,设置堆栈指针。

③调用SYM(_bsp_board_init)(在boardinit.S中定义,这些代码是目标板专用的),初始化MEC系统寄存器,初始化定时器

④将已初始化数据从ROM拷贝到RAM,未初始化内存清零。

⑤初始化环境变量和参数,调用C程序boot_card()。

boot_card()完成RTEMS的基本配置,如设置RTEMS配置表、CPU依赖信息表的相关入口等。它调用bsp_start()完成目标板特定的系统配置,调用内核初始化函数完成RTEMS系统的初始化。boot_card()的具体操作包括:

①定义和声明RTEMS全局变量。

extern rtems_configuration_table Configuration;

extern rtems_.configuration_.table BSP_Configuration;

extern rtems_cpu_table Cpu_table;

rtems_api_configuration_table BSP_RTEMS_Configura-tion;

rtems_interrupt_level bsp_isr_level;

②初始化CPU依赖信息表的所有人口为缺省值,除了下列两项,其余都为NULL。

Cpu_table.do_zero_of_workspace =TRUE;

Cpu_table.interrupt_stack_size =RTEMS_MINIMUM_STACK_SIZE;

③ 调用bsp_start(),根据目标机环境重新配置RTEMS,为系统初始化任务建立标准C支持环境。

④ 调用内核初始化函数rtems_initialize_executive_ early(),初始化RTEMS和设备驱动程序。

⑤调用c_rtems_main(),创建并启动多任务,运行用户应用程序,直到调用rtems_shutdown_executive()退出RTEMS,才将控制返回BSP。

bsp_start()根据目标机环境重新配置RTEMS,为调用操作系统初始化函数准备一个合适的软硬件环境。它的具体操作是:

①定义RTEMS全局变量。

unsigned char*work_space_start;

rtems_configuration_table BSP_Configuration;

rtems_cpu_table Cpu_table;

②修改CPU依赖信息表,为RTEMS系统初始化任务建立支持环境。

/*在执行系统初始化任务之前,设置存堆的开始地址和大小,建立C支持库*/

Cpu_table.pretasking_hook=bsp_pretasking_hook;

/*在驱动程序初始化之后注册设备名,打开标准输人、标准输出和标准错误文件*/

Cpu_table.postdriver_hook=bsp_postdriver_hook;

Cpu_table.do_zero_of_workspace=TRUE;

/*设置中断堆栈的大小(16*1024)*/

Cpu_table.interrupt_stack_size=ONFIGURE_INTER-RUPT_STACK_MEMORY;

③检查并设置工作区起始地址。

BSP_Configuration.work_space_start=work_space_start;

④设置时钟嘀嗒频率。

CPU_SPARC_CLICKS_PER_TICK=BSP_Configuration.microseconds_per_tick;

⑤结束返回boot_card()。

图2描述了RTEMS系统初始化函数之间的调用关系。

3.2设备驱动程序实现

设备驱动程序的工作方式有轮询和中断两种。无论采用哪一种方式,设备驱动程序的基本流程都是相同的。下面以时钟设备驱动程序为例,简单说明编写RTEMS设备驱动程序的基本框架。

①声明和定义常量和全局变量。

/*关于时钟设备的常量参数*/

volatile rtems_unsigned32 Clock_driver_ticks;

extern int CLOCK_SPEED;

extern rtems_unsigned32 CPU_SPARC_CLICKS_PER_TICK;

/*定义时钟驱动程序入口数据结构并初始化*/

#define CLOCK_DRIVER_TABLE_ENTRY{Clock_initialize,NULL,NULL,NULL,NULL,Clock_contr01}

②获取接口参数。

rtems_device_major_number\

rtems_clock_major=~O;

rtems_device_minor_number \

rtems_clock_minor

③提供接口函数。

/*时钟驱动程序初始化入口*/

rtems_device_driver Clock_initialize() {

/*安装时钟中断向量,设置时钟计数器和标度器的预设值;保存时钟设备接口参数,以备系统使用*/ };

/*时钟滴答中断处理程序*/

rtems_isr Clock_isr() {

/*时钟设备的计数器和标度器设值为周期运行模式*/ };

/*时钟设备控制入口*/

nems—deviceLdriver Clock_control()

{

//设置时钟滴答中断处理方式

};

/*关闭时钟设备*/

void Clock_exit()

{

//屏蔽时钟滴答,停止时钟计数

};

④启动时钟设备。

3.3 修改链接器命令脚本

链接器命令脚本为链接器提供链接的规则,对链接过程进行显式地控制.修改链接器脚本,配置系统可用内存区域和定义可执行映像各个程序段在内存中的位置,如加载程序时代码段(.text)从RAM地址。开始放置.

/*缺省值,可以修改*/

_PR()M_SIZE=2M;

_RAM_SIZE=4M;

_RAM_START_0x02000000;

_PROM-START=0x00000000;

/*最终可执行程序段的内存位置*/

SECTI()NS

{ .txt :

{ text_start=。;

*(.text)

.=ALIGN(16);

}》RAM

4 建立RTEMS可执行映像

BSP开发完成之后,与RTEMS的其他代码,如CPU依赖层、超核、API以及标准应用程序模块等,经由交叉编译工具编译连接之后,生成可以加载到目标机的RTEMS执行映像,如图3所示。

结 语

BSP的开发对于嵌入式系统的移植具有重要意义.本文以SPARC体系微处理器ERC32为例,讨论了RTEMS BSP的功能及其开发过程.实践证明,在BSP的开发过程中,①选择一个适当的BSP模板,②深刻理解模板BSP中的相关概念。这两点相当重要。因为,选择一个相近的BSP模板可大大减少工作量和复杂度.缩短移植周期;而深刻理解相关概念有助于根据具体目标硬件环境对模板BSP进行正确修改,达到预期目的。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19118

    浏览量

    305031
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10860

    浏览量

    211713
  • 微处理器
    +关注

    关注

    11

    文章

    2262

    浏览量

    82435
收藏 人收藏

    评论

    相关推荐

    XPS工具如何快速生成Virtex FPGA支持

    、多产,成为人们面临的主要挑战。嵌入式系统开发的关键活动之一是支持(BSP)。利用
    发表于 07-18 08:30

    BSP板卡支持介绍

    BSP板卡支持      i.MX31 Windows Mobile 6 BSP是用于i.MX31多媒体处理器的板卡
    发表于 08-27 08:14

    NUCLEO-WL55JC2开发板BSP支持)说明

    简介本文档为ST官方NUCLEO-WL55JC2开发板BSP支持)说明。主要内容如下:
    发表于 10-28 18:10

    Linux与VxWorks的支持开发的比较与分析

    Linux与VxWorks的支持开发的比较与分析:简要介绍了VxWorks的BSP
    发表于 03-25 10:34 25次下载

    实时操作系统中的支持BSP

    对嵌入式实时操作系统的支持BSP 和PC 机操作系统中的BIOS 进行比较;分析BSP
    发表于 05-13 16:49 20次下载

    什么是SPARC处理器

    什么是SPARC处理器              1
    发表于 12-17 10:40 966次阅读

    SPARC微处理器综合介绍

    SPARC是一个开放的体系结构标准,它基于80年代加州大学伯克利分校对RISC微处理器的研究成果,现在已成为国际上流行的RISC微处理器体系架构之一。本文介绍了SPARC
    发表于 06-23 11:33 2712次阅读
    <b class='flag-5'>SPARC</b><b class='flag-5'>微处理器</b>综合介绍

    基于Pentium4处理器的VxWorks支持设计

    文中研究了BSP和驱动程序设计中的理论和关键技术,应用风河公司开发的Tornado集成开发环境基于Pentium4处理器,移植了VxWorks下的最简
    发表于 12-07 14:12 34次下载

    基于XSCALE架构处理器WinCE系统BSP开发

    该文介绍了 Intel 公司的基于 XSCALE 架构 PXA255 微处理器和嵌入式操作系统 WinCE 以及该操作系统下基于 PXA255 硬件开发板 BSP开发。结合编程实例
    发表于 04-18 14:12 0次下载

    SPARC V8结构嵌入式微处理器的软件集成开发环境总体设计

    SPARC V8 ( Sc a l a b l e Pr o c e s s o rArchitecture V8)是Sun Microsystems 提出的一种32位RISC微处理器结构,此结构
    发表于 10-31 15:40 1次下载
    <b class='flag-5'>SPARC</b> V8结构嵌入式<b class='flag-5'>微处理器</b>的软件集成<b class='flag-5'>开发</b>环境总体设计

    关于SPARC微处理器综述

    Set Computer)微处理器体系架构之一。 SPARC是开放的,任何机构或个人均可研究或开发基于SPARC架构的产品,如东芝、富士通、Aeroflex、ESA(Europen
    发表于 11-01 16:18 3次下载
    关于<b class='flag-5'>SPARC</b><b class='flag-5'>微处理器</b>综述

    支持的定义及作用分析

    本文首先介绍了什么是支持以及BSP的三大部分,其次介绍了
    的头像 发表于 06-05 11:45 9867次阅读
    <b class='flag-5'>板</b><b class='flag-5'>级</b><b class='flag-5'>支持</b><b class='flag-5'>包</b>的定义及作用分析

    基于嵌入式处理器的Virtex FPGA支持设计

    ,成为人们面临的主要挑战。嵌入式系统开发的关键活动之一是支持BSP)。利用
    发表于 08-06 09:03 899次阅读

    如何导出硬件平台并启动SDK开发应用程序及支持

    本文介绍如何导出硬件平台, 并启动SDK开发应用程序及支持(BSP)。
    的头像 发表于 02-08 10:56 2454次阅读
    如何导出硬件平台并启动SDK<b class='flag-5'>开发</b>应用程序及<b class='flag-5'>板</b><b class='flag-5'>级</b><b class='flag-5'>支持</b><b class='flag-5'>包</b>

    欧空局为何从SPARC换成了RISC-V

    / Microchip 欧空局(ESA)所用的SPARC航空处理器更是已经有了20多年的历史,从最早的ERC32,到如今Gaisler仍在开发
    的头像 发表于 12-21 07:30 1285次阅读