📄 注意事项.txt
字号:
注意事项;
请注意一下;
1. 需要设置最大任务个数OS_MAX_TASKS > 你建立的任务个数。
2. 每个任务的优先级不能相等,并且其数值必须 < OS_MAX_TASKS 。
3. main()也是一个任务,在OS_CFG.H文件里默认设置为0,也可以修改。
4. OS内核定义了一个任务控制块数组OSTCB[OS_MAX_TASKS],它用于控制任务的运行。为了简洁处理,我
把任务优先级的值直接当作该数组的下标使用,所以任务优先级的值必须 < 最大任务个数OS_MAX_TASKS。
/*****************************************/
再解释一下任务控制块;
minOS内核定义了一个任务控制块数组OSTCB[OS_MAX_TASKS],它用于控制任务的运行。为了简洁处理,我把任务优先级的值直接当作该数组的下标使用,所以任务优先级的值必须 < 最大任务个数OS_MAX_TASKS。
例如,如果建立要两个任务,再加上main()任务总共就是3个任务。可以设置最大任务个数OS_MAX_TASKS为3 ,三个任务的优先级可以设置为0,1,2
当然也可以设置OS_MAX_TASKS为5 ,三个任务的优先级可以设置为0,2,4 ,这时候就会有两个任务控制块空闲,浪费存储器。
请大家多提意见啊
Arm_Base和hiberhe也帮我测试一下吧。
smartbird 发表于 2004-7-29 08:43 侃单片机 ←返回版面
怎么跑不起来
我用lm7556的minos添加了两个任务,好像只有一个能运行下面是我的程序。
只建立其中的一个任务运行很正常,但是建立两个任务时就只有一个能运行。
void TaskA(void);
#define TaskAPrio 1
unsigned char idata TaskAStk[MAX_STK_SIZE];
void TaskB(void);
#define TaskBPrio 2
unsigned char idata TaskBStk[MAX_STK_SIZE];
void main(void)
{
inte_init(); //初始化
OSInit();
OSTaskCreate(TaskA,TaskAStk,TaskAPrio);
OSTaskCreate(TaskB,TaskBStk,TaskBPrio);
OSStart();
while (1)
{
LED1=LED_ON;
OSTimeDly(50);
LED1=LED_OFF;
OSTimeDly(50);
}
}
void TaskA(void) //任务1
{
while (1)
{
LED2=LED_OFF;
dly1();dly1();dly1();dly1();dly1();//延时
dly();dly1();dly1();dly1();dly1();
LED2=LED_ON;
dly1();dly1();dly1();dly1();dly1();
dly1();dly1();dly1();dly1();dly1();
}
}
void TaskB(void) //任务2
{
INTE_DATA[0]='A';
INTE_DATA[1]='B';
INTE_DATA[2]='C';
INTE_DATA[3]='D';
inte_send(4); //串行发送
}
lm7556 发表于 2004-7-29 09:05 侃单片机 ←返回版面
to smartbird,是非剥夺型占先式OS
每个任务要主动放弃CPU使用权,其它最高优先级的任务才能执行。
你的任务TaskA里的延时不应该用dly1(),要用OSTimeDly(Tdl);由OS做延时,在延时过程中任务TaskA不占用CPU使用权。
任务TaskB(void)在做完inte_send(4)后,也应该做延时或等待消息。
再试试吧,用OS需要任务之间的同步或协调。多谢。
to smartbird,当一个任务放弃CPU使用权后
OS就把CPU使用权转到准备就绪的任务中优先级最高的任务
smartbird 发表于 2004-7-29 11:58 侃单片机 ←返回版面
再问lm7556
任务A这样写:
void TaskA(void)
{
while (1)
{
LED2=LED_ON;
OSTimeDly(50);
LED2=LED_OFF;
OSTimeDly(50);
}
}
同下面这个有区别吗?
void TaskA(void)
{
LED2=LED_ON;
OSTimeDly(50);
LED2=LED_OFF;
OSTimeDly(50);
}
lm7556 发表于 2004-7-29 14:33 侃单片机 ←返回版面
to smartbird,通常,任务是一个无限循环
如果任务执行一次就退出,就要把该任务删除。我现在做的这个minOS版本还没有做任务删除,所以任务必须是无限循环。
往后,我就准备要增加任务删除功能,还有信号量,邮箱等其它一些功能,
对于非剥夺型占先式OS,如果优先级高的任务不放弃CPU使用权的话,其它任务就无法执行。
通常,一个任务不会一直都需要运行,其实大部分时候任务都可能处于等待状态,比如等待一个消息,等待一段时间。
当任务处于等待状态时就应该放弃CPU使用权,把CPU交给其它任务。
例如,可以调用OSTimeDly()把任务延时一段时间,在延时的这段时间,该任务就处于
等待状态,当延时时间到后,该任务又继续运行。也可以调用OSSuspend()把任务挂起,当需要的时候可以由其它任务
启动另一个挂起的任务,也可以又中断启动一个挂起的任务。
例如,建立一个打印输出任务tDataPrint(),需要打印的
通常,可以把一个程序分成几个任务,每个任务完成特定的功能。比如,除了main()任务外,可以有;
键盘输入tKeyScan(),
显示tLCDDisplay(),
数据采集tDataCollect(),
数据处理tDataProcess(),
数据打印tDataPrint(),
等。
main()任务负责几个任务的启动,同步和协调。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -