|
楼主 |
发表于 2006-8-24 16:23:09
|
显示全部楼层
libcpu目录下实现文件详述
libcpu目录详细描述
libcpu目录下是各个具体芯片相关的实现,但其分类首先是按照体系结构来分类的,例如arm,ia32等等,再下面才是具体的芯片描述,如ARM7TDMI中的s3c4510,m68k中的coldfire系列芯片等。
在一些体系结构目录下,会存在一个common目录,存放本体系结构的一些公共信息。例如对于ARM体系结构,common目录中包含了
div0.c divsi3.S,这些是针对ARM体系结构实现的乘除法,否则核心将不得不链接libgcc.a库。
对于具体的芯片,以下以s3c4510芯片为例来描述,s3c4510包含了一个ARM7TDMI核心,也有其他各类的外设,例如串口,网口等等,它被归类到ARM体系结构下,具体实现分为:
context.S,上下文切换相关代码,主要是
rt_hw_interrupt_disable, rt_hw_interrupt_enable中断使能函数;
rt_hw_context_switch,保存当前上下文到任务栈中,恢复切换过去任务的上下文
rt_hw_context_switch_interrupt,中断状态中上下文的切换,主要是设置了一个切换标志rt_thread_switch_interrput_flag。
cpu.c,和CPU相关的一些实现,例如cache,reset等,这个和操作系统整体相关性并不大
interrupt.c,系统中断相关功能,必须实现的函数
rt_hw_interrupt_mask/rt_hw_interrupt_unmask,屏蔽或去屏蔽某个中断
rt_hw_interrupt_install,装载某个中断服务例程
同时这个文件中也包含了缺省的中断服务处理,rt_hw_interrupt_handle
中断控制器初始化在函数rt_hw_interrupt_init中进行
s3c4510.h,和s3c4510芯片密切相关的数据定义
serial.c,实现打印输出,主要是
rt_serial_init, 进行串口的初始化操作,例如波特率,停止位等
rt_console_puts, (使用rt_serial_putc)向串口输出一个字符,这个函数会被rt_kprintf调用,同时这个函数调用应不会引起中断(例如串口数据发送完成中断),因为rt_kprintf是被设计成可以在中断服务例程中使用的。
rt_serial_putc, 向串口输出一个字符
rt_serial_getc, 从串口中读入一个字符
stack.c,任务栈的初始化
函数rt_hw_stack_init,在初始化一个线程时这个函数将被调用用来设置线程栈的初始状态,入口,参数等。和线程是密切相关的。
start.S,系统启动代码,完成系统初始启动时的一些设置,例如各个模式栈的配置,装载上中断向量等,这部分将专门讲述。
trap.c,针对ARM特有的几个异常处理,例如Undef,SWI,PABT及DABT等等.
libcpu建议移植步骤:(假设针对AT91SAM7S系列芯片)
- 基本的芯片数据定义头文件,AT91SAM7S.h
- 启动文件start.S,ARM7TDMI的异常入口设置,初始化系统,关闭所有中断、定时器,各个模式的栈配置,跳转进入C代码rtthread_startup
- trap.c,各个异常入口,可以在原来s3c4510文件的基础上修改
- serial.c,串口初始化
- context.S/stack.c,上下文切换及线程栈初始化,因为同是ARM7TDMI结构,可以直接使用原来s3c4510文件
- cpu.c,根据芯片情况实现,对于AT91SAM7S,cache相关的函数不需要实现
- interrupt.c,中断管理
[/list ]
|
|