xiangyi 发表于 2019-4-29 14:50:55

GPIO写高执行时间过长



每隔4ms进一次中断,将GPIO置高一次(即执行图1所示函数,图2为图1函数中的数组)。打印结果如图3所示。由图可知,将GPIO写高一次所用的执行时间为7985us。这导致我们的程序执行失败,所以请教下,这个执行时间是正常的吗?


rp-jeff 发表于 2019-5-5 16:39:17

可以从驱动层打印一下从收到命令到设置为高状态的时间,理论上不应该这么长的,从驱动里定位

xiangyi 发表于 2019-5-5 16:49:57

按照你提供的驱动层测试方法,可否提供“从驱动层打印从收到命令到设置为高状态的时间”的测试程序?

rp-jeff 发表于 2019-5-5 17:30:02

xiangyi 发表于 2019-5-5 16:49
按照你提供的驱动层测试方法,可否提供“从驱动层打印从收到命令到设置为高状态的时间”的测试程序?

你可以用time相关的函数进行打印,demo测试不出来

rp-jeff 发表于 2019-5-5 17:35:13

我们的驱动为了做GPIO名字适配,做了一些名字解析的工作,假如你需要指定GPIO,那就在write函数里直接通过某个值强行写GPIO拉高拉高低,减少名字适配的操作,这样可双节省操作的时间。具体能够优化的操作,需要你在驱动里看代码再结合你的需求来做。

比如echo 1 > /proc/*** 你就在write函数里直接对某个GPIO进行操作拉高拉低,不用再通过名字解析

rp-jeff 发表于 2019-5-5 17:36:51

static int gpio_proc_write(struct file * file,const char * buffer,unsigned long count,void * data)
{
        int value;
        int i;
        value = 0;
        sscanf(buffer, "%d", &value);
        pr_debug("value = %d\n",value);
#if 0
        if (value == 1)
                {       
                        gpio_direction_output(gpio, 1);
                }
        else if (value == 2)
                {
                        gpio_direction_output(gpio, 0);
                }
        else if (value == 3)
                {
                        gpio_direction_output(gpio, 1);
                }
        else if (value == 4)
                {
                        gpio_direction_output(gpio, 0);
                }
        else if (value == 5)
                {
                        //gpio_request(gpio, "rp_gpio");
                        gpio_direction_output(gpio, 1);
                        //gpio_free(gpio);
                        //msleep(50);
                }

xiangyi 发表于 2019-5-7 17:03:03

可否给出GPIO模式配置、输入GPIO读、输出GPIO写等相关的函数,以及这些函数的调用demo?

xiangyi 发表于 2019-5-7 17:23:06

比如GPIO4_D3作为输出GPIO时,用你提供的函数如何写高写低?

xiangyi 发表于 2019-5-7 17:26:21

GPIO4_D3作为输入GPIO时,用你提供的函数如何读取状态?
页: [1]
查看完整版本: GPIO写高执行时间过长