⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 注意事项.txt

📁 非剥夺型占先式minOS for Keil C51
💻 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 + -