关于Small RTOS51的 OSWAIT()函数的疑问【恢复】
void Show(void){
uint8 i;
/* 初始化显示缓冲区 */
ShowCase = ShowTable;
ShowCase = ShowTable;
ShowCase = ShowTable;
ShowCase = ShowTable;
ShowCase = ShowTable;
while (1)
{
for (i = 0; i < 5; i++)
{
P1 = 0xff; /* 关闭显示第i位 */
KdTxdByte(ShowCase);
P1 = EbitData; /* 显示第i位 */
OSWait(K_SIG,0); /* 等待1/600秒(由定时器中断决定) */
}
OSWait(K_SIG,0); /* 等待1/600秒(由定时器中断决定) */
OSTimeTick(); /* 调用系统节拍处理程序 */
}
}
/*上面是关于陈明计先生的LED显示的SHOW程序*/
********************************************************************************************************/
void TimeSum(void)
{
while (1)
{
/* 让两个发光二极管闪动 */
ShowCase = ~0xc0;
OSWait(K_TMO,OS_TICKS_PER_SEC / 2);
ShowCase = ~0x00;
OSWait(K_TMO,(OS_TICKS_PER_SEC + 1) / 2);
/* 计时并显示 */
TimeAdd++;
if (TimeAdd>= 10)
{
TimeAdd = 0;
TimeAdd++;
if (TimeAdd>= 6)
{
TimeAdd = 0;
TimeAdd++;
if (TimeAdd>= 10)
{
TimeAdd = 0;
TimeAdd++;
if(TimeAdd>= 10)
{
TimeAdd = 0;
}
}
}
}
ShowCase = ShowTable];
ShowCase = ShowTable];
ShowCase = ShowTable];
ShowCase = ShowTable];
}
}
/**********************end****************************************/
/*上面是关于陈明计先生的LED显示的TIME_SUM程序*/
那个LED 显示程序就是这两个
对于show程序的OSWAIT()函数采用 OSWait(K_SIG,0),而这个 OSWait(K_SIG,0)是一直等待信息的或者说是挂起任务
我有点不明白,为什么一定要用OSWait(K_SIG,0)而不用OSWait(K_TMO,N) 难道该程序真的有信息通知到这个show任务吗
明明是只有两个函数啊 他们是怎样达到互相通知的关系啊 有点不明白
希望大侠们指点指点....小弟刚学os呢
LED程序ourdev_428154.rar(文件大小:18K) (原文件名:LED.rar)</
<font color=#699BCD>
本贴被 125008301 编辑过,最后修改时间:2008-09-23,21:51:16. 谢谢啊 我理解了很多呢 对于show程序的OSWAIT()函数采用 OSWait(K_SIG,0),而这个 OSWait(K_SIG,0)是一直等待信息的或者说是挂起任务
我有点不明白,为什么一定要用OSWait(K_SIG,0)而不用OSWait(K_TMO,N) 难道该程序真的有信息通知到这个show任务吗
由节拍定时中断发送信号到show任务,show任务分频调用OSTimeTick()得到系统节拍。
也就是说show任务执行的频率是系统节拍的N倍,
系统节拍是由show任务N分频得到的。
本贴被 ATmega32 编辑过,最后修改时间:2008-09-25,19:47:19. 用TINY51是稳定,可你的命也掐在人家手里了.small是开源的,吃透了之后想怎么改就怎么改.最重要的是在51这种片子上,通用操作系统的应用范围太有限了,要做高速控制通常得自已写OS,那就必须先研究透别人的OS.
本贴被 rainyss 编辑过,最后修改时间:2008-09-24,14:15:41. 弄错了,原来以为RTOS_TNY呢,不过Small不如KC的RTOS好用,原来我用过一段时间,不是很稳定;
另外延时时间最大是255个系统周期,大了就只取低位,相当于取除以256的余数
本贴被 mcu5i51 编辑过,最后修改时间:2008-09-24,12:37:15. #include "config.h"
/*
void delay_t(unsigned int time)
{
while(time>0)time--;
}
*/
void init(void)
{
P1=0x00;
TCON=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
}
void TaskA(void)
{
while(1)
{
P1=0xff;
OSWait(K_TMO,OS_TICKS_PER_SEC / 2);
P1=0x00;
OSWait(K_TMO,(OS_TICKS_PER_SEC+1) / 2);
// OSClearSignal(0);
// OSSendSignal(1);
}
}
/*
void TaskB(void)
{
while(1)
{
P1=0x00;
OSWait(K_TMO,OS_TICKS_PER_SEC / 2);
OSClearSignal(1);
OSSendSignal(0);
}
} */
void main(void)
{
init();
OSStart();
}
这个程序应该是每隔0.5s闪烁一次吧 可惜不是啊 闪烁的非常快啊 到底哪里出错啊 我现在退回只有一个任务呢 不搞那个任务切换
就是要单个任务出现0.5闪烁一次的闪烁灯啊 可惜还是不稳定啊 OSWait()等待信号时可以用0,其实后面的参数是用于等待时间信号的的时间数 昨晚我也想过 应该是这个是时间中断的问题
/*这个是用自己仿真的程序 不是陈明计的学习板的*/
#include "config.h"
void delay_t(unsigned int time)
{
while(time!=0)time--;
}
void init(void)
{
P1=0x00;
TCON=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
}
void TaskA(void)
{
while(1)
{
//delay_t(500);
P1=0Xff;
delay_t(500);
OSWait(K_SIG,0);
//P1=0X00;
//delay_t(500);
//OSWait(K_SIG,OS_TICKS_PER_SEC+1);
}
}
void TaskB(void)
{
while(1)
{
//P1=0Xff;
//OSWait(K_TMO,OS_TICKS_PER_SEC/2);
//delay_t(500);
P1=0X00;
delay_t(500);
OSWait(K_SIG,0);
}
}
void main(void)
{
init();
OSStart();
}
出现的问题是 1:亮的时间总比灭的时间多,而且灭的时候只是一瞬间的
2:如果delay()函数里的数去到比较大的时候例如1000以上 出现不亮的情况啊 为什么呢
3:OSWait(K_TMO,OS_TICKS_PER_SEC/2); OSWait(K_TMO,(OS_TICKS_PER_SEC+1)/2);进行每隔0.5秒延时
又好像达不到0.5s的效果 很快地闪烁
“等待1/600秒(由定时器中断决定)”,看到这个了吗?说明定时中断里发了信号量,去找找定时中断的服务函数 MARK
页:
[1]