📄 readme
字号:
该部分文档描述Bycore在ARM7TDIMI核上的移植步骤。1.初始化上下文空间 将Bycore移植到某个特定的处理器架构上时,第一步是要初始化上下文空间,Bycore将上下文空间放到任务栈的上端,也即上下文空间与栈空间连续,如下图所示,注意图中地址是从高到低的(当然也可以是由低到高)。tcb_t的context域指向任务的上下文空间,context的下一个区域开始就是任务的栈空间。要完成初始化上下文空间,您只需要在word_t *init_context(word_t *pstk)中完成这个操作,pstk指向的地址是图中lr的地址,为什么不是pc呢?那是因为pc在init_context之前就已经被初始化了,所以您需要做的是初始化除pc域以外的域。在ARM7TDIMI上,r13是非常特别的寄存器,它指向任务的栈空间,因此在init_context还必须让r13保存栈的地址,在ARM7TDMI中如果栈的增长方式是FD(满减方式),那么r13保存的地址实际上也是context指向的地址。除此之外,cpsr和spsr也需要初始化为sys态,其他的上下文寄存器可以初始化为0。这段代码可以在cpu_c.c中找到。 --------(tcb_t)context -----> | pc | (High Address) -------- | lr | -------- | r13 | --->指向spsr的地址 -------- | r12 | -------- | r11 | -------- | ... | -------- | r0 | -------- | cpsr | -------- | spsr | -------- | | | ... | | ... |2. 启动任务 有了上面的准备,启动新任务就非常好办了。您所需要做的是重写TaskStart(),这个函数一般是汇编写的,它需要做的事情如下:当一个任务需要启动时,主要步骤就是将上图中的上下文空间的值依次赋给ARM7TDMI的寄存器。这些步骤可以在cpu_a.s文件中找到,细节可参考TaskStart函数的代码。在写这个函数的时候,最后的两个步骤一定是恢复CPSR和PC,请牢记这一点!3.正常情况下的任务切换 这种情况是系统运行在正常状态下,由应用程序发生的任务切换。比如一个应用程序调用休眠函数时,Bycore在这个时候进行任务切换。这种情况下,Bycore会利用ARM的swi指令将系统态转换成svc状态,当系统进入svc状态后,被换出任务的大部分上下文都可以在svc状态下找到,只有SPSR和LR寄存器的值需要在系统态下找到。 在svc状态下,SPSR保存的值就是被换出任务的运行态的CPSR,LR保存的值是被换出任务的运行态的PC值,R0~R12中值都没有被改变,它们也是被换出任务的上下文。被换出任务的SPSR和LR的值还需要切换到系统态才能找到。这些所有的上下文都应该被保存下来,保存的区域就是上图中context指向的地址往上的空间。 这些步骤可以参考cpu_a.s文件中的TaskSwitch函数的代码。您如果想将Bycore移植到其他处理器也需要重写TaskSwitch函数。4.中断态下的任务切换 在这种状态下切换任务相对来说比较有难度一些。其实在中断态下面,需要理解的主要是中断态下面,Bycore会运行一段程序,当运行到具体任务切换的时候,这个时候需要知道被切换的任务的上下文怎样得到?解决了这个问题就好办了。下面有两个图,这两个图将告知我们哪些东西是被切换任务的上下文。 --------- --------- R14(LR) R14(LR) -------- -------- R12 R12 -------- -------- R3 R3 -------- -------- R2 R2 -------- -------- R1 R1 -------- -------- R0 R0 -------- -------- r14(lr) (b) 在O2优化情况下,中断态下栈空间存放的上下文 -------- R5 -------- R4 -------- r3 -------- (a)在O0优化情况下,中断态下栈空间存放的上下文 在上面的两个图中描述了中断态下,不同编译优化选项所产生的不同情形。在(a)图中,大写的部分是被切换任务的上下文,小写的部分可以丢弃。(b)图中,所有的部分都是被切换任务的上下文。在当前的代码实现中只是实现了(b)图的情况。有了上面的两幅图,就能写出在中断下任务的切换函数了,这个功能由TaskIntSw实现,该函数功能是将中断态下栈中保存的上下文保存到当前任务上下文空间中去。TaskIntSw的代码在cpu_a.s中能够找到。5. TaskIntStart和TaskContinue 这两个函数的主要功能分别是在中断态下开始一个新任务,其实在Bycore中目前还想象不到它被调用的情况,可以让它空着。第二个是中断以后,但是没有进行任务切换,当前任务还得继续运行,TaskContinue的实现也在cpu_a.s文件中。 在上述的描述中,还需要知道pcurtcb和pnewtcb两个全局指针,第一个就指向当前任务的上下文空间,pnewtcb指向新任务的上下文空间。综上所述,将Bycore移植到一个特定处理器,您需要重写上面提到的几个函数。 当然,除了这些工作外,Bycore要运行在实际的板子上运行,还有其他工作要做的。这些工作实际就是重写Bycore留出了的接口,这些接口可以在arch文件夹下面找到。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -