|
最近在学习UCOS,在论坛上找一个例程,移植平台是AVRStudio+WINAVR.使用ATMEGA128的开发板来测试。
系统中建立三个任务,分别为TASK0,TASK1,TASK3.
其中TASK0,TASK1,用信号量来控制PB口的LED灯闪烁,TASK3整个任务用延时实现PC口LED灯闪烁。
程序如下:
#include <includes.h>
/* 在AVR Studio上仿真时值要设置的小些,如20 */
#define LED_DELAY_MS 200 /* LED 延时, 用于任务 */
#define LED_ON() { DDRB = 0xff; PORTB = 0x00; }
#define LED_OFF() ( PORTB = 0xff )
#define LED_ON2() { DDRC = 0xff; PORTC = 0x00; }
#define LED_OFF2() ( PORTC = 0xff )
// Variablen
OS_STK Task1Stack[OS_TASK_1_STK_SIZE]; // startup task stack
OS_STK Task2Stack[OS_TASK_2_STK_SIZE];
OS_STK Task3Stack[OS_TASK_3_STK_SIZE];
OS_EVENT * sem;
void task0( void * pdata )
{
INT8U error;
TimerInit();
while(1)
{
OSSemPend( sem, 0, &error );
LED_ON(); /* 点亮LED */
OSTimeDlyHMSM(0,0,0,LED_DELAY_MS );
OSSemPost( sem );
}
}
void task1(void * pdata )
{
INT8U error;
while(1)
{
OSSemPend(sem, 0, &error);
LED_OFF(); /* 熄灭LED */
OSTimeDlyHMSM(0,0,0,LED_DELAY_MS );
OSSemPost(sem);
}
}
void task3(void * pdata)
{
for(;;)
{
LED_ON2();
OSTimeDlyHMSM(0,0,0,2*LED_DELAY_MS );
LED_OFF2();
OSTimeDlyHMSM(0,0,0,2*LED_DELAY_MS );
}
}
int main()
{
OSInit();
sem = OSSemCreate( 1 );
OSTaskCreate( task0, (void *)OS_TASK_1_STK_SIZE, &Task1Stack[OS_TASK_1_STK_SIZE-1], OS_TASK_1_PRIO );
OSTaskCreate( task1, (void *)OS_TASK_2_STK_SIZE, &Task2Stack[OS_TASK_2_STK_SIZE-1], OS_TASK_2_PRIO );
OSTaskCreate( task3, (void *)OS_TASK_3_STK_SIZE, &Task3Stack[OS_TASK_3_STK_SIZE-1], OS_TASK_3_PRIO );
OSStart();
return 0;
}
下载到板子上测试,PB口LED灯只会全亮不会闪烁,PC口LED灯闪烁。我想要的效果应该PB口LED灯会闪烁,为什么不会呢?
其中的信号建立与使用我也参考网上许多人的程序,并不觉得有错。请各位大神们解解我这个小白的疑惑。 |
|