中级会员
- 积分
- 364
- 金钱
- 364
- 注册时间
- 2018-3-14
- 在线时间
- 126 小时
|
楼主 |
发表于 2018-4-19 12:00:48
|
显示全部楼层
#include "stm32l4xx.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#define u8 unsigned char
#define START_TASK_PRIO 1
#define START_STK_SIZE 256
TaskHandle_t StartTask_Handler;
void start_task(void *pvParameters);
#define KEY_TASK_PRIO 2
#define KEY_STK_SIZE 256
TaskHandle_t KEYTask_Handler;
void KEY_task(void *pvParameters);
#define LED_TASK_PRIO 3
#define LED_STK_SIZE 256
TaskHandle_t LED_Handler;
void LED_task(void *pvParameters);
SemaphoreHandle_t BinarySemaphore; //二值信号量句柄
int main(void)
{
HAL_Init();
delay_Init(); //初始化延时函数
LED_Init(); //初始化LED端口
KEY_Init();
//创建开始任务
xTaskCreate((TaskFunction_t )start_task, //任务函数
(const char* )"start_task", //任务名称
(uint16_t )START_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )START_TASK_PRIO, //任务优先级
(TaskHandle_t* )&StartTask_Handler); //任务句柄
vTaskStartScheduler(); //开启任务调度
}
//开始任务任务函数
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); //进入临界区
BinarySemaphore=xSemaphoreCreateBinary(); //创建二值信号量
//创建KEY_task任务
xTaskCreate((TaskFunction_t )KEY_task,
(const char* )"KEY_task",
(uint16_t )START_STK_SIZE,
(void* )NULL,
(UBaseType_t )KEY_TASK_PRIO,
(TaskHandle_t* )&KEYTask_Handler);
//创建LED_task任务
xTaskCreate((TaskFunction_t )LED_task,
(const char* )"LED_task",
(uint16_t )LED_STK_SIZE,
(void* )NULL,
(UBaseType_t )LED_TASK_PRIO,
(TaskHandle_t* )&LED_Handler);
vTaskDelete(StartTask_Handler); //删除开始任务
taskEXIT_CRITICAL(); //退出临界区
}
//KEY_task函数
void KEY_task(void *pvParameters)
{
while(1)
{
static unsigned char key_old=1;
if(KEY==0&&key_old==1)
xSemaphoreGive(BinarySemaphore);
key_old=KEY;
//vTaskDelay(10);
delay_ms(10);
}
}
//LED_task函数
void LED_task(void *pvParameters)
{
while(1)
{
xSemaphoreTake( BinarySemaphore, portMAX_DELAY );
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_1);
}
}
|
|