关于Samll rtos(51)使用在STC单片机上
本帖最后由 wydking 于 2012-5-15 15:48 编辑关于Samll rtos(51)使用在STC单片机上,消息对列定义在xdata里,使用OSQPend函数时在P0口P2口为高电平的IO口上有干扰脉冲输出的问题。
脉冲的产生定位在下面这段代码中
/* 把任务加入等待任务队列 */
#if OS_MAX_TASKS < 9
s1=0;//使用示波器观察时做同步信号用
Buf |= OSMapTbl;
s1=1;
#else
汇编后的代码
S1=0;
C:0x013E C2C3 CLR s1(0xC0.3)
146: Buf |= OSMapTbl;
C:0x0140 8D82 MOV DPL(0x82),R5
C:0x0142 8C83 MOV DPH(0x83),R4
C:0x0144 A3 INC DPTR
C:0x0145 A3 INC DPTR
C:0x0146 A3 INC DPTR
C:0x0147 C083 PUSH DPH(0x83)
C:0x0149 C082 PUSH DPL(0x82)
C:0x014B E0 MOVX A,@DPTR
C:0x014C FF MOV R7,A
C:0x014D E524 MOV A,OSTaskID(0x24)
C:0x014F 900B16 MOV DPTR,#OSMapTbl(0x0B16)
C:0x0152 93 MOVC A,@A+DPTR
C:0x0153 FE MOV R6,A
C:0x0154 EF MOV A,R7
C:0x0155 4E ORL A,R6
C:0x0156 D082 POP DPL(0x82)
C:0x0158 D083 POP DPH(0x83)
C:0x015A F0 MOVX @DPTR,A
S1=1;
C:0x015B D2C3 SETB s1(0xC0.3)
(编译的结果Program Size: data=52.1 xdata=416 code=2842
creating hex file from "..\output\LO"...
"..\output\LO" - 0 Error(s), 0 Warning(s).)
图片中的黄线是s1同步信号,蓝线是P2^5输出的干扰信号。说明干扰脉冲是在s1为低电平期间输出的。具体是那条指令输出的脉冲在C语言里就不太好跟踪了。
根据STC的指令表查到MOVX @DPTR A 指令需要7个周期。时钟用11.0592MHz,7个周期为7 * (1/11.0592)us=0.6329us。看下图两个标线的之间的时间差不多就是7个周期的时间。所以判断是在MOVX @DPTR A这条指令产生的干扰(PC值不要看,这里是用AT89S51的器件模拟KEIL编译的)。在Xdata只有416个小于1k时是片内的(AUXR=0x15; //波特率1T计数 ),不用总线的。怎么会有脉冲呢
试将程序改为
uchardata temp
……
/* 把任务加入等待任务队列 */
#if OS_MAX_TASKS < 9
s1=0;
temp=OSMapTbl;
Buf |=temp;
s1=1;
#else
汇编后的代码
145: s1=0;
C:0x013E C2C3 CLR s1(0xC0.3)
146: temp=OSMapTbl;
C:0x0140 E524 MOV A,OSTaskID(0x24)
C:0x0142 900B08 MOV DPTR,#OSMapTbl(0x0B08)
C:0x0145 93 MOVC A,@A+DPTR
C:0x0146 FF MOV R7,A
147: Buf |=temp;
C:0x0147 8D82 MOV DPL(0x82),R5
C:0x0149 8C83 MOV DPH(0x83),R4
C:0x014B A3 INC DPTR
C:0x014C A3 INC DPTR
C:0x014D A3 INC DPTR
C:0x014E E0 MOVX A,@DPTR
C:0x014F 4F ORL A,R7
C:0x0150 F0 MOVX @DPTR,A
148: s1=1;
C:0x0151 D2C3 SETB s1(0xC0.3)
没有用到入栈和出栈。就没有干扰脉冲输出。
页:
[1]