金牌会员
- 积分
- 1183
- 金钱
- 1183
- 注册时间
- 2013-4-3
- 在线时间
- 221 小时
|
5金钱
int main(void)
{
delay_init(); //???±??????
NVIC_Configuration(); //?è??NVIC????·?×é2:2??????????????2???ì????????
LED_Init(); //????????LED??????????????
OSInit();
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//???¨????????
OSStart();
}
//????????
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata = pdata;
OSStatInit(); //??????????????.?????á???±1????×ó??
OS_ENTER_CRITICAL(); //??????????(??·¨±??????ò??)
OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);
OSTaskCreate(led2_task,(void *)0,(OS_STK*)&LED2_TASK_STK[LED2_STK_SIZE-1],LED2_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO); //????????????.
OS_EXIT_CRITICAL(); //??????????(????±??????ò??)
}
//LED1????
void led1_task(void *pdata)
{
while(1)
{
LED0=0;
delay_ms(300);
LED0=1;
delay_ms(300);
};
}
void led2_task(void *pdata)
{
while(1)
{
LED1=0;
delay_ms(50);
LED1=1;
delay_ms(50);
};
}
//////////////////////
当start_task(void *pdata)任务刮起后并退出临界段后uCos就开始查询led1_task和led2_task两个任务中的哪个任务处于就绪状态吗? 还有这两个任务是怎样处于就绪状态的呢?还有就是只有在延时的时候cpu才会去查询哪些任务处于就绪状态并执行高优先级的就绪任务吗?比如led2_task()在开始延时50ms时就由运行状态变为等待状态,当50MS结束系统就自动把led2_task()任务变为就绪状态吗?
|
最佳答案
查看完整内容[请看2#楼]
1、只要任务等待的事件发生了那么任务就会进入就绪态,比如任务延时结束,等到信号量或者消息队列等内核对象。
2、任务处于就绪态就是任务就绪表中任务对应的为置1,表示任务就绪。
3、不是只有在延时的时候才会执行高优先级任务的,只要调用了任务切换函数OSSched()就会发生任务切换,UCOS中调用OSSched()的其他API函数很多,其中延时函数就调用了,等待信号量和消息邮箱也调用了,也就说当你等待信号量或者消息邮箱的话(前提是超 ...
|