ucos-ii下bootloader...

Post on 31-Mar-2020

10 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

uCOS-II下bootloader与驱动程序开发

演讲人:刘淼(博创科技)

threewater@up-tech.com

2004.5.232004.5.23

uCOS-II与bootloader

Bootloader的任务• 硬件系统自检

• 配置其他Bank或者端口、外设等工作模式

• 处理系统的中断

• Flash编程、系统的下载

• 参数和数据的设置、存储和传递

异常类型

FIQ

IRQ(Interrupt ReQuest)

未定义指令

预取中止

数据中止

复位

软件中断Software interrupt

通过软件中断产生

进行管理员模式中获得

通常要求特殊的管理功能,如操作系统支持

ARM中异常的优先级

(1) Reset (highest priority)

(2) Data abort

(3) FIQ

(4) IRQ

(5) Prefetch abort

(6) 未定义指令, Software interrupt (最低优先级)

• 只要产生异常就会导致正常和程序流程被临时停止,例如外围中断服务程序

• 在异常被处理前,当前的处理器状态必须被保存,以便处理程序完成后,最后的程序可以被恢复.

如何处理异常

进入异常的操作-1

• 在相应的链接寄存器LR (r14)中保存下一条指令的地址

• 将CPSR复制到相应的SPSR中

• 强制使CPSR模式位置成对应异常类型的值

• 强制使程序计数器指向相应异常向量,取下一条指令

进入异常的操作-2R14_<Exception_Mode>=Return LinkSPSR_<Exception_Mode>=CPSRCPSR[4:0]=Exception Mode NumberCPSR[5]=0 ;当运行于ARM状态时

IF<Exception_Mode>==Reset or FIQ then;当响应FIQ异常时,禁止新的FIQ异常

CPSR[6]=1;CPSR[7]=1;

PC=Exception Vector Address

异常向量

处理系统的中断

• 带有MMU或者支持remap的处理器,使用重映象

的方法

• ARM720T、ARM920T

• S3C4510

• 不支持(或者不使用)重映象的处理器,需要在bootloader中处理中断、或者软件重定位

bootloader中处理中断的问题如果处理器不支持remap

• 通常Bootloader所在的空间是ROM空间

• ARM的跳转指令(B或者BL),只能相对寻址±32MB空间

查表法

• 中断向量表建立在RAM空间的指定地址

• Bootloader中的程序查找RAM空间的向量地址并跳

• 向系统添加中断需要修改RAM中的中断向量表,不用修改Bootloader中的代码

查表法的代码分析

AREA Init,CODE,READONLY

ENTRY b ResetHandler ;for debugb HandlerUndef ;handlerUndefb HandlerSWI ;SWI interrupt handlerb HandlerPabort ;handlerPAbortb HandlerDabort ;handlerDAbortb . ;handlerReservedb HandlerIRQ ;handlerIRQb HandlerFIQ ;handlerFIQ

$HandlerLabel HANDLER $HandleLabel

$HandlerLabelsub sp,sp,#4stmfd sp!,{r0}ldr r0,=$HandleLabelldr r0,[r0]str r0,[sp,#4]ldmfd sp!,{r0,pc}MEND….

HandlerIRQ HANDLER HandleIRQ

sub sp,sp,#4

栈内的数据SP

CPC

R1

R0 XXXXXXXX低地址

高地址

堆栈增长方向

stmfd sp!,{r0}

XXXXXXXX

ldr r0,= HandleIRQ

HandleIRQ

ldr r0,[r0]

IRQ_ISR

str r0,[sp,#4]

IRQ_ISR

ldmfd sp!,{r0,pc}

IRQ_ISR

重定位法

• 直接对PC指针进行操作,使程序通过bootloader的空间直接跳转到对应的RAM空间

• 比如S3C44B0中:

• SDRAM空间从0x0C000000开始

• 系统(uCOS-II)放在0x0C000000处

• 在bootloader的异常向量表中使用ADD指令跳转

ADD的限制ARM的数据处理指令格式为:

xxxx000a aaaSnnnn ddddcccc ctttmmmm 寄存器形式

xxxx001a aaaSnnnn ddddrrrr bbbbbbbb 立即数形式

ADD Rd, #0

• 如果使用立即数形式,则操作数2为:Op2 = #b, ROR #2r

重定位法的代码分析

B ColdReset;when enter interruption jump to sdram areaadd pc, pc, #0x0C000000;UndefinedInstructionadd pc, pc, #0x0C000000 ;syscall_handleradd pc, pc, #0x0C000000 ;PrefetchAbortadd pc, pc, #0x0C000000 ;DataAbortadd pc, pc, #0x0C000000 ;ReservedHandleradd pc, pc, #0x0C000000 ;IRQHandleradd pc, pc, #0x0C000000 ;FIQHandler

PC+8• 受到流水线的影响,读取得PC指针和实际的差8个

0x18:add pc, pc, #0x0C000000

实际跳转到了0x0C000018+8地址处

所以,RAM中程序的异常向量表要从0x0C000008处开始

嵌入式以太网的设计方法

以太网接口的基本知识1、传输编码

• 曼彻斯特编码

• 差分曼彻斯特编码

以太网协议

• 以太网的物理传输帧 (IEEE802.3 )

32位可选不超过1500字节16位48位48位8位56位

FCSPADDATATYPESADASDPR

PR: 同步位,收发双方的时钟同步,也指明传输的速率(10M、100M)SD: 分隔位,表示下面跟着的是真正的数据,而不是同步时钟DA: 目的地址,以太网的地址为48位地址。如果为都为F,则是广播地址SA: 源地址,48位,表明该帧的数据是哪个网卡发的,即发送端的网卡地址TYPE:类型字段,表明该帧的数据是什么类型的数据。如:0800H 表示数

据为IP包DATA:数据段,该段数据不能超过1500字节。PAD: 填充位。以太网帧传输的数据包最小不能小于60字节, 当数据段不足

46字节时,后面补000000.....(当然也可以补其它值)FCS:32位CRC数据校验位。该校验由网卡自动完成

以太网的应用

• PR,SD,PAD,FCS这几个数据段是由网卡自动产生的;只需要理解DA、SA、TYPE、DATA四个段的内容

• 所有数据位的传输由低位开始(传输的位流使用曼彻斯特编码) • 以太网的冲突退避算法是由硬件自动执行的

• DA+SA+TYPE+DATA+PAD最小为60字节,最大为1514字节

• 以太网卡可以接收三种地址的数据,一个是广播地位,一个是多播地址(在嵌入式的环境中一般不用),一个是它自已的地址

• 任何两个网卡的物理地址都是不一样的,是世界上唯一的,网卡地址由专门机构分配。

嵌入式的以太网方案

• 嵌入式处理器+网卡芯片(RTL8019)• 对嵌入式处理器没有特殊要求,通用性强

• 处理器和网络数据交换通过外部总线,速度慢,不适合于100M网络

• 带有以太网络接口的嵌入式处理器

• 处理器面向网络应用

• 处理器和网络数据交换通过内部总线,速度快

RTL8019的原理框图

TCP/IP协议的层次

BSD套接字(BSD Sockets) 应用层(Application)

物理层 (Physical)

IEEE802.3 Ethernet MAC数据链路层(Data Link)

IP、ARP、ICMP、IGMP网络层 (Network)

TCP、UDP传输层 (Transport)

嵌入式以太网中主要处理的协议

• ARP(Address Resolation Protocol)地址解析协议

• ICMP (Internet Control Messages Protocol)网络控制报文协议

• IP(Internet Protocol) 网际协议

• TCP(Transfer Control Protocol) 传输控制协议

• UDP(User Datagram Protocol)用户数据报协议

ARP协议• 网络层用32 bit的IP地址来标识不同的主机,而链路层使用48 bit的物

理(MAC)地址来标识不同的以太网接口。只知道目的主机的IP地址并不能发送数据帧给它,必须知道目的主机网络接口的MAC地址才能发送数据帧。

• ARP的功能是实现从IP地址到对应物理地址的转换。源主机发送一份包含目的主机IP地址的ARP请求数据帧给网上的每个主机,称作ARP广播,目的主机的ARP收到这份广播报文后,识别出这是发送端在寻问它的IP地址,于是发送一个包含目的主机IP地址及对应的MAC地址的ARP回答给源主机。

• 每台主机上都有一个ARP高速缓存,存放最近的IP地址到硬件地址之间的映射记录。通常每一项的生存时间为20分钟

ICMP协议• IP层的附属协议,IP层用它来与其他主机或路由器

交换错误报文和其他重要控制信息。

• ICMP报文是在IP数据报内部被传输的。

• 两个实用的网络诊断工具,Ping和Traceroute(Tracert),都是利用该协议工作的。

IP协议• IP工作在网络层,是TCP/IP协议族中最为核心的协议。所有的TCP,UDP,ICMP以及IGMP数据都以IP数据报格式传输。

• IP数据报最长可达65535字节,其中报头占32 bit的数目。包含各32 bit的源IP地址和目的IP地址。在嵌入式应用中,简化设计,IP数据报长度等于数

据链路层的数据长度。

TCP协议• TCP是一个面向连接的可靠的传输层协议。TCP为两台主机提供高可靠性的端到端数据通信。主要包括:• 发送方把应用程序交给它的数据分成合适的小块,并添加附加信息(TCP头),包括顺序号,源、目的端口,控制、纠错信息等字段,称为TCP数据报。并将TCP数据报交给下面的网络层处理。

• 接受方确认接收到的TCP数据报,重组并将数据送往高层。

UDP协议• UDP是一种无连接不可靠的传输层协议。

• 把应用程序传来的数据加上UDP头(包括端口号,段长等字段),作为UDP数据报发送出去,

但是并不保证它们能到达目的地。可靠性由应用层来提供。就象发送一封写有地址的一般信件,却不保证它能到达。

关于端口

• TCP和UDP采用16位的端口号来识别上层的TCP用户,即上层应用协议如FTP,TELNET等。

• 常见的TCP/IP服务都用1-255之间的端口号。例如FTP服务的TCP端口号都是21,Telnet服务的TCP端口号都是23

• 256-1023之间的端口号通常都是提供一些特定的Unix服务

• TCP/IP临时端口分配1024-5000之间的端口号

基于ARM和uCOS-II的TCP/IP协议

• uCOS操作系统的内核中没有集成TCP/IP的协议栈,但是,TCP/IP的协议的特点决定了,它要想

很好地实现,必须要有一个多任务操作系统的支持。在嵌入式应用的领域中,uCOS也是一个很好

的选择

在ARM上的TCP/IP协议栈的问题

• 32位处理器的字节对齐的问题

• ARM是一个32位处理器,通常,如果没有特殊的要求,C语言中的结构体(struct)要求4字节对齐的。但是,在TCP/IP协议中,会有如下两种问

题:

• 要求多个数据是紧缩在一个4字节中

• 有的4字节的数据从以太网的物理层接收以后,在内存中并不是4字节对齐存储的

字节对齐问题的解决

• 通过,使用紧缩数据相关的关键字,可以让C语言

的结构体以紧缩的方式存储(并不不是每个结构体成员都是4字节对齐),比如在ARM SDT中,使用__packed关键字定义的结构体(struct)编译的时候,就可以生成紧缩的数据段。

ARM的问题• 然而,作为32位处理器,和x86不同的是,ARM不支持非对齐字节的数据传输。就是说,在C语言里,一旦使用了32位的指针操作一个非4字节对齐的数据,ARM就会陷入一个异常。这个问题将会给TCP/IP(或者其他软件)的移植,带来很多麻烦。一定要小心的处理这些问题。

BSD套接字(BSD Sockets) • BSD Sockets使用的最广泛的网络程序编程方法,主要用于

应用程序的编写,用于网络上主机与主机之间的相互通信

• UNIX,Linux,VxWorks均支持BSD Sockets,Windows的Winsock基本上是来自BSD Sockets

• Socket分为Stream Sockets和Data Sockets• Stream Sockets是可靠性的双向数据传输,使用TCP协议

• Data Sockets是不可靠连接,使用UDP协议

套接字的使用

UDP服务器端和一个UDP客户端通信的程序过程• 创建一个Socket

sFd =socket (AF_INET, SOCK_DGRAM, 0)

• 把Socket和本机的IP,UDP口绑定bind (sFd, (struct sockaddr *) &serverAddr, sockAddrSize)

• 循环等待,接收(recvfrom)或者发送(sendfrom)信息• 关闭Socket,通信终止

close (sFd)

uCOS-II下的驱动程序• uCOS-II没有给驱动程序提供统一的标准接口

• 任何在系统中对于硬件的管理都可以称为uCOS的驱动程序

• 为了方便驱动程序的模块化划分,提高代码的可重用性,uCOS-II的驱动程序可以自定义标准

驱动程序抽象层

• 操作系统只和特定的驱动抽象层通讯,无论在抽象层下面对应的是什么类型的设备,对操作系统和用户的应用程序来说都是统一的接口。

• 通过使用C语言的指针函数的方法,实现了驱动抽象层的软件设计。通过指向不同驱动子程序的函数指针,为同一操作系统挂载了多种驱动程序。

uCOS-II中CAN总线驱动程序结构

uCOS-II中CAN总线驱动程序剖析

• 在can.h中定义CAN总线驱动程序的结构can_driver_t

• 通过全局数组can_driver挂载CAN总线驱动

• CAN总线的抽象层在can.c中实现

• 驱动程序在mcp2510.c中实现

• 系统的启动与驱动程序的加载过程

触摸屏(键盘)驱动程序结构

触摸屏驱动程序剖析

• ../ucos-ii/add/OSAddTask.c中的任务初始化函数OSAddTask_Init的触摸屏的初始化函数TchScr_init

• 创建触摸屏任务Touch_Screen_Task• 注册系统中断(SetISR_Interrupt)• 开启S3C44B0外部中断4567(TS_OPEN_INT)• 中断程序Touch_Screen_ISR的实现

• 触摸屏的查询任务

键盘驱动程序剖析

• ../ucos-ii/add/OSAddTask.c中的任务初始化函数OSAddTask_Init的创建键盘任务Key_Scan_Task

• 键盘初始化函数KeyBoard_init();• 中断程序ISR_Key的实现

• 键盘的查询任务

• 键盘映射表KeyBoard_Map

uCOS-II下的应用程序举例

嵌入式系统开发的一点思考

嵌入式的一时兴起

• 系统的模块化设计思想

• 软件的模块化

• BSP/驱动程序

• 操作系统

• 应用程序

• 硬件的模块化设计

• 基于平台的开发

核心模块的设计思想

• 同一个硬件平台,内核相对固定

• 一次设计,重复使用

• 方便调试与二次开发

基于模块的开发举例——高压变频器控制器的应用

640x480 256 LCD

双串口

触摸屏

键盘

USB

谢谢!http://www.up-tech.com

threewater@up-tech.com

2004.5.23

top related