分类: LINUX
2008-11-08 16:59:03
u-boot的外挂应用可以 使用u-boot内部的一些函数,如:str类,mem类,print类,注册中断等等,只要u-boot有的都可以引出来使用。
它的实现原理是:
在u-boot里面将要引出的函数都要在跳转表里注册,这个跳转表放在一个结构体中,而这个结构体或者被一个全局指针引用着(i386,寄存器少),或者放在一
例如:在arm体系结构下
asm-arm目录下有这样的声名
#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8")
它的意思是,声名全局指针gd,放在r8中
在arm特定的cpu目录下的config.mk中,也有
PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8
这是表示编译是R8被固定了,不能随便使用,使用也要保护好
2。frame pointer
它是编译器使用的一个寄存器,在arm中是R11,也可称为argument
pointer。它主要是为了方便引用函数内部的自动变量而设计的。如果要在一个属性为naked的函数中使用自动变量,应该考虑如何手工设置这个寄存器,可以
3。arm的几种模式
arm由6中模式,这个要格外注意。每种模式有自己独立的sp和lr。因此在一种特权模式保存和恢复用户模式的全部寄存器时可以充分利用这两个寄存器,因为他们
4。LDM和STM指令
在特权模式保存和恢复用户模式中的寄存器时要用这两个指令,含义即POP和PUSH。但
LDMFD LR! {LR}^
这条指令就有点问题,当使用^标记时最好不要用!,就算要用最应注意左边的寄存器不能在右边的列表中
5。u-boot的arm port 在standalone application中的bug
它在irq处理的最开始保存用户模式寄存器时使用了r8,使得在产生中断后不能使用u-boot中的函数了,因为r8--既保存的跳转表所在结构体的地址被改变
6。freertos的atmel sam7的移植修改到u-boot中
因为u-boot已经作了进入中断和异常(自己加的)时保存用户模式寄存器,退出时恢复用户模式寄存器。因此在freertos中进入中断或异常需要保存和恢复
7。在进入特权模式之后,中断被自动关闭。(在s3c2410中是这样的)
8。使freertos可以返回
在进入第一个时不使用恢复环境的宏直接恢复任务环境,而是也用swi,只不过稍微改变一下,使他将u-boot环境保存在u-boot最初的栈中,他freer
9。一些小错误
pxCurrentTCB的值不是任务的堆栈地址,*pxCurrentTCB保存的才是