|
[...skip...]
OS_STK TaskArchStk[TASK_STK_SIZE];
OS_STK TaskComStk[STASK_STK_SIZE];
OS_STK TaskUserStk[TASK_STK_SIZE];
OS_EVENT *SpiSem;
OS_EVENT *Alarm0Sem;
void TaskArch(void *data);
void TaskCom(void *data);
void TaskUser(void *data);
void main (void)
{
WDTCTL = WDTPW + WDTHOLD;
OSInit();
SpiSem = OSSemCreate(1);
Alarm0Sem = OSSemCreate(0);
Alarm1Sem = OSSemCreate(0);
OSTaskCreate(TaskArch, (void *)0, &TaskArchStk[TASK_STK_SIZE - 1], 0);
OSTaskCreate(TaskCom, (void *)0, &TaskComStk[STASK_STK_SIZE - 1], 1);
OSTaskCreate(TaskUser, (void *)0, &TaskUserStk[TASK_STK_SIZE - 1], 2);
OSStart();
}
unsigned int h,m,s;
unsigned int PeriodA0 = 1; // secs
interrupt [PORT1_VECTOR] void TimerIntProc0(void) // alarm INT
{
unsigned x;
OS_SEM_DATA sd;
x = P1IFG;
P1IFG = 0x00;
OSIntEnter();
if(x&0x04) OSSemPost(Alarm0Sem);
OSIntExit();
}
void TaskArch(void *pdata)
{
INT8U err;
unsigned int hour, min, sec;
unsigned char x = (unsigned char)pdata;
while(1)
{
OSSemPend(Alarm0Sem, 0, &err);
GetClockTime(&hour, &min, &sec);
SetClockAlarm(0, (sec+PeriodA0)%60, 80, 80); // установка нового прерывания на через 1сек
h = hour; m = min; s = sec;
}
}
void TaskCom(void *pdata)
{
pdata = pdata;
while(1)
{
OSTimeDly(1024);
}
}
void TaskUser(void *pdata)
{
INT8U err;
unsigned int hour, min, sec;
pdata = pdata;
// init:
WDTCTL = WDT_MDLY_32; /* Set time tick 8.8(8) mS */
IE1 |= 0x01; /* Enable Watchdog timer interrupts */
lcd_init();
clrscr();
clrscr();
printf("Reboot!");
ScanKBD();
clrscr();
printf("Starting...");
GetClockTime(&hour, &min, &sec);
ResetClockAlarm(0);
SetClockAlarm(0, (sec+1)%60, min, 80);
P1DIR = 0x00;
P1IFG = 0x00;
P1IE = 0x0C;
P1IES = 0x0C;
P1SEL = 0x00;
// go:
while(1)
{
clrscr();
printf("%02i:%02i:%02i \n", h,m,s);
printf("%02X \n", P1IN);
OSTimeDly(56);
}
}
//////////////////////////////////////////////////////////
GetClockTime, ResetClockAlarm, SetClockAlarm обращаются к часам, висящим на SPI, для эксклюзивного доступа к шине SPI используется семафор SpiSem...
через одну две минуты нормальной работы начинают проскальзывать
мусорные символы на LCD или происходит зависание...
в чем же проблема? Помогите pls...
Задача - будить TaskArch в момент прерывания от будильника...
E-mail: info@telesys.ru