FreeRTOS课程设计之临沂大学停车场车位管理系统(一)
先看一下效果吧
1.作品要求
模拟临大停车场车位管理系统
首页显示:
欢迎来到临沂大学
空闲停车位n个(n个灯亮)
“by姓名”
按下K1(停车位数递减),显示“欢迎来到临沂大学,停车位剩余n个”。连续按n次,显示“没有空闲停车位”。
按下K2(停车位数递增),显示“欢迎再来临沂大学,停车位空余n个”。
按下K3,挂起任务1. 灯闪烁。
按下K4,恢复任务1. 灯全亮。
加分项:
功能的扩展与创意。
2.实现思路
- 需要用到 LED、OLED、按键等外设
- 使用FreeRTOS实时操作系统
- 需要创建几个任务、任务之间如何安排、数据如何传递?
- 想好这些之后,再开始敲代码之前画个图吧!
主要创建4个任务,这4个任务如上图所示,如何把这几个任务联系起来?
当然是通过信号量了
老师说,信号量可以在任务之间传递,但我没怎么用上,偷了个懒,定义了一个chewei(车位变量),Take与Give这两个任务就是对这个变量进行操作,使其–、++。
LED_Task则是根据chewei信息及时更新LED与OLED显示。
KEY_Task则是挂起与恢复 前两个任务。
这样就是大体的思路了。
3.主要代码
3.1 任务句柄的创建
/**************************** 任务句柄 ********************************/
/*
* 任务句柄是一个指针,用于指向一个任务,当任务创建好之后,它就具有了一个任务句柄
* 以后我们要想操作这个任务都需要通过这个任务句柄,如果是自身的任务操作自己,那么
* 这个句柄可以为NULL。
*/
static TaskHandle_t AppTaskCreate_Handle = NULL;/* 创建任务句柄 */
static TaskHandle_t Take_Task_Handle = NULL;/* Take_Task任务句柄 */
static TaskHandle_t Give_Task_Handle = NULL;/* Give_Task任务句柄 */
static TaskHandle_t KEY_Task_Handle = NULL;/* KEY任务句柄 */
static TaskHandle_t LED_Task_Handle = NULL;/* LED任务句柄 */
3.2 AppTaskCreate任务
/***********************************************************************
* @ 函数名 : AppTaskCreate
* @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面
* @ 参数 : 无
* @ 返回值 : 无
**********************************************************************/
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
taskENTER_CRITICAL(); //进入临界区
/* 创建Test_Queue */
CountSem_Handle = xSemaphoreCreateCounting(4,4);
if(NULL != CountSem_Handle)
printf("CountSem_Handle计数信号量创建成功!\r\n");
/* 创建Take_Task任务 */
xReturn = xTaskCreate((TaskFunction_t )Take_Task, /* 任务入口函数 */
(const char* )"Take_Task",/* 任务名字 */
(uint16_t )512, /* 任务栈大小 */
(void* )NULL, /* 任务入口函数参数 */
(UBaseType_t )4, /* 任务的优先级 */
(TaskHandle_t* )&Take_Task_Handle);/* 任务控制块指针 */
if(pdPASS == xReturn)
printf("创建Take_Task任务成功!\r\n");
/* 创建Give_Task任务 */
xReturn = xTaskCreate((TaskFunction_t )Give_Task, /* 任务入口函数 */
(const char* )"Give_Task",/* 任务名字 */
(uint16_t )512, /* 任务栈大小 */
(void* )NULL,/* 任务入口函数参数 */
(UBaseType_t