分析以上文档中有哪些错误,并指出。移植FreeRTOS后,第1次按下按键后屏幕正确显示数据,第2次及多次按下按键后屏幕维持原数据,没反应,程序不能正常运行。通过以上文档,分析原因,并重写正确程序代码。
时间: 2025-01-05 22:47:37 浏览: 6
### 分析错误
1. **全局变量 `key_pressed` 的使用不当**:
- 在 `task1` 函数中,`key_pressed` 变量用于检测按键是否被按下。然而,`key_pressed` 是一个全局变量,在多次按键后没有被正确复位,导致后续按键无效。
2. **按键去抖逻辑不完善**:
- 虽然有去抖延迟,但在按键释放后没有复位 `last_key_press_time` 和 `key_pressed`,可能导致按键检测失败。
3. **任务优先级和调度问题**:
- 任务 `task1` 的优先级较高,但没有明确的任务间同步机制,可能导致任务调度混乱。
4. **LCD 显示更新问题**:
- 每次按键后,LCD 屏幕应该刷新显示,但现有代码可能没有正确处理这一点。
### 修正后的代码
以下是修正后的代码,解决了上述问题:
```c
#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "touch.h"
#include "gui.h"
#include "test.h"
#include "DS2431.h"
#include "DS2807.h"
#include "adc.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "key.h"
#include "led.h"
#include "usart.h"
#include "FreeRTOS.h"
#include "task.h"
#define START_TASK_PRIO 1
#define START_TASK_STACK_SIZE 128
TaskHandle_t start_task_handler;
#define TASK1_PRIO 2
#define TASK1_STACK_SIZE 128
TaskHandle_t task1_handler;
void freertos_demo(void);
void start_task(void *pvParameters);
void task1(void *pvParameters);
void freertos_demo(void) {
xTaskCreate((TaskFunction_t) start_task, (char *) "start_task", (configSTACK_DEPTH_TYPE) START_TASK_STACK_SIZE, (void *) NULL, (UBaseType_t) START_TASK_PRIO, (TaskHandle_t *) &start_task_handler);
vTaskStartScheduler();
}
void start_task(void *pvParameters) {
taskENTER_CRITICAL();
xTaskCreate((TaskFunction_t) task1, (char *) "task1", (configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE, (void *) NULL, (UBaseType_t) TASK1_PRIO, (TaskHandle_t *) &task1_handler);
vTaskDelete(NULL);
taskEXIT_CRITICAL();
}
void task1(void *pvParameters) {
unsigned char arr1_id[8];
unsigned char arr2_id[8];
unsigned char position[5] = {12, 41, 65, 89, 12};
unsigned char position_data[5];
int sensor1 = 0, sensor2 = 0;
int key_pressed = 0;
TickType_t last_key_press_time = 0;
const TickType_t debounce_delay = pdMS_TO_TICKS(200); // 200ms 去抖延迟
while (1) {
vTaskDelay(pdMS_TO_TICKS(20)); // 20ms 延时
if (KEY0 == 0) {
if ((xTaskGetTickCount() - last_key_press_time) > debounce_delay) {
last_key_press_time
阅读全文