⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 T-Ker测试synchronization_communicationsemaphore部分的tk_cre_sem,tk_del_sem, tk_sig_sem, tk_wai_sem, tk_re
💻 C
字号:
/*	
 *	created by hany 20050124
 *
 *  test the api about synchronization  and communication
 *  
 *	
 *
 *  about eventflag:
 *	tk_cre_flg,tk_del_flg, tk_set_flg, tk_clr_flg, tk_wai_flg, tk_ref_flg
 *
 *
 */
 
#include <basic.h>
#include <tk/tkernel.h>
#include <LPC2106.h>

#define	  LEDCON1	0x00000400		//p0.10引脚控制LED1,低电平点亮
#define	  LEDCON2	0x00000800		//p0.11引脚控制LED2,低电平点亮
#define	  LEDCON3	0x00001000		//p0.12引脚控制LED3,低电平点亮
#define	  LEDCON4	0x00002000		//p0.13引脚控制LED4,低电平点亮
#define   LEDCON	0x00003c00		//p0.10~p0.13

ID taskid1 = -1;
//ID taskid2 = -1;
ID flgid = -1;
ID flgid2 = -1;

/*********************************  time delay  ****************************************/
void DelayNS(UH dly)		
{  
	UH i;

	for(; dly>0; dly--) 
	{
		for(i=0; i<2000; i++);
	}
}
/*********************************  time delay  ****************************************/

/*********************************  LED control  ***************************************/
/*******************************  shine 2 times  **************************************/
void LedCon(UW Ledcon)
{
	UH i;
	
	IOSET = Ledcon;
	
	for(i=0;i<2;i++)
	{
		IOSET = Ledcon;
		
		DelayNS(1001);
		
		IOCLR = Ledcon;
		
		DelayNS(1001);
		
	}
	IOSET = Ledcon;
}
/*********************************  LED control  ***************************************/

/*********************************  task1(below)  **************************************/
void task1(INT stacd, VP exinf)
{														//这里wait了两个信号量(Tron中如果这么做的话会死机)
														//因为此系统版本的限制,为了创建2个flg,只好砍掉一个task2,			
														//只留一个task1,并把\config\sysconf.c下的TMaxFlgId改为4,
														//正常的话为3才能起两个任务,为4就只能起一个任务。
    ER ercd = 0;
   
   	UINT *pk_flgptn = 0;
	
	ercd = tk_wai_flg( flgid, 0x00000021, TWF_ANDW, &pk_flgptn, 9000 );
	if(ercd==E_OK)										//如果tk_wai_flg好用,则LED2闪烁2次
	{
		LedCon(LEDCON2);
	}	
	
	ercd = tk_chg_pri(TSK_SELF,90);
	
	//tk_dly_tsk(1200);									//如果用这个dly,则可不用那两个chgpri,但dly的时间必须
														//设定得和LED闪烁两次的时间大体相同,须略少于LED闪烁的时间
														
	ercd = tk_wai_flg( flgid2, 0x00000043, TWF_ORW, &pk_flgptn, 9000 );
	if(ercd==E_OK)										//如果tk_wai_flg好用,则LED1~LED4闪烁2次
	{
		LedCon(LEDCON);
	}	

   
   
    tk_exd_tsk();						
  	  		
}
/*********************************  task1(above)  ************************************/

/*********************************  task2(below)  ************************************/
/*void task2(INT stacd, VP exinf)
{  
	ER ercd = 0;
			
  	tk_exd_tsk();						
  	  	
}
/*********************************  task2(above)  ************************************/





int main(void)
{ 	
 	T_CTSK tsk1/*,tsk2*/;
 	
	T_CFLG pk_cflg, pk_cflg2;    
    T_RFLG pk_rflg;
	
 	ER ercd = 0;
 	
 	PINSEL0 = 0x00000000;	// 设置所有管脚连接GPIO(p0.0~p0.15)
	   
	IODIR = LEDCON;			// 设置p0.10~p0.13控制口为输出 
    IOSET = LEDCON;			// 设置p0.10~p0.13控制口为高电平,LED0~LED4不亮
          
 	 	
 	tsk1.exinf = (VP)0x74736574;
 	//tsk2.exinf = (VP)0x74736332;
 	
	tsk1.tskatr = TA_HLNG | TA_RNG0;			//由于这里没有MMU,所以系统将所有的RNGn都按RNG0来处理
	//tsk2.tskatr = TA_HLNG | TA_RNG0;
	
	tsk1.task = task1;
	//tsk2.task = task2;
	
	tsk1.itskpri = 80;
	//tsk2.itskpri = 70;
	
	tsk1.stksz = 512;
	//tsk2.stksz = 512;
	 
	taskid1 = tk_cre_tsk(&tsk1);
	//taskid2 = tk_cre_tsk(&tsk2);
	  
	//ercd = tk_sta_tsk(taskid1, 101);
	
	
    pk_cflg.exinf = 0x12345678;
    pk_cflg.flgatr = TA_TPRI | TA_WMUL;
    pk_cflg.iflgptn = 0x00000001;
    
    pk_cflg2.exinf = 0x00002222;
    pk_cflg2.exinf = TA_TPRI | TA_WMUL;
    pk_cflg2.exinf = 0x00002008;
    
	pk_rflg.exinf = 0;
	pk_rflg.wtsk = -1;
	pk_rflg.flgptn = 0;
	    
    flgid = tk_cre_flg(&pk_cflg);						//如果tk_cre_flg好用,则LED1闪烁2次
    if(flgid>=0)
    {
    	LedCon(LEDCON1);
    }
    
    flgid2 = tk_cre_flg(&pk_cflg2);
    
	ercd = tk_sta_tsk(taskid1,101);
	
	ercd = tk_ref_flg(flgid,&pk_rflg);					//如果tk_ref_flg好用,则LED3闪烁2次
	if(ercd==E_OK)
	{
		LedCon(LEDCON3);
	}
	
	ercd = tk_set_flg(flgid,0x00000020);				//如果tk_set_flg好用,则此时转入task2,LED2闪烁2次,接着转回task1,LED4闪烁2次
	if(ercd==E_OK)										//这个if语句并不紧接着tk_set_flg执行
	{
		LedCon(LEDCON4);
	}
	
	ercd = tk_chg_pri(TSK_SELF,100);
	
	ercd = tk_set_flg(flgid2,0x00002005);
	
	ercd = tk_clr_flg(flgid,0x00000000);				//如果tk_clr_flg好用,则LED3闪烁4次
	if(ercd==E_OK)
	{
		LedCon(LEDCON3);
		LedCon(LEDCON3);
	}
		
	ercd = tk_del_flg(flgid);							//如果tk_del_flg好用,则LED4闪烁4次
	if(ercd==E_OK)
	{
		LedCon(LEDCON4);
		LedCon(LEDCON4);
	}
	
	
	
	
	
	
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -