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);//任务调度 } }
|