OpenHarmony开发者论坛

标题: 关于gpio按键输入控制led灯亮灭的问题 [打印本页]

作者: hentaiplus    时间: 2024-4-14 13:07
标题: 关于gpio按键输入控制led灯亮灭的问题
[md]#include<stdio.h>
#include"ohos_init.h"
#include"cmsis_os2.h"
#include"iot_gpio.h"
#include"hi_io.h"
#define LED_TASK_GPIO 9
static void LedTask(void *arg)
{
(void)arg
IoTGpioInit(LED_TASK_GPIO);
hi_io_set_func(LED_TASK_GPIO,HI_IO_FUNC_GPIO_9_GPIO);
IoTGpioSetDir(LED_TASK_GPIO,IOT_GPIO_DIR_OUT);
while(1)
{
IoTGpioSetOutputVal(LED_TASK_GPIO<IOT_GPIO_VALUE0);
osDelay(50);
IoTGpioSetOutputVal(LED_TASK_GPIO,IOT_GPIO_VALUE1);
osDelay(100);
}
}
static void LedEntry(void)
{
osThreadAttr_t attr;
attr.name="LedTask"
sttr.stack_size=4096
attr.priority=osPriorityNormal;

```
if (osThreadNew(LedTask,NULL,&attr)==NULL)
{
        printf("[LedDemo] Creat LedTask failed!\n")
}
```

}
SYS_RUN(LedEntry);

这段代码可以让led灯一直闪,灯亮的时间和间隔是由while循环里的语句决定的


#include<stdio.h>
#include"ohos_init.h"
#include"cmsis_os2.h"
#include"iot_gpio.h"
#include"hi_io.h"
#define LED_GPIO 9
#define BUTTON_GPIO 5
static void GpioTask(void *arg)
{
(void)arg;
IoTGpioInit(LED_GPIO);
IoTGpioInit(BUTTON_GPIO);
hi_io_set_func(LED_TASK_GPIO,HI_IO_FUNC_GPIO_9_GPIO);
IoTGpioSetDir(LED_GPIO,IOT_GPIO_DIR_OUT);
hi_io_set_func(BUTTON_GPIO,HI_IO_FUNC_GPIO_5_GPIO);
IoTGpioSetDir(BUTTON_GPIO,IOT_GPIO_DIR_IN);
hi_io_set_pull(BUTTON_GPIO,HI_IO_PULL_UP);
while(1)
{
IoTGpioValue value=IOT_GPIO_VALUE0;
IoTGpioGetInputVal(BUTTON_GPIO,&value);
printf("Button value:%d\n",value);
IoTGpioSetOutputVal(LED_GPIO,value);
osDelay
}
}
static void GpioEntry(void)
{
osThreadAttr_t attr={0};
attr.name="GpioTask";
attr.stack_sick=4096;
attr.priority=osPriorityNormal;
if(osThreadNew(GpioTask,NULL,&attr)==NULL)
{
printf("[GpioDemo] Create GpioTask failed!\n")
}
}
SYS_RUN(GpioEntry)

用这段代码可以实现用按钮当开关,按一下亮再按一下灭


那么为什么把第一段代码的工作循环中的代码放在第二段代码的工作循环里不能实现按一下闪一次,而是直接就灭灯怎么也不亮了呢🤔
[/md]
作者: 论坛小助手    时间: 2024-4-15 19:53
第一段代码是一个简单的LED闪烁任务,第二段代码则是一个基于GPIO输入的按钮读取和LED控制任务。这些代码片段是基于OpenHarmony操作系统的吧,建议在支持OpenHarmony的环境中编译和运行。同时,请确保GPIO引脚的编号和功能与实际硬件相匹配。

看看这两段的改进建议是否适合:
第一段:
代码中有一些语法错误,例如sttr应该是attr.stack_size。
IoTGpioSetOutputVal函数调用时缺少参数,应该是IoTGpioSetOutputVal(LED_TASK_GPIO, value);。
osDelay函数的参数应该是毫秒数,所以50和100代表延时50毫秒和100毫秒。

第二段:
代码中有一些语法错误,例如attr.stack_sick应该是attr.stack_size。
osDelay函数调用后缺少参数和分号,应该是osDelay(某个值);。
为了避免在读取按钮状态和设置LED状态之间产生竞争条件,可以考虑使用互斥量(mutex)来同步这两个操作。
如果按钮的状态变化不频繁,可以考虑在读取按钮状态后加入一个短暂的延时,以减少CPU的使用率。





欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5