你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

下面这个程序是个按键长按短按识别程序 ,程序在裸系统...

[复制链接]
wis98 提问时间:2020-3-7 13:58 /
下面这个程序是个按键长按短按识别程序 ,程序在裸系统中能正常,在OS中无法正常运行,贴出OS程序求高手指点、
#include <stdio.h>
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "stm32f10x.h"
#include "stm32f10x_it.h"
#include  "NOK5110.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();
              vTaskDelay(100 / portTICK_RATE_MS);  //增加延时节拍函数
        }
        
        
}

收藏 评论1 发布时间:2020-3-7 13:58

举报

1个回答
天臆弄人 回答时间:2020-3-9 17:07:38
时基不一样,在裸机中,一般都是 20-50轮询,你TASK中是100了,

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版