static void task1_execute(void) { int i; StatusType err; char expectSequence[MAX_SLAVE_TEST_TASKS+1]; for(i = 0; i < MAX_SLAVE_TEST_TASKS; i++) { expectSequence[i] = 'A' + i; } expectSequence[i] = '\0'; dbgPassCnt = 0; // Test 1 CreateTask && argv && ExitTask && Preemptive Priority for(i = 0; i < MAX_SLAVE_TEST_TASKS; i++) { Task_Id[i] = CoCreateTask(exitTaskTestTask,(void*)expectSequence[i],MAINTEST_PRIMARY_PRIORITY-1,&Task_Stack[i][SLAVE_TASK_STK_SIZE-1],SLAVE_TASK_STK_SIZE); testAssert(Task_Id[i] != (OS_TID)-1,"#1"); } testAssert(dbgPassCnt == MAX_SLAVE_TEST_TASKS,"#2"); testAssertSequence(expectSequence); // Test 2 SetPriority for(i = 0; i < MAX_SLAVE_TEST_TASKS; i++) { Task_Id[i] = 0; } dbgPassCnt = 0; for(i = 0; i < MAX_SLAVE_TEST_TASKS; i++) { Task_Id[i] = CoCreateTask(prioTestTask,NULL,MAINTEST_PRIMARY_PRIORITY+(MAX_SLAVE_TEST_TASKS-i),&Task_Stack[i][SLAVE_TASK_STK_SIZE-1],SLAVE_TASK_STK_SIZE); testAssert(Task_Id[i] != (OS_TID)-1,"#3"); err = CoSetPriority(mainTestTaskID,MAINTEST_PRIMARY_PRIORITY + 2 + (MAX_SLAVE_TEST_TASKS-i)); testAssert(err == E_OK,"#4"); } testAssert(dbgPassCnt == MAX_SLAVE_TEST_TASKS,"#5"); for(i = 0; i < MAX_SLAVE_TEST_TASKS; i++) { err = CoDelTask(Task_Id[i]); testAssert(err == E_OK,"#6"); } // Delete invaild task for(i = 0; i < MAX_SLAVE_TEST_TASKS; i++) { err = CoDelTask(Task_Id[i]); testAssert(err == E_INVALID_ID,"#7"); } // Test 3 SuspendTask && AwakeTask dbgPassCnt = 0; // Awake a running task err = CoAwakeTask(mainTestTaskID); testAssert(err == E_TASK_NOT_WAITING,"#8"); for(i = 0; i < MAX_SLAVE_TEST_TASKS; i++) { Task_Id[i] = CoCreateTask(awakeTestTask,NULL,MAINTEST_PRIMARY_PRIORITY+(MAX_SLAVE_TEST_TASKS-i),&Task_Stack[i][SLAVE_TASK_STK_SIZE-1],SLAVE_TASK_STK_SIZE); testAssert(Task_Id[i] != (OS_TID)-1,"#9"); // Suspend a ready task err = CoSuspendTask(Task_Id[i]); testAssert(err == E_OK,"#10"); // Awake a wait task err = CoAwakeTask(Task_Id[i]); testAssert(err == E_OK,"#11"); // Awake a ready task err = CoAwakeTask(Task_Id[i]); testAssert(err == E_TASK_NOT_WAITING,"#12"); // Suspend the running task err = CoSuspendTask(mainTestTaskID); if (err != E_OK) testAssert(err == E_OK,"#13"); } testAssert(dbgPassCnt == MAX_SLAVE_TEST_TASKS,"#14"); for(i = 0; i < MAX_SLAVE_TEST_TASKS; i++) { err = CoDelTask(Task_Id[i]); testAssert(err == E_OK,"#15"); } }
void taskGD(void *pdata){ //создаем таймер таймаута получени¤ 2 секунды хватит sftmr = CoCreateTmr(TMR_TYPE_ONE_SHOT, 200, 0, PacketTimeOut); int i=0; //GD_WriteEnable(); //GD_EraseSector(0); //CoTickDelay(2); /* for (i=0;i<256;i++){ Env.rxBuf[8+i]=i; } GD_WriteEnable(); GD_WritePage(0, &(Env.rxBuf[8])); CoTickDelay(1); GD_ReadPage(0, &Env.GDPage[0]); //check bool badWrite1=FALSE; for (i=0;i<256;i++){ if (Env.GDPage[i]!=Env.rxBuf[8+i]){ badWrite1=TRUE; } } */ //GD_WriteEnable(); u8 GD_StateLow = GD_GetStatusLow(); Env.State=WaitingStart; while(1){ Env.canListen=TRUE; //ждем новый пакет while(Env.rxIndex==0); CoSuspendTask(Env.gdTaskID); if (Env.rxBuf[0]==PACKET_START){ //good Env.State=ReceivingPacket; //стартуем таймер StatusType result = CoStartTmr(sftmr); }else{ Env.rxIndex=0; Env.State=WaitingStart; continue; } u16 packetSizeWithStart=0; while(Env.State==ReceivingPacket){//статус может изменить таймер таймаута //0xB1 0x01 0x09 if (Env.rxIndex>3 && packetSizeWithStart==0){ packetSizeWithStart=Env.rxBuf[1]+ (Env.rxBuf[2]*256)+1; if (packetSizeWithStart>RX_BUF_SIZE-6){ Env.rxIndex=0; Env.State=WaitingStart; continue; } } else if(Env.rxIndex==packetSizeWithStart && Env.rxIndex>3){ //ѕакет пришел. останавливаем таймер и провер¤ем его StatusType result = CoStopTmr(sftmr); Env.canListen=FALSE; Env.State=Processing; //check CRC u8 crc=0; //265-2=263 for (i=0;i<packetSizeWithStart-2;i++){ crc+=Env.rxBuf[i]; } if (crc==Env.rxBuf[packetSizeWithStart-2]&& crc^0xAA==Env.rxBuf[packetSizeWithStart-1]){ //processPacket(); if (Env.rxBuf[3]==0x03){//write page u32 address=Env.rxBuf[4]| Env.rxBuf[5]<<8 | Env.rxBuf[6]<<16 | Env.rxBuf[7]<<24; //очищаем сектор /* if (address%4096==0){ GD_WriteEnable(); GD_EraseSector(address); while(GD_GetStatusLow()&1 == 1) { CoTickDelay(2); } }*/ GD_WriteEnable(); //CoSchedLock(); GD_WritePage(address, &(Env.rxBuf[8])); u8 cnt=200; while(GD_GetStatusLow()&1 == 1//wait WIP flag && --cnt>0) { CoTickDelay(1); } GD_ReadPage(address, &Env.GDPage[0]); //CoSchedUnlock(); //check bool badWrite=FALSE; for (i=0;i<256;i++){ if (Env.GDPage[i]!=Env.rxBuf[8+i]){ badWrite=TRUE; break; } } Env.State=SendingAnswer; Env.txBuf[0]=0xB1; Env.txBuf[1]=0x09; Env.txBuf[2]=0x00; Env.txBuf[3]=0x04; Env.txBuf[4]=address; Env.txBuf[5]=address>>8; Env.txBuf[6]=address>>16; Env.txBuf[7]=address>>24; if (badWrite){ Env.txBuf[3]=0x06; } Env.txBuf[8]=0; for (i=0;i<8;i++){ Env.txBuf[8]+=Env.txBuf[i]; } Env.txBuf[9]=Env.txBuf[8]^0xAA; Env.txIndex=0; Env.State=SendingAnswer; } //processPacket(); }else{//crc error Env.rxIndex=0; Env.State=WaitingStart; continue; } }//Env.rxIndex==packetSizeWithStart