初级会员

- 积分
- 173
- 金钱
- 173
- 注册时间
- 2013-7-6
- 在线时间
- 10 小时
|
5金钱
#define START_TASK_PRIO 10
#define START_STK_SIZE 64
OS_STK START_TASK_STK[START_STK_SIZE];
void start_task(void *pdata);
#define LED1_TASK_PRIO 7
#define LED1_STK_SIZE 64
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
void LED1_task(void *pdata);
#define LED2_TASK_PRIO 8
#define LED2_STK_SIZE 64
OS_STK LED2_TASK_STK[LED2_STK_SIZE];
void LED2_task(void *pdata);
OS_TMR *tmr1; //
void tmr1_callback(OS_TMR *ptmr,void *p_arg);
int main (void)
{
u8 err;
OS_CPU_SysTickInit();
BSP_GPIO_Init();
OSInit();
err=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;
u8 err;
pdata = pdata;
tmr1=OSTmrCreate(100,10,OS_TMR_OPT_PERIODIC,(OS_TMR_CALLBACK)tmr1_callback,0,"tmr1",&err);
OSTmrStart(tmr1,&err);
OS_ENTER_CRITICAL();
OSTaskCreate(LED1_task,(void *)0,(OS_STK *)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO );//???¨LED1????
// OSTaskCreate(LED2_task,(void *)0,(OS_STK *)&LED2_TASK_STK[LED2_STK_SIZE-1],LED2_TASK_PRIO );
OSTaskSuspend(START_TASK_PRIO);
OS_EXIT_CRITICAL();
}
void LED1_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
// u8 err;
pdata = pdata;
while(1)
{
LED1=!LED1;
OSTimeDly(50);
}
}
void LED2_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
// u8 err;
pdata = pdata;
while(1)
{
LED0=!LED0;
OSTimeDly(10);
}
}
void tmr1_callback(OS_TMR *ptmr,void *p_arg)
{
u8 i;
for(;;)
{
if(i>=10)
{
i=0;
LED0=!LED0;
}
i++;
}
}
#define OS_TMR_CFG_TICKS_PER_SEC 100u /* Rate at which timer management task runs (Hz) */
#define OS_TASK_TMR_PRIO 9u
#define OS_TICKS_PER_SEC 200u
不开启软件定时器时,两个LED闪烁正常,开启软件定时器后,把LED2任务屏蔽掉后,一直进软件定时器回调函数,LED1_task无法进入,有谁知道这是怎么回事吗?
|
最佳答案
查看完整内容[请看2#楼]
软件定时器的回调函数是个函数,必须尽快返回,而不能写成任务。
下面这样写是不对的,因为这是任务的形式:
void tmr1_callback(OS_TMR *ptmr,void *p_arg)
{
u8 i;
for(;;)
{
}
}
应该改为:
void tmr1_callback(OS_TMR *ptmr,void *p_arg)
{
&nb ...
|