示例#1
0
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");
	}

}
示例#2
0
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