📄 main.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 + -