Не пойму я - порт uCOS2 для MSP430, что на серваке ucos'а выложен несовместим с версией 2.61? Вставил обработку прерываний, если вызываешь OSIntEnter(); ....... OSIntExit(); то прога через некоторое N-ное число (порядка 20...100) подвисает в эмуляторе видно что циклится код в Os_cpu_a.s43... может я что-то не так делаю? схема сырца внутри...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено SOIC 12 марта 2003 г. 17:07

[...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