分享

ucos在f120上移植

 欧阳小昭 2011-03-20

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)
任务堆栈初始化函数的改写
   
任务堆栈空间由高至低依次将保存着PSWACCBDPLDPH等寄存器。为了使任务的调度一致,初始状态的堆栈实际上是模拟了一次中断发生后的堆栈结构,以便在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);//
任务调度
}
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多