小编Ang*_*ngs的帖子

如何在Linux板上检测GPIO的引脚变化

我在基于ARM的linux板(imx233 CPU)上使用3.12内核.我的目的是检测GPIO的引脚变化(1到0).

我可以不断调用下面的函数读取引脚值(在while(1)循环中)

int GPIO_read_value(int pin){
    int gpio_value = 0;
    char path[35] = {'\0'};
    FILE *fp;
    sprintf(path, "/sys/class/gpio/gpio%d/value", pin);
    if ((fp = fopen(path,"rb+")) == NULL){ //echo in > direction
         //error
    }

    fscanf(fp, "%d", &gpio_value);
    fclose(fp);
    return gpio_value;
}
Run Code Online (Sandbox Code Playgroud)

但它会给CPU带来太多负载.我不使用usleepnanosleep,因为引脚更改发生的时间很短,导致我错过了该事件.

据我所知,它是不可能使用的poll().有没有poll()类似的功能可以用来检测GPIO的引脚变化?

编辑:以防万一,如果我做错了什么,这是我的poll()用法没有检测到引脚更改

struct pollfd pollfds;
    int fd;
    int nread, result;
    pollfds.fd = open("/sys/class/gpio/gpio51/value", O_RDWR);
    int timeout = 20000;           /* Timeout in msec. */
    char buffer[128];

    if( pollfds.fd < 0 ){
        printf(" …
Run Code Online (Sandbox Code Playgroud)

c linux posix embedded-linux gpio

9
推荐指数
1
解决办法
6684
查看次数

Linux C - 实现程序可以自我更新的能力

我正在用Linux环境下的C编写一个程序(Debian-Lenny),并且希望在有更新时更新程序(当有新的更新时程序会收到通知).我正在寻找程序可以自我更新的方法.

我在想的是主程序调用一个新程序来处理更新.updater程序将拥有(访问)源代码并接收有关源代码更改的更新信息,如下所示:

edit1: line 20, remove column 5 to 20;
edit2: line25, remove column 4-7 then add "if(x>3){" from the column4
edit3: line 26, enter a new line and insert "x++;"
Run Code Online (Sandbox Code Playgroud)

然后杀死主进程,重新编译源代码,然后用旧的二进制文件替换新的二进制文件.

或者是否有更好(更简单)和标准的方式来实现程序可以自行更新的能力?

我使用该程序来控制具有Linux嵌入式主板的系统.因此,我不希望其他人可以访问源代码(如果系统被黑客攻击或其他东西).如果使用源代码更新程序的最佳方法,您如何建议我保护源代码?如果您建议我加密源代码,程序可以使用什么功能(Linux C)来加密和解密源文件?

c linux updates updatemodel

7
推荐指数
1
解决办法
1187
查看次数

Linux网络接口由C代码管理

我正在寻找可以在C中使用的函数/系统调用来管理Linux机器的网络接口.例如,我想做ip link set wlan0 down(或向上)或者ifconfig wlan0 down除了什么功能之外还可以使用它system()

c linux posix network-programming

6
推荐指数
1
解决办法
5224
查看次数

如何以root身份执行命令

我在Linux(Debian)上开发了一个C代码.有时,我需要执行一些命令system()

我想知道是否可以通过system()root 执行命令.如果不是这样,是否有任何函数可以以root身份执行命令(或运行二进制文件),我可以在C代码上使用它?

c linux root

6
推荐指数
1
解决办法
1万
查看次数

如何定义一个循环运行几秒/分钟

我的目的是在while规定的时间内执行循环(例如,本例中为90秒).它不一定是90秒,但1-2秒的不准确是可以接受的.为了这个目的,我试图使用clock()`函数:

int main(void){
      clock_t start, end;
      volatile double elapsed;
      start = clock();
      int terminate = 1;
      while(terminate)
      {
              end = clock();
              elapsed = ((double) (end-start)) / (double) CLOCKS_PER_SEC *1000;
              printf("elapsed time:%f\n",elapsed);
              if(elapsed >= 90.0)
                        terminate = 0;
               usleep(50000);
       }
      printf("done..\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我在我的笔记本电脑上运行它(x86,3.13内核,gcc 4.8.2)时,我的秒表测量它完成72秒.(1000 elapsed我的笔记本电脑必须具有几秒钟的准确度)

当我在ARM设备(armv5tejl,3.12内核,gcc 4.6.3)上运行它时,需要58秒才能完成代码.(我需要使用100elapsed对的ARMv5).

我在室温下运行代码,因此时钟应该稳定.我知道内核会休眠线程,并且有时间不准确地唤醒它们等等.因此,正如我之前所说,我不希望得到一个完美的时序,但它应该有一些准确性.

我曾试图只使用usleep(偶数nanosleep),但分辨率也不好.最后,我想出了获取系统时间(小时,分钟,秒)的底部代码,然后计算经过的时间.并且它具有良好的准确性.

我想知道是否有另一种解决方案使用成本更低?

typedef struct{
    int hour;
    int minute;
    int second;
} timeInfo;

timeInfo getTimeInfo(void){
    timeInfo value2return; …
Run Code Online (Sandbox Code Playgroud)

c linux time clock time-t

6
推荐指数
1
解决办法
2万
查看次数

asprintf - 何时使用free()?

asprintf

函数asprintf()和vasprintf()是sprintf(3)和vsprintf(3)的类似函数,除了它们分配一个足够大的字符串来保存包括终止空字节的输出,并通过第一个参数返回指向它的指针.应该将此指针传递给free(3)以在不再需要时释放已分配的存储.

这是我的C代码

void function(){
    char *out = NULL;
    int parts[16] = {1,2,05,003};
    asprintf(&out, "%d.%d.%d.%d", parts[0], parts[1], parts[2], parts[3]);
  //  free(out);
}

int main(void){
    function();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当在调试模式下监视该函数时,我看到该变量在从函数返回时已被销毁.为什么我不需要free()上面的代码?

你能告诉我在什么情况下asprintf我需要免费使用吗?

顺便说一句,我有"gcc版本4.7.2(Ubuntu/Linaro 4.7.2-2ubuntu1)"

在此输入图像描述 在此输入图像描述

c free

5
推荐指数
3
解决办法
3937
查看次数

__always_inline和inline之间的区别

inline另一个问题上使用指令有很好的解释

谁能解释一下在头文件上使用inline和有什么区别__always_inline吗?

而且,什么时候我更喜欢而__always_inline不是inline相反?

c compiler-construction inline

5
推荐指数
2
解决办法
4455
查看次数

如何在一年的日历上有效地存储任务信息

我有一个嵌入式系统(没有任何操作系统的MCU),最终用户应该能够定义系统的级别(比例:0-100)一年.作为一个例子(时间x天矩阵):

       | 1st Jan | 2nd Jan | 3rd Jan | .. | 31 Dec |
00:30  |  40 (%) | 40      |  45     | .. |   50   |
01:48  |  48     | 47      |  55     | .. |   33   |
02:26  |  64     | 64      |  60     | .. |   68   |
..     |  ..     | ..      |  ..     | .. |   ..   |
22:15  | 79      | 82      |  89     | .. |   100  |
23:37  | 100 …
Run Code Online (Sandbox Code Playgroud)

c algorithm memory-efficient

5
推荐指数
1
解决办法
97
查看次数

三元运算符的优势还有其他?

使用三元运算符是否存在任何性能或内存明智优势(反之亦然)?例如下面的案例:

int x=0, y=1, z=2, a=0;
a= x ? y : z;
Run Code Online (Sandbox Code Playgroud)

替代方案:

if ( x != 0 ){
    a = y;
}else{
    a = z;
}
Run Code Online (Sandbox Code Playgroud)

c

2
推荐指数
1
解决办法
3197
查看次数

如何在 Contiki 的 Makefile 上添加源文件?

我正在使用来自https://github.com/contiki-os/contiki的源文件我添加了一个新目录(比如/foo),其中包含一些 .c 和 .h 文件

我需要在 上使用它们examples/cc26xx,尽管我将 .h 文件(在 下/foo)包含在cc26xx-demo.c 中,但在我运行时它并没有真正包含这些文件make

谁能告诉我如何将它们包含在examples/cc26xx/MakefileMakefile.include 中

c makefile gnu-make contiki

2
推荐指数
1
解决办法
1413
查看次数

有没有比system()更多的方法来执行二进制文件

我在Linux上开发了一个C代码,我想执行一个二进制文件/usr/sbin/binary_program -p xxx,是否有另一种方法,而不是system()调用执行二进制文件?

c linux

1
推荐指数
1
解决办法
136
查看次数