嵌入式的移植
移植与4 个文件相关,汇编文件OS_CPU_A.ASM;处理器相关C文件OS_CPU.H;OS_CPU_C.C 和配置文件OS_CFG.H。 (1)拷贝系统源程序 (2)改写OS_CPU.H
数据类型的设定。BOOLEAN要定义成unsigned char 类型。 EA=0关中断;EA=1开中断。
MCS-51堆栈从下往上增长(1=向下,0=向上),OS_STK_GROWTH定义为0 #define OS_TASK_SW() OSCtxSw() (3)改写OS_CPU_C.C
TCB结构体中OSTCBStkPtr总是指向用户堆栈最低地址,该地址空间内存放用户堆栈长度,其上空间存放系统堆栈映像。
OSTaskStkInit函数总是返回用户栈最低地址。
操作系统tick时钟使用51单片机的T0定时器,它的初始化代码用C写在了本文件中。 (4)重写OS_CPU_A.ASM
sbit LS138B=P3^1; 定义宏
sbit LS138C=P3^4; 宏名 MACRO 实体 ENDM
子程序 xdata unsigned char temp[8]; //存储显示值的OSStartHighRdy 全局变量 OSCtxSw unsigned char s,m,h; OSIntCtxSw unsigned char code OSTickISR DuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x9SerialISR 2,0x82,0xf8,0x80,0x90};// 显示段码值0~9
OS_STK xdata END ;声明汇编源文件结束
Task1Stack[CPU_MAX_STK_SIZE];
void Task1(void xdata * ppdata) reentrant //初始化定时器0
void InitTimer0(void) reentrant { { unsigned char i; TMOD=TMOD&0xF0; static unsigned char tt;
unsigned int l,n; TMOD=TMOD|0x01; //模式1(16位定时器),
unsigned int k=0; 仅受TR0控制
ppdata=ppdata; TH0=0x70; //定义Tick=50次/秒(即0.02秒/
s=0; 次)
m=0; TL0=0x00; //OS_CPU_A.ASM 和
OS_TICKS_PER_SEC h=0;
bee=0; ET0=1; //允许T0中断
TR0=1; while(1) } { 文件名:ex1.c //位数分离
temp[7]=DuanMa[s]; //程序实现功能:用数码管按时钟计数
#include \ temp[6]=DuanMa[s/10];
sbit LS138A=P3^0; //38译码器的三个
temp[5]=0xBF; 输入端
temp[4]=DuanMa[m]; temp[3]=DuanMa[m/10]; temp[2]=0xBF; temp[1]=DuanMa[h]; temp[0]=DuanMa[h/10]; tt++;//计数寄存 if(tt==50)//计数到一秒 { tt=0; s++;//秒加一 if(s==60) { s=0; m++;//分加一 if(m==60) { m=0; h++;//时加一 if(h==24) h=0; } } tt=0; }
//显示模块,循环八次扫描数码管 for( i=0; i<8; i++) { P1 = 0Xff; //消影 switch(i) { case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138B=0;
LS138C=1; break;
case 5:LS138A=1; LS138B=0; LS138C=1; break; case 6:LS138A=0; LS138B=1; LS138C=1; break; case 7:LS138A=1; LS138B=1; LS138C=1; break; } P1 =temp[i]; OSTimeDlyHMSM(0, 0, 0,20); } } }
void InterruptInitial()//初始化时钟节拍 { /* set timer. 50ms, THTL = 3caf when cpu at 12MHz */ TMOD |= 0x01; TH0 = 0x70; TL0 = 0x00; /* TR0 is set in OSStart() */ ET0 = 1; }
void main()//主函数 { InterruptInitial(); TMOD|=0x10; ET1=1; OSInit();
OSTaskCreate(Task1, (void xdata *)0, &Task1Stack[0],2); OSStart(); }