当前位置:首页 > 嵌入式 > 嵌入式硬件
[导读]一个优秀的RTOS(Real-Time Operating system)不但要拥有一个高可靠、多任务的实时内核,还应具有可剪裁和可移植的能力。RTEMS(the Real - Time Executivefor Multiproces

一个优秀的RTOS(Real-Time Operating system)不但要拥有一个高可靠、多任务的实时内核,还应具有可剪裁和可移植的能力。RTEMS(the Real - Time Executivefor Multiprocessor Systems)[1]就是这样的系统,它提供的环境可以满足高性能的嵌入式多任务实时应用。目前,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所示。这种结构只把那些绝对必需的系统功能置于内核之中(如中断管理、上下文切换、内存访问管理、时间管理、线程及线程间的通信与同步管理等),而把那些并非必需的系统功能(如文件系统、网络、远程过程调用等)置于微内核之上在用户模式下运行。


RTEMS的板级支持包是启动代码、连接器脚本和编译规范文件(specs)和设备驱动程序的集合[2],它们针对不同目标机的硬件环境剪裁RTEMS。 2 RTEMS启动过程 处理器加电或复位时,基于RTEMS的应用程序初始化或者重新初始化[3]。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进行正确修改,达到预期目的。

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

利用LogiCoA™微控制器,以更低功耗实现与全数字控制电源同等的功能

关键字: 微控制器 电源 CPU

2024年4月18日 – 提供超丰富半导体和电子元器件™的业界知名新品引入 (NPI) 代理商贸泽电子 (Mouser Electronics) 很荣幸地宣布与Edge Impulse建立新的全球合作关系。Edge Im...

关键字: 机器学习 MCU CPU

无论您是在研究如何使用 10GigE 还是寻求所需考虑事项的建议,本文均提供有实践,帮助确保单相机 10GigE 视觉系统设置顺利并拥有良好性能。 我们列出了主机系统配置、布线和相机设置的实践。

关键字: 视觉系统 CPU 存储器

Apr. 16, 2024 ---- NVIDIA新一代平台Blackwell,包含B系列GPU及整合NVIDIA自家Grace Arm CPU的GB200等。TrendForce集邦咨询指出,GB200的前一代为GH2...

关键字: CPU GPU

人工智能是集合众多方向的综合性学科,在诸多应用领域均取得了显著成果[1]。随着航空领域人工智能技术研究的不断深入,面向开放式机载智能交互场景,人工智能的应用可解决诸多问题。例如智能感知、辅助决策等,可利用人工智能算法对多...

关键字: 人工智能 PCIe CPU

CPU针脚弯了,用工具调正就不会有影响。开机自检也通过,CPU 再出问题就不是针脚引起的问题。针脚只要不断就没有问题,有的CPU出厂的时候针脚就有点弯,这并不是什么大问题,只要用镊子轻轻地弄直就可以了。

关键字: CPU 针脚 开机自检

瑞典乌普萨拉,2024年3月27日 – 全球领先的嵌入式系统开发软件解决方案供应商IAR自豪地宣布:公司备受全球数百万开发者青睐的开发环境再次升级,已率先支持瑞萨首款通用32位RISC-V MCU,该 MCU 搭载了瑞萨...

关键字: MCU RISC-V CPU

联发科与高通骁龙的对决可以说是一场性能与价值的较量,那么,你对两者的芯片有了解吗?在移动设备领域,芯片制造商的竞争愈发激烈。其中,来自台湾的联发科(MediaTek)与美国的高通(Qualcomm)无疑是该领域的两大巨头...

关键字: 联发科 高通骁龙 CPU 处理器

云和超大规模服务运营商正不断增大计算密度。随着 Microsoft Cobalt、阿里巴巴的倚天 710、AmpereOne等配置 128 核或以上的 CPU 设计进入市场,单个封装可实现的性能更强,且下一代的目标还将远...

关键字: CPU 处理器

Arm Neoverse 旨在为从云到边缘的全场景基础设施用例提供高性能和出色能效。针对需要更高性能的工作负载和用例,Arm 推出了 Neoverse V 系列。其中,Neoverse V2 核心已被行业先行者广泛部署于...

关键字: 云计算 人工智能 CPU
关闭
关闭