初中生
最后登录1970-1-1
在线时间 小时
注册时间2017-10-15
|
//下面这个程序是个按键长按短按识别程序 ,程序在裸系统中能正常,在OS中无法正常运行,贴出OS程序求高手指点、
#include <stdio.h>
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "key.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "stm32f10x.h"
#include "stm32f10x_it.h"
#include "timer.h"
/*************************************************************************/
#define START_TASK_PRIO 1 //任务优先级
#define START_STK_SIZE 128 //任务堆栈大小
TaskHandle_t StartTask_Handler; //任务句柄
void start_task(void *pvParameters); //任务函数
#define KEY_TASK_PRIO 12
#define KEY_STK_SIZE 128
TaskHandle_t KEYTask_Handler;
void key_task(void *p_arg);
void k2_Scan()
{
static int k2_cnt=0;
static u8 k2_Lock=0;
static u8 k2_Flag=0;
if(KEY2)
{
k2_cnt=0;
k2_Lock=0; //自锁
if(k2_Flag==1) //短按触发标志
{
k2_Flag=0;
K2Sec_1=1; //触发一号键的短按
printf("短按值:%d\r\n",K2Sec_1);
}
}
else if(k2_Lock==0)
{
k2_cnt++;
if(k2_cnt>20)
{
k2_Flag=1; //激活按键短按的有效标志
printf("激活值:%d\r\n",k2_Flag);
}
if(k2_cnt>1000)
{
k2_Flag=0; //清除按键短按的有效标志
k2_cnt=0;
k2_Lock=1; //自锁按键置位,避免一直触发
K2Sec_2++;
if(K2Sec_2>3)K2Sec_2=0;
printf("长按值:%d\r\n",k2_Flag);
}
};
}
/*************************************************************************/
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //设置系统中断优先级分组4
delay_init();
uart_init(115200);
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(); //进入临界区
//创建LED0任务
xTaskCreate((TaskFunction_t )key_task, //任务1
(const char* )"key_task",
(uint16_t )KEY_STK_SIZE,
(void * )NULL,
(UBaseType_t )KEY_TASK_PRIO,
(TaskHandle_t* )&KEYTask_Handler);
vTaskDelete(StartTask_Handler); //删除开始任务
taskEXIT_CRITICAL(); //退出临界区
}
void key_task(void * pvParameters)
{
while(1)
{
k2_Scan();
}
}
|
|