Chinaunix首页 | 论坛 | 博客
  • 博客访问: 739071
  • 博文数量: 124
  • 博客积分: 3156
  • 博客等级: 中校
  • 技术积分: 1584
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-02 10:29
文章分类

全部博文(124)

文章存档

2012年(3)

2011年(2)

2010年(61)

2009年(34)

2008年(24)

我的朋友

分类: LINUX

2008-11-08 16:59:03

1. u-boot stand alone application

u-boot的外挂应用可以 使用u-boot内部的一些函数,如:str类,mem类,print类,注册中断等等,只要u-boot有的都可以引出来使用。

它的实现原理是:

在u-boot里面将要引出的函数都要在跳转表里注册,这个跳转表放在一个结构体中,而这个结构体或者被一个全局指针引用着(i386,寄存器少),或者放在一个寄存器中(RISC)。另外,在调用外挂应用时,可将变量或寄存器传过去(寄存器不用传了),应用再根据要调用的函数查找真正的函数地址,这里面使用的枚举,而且非常巧妙。

例如:在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中进入中断或异常需要保存和恢复寄存器的时候就不能像原来那样做了,需要将u-boot保存好的再放到用户栈中就可以了。还有freertos对每个任务创建的初始环境不能对r8设置一个任意的值,因该使用其原始值,r8的值是不能改变的。freertos任务的主动yield使用了swi,这是为了和irq中的yield保持一致。

7。在进入特权模式之后,中断被自动关闭。(在s3c2410中是这样的)

8。使freertos可以返回

在进入第一个时不使用恢复环境的宏直接恢复任务环境,而是也用swi,只不过稍微改变一下,使他将u-boot环境保存在u-boot最初的栈中,他freertos返回时,在从这里恢复就可以了。但是由于u-boot一开始将自己设为了supervisor态,与进入swi后的状态一样,所以进入swi后u-boot保存在堆栈中的用户模式的值中sp,lr就不对了,因此我这里将u-boot的初始模式设置为system模式。

9。一些小错误

pxCurrentTCB的值不是任务的堆栈地址,*pxCurrentTCB保存的才是

memcpy是按char类型复制的,而且是从下往上复制,另外它的参数第一个是destination,第二个是source。
阅读(1490) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~