学习 学习。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
|
|
|
|
|
好像不错啊!
UCOSII实验1:UCOSII-1多任务运行LED+KEY+LCD+触摸画笔
1. 实验目的:测试UCOSII多任务的创建和运行
2. 实现现象:LED0,LED1循环闪烁,LCD部分区域循环变色,触摸屏下半部分具有触摸画板功能,按下KEY0按键可以进入触摸校准界面。
3. 用到的UCOSII函数简析:
UCOSII初始化函数:void OSInit (void)
任务创建函数:
INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);
启动任务函数:void OSStart (void);
延时函数 OSTimeDlyHMSM(0,0,0,200);
这里我们着重介绍一下OSTaskCreate()函数和OSTimeDlyHMSM()函数:
这个函数的入口参数是任务指针,任务传递参数,任务堆栈栈顶指针以及任务优先级。
在这里我们介绍一下这几个入口参数的作用:
1) 任务优先级:多任务执行的时候,操作系统必须选择一个任务来执行,因为一个CPU同一时间只能执行一个任务,这里UCOSII是按优先级抢占式规则来选择任务的,所以对于每个任务,都会定义一个优先级,而且优先级是唯一的。
2) 任务堆栈:存储器中按先进后(LIF0)出原则组织的连续存储空间,作用是满足任务切换和相应中断时保存CPU寄存器的内容和任务调用其他函数的需要。这里学过单片机的人都知道中断的时候有一个现场保护的概念,现场保护就是用到堆栈。
定义堆栈的方式:
OS_STK TASK_START_STK[START_STK_SIZE];
其中START_STK_SIZE是我们宏定义的任务堆栈的大小。
3) 任务指针:就是指向任务执行入口地址的指针了。C语言里面函数名字就可以看做函数的入口地址了。
4) 任务传递参数:这个就不用讲解,顾名思义就是传递给任务的参数了。
OSTimeDlyHMSM()函数是非常重要的函数,该函数表面看是进行延时,实际上是使任务运行延时(暂停)一段时间并进行一次任务调度,释放CPU使用权。所以简而言之,当任务运行到延时函数的时候,他将释放CPU使用权,等待延时结束之后重新进入就绪状态。
任务初始化函数在系统启动之后必须先调用此函数初始化UCOSII之后才能调用创建函数OSTaskStart以及启动任务函数OSStart();
对于启动任务函数OSStart(),UCOSII要求是在调用此函数之前系统必须创建至少一个任务,这里我们就创建了TaskStart任务,在这个任务中,我们完成其他任务的创建。
4. 实验描述
OSTaskCreate()函数创建TaskStart任务,,
在TaskStart()任务中5次调用ucos任务创建函数OSTaskCreate()创建5个任务:TaskLed,TaskLed1,TaskLCD,TaskKey,TaskTouch。然后调用OSTaskSuspend()函数将
TaskStart()任务挂起,因为在5个任务创建后,TaskStart任务该做的事情已经完毕,挂起任务。
TaskLed: LED0每隔500ms状态反转
TaskLed1: LED1每隔200ms状态反转
TaskLCD: LCD上半部分一定区域颜色循环更换
TaskKey: 每隔20ms扫描按键值,当KEY0按下时,进入触摸屏校准界面。
TaskTouch: 每隔2ms扫描触摸屏下半部分的触摸点,并显示在LCD上。也就是我们的触摸画板程序。NOTE:如果触摸屏不准,请按下KEY0进入触摸屏校准程序
注意:
1,本代码可以SWD下载,但是不支持仿真,下载完后,请拔了仿真器.否则可能导致部分功能不正常.
|
|
|
|
|