历史上的今天
返回首页

历史上的今天

今天是:2025年12月20日(星期六)

2022年12月20日 | SamsungS3C2440平台上的VxworksBSP移植

2022-12-20 来源:elecfans

引 言

美国WindRiver公司于1983年设计开发的VxWorks操作系统是一种嵌入式实时操作系统(RTOS),是嵌入式操作系统的典型代表,它的高可靠性、可剪裁性、强实时性被广泛的应用在军事、通信、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、导弹制导、飞机导航等。BSP(Board Support Package)在VxWorks操作系统中起到了部分接口的驱动和硬件初始化的作用,它是生成bootrom和VxWorks映像文件的前提,而S3C2440是Samsung公司设计的ARM920T系列的核心处理器,是嵌入式领域比较常用的ARM处理器。因此,研究基于S3C2440平台上的Vxworks BSP移植具有重要的意义。本文就BSP的概念、BSP移植过程中重点修改的几个文件、串口和网口驱动以及BSP的调试和仿真做详细的介绍。

BSP概述

VxWorks操作系统将所有硬件的功能函数分别放到一系列库中,这些库就被称为板级支持包BSP。BSP是连接VxWorks操作系统与硬件平台的一个接口软件包,在引导系统、支持系统运行过程中扮演着重要的角色,首先,通过BSP可以生成引导操作系统的bootrom;其次,引导行工程的建立基础就是BSP;最后,BSP具有与用户交互的作用,可以提供一个基础的硬件调试环境。BSP还可以使VxWorks运行于特定的硬件平台,如ARM、PPC、X86等,它包含了一系列与硬件相关的函数,完成针对硬件的基本输入与输出操作,可以使上层程序员在不用熟悉硬件的情况下进行编程。例如,一般它完成以下操作:目标板硬件初始化、内存控制器初始化、堆栈初始化、外围设备初始化(I/O、Interrupt……)、异常向量处理、CACHE操作、硬件设备的底层驱动、定时器驱动、串口驱动、END网络驱动、FLASH驱动、LCD驱动等。

BSP在嵌入式系统中扮演的角色,很类似于在PC系统中的BIOS和驱动程序的地位。图1中包括了VxWorks操作系统的各种组件,指明了BSP在整个系统中所处的地位和作用。

VxWorks在S3C2440上的BSP设计

S3C2440简介

移植目标机的硬件配置具体如下:处理器S3C2440,采用ARM920T内核,内存大小64M;NAND Flash大小为128M;

NOR Flash大小为2M;3路URAT;2路SPI;IIC总线接口;网卡:DM9000,10/100M的自适应。



图1 BSP在嵌入式系统中的位置框图

BSP的移植过程

要进行BSP的开发和设计,最好有一个可参考的模板,由于Samsung S3C2440A的内核是ARM920T,所以参考的模板选择Tornado for arm 的integrator920t。BSP文件主要在VxWorks编译环境Tornado的目录target/config/all和target/config/integrator920t文件夹中。其中,all文件夹里的文件对于绝大多数BSP都是共用的,一般来说不用怎么修改,重点是修改integrator920文件夹下的几个文件,这主要是指makefile、config.h、rominit.s和sysLib.c中相关部分的修改,另外添加了串口驱动和DM9000的网卡驱动。

修改Makefile文件

Makefile的两个主要功能就是提供文件之间的依赖关系和目标文件生成方法,定义编译和链接整个BSP的规则,在makefile文件中有一些参数已经在config.h文件中定义过了,但是必须保证两处的定义一致,否则会出现编译错误。下面介绍一些需要修改的参数:

CPU:描述目标板的处理器类型,设计中为ARMARCH4;

TOOL:该参数用来选择编译工具,VxWorks中可使用GNU和DIAB两种,设计中用GNU编译器来编译目标代码;

TGT_DIR:默认设置为$(WIND_BASE)/target;

TARGET_DIR:默认为BSP所在的目录,设计中为mini2440;

VENDOR:板卡生产商的名称,设计中为HITSAT;

BOARD:板卡的名称,设计中为OMU;

ROM_SIZE:ROM或Flash的大小(十六进制);

RAM_LOW_ADRS:VxWorks在RAM中的起始地址,即入口地址;

RAM_HIGH_ADRS:非驻留ROM内核的启动程序加载地址。关于入口地址和高位地址的指定需参考硬件的RAM组织。

该文件下其余的设置和定义都与模板中的一致。

修改config.h

config.h文件是BSP软件中比较重要的一个文件,VxWorks内核组件的配置可以通过config.h文件来定义。config.h文件包含了所有头文件和CPU相关的特殊定义,config.h文件中的配置参数是在configAll.h文件内容的基础上根据开发板的硬件资源设置的,其中包括定义引导行、修改存储空间的地址等。下面详细介绍config.h文件中修改的部分配置参数:

(1)定义引导行

#define DEFAULT_BOOT_LINE "dm(0,0) zwj-PC:d:VxWorks h=192.168.0.1 e=192.168.0.2 u=zwjhjj pw=zwjfile tn=mini2440"

其中:dm(0,0)为boot device,即启动设备映像;

zwj-PC为host name,即主机名;

d:VxWorks为file name,即要下载的VxWorks镜像文件路径;

h=192.168.0.1为主机IP地址;

e=192.168.0.2为目标板IP地址;

u=zwjhjj为FTP登陆时的用户名;

pw=zwjfile为FTP登陆时的密码;

tn=mini2440为目标板名称。

(2)修改地址

对目标板存储区配置参数的修改时一定要注意:该文件中地址定义,如ROM-TEXT-ADRS、ROM-SIZE、RAM-LOW-ADR、SRAM-HIGH-SIZE等要与Makefile文件中的相关定义一致。根据实际CPU以及外扩存储器的大小来确定目标板内存。

#define LOCAL_MEM_LOCAL_ADRS 0x30000000 / *RAM的起始地址*/

#define LOCAL_MEM_SIZE 0x04000000 /*RAM的大小为64M*/

#define ROM_BASE_ADRS 0x00000000 /*Flash的基地址*/

#define ROM_SIZE0x00100000 /*存VxWorks的Flash大小*/

#define ROM_COPY_SIZE ROM_SIZE

#define ROM_SIZE_TOTAL 0x00200000 /*Flash总大小*/

#define RAM_LOW_ADRS 0x30001000 /*VxWorks 映像的入口地址*/

#define RAM_HIGH_ADRS 0x32e00000 /*Bootrom在RAM中的起始地址*/

修改S3C2440x.h

该文件是自己添加的一个文件,其中包括处理器相关的外设寄存器结构、地址、外设中断号分配、串口等的设置。下面主要介绍一下该文件中对串口的定义:

/* s3c2440串口的定义*/

#define UART_XTAL_FREQ s3c2440x_PCLK

/*串口时钟频率*/

#define N_s3c2440x_UART_CHANNELS 3 /*串口通道数 */

#define N_SIO_CHANNELS N_s3c2440x_UART_CHANNELS

#define N_UART_CHANNELS N_s3c2440x_UART_CHANNELS

#define UART_0_BASE_ADR 0x50000000 /*串口0的基地址*/

#define UART_1_BASE_ADR 0x50004000/*串口1的基地址*/

#define UART_2_BASE_ADR 0x50008000/*串口2的基地址*/

另外又添加了一个s3c2440xSio.h文件,在该文件中定义了串口数据结构:

typedef struct s3c2440x_CHAN

{ SIO_CHAN sio; /* 标准SIO_CHAN结构 */

STATUS (*getTxChar) (); /*安装发送回调函数 */

STATUS (*putRcvChar) (); /*安装接收回调函数 */

void * getTxArg;

void * putRcvArg;

…….

UINT32 channelMode; /*当前模式(中断或轮询)*/

int baudRate; /*当前波特率*/

}

数据结构初始化之后,还有几个重要的函数需要注意:sysHwInit():处理器I/O端口的初始化;sysSerialHwInit():初始化设备描述符;sysSerialHwInit2():通过intConnect()把串口的中断处理程序s3c2440xIntTx、s3c2440xIntRcv连接接到相应的中断向量上,并由int Enable()开启两个中断,调用s3c2440xDevInit2()对_UCON寄存器赋值完成对串口的最终配置由轮询模式转换为中断模式,并在中断服务程序中实现串口数据的接收和发送。通过对这些功能函数的添加完成串口驱动的设计。

修改romInit.s

部分代码修改如下:

/*添加了对串行口UART的初始化,配置了UART的一些控制寄存器,并设置了波特率,部分代码如下*/

InitUART:

#define UART_BRD (( 50750000 / (115200 * 16)) - 1)

mov r2,#UART_BRD /*设置串口的波特率 */

/*初始化堆栈指针*/

ldr sp, L$_STACK_ADDR

mov fp, #0

在建立堆栈之后,系统就具备了高级语言的执行条件,后续的代码就可以用C语言来实现了。

/*使程序跳转至C语言程序段代码如下*/

#if (ARM_THUMB)

ldr r12,L$_rStrtInRom

orr r12,r12, #1

bx r12

#else

ldr pc,L$_rStrtInRom /*跳转到romStart()中执行*/ #endif

CPU将执行权转移给romStart()之后。该函数就使内存清空,然后把整个引导映像复制到内存中,最后将CPU的控制权交给usrInit()。

修改sysLib.c

文件sysLib.c提供VxWorks和应用程序间的板级联系,这里重点介绍一下内存映射函数。

目标系统开启了MMU模块,BSP在sysLib.c文件里面就定义了一个sysPhysMemDesc[ ]表。部分代码如下所示:

PHYS_MEM_DESC sysPhysMemDesc [] =

{ (void*) (ROM_BASE_ADRS+0xf0000000), (void *) (ROM_BASE_ADRS),

ROUND_UP(ROM_SIZE_TOTAL*2,PAGE_SIZE),

VM_STATE_MASK_VALID|VM_STATE_MASK_WRITABLE|VM_STATE_MASK_CACHEABLE,

VM_STATE_VALID|VM_STATE_WRITABLE_NOT|VM_STATE_CACHEABLE_NOT

}

上面一小段代码是对ROM_BASE_ADRS 的内存映射,ROM_BASE_ADRS+0xf0000000是要映射的虚拟地址,ROM_BASE_ADRS是硬件设计时定义的实际物理地址,ROUND_UP(ROM_SIZE_TOTAL*2,PAGE_SIZE)是映射长度,VM_STATE_MASK_VALID|VM_STATE_MASK_WRITABLE|VM_STATE_MASK_CACHEABLE是可初始化的地址状态,VM_STATE_VALID|VM_STATE_WRITABLE_NOT|VM_STATE_CACHEABLE_NOT是实际初始化的地址状态。

若添加新的外设,该外设对应的内存空间必须在sysPhysMemDesc[]中配置。通过这样的配置就完成了内存映射和MMU的开启。

修改dm9kEnd.c

由于S3C2440使用的是DM9000网卡。要做好DM9000网卡的END驱动首先要初始化网卡的数据结构dm9kDevice,这个数据结构如下:

typedef struct dm9kDevice

{

END_OBJ endObj; /*继承类 */

int unit; /*设备单元号 */

UINT32 flags; /* 本地标志信号*/

int ivec; /* 中断向量 */

int ilevel; *中断级 */

……

} DM9K_DRV_CTRL

数据结构中的END_OBJ类型成员、网卡单元号、中断号和中断向量是网卡驱动中必须包含的成员元素。

驱动的部分接口函数,主要包括网卡加载函数dm9kEndLoad、网卡启动函数dm9kStart、停止网卡函数dm9kStop、网卡控制函数dm9kIoctl、网卡卸载函数dm9kUnload、网卡发送函数dm9kSend、获取组播地址函数dm9kMCastGet、启动轮询模式函数dm9kPollStart、关闭轮询模式函数dm9kPollStop、轮询模式发送函数dm9kPollSend、轮询模式接收函数dm9kPollRcv等,通过对这些接口函数编写功能,实现网卡驱动。

在编写驱动的过程中,还必须注意:由于目标板用一种100pin的DM9000芯片,这种芯片除了有CMD信号之外,还有6根地址片选信号SA4~SA9,根据SA4~SA9对应的CPU地址线和数据手册上引脚定义,可以计算出网卡的端口地址,如果SA4~SA9对应CPU地址的addr4~addr9,那么网卡端口基址就是0x18000300,这样可以计算出网卡的基地址。


图2 VxWorks COM1口的打印信息

BSP的调试与仿真

BSP修改完成以后,就要进行调试了,这里采用点亮LED灯的调试方法,写一段点灯程序,用BSP生成bootrom和VxWorks映像,使用H-JTAG软件将bootrom烧写进目标板的norflash中,通过在不同位置反复的调用点灯程序和烧写bootrom到norflash中来调试BSP,并通过串口查看调试信息,如图2所示,是操作系统启动过程中,经过串口传输到主机上打印的调试消息,通过这些信息可以判断出系统启动过程中哪一部分出现了问题。


图3 VxWorks Shell界面

系统上电之后,bootrom首先运行,然后通过网线将VxWorks映像文件下载进rom中,图3所示为VxWorks的Shell界面,显示设备列表有串口和网口,表明串口和网口驱动成功。


推荐阅读

史海拾趣

American Technical Ceramics (ATC)公司的发展小趣事

美国技术陶瓷公司(ATC,American Technical Ceramics)是一家专注于设计、制造和销售高性能技术陶瓷产品的公司。以下是关于ATC公司发展的五个相关故事:

  1. 公司成立与初期发展:美国技术陶瓷公司成立于1967年,总部位于美国纽约州的Huntington。公司最初以生产高质量的多层陶瓷电容器而闻名。在成立初期,ATC专注于开发陶瓷材料和制造工艺,确保产品具有优异的电气性能和可靠性,满足客户的需求。

  2. 技术创新与产品扩展:随着技术的发展和市场需求的变化,ATC不断进行技术创新,并扩展产品线。公司推出了一系列新产品,包括陶瓷电感器、滤波器、天线以及定制陶瓷元件等。这些产品在通信、航空航天、医疗、汽车等领域得到广泛应用。

  3. 国际业务拓展:为了满足全球客户的需求,ATC逐步拓展了国际业务。公司在亚洲、欧洲和其他地区设立了销售办事处和分支机构,建立了全球销售网络。通过与国际客户和合作伙伴的合作,ATC不断拓展市场份额,并加强了在全球市场的竞争力。

  4. 质量控制与认证:作为一家专注于高性能技术陶瓷产品的公司,ATC始终将质量放在首位。公司实施严格的质量控制措施,从原材料采购到生产制造、产品测试和交付都严格把关,确保产品符合客户的要求和行业标准。ATC的质量管理体系获得了ISO 9001认证,为客户提供了信心和保障。

  5. 持续创新与发展:随着电子行业的不断发展和技术的进步,ATC致力于持续创新和发展。公司不断投入研发,并与客户合作开发定制化的解决方案,以满足不断变化的市场需求。同时,ATC也积极关注可持续发展和环保责任,努力降低对环境的影响,并致力于推动绿色技术的发展。

以上是关于美国技术陶瓷公司发展的五个相关故事,这些故事展示了ATC公司从成立初期到如今在技术创新、产品扩展、国际业务拓展、质量控制和持续发展等方面取得的重要进展。

Hirel Systems Ltd公司的发展小趣事

对于四通道红外遥控器接收器电路,网友可能提出的问题涉及多个方面,以下是一些可能的问题及回答:

一、技术原理类问题

  1. 问题:四通道红外遥控器接收器电路是如何工作的?
    回答:四通道红外遥控器接收器电路主要通过光电二极管接收遥控器发射的红外信号,经过放大、解码等处理,最终识别出不同的按键指令,并控制相应的设备执行操作。具体来说,当遥控器发射出特定频率的红外光信号时,光电二极管将光信号转换为电信号,经过放大电路放大后,送入解码器进行解码,解码器根据解码结果输出相应的控制信号,控制设备执行相应的操作。

  2. 问题:接收器电路中的关键元件有哪些?
    回答:接收器电路中的关键元件包括光电二极管(用于接收红外光信号)、放大器(用于放大微弱的电信号)、解码器(用于解码信号并输出控制信号)以及可能的滤波电路(用于滤除噪声干扰)等。这些元件共同协作,实现红外信号的接收和处理。

二、故障排查与维修类问题

  1. 问题:接收器无法接收到信号,可能的原因有哪些?
    回答:接收器无法接收到信号的可能原因包括:

    • 光电二极管损坏或老化,导致无法有效接收红外光信号。
    • 接收器电路中的连接线松动或接触不良,导致信号传输中断。
    • 放大器或解码器故障,无法对接收到的信号进行正常放大或解码。
    • 接收器受到外界干扰(如光线、电磁干扰等),影响信号的接收和处理。

    针对以上问题,可以逐一检查光电二极管、连接线、放大器、解码器等元件的状态,并采取相应的维修或更换措施。同时,注意避免将接收器放置在易受干扰的环境中。

  2. 问题:如何排查和解决接收器响应延迟或误动作的问题?
    回答:排查和解决接收器响应延迟或误动作的问题可以从以下几个方面入手:

    • 检查遥控器发射的红外信号是否正常,包括信号的频率、强度等是否符合接收器的要求。
    • 检查接收器电路中的滤波电路是否设置得当,以避免噪声干扰导致误动作。
    • 检查解码器的解码逻辑是否正确,以确保能够准确识别出遥控器发射的指令。
    • 如果以上均正常,可以考虑检查接收器的电源系统是否稳定,以及是否有其他电路元件故障导致的影响。

    针对具体问题,可以采取相应的调整或维修措施来解决。

三、应用与拓展类问题

  1. 问题:四通道红外遥控器接收器电路可以应用于哪些场景?
    回答:四通道红外遥控器接收器电路可以广泛应用于各种需要遥控控制的设备中,如智能家居系统(如电视、空调、灯光等的遥控控制)、工业自动化控制(如电机、阀门等的远程控制)、安防监控系统(如摄像头、报警器的遥控操作)等。通过扩展通道数量和增加控制逻辑,还可以实现更复杂的控制功能。

  2. 问题:如何对四通道红外遥控器接收器电路进行升级或改造?
    回答:对四通道红外遥控器接收器电路进行升级或改造时,可以考虑以下几个方面:

    • 升级光电二极管或放大器等关键元件的性能,以提高接收灵敏度和信号处理能力。
    • 增加滤波电路或改进解码算法,以减少噪声干扰和提高解码准确性。
    • 扩展通道数量或增加控制逻辑,以实现更复杂的控制功能。
    • 引入无线通信模块(如Wi-Fi、蓝牙等),将红外遥控与无线控制相结合,提高控制的灵活性和便捷性。

    在进行升级或改造时,需要根据具体的应用需求和技术条件进行选择和设计。

Discera公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,Discera公司始终保持着对技术创新的追求。他们不断投入研发资源,推动产品的升级和换代。同时,Discera还积极探索新的应用领域和市场机会,为公司的未来发展描绘出更加广阔的蓝图。

以上五个故事概要基于Discera公司的发展历程和公开信息构建,旨在展示公司在电子行业中的成长和进步。请注意,这些故事并非真实事件,仅供参考。

Eink公司的发展小趣事
1996年4月,麻省理工学院(MIT)的贝尔实验室成功制造出了电子纸的原型,这一技术吸引了众多科技公司的注意。其中,E-Ink公司就是基于MIT的这项技术于1997年成立,开始全力研究将电子纸商品化的可能性。经过两年的努力,E-Ink在1999年推出了名为Immedia的用于户外广告的电子纸,标志着电子纸技术的初步商业化应用。
CIPS公司的发展小趣事

自CIPS系统上线以来,其业务量呈现快速增长的态势。通过CIPS系统处理的跨境人民币业务量逐年攀升,连接到该系统的参与者数量也大幅增加。这些参与者遍布全球各地,涵盖了银行、金融机构等多个领域。CIPS系统的业务范围不断扩大,实际业务覆盖全球多个国家和地区,为全球金融网络的发展做出了重要贡献。

EM Devices Corporation公司的发展小趣事

在产品研发取得突破的同时,EM Devices Corporation也积极拓展市场,寻求与国际企业的合作。公司参加了多个国际电子展,展示了自己的产品和技术实力。通过与国外企业的交流与合作,公司不仅获得了更多的市场机会,还学习到了先进的生产和管理经验。这些经验为公司后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

AT89C518通道ADC0809电压采集

本帖最后由 paulhyde 于 2014-9-15 09:22 编辑 AT89C518通道ADC0809电压采集  …

查看全部问答>

防止好帖子下沉太快!

最近发现竞赛专栏更新速度惊人。火爆程度可想而知。。。。 版主和管理员想必都忙的不行了。好的帖子也下沉的太快。 想出一个馊主意。吧一些很有的价值的帖子。能否设置成保护状态。 也就是说只有回复才能够查看全部内容。下载附件。。。。 呵呵 ...…

查看全部问答>

请高手指点读TMS320LF2407

请问用DSP仿真器能不能把没有加密的TMS320LF2407中的程序读出来啊?…

查看全部问答>

《ARM嵌入式应用开发技术白金手册》源代码.rar

《ARM嵌入式应用开发技术白金手册》源代码.rar…

查看全部问答>

evc4.0下ping的编写

          WSAData wsaData;         //初始化Socket动态链接库     if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {         return ;   ...…

查看全部问答>

为什么我的2410在wince下触摸屏只能中断一次呢?

如题,附上相关源码,请大家帮我看看是什么问题. ============================================================================== D:\\WINCE600\\PLATFORM\\SMDK2410\\SRC\\DRIVERS\\TOUCH\\s3c2410x_touch_2410.cpp ======================= ...…

查看全部问答>

卸载程序是如何实现:卸载程序执行完毕卸载程序被删除

是不是卸载程序中执行了删除自己的操作,应用程序一旦执行,删除操作就会被拒绝,谁能告诉我是怎么实现的. …

查看全部问答>

请问wince6下如何把poom定制到os中?

上面图片是我定制时选择的模块,但定制完成后,发现缺少Pimstore.h和Pimstore.lib这两个文件,这两个文件是poom api中的,是不是定制的时候还需要选择别的模块呢?谢谢…

查看全部问答>

evc 4.0 下 调用软件盘

在evc4.0下 如何调用软键盘       头文件里已经包含了  #include \"Sipapi.h\"    在Edit获得焦点,和失去焦点是这样写的 void student::OnSetfocusEdit1() {         HWND m_h ...…

查看全部问答>

在EVC中如何用代码使ListView的某一行被选中

就像被鼠标点击了的效果一样。 我的ListView的创建过程: g_hwndlist = CreateWindow(WC_LISTVIEW,TEXT(\"\"),                                   &nbs ...…

查看全部问答>