微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > uCOS-Ⅱ C51移植笔记

uCOS-Ⅱ C51移植笔记

时间:11-23 来源:互联网 点击:

字的重定义

OS_CFG.H: “OS_TICKS_PER_SEC”、“ OS_FLAGS”注意可能需要修改。

C、与处理器相关的文件:

OS_CPU.H: 数据类型、关中断方法、任务堆栈方向、任务切换的宏定义都需要修改。

OS_CPU_A.ASM: OSTickISR()、OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()这几个函数的编写,是整个移植的关键。

OS_CPU_C.C:OSTaskStkInit()函数的编写。

(4)uCOS C51具体的移植过程;

1、C51的堆栈结构;

这是整个移植过程中的重中之重,所以特别详细介绍。

A、 系统堆栈;

c51中,系统堆栈的栈底地址是“?STACK”,栈顶指针就是“SP”拉,栈的生长方向是向上的,栈空间分配在51的内部RAM(idata)中。“?STACK”分配在所有内部RAM数据段的最后面,所以系统堆栈的范围是从?STACK到内部RAM的最高位(0x80或者0xFF)。

B、 数据堆栈;

c51中,由于我们使用OS,采用的LARGE编译模式,所以数据堆栈的指针是“?C_XBP”,栈的生长方向是向下的,栈空间分配在51的外部RAM(xdata)中。

C、 C51中断中堆栈的保护;

研究中断中堆栈的保护的意义在于,因为uCOS中的任务切换,本身就是模拟一次中断的发生:保护Task1的CPU寄存器,SP切换到Task2的堆栈,弹出Task2的CPU寄存器。用C51写中断函数的时候,编译器会自动保护CPU的寄存器,所以中断返回时任务调度OSIntCtxSw(),就不用重新保护寄存器。

C51中断中调用函数可以分为四种情况(中断函数本身不设为reentrant):

一、没有函数调用;

二、调用非reentrant函数,函数中没有嵌套调用其他函数;

三、调用非reentrant函数,函数中嵌套调用其他函数;

四、调用reentrant函数。

t0_isr:

PUSH ACC

PUSH B

PUSH DPH

PUSH DPL

PUSH PSW

MOV PSW,#00H

PUSH AR0

PUSH AR1

PUSH AR2

PUSH AR3

PUSH AR4

PUSH AR5

PUSH AR6

PUSH AR7

用户代码

POP AR7

POP AR6

POP AR5

POP AR4

POP AR3

POP AR2

POP AR1

POP AR0

POP PSW

POP DPL

POP DPH

POP B

POP ACC

RETI

因为uCOS中所有的函数都必须是重入函数,因此我们只需要研究第四种情况下的堆栈保护,对于其他情况有兴趣可以在c51中看看。(注意:可能因为c51编译器的版本不同,上述压栈的顺序可能不同。)

2、uCOS C51任务切换时的堆栈操作;

每个任务都有一个独立的数据堆栈,系统堆栈是公用空间。

保护Task1的CPU寄存器:首先将CPU寄存器按上例压进Task1系统堆栈,再将整个Task1系统堆栈压进Task1数据堆栈;

SP切换:?C_XBP = Task2 的数据堆栈栈顶地址。

弹出Task2的CPU寄存器:从Task2的数据堆栈重新恢复整个系统堆栈,然后再从Task2系统堆栈中恢复CPU寄存器值。

实现的方法有很多种,只要遵循uCOS任务切换的原理就可以了。

3、INCLUDES.H的移植;

4、OS_CPU.H的移植;

5、OS_CPU_A.ASM的移植;

6、OS_CPU_C.C的移植;

7、其他的移植;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top