標(biāo)題:
STM32程序在裸系統(tǒng)中能正常,在OS中無法正常運行,貼出OS程序求高手指點
[打印本頁]
作者:
wis98
時間:
2020-3-4 11:42
標(biāo)題:
STM32程序在裸系統(tǒng)中能正常,在OS中無法正常運行,貼出OS程序求高手指點
下面這個程序是個按鍵長按短按識別程序 ,程序在裸系統(tǒng)中能正常,在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 //任務(wù)優(yōu)先級
#define START_STK_SIZE 128 //任務(wù)堆棧大小
TaskHandle_t StartTask_Handler; //任務(wù)句柄
void start_task(void *pvParameters); //任務(wù)函數(shù)
#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) //短按觸發(fā)標(biāo)志
{
k2_Flag=0;
K2Sec_1=1; //觸發(fā)一號鍵的短按
printf("短按值:%d\r\n",K2Sec_1);
}
}
else if(k2_Lock==0)
{
k2_cnt++;
if(k2_cnt>20)
{
k2_Flag=1; //激活按鍵短按的有效標(biāo)志
printf("激活值:%d\r\n",k2_Flag);
}
if(k2_cnt>1000)
{
k2_Flag=0; //清除按鍵短按的有效標(biāo)志
k2_cnt=0;
k2_Lock=1; //自鎖按鍵置位,避免一直觸發(fā)
K2Sec_2++;
if(K2Sec_2>3)K2Sec_2=0;
printf("長按值:%d\r\n",k2_Flag);
}
};
}
/*************************************************************************/
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //設(shè)置系統(tǒng)中斷優(yōu)先級分組4
delay_init();
uart_init(115200);
KEY_Init();
xTaskCreate((TaskFunction_t )start_task, //任務(wù)函數(shù)
(const char* )"start_task", //任務(wù)名稱
(uint16_t )START_STK_SIZE, //任務(wù)堆棧大小
(void * )NULL, //傳遞給任務(wù)函數(shù)的參數(shù)
(UBaseType_t )START_TASK_PRIO, //任務(wù)優(yōu)先級
(TaskHandle_t * )&StartTask_Handler); //任務(wù)句柄
vTaskStartScheduler(); //開啟任務(wù)調(diào)度
}
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); //進入臨界區(qū)
//創(chuàng)建LED0任務(wù)
xTaskCreate((TaskFunction_t )key_task, //任務(wù)1
(const char* )"key_task",
(uint16_t )KEY_STK_SIZE,
(void * )NULL,
(UBaseType_t )KEY_TASK_PRIO,
(TaskHandle_t* )&KEYTask_Handler);
vTaskDelete(StartTask_Handler); //刪除開始任務(wù)
taskEXIT_CRITICAL(); //退出臨界區(qū)
}
void key_task(void * pvParameters)
{
while(1)
{
k2_Scan();
vTaskDelay(100 / portTICK_RATE_MS); //增加延時節(jié)拍函數(shù)
}
}
作者:
yxh1999
時間:
2020-3-4 13:46
可能是時間的問題,從結(jié)構(gòu)上看應(yīng)該沒有什么問題。
if(k2_cnt>20)
{
k2_Flag=1; //激活按鍵短按的有效標(biāo)志
printf("激活值:%d\r\n",k2_Flag);
}
這是你判斷短按的時間,可能這里時間太長了,你按短按的時候,這個數(shù)字還沒有達到20.
你先改小這個值試一試,比如if(k2_cnt>2)或者if(k2_cnt>1)
作者:
wis98
時間:
2020-3-7 10:47
我改過if(k2_cnt>1)也不行,不知何因
作者:
yxh1999
時間:
2020-3-9 09:50
wis98 發(fā)表于 2020-3-7 10:47
我改過if(k2_cnt>1)也不行,不知何因
void k2_Scan()
{
static int k2_cnt=0;
static u8 k2_Lock=0;
static u8 k2_Flag=0;
printf("-k2_cnt=--:%d\r\n",k2_cnt);
如果能連串口的話就在這里打印一下,看你這個OS的建立的是不是正確,看這個函數(shù)會不會一直跑進來。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1