街机游戏带金手指:ucos在f120上移植

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 20:04:37

3.1 OS_CPU.H文件的修改
(1)C8051F120是一种内核为51的单片机,其增长堆栈方向从低地址到高地址,故其堆栈增长方向应定义为1,即
#define OS_STK_ GROWTH 1
(2)定义相关宏。C8051F120有直接开关中断的指令,对临界区的设定直接定义如下:
#define OS_ENTER_CRITICAL EA =0
#define OS_EXIT_CRITICAL EA =1
任务切换宏封装了对任务切换函数OSCtxSw()的调用,定义如下:
#define OS_TASK_SW OSCtxSw()
(3)数据类型的定义。根据C8051F120芯片特点来定义数据类型和数据长度,其定义与常用51内核单片机相同。

3.2 OS_CPU.C文件的修改
(1)添加系统时钟初始化程序
    C8051F120采用TIMER0作为系统时钟中断源,其代码为可重入函数:
void InitTimer0(void) reentrant
{SFRPAGE =0x00;//切换寄存器页
TMOD =TMOD&0xF0;
TMOD=TMOD | 0x01;//模式1(16位定时器),仅受TR0控制
TH0=0x70; //定义Tick=50次/秒(即0.02秒/次)
TL0=0x00;
ET0=1;//允许T0中断
TR0=1;
}
(2)任务堆栈初始化函数的改写
    任务堆栈空间由高至低依次将保存着PSW,ACC,B,DPL,DPH等寄存器。为了使任务的调度一致,初始状态的堆栈实际上是模拟了一次中断发生后的堆栈结构,以便在OSSched()进行任务调度时,从堆栈中恢复刚开始运行时的处理器现场。当前任务堆栈初始化完成后,OSTaskStklnit返回新的堆栈指针stk,在OSTaskCreate()执行时将调用OS_TaskStkInit的初始化过程,然后再通过调用OSTCBInit()将返回的sp指针保存到该任务的TCB块中。

3.3  OS_CPU.ASM文件的修改
    OS_CPU.ASM文件是用汇编语言编写的模块,包括大量对处理器寄存器的读写操作,其中主要由4个汇编语言函数:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()组成,每一个函数都需要用PUBLIC声明为可以被外部模块调用。
    uCOS II任务的切换,系统寄存器需要频繁完成进栈和出栈操作,为了减少代码编写工作量,在OS_CPU.ASM中根据芯片特点将寄存器的进栈出栈操作定义为宏。

3.4 数据采集任务的实现(自己功能的实现)
    为了提高数据采集实时性和可靠性,对每个模拟量数据,uCOS II采用单独的任务来实现。下面给出温度和压力数据采集的实现程序。温度数据采集任务程序:
void Task1(void *pada)
{
mux_select = MUX_CPU_TEMP;//温度数据测量
StartCollect();
For(;;)
{read_TEMP_inputs();//数据读入,标度转换
temp_long=ADC0 - 42380/2;
temp_long= (temp_long* 200L)/156;
cpu_temperature=temp_long;
……
OSTimeDly(OS_TICKS_PER_SEC);//任务调度
}
}
压力数据采集任务程序:
void Task2(void *pada)
{
mux_select = MUX_CPU_PRESS;//温度数据测量
StartCollect();// start the collecting
For(;;)
{read_Press_inputs();
press_long= ADC0;
press_long= temp_ long;
……
OSTimeDly(OS_TICKS_PER_SEC);//任务调度
}
}